diff --git a/modules/cart/commerce_cart.install b/modules/cart/commerce_cart.install
index 649a056..e382f5a 100644
--- a/modules/cart/commerce_cart.install
+++ b/modules/cart/commerce_cart.install
@@ -26,3 +26,57 @@ function commerce_cart_update_7100() {
 
   return t('All eligible product attribute fields have been updated to continue using the attribute selection widget.');
 }
+
+/**
+ * Implements hook_install().
+ */
+function commerce_cart_install() {
+  $field = array(
+    'type' => 'int',
+    'not null' => FALSE,
+    'initial' => time(),
+    'default' => 0,
+  );
+
+  $keys = array('indexes' => array('cart_refreshed' => array('cart_refreshed')));
+  db_add_field('commerce_order', 'cart_refreshed', $field, $keys);
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function commerce_cart_uninstall() {
+  db_drop_field('commerce_order', 'cart_refreshed');
+}
+
+/**
+ * Implements hook_schema_alter() to add a cart_refreshed field to Commerce Orders.
+ */
+function commerce_cart_schema_alter(&$schema) {
+  if (isset($schema['commerce_order'])) {
+    $schema['commerce_order']['fields']['cart_refreshed'] = array(
+      'description' => 'Unix timestamp of when the order was last refreshed as a cart.',
+      'type' => 'int',
+      'not null' => FALSE,
+      'default' => 0,
+    );
+  }
+}
+
+/**
+ * Add the last cart refresh column to the Commerce Order table and initialize to the current time.
+ */
+function commerce_cart_update_7101() {
+  $field = array(
+    'type' => 'int',
+    'not null' => FALSE,
+    'default' => 0,
+    'initial' => time(),
+  );
+
+  $keys = array('indexes' => array('cart_refreshed' => array('cart_refreshed')));
+  db_add_field('commerce_order', 'cart_refreshed', $field, $keys);
+
+  // Need to clear the schema cache so the hook_schema_alter is picked up.
+  cache_clear_all('schema', 'cache', TRUE);
+}
diff --git a/modules/cart/commerce_cart.module b/modules/cart/commerce_cart.module
index d68faa2..9613901 100644
--- a/modules/cart/commerce_cart.module
+++ b/modules/cart/commerce_cart.module
@@ -8,6 +8,10 @@
  * special considerations to associate it with a user and
  */
 
+// Define the cart refresh mode constants.
+define('COMMERCE_CART_REFRESH_ALWAYS', 0);
+define('COMMERCE_CART_REFRESH_OWNER_ONLY', 2);
+define('COMMERCE_CART_REFRESH_ACTIVE_CART_ONLY', 3);
 
 /**
  * Implements hook_menu().
@@ -39,10 +43,34 @@ function commerce_cart_menu() {
     'file' => 'includes/commerce_cart.pages.inc',
   );
 
+  $items['admin/commerce/config/cart'] = array(
+    'title' => 'Cart settings',
+    'description' => 'Customize the cart refresh settings.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('commerce_cart_refresh_settings_form'),
+    'access arguments' => array('administer cart settings'),
+    'type' => MENU_NORMAL_ITEM,
+    'file' => 'includes/commerce_cart.admin.inc',
+  );
+
   return $items;
 }
 
 /**
+ * Implements hook_permission().
+ */
+function commerce_cart_permission() {
+  $permissions = array(
+    'administer cart settings' => array(
+      'title' => t('Administer cart settings'),
+      'description' => t('Customize the cart refresh settings.'),
+    ),
+  );
+
+  return $permissions;
+}
+
+/**
  * Returns the title of the shopping cart menu item with an item count.
  */
 function commerce_cart_menu_item_title() {
@@ -580,6 +608,58 @@ function commerce_cart_block_view($delta) {
 }
 
 /**
+ * Checks if a cart order should have it's contents refreshed.
+ *
+ * @param $order
+ *   The cart order to check if it requires refreshing.
+ *
+ * @return
+ *   Boolean indicating whether or not the cart order can be refreshed.
+ */
+function commerce_cart_can_be_refreshed($order) {
+  // Check if the refresh mode setting doesn't mean the cart should not be refreshed.
+  $check_mode = variable_get('commerce_cart_refresh_mode', COMMERCE_CART_REFRESH_ALWAYS);
+  switch ($check_mode) {
+    case COMMERCE_CART_REFRESH_OWNER_ONLY:
+      // If the order is anonymous, we need to check the session data. Otherwise
+      // we just need to check the owner is the current user.
+      if ($order->uid == 0) {
+        $can_refresh = commerce_cart_order_session_exists($order->order_id);
+      }
+      else {
+        $can_refresh = $order->uid == $GLOBALS['user']->uid;
+      }
+      break;
+
+    case COMMERCE_CART_REFRESH_ACTIVE_CART_ONLY:
+      // We can simlpy check the order id matches the current cart order id
+      // for the current user.
+      $can_refresh = $order->order_id == commerce_cart_order_id($GLOBALS['user']->uid);
+      break;
+
+    case COMMERCE_CART_REFRESH_ALWAYS:
+    default:
+      // Always refresh.
+      $can_refresh = TRUE;
+      break;
+  }
+
+  // Check for the delayed refresh setting
+  $delayed_refresh = variable_get('commerce_cart_refresh_delay', 0);
+
+  // We can refresh this order if there is no delay, the cart has never
+  // been refreshed or if it was refreshed too long ago. Otherwise we can not.
+  if ($delayed_refresh == 0 ||
+    empty($order->cart_refreshed) ||
+    $order->cart_refreshed < (time() - $delayed_refresh)) {
+    return $can_refresh;
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
  * Implements hook_commerce_order_load().
  *
  * Because shopping carts are merely a special case of orders, we work through
@@ -592,13 +672,31 @@ function commerce_cart_commerce_order_load($orders) {
 
   foreach ($orders as $order) {
     // Refresh only if this order object represents the latest revision of a
-    // shopping cart order and it hasn't been refreshed already.
+    // shopping cart order, the settings determine it should be refreshed and
+    // it hasn't been refreshed already.
     if (!isset($refreshed[$order->order_id]) &&
       commerce_cart_order_is_cart($order) &&
-      commerce_order_is_latest_revision($order)) {
+      commerce_order_is_latest_revision($order) &&
+      commerce_cart_can_be_refreshed($order)) {
+      // Update the cart refreshed timestamp, record the changed timestamp
+      // so we can detect if commerce_cart_order_refresh saved the order.
+      $order->cart_refreshed = time();
+      $changed = $order->changed;
+
       // Refresh the order and add its ID to the refreshed array.
       $refreshed[$order->order_id] = TRUE;
-      commerce_cart_order_refresh($order);
+      $order_wrapper = commerce_cart_order_refresh($order);
+
+      // If the changed timestamp hasn't changed, we need to manually
+      // update the cart refreshed timestamp in the database.
+      if ($order_wrapper->changed->value() == $changed) {
+        db_update('commerce_order')
+          ->fields(array(
+            'cart_refreshed' => $order->cart_refreshed,
+          ))
+          ->condition('order_id', $order->order_id)
+          ->execute();
+      }
     }
   }
 }
diff --git a/modules/cart/includes/commerce_cart.admin.inc b/modules/cart/includes/commerce_cart.admin.inc
new file mode 100644
index 0000000..d473e82
--- /dev/null
+++ b/modules/cart/includes/commerce_cart.admin.inc
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Administrative callbacks for the Cart module.
+ */
+
+/**
+ * Build the cart refresh settings form.
+ */
+function commerce_cart_refresh_settings_form($form, &$form_state) {
+  $form['commerce_cart_refresh_mode'] = array(
+    '#title' => t('Cart refresh mode'),
+    '#description' => t("Choose an appropriate mode for checking if a cart's pricing information should be refreshed when loaded."),
+    '#type' => 'radios',
+    '#options' => array(
+      COMMERCE_CART_REFRESH_ALWAYS => t("Always refresh the cart's pricing information, regardless of who owns the cart being loaded."),
+      COMMERCE_CART_REFRESH_OWNER_ONLY => t("Only refresh the cart's pricing information if the cart is owned by the current user."),
+      COMMERCE_CART_REFRESH_ACTIVE_CART_ONLY => t("Only refresh the cart's pricing information if the cart is the current user's active cart."),
+    ),
+    '#default_value' => variable_get('commerce_cart_refresh_mode', COMMERCE_CART_REFRESH_ALWAYS),
+  );
+
+  $form['commerce_cart_refresh_delay'] = array(
+    '#title' => t('Cart refresh delay'),
+    '#description' => t('Choose how long the pricing information on a cart is valid for. Having the pricing information last for longer can improve performance. Use with caution if your pricing can change frequently. Choosing "No delay" will cause the pricing information to be refreshed on every request.'),
+    '#type' => 'select',
+    '#options' => array(0 => t('No delay')) + drupal_map_assoc(array(5, 10, 15, 30, 60, 300, 600, 1800, 3600), 'format_interval'),
+    '#default_value' => variable_get('commerce_cart_refresh_delay', 0),
+  );
+
+  return system_settings_form($form);
+}
