=== modified file 'uc_cart/uc_cart.module'
--- uc_cart/uc_cart.module	2009-04-01 16:39:58 +0000
+++ uc_cart/uc_cart.module	2009-04-11 17:43:59 +0000
@@ -459,7 +459,7 @@
               }
 
               $item_count += $item->qty;
-              $total += $item->price * $item->qty;
+              $total += $display_item['#total'];
             }
           }
 
@@ -660,12 +660,16 @@
     $output = '<table class="cart-block-items"><tbody>';
     $row_class = 'odd';
 
+    $context = array(
+      'location' => 'cart-block-item',
+    );
+
     // Loop through each item.
     foreach ($items as $item) {
       // Add the basic row with quantity, title, and price.
       $output .= '<tr class="'. $row_class .'"><td class="cart-block-item-qty">'. $item['qty'] .'</td>'
                 .'<td class="cart-block-item-title">'. $item['title'] .'</td>'
-                .'<td class="cart-block-item-price">'. uc_currency_format($item['price']) .'</td></tr>';
+                .'<td class="cart-block-item-price">'. uc_price($item['price'], $context) .'</td></tr>';
 
       // Add a row of description if necessary.
       if ($item['desc']) {
@@ -704,7 +708,7 @@
   $output = '<table class="cart-block-summary"><tbody><tr>'
            .'<td class="cart-block-summary-items">'. $item_text .'</td>'
            .'<td class="cart-block-summary-total"><label>'. t('Total:')
-           .'</label> '. uc_currency_format($total) .'</td></tr>';
+           .'</label> '. uc_price($total, array('location' => 'cart-block-total')) .'</td></tr>';
 
   // If there are products in the cart...
   if ($item_count > 0) {
@@ -875,8 +879,12 @@
           '#value' => '',
         );
       }
+
+      $context = array(
+        'location' => 'cart-subtotal',
+      );
       $form['items'][$i]['total'] = array(
-        '#value' => $display_item['#total'],
+        '#value' => uc_price($display_item['#total'], $context),
         '#theme' => 'uc_cart_view_price',
       );
       $i++;
@@ -992,7 +1000,7 @@
 }
 
 function theme_uc_cart_view_price($form) {
-  return uc_currency_format($form['#value']);
+  return $form['#value'];
 }
 
 function uc_cart_view_table($table) {

=== modified file 'uc_cart/uc_cart.pages.inc'
--- uc_cart/uc_cart.pages.inc	2009-02-27 16:06:16 +0000
+++ uc_cart/uc_cart.pages.inc	2009-04-11 18:38:40 +0000
@@ -191,9 +191,29 @@
   }
   unset($_SESSION['expanded_panes']);
 
+  $context = array(
+    'location' => 'cart-checkout-item',
+  );
+  $contents = uc_cart_get_contents();
+  foreach ($contents as $key => $item) {
+    $price_info = array(
+      'price' => $item->price,
+      'qty' => $item->qty,
+    );
+    $context['subject'] = array(
+      'cart_item' => $item,
+      'node' => node_load($item->nid),
+    );
+
+    // Get the altered price per unit, as ordered products have a locked-in
+    // price. Price altering rules may change over time, but the amount paid
+    // by the customer does not after the fact.
+    $contents[$key]->price = uc_price($price_info, $context, array(), 'altered') / $item->qty;
+  }
+
   $form['cart_contents'] = array(
     '#type' => 'hidden',
-    '#value' => serialize(uc_cart_get_contents()),
+    '#value' => serialize($contents),
   );
 
   $form['cancel'] = array(

=== modified file 'uc_cart/uc_cart_checkout_pane.inc'
--- uc_cart/uc_cart_checkout_pane.inc	2008-12-31 13:50:42 +0000
+++ uc_cart/uc_cart_checkout_pane.inc	2009-04-11 18:05:09 +0000
@@ -27,13 +27,26 @@
     case 'review':
       $items = uc_cart_get_contents();
       $output = '<table>';
+      $context = array(
+        'location' => 'cart-review-item',
+        'subject' => array(),
+      );
       foreach ($items as $item) {
         $desc = check_plain($item->title);
         foreach (module_implements('cart_item_description') as $module) {
           $desc .= module_invoke($module, 'cart_item_description', $item);
         }
+
+        $price_info = array(
+          'price' => $item->price,
+          'qty' => $item->qty,
+        );
+        $context['subject'] = array(
+          'cart_item' => $item,
+          'node' => node_load($item->nid),
+        );
         $output .= '<tr valign="top"><td>'. $item->qty .'x</td><td width="100%">'. $desc
-                  .'</td><td nowrap="nowrap">'. uc_currency_format($item->price * $item->qty) .'</td></tr>';
+                  .'</td><td nowrap="nowrap">'. uc_price($price_info, $context) .'</td></tr>';
       }
       $output .= '</table>';
       $review[] = $output;
@@ -557,9 +570,22 @@
     array('data' => t('Price'), 'class' => 'price'),
   );
 
