diff --git a/uc_coupon.admin.inc b/uc_coupon.admin.inc
index 923ec1e..032fc17 100644
--- a/uc_coupon.admin.inc
+++ b/uc_coupon.admin.inc
@@ -449,6 +449,12 @@ function uc_coupon_add_form(&$form_state, $coupon = NULL) {
     '#default_value' => isset($value->data['apply_count']) ? $value->data['apply_count'] : '',
     '#size' => 5,
   );
+  $form['require_match_all'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Require all products to match'),
+    '#default_value' => isset($value->data['require_match_all']) ? TRUE : FALSE,
+    '#description' => t('If checked, the coupon will be rejected if an order contains any non-applicable products as configured below.'),
+  );
 
   $form['use_validity'] = array(
     '#type' => 'checkbox',
@@ -520,7 +526,6 @@ function uc_coupon_add_form(&$form_state, $coupon = NULL) {
     '#description' => t('If checked, only applicable products as configured below will count towards the minimum quantity.'),
   );
   
-  
   $form['product_types'] = array(
     '#type' => 'fieldset',
     '#title' => t('Applicable product classes'),
@@ -864,6 +869,7 @@ function uc_coupon_add_form_submit($form, &$form_state) {
   $coupon->minimum_order = $form_state['values']['minimum_order'] ? $form_state['values']['minimum_order'] : 0;
   $coupon->data['minimum_qty'] = $form_state['values']['minimum_qty'];
   $coupon->data['minimum_qty_restrict'] = $form_state['values']['minimum_qty_restrict'];
+  $coupon->data['require_match_all'] = $form_state['values']['require_match_all'];
   $coupon->max_uses = $form_state['values']['max_uses'] ? $form_state['values']['max_uses'] : 0;
   $coupon->data['max_uses_per_user'] = $form_state['values']['max_uses_per_user'];
   $coupon->data['apply_to'] = $form_state['values']['apply_to'];
diff --git a/uc_coupon.module b/uc_coupon.module
index 8a0d54a..7ecf65f 100644
--- a/uc_coupon.module
+++ b/uc_coupon.module
@@ -676,10 +676,16 @@ function uc_coupon_calculate_discounts($coupon, $order) {
     return array();
   }
   
+  // Ensure that the minimum order quantity restriction is met, if specified.
   if (($coupon->data['minimum_qty_restrict'] ? $matched : $total_qty) < $coupon->data['minimum_qty']) {
     return array();
   }
 
+  // Ensure that all products match, if specified.
+  if (isset($coupon->data['require_match_all']) && $matched < $total_qty) {
+    return array();
+  }
+
   // Slice off applicable products if a limit was set.
   switch ($coupon->data['apply_to']) {
     case 'cheapest':
