diff --git modules/cart/commerce_cart.info modules/cart/commerce_cart.info
index 96cfc23..101f3e5 100644
--- modules/cart/commerce_cart.info
+++ modules/cart/commerce_cart.info
@@ -19,3 +19,6 @@ files[] = includes/views/commerce_cart.views_default.inc
 
 ; Views handlers
 files[] = includes/views/handlers/commerce_cart_handler_field_add_to_cart_form.inc
+
+; Views plugins
+files[] = includes/views/plugins/commerce_cart_plugin_style_commerce_cart.inc
diff --git modules/cart/commerce_cart.module modules/cart/commerce_cart.module
index e8826a3..dd6e09a 100644
--- modules/cart/commerce_cart.module
+++ modules/cart/commerce_cart.module
@@ -143,6 +143,9 @@ function commerce_cart_theme() {
     'commerce_cart_form_product_table' => array(
       'render element' => 'form',
     ),
+    'commerce_cart_plugin_style_commerce_cart_table' => array(
+      'render element' => 'form',
+    ),
   );
 }
 
diff --git modules/cart/includes/commerce_cart.pages.inc modules/cart/includes/commerce_cart.pages.inc
index 1b60835..3ea2766 100644
--- modules/cart/includes/commerce_cart.pages.inc
+++ modules/cart/includes/commerce_cart.pages.inc
@@ -43,204 +43,8 @@ function commerce_cart_view() {
   }
   else {
     // Add the form for editing the cart contents.
-    $content = drupal_get_form('commerce_cart_form', $order);
+    $content = commerce_embed_view('commerce_cart', 'default', array($order->order_id));
   }
 
   return $content;
 }
