diff --git a/modules/order/commerce_order.info b/modules/order/commerce_order.info
index 916a77f..06cfda8 100644
--- a/modules/order/commerce_order.info
+++ b/modules/order/commerce_order.info
@@ -29,9 +29,11 @@ files[] = includes/views/handlers/commerce_order_handler_field_order_operations.
 files[] = includes/views/handlers/commerce_order_handler_filter_order_status.inc
 files[] = includes/views/handlers/commerce_order_handler_filter_order_state.inc
 files[] = includes/views/handlers/commerce_order_handler_filter_order_type.inc
+files[] = includes/views/handlers/commerce_order_handler_argument_product_in_order.inc
 
 ; Views plugins
 files[] = includes/views/handlers/commerce_order_plugin_argument_validate_user.inc
+files[] = includes/views/handlers/commerce_order_plugin_argument_default_cart_order.inc
 
 ; Tests
 files[] = tests/commerce_order.rules.test
diff --git a/modules/order/includes/views/commerce_order.views.inc b/modules/order/includes/views/commerce_order.views.inc
index ee3031a..321b807 100644
--- a/modules/order/includes/views/commerce_order.views.inc
+++ b/modules/order/includes/views/commerce_order.views.inc
@@ -220,6 +220,40 @@ function commerce_order_views_data() {
 }
 
 /**
+ * Implements hook_views_data_alter().
+ */
+function commerce_order_views_data_alter(&$data) {
+  // Alias of commerce_line_item for the 'product is in order' argument.
+  $data['commerce_product_commerce_line_item'] = array(
+    'table' => array(
+      'group' => 'Commerce Product',
+      'join' => array(
+        // Join to commerce_product is via the field data table which is already joined to the commerce_product base.
+        'commerce_product' => array(
+          'left_table' => 'field_data_commerce_product',
+          'left_field' => 'entity_id',
+          'table' => 'commerce_line_item', // real table
+          'field' => 'line_item_id',
+          // We need the data in the 'extra' to be dynamic because it depends
+          // on the order ID the argument takes.
+          // We can't use a custom views_join class here because that doesn't
+          // get any data about the current argument handler when it is used.
+          // @see commerce_order_handler_argument_product_in_order::ensure_my_table().
+          'extra' => array(),
+        ),
+      ),
+    ),
+  );
+  $data['commerce_product_commerce_line_item']['product_in_order'] = array(
+    'argument' => array(
+      'title' => t('Product is in order'),
+      'help' => t('Filter products by a given order ID.'),
+      'handler' => 'commerce_order_handler_argument_product_in_order',
+    ),
+  );
+}
+
+/**
  * Implements hook_views_plugins
  */
 function commerce_order_views_plugins() {
@@ -230,5 +264,11 @@ function commerce_order_views_plugins() {
         'handler' => 'commerce_order_plugin_argument_validate_user',
       ),
     ),
+    'argument default' => array(
+      'current_cart_order' => array(
+        'title' => t('Current cart order'),
+        'handler' => 'commerce_order_plugin_argument_default_cart_order',
+      ),
+    ),
   );
 }