+  $context = array(
+    'location' => 'cart-checkout-item',
+  );
+
   // Set up table rows.
   foreach (uc_cart_get_contents() as $item) {
-    $total = ($item->qty) ? $item->qty * $item->price : $item->price;
+    $price_info = array(
+      'price' => $item->price,
+      'qty' => $item->qty,
+    );
+    $context['subject'] = array(
+      'cart_item' => $item,
+      'node' => node_load($item->nid),
+    );
+
+    $total = uc_price($price_info, $context, array(), 'altered');
     $subtotal += $total;
 
     $description = check_plain($item->title);
@@ -567,17 +593,22 @@
       $description .= module_invoke($module, 'cart_item_description', $item);
     }
 
+    // Remove node from context to prevent the price from being altered.
+    unset($context['subject']);
     $rows[] = array(
       array('data' => t('@qtyx', array('@qty' => $item->qty)), 'class' => 'qty'),
       array('data' => $description, 'class' => 'products'),
-      array('data' => check_plain(uc_currency_format($total)), 'class' => 'price'),
+      array('data' => uc_price($total, $context), 'class' => 'price'),
     );
   }
 
   // Add the subtotal as the final row.
   if ($show_subtotal) {
+    $context = array(
+      'location' => 'cart-checkout-subtotal',
+    );
     $rows[] = array(
-      'data' => array(array('data' => '<span id="subtotal-title">' . t('Subtotal:') . '</span> ' . check_plain(uc_currency_format($subtotal)), 'colspan' => 4, 'class' => 'subtotal')),
+      'data' => array(array('data' => '<span id="subtotal-title">' . t('Subtotal:') . '</span> ' . uc_price($subtotal, $context), 'colspan' => 4, 'class' => 'subtotal')),
       'class' => 'subtotal',
     );
   }

=== modified file 'uc_order/uc_order.line_item.inc'
--- uc_order/uc_order.line_item.inc	2009-02-27 15:32:25 +0000
+++ uc_order/uc_order.line_item.inc	2009-04-11 18:53:47 +0000
@@ -24,9 +24,20 @@
       );
       return $lines;
     case 'cart-preview':
+      $context = array(
+        'location' => 'cart-preview-subtotal-item',
+      );
       $subtotal = 0;
       foreach ($arg1 as $item) {
-        $total = ($item->qty) ? $item->qty * $item->price : $item->price;
+        $price_info = array(
+          'price' => $item->price,
+          'qty' => ($item->qty) ? $item->qty : 1,
+        );
+        $context['subject'] = array(
+          'cart_item' => $item,
+          'node' => node_load($item->nid),
+        );
+        $total = uc_price($price_info, $context, array(), 'altered');
         $subtotal += $total;
       }
       if (module_exists('uc_payment') && variable_get('uc_pane_payment_enabled', TRUE)) {

=== modified file 'uc_product/uc_product.css'
--- uc_product/uc_product.css	2009-01-07 15:08:16 +0000
+++ uc_product/uc_product.css	2009-04-09 16:55:50 +0000
@@ -9,6 +9,17 @@
   margin-left: 4px;
 }
 
