diff --git modules/quantity/commerce_extra_quantity.info modules/quantity/commerce_extra_quantity.info
index 9833350..87d7269 100644
--- modules/quantity/commerce_extra_quantity.info
+++ modules/quantity/commerce_extra_quantity.info
@@ -1,7 +1,10 @@
 name        = Commerce Extra Quantity
-description	= Wraps quantity fields with - and + links to decrease or increase quantity.
-package			= Commerce Extra
+description = Wraps quantity fields with - and + links to decrease or increase quantity.
+package     = Commerce Extra
 core        = 7.x
 
 dependencies[] = commerce_extra
 dependencies[] = commerce_cart
+
+; Views handlers
+files[] = includes/views/handlers/commerce_line_item_handler_field_quantity_plusminus.inc
diff --git modules/quantity/commerce_extra_quantity.module modules/quantity/commerce_extra_quantity.module
index a07bb43..fa08b4f 100644
--- modules/quantity/commerce_extra_quantity.module
+++ modules/quantity/commerce_extra_quantity.module
@@ -43,34 +43,31 @@ function commerce_extra_quantity_commerce_extra_configure_submit(&$form, &$form_
  * Adds additional theme wrappers for add to cart's quantity textfields.
  */
 function commerce_extra_quantity_form_alter(&$form, &$form_state, $form_id) {
-
-  // Load quantity cardinality setting
-  $quantity_cardinality = variable_get('commerce_extra_quantity_cardinality', 1);
-
   // Add to cart form from field api
   $str = 'commerce_cart_add_to_cart_form_';
   if (drupal_substr($form_id, 0, drupal_strlen($str)) == $str) {
     if (isset($form['quantity']) && $form['quantity']['#type'] == 'textfield') {
-      $form['#attached']['js'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/commerce_extra_quantity.js';
-      $form['#attached']['css'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/commerce_extra_quantity.css';
-      $form['quantity']['#theme_wrappers'] = array('quantity_plusminus_wrapper', 'form_element');
-      $form['quantity']['#amount'] = $quantity_cardinality;
-      $form['#validate'][] = 'commerce_extra_quantity_validate_cardinality';
-    }
-  }
-
-  // Quantity fields from views
-  if ($form_id == 'views_form_commerce_cart_form_default') {
-    if (isset($form['edit_quantity'])) {
-      $form['#attached']['js'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/commerce_extra_quantity.js';
-      $form['#attached']['css'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/commerce_extra_quantity.css';
-      foreach ($form['edit_quantity'] as $key => $value) {
-        if (is_numeric($key) && drupal_substr($key, 0, 1) != '#' && is_array($value)) {
-          $form['edit_quantity'][$key]['#theme_wrappers'] = array('quantity_plusminus_wrapper', 'form_element');
-          $form['edit_quantity'][$key]['#amount'] = $quantity_cardinality;
+      $quantity_cardinality = NULL;
+      // Use field formatter alter if Field formatter settings module enabled.
+      if (module_exists('field_formatter_settings')) {
+        $field_context = $form_state['context'];
+        $instance = field_info_instance($field_context['entity_type'], $field_context['field'], $field_context['bundle']);
+        $entity = reset(entity_load($field_context['entity_type'], array($field_context['entity_id'])));
+        $field_instance_display = field_get_display($instance, $field_context['view_mode'], $entity);
+        if (!empty($field_instance_display['settings']['quantity_extra_plusminus'])) {
+          $quantity_cardinality = $field_instance_display['settings']['quantity_extra_plusminus_cardinality'];
         }
       }
-      $form['#validate'][] = 'commerce_extra_quantity_validate_cardinality';
+      else {
+        $quantity_cardinality = variable_get('commerce_extra_quantity_cardinality', '1');
+      }
+      if (!empty($quantity_cardinality)) {
+        $form['#attached']['js'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/js/commerce_line_item_quantity_plusminus.js';
+        $form['#attached']['css'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/css/commerce_line_item_quantity_plusminus.css';
+        $form['quantity']['#theme_wrappers'] = array('commerce_line_item_quantity_plusminus_wrapper', 'form_element');
+        $form['quantity']['#amount'] = $quantity_cardinality;
+        $form['#validate'][] = 'commerce_extra_quantity_validate_cardinality';
+      }
     }
   }
 
@@ -104,14 +101,24 @@ function commerce_extra_quantity_validate_cardinality(&$form, &$form_state) {
 }
 
 /**
+ * Implements hook_views_api().
+ */
+function commerce_extra_quantity_views_api() {
+  return array(
+    'api' => 3,
+    'path' => drupal_get_path('module', 'commerce_extra_quantity') . '/includes/views',
+  );
+}
+
+/**
  * Implements hook_theme().
  */
 function commerce_extra_quantity_theme($existing, $type, $theme, $path) {
   return array(
-    'quantity_plusminus_wrapper' => array(
+    'commerce_line_item_quantity_plusminus_wrapper' => array(
       'render element' => 'form',
     ),
-    'quantity_plusminus_link' => array(
+    'commerce_line_item_quantity_plusminus_link' => array(
       'variables' => array('way' => NULL, 'quantity' => NULL, 'quantity_input_element' => NULL),
     ),
   );
@@ -120,27 +127,27 @@ function commerce_extra_quantity_theme($existing, $type, $theme, $path) {
 /**
  * Returns HTML for quantity textfield having links wrapping the textfield.
  */
-function theme_quantity_plusminus_wrapper($variables) {
+function theme_commerce_line_item_quantity_plusminus_wrapper($variables) {
   $amount = isset($variables['form']['#amount']) ? $variables['form']['#amount'] : 1;
-  $decrease = theme('quantity_plusminus_link', array('way' => COMMERCE_EXTRA_QUANTITY_DECREASE, 'quantity' => $variables['form']['#value'], 'quantity_input_element' => $variables['form']['#id'], 'amount' => $amount));
-  $increase = theme('quantity_plusminus_link', array('way' => COMMERCE_EXTRA_QUANTITY_INCREASE, 'quantity' => $variables['form']['#value'], 'quantity_input_element' => $variables['form']['#id'], 'amount' => $amount));
+  $decrease = theme('commerce_line_item_quantity_plusminus_link', array('way' => COMMERCE_EXTRA_QUANTITY_DECREASE, 'quantity' => $variables['form']['#value'], 'quantity_input_element' => $variables['form']['#id'], 'amount' => $amount));
+  $increase = theme('commerce_line_item_quantity_plusminus_link', array('way' => COMMERCE_EXTRA_QUANTITY_INCREASE, 'quantity' => $variables['form']['#value'], 'quantity_input_element' => $variables['form']['#id'], 'amount' => $amount));
   return $decrease . $variables['form']['#children'] . $increase;
 }
 
 /**
  * Returns HTML for link which increases/decreases quantity value.
  */
-function theme_quantity_plusminus_link($variables) {
+function theme_commerce_line_item_quantity_plusminus_link($variables) {
   switch ($variables['way']) {
     case COMMERCE_EXTRA_QUANTITY_DECREASE:
       $text = '-';
       $class = 'commerce-quantity-plusminus-link-decrease';
-      $js_callback = "Drupal.commerce_extra_quantity_quantity('#" . $variables['quantity_input_element'] . "', " . $variables['way'] . ", " . $variables['amount'] . ")";
+      $js_callback = "Drupal.commerce_line_item_quantity_plusminus('#" . $variables['quantity_input_element'] . "', " . $variables['way'] . ", " . $variables['amount'] . ")";
       break;
     case COMMERCE_EXTRA_QUANTITY_INCREASE:
       $text = '+';
       $class = 'commerce-quantity-plusminus-link-increase';
-      $js_callback = "Drupal.commerce_extra_quantity_quantity('#" . $variables['quantity_input_element'] . "', " . $variables['way'] . ", " . $variables['amount'] . ")";
+      $js_callback = "Drupal.commerce_line_item_quantity_plusminus('#" . $variables['quantity_input_element'] . "', " . $variables['way'] . ", " . $variables['amount'] . ")";
       break;
   }
   if ($variables['quantity'] <= 1) {
@@ -160,3 +167,66 @@ function theme_quantity_plusminus_link($variables) {
   );
   return render($element);
 }
+/**
+ * Implementation for hook_field_widget_info_alter.
+ * Add new settings to the quantity formatter.
+ */
+function commerce_extra_quantity_field_formatter_info_alter(&$info) {
+  if (isset($info['date_default'])) {
+    $info['commerce_cart_add_to_cart_form']['settings']['quantity_extra_plusminus'] = FALSE;
+    $info['commerce_cart_add_to_cart_form']['settings']['quantity_extra_plusminus_cardinality'] = NULL;
+  }
+}
+
+/**
+ * Implements hook_field_formatter_settings_summary_alter().
+ */
+function commerce_extra_quantity_field_formatter_settings_summary_alter(&$summary, $context) {
+  $display = $context['instance']['display'][$context['view_mode']];
+  $settings = $display['settings'];
+  if (isset($settings['quantity_extra_plusminus'])) {
+    if (empty($settings['quantity_extra_plusminus'])) {
+      $summary .= '<br />' . t('Commerce Extra') . ': +/- ' . t('not enabled.');
+    }
+    else {
+      $summary .= '<br />' . t('Commerce Extra Quantity') . ': +/- ' . t('enabled.') . ' ' . t('Cardinality') . ': ' . $settings['quantity_extra_plusminus_cardinality'] . '.';
+    }
+  }
+}
+
+/**
+ * Implements hook_field_formatter_settings_form_alter().
+ */
+function commerce_extra_quantity_field_formatter_settings_form_alter(&$settings_form, $context) {
+  $display = $context['instance']['display'][$context['view_mode']];
+  $settings = $display['settings'];
+  if ($display['type'] == 'commerce_cart_add_to_cart_form') {
+    $settings_form['show_quantity']['#weight'] = -100;
+    $settings_form['quantity_extra_plusminus'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Add +/- buttons to increase/decrease the quantity value.'),
+      '#default_value' => $settings['quantity_extra_plusminus'],
+      '#weight' => -99,
+      '#states' => array(
+        // Hide the settings when the select checkbox is disabled.
+        'invisible' => array(
+         ':input[name="fields[field_product][settings_edit_form][settings][show_quantity]"]' => array('checked' => FALSE),
+        ),
+      ),
+    );
+    $settings_form['quantity_extra_plusminus_cardinality'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Quantity cardinality'),
+      '#dscription' => t('You can change quantity cardinality for quantity widget.'),
+      '#default_value' => $settings['quantity_extra_plusminus_cardinality'],
+      '#weight' => -98,
+      '#size' => 3,
+      '#states' => array(
+        // Hide the settings when the select checkbox is disabled.
+        'invisible' => array(
+         ':input[name="fields[field_product][settings_edit_form][settings][quantity_extra_plusminus]"]' => array('checked' => FALSE),
+        ),
+      ),
+    );
+  }
+}
diff --git modules/quantity/css/commerce_line_item_quantity_plusminus.css modules/quantity/css/commerce_line_item_quantity_plusminus.css
new file mode 100644
index 0000000..94b9caa
--- /dev/null
+++ modules/quantity/css/commerce_line_item_quantity_plusminus.css
@@ -0,0 +1,26 @@
+.commerce-quantity-plusminus-link a.button {
+  font-weight: bold;
+  text-align: center;
+  margin-bottom: 1em;
+  margin-right:0;
+  padding: 4px 7px;
+}
+.commerce-quantity-plusminus-link a.button:hover {
+  text-decoration: none;
+  background: #dedede;
+  color: #3a3a3a;
+}
+.commerce-quantity-plusminus-link.commerce-quantity-plusminus-link-decrease a {
+  border-right: none;
+  -khtml-border-radius: 10px 0px 0px 10px;
+  -moz-border-radius: 15px 0px 0px 15px;
+  -webkit-border-radius: 10px 0px 0px 10px;
+  border-radius: 10px 0px 0px 10px;
+}
+.commerce-quantity-plusminus-link.commerce-quantity-plusminus-link-increase a {
+  border-left: none;
+  -khtml-border-radius: 0px 10px 10px 0px;
+  -moz-border-radius: 0px 15px 15px 0px;
+  -webkit-border-radius: 0px 10px 10px 0px;
+  border-radius: 0px 10px 10px 0px;
+}
diff --git modules/quantity/includes/views/commerce_extra_quantity.views.inc modules/quantity/includes/views/commerce_extra_quantity.views.inc
new file mode 100644
index 0000000..28009e6
--- /dev/null
+++ modules/quantity/includes/views/commerce_extra_quantity.views.inc
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * Export Drupal Commerce line items to Views.
+ */
+
+/**
+ * Implements hook_views_data()
+ */
+function commerce_extra_quantity_views_data() {
+  $data = array();
+
+  // Adds a textfield to edit line item quantity on the view.
+  $data['commerce_line_item']['quantity_plusminus'] = array(
+    'field' => array(
+      'title' => t('Quantity edit with +/- buttons'),
+      'help' => t('Adds a text field to edit the line item quantity in the View with extra +/- increase/decrease option.'),
+      'handler' => 'commerce_line_item_handler_field_quantity_plusminus',
+    ),
+  );
+
+  return $data;
+}
diff --git modules/quantity/includes/views/commerce_extra_quantity.views_default.inc modules/quantity/includes/views/commerce_extra_quantity.views_default.inc
new file mode 100644
index 0000000..c8e103f
--- /dev/null
+++ modules/quantity/includes/views/commerce_extra_quantity.views_default.inc
@@ -0,0 +1,175 @@
+<?php
+
+/**
+ * Views for Commerce Extra Quantity.
+ */
+
+/**
+ * Implements hook_views_default_views().
+ */
+function commerce_extra_quantity_views_default_views() {
+  $views = array();
+
+  // Line item view for the order view page.
+  $view = new view();
+  $view->name = 'commerce_cart_form_commerce_extra_quantity';
+  $view->description = 'Display a shopping cart update form.';
+  $view->tag = 'commerce';
+  $view->base_table = 'commerce_order';
+  $view->human_name = 'Commerce Extra Quantity Shopping cart form';
+  $view->core = 0;
+  $view->api_version = '3.0';
+  $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['use_more_always'] = FALSE;
+  $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['query']['options']['query_comment'] = FALSE;
+  $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(
+    'commerce_display_path' => 'commerce_display_path',
+    'line_item_title' => 'line_item_title',
+    'commerce_unit_price' => 'commerce_unit_price',
+    'edit_quantity' => 'edit_quantity',
+    'edit_delete' => 'edit_delete',
+    'commerce_total' => 'commerce_total',
+  );
+  $handler->display->display_options['style_options']['default'] = '-1';
+  $handler->display->display_options['style_options']['info'] = array(
+    'commerce_display_path' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+    ),
+    'line_item_title' => array(
+      'align' => '',
+      'separator' => '',
+    ),
+    'commerce_unit_price' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+    ),
+    'edit_quantity' => array(
+      'align' => '',
+      'separator' => '',
+    ),
+    'edit_delete' => array(
+      'align' => '',
+      'separator' => '',
+    ),
+    'commerce_total' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+    ),
+  );
+  /* Footer: Commerce Line Item: Line item summary */
+  $handler->display->display_options['footer']['line_item_summary']['id'] = 'line_item_summary';
+  $handler->display->display_options['footer']['line_item_summary']['table'] = 'commerce_line_item';
+  $handler->display->display_options['footer']['line_item_summary']['field'] = 'line_item_summary';
+  $handler->display->display_options['footer']['line_item_summary']['label'] = 'Cart summary';
+  $handler->display->display_options['footer']['line_item_summary']['info'] = array(
+    'quantity' => 0,
+    'total' => 'total',
+  );
+  /* Relationship: Commerce Order: Referenced line items */
+  $handler->display->display_options['relationships']['commerce_line_items_line_item_id']['id'] = 'commerce_line_items_line_item_id';
+  $handler->display->display_options['relationships']['commerce_line_items_line_item_id']['table'] = 'field_data_commerce_line_items';
+  $handler->display->display_options['relationships']['commerce_line_items_line_item_id']['field'] = 'commerce_line_items_line_item_id';
+  $handler->display->display_options['relationships']['commerce_line_items_line_item_id']['required'] = TRUE;
+  /* Field: Commerce Line item: Display path */
+  $handler->display->display_options['fields']['commerce_display_path']['id'] = 'commerce_display_path';
+  $handler->display->display_options['fields']['commerce_display_path']['table'] = 'field_data_commerce_display_path';
+  $handler->display->display_options['fields']['commerce_display_path']['field'] = 'commerce_display_path';
+  $handler->display->display_options['fields']['commerce_display_path']['relationship'] = 'commerce_line_items_line_item_id';
+  $handler->display->display_options['fields']['commerce_display_path']['label'] = '';
+  $handler->display->display_options['fields']['commerce_display_path']['exclude'] = TRUE;
+  /* Field: Commerce Line Item: Title */
+  $handler->display->display_options['fields']['line_item_title']['id'] = 'line_item_title';
+  $handler->display->display_options['fields']['line_item_title']['table'] = 'commerce_line_item';
+  $handler->display->display_options['fields']['line_item_title']['field'] = 'line_item_title';
+  $handler->display->display_options['fields']['line_item_title']['relationship'] = 'commerce_line_items_line_item_id';
+  $handler->display->display_options['fields']['line_item_title']['label'] = 'Product';
+  $handler->display->display_options['fields']['line_item_title']['alter']['make_link'] = TRUE;
+  $handler->display->display_options['fields']['line_item_title']['alter']['path'] = '[commerce_display_path]';
+  /* Field: Commerce Line item: Unit price */
+  $handler->display->display_options['fields']['commerce_unit_price']['id'] = 'commerce_unit_price';
+  $handler->display->display_options['fields']['commerce_unit_price']['table'] = 'field_data_commerce_unit_price';
+  $handler->display->display_options['fields']['commerce_unit_price']['field'] = 'commerce_unit_price';
+  $handler->display->display_options['fields']['commerce_unit_price']['relationship'] = 'commerce_line_items_line_item_id';
+  $handler->display->display_options['fields']['commerce_unit_price']['label'] = 'Price';
+  $handler->display->display_options['fields']['commerce_unit_price']['element_class'] = 'price';
+  $handler->display->display_options['fields']['commerce_unit_price']['click_sort_column'] = 'amount';
+  /* Field: Commerce Line Item: Quantity edit with +/- buttons */
+  $handler->display->display_options['fields']['quantity_plusminus']['id'] = 'quantity_plusminus';
+  $handler->display->display_options['fields']['quantity_plusminus']['table'] = 'commerce_line_item';
+  $handler->display->display_options['fields']['quantity_plusminus']['field'] = 'quantity_plusminus';
+  $handler->display->display_options['fields']['quantity_plusminus']['relationship'] = 'commerce_line_items_line_item_id';
+  $handler->display->display_options['fields']['quantity_plusminus']['label'] = 'Quantity';
+  /* Field: Commerce Line Item: Delete button */
+  $handler->display->display_options['fields']['edit_delete']['id'] = 'edit_delete';
+  $handler->display->display_options['fields']['edit_delete']['table'] = 'commerce_line_item';
+  $handler->display->display_options['fields']['edit_delete']['field'] = 'edit_delete';
+  $handler->display->display_options['fields']['edit_delete']['relationship'] = 'commerce_line_items_line_item_id';
+  $handler->display->display_options['fields']['edit_delete']['label'] = 'Remove';
+  /* Field: Commerce Line item: Total */
+  $handler->display->display_options['fields']['commerce_total']['id'] = 'commerce_total';
+  $handler->display->display_options['fields']['commerce_total']['table'] = 'field_data_commerce_total';
+  $handler->display->display_options['fields']['commerce_total']['field'] = 'commerce_total';
+  $handler->display->display_options['fields']['commerce_total']['relationship'] = 'commerce_line_items_line_item_id';
+  $handler->display->display_options['fields']['commerce_total']['element_class'] = 'price';
+  $handler->display->display_options['fields']['commerce_total']['click_sort_column'] = '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'] = 'commerce_line_items_line_item_id';
+  /* Contextual filter: 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']['default_argument_type'] = 'fixed';
+  $handler->display->display_options['arguments']['order_id']['summary']['number_of_records'] = '0';
+  $handler->display->display_options['arguments']['order_id']['summary']['format'] = 'default_summary';
+  $handler->display->display_options['arguments']['order_id']['summary_options']['items_per_page'] = '25';
+  /* Filter criterion: Commerce Line Item: Line item is of a product line item type */
+  $handler->display->display_options['filters']['product_line_item_type']['id'] = 'product_line_item_type';
+  $handler->display->display_options['filters']['product_line_item_type']['table'] = 'commerce_line_item';
+  $handler->display->display_options['filters']['product_line_item_type']['field'] = 'product_line_item_type';
+  $handler->display->display_options['filters']['product_line_item_type']['relationship'] = 'commerce_line_items_line_item_id';
+  $handler->display->display_options['filters']['product_line_item_type']['value'] = '1';
+  $handler->display->display_options['filters']['product_line_item_type']['group'] = 0;
+  $translatables['commerce_cart_form_commerce_extra_quantity'] = array(
+    t('Defaults'),
+    t('Shopping cart'),
+    t('more'),
+    t('Apply'),
+    t('Reset'),
+    t('Sort by'),
+    t('Asc'),
+    t('Desc'),
+    t('Cart summary'),
+    t('Line items referenced by commerce_line_items'),
+    t('Product'),
+    t('Price'),
+    t('Quantity'),
+    t('Remove'),
+    t('Total'),
+    t('All'),
+  );
+
+  $views[$view->name] = $view;
+
+  return $views;
+}
diff --git modules/quantity/includes/views/handlers/commerce_line_item_handler_field_quantity_plusminus.inc modules/quantity/includes/views/handlers/commerce_line_item_handler_field_quantity_plusminus.inc
new file mode 100644
index 0000000..37f05de
--- /dev/null
+++ modules/quantity/includes/views/handlers/commerce_line_item_handler_field_quantity_plusminus.inc
@@ -0,0 +1,155 @@
+<?php
+
+/**
+ * @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_plusminus extends views_handler_field {
+
+  function construct() {
+    parent::construct();
+    $this->additional_fields['line_item_id'] = 'line_item_id';
+    $this->additional_fields['quantity'] = 'quantity';
+
+    // Set real_field in order to make it generate a field_alias.
+    $this->real_field = 'quantity';
+  }
+
+  function option_definition() {
+    $options = parent::option_definition();
+
+    $options['quantity_cardinality'] = 1;
+
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+
+    $form['quantity_cardinality'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Quantity cardinality'),
+      '#description' => t('You can change quantity cardinality for quantity widget.'),
+      '#size' => 3,
+      '#default_value' => $this->options['quantity_cardinality'],
+      '#element_validate' => array('element_validate_number'),
+    );
+  }
+
+  function render($values) {
+    return '<!--form-item-' . $this->options['id'] . '--' . $this->view->row_index . '-->';
+  }
+
+  /**
+   * Returns the form which replaces the placeholder from render().
+   */
+  function views_form(&$form, &$form_state) {
+    // The view is empty, abort.
+    if (empty($this->view->result)) {
+      return;
+    }
+
+    $form[$this->options['id']] = array(
+      '#tree' => TRUE,
+    );
+    $form['#attached']['js'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/js/commerce_line_item_quantity_plusminus.js';
+    $form['#attached']['css'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/css/commerce_line_item_quantity_plusminus.css';
+
+    // At this point, the query has already been run, so we can access the results
+    // in order to get the base key value (for example, nid for nodes).
+    foreach ($this->view->result as $row_id => $row) {
+      $line_item_id = $this->get_value($row, 'line_item_id');
+      $quantity = $this->get_value($row, 'quantity');
+
+      $form[$this->options['id']][$row_id] = array(
+        '#type' => 'textfield',
+        '#datatype' => 'integer',
+        '#default_value' => round($quantity),
+        '#size' => 4,
+        '#maxlength' => max(4, strlen($quantity)),
+        '#line_item_id' => $line_item_id,
+        '#attributes' => array(
+          'title' => $this->options['label'],
+        ),
+        '#theme_wrappers' => array('commerce_line_item_quantity_plusminus_wrapper', 'form_element'),
+        '#amount' => $this->options['quantity_cardinality'],
+      );
+    }
+  }
+
+  function views_form_validate($form, &$form_state) {
+    $field_name = $this->options['id'];
+    foreach (element_children($form[$field_name]) as $row_id) {
+      // Ensure the quantity is actually a numeric value.
+      $line_item_id = $form[$field_name][$row_id]['#line_item_id'];
+      if (!is_numeric($form_state['values'][$field_name][$row_id]) || $form_state['values'][$field_name][$row_id] < 0) {
+        form_set_error($field_name . '][' . $row_id, t('You must specify a positive number for the quantity'));
+      }
+
+      // If the custom data type attribute of the quantity element is integer,
+      // ensure we only accept whole number values.
+      if ($form[$field_name][$row_id]['#datatype'] == 'integer' &&
+        (int) $form_state['values'][$field_name][$row_id] != $form_state['values'][$field_name][$row_id]) {
+        form_set_error($field_name . '][' . $row_id, t('You must specify a whole number for the quantity.'));
+      }
+
+      // Not sure about this validation. 
+      /*
+      if (($form_state['values'][$field_name][$row_id] % $this->options['quantity_cardinality'])) {
+        // Quantity is not divisible by quantity cardinality
+        form_set_error('', t('Incorrect quantity level.'));
+        watchdog('commerce_extra_quantity', 'Tried to submit a form with incorrect quantity level @quantity when having quantity cardinality of @quantity_cardinality', array('@quantity' => $form_state['values'][$field_name][$row_id], '@quantity_cardinality' => $this->options['quantity_cardinality']), WATCHDOG_ERROR);
+
+      }
+      */
+    }
+  }
+
+  function views_form_submit($form, &$form_state) {
+    $field_name = $this->options['id'];
+    $deleted_line_items = array();
+    $updated_line_items = array();
+
+    foreach (element_children($form[$field_name]) as $row_id) {
+      $line_item_id = $form[$field_name][$row_id]['#line_item_id'];
+
+      // If the line item hasn't been deleted...
+      if ($line_item = commerce_line_item_load($line_item_id)) {
+        $form_quantity = $form_state['values'][$field_name][$row_id];
+
+        // If the quantity on the form is different...
+        if ($form_quantity != $line_item->quantity) {
+          // If the quantity specified is 0, flag the line item for deletion.
+          if ($form_quantity == 0) {
+            $deleted_line_items[] = $line_item_id;
+          }
+          else {
+            // Otherwise queue the line item quantity update.
+            $updated_line_items[$line_item_id] = $form_quantity;
+          }
+        }
+      }
+    }
+
+    // Process the deletes first.
+    foreach ($deleted_line_items as $line_item_id) {
+      $order = commerce_order_load($form_state['order']->order_id);
+      commerce_cart_order_product_line_item_delete($order, $line_item_id);
+    }
+
+    // Then process the quantity updates.
+    foreach ($updated_line_items as $line_item_id => $quantity) {
+      // Load the line item and update it.
+      $line_item = commerce_line_item_load($line_item_id);
+      $line_item->quantity = $quantity;
+      commerce_line_item_save($line_item);
+      entity_get_controller('commerce_line_item')->resetCache(array($line_item->line_item_id));
+    }
+  }
+}
diff --git modules/quantity/js/commerce_line_item_quantity_plusminus.js modules/quantity/js/commerce_line_item_quantity_plusminus.js
new file mode 100644
index 0000000..85b561f
--- /dev/null
+++ modules/quantity/js/commerce_line_item_quantity_plusminus.js
@@ -0,0 +1,35 @@
+(function ($) {
+
+  // Increase/decrease quantity
+  Drupal.commerce_line_item_quantity_plusminus = function(selector, way, amount) {
+
+    // Find out current quantity and figure out new one
+    var quantity = parseFloat($(selector).val());
+    if (way == 1) {
+      // Increase
+      var new_quantity = quantity+amount;
+    }
+    else if (way == -1) {
+      // Decrease
+      var new_quantity = quantity-amount;
+    }
+    else {
+      var new_quantity = quantity;
+    }
+
+    // Set new quantity
+    if (new_quantity >= 1) {
+      $(selector).val(new_quantity);
+    }
+
+    // Set disabled class depending on new quantity
+    if (new_quantity <= 1) {
+      $(selector).prev('span').addClass('commerce-quantity-plusminus-link-disabled');
+    }
+    else {
+      $(selector).prev('span').removeClass('commerce-quantity-plusminus-link-disabled');
+    }
+
+  }
+
+}(jQuery));
