diff --git a/uc_cart/uc_cart.controller.inc b/uc_cart/uc_cart.controller.inc
index ae2f42d..a010022 100644
--- a/uc_cart/uc_cart.controller.inc
+++ b/uc_cart/uc_cart.controller.inc
@@ -4,8 +4,11 @@
  *
  * Contains the controller for uc_cart_item entities.
  */
-class UcCartItemController extends UcOrderProductController {
+class UcCartItemController extends EntityAPIController {
 
+  /**
+   * Overrides EntityAPIController::attachLoad().
+   */
   public function attachLoad(&$items, $revision_id = FALSE) {
     foreach ($items as &$item) {
       $product = uc_product_load_variant($item->nid, $item->data);
@@ -34,4 +37,19 @@ class UcCartItemController extends UcOrderProductController {
       parent::save($item, $transaction);
     }
   }
+
+  /**
+   * Overrides EntityAPIController::buildContent().
+   */
+  public function buildContent($product, $view_mode = 'full', $langcode = NULL, $content = array()) {
+    $content += module_invoke($product->data['module'], 'uc_cart_display', $product);
+    if (!empty($content)) {
+      $content['cart_item_id'] = array(
+        '#type' => 'hidden',
+        '#value' => isset($product->cart_item_id) ? $product->cart_item_id : 0,
+      );
+    }
+
+    return parent::buildContent($product, $view_mode, $langcode, $content);
+  }
 }
diff --git a/uc_cart/uc_cart.pages.inc b/uc_cart/uc_cart.pages.inc
index 9b114f5..b09e8a1 100644
--- a/uc_cart/uc_cart.pages.inc
+++ b/uc_cart/uc_cart.pages.inc
@@ -146,9 +146,14 @@ function uc_cart_checkout() {
     }
     elseif (!empty($_SESSION['uc_cart_order_rebuild'])) {
       // Or, if the cart has changed, then remove old products and line items.
-      db_delete('uc_order_products')
-        ->condition('order_id', $order->order_id)
+      $efq = new EntityFieldQuery();
+      $result = $efq->entityCondition('entity_type', 'uc_order_product')
+        ->propertyCondition('order_id', $order->order_id)
         ->execute();
+      if (!empty($result['uc_order_product'])) {
+        $product_ids = array_keys($result['uc_order_product']);
+        uc_order_product_delete_multiple($product_ids);
+      }
       uc_order_delete_line_item($order->order_id, TRUE);
       $rebuild = TRUE;
     }
diff --git a/uc_cart/uc_cart_checkout_pane.inc b/uc_cart/uc_cart_checkout_pane.inc
index 4188b07..89e72a5 100644
--- a/uc_cart/uc_cart_checkout_pane.inc
+++ b/uc_cart/uc_cart_checkout_pane.inc
@@ -490,26 +490,16 @@ function theme_uc_cart_review_table($variables) {
   );
 
   // Set up table rows.
-  $display_items = entity_view('uc_order_product', $items, 'cart');
+  $display_items = uc_order_product_view_multiple($items);
   if (!empty($display_items['uc_order_product'])) {
     foreach (element_children($display_items['uc_order_product']) as $key) {
       $display_item = $display_items['uc_order_product'][$key];
-      if (count(element_children($display_item))) {
-        $total = $display_item['#total'];
-        $subtotal += $total;
-        $description = $display_item['title']['#markup'];
-        if (!empty($display_item['description']['#markup'])) {
-          $description .= $display_item['description']['#markup'];
-        }
-        $qty = $display_item['qty']['#default_value'];
-        $suffix = !empty($display_item['#suffixes']) ? implode(' ', $display_item['#suffixes']) : '';
-
-        $rows[] = array(
-          array('data' => array('#theme' => 'uc_qty', '#qty' => $qty), 'class' => array('qty')),
-          array('data' => $description, 'class' => array('products')),
-          array('data' => array('#theme' => 'uc_price', '#price' => $total, '#suffix' => $suffix), 'class' => array('price')),
-        );
-      }
+      $subtotal += $display_item['total']['#price'];
+      $rows[] = array(
+        array('data' => $display_item['qty'], 'class' => array('qty')),
+        array('data' => $display_item['product'], 'class' => array('products')),
+        array('data' => $display_item['total'], 'class' => array('price')),
+      );
     }
   }
 
@@ -555,7 +545,7 @@ function theme_uc_cart_review_table($variables) {
  */
 function theme_uc_checkout_pane_cart_review($variables) {
   $rows = array();
-  $items = entity_view('uc_order_product', $variables['items']);
+  $items = uc_order_product_view_multiple($variables['items']);
 
   foreach (element_children($items['uc_order_product']) as $key) {
     $item = $items['uc_order_product'][$key];
diff --git a/uc_order/uc_order.api.php b/uc_order/uc_order.api.php
index d9290b2..08bfc1a 100644
--- a/uc_order/uc_order.api.php
+++ b/uc_order/uc_order.api.php
@@ -389,7 +389,7 @@ function uc_order_pane_callback($op, $order, &$form = NULL, &$form_state = NULL)
 }
 
 /**
- * Allows modules to alter ordered products when they're loaded with an order.
+ * Allows modules to alter order products when they're loaded with an order.
  *
  * @param &$product
  *   The product object as found in the $order object.
@@ -405,12 +405,89 @@ function hook_uc_order_product_alter(&$product, $order) {
 }
 
 /**
- * Responds to order product deletion.
+ * Acts on order products being loaded from the database.
+ *
+ * This hook is invoked during order product loading, which is handled by
+ * entity_load(), via the EntityCRUDController.
+ *
+ * @param array $order_products
+ *   An array of order product entities being loaded, keyed by id.
+ *
+ * @see hook_entity_load()
+ */
+function hook_uc_order_product_load(array $order_products) {
+  $result = db_query('SELECT pid, foo FROM {mytable} WHERE pid IN(:ids)', array(':ids' => array_keys($entities)));
+  foreach ($result as $record) {
+    $entities[$record->pid]->foo = $record->foo;
+  }
+}
+
+/**
+ * Responds when an order product is inserted.
+ *
+ * This hook is invoked after the order product is inserted into the database.
+ *
+ * @param object $order_product
+ *   The order product that is being inserted.
+ *
+ * @see hook_entity_insert()
+ */
+function hook_uc_order_product_insert(object $order_product) {
+  db_insert('mytable')
+    ->fields(array(
+      'id' => entity_id('uc_order_product', $order_product),
+      'extra' => print_r($order_product, TRUE),
+    ))
+    ->execute();
+}
+
+/**
+ * Acts on an order product being inserted or updated.
+ *
+ * This hook is invoked before the order product is saved to the database.
+ *
+ * @param object $order_product
+ *   The order product that is being inserted or updated.
+ *
+ * @see hook_entity_presave()
+ */
+function hook_uc_order_product_presave(object $order_product) {
+  $order_product->name = 'foo';
+}
+
+/**
+ * Responds to an order product being updated.
+ *
+ * This hook is invoked after the order product has been updated in the database.
+ *
+ * @param object $order_product
+ *   The order product that is being updated.
+ *
+ * @see hook_entity_update()
+ */
+function hook_uc_order_product_update(object $order_product) {
+  db_update('mytable')
+    ->fields(array('extra' => print_r($order_product, TRUE)))
+    ->condition('opid', entity_id('uc_order_product', $order_product))
+    ->execute();
+}
+
+/**
+ * Responds after order product deletion.
+ *
+ * This hook is invoked after the order product has been removed from the
+ * database.
+ *
+ * @param object $order_product
+ *   The order product that is being deleted.
+ *
+ * @see hook_entity_delete()
+ * @see hook_uc_order_edit_form_product_remove()
  */
-function hook_uc_order_product_delete($order_product_id) {
-  // Put back the stock.
-  $product = db_query("SELECT model, qty FROM {uc_order_products} WHERE order_product_id = :id", array(':id' => $order_product_id))->fetchObject();
-  uc_stock_adjust($product->model, $product->qty);
+function hook_uc_order_product_delete(object $order_product) {
+  db_delete('mytable')
+    ->condition('opid', entity_id('uc_order_product', $order_product))
+    ->execute();
 }
 
 /**
diff --git a/uc_order/uc_order.controller.inc b/uc_order/uc_order.controller.inc
index 5ff6967..a064d96 100644
--- a/uc_order/uc_order.controller.inc
+++ b/uc_order/uc_order.controller.inc
@@ -18,7 +18,7 @@ class UcOrderController extends DrupalDefaultEntityController {
         ->propertyOrderBy('order_product_id', 'ASC')
         ->execute();
       if (!empty($result['uc_order_product'])) {
-        $order->products = entity_load('uc_order_product', array_keys($result['uc_order_product']), NULL, TRUE);
+        $order->products = uc_order_product_load_multiple(array_keys($result['uc_order_product']), TRUE);
         foreach ($order->products as $product) {
           $product->order = $order;
           $product->order_uid = $order->uid;
@@ -63,55 +63,68 @@ class UcOrderController extends DrupalDefaultEntityController {
  * Controller class for the uc_order_product entity.
  */
 class UcOrderProductController extends EntityAPIController {
-  public function buildContent($product, $view_mode = 'full', $langcode = NULL, $content = array()) {
-    switch ($view_mode) {
-      case 'cart':
-        $content = array();
-        $content += module_invoke($product->data['module'], 'uc_cart_display', $product);
-        if (!empty($content)) {
-          $content['cart_item_id'] = array(
-            '#type' => 'hidden',
-            '#value' => isset($product->cart_item_id) ? $product->cart_item_id : 0,
-          );
-        }
-        break;
 
-      default:
-        $content['qty'] = array(
-          '#theme' => 'uc_qty',
-          '#qty' => $product->qty,
-          '#cell_attributes' => array('class' => array('qty')),
-        );
-        $node = node_load($product->nid);
-        $title = node_access('view', $node) ? l($product->title, 'node/' . $node->nid) : check_plain($product->title);
-        $content['product'] = array(
-          '#markup' => $title . uc_product_get_description($product),
-          '#cell_attributes' => array('class' => array('product')),
-        );
-        $content['model'] = array(
-          '#markup' => check_plain($product->model),
-          '#cell_attributes' => array('class' => array('sku')),
-        );
-        if (user_access('administer products')) {
-          $content['cost'] = array(
-            '#theme' => 'uc_price',
-            '#price' => $product->cost,
-            '#cell_attributes' => array('class' => array('cost')),
-          );
-        }
-        $content['price'] = array(
-          '#theme' => 'uc_price',
-          '#price' => $product->price,
-          '#suffixes' => array(),
-          '#cell_attributes' => array('class' => array('price')),
-        );
-        $content['total'] = array(
-          '#theme' => 'uc_price',
-          '#price' => $product->price * $product->qty,
-          '#suffixes' => array(),
-          '#cell_attributes' => array('class' => array('total')),
-        );
+  /**
+   * Overrides EntityAPIController::buildContent().
+   */
+  public function buildContent($product, $view_mode = 'full', $langcode = NULL, $content = array()) {
+    $content['qty'] = array(
+      '#theme' => 'uc_qty',
+      '#qty' => $product->qty,
+      '#cell_attributes' => array('class' => array('qty')),
+    );
+    $node = node_load($product->nid);
+    $title = node_access('view', $node) ? l($product->title, 'node/' . $node->nid) : check_plain($product->title);
+    $content['product'] = array(
+      '#markup' => $title . uc_product_get_description($product),
+      '#cell_attributes' => array('class' => array('product')),
+    );
+    $content['model'] = array(
+      '#markup' => check_plain($product->model),
+      '#cell_attributes' => array('class' => array('sku')),
+    );
+    if (user_access('administer products')) {
+      $content['cost'] = array(
+        '#theme' => 'uc_price',
+        '#price' => $product->cost,
+        '#cell_attributes' => array('class' => array('cost')),
+      );
     }
+    $content['price'] = array(
+      '#theme' => 'uc_price',
+      '#price' => $product->price,
+      '#suffixes' => array(),
+      '#cell_attributes' => array('class' => array('price')),
+    );
+    $content['total'] = array(
+      '#theme' => 'uc_price',
+      '#price' => $product->price * $product->qty,
+      '#suffixes' => array(),
+      '#cell_attributes' => array('class' => array('total')),
+    );
+
     return parent::buildContent($product, $view_mode, $langcode, $content);
   }
+
+  /**
+   * Overrides EntityAPIController::save().
+   */
+  public function save($product, DatabaseTransaction $transaction = NULL) {
+    // Product kits, particularly, shouldn't actually be added to an order,
+    // but instead they cause other products to be added.
+    if (isset($product->skip_save) && $product->skip_save == TRUE) {
+      return;
+    }
+
+    if (empty($product->weight_units)) {
+      if (empty($product->nid)) {
+        $product->weight_units = variable_get('uc_weight_unit', 'lb');
+      }
+      else {
+        $units = db_query("SELECT weight_units FROM {node} n JOIN {uc_products} p ON n.vid = p.vid WHERE n.nid = :nid", array(':nid' => $product->nid))->fetchField();
+        $product->weight_units = empty($units) ? variable_get('uc_weight_unit', 'lb') : $units;
+      }
+    }
+    return parent::save($product, $transaction);
+  }
 }
diff --git a/uc_order/uc_order.module b/uc_order/uc_order.module
index 3c0cac0..ea99ad5 100644
--- a/uc_order/uc_order.module
+++ b/uc_order/uc_order.module
@@ -84,6 +84,18 @@ class UcOrder {
 }
 
 /**
+ * Implements hook_help().
+ */
+function uc_order_help($path, $arg) {
+  switch ($path) {
+    case 'admin/store/settings/orders/products/fields':
+      return '<p>' . t('Attach fields to order product entities.  These entities represent the product line items that appear in orders.  Fields attached here are not visible in the current version of Ubercart, but they are available in Views.  A ')
+        . l(t('Computed Field'), 'http://drupal.org/project/computed_field')
+        . t(' is useful for attaching custom data to each product as it is ordered.') . '</p>';
+  }
+}
+
+/**
  * Implements hook_menu().
  */
 function uc_order_menu() {
@@ -288,6 +300,17 @@ function uc_order_menu() {
 }
 
 /**
+ * Implements hook_menu_alter().
+ */
+function uc_order_menu_alter(&$items) {
+  // Adjust the Field UI tabs on admin/store/settings/orders.
+  $items['admin/store/settings/orders/products/fields']['title'] = 'Ordered product fields';
+  $items['admin/store/settings/orders/products/fields']['weight'] = 3;
+  // Disable field display settings for ordered products, as we don't use this anywhere (yet).
+  $items['admin/store/settings/orders/products/display']['access callback'] = FALSE;
+}
+
+/**
  * Implements hook_menu_local_tasks_alter().
  */
 function uc_order_menu_local_tasks_alter(&$data, $router_item, $root_path) {
@@ -496,6 +519,8 @@ function uc_order_entity_info() {
       'base table' => 'uc_order_products',
       'controller class' => 'UcOrderProductController',
       'metadata controller class' => 'UcOrderProductMetadataController',
+      'fieldable' => TRUE,
+      'module' => 'uc_order',
       'entity keys' => array(
         'id' => 'order_product_id',
         'label' => t('Order product'),
@@ -503,6 +528,10 @@ function uc_order_entity_info() {
       'bundles' => array(
         'uc_order_product' => array(
           'label' => t('Order product'),
+          'admin' => array(
+            'path' => 'admin/store/settings/orders/products',
+            'access arguments' => array('administer store'),
+          ),
         ),
       ),
       'view modes' => array(
@@ -515,8 +544,6 @@ function uc_order_entity_info() {
       ),
       // Entity API callbacks.
       'access callback'   => 'uc_order_order_product_access',
-      'save callback'     => 'uc_order_product_entity_save',
-      'deletion callback' => 'uc_order_product_delete',
     ),
   );
 }
@@ -956,9 +983,14 @@ function uc_order_delete($order_id) {
     db_delete('uc_orders')
       ->condition('order_id', $order_id)
       ->execute();
-    db_delete('uc_order_products')
-      ->condition('order_id', $order_id)
+    $efq = new EntityFieldQuery();
+    $result = $efq->entityCondition('entity_type', 'uc_order_product')
+      ->propertyCondition('order_id', $order->order_id)
       ->execute();
+    if (!empty($result['uc_order_product'])) {
+      $product_ids = array_keys($result['uc_order_product']);
+      uc_order_product_delete_multiple($product_ids);
+    }
     db_delete('uc_order_comments')
       ->condition('order_id', $order_id)
       ->execute();
@@ -1000,31 +1032,11 @@ function uc_order_order_product_access($op, $product = NULL, $account = NULL) {
 }
 
 /**
- * Entity API "save callback" for uc_order_product entity.
- *
- * Saves a product to an order.
+ * Save a product to an order.
  */
 function uc_order_product_save($order_id, $product) {
-  // Product kits, particularly, shouldn't actually be added to an order,
-  // but instead they cause other products to be added.
-  if (isset($product->skip_save) && $product->skip_save == TRUE) {
-    return;
-  }
-
-  // Update if there is an order_product_id, insert if there isn't.
-  $key = empty($product->order_product_id) ? array() : 'order_product_id';
-  // @TODO order_id should be in the object by this point.
   $product->order_id = $order_id;
-  if (empty($product->weight_units)) {
-    if (empty($product->nid)) {
-      $product->weight_units = variable_get('uc_weight_unit', 'lb');
-    }
-    else {
-      $units = db_query("SELECT weight_units FROM {node} n JOIN {uc_products} p ON n.vid = p.vid WHERE n.nid = :nid", array(':nid' => $product->nid))->fetchField();
-      $product->weight_units = empty($units) ? variable_get('uc_weight_unit', 'lb') : $units;
-    }
-  }
-  return drupal_write_record('uc_order_products', $product, $key);
+  return entity_save('uc_order_product', $product);
 }
 
 /**
@@ -1037,20 +1049,90 @@ function uc_order_product_entity_save($product) {
 }
 
 /**
- * Entity API "deletion callback" for uc_order_product entity.
+ * Remove a single product line from an order.
  *
- * Removes a product from an order.
+ * @param integer $order_product_id
+ *   Ordered product ID of product to remove.
  */
 function uc_order_product_delete($order_product_id) {
-  // Allow other modules to take action before the product is removed
-  // from the order.  If the hook is involved after the item is deleted
-  // from {uc_order_products} then $order_product_id will be pointing to
-  // the deleted row, and will be useless.
-  module_invoke_all('uc_order_product_delete', $order_product_id);
-
-  db_delete('uc_order_products')
-    ->condition('order_product_id', $order_product_id)
-    ->execute();
+  return uc_order_product_delete_multiple(array($order_product_id));
+}
+
+/**
+ * Remove multiple product lines from an order.
+ *
+ * @param array $order_product_ids
+ *   List of ordered product IDs of products to remove.
+ */
+function uc_order_product_delete_multiple($order_product_ids) {
+  return entity_delete_multiple('uc_order_product', $order_product_ids);
+}
+
+/**
+ * Load a single ordered product entity.
+ *
+ * @param integer $opid
+ *   The ID of the ordered product entity.
+ * @param boolean $reset
+ *   Whether to reset the internal cache for ordered product IDs. Defaults to
+ *   FALSE.
+ *
+ * @return object
+ *   The ordered product entity matching $opid.
+ */
+function uc_order_product_load($opid, $reset = FALSE) {
+  $products = uc_order_product_load_multiple(array($opid), $reset);
+  return reset($products);
+}
+
+/**
+ * Load multiple ordered product entities.
+ *
+ * @param array $opids
+ *   Array of ordered product IDs of products to load.  Default is the empty
+ *   array, which loads all ordered products.
+ * @param boolean $reset
+ *   Whether to reset the internal cache for ordered product IDs. Defaults to
+ *   FALSE.
+ *
+ * @return array
+ *   An array of ordered product entities matching $opids, indexed by
+ *   ID.
+ */
+function uc_order_product_load_multiple($opids = array(), $reset = FALSE) {
+  return entity_load('uc_order_product', $opids, array(), $reset);
+}
+
+/**
+ * Generate an array for rendering the multiple order products.
+ *
+ * Order products being viewed are generally expected to be fully-loaded entity
+ * objects, thus have their name or id key set. However, it is possible to
+ * view a single entity without any id, e.g. for generating a preview during
+ * creation.
+ *
+ * @param array $order_products
+ *   The array of order product to render.
+ * @param $view_mode
+ *    A view mode as used by this entity type, e.g. 'full', 'teaser'...
+ * @param $langcode
+ *   (optional) A language code to use for rendering. Defaults to the global
+ *   content language of the current request.
+ * @param $page
+ *   (optional) If set will control if the entity is rendered: if TRUE
+ *   the entity will be rendered without its title, so that it can be embeded
+ *   in another context. If FALSE the entity will be displayed with its title
+ *   in a mode suitable for lists.
+ *   If unset, the page mode will be enabled if the current path is the URI
+ *   of the entity, as returned by entity_uri().
+ *
+ * @return
+ *   The renderable array, keyed by the entity type and by entity identifiers,
+ *   for which the entity name is used if existing - see entity_id(). If there
+ *   is no information on how to view an entity, FALSE is returned.
+ */
+function uc_order_product_view_multiple($order_products, $view_mode = 'full', $langcode = NULL, $page = NULL) {
+  return entity_view('uc_order_product', $order_products, $view_mode, $langcode, $page);
 }
 
 /**
@@ -1665,7 +1747,7 @@ function template_preprocess_uc_order(&$variables) {
   $variables['shippable'] = uc_order_is_shippable($order);
 
   $variables['products'] = $order->products;
-  $display = entity_view('uc_order_product', $order->products);
+  $display = uc_order_product_view_multiple($order->products);
   foreach ($variables['products'] as &$product) {
     $product->total_price = render($display['uc_order_product'][$product->order_product_id]['total']);
     if ($product->qty > 1) {
diff --git a/uc_order/uc_order.order_pane.inc b/uc_order/uc_order.order_pane.inc
index 6a6b8b4..5049152 100644
--- a/uc_order/uc_order.order_pane.inc
+++ b/uc_order/uc_order.order_pane.inc
@@ -533,7 +533,7 @@ function uc_order_edit_products_add_blank($form, &$form_state) {
   $product = new stdClass();
   $product->qty = 1;
   $product->order_id = $order->order_id;
-  drupal_write_record('uc_order_products', $product);
+  uc_order_product_save($order->order_id, $product);
 
   $order->products[] = $product;
 
@@ -576,6 +576,12 @@ function uc_order_edit_products_remove($form, &$form_state) {
 
   $order_product_id = intval($form_state['triggering_element']['#return_value']);
 
+  if (module_exists('uc_stock')) {
+    // Replace stock immediately.
+    $product = uc_order_product_load($order_product_id);
+    uc_stock_adjust($product->model, $product->qty);
+  }
+
   uc_order_product_delete($order_product_id);
 
   $order = $form_state['build_info']['args'][0];
@@ -1026,8 +1032,6 @@ function uc_order_view_update_form_submit($form, &$form_state) {
 
 /**
  * Builds the order view products table.
- *
- * !FIXME Refactor to use uc_order_product_view.
  */
 function uc_op_products_view_table($order) {
   $table = array(
@@ -1081,7 +1085,7 @@ function uc_op_products_view_table($order) {
   );
 
   if (!empty($order->products)) {
-    $build = entity_view('uc_order_product', $order->products);
+    $build = uc_order_product_view_multiple($order->products);
     $table['#rows'] = $build['uc_order_product'];
   }
   else {
@@ -1096,8 +1100,6 @@ function uc_op_products_view_table($order) {
 
 /**
  * Builds the order customer's view products table.
- *
- * !FIXME Refactor to use uc_order_product_view.
  */
 function uc_op_products_customer_table($order) {
   $table = array(
@@ -1151,7 +1153,7 @@ function uc_op_products_customer_table($order) {
   );
 
   if (!empty($order->products)) {
-    $build = entity_view('uc_order_product', $order->products);
+    $build = uc_order_product_view_multiple($order->products);
     $table['#rows'] = $build['uc_order_product'];
   }
   else {
diff --git a/uc_order/views/uc_order.views.inc b/uc_order/views/uc_order.views.inc
index 801f45e..e946c5d 100644
--- a/uc_order/views/uc_order.views.inc
+++ b/uc_order/views/uc_order.views.inc
@@ -378,6 +378,17 @@ function uc_order_views_data() {
   }
 
   // Ordered products.
+  // Get the standard EntityAPI Views data table.
+  $data['uc_order_products'] =  entity_views_table_definition('uc_order_product');
+  // Remove undesirable fields
+  foreach(array('data') as $bad_field) {
+    if (isset($data['uc_order_products'][$bad_field])) {
+      unset($data['uc_order_products'][$bad_field]);
+    }
+  }
+  // Fix incomplete fields
+  $data['uc_order_products']['weight_units']['title'] = t('Weight units');
+
   $data['uc_order_products']['table']['group'] = t('Ordered product');
   $data['uc_order_products']['table']['base'] = array(
     'field' => 'order_product_id',
diff --git a/uc_product_kit/uc_product_kit.module b/uc_product_kit/uc_product_kit.module
index 3e81f69..ebf8a14 100644
--- a/uc_product_kit/uc_product_kit.module
+++ b/uc_product_kit/uc_product_kit.module
@@ -1104,11 +1104,13 @@ function uc_product_kit_uc_cart_display($item) {
       );
     }
 
+    // Build the kit item product variant.
     if (!isset($item->type)) {
       $node = node_load($item->nid);
       $item->type = $node->type;
     }
     $build = node_view($item);
+
     $elements[$unique_id]['#total'] += $build['display_price']['#value'] * $item->qty;
     $elements[$unique_id]['#suffixes'] += $build['display_price']['#suffixes'];
     $elements[$unique_id]['data'][$item->nid] = $item;
diff --git a/uc_stock/uc_stock.module b/uc_stock/uc_stock.module
index 10c872f..a18b21d 100644
--- a/uc_stock/uc_stock.module
+++ b/uc_stock/uc_stock.module
@@ -139,15 +139,6 @@ function uc_stock_uc_message() {
 }
 
 /**
- * Implements hook_uc_order_product_delete().
- */
-function uc_stock_uc_order_product_delete($order_product_id) {
-  // Put back the stock.
-  $product = db_query("SELECT model, qty FROM {uc_order_products} WHERE order_product_id = :id", array(':id' => $order_product_id))->fetchObject();
-  uc_stock_adjust($product->model, $product->qty);
-}
-
-/**
  * Adjusts the product stock level by a set amount.
  *
  * @param $sku
diff --git a/uc_taxes/uc_taxes.module b/uc_taxes/uc_taxes.module
index 26bce88..bb20336 100644
--- a/uc_taxes/uc_taxes.module
+++ b/uc_taxes/uc_taxes.module
@@ -119,28 +119,28 @@ function uc_taxes_entity_view_alter(&$build, $entity_type) {
       break;
 
     case 'uc_cart_item':
-    case 'uc_order_product':
       list($amount, $suffixes) = uc_taxes_get_included_tax($build['#entity'], isset($build['#entity']->order) ? $build['#entity']->order : NULL);
-      if ($build['#view_mode'] == 'cart') {
-        if (!empty($build['#total'])) {
-          if (!empty($amount) && !empty($build['#total'])) {
-            $build['#total'] += $amount * $build['qty']['#default_value'];
-          }
-          if (!empty($suffixes)) {
-            if (empty($build['#suffixes'])) {
-              $build['#suffixes'] = array();
-            }
-            $build['#suffixes'] += $suffixes;
-          }
-        }
+
+      if (!empty($amount) && !empty($build['#total'])) {
+        $build['#total'] += $amount * $build['qty']['#default_value'];
       }
-      else {
-        $build['price']['#price'] += $amount;
-        $build['total']['#price'] += $amount * $build['#entity']->qty;
-        $build['price']['#suffixes'] += $suffixes;
-        $build['total']['#suffixes'] += $suffixes;
+
+      if (!empty($suffixes)) {
+        if (empty($build['#suffixes'])) {
+          $build['#suffixes'] = array();
+        }
+        $build['#suffixes'] += $suffixes;
       }
       break;
+
+    case 'uc_order_product':
+      list($amount, $suffixes) = uc_taxes_get_included_tax($build['#entity'], isset($build['#entity']->order) ? $build['#entity']->order : NULL);
+
+      $build['price']['#price'] += $amount;
+      $build['total']['#price'] += $amount * $build['#entity']->qty;
+      $build['price']['#suffixes'] += $suffixes;
+      $build['total']['#suffixes'] += $suffixes;
+      break;
   }
 }
 