diff --git a/modules/order/includes/views/handlers/commerce_order_handler_argument_product_in_order.inc b/modules/order/includes/views/handlers/commerce_order_handler_argument_product_in_order.inc
new file mode 100644
index 0000000..1367573
--- /dev/null
+++ b/modules/order/includes/views/handlers/commerce_order_handler_argument_product_in_order.inc
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * Argument handler to limit or exclude product entities by a given order.
+ *
+ * This has to jump through a few hoops, as the ideal query we want is doable
+ * by neither Views nor the Database API.
+ *
+ * For a query to include all products in an order:
+ *  SELECT *
+ *  LEFT JOIN field_data_commerce_product fdcp
+ *    ON cp.product_id = fdcp.commerce_product_product_id
+ *  -- we have table definition for field_data_commerce_product that gets us this far.
+ *  LEFT JOIN commerce_line_item
+ *    ON (fdcp.entity_id = commerce_line_item.line_item_id AND commerce_line_item.order_id = **ARG**)
+ *  WHERE
+ *    -- Get only products outside the order ID here.
+ *    order_id = **ARG**
+ *
+ * A query to exclude all products in an order needs to be of this form:
+ *  SELECT *
+ *  LEFT JOIN field_data_commerce_product fdcp
+ *    ON cp.product_id = fdcp.commerce_product_product_id
+ *  -- we have table definition for field_data_commerce_product that gets us this far.
+ *  LEFT JOIN commerce_line_item
+ *    ON (fdcp.entity_id = commerce_line_item.line_item_id AND commerce_line_item.order_id = **ARG**)
+ *  WHERE
+ *    -- Ideally this where clause would be covered by making the join to
+ *    -- commerce_line_item INNER, but this also requires it to be bracketed
+ *    -- in with the join to field_data_commerce_product.
+ *    -- DatabaseAPI can't produce grouped joins so we add the clause here.
+ *    fdcp.commerce_product_product_id IS NULL AND
+ *    -- Get only products outside the order ID here.
+ *    order_id IS NULL
+ */
+class commerce_order_handler_argument_product_in_order extends views_handler_argument_numeric {
+  /**
+   * Provide the add to cart display options.
+   */
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+
+    // Remove the multiple argument feature.
+    // No idea if this can even be supported. At the least, a @todo.
+    unset($form['break_phrase']);
+  }
+
+  /**
+   * Override ensure_my_table() so we can set up our join object ahead of time.
+   */
+  function ensure_my_table() {
+    // Pre-empt views_plugin_query_default::ensure_table() by setting our join up now.
+
+    // Argh, hack this in for now. This may mean relationships using this break? Or is it okay?
+    $relationship = 'commerce_product';
+
+    // Get a join object for our table.
+    $join = $this->query->get_join_data($this->table, $this->query->relationships[$relationship]['base']);
+
+    // We limit the join to the line item table by the given order.
+    // This has to be done within this handler as we need the argument value.
+    $join->extra = array(
+      array(
+        'field' => 'order_id',
+        'value' => $this->argument,
+        'numeric' => TRUE,
+      ),
+    );
+
+    // The parent class ensure_my_table() follows, apart from passing our join
+    // object to ensure_table().
+    if (!isset($this->table_alias)) {
+      if (!method_exists($this->query, 'ensure_table')) {
+        vpr(t('Ensure my table called but query has no ensure_table method.'));
+        return;
+      }
+      $this->table_alias = $this->query->ensure_table($this->table, $this->relationship, $join);
+    }
+    return $this->table_alias;
+  }
+
+  /**
+   * Set up the query for this argument.
+   */
+  function query() {
+    $this->ensure_my_table();
+    // Non-field handlers don't have add_additional_fields(), so we have to
+    // add this ourselves.
+    // @todo. Remove this if/when http://drupal.org/node/1321018 is fixed.
+    $this->query->add_field($this->table_alias, 'order_id', NULL);
+
+    // Our where clause is different depending on whether or not we are
+    // excluding the argument.
+    $exclude = !empty($this->options['not']);
+    if ($exclude) {
+      // We need both the order and the field data to be null.
+      $this->query->add_where_expression(0, 'order_id IS NULL');
+
+      $relationship = 'commerce_product';
+      $table_alias = $this->query->tables[$relationship]['field_data_commerce_product']['alias'];
+      $this->query->add_where_expression(0, "$table_alias.commerce_product_product_id IS NULL");
+    }
+    else {
+      $this->query->add_where(0, 'order_id', $this->argument);
+    }
+  }
+}
diff --git a/modules/order/includes/views/handlers/commerce_order_plugin_argument_default_cart_order.inc b/modules/order/includes/views/handlers/commerce_order_plugin_argument_default_cart_order.inc
new file mode 100644
index 0000000..9cf4c56
--- /dev/null
+++ b/modules/order/includes/views/handlers/commerce_order_plugin_argument_default_cart_order.inc
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * Provides a default argument of the order ID from the current user's cart.
+ */
+class commerce_order_plugin_argument_default_cart_order extends views_plugin_argument_default {
+  /**
+   * Return the default argument.
+   */
+  function get_argument() {
+    global $user;
+    $order = commerce_cart_order_load($user->uid);
+
+    return $order->order_id;
+  }
+}
