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_default.inc modules/cart/includes/views/commerce_cart.views_default.inc
index f3bc78d..8553aed 100644
--- modules/cart/includes/views/commerce_cart.views_default.inc
+++ modules/cart/includes/views/commerce_cart.views_default.inc
@@ -11,6 +11,228 @@
 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'] = 'table';
+  $handler->display->display_options['style_options']['columns'] = array(
+    'line_item_label' => 'line_item_label',
+    'title' => 'title',
+    'entity_id_1' => 'entity_id_1',
+    'quantity_edit' => 'quantity_edit',
+    'remove' => 'quantity_edit',
+    'entity_id' => 'entity_id',
+  );
+  $handler->display->display_options['style_options']['default'] = '-1';
+  $handler->display->display_options['style_options']['info'] = array(
+    'line_item_label' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+    ),
+    'title' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+    ),
+    'entity_id_1' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+    ),
+    'quantity_edit' => array(
+      'align' => '',
+      'separator' => '',
+    ),
+    'remove' => array(
+      'align' => '',
+      'separator' => '',
+    ),
+    'entity_id' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+    ),
+  );
+  $handler->display->display_options['style_options']['override'] = 1;
+  $handler->display->display_options['style_options']['sticky'] = 0;
+  /* 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 edit */
+  $handler->display->display_options['fields']['quantity_edit']['id'] = 'quantity_edit';
+  $handler->display->display_options['fields']['quantity_edit']['table'] = 'commerce_line_item';
+  $handler->display->display_options['fields']['quantity_edit']['field'] = 'quantity_edit';
+  $handler->display->display_options['fields']['quantity_edit']['relationship'] = 'line_items_line_item_id';
+  $handler->display->display_options['fields']['quantity_edit']['label'] = 'Quantity';
+  $handler->display->display_options['fields']['quantity_edit']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['quantity_edit']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['quantity_edit']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['quantity_edit']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['quantity_edit']['alter']['word_boundary'] = 0;
+  $handler->display->display_options['fields']['quantity_edit']['alter']['ellipsis'] = 0;
+  $handler->display->display_options['fields']['quantity_edit']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['quantity_edit']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['quantity_edit']['element_label_colon'] = 0;
+  $handler->display->display_options['fields']['quantity_edit']['element_default_classes'] = 0;
+  $handler->display->display_options['fields']['quantity_edit']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['quantity_edit']['empty_zero'] = 0;
+  /* Field: Commerce Line Item: Remove */
+  $handler->display->display_options['fields']['remove']['id'] = 'remove';
+  $handler->display->display_options['fields']['remove']['table'] = 'commerce_line_item';
+  $handler->display->display_options['fields']['remove']['field'] = 'remove';
+  $handler->display->display_options['fields']['remove']['relationship'] = 'line_items_line_item_id';
+  $handler->display->display_options['fields']['remove']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['remove']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['remove']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['remove']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['remove']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['remove']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['remove']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['remove']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['remove']['element_label_colon'] = 1;
+  $handler->display->display_options['fields']['remove']['element_default_classes'] = 1;
+  $handler->display->display_options['fields']['remove']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['remove']['empty_zero'] = 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',
+  );
+  $translatables['commerce_cart'] = array(
+    t('Defaults'),
+    t('Shopping cart'),
+    t('more'),
+    t('Apply'),
+    t('Reset'),
+    t('Sort By'),
+    t('Asc'),
+    t('Desc'),
+    t('Line Item'),
+    t('Product'),
+    t('SKU'),
+    t('[title] ([line_item_label])'),
+    t('Price'),
+    t('Quantity'),
+    t('Remove'),
+    t('Total'),
+  );
+
+  $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/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;
 }
diff --git modules/line_item/commerce_line_item.info modules/line_item/commerce_line_item.info
index e22f0da..439cadf 100644
--- modules/line_item/commerce_line_item.info
+++ modules/line_item/commerce_line_item.info
@@ -23,6 +23,9 @@ files[] = includes/views/handlers/commerce_line_item_handler_area_line_item_summ
 files[] = includes/views/handlers/commerce_line_item_handler_argument_line_item_line_item_id.inc
 files[] = includes/views/handlers/commerce_line_item_handler_field_line_item_type.inc
 files[] = includes/views/handlers/commerce_line_item_handler_filter_line_item_type.inc