+.uc-price-display {
+  float: right;
+  clear: right;
+  width: 100px;
+  text-align: center;
+  font-size: 1.3em;
+  font-weight: bold;
+  padding-bottom: 4px;
+  padding-left: 4px;
+}
+
 .display-price {
   float: right;
   clear: right;

=== modified file 'uc_product/uc_product.module'
--- uc_product/uc_product.module	2009-04-07 18:50:58 +0000
+++ uc_product/uc_product.module	2009-04-11 18:05:07 +0000
@@ -695,27 +695,44 @@
     'add_to_cart' => 10,
   ));
 
+  $context = array(
+    'location' => 'product-view',
+    'class' => array(
+      'product',
+    ),
+    'subject' => array(
+      'node' => $node,
+    ),
+  );
+
   if (module_exists('imagecache') && ($field = variable_get('uc_image_'. $node->type, '')) && isset($node->$field) && file_exists($node->{$field}[0]['filepath'])) {
     $node->content['image'] = array('#value' => theme('uc_product_image', $node->$field, $teaser, $page),
       '#access' => $enabled['image'],
       '#weight' => $weight['image'],
     );
   }
-  $node->content['display_price'] = array('#value' => theme('uc_product_price', $node->sell_price, 'display-price', TRUE),
+
+  $context['class'][1] = 'display';
+  $node->content['display_price'] = array('#value' => uc_price($node->sell_price, $context),
     '#access' => $enabled['display_price'],
     '#weight' => $weight['display_price'],
   );
+
   if (!$teaser) {
     $node->content['model'] = array('#value' => theme('uc_product_model', $node->model, $teaser, $page),
       '#access' => $enabled['model'],
       '#weight' => $weight['model'],
     );
     $node->content['body']['#weight'] = 1;
-    $node->content['list_price'] = array('#value' => theme('uc_product_price', $node->list_price, 'list-price'),
+
+    $context['class'][1] = 'list';
+    $node->content['list_price'] = array('#value' => uc_price($node->list_price, $context),
       '#access' => $enabled['list_price'],
       '#weight' => $weight['list_price'],
     );
-    $node->content['cost'] = array('#value' => theme('uc_product_price', $node->cost, 'cost'),
+
+    $context['class'][1] = 'cost';
+    $node->content['cost'] = array('#value' => uc_price($node->cost, $context),
       '#access' => $enabled['cost'] && user_access('administer products'),
       '#weight' => $weight['cost'],
     );
@@ -724,7 +741,8 @@
     $node->content['#attributes'] = array('style' => 'display: inline');
   }
 
-  $node->content['sell_price'] = array('#value' => theme('uc_product_price', $node->sell_price, 'sell-price', $teaser),
+  $context['class'][1] = 'sell';
+  $node->content['sell_price'] = array('#value' => uc_price($node->sell_price, $context, array('label' => !$teaser)),
     '#access' => $enabled['sell_price'],
     '#weight' => $weight['sell_price'],
   );
@@ -1076,7 +1094,20 @@
   $element['title'] = array(
     '#value' => node_access('view', $node) ? l($item->title, 'node/'. $node->nid) : check_plain($item->title),
   );
-  $element['#total'] = $item->price * $item->qty;
+
+  $context = array(
+    'location' => 'cart-item',
+    'subject' => array(
+      'cart_item' => $item,
+      'node' => $node,
+    ),
+  );
+  $price_info = array(
+    'price' => $item->price,
+    'qty' => $item->qty,
+  );
+
+  $element['#total'] = uc_price($price_info, $context, array(), 'altered');
   $element['data'] = array('#type' => 'hidden', '#value' => serialize($item->data));
   $element['qty'] = array(
     '#type' => 'textfield',

