diff --git a/commerce_coupon.module b/commerce_coupon.module
index 376dad9..52b84ba 100644
--- a/commerce_coupon.module
+++ b/commerce_coupon.module
@@ -522,7 +522,7 @@ function commerce_coupon_commerce_discount_rule_build($rule, $discount) {
   commerce_coupon_cache_coupon_count($discount);
 
   // Determine whether the discount has coupon references.
-  if ($discount_wrapper->coupon_count->value()) {
+  if (isset($discount_wrapper->coupon_count) && $discount_wrapper->coupon_count->value()) {
     // Product level discounts must pass the line item's order.
     $map = array(
       'order_discount' => 'commerce-order',
@@ -773,16 +773,13 @@ function commerce_coupon_redeem_coupon_code($code, $order, &$error) {
 
   if ($coupon) {
     // The same coupon cannot be added twice.
-    $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
-    foreach ($order_wrapper->commerce_coupons as $order_coupon_wrapper) {
-      if ($order_coupon_wrapper->value() && $order_coupon_wrapper->coupon_id->value() == $coupon->coupon_id) {
-        $error = t('The coupon you have entered has already been applied to your order');
-        return;
-      }
+    if (commerce_coupon_order_has_coupon_code($coupon->coupon_id, $order)) {
+      $error = t('The coupon you have entered has already been applied to your order');
+      return;
     }
 
+    $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
     $coupon_wrapper = entity_metadata_wrapper('commerce_coupon', $coupon);
-
     if (commerce_coupon_evaluate_conditions($coupon_wrapper, $order_wrapper)) {
       // Add the coupon to the order.
       $order_wrapper->commerce_coupons[] = $coupon_wrapper->value();
@@ -1203,6 +1200,10 @@ function commerce_coupon_order_has_discount($order, $discount) {
  */
 function commerce_coupon_order_has_coupon_code($code, $order) {
   $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
+  // Return early if there are no coupons.
+  if (!isset($order_wrapper->commerce_coupons) || !$order_wrapper->commerce_coupons->value()) {
+    return FALSE;
+  }
 
   foreach ($order_wrapper->commerce_coupons as $delta => $coupon_wrapper) {
     if (strcasecmp($coupon_wrapper->code->value(), $code) == 0) {
@@ -1293,6 +1294,11 @@ function commerce_coupon_remove_coupon_from_order($order, $coupon, $save = TRUE)
   $original_order = clone $order;
   $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
 
+  // Return early if there are no coupons.
+  if (!isset($order_wrapper->commerce_coupons) || !$order_wrapper->commerce_coupons->value()) {
+    return;
+  }
+
   // Remove the coupons from the order relationship.
   foreach ($order_wrapper->commerce_coupons as $delta => $coupon_wrapper) {
     if ($coupon_wrapper->coupon_id->value() == $coupon->coupon_id) {
@@ -1358,6 +1364,10 @@ function commerce_coupon_rollback_order_transactions($order, $save = FALSE) {
  */
 function commerce_coupon_commerce_cart_order_refresh($order_wrapper) {
   $order = $order_wrapper->value();
+  // Return early if there are no coupons.
+  if (!isset($order_wrapper->commerce_coupons) || !$order_wrapper->commerce_coupons->value()) {
+    return;
+  }
 
   foreach ($order_wrapper->commerce_coupons->value() as $coupon) {
     // Invalidate coupons that exist on the order without their discount
@@ -1423,7 +1433,13 @@ function commerce_coupon_form_commerce_discount_form_alter(&$form, &$form_state)
   // We do not want to show the management tools if there are more than 100
   // coupons attached to this discount.
   $discount_wrapper = entity_metadata_wrapper('commerce_discount', $form_state['commerce_discount']);
-  $coupon_count = isset($form_state['coupons']) ? count($form_state['coupons']) : $discount_wrapper->coupon_count->value();
+  $coupon_count = 0;
+  if (isset($form_state['coupons'])) {
+    $coupon_count = count($form_state['coupons']);
+  }
+  elseif (isset($discount_wrapper->coupon_count)) {
+    $coupon_count = $discount_wrapper->coupon_count->value();
+  }
 
   // Establish a container.
   $form['coupons'] = array(
@@ -1718,9 +1734,12 @@ function commerce_coupon_cache_coupon_count($discount) {
   $discount_wrapper = entity_metadata_wrapper('commerce_discount', $discount);
   cache_clear_all('discount_coupon_count_' . $discount->discount_id, 'cache');
   // Fill cache with new value.
-  $cache = $discount_wrapper->coupon_count->value();
-
-  return $cache;
+  if (isset($discount_wrapper->coupon_count)) {
+    return $discount_wrapper->coupon_count->value();
+  }
+  else {
+    return 0;
+  }
 }
 
 /**
diff --git a/commerce_coupon.rules.inc b/commerce_coupon.rules.inc
index 261b33b..2750ea2 100644
--- a/commerce_coupon.rules.inc
+++ b/commerce_coupon.rules.inc
@@ -119,10 +119,11 @@ function commerce_coupon_discount_coupon_codes_exist_on_order($order_wrapper, $d
     return;
   }
 
+  // Initalize the return value.
+  $has_coupons = FALSE;
   // Determine if this discount uses coupons.
-  $has_coupons = $discount_wrapper->coupon_count->value();
-
-  if ($order_wrapper->commerce_coupons->value()) {
+  $order_has_coupons = isset($order_wrapper->commerce_coupons) && $order_wrapper->commerce_coupons->value();
+  if ($order_has_coupons) {
     // At least one of the coupon codes granting this discount must be 1) active
     // and 2) pass its inline conditions.
     foreach ($order_wrapper->commerce_coupons as $coupon_wrapper) {
diff --git a/modules/usage/commerce_coupon_usage.module b/modules/usage/commerce_coupon_usage.module
index 118f9b6..f14b70d 100644
--- a/modules/usage/commerce_coupon_usage.module
+++ b/modules/usage/commerce_coupon_usage.module
@@ -153,6 +153,11 @@ function commerce_coupon_usage_commerce_coupon_final_checkout_transaction_rollba
  */
 function commerce_coupon_usage_commerce_coupon_final_checkout_validate($form, $form_state, EntityDrupalWrapper $order_wrapper) {
   $transaction_ids = array();
+  // Return early if there are no coupons.
+  if (!isset($order_wrapper->commerce_coupons) || !$order_wrapper->commerce_coupons->value()) {
+    return $transaction_ids;
+  }
+
   foreach ($order_wrapper->commerce_coupons as $coupon_wrapper) {
     // Attempt to use the coupon.
     $usage_id = commerce_coupon_usage_transaction_write($coupon_wrapper->coupon_id->value(), $order_wrapper->order_id->value());
@@ -376,6 +381,10 @@ function theme_commerce_coupon_usage_summary(array $variables) {
  */
 function commerce_coupon_usage_record_usage($order) {
   $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
+  // Return early if there are no coupons.
+  if (!isset($order_wrapper->commerce_coupons) || !$order_wrapper->commerce_coupons->value()) {
+    return $transaction_ids;
+  }
 
   foreach($order_wrapper->commerce_coupons as $coupon_wrapper) {
     if ($coupon_wrapper->value()) {
@@ -394,7 +403,14 @@ function commerce_coupon_usage_commerce_order_update($order) {
   // as completed/pending orders are changed from the order admin UI.
 
   $unchanged = entity_metadata_wrapper('commerce_order', $order->original);
+  $unchanged_has_coupons = isset($unchanged->commerce_coupons) && $unchanged->commerce_coupons->value();
+  $unchanged_coupon_ids = ($unchanged_has_coupons) ? $unchanged->commerce_coupons->raw() : array();
+  $unchanged_coupons = ($unchanged_has_coupons) ? $unchanged->commerce_coupons : array();
+
   $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
+  $order_wrapper_has_coupons = isset($order_wrapper->commerce_coupons) && $order_wrapper->commerce_coupons->value();
+  $order_wrapper_coupon_ids = ($order_wrapper_has_coupons) ? $order_wrapper->commerce_coupons->raw() : array();
+  $order_wrapper_coupons = ($order_wrapper_has_coupons) ? $order_wrapper->commerce_coupons : array();
 
   $statuses = commerce_coupon_usage_tracked_order_statuses();
 
@@ -403,9 +419,9 @@ function commerce_coupon_usage_commerce_order_update($order) {
 
     // Add usage records for coupons present if coupon is present in current but
     // not original or if the original order was in a non-tracked status.
-    foreach ($order_wrapper->commerce_coupons as $coupon_wrapper) {
+    foreach ($order_wrapper_coupons as $coupon_wrapper) {
       $coupon_id = $coupon_wrapper->coupon_id->value();
-      if (!$unchanged->commerce_coupons->value() || !in_array($coupon_id, $unchanged->commerce_coupons->raw()) || !in_array($unchanged->status->value(), $statuses)) {
+      if (!$unchanged_has_coupons || !in_array($coupon_id, $unchanged_coupon_ids) || !in_array($unchanged->status->value(), $statuses)) {
         // Never write a record for the same order and coupon twice.
         if (commerce_coupon_usage_record_exists($order->order_id, $coupon_id)) {
           continue;
@@ -422,9 +438,9 @@ function commerce_coupon_usage_commerce_order_update($order) {
     }
 
     // Remove usage records for coupons absent after update but present before.
-    foreach ($unchanged->commerce_coupons as $coupon_wrapper) {
+    foreach ($unchanged_coupons as $coupon_wrapper) {
       $coupon_id = $coupon_wrapper->coupon_id->value();
-      if (!$order_wrapper->commerce_coupons->value() || !in_array($coupon_id, $order_wrapper->commerce_coupons->raw())) {
+      if (!$order_wrapper_has_coupons || !in_array($coupon_id, $order_wrapper_coupon_ids)) {
         $remove_coupon_ids[] = $coupon_id;
       }
     }
@@ -432,7 +448,7 @@ function commerce_coupon_usage_commerce_order_update($order) {
       commerce_coupon_reset_usage(array($order->order_id), $remove_coupon_ids);
     }
   }
-  else if (in_array($unchanged->status->value(), $statuses)) {
+  elseif (in_array($unchanged->status->value(), $statuses)) {
     // If the order is moving out of a tracked status, reset its usage.
     commerce_coupon_reset_usage(array($unchanged->order_id->value()));
   }
