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..5cced38 100644
--- a/modules/order/includes/views/commerce_order.views.inc
+++ b/modules/order/includes/views/commerce_order.views.inc
@@ -220,6 +220,36 @@ function commerce_order_views_data() {
 }
 
 /**
+ * Implements hook_views_data_alter().
+ */
+function commerce_order_views_data_alter(&$data) {
+  // Fake table for the 'product is in order' argument, made from a subquery.
+  $data['commerce_product_commerce_line_item'] = array(
+    'table' => array(
+      'group' => 'Commerce Product',
+      'join' => array(
+        // Join to the commerce_product base.
+        'commerce_product' => array(
+          'left_field' => 'entity_id',
+          'field' => 'line_item_id',
+          // We use our own join handler class to build the subquery this table
+          // represents.
+          // @see commerce_order_handler_argument_product_in_order::ensure_my_table().
+          'handler' => 'views_join_commerce_product_line_item',
+        ),
+      ),
+    ),
+  );
+  $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 +260,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..32cb62c
--- /dev/null
+++ b/modules/order/includes/views/handlers/commerce_order_handler_argument_product_in_order.inc
@@ -0,0 +1,133 @@
+<?php
+
+/**
+ * Argument handler to limit or exclude product entities by a given order.
+ *
+ * This has to jump through a few hoops, as the query we need joins to a
+ * subquery, and has the argument value in several places:
+ *
+ *  SELECT commerce_product.product_id AS product_id,
+ *  alias.line_item_id,
+ *  alias.product_id
+ *  FROM
+ *  commerce_product commerce_product
+ *  LEFT JOIN
+ *    (SELECT
+ *    field_data_commerce_product.commerce_product_product_id AS product_id,
+ *    commerce_line_item.line_item_id,
+ *    commerce_line_item.order_id
+ *    FROM field_data_commerce_product field_data_commerce_product
+ *    INNER JOIN commerce_line_item commerce_line_item
+ *    ON
+ *      field_data_commerce_product.entity_id = commerce_line_item.line_item_id
+ *      AND
+ *      commerce_line_item.order_id = [ORDER ID]
+ *    WHERE field_data_commerce_product.deleted = 0
+ *    ) alias
+ *  ON
+ *    commerce_product.product_id = alias.product_id
+ *  WHERE
+ *  -- not in cart:
+ *    -- alias.order_id IS NULL
+ *  -- in cart:
+ *    -- alias.order_id = [ORDER ID]
+ *
+ * This requires:
+ *  - our field to be on a fake table
+ *  - our own join handler, which joins onto a subquery rather than a table
+ *  - pre-empting the creation of the join handler so we can pass it the
+ *    argument value.
+ */
+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.
+    // This is of class views_join_commerce_product_line_item, which takes
+    // care of joining to a subquery rather than a table.
+    $join = $this->query->get_join_data($this->table, $this->query->relationships[$relationship]['base']);
+
+    // We add the argument value to the join handler as it needs to use it
+    // within its subquery.
+    $join->argument = $this->argument;
+
+    // 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);
+    
+    $subquery_alias = 'commerce_product_commerce_line_item';
+
+    // 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, "$subquery_alias.order_id IS NULL");
+    }
+    else {
+      $this->query->add_where(0, "$subquery_alias.order_id", $this->argument);
+    }
+  }
+}
+
+/**
+ * Join handler for our pseudotable.
+ *
+ * This relies on the argument handler creating the join object ahead of time
+ * in its own ensure_my_table(), so that we have the argument value here,
+ * stored in $this->argument.
+ */
+class views_join_commerce_product_line_item extends views_join {
+  function build_join($select_query, $table, $view_query) {
+    // Build our subquery.
+    $subquery = db_select('field_data_commerce_product', 'fdcp');
+    $subquery->join('commerce_line_item', 'cli', 'fdcp.entity_id = cli.line_item_id');
+
+    $subquery->addField('fdcp', 'commerce_product_product_id', 'product_id');
+    $subquery->fields('cli', array('line_item_id', 'order_id'));
+
+    $subquery->condition('fdcp.deleted', 0);
+    // Set the condition based on the argument value.
+    $subquery->condition('cli.order_id', $this->argument);
+
+    // @todo: check this is the correct way to get the table alias.
+    $commerce_product_alias = $view_query->table_queue['commerce_product']['alias'];
+    $condition = "$commerce_product_alias.product_id = " . $table['alias'] . ".product_id";
+    $select_query->addJoin($this->type, $subquery, $table['alias'], $condition);
+  }
+}
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;
+  }
+}