+files[] = includes/views/handlers/commerce_line_item_handler_field_edit.inc
+files[] = includes/views/handlers/commerce_line_item_handler_field_quantity_edit.inc
+files[] = includes/views/handlers/commerce_line_item_handler_field_remove.inc
 
 ; Simple tests
 ; files[] = tests/commerce_line_item.test
diff --git modules/line_item/commerce_line_item.module modules/line_item/commerce_line_item.module
index 46c4363..42cb869 100644
--- modules/line_item/commerce_line_item.module
+++ modules/line_item/commerce_line_item.module
@@ -101,10 +101,26 @@ function commerce_line_item_theme() {
       'path' => drupal_get_path('module', 'commerce_line_item') . '/theme',
       'template' => 'commerce-line-item-summary',
     ),
+    'commerce_line_item_edit_form' => array(
+      'render element' => 'form',
+    ),
   );
 }
 
 /**
+ * Implements hook_forms().
+ * 
+ * Force each line item edit form instance to use the same callback.
+ */
+function commerce_line_item_forms($form_id, $args) {
+  $forms = array();
+  if (strpos($form_id, 'commerce_line_item_edit_form_') === 0) {
+    $forms[$form_id] = array('callback' => 'commerce_line_item_edit_form');
+  }
+  return $forms;
+}
+
+/**
  * Adds the necessary CSS for the line item summary template.
  */
 function template_preprocess_commerce_line_item_summary(&$variables) {
diff --git modules/line_item/includes/views/commerce_line_item.views.inc modules/line_item/includes/views/commerce_line_item.views.inc
index 3d0369c..5ea290e 100644
--- modules/line_item/includes/views/commerce_line_item.views.inc
+++ modules/line_item/includes/views/commerce_line_item.views.inc
@@ -101,6 +101,24 @@ function commerce_line_item_views_data() {
     ),
   );
 
