diff --git a/commerce_coupon.module b/commerce_coupon.module
index 9191199..35ebdca 100644
--- a/commerce_coupon.module
+++ b/commerce_coupon.module
@@ -530,11 +530,17 @@ function commerce_coupon_commerce_discount_rule_build($rule, $discount) {
     );
 
     if (isset($map[$discount->type])) {
-      $rule->condition('commerce_coupon_discount_coupon_codes_exist_on_order', array(
-        'commerce_order:select' => $map[$discount->type],
-        'commerce_discount' => $discount->name,
-      )
+      $condition = rules_condition('commerce_coupon_discount_coupon_codes_exist_on_order', array(
+          'commerce_order:select' => $map[$discount->type],
+          'commerce_discount' => $discount->name,
+          // We've already checked that the discount uses coupons etc.
+          'skip_discount_checks' => TRUE,
+        )
       );
+      // Adjust the weight of our added condition so that it is evaluated first.
+      $condition->weight = -50;
+      $rule->condition($condition);
+      $rule->sortChildren(TRUE);
     }
   }
 }
@@ -816,7 +822,12 @@ function commerce_coupon_redeem_coupon_code($code, $order, &$error) {
  * @return mixed
  */
 function commerce_coupon_order_allows_coupons($order) {
-  $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
+  if ($order instanceof EntityMetadataWrapper) {
+    $order_wrapper = $order;
+  }
+  else {
+    $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
+  }
 
   return $order_wrapper->__isset('commerce_coupons');
 }
diff --git a/commerce_coupon.rules.inc b/commerce_coupon.rules.inc
index b518d87..0b2f4b7 100644
--- a/commerce_coupon.rules.inc
+++ b/commerce_coupon.rules.inc
@@ -23,6 +23,12 @@ function commerce_coupon_rules_condition_info() {
         'type' => 'token',
         'options list' => 'commerce_discount_entity_list',
       ),
+      'skip_discount_checks' => array(
+        'type' => 'boolean',
+        'label' => t('Skip checking to see if the discount still exists and uses coupons, should only be set to TRUE by Commerce Coupon module.'),
+        'optional' => TRUE,
+        'default value' => FALSE,
+      ),
     ),
   );
 
@@ -109,19 +115,25 @@ function commerce_coupon_current_user_may_redeem($coupon_wrapper) {
  * Determine whether a coupon code attached to a particular discount has been
  * saved on an order.
  */
-function commerce_coupon_discount_coupon_codes_exist_on_order($order_wrapper, $discount_name) {
-  $discount_wrapper = entity_metadata_wrapper('commerce_discount', $discount_name);
+function commerce_coupon_discount_coupon_codes_exist_on_order($order_wrapper, $discount_name, $skip_discount_checks = FALSE) {
 
   // It is possible for the order to be null. This happens if we are dealing
   // with a dummy line item created just to run pricing rules. In this case we
   // do not let the discount proceed.
-  if (!$order_wrapper->value() || !$discount_wrapper->value() || !commerce_coupon_order_allows_coupons($order_wrapper->value())) {
+  if (!$order_wrapper->value() || !commerce_coupon_order_allows_coupons($order_wrapper)) {
     return FALSE;
   }
 
-  // Determine if this discount uses coupons. If not, this condition passes.
-  if (!$discount_wrapper->coupon_count->value()) {
-    return TRUE;
+  if (!$skip_discount_checks) {
+    $discount_wrapper = entity_metadata_wrapper('commerce_discount', $discount_name);
+    if (!$discount_wrapper->value()) {
+      return FALSE;
+    }
+
+    // Determine if this discount uses coupons. If not, this condition passes.
+    if (!$discount_wrapper->coupon_count->value()) {
+      return TRUE;
+    }
   }
 
   if ($order_wrapper->commerce_coupons->value()) {
@@ -129,6 +141,10 @@ function commerce_coupon_discount_coupon_codes_exist_on_order($order_wrapper, $d
       if (!$coupon_wrapper->value()) {
         continue;
       }
+      // If we've come this far, even if we're skipping discount checks we need a discount_wrapper.
+      if (!isset($discount_wrapper)) {
+        $discount_wrapper = entity_metadata_wrapper('commerce_discount', $discount_name);
+      }
 
       $code = $coupon_wrapper->code->value();
       $discount_id = $discount_wrapper->discount_id->value();