-
-/**
- * Builds the editable shopping cart form.
- */
-function commerce_cart_form($form, &$form_state, $order) {
-  $form['#attached']['css'][] = drupal_get_path('module', 'commerce_cart') . '/theme/commerce_cart.css';
-
-  $form['order'] = array(
-    '#type' => 'value',
-    '#value' => $order,
-  );
-
-  // First build an array of line items.
-  $line_item_ids = array();
-
-  foreach ($order->line_items[LANGUAGE_NONE] as $key => $value) {
-    $line_item_ids[] = $value['line_item_id'];
-  }
-
-  $line_items = commerce_line_item_load_multiple($line_item_ids);
-
-  // The display title should come from the line item type.
-  $product_line_item_type = commerce_line_item_type_load('product');
-  $title_callback = commerce_line_item_type_callback($product_line_item_type, 'title');
-
-  // Build the actual form with rows for product line items.
-  $form['line_items'] = array(
-    '#tree' => TRUE,
-    '#theme' => 'commerce_cart_form_product_table',
-    '#header' => array('', t('Title'), t('SKU'), t('Qty'), t('Unit Price'), t('Total')),
-    '#empty' => t('No products found.'),
-  );
-
-  foreach ($line_items as $line_item_id => $line_item) {
-    if ($line_item->type == 'product') {
-      $form['line_items'][$line_item_id]['line_item'] = array(
-        '#type' => 'value',
-        '#value' => $line_item,
-      );
-
-      $form['line_items'][$line_item_id]['remove'] = array(
-        '#type' => 'submit',
-        '#value' => t('Remove'),
-        '#name' => 'remove-line-item-' . $line_item_id,
-        '#attributes' => array('class' => array('remove-line-item')),
-      );
-
-      $form['line_items'][$line_item_id]['title'] = array(
-        '#markup' => $title_callback ? $title_callback($line_item) : '',
-      );
-
-      $form['line_items'][$line_item_id]['line_item_label'] = array(
-        '#markup' => check_plain($line_item->line_item_label),
-      );
-
-      $form['line_items'][$line_item_id]['quantity'] = array(
-        '#type' => 'textfield',
-        '#default_value' => round($line_item->quantity),
-        '#size' => 4,
-      );
-
-      $form['line_items'][$line_item_id]['unit_price'] = array(
-        '#markup' => commerce_currency_format($line_item->unit_price[LANGUAGE_NONE][0]['price'], $line_item->unit_price[LANGUAGE_NONE][0]['currency_code'], $line_item),
-      );
-
-      $form['line_items'][$line_item_id]['total'] = array(
-        '#markup' => commerce_currency_format($line_item->total[LANGUAGE_NONE][0]['price'], $line_item->total[LANGUAGE_NONE][0]['currency_code'], $line_item),
-      );
-    }
-  }
-
-  $form['actions'] = array(
-    '#type' => 'container',
-    '#attributes' => array('class' => array('form-actions')),
-    '#weight' => 100,
-  );
-
-
-  // We add the form's #submit array to this button along with the actual submit
-  // handler to preserve any submit handlers added by a form callback_wrapper.
-  $submit = array();
-
-  if (!empty($form['#submit'])) {
-    $submit += $form['#submit'];
-  }
-
-  $form['actions']['update'] = array(
-    '#type' => 'submit',
-    '#value' => t('Update cart'),
-    '#submit' => $submit + array('commerce_cart_form_submit'),
-    '#weight' => 40,
-  );
-
-  $form['actions']['checkout'] = array(
-    '#type' => 'submit',
-    '#value' => t('Checkout'),
-    '#submit' => $submit + array('commerce_cart_form_submit'),
-    '#weight' => 45,
-    '#access' => user_access('access checkout'),
-  );
-
-  // We append the validate handler to #validate in case a form callback_wrapper
-  // is used to add validate handlers earlier.
-  $form['#validate'][] = 'commerce_cart_form_validate';
-
-  return $form;
-}
-
-/**
- * Validation callback for commerce_cart_form().
- */
-function commerce_cart_form_validate($form, &$form_state) {
-  foreach (element_children($form['line_items']) as $line_item_id) {
-    if (!is_numeric($form_state['values']['line_items'][$line_item_id]['quantity']) || $form_state['values']['line_items'][$line_item_id]['quantity'] <= 0) {
-      form_set_error('line_items][' . $line_item_id .'][quantity', t('You must specify a positive numeric value for the quantity'));
-    }
-  }
-}
-
-/**
- * Submit callback for commerce_cart_form().
- */
-function commerce_cart_form_submit($form, &$form_state) {
-  $order = commerce_order_load($form_state['values']['order']->order_id);
-
-  // Loop through the line items and update the items on the cart order.
-  foreach (element_children($form['line_items']) as $line_item_id) {
-    // Check for the removal of an item.
-    if ($form_state['clicked_button']['#name'] == 'remove-line-item-' . $line_item_id) {
-      // Remove the line item from the line item reference field.
-      foreach ($order->line_items[LANGUAGE_NONE] as $key => $value) {
-        if ($value['line_item_id'] == $line_item_id) {
-          unset($order->line_items[LANGUAGE_NONE][$key]);
-        }
-      }
-
-      // Delete the actual line item.
-      commerce_line_item_delete($line_item_id);
-    }
-    else {
-      // Otherwise if there is a change in quantity...
-      if ($form_state['values']['line_items'][$line_item_id]['quantity'] != $form_state['values']['line_items'][$line_item_id]['line_item']->quantity) {
-        // Load the original line item.
-        $line_item = commerce_line_item_load($line_item_id);
-
-        // Change the quantity and save it.
-        $line_item->quantity = $form_state['values']['line_items'][$line_item_id]['quantity'];
-        commerce_line_item_save($line_item);
-      }
-    }
-  }
-
-  // Save the order to capture any changes in line items referenced.
-  commerce_order_save($order);
-
-  // Redirect to the checkout page if specified.
-  if ($form_state['clicked_button']['#value'] == $form['actions']['checkout']['#value']) {
-    $form_state['redirect'] = 'checkout';
-  }
-  else {
-    drupal_set_message(t('Your shopping cart has been updated.'));
-  }
-}
-
-/**
- * Themes the editable shopping cart form.
- */
-function theme_commerce_cart_form_product_table($variables) {
-  $form = $variables['form'];
-  $rows = array();
-
-  // Add each line item to the table.
-  foreach (element_children($form) as $line_item_id) {
-    $row = array(
-      drupal_render($form[$line_item_id]['remove']),
-      drupal_render($form[$line_item_id]['title']),
-      drupal_render($form[$line_item_id]['line_item_label']),
-      drupal_render($form[$line_item_id]['quantity']),
-      drupal_render($form[$line_item_id]['unit_price']),
-      drupal_render($form[$line_item_id]['total']),
-    );
-
-    $rows[] = $row;
-  }
-
-  // Setup the table's variables array and build the output.
-  $table_variables = array(
-    'header' => $form['#header'],
-    'rows' => $rows,
-    'empty' => $form['#empty'],
-  );
-
-  $output = theme('table', $table_variables);
-
-  return '<div id="cart-form-table">' . $output . '</div>';
-}
diff --git modules/cart/includes/views/commerce_cart.views.inc modules/cart/includes/views/commerce_cart.views.inc
index 5170937..136c19d 100644
--- modules/cart/includes/views/commerce_cart.views.inc
+++ modules/cart/includes/views/commerce_cart.views.inc
@@ -21,3 +21,25 @@ function commerce_cart_views_data() {
 
   return $data;
 }
