diff --git a/uc_attribute/uc_attribute.module b/uc_attribute/uc_attribute.module
index b8bc6c9..f667fc8 100644
--- a/uc_attribute/uc_attribute.module
+++ b/uc_attribute/uc_attribute.module
@@ -517,9 +517,9 @@ function uc_attribute_uc_cart_item($op, $item) {
       foreach ($options as $option) {
         $item->cost += $option['cost'];
         $item->price += $option['price'];
-        $item->display_price += $option['price'];
         $item->weight += $option['weight'];
       }
+      $item->display_price = reset(uc_product_get_display_price($item->price, node_load($item->nid)));
 
       $combination = array();
       foreach ((array)$item->data['attributes'] as $aid => $value) {
@@ -734,7 +734,6 @@ function uc_attribute_load($aid, $id = NULL, $type = '') {
       $attribute->options[$option->oid] = $option;
     }
   }
-
   return $attribute;
 }
 
@@ -1196,7 +1195,6 @@ function _uc_cart_product_get_options($item) {
   $options = array();
   $data = $item->data;
   $node = node_load($item->nid);
-
   $index = 0;
   if (!empty($data['attributes']) && is_array($data['attributes'])) {
     foreach ($data['attributes'] as $aid => $selected) {
@@ -1263,14 +1261,16 @@ function _uc_attribute_alter_form($product) {
     // Build the attribute's options array.
     $options = array();
     foreach ($attribute->options as $option) {
+      $total_price = in_array($attribute->aid, $priced_attributes) ? reset(uc_product_get_display_price($product->sell_price + $option->price, $product)) : FALSE;
       switch (variable_get('uc_attribute_option_price_format', 'adjustment')) {
         case 'total':
-          $display_price = in_array($attribute->aid, $priced_attributes) ? ', ' . uc_currency_format($product->sell_price + $option->price) : '';
+          $display_price = $total_price !== FALSE ? ', ' . uc_currency_format($total_price) : '';
           if (count($priced_attributes) == 1 && $attribute->display != 3) {
             break;
           }
         case 'adjustment':
-          $display_price = ($option->price != 0 ? ', ' . ($option->price > 0 ? '+' : '') . uc_currency_format($option->price) : '');
+          $option_price = $total_price !== FALSE ? $total_price - $product->display_price : 0;
+          $display_price = ($option_price != 0 ? ', ' . ($option_price > 0 ? '+' : '') . uc_currency_format($option_price) : '');
           break;
         case 'none':
         default:
diff --git a/uc_product/uc_product.module b/uc_product/uc_product.module
index 40f2955..abf229f 100644
--- a/uc_product/uc_product.module
+++ b/uc_product/uc_product.module
@@ -639,8 +639,9 @@ function uc_product_load($nodes) {
     foreach ($node as $field => $value) {
       $nodes[$node->nid]->$field = $value;
     }
-    $nodes[$node->nid]->display_price = $node->sell_price;
-    $nodes[$node->nid]->display_price_suffix = '';
+    list($amount, $suffixes) = uc_product_get_display_price($node->sell_price, $nodes[$node->nid]);
+    $nodes[$node->nid]->display_price = $amount;
+    $nodes[$node->nid]->display_price_suffix = implode(' ', $suffixes);
   }
 }
 
@@ -1642,6 +1643,29 @@ function uc_product_get_description($product) {
 }
 
 /**
+ * Adjusts the specified price for display in the context of a given product.
+ *
+ * @param $price
+ *   The price to adjust.
+ * @param $product
+ *   The product which provides the context for the adjustment.
+ * @return
+ *   An array of the form ($amount, $suffixes), where $amount is the adjusted price,
+ *   and $suffixes is a list of blank delimited suffixes describing the adjustment.
+ */
+function uc_product_get_display_price($price, $product) {
+  $amount = 0;
+  $suffixes = array();
+  foreach (module_implements('uc_product_display_price') as $module) {
+    $func = $module . '_uc_product_display_price';
+    list($this_amount, $these_suffixes) = $func($price, $product);
+    $amount += $this_amount;
+    $suffixes += $these_suffixes;
+  }
+  return array($price + $amount, $suffixes);
+}
+
+/**
  * Load a product class or all classes.
  */
 function uc_product_class_load($class_id = NULL, $reset = FALSE) {
diff --git a/uc_product_kit/uc_product_kit.module b/uc_product_kit/uc_product_kit.module
index 4301831..75695c1 100644
--- a/uc_product_kit/uc_product_kit.module
+++ b/uc_product_kit/uc_product_kit.module
@@ -392,6 +392,20 @@ function uc_product_kit_load($nodes) {
 
   // Add product data to kits.
   uc_product_load($nodes);
+  
+  // Calculate the display price based on the discounted prices of the component products.
+  foreach ($nodes as &$node) {
+    $amount = 0;
+    $suffixes = array();
+    foreach ($node->products as $pid => &$product) {
+      $discount =  ($node->mutable != UC_PRODUCT_KIT_MUTABLE) ? $product->discount : 0;
+      list($this_amount, $these_suffixes) = uc_product_get_display_price($product->sell_price + $discount, $product);
+      $amount += $this_amount * $product->qty;
+      $suffixes += $these_suffixes;
+    }
+    $node->display_price = $amount;
+    $node->display_price_suffix = implode(' ', $suffixes);
+  }
 }
 
 /**
@@ -1066,7 +1080,6 @@ function uc_product_kit_uc_cart_display($item) {
       $element['#total'] = 0;
       $element['#suffix'] = $kit->display_price_suffix;
       $element['#extra'] = array();
-
       $elements[$unique_id] = $element;
     }
     // Add product specific information
@@ -1079,7 +1092,7 @@ function uc_product_kit_uc_cart_display($item) {
       );
     }
 
-    $elements[$unique_id]['#total'] += $item->display_price * $item->qty;
+    $elements[$unique_id]['#total']  += reset(uc_product_get_display_price($item->price, node_load($item->nid))) * $item->qty;
     $elements[$unique_id]['data'][$item->nid] = $item;
     $products[$unique_id][] = $item->nid;
 
diff --git a/uc_taxes/uc_taxes.module b/uc_taxes/uc_taxes.module
index 0dfd7c7..397707f 100644
--- a/uc_taxes/uc_taxes.module
+++ b/uc_taxes/uc_taxes.module
@@ -81,54 +81,6 @@ function uc_taxes_module_implements_alter(&$implementations, $hook) {
   }
 }
 
-/**
- * Implements hook_uc_cart_item().
- *
- * Adds included taxes (VAT) to display price of applicable products.
- */
-function uc_taxes_uc_cart_item($op, $item) {
-  if ($op == 'load') {
-    $product = node_load($item->nid);
-
-    list($amount, $suffixes) = uc_taxes_get_included_tax($product, $item->price);
-
-    $item->display_price += $amount;
-    if (!empty($suffixes)) {
-      $item->display_price_suffix .= implode(' ', $suffixes);
-    }
-  }
-}
-
-/**
- * Implements hook_node_load().
- * Adds included taxes (VAT) to display price of applicable products.
- */
-function uc_taxes_node_load($nodes, $types) {
-  foreach ($nodes as &$node) {
-    if (uc_product_is_product($node)) {
-      $amount = 0;
-      $suffixes = array();
-      if ($node->type == 'product_kit') {
-        // For product kits, the total tax is the sum of the tax on the discounted
-        // prices of component products.
-        foreach ($node->products as $pid => &$product) {
-          $discount =  ($node->mutable != UC_PRODUCT_KIT_MUTABLE) ? $product->discount : 0;
-          list($this_amount, $these_suffixes) = uc_taxes_get_included_tax($product, $product->sell_price + $discount);
-          $amount += $this_amount * $product->qty;
-          $suffixes += $these_suffixes;
-        }
-      }
-      else {
-        list($amount, $suffixes) = uc_taxes_get_included_tax($node);
-      }
-      $node->display_price += $amount;
-      if (!empty($suffixes)) {
-        $node->display_price_suffix .= implode(' ', $suffixes);
-      }
-    }
-  }
-}
-
 /*******************************************************************************
  * Ubercart Hooks
  ******************************************************************************/
@@ -559,10 +511,12 @@ function uc_taxes_apply_tax($order, $tax) {
  * @param $price
  *   If specified, use this value as the tax-base.  Otherwise use the product sell price.
  */
-function uc_taxes_get_included_tax($product, $price = FALSE) {
+function uc_taxes_uc_product_display_price($price, $product) {
+  if (empty($product->type)) {
+    dpm(debug_backtrace());
+  }
   $amount = 0;
   $suffixes = array();
-  $price = ($price === FALSE) ? $product->sell_price : $price;
   foreach (uc_taxes_rate_load() as $tax) {
     if ($tax->display_include && in_array($product->type, $tax->taxed_product_types) && ($tax->shippable == 0 || $product->shippable == 1)) {
       $amount += $price * $tax->rate;