+  // Field that adds a field to edit quantity on the view.
+  $data['commerce_line_item']['quantity_edit'] = array(
+    'field' => array(
+      'title' => t('Quantity edit'),
+      'help' => t('Provide a field to edit quantity on the view.'),
+      'handler' => 'commerce_line_item_handler_field_quantity_edit',
+    ),
+  );
+
+  // Field that adds a button to remove a line item.
+  $data['commerce_line_item']['remove'] = array(
+    'field' => array(
+      'title' => t('Remove'),
+      'help' => t('Provide a button to remove a line item.'),
+      'handler' => 'commerce_line_item_handler_field_remove',
+    ),
+  );
+
   // Expose the created and changed timestamps.
   $data['commerce_line_item']['created'] = array(
     'title' => t('Created date'),
@@ -143,3 +161,141 @@ function commerce_line_item_views_data() {
 
   return $data;
 }
+
+/**
+ * Implements hook_views_post_render().
+ */
+function commerce_line_item_views_post_render(&$view, &$output, &$cache) {
+  // TODO: Allow 'commerce_line_item' as base table?
+  // TODO: Check for 'edit fields' before creating the line item edit form.
+  if ($view->base_table == 'commerce_order') {
+    $form_suffix = $view->name . '_' . $view->current_display;
+    $form = drupal_get_form('commerce_line_item_edit_form_' . $form_suffix, $view, $output);
+    $output = drupal_render($form);
+  }
+}
+
+function commerce_line_item_edit_form($form, &$form_state, &$view, &$output) {
+  // Check the existence of order_id argument.
+  if (!isset($view->argument['order_id'])) {
+    return;
+  }
+
+  // Load the cart order.
+  // TODO: Make this order independent?
+  $order = commerce_order_load($view->argument['order_id']->value[0]);
+
+  // TODO: Move CSS file to line item module.
+  $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,
+  );
+
+  // Pass view for themeing.
+  $form['view'] = array(
+    '#type' => 'value',
+    '#value' => $view,
+  );
+
+  // Pass output for replacing tokens with form fields.
+  $form['output'] = array(
+    '#type' => 'value',
+    '#value' => $output,
+  );
+
+  foreach ($view->field as $name => $field) {
+    if(is_a($field, 'commerce_line_item_handler_field_edit')) {
+      $form[$name] = $field->get_edit_form() + array('#tree' => TRUE);
+    }
+  }
+
+  // Move actions to views content plugin.
+  $form['actions'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('form-actions')),
+    '#weight' => 100,
+  );
+
+  $form['actions']['update'] = array(
+    '#type' => 'submit',
+    '#value' => t('Update cart'),
+    '#weight' => 40,
+  );
+
+  $form['actions']['checkout'] = array(
+    '#type' => 'submit',
+    '#value' => t('Checkout'),
+    '#weight' => 45,
+    '#access' => user_access('access checkout'),
+  );
+
+  return $form;
+}
+
+/**
+ * Validate handler for the cart operations.
+ */
+function commerce_line_item_edit_form_validate($form, &$form_state) {
+  $view = $form['view']['#value'];
+
+  foreach ($view->field as $name => $field) {
+    if(is_a($field, 'commerce_line_item_handler_field_edit')) {
+      $field->edit_form_validate($form, $form_state);
+    }
+  }
+}
+
+/**
+ * Submit handler for the cart operations.
+ */
+function commerce_line_item_edit_form_submit($form, &$form_state) {
+  $view = $form['view']['#value'];
+
+  foreach ($view->field as $name => $field) {
+    if(is_a($field, 'commerce_line_item_handler_field_edit')) {
+      $field->edit_form_submit($form, $form_state);
+    }
+  }
+
+  $order = commerce_order_load($form_state['values']['order']->order_id);
+
+  // 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 line item form.
+ */
+function theme_commerce_line_item_edit_form($variables) {
+  $form = $variables['form'];
+  $view = $form['view']['#value'];
+  $output = $form['output']['#value'];
+
+  $search = array();
+  $replace = array();
+  foreach ($view->field as $name => $field) {
+    if(is_a($field, 'commerce_line_item_handler_field_edit')) {
+      foreach (element_children($form[$name]) as $line_item_id) {
+        $search[] = '<!--post-commerce-line-item-' . $name . '-' . $line_item_id . '-->';
+        $replace[] = drupal_render($form[$name][$line_item_id]);
+      }
+    }
+  }
+
+  // Apply replacements to the rendered output.
+  $output = str_replace($search, $replace, $output);
+  $output .= drupal_render_children($form);
+
+  return $output;
+}
diff --git modules/line_item/includes/views/handlers/commerce_line_item_handler_field_edit.inc modules/line_item/includes/views/handlers/commerce_line_item_handler_field_edit.inc
new file mode 100644
index 0000000..1532be3
--- /dev/null
+++ modules/line_item/includes/views/handlers/commerce_line_item_handler_field_edit.inc
@@ -0,0 +1,40 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Base field handler to present a form field to edit a line item field.
+ */
+
+/**
+ * Field handler to present a field to change quantity of a line item.
+ */
+class commerce_line_item_handler_field_edit extends views_handler_field {
+  var $form;
+
+  function construct() {
+    parent::construct();
+    $this->additional_fields['line_item_id'] = 'line_item_id';
+
+    // Set real_field in order to make it generate a field_alias.
+    $this->real_field = 'line_item_id';
+  }
+
+  /**
+   * Return a form field array used to edit the value of this field.
+   */
+  function get_edit_form() {
+    return $this->form;
+  }
+
+  /**
+   * Validates the new value set to the field.
+   */
+  function edit_form_validate($form, &$form_state) {}
+
+  /**
+   * Process the new field value.
+   */
+  function edit_form_submit($form, &$form_state) {}
+
+}
diff --git modules/line_item/includes/views/handlers/commerce_line_item_handler_field_quantity_edit.inc modules/line_item/includes/views/handlers/commerce_line_item_handler_field_quantity_edit.inc
new file mode 100644
index 0000000..5a5f16b
--- /dev/null
+++ modules/line_item/includes/views/handlers/commerce_line_item_handler_field_quantity_edit.inc
@@ -0,0 +1,63 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Field handler to present a form field to change quantity of a line item. It's
+ * a dummy handler, most part of the implementation is done via post render
+ * hook.
+ */
+
+/**
+ * Field handler to present a field to change quantity of a line item.
+ */
+class commerce_line_item_handler_field_quantity_edit extends commerce_line_item_handler_field_edit {
+
+  function construct() {
+    parent::construct();
+    $this->additional_fields['quantity'] = 'quantity';
+
+    // Set real_field in order to make it generate a field_alias.
+    $this->real_field = 'quantity';
+  }
+
+  function render($values) {
+    $line_item_id = $values->{$this->aliases['line_item_id']};
+    $quantity = $values->{$this->aliases['quantity']};
+
+    // Add form that will be used for replacing the placeholder generated bellow
+    // at form rendering phase in commerce_line_item_views_post_render().
+    $this->form[$line_item_id] = array(
+      '#type' => 'textfield',
+      // TODO: Allow decimal quantities, i.e. for other units than piece:
+      // kilograms, milligrams, etc.
+      '#default_value' => round($quantity),
+      '#size' => 4,
+    );
+
+    // Return the placeholder that will be used as token for replacing itself
+    // with the rendered form field created above.
+    return '<!--post-commerce-line-item-quantity_edit-' . $line_item_id . '-->';
+  }
+
+  function edit_form_validate($form, &$form_state) {
+    foreach (element_children($form['quantity_edit']) as $line_item_id) {
+      if (!is_numeric($form_state['values']['quantity_edit'][$line_item_id]) || $form_state['values']['quantity_edit'][$line_item_id] <= 0) {
+        form_set_error('quantity_edit][' . $line_item_id, t('You must specify a positive numeric value for the quantity'));
+      }
+    }
+  }
+
+  function edit_form_submit($form, &$form_state) {
+    foreach (element_children($form['quantity_edit']) as $line_item_id) {
+      // Check if there is a change in quantity.
+      $line_item = commerce_line_item_load($line_item_id);
+      if ($form_state['values']['quantity_edit'][$line_item_id] != $line_item->quantity) {
+        // Change the quantity and save it.
+        $line_item->quantity = $form_state['values']['quantity_edit'][$line_item_id];
+        commerce_line_item_save($line_item);
+      }
+    }    
+  }
+
+}
diff --git modules/line_item/includes/views/handlers/commerce_line_item_handler_field_remove.inc modules/line_item/includes/views/handlers/commerce_line_item_handler_field_remove.inc
new file mode 100644
index 0000000..81b73f4
--- /dev/null
+++ modules/line_item/includes/views/handlers/commerce_line_item_handler_field_remove.inc
@@ -0,0 +1,51 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Field handler to present a button to remove a line item. It's a dummy
+ * handler, most part of the implementation is done via pre and post render
+ * hooks.
+ */
+
+/**
+ * Field handler to present a button to remove a line item.
+ */
+class commerce_line_item_handler_field_remove extends commerce_line_item_handler_field_edit {
+
+  function render($values) {
+    $line_item_id = $values->{$this->aliases['line_item_id']};
+
+    // Add form that will be used for replacing the placeholder generated bellow
+    // at form rendering phase in commerce_line_item_views_post_render().
+    $this->form[$line_item_id] = array(
+      '#type' => 'submit',
+      '#value' => t('Remove'),
+      '#name' => 'remove-line-item-' . $line_item_id,
+      '#attributes' => array('class' => array('remove-line-item')),
+    );
+
+    // Return the placeholder that will be used as token for replacing itself
+    // with the rendered form field created above.
+    return '<!--post-commerce-line-item-remove-' . $line_item_id . '-->';
+  }
+
+  function edit_form_submit($form, &$form_state) {
+    $order = commerce_order_load($form_state['values']['order']->order_id);
+    foreach (element_children($form['remove']) 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);
+      }
+    }    
+  }
+
+}