+
+/**
+ * Implements hook_views_plugins().
+ */
+function commerce_cart_views_plugins() {
+  return array(
+    'style' => array(
+      'commerce_cart' => array(
+        'title' => t('Shopping cart'),
+        'help' => t('Display rows in a table as a shopping cart.'),
+        'handler' => 'commerce_cart_plugin_style_commerce_cart',
+        'parent' => 'table',
+        'base' => array('commerce_order'),
+        'uses row plugin' => FALSE,
+        'uses fields' => TRUE,
+        'uses options' => TRUE,
+        'type' => 'normal',
+        'theme' => 'views_view_table',
+      ),
+    ),
+  );
+}
diff --git modules/cart/includes/views/commerce_cart.views_default.inc modules/cart/includes/views/commerce_cart.views_default.inc
index f3bc78d..de9e3ee 100644
--- modules/cart/includes/views/commerce_cart.views_default.inc
+++ modules/cart/includes/views/commerce_cart.views_default.inc
@@ -11,6 +11,149 @@
 function commerce_cart_views_default_views() {
   $views = array();
 
+  // Shopping cart view for cart page.
+  $view = new view;
+  $view->name = 'commerce_cart';
+  $view->description = 'Shopping cart view.';
+  $view->tag = 'commerce';
+  $view->base_table = 'commerce_order';
+  $view->api_version = '3.0-alpha1';
+  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+  
+  /* Display: Defaults */
+  $handler = $view->new_display('default', 'Defaults', 'default');
+  $handler->display->display_options['title'] = 'Shopping cart';
+  $handler->display->display_options['access']['type'] = 'none';
+  $handler->display->display_options['cache']['type'] = 'none';
+  $handler->display->display_options['query']['type'] = 'views_query';
+  $handler->display->display_options['exposed_form']['type'] = 'basic';
+  $handler->display->display_options['pager']['type'] = 'none';
+  $handler->display->display_options['style_plugin'] = 'commerce_cart';
+  /* Relationship: Fields: Referenced line item */
+  $handler->display->display_options['relationships']['line_items_line_item_id']['id'] = 'line_items_line_item_id';
+  $handler->display->display_options['relationships']['line_items_line_item_id']['table'] = 'field_data_line_items';
+  $handler->display->display_options['relationships']['line_items_line_item_id']['field'] = 'line_items_line_item_id';
+  $handler->display->display_options['relationships']['line_items_line_item_id']['required'] = 1;
+  /* Relationship: Fields: Referenced product */
+  $handler->display->display_options['relationships']['product_product_id']['id'] = 'product_product_id';
+  $handler->display->display_options['relationships']['product_product_id']['table'] = 'field_data_product';
+  $handler->display->display_options['relationships']['product_product_id']['field'] = 'product_product_id';
+  $handler->display->display_options['relationships']['product_product_id']['relationship'] = 'line_items_line_item_id';
+  /* Field: Commerce Line Item: Line item label */
+  $handler->display->display_options['fields']['line_item_label']['id'] = 'line_item_label';
+  $handler->display->display_options['fields']['line_item_label']['table'] = 'commerce_line_item';
+  $handler->display->display_options['fields']['line_item_label']['field'] = 'line_item_label';
+  $handler->display->display_options['fields']['line_item_label']['relationship'] = 'line_items_line_item_id';
+  $handler->display->display_options['fields']['line_item_label']['label'] = 'SKU';
+  $handler->display->display_options['fields']['line_item_label']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['line_item_label']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['line_item_label']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['line_item_label']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['line_item_label']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['line_item_label']['alter']['word_boundary'] = 0;
+  $handler->display->display_options['fields']['line_item_label']['alter']['ellipsis'] = 0;
+  $handler->display->display_options['fields']['line_item_label']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['line_item_label']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['line_item_label']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['line_item_label']['empty_zero'] = 0;
+  /* Field: Commerce Product: Title */
+  $handler->display->display_options['fields']['title']['id'] = 'title';
+  $handler->display->display_options['fields']['title']['table'] = 'commerce_product';
+  $handler->display->display_options['fields']['title']['field'] = 'title';
+  $handler->display->display_options['fields']['title']['relationship'] = 'product_product_id';
+  $handler->display->display_options['fields']['title']['label'] = 'Product';
+  $handler->display->display_options['fields']['title']['alter']['alter_text'] = 1;
+  $handler->display->display_options['fields']['title']['alter']['text'] = '[title] ([line_item_label])';
+  $handler->display->display_options['fields']['title']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['title']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['title']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['title']['alter']['word_boundary'] = 0;
+  $handler->display->display_options['fields']['title']['alter']['ellipsis'] = 0;
+  $handler->display->display_options['fields']['title']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['title']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['title']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['title']['empty_zero'] = 0;
+  $handler->display->display_options['fields']['title']['link_to_product'] = 0;
+  /* Field: Fields: unit_price */
+  $handler->display->display_options['fields']['entity_id_1']['id'] = 'entity_id_1';
+  $handler->display->display_options['fields']['entity_id_1']['table'] = 'field_data_unit_price';
+  $handler->display->display_options['fields']['entity_id_1']['field'] = 'entity_id';
+  $handler->display->display_options['fields']['entity_id_1']['relationship'] = 'line_items_line_item_id';
+  $handler->display->display_options['fields']['entity_id_1']['label'] = 'Price';
+  $handler->display->display_options['fields']['entity_id_1']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['entity_id_1']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['entity_id_1']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['entity_id_1']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['entity_id_1']['alter']['word_boundary'] = 0;
+  $handler->display->display_options['fields']['entity_id_1']['alter']['ellipsis'] = 0;
+  $handler->display->display_options['fields']['entity_id_1']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['entity_id_1']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['entity_id_1']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['entity_id_1']['empty_zero'] = 0;
+  $handler->display->display_options['fields']['entity_id_1']['type'] = 'commerce_price_formatted_amount';
+  /* Field: Commerce Line Item: Quantity */
+  $handler->display->display_options['fields']['quantity']['id'] = 'quantity';
+  $handler->display->display_options['fields']['quantity']['table'] = 'commerce_line_item';
+  $handler->display->display_options['fields']['quantity']['field'] = 'quantity';
+  $handler->display->display_options['fields']['quantity']['relationship'] = 'line_items_line_item_id';
+  $handler->display->display_options['fields']['quantity']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['quantity']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['quantity']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['quantity']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['quantity']['alter']['word_boundary'] = 0;
+  $handler->display->display_options['fields']['quantity']['alter']['ellipsis'] = 0;
+  $handler->display->display_options['fields']['quantity']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['quantity']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['quantity']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['quantity']['empty_zero'] = 0;
+  $handler->display->display_options['fields']['quantity']['set_precision'] = 0;
+  $handler->display->display_options['fields']['quantity']['precision'] = '0';
+  $handler->display->display_options['fields']['quantity']['format_plural'] = 0;
+  /* Field: Fields: total */
+  $handler->display->display_options['fields']['entity_id']['id'] = 'entity_id';
+  $handler->display->display_options['fields']['entity_id']['table'] = 'field_data_total';
+  $handler->display->display_options['fields']['entity_id']['field'] = 'entity_id';
+  $handler->display->display_options['fields']['entity_id']['relationship'] = 'line_items_line_item_id';
+  $handler->display->display_options['fields']['entity_id']['label'] = 'Total';
+  $handler->display->display_options['fields']['entity_id']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['entity_id']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['entity_id']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['entity_id']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['entity_id']['alter']['word_boundary'] = 0;
+  $handler->display->display_options['fields']['entity_id']['alter']['ellipsis'] = 0;
+  $handler->display->display_options['fields']['entity_id']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['entity_id']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['entity_id']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['entity_id']['empty_zero'] = 0;
+  $handler->display->display_options['fields']['entity_id']['type'] = 'commerce_price_formatted_amount';
+  /* Sort criterion: Commerce Line Item: Line item ID */
+  $handler->display->display_options['sorts']['line_item_id']['id'] = 'line_item_id';
+  $handler->display->display_options['sorts']['line_item_id']['table'] = 'commerce_line_item';
+  $handler->display->display_options['sorts']['line_item_id']['field'] = 'line_item_id';
+  $handler->display->display_options['sorts']['line_item_id']['relationship'] = 'line_items_line_item_id';
+  /* Argument: Commerce Order: Order ID */
+  $handler->display->display_options['arguments']['order_id']['id'] = 'order_id';
+  $handler->display->display_options['arguments']['order_id']['table'] = 'commerce_order';
+  $handler->display->display_options['arguments']['order_id']['field'] = 'order_id';
+  $handler->display->display_options['arguments']['order_id']['default_action'] = 'empty';
+  $handler->display->display_options['arguments']['order_id']['style_plugin'] = 'default_summary';
+  $handler->display->display_options['arguments']['order_id']['wildcard'] = '';
+  $handler->display->display_options['arguments']['order_id']['wildcard_substitution'] = '';
+  $handler->display->display_options['arguments']['order_id']['default_argument_type'] = 'fixed';
+  $handler->display->display_options['arguments']['order_id']['break_phrase'] = 0;
+  $handler->display->display_options['arguments']['order_id']['not'] = 0;
+  /* Filter: Commerce Line Item: Type */
+  $handler->display->display_options['filters']['type']['id'] = 'type';
+  $handler->display->display_options['filters']['type']['table'] = 'commerce_line_item';
+  $handler->display->display_options['filters']['type']['field'] = 'type';
+  $handler->display->display_options['filters']['type']['relationship'] = 'line_items_line_item_id';
+  $handler->display->display_options['filters']['type']['value'] = array(
+    'product' => 'product',
+  );
+
+
+  $views[$view->name] = $view;
+
   // Shopping cart view for the block and checkout pane.
   $view = new view;
   $view->name = 'commerce_cart_block';
diff --git modules/cart/includes/views/plugins/commerce_cart_plugin_style_commerce_cart.inc modules/cart/includes/views/plugins/commerce_cart_plugin_style_commerce_cart.inc
new file mode 100644
index 0000000..abfb2b1
--- /dev/null
+++ modules/cart/includes/views/plugins/commerce_cart_plugin_style_commerce_cart.inc
@@ -0,0 +1,308 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Implement a view style plugin for formatting a table as a shopping cart with
+ * quantity edit fields and buttons for deleting line items and updating
+ * quantities.
+ */
+
+class commerce_cart_plugin_style_commerce_cart extends views_plugin_style_table {
+
+  function option_definition() {
+    $options = parent::option_definition();
+
+    $options['delete_button'] = array('default' => TRUE);
+    $options['update_button'] = array('default' => TRUE);
+    $options['checkout_button'] = array('default' => TRUE);
+
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $form['delete_button'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Show remove buttons'),
+      '#description' => t('Add buttons to remove a line item.'),
+      '#default_value' => $this->options['delete_button'],
+    );
+    $form['update_button'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Show update button'),
+      '#description' => t('Add a button to update all line items on the view to reflect quantity changes.'),
+      '#default_value' => $this->options['update_button'],
+    );
+    $form['checkout_button'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Show checkout button'),
+      '#description' => t('Add a button to start checkout.'),
+      '#default_value' => $this->options['checkout_button'],
+    );
+  }
+
+  function render() {
+    $form = drupal_get_form('commerce_cart_plugin_style_commerce_cart_form', $this);
+    return drupal_render($form);
+  }
+
+}
+
+/**
+ * Define form to handle cart operations.
+ */
+function commerce_cart_plugin_style_commerce_cart_form($form, &$form_state, $plugin) {
+  // Check the existence of order_id argument.
+  if (!isset($plugin->view->argument['order_id'])) {
+    return;
+  }
+
+  // Load the cart order.
+  // TODO: Does this make sense to support multiple cart orders?
+  $order = commerce_order_load($plugin->view->argument['order_id']->value[0]);
+
+  // Only orders on cart status are allowed.
+  // TODO: check if it's really necessary. As this could also enable admin
+  // editing of other kind of orders.
+  if (!in_array($order->status, array_keys(commerce_order_statuses(array('cart' => TRUE))))) {
+    return;
+  }  
+
+  $form['#attached']['css'][] = drupal_get_path('module', 'commerce_cart') . '/theme/commerce_cart.css';
+
+  // Pass order to submit handler.
+  $form['order'] = array(
+    '#type' => 'value',
+    '#value' => $order,
+  );
+
+  // Group the rows according to the grouping field, if specified.
+  $sets = $plugin->render_grouping($plugin->view->result, $plugin->options['grouping']);
+
+  // Retrieve cart subtotal.
+  $subtotal = commerce_line_items_total($order->line_items);
+
+  // Build the actual form with rows for product line items.
+  $form['line_items'] = array(
+    '#tree' => TRUE,
+    '#theme' => 'commerce_cart_plugin_style_commerce_cart_table',
+    '#empty' => t('No products found.'),
+    '#plugin' => $plugin,
+    '#sets' => $sets,
+    '#subtotal' => commerce_currency_format($subtotal['price'], $subtotal['currency_code']),
+  );
+
+  foreach ($sets as $title => $records) {
+    // We loop over records rather than line items so we can honor views
+    // setting such as filters, sorts, etc.
+    foreach ($records as $row_index => $row) {
+      $line_item_id = _commerce_cart_plugin_style_row_line_item_id($plugin->view, $row);
+      $form['line_items'][$line_item_id] = array();
+      $form['line_items'][$line_item_id]['line_item'] = array(
+        '#type' => 'value',
+        '#value' => commerce_line_item_load($line_item_id),
+      );
+      // We store row_index here to make possible using 
+      // template_preprocess_views_view_table() function, since this rely
+      // on row_index rather than line_item_id.
+      $form['line_items'][$line_item_id]['row_index'] = array(
+        '#type' => 'value',
+        '#default_value' => $row_index,
+      );
+      foreach ($row as $field_name => $field_content) {
+        // Create quantity edit textfield.
+        if (_commerce_cart_plugin_style_is_quantity_field($plugin->view, $field_name)) {
+          $form['line_items'][$line_item_id]['quantity']['quantity'] = array(
+            '#type' => 'textfield',
+            '#default_value' => round($field_content),
+            '#size' => 4,
+          );
+          if ($plugin->options['delete_button']) {
+            $form['line_items'][$line_item_id]['quantity']['remove'] = array(
+              '#type' => 'submit',
+              '#value' => t('Remove'),
+              '#name' => 'remove-line-item-' . $line_item_id,
+              '#attributes' => array('class' => array('remove-line-item')),
+            );
+          }
+        }
+        else {
+          $form['line_items'][$line_item_id][$field_name] = array(
+            '#markup' => $field_content,
+          );
+        }
+      }
+    }    
+  }
+
+  $form['actions'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('form-actions')),
+    '#weight' => 100,
+  );
+
+
+  // We add the form's #submit array to this button along with the actual submit
+  // handler to preserve any submit handlers added by a form callback_wrapper.
+  $submit = array();
+
+  if (!empty($form['#submit'])) {
+    $submit += $form['#submit'];
+  }
+
+  if ($plugin->options['update_button']) {
+    $form['actions']['update'] = array(
+      '#type' => 'submit',
+      '#value' => t('Update cart'),
+      '#submit' => $submit + array('commerce_cart_plugin_style_commerce_cart_form_submit'),
+      '#weight' => 40,
+    );
+  }
+
+  if ($plugin->options['checkout_button']) {
+    $form['actions']['checkout'] = array(
+      '#type' => 'submit',
+      '#value' => t('Checkout'),
+      '#submit' => $submit + array('commerce_cart_plugin_style_commerce_cart_form_submit'),
+      '#weight' => 45,
+      '#access' => user_access('access checkout'),
+    );
+  }
+
+  // We append the validate handler to #validate in case a form callback_wrapper
+  // is used to add validate handlers earlier.
+  $form['#validate'][] = 'commerce_cart_plugin_style_commerce_cart_form_validate';
+
+  return $form;
+}
+
+/**
+ * Validate handler for the cart operations.
+ */
+function commerce_cart_plugin_style_commerce_cart_form_validate($form, &$form_state) {
+  foreach (element_children($form['line_items']) as $line_item_id) {
+    if (!is_numeric($form_state['values']['line_items'][$line_item_id]['quantity']['quantity']) || $form_state['values']['line_items'][$line_item_id]['quantity']['quantity'] <= 0) {
+      form_set_error('line_items][' . $line_item_id .'][quantity][quantity', t('You must specify a positive numeric value for the quantity'));
+    }
+  }
+}
+
+/**
+ * Submit handler for the cart operations.
+ */
+function commerce_cart_plugin_style_commerce_cart_form_submit($form, &$form_state) {
+  $order = commerce_order_load($form_state['values']['order']->order_id);
+
+  // Loop through the line items and update the items on the cart order.
+  foreach (element_children($form['line_items']) as $line_item_id) {
+    // Check for the removal of an item.
+    if ($form_state['clicked_button']['#name'] == 'remove-line-item-' . $line_item_id) {
+      // Remove the line item from the line item reference field.
+      foreach ($order->line_items[LANGUAGE_NONE] as $key => $value) {
+        if ($value['line_item_id'] == $line_item_id) {
+          unset($order->line_items[LANGUAGE_NONE][$key]);
+        }
+      }
+
+      // Delete the actual line item.
+      commerce_line_item_delete($line_item_id);
+    }
+    else {
+      // Otherwise if there is a change in quantity...
+      if ($form_state['values']['line_items'][$line_item_id]['quantity']['quantity'] != $form_state['values']['line_items'][$line_item_id]['line_item']->quantity) {
+        // Load the original line item.
+        $line_item = commerce_line_item_load($line_item_id);
+
+        // Change the quantity and save it.
+        $line_item->quantity = $form_state['values']['line_items'][$line_item_id]['quantity']['quantity'];
+        commerce_line_item_save($line_item);
+      }
+    }
+  }
+
+  // Save the order to capture any changes in line items referenced.
+  commerce_order_save($order);
+
+  // Redirect to the checkout page if specified.
+  if ($form_state['clicked_button']['#value'] == $form['actions']['checkout']['#value']) {
+    $form_state['redirect'] = 'checkout';
+  }
+  else {
+    drupal_set_message(t('Your shopping cart has been updated.'));
+  }
+}
+
+/**
+ * Helper function to check if a given field is of the type quantity.
+ */
+function _commerce_cart_plugin_style_is_quantity_field($view, $field_name) {
+  // TODO: There may be a better way to do this.
+  foreach ($view->field as $type => $handler) {
+    if ($type == 'quantity' && in_array($field_name, array($handler->field_alias, $handler->field))) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Helper function to return a line item id for a view results row.
+ */
+function _commerce_cart_plugin_style_row_line_item_id($view, $row) {
+  // TODO: There may be a better way to do this, e.g. using views APIs.
+  foreach ($row as $alias => $value) {
+    if ($view->query->fields[$alias]['field'] == 'line_item_id') {
+      return $value;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Themes the editable shopping cart form.
+ */
+function theme_commerce_cart_plugin_style_commerce_cart_table($variables) {
+  $form = $variables['form'];
+  $sets = $form['#sets'];
+  $plugin = $form['#plugin'];
+
+  $vars = array(
+    'view' => $plugin->view,
+  );
+
+  // Add each line item to the table.
+  foreach ($sets as $title => $records) {
+    // The template_preprocess_views_view_table() expects the raw data in 'rows'.
+    $vars['rows'] = $records;
+      
+    // Render the view as table. Function from views/theme/theme.inc
+    template_preprocess_views_view_table($vars);
+
+    $header = array();
+    foreach ($vars['header'] as $field => $label) {
+      $header[] = array('data' => $label, 'class' => "views-field views-field-{$vars['fields'][$field]}");
+    }
+    $rows = array();
+    foreach (element_children($form) as $line_item_id) {
+      $row_index = $form[$line_item_id]['row_index']['#value'];
+      $row = array();
+      foreach ($vars['rows'][$row_index] as $field_name => $field_content) {
+        if (_commerce_cart_plugin_style_is_quantity_field($plugin->view, $field_name)) {
+          $row[] = drupal_render($form[$line_item_id][$field_name]);
+        }
+        else {
+          $row[] = $field_content;
+        }
+      }
+      $rows[] = $row;
+    }
+  }
+
+  $output = '<div id="commerce-cart-form-table">';
+  $output .= theme('table', array('header' => $header, 'rows' => $rows));
+  $output .= '<div class="cart-subtotal">'. t('Subtotal: %subtotal', array('%subtotal' => $form['#subtotal'])) . '</div>';
+  $output .= '</div>';
+
+  return $output;
+}
diff --git modules/cart/theme/commerce_cart.css modules/cart/theme/commerce_cart.css
index dcadf7d..2101bce 100644
--- modules/cart/theme/commerce_cart.css
+++ modules/cart/theme/commerce_cart.css
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-#commerce-cart-form input.remove-line-item {
+#commerce-cart-form-table input.remove-line-item {
   background: #fff url(buttons.png) 0 0 repeat-x;
   border: 1px solid #e4e4e4;
   border-bottom: 1px solid #b4b4b4;
@@ -20,11 +20,16 @@
   border-radius: 15px;
 }
 
-#commerce-cart-form input.remove-line-item:hover,
-#commerce-cart-form input.remove-line-item:focus {
+#commerce-cart-form-table input.remove-line-item:hover,
+#commerce-cart-form-table input.remove-line-item:focus {
   background: #dedede;
 }
 
-#commerce-cart-form .form-actions {
+#commerce-cart-form-table .cart-subtotal {
+  text-align: right;
+  font-size: 1.5em;
+}
+
+#commerce-cart-form-table .form-actions {
   text-align: right;
 }
