diff --git a/uc_discounts/uc_discounts.admin.inc b/uc_discounts/uc_discounts.admin.inc
index f5acf80..38c72cb 100644
--- a/uc_discounts/uc_discounts.admin.inc
+++ b/uc_discounts/uc_discounts.admin.inc
@@ -304,12 +304,23 @@ function uc_discounts_form($form_state, $discount_id = 0) {
     $role_ids = get_role_ids_for_discount($discount_id, FALSE);
   }
 
+  $display_string = ($has_role_filter) ? "" : " style='display:none'";
+
+  $role_filter_not = isset($form_state["values"]["role_filter_not"]) ? $form_state["values"]["role_filter_not"] : FALSE;
+
+  $form["qualifications"]["role_filter_not"] = array(
+      "#prefix" => "<div id='discount-role-ids-wrapper'$display_string>",
+      "#title"  => t("Without these roles"),
+      "#type"   => 'checkbox',
+      "#default_value"  => $role_filter_not
+    );
+
   //Create roles form element
   $options = array();
   $result = db_query("SELECT rid, name FROM {role} ORDER BY rid");
   $options[ALL_ROLES] = t("<All Roles>");
   while ($row = db_fetch_object($result)) $options[$row->rid] = $row->name;
-  $display_string = ($has_role_filter) ? "" : " style='display:none'";
+
   $form["qualifications"]["role_ids"] = array(
     "#type" => "select",
     "#title" => t("Roles") . sprintf("<span title='". t("This field is required.") ."' class='form-required'>*</span>"),
@@ -317,7 +328,6 @@ function uc_discounts_form($form_state, $discount_id = 0) {
     "#options" => $options,
     "#default_value" => $role_ids,
     "#multiple" => TRUE,
-    "#prefix" => "<div id='discount-role-ids-wrapper'$display_string>",
     "#suffix" => "</div>",
   );
 
@@ -647,6 +657,7 @@ function uc_discounts_form_submit($form, &$form_state) {
   $discount->requires_code = $form_state['values']['requires_code'];
   $discount->filter_type = $form_state['values']['filter_type'];
   $discount->has_role_filter = $form_state['values']['has_role_filter'];
+  $discount->role_filter_not = $form_state['values']['role_filter_not'];
   $discount->use_only_discounted_products_to_qualify = $form_state['values']['use_only_discounted_products_to_qualify'];
   $discount->requires_single_product_to_qualify = $form_state['values']['requires_single_product_to_qualify'];
   $discount->required_product_type = $form_state['values']['required_product_type'];
diff --git a/uc_discounts/uc_discounts.install b/uc_discounts/uc_discounts.install
index c31deca..d23c847 100644
--- a/uc_discounts/uc_discounts.install
+++ b/uc_discounts/uc_discounts.install
@@ -88,6 +88,13 @@ function uc_discounts_schema() {
         "default" => 0,
         "description" => t("Whether or not this discount filters based on role."),
       ),
+      "role_filter_not" => array(
+          "type"  => "int",
+          "size"  => "tiny",
+          "not null" => TRUE,
+          "default" => 0,
+          "description" => t("Should the role filter be inverted."),
+        ),
       "use_only_discounted_products_to_qualify" => array(
         "type" => "int",
         "size" => "tiny",
@@ -695,3 +702,10 @@ function uc_discounts_update_6006() {
   db_add_field($ret, 'uc_discounts', 'add_to_cart', $schema['uc_discounts']['fields']['add_to_cart']);
   return $ret;
 }
+
+function uc_discounts_update_6007() {
+  $schema = uc_discounts_schema();
+  $ret = array();
+  db_add_field($ret, 'uc_discounts', 'role_filter_not', $schema['uc_discounts']['fields']['role_filter_not']);
+  return $ret;
+}
\ No newline at end of file
diff --git a/uc_discounts/uc_discounts.module b/uc_discounts/uc_discounts.module
index 8ad98e5..bca89f0 100644
--- a/uc_discounts/uc_discounts.module
+++ b/uc_discounts/uc_discounts.module
@@ -1283,7 +1283,12 @@ function get_discounts_for_order($order, &$errors = NULL, &$warnings = NULL, &$m
 
   //Create roles clause
   $auth_rid = ($order->uid != 0) ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID;
-  $roles_clause = sprintf(" OR d.discount_id IN(SELECT dr.discount_id FROM {uc_discounts_roles} dr LEFT JOIN {users_roles} ur ON (dr.role_id=ur.rid AND ur.uid=%d) WHERE ur.uid IS NOT NULL OR dr.role_id=%d OR dr.role_id=%d)",
+  $roles_clause = sprintf(" OR (d.role_filter_not = 0 AND d.discount_id IN(SELECT dr.discount_id FROM {uc_discounts_roles} dr LEFT JOIN {users_roles} ur ON (dr.role_id=ur.rid AND ur.uid=%d) WHERE ur.uid IS NOT NULL OR dr.role_id=%d OR dr.role_id=%d))",
+    $order->uid, ALL_ROLES, $auth_rid
+  );
+
+  // inverse roles clause.
+  $roles_not_clause = sprintf(" OR (d.role_filter_not = 1 AND d.discount_id NOT IN(SELECT dr.discount_id FROM {uc_discounts_roles} dr LEFT JOIN {users_roles} ur ON (dr.role_id=ur.rid AND ur.uid=%d) WHERE ur.uid IS NOT NULL OR dr.role_id=%d OR dr.role_id=%d))",
     $order->uid, ALL_ROLES, $auth_rid
   );
 
@@ -1300,7 +1305,7 @@ function get_discounts_for_order($order, &$errors = NULL, &$warnings = NULL, &$m
       LEFT JOIN {uc_discounts_roles} dr ON d.discount_id=dr.discount_id
       LEFT JOIN {uc_discounts_codes} dc ON d.discount_id=dc.discount_id
       WHERE dc.code IN(%s)
-      AND (d.has_role_filter=0%s)
+      AND (d.has_role_filter=0%s%s)
       AND (%s)
       AND (%s)
       AND (%s)
@@ -1308,9 +1313,10 @@ function get_discounts_for_order($order, &$errors = NULL, &$warnings = NULL, &$m
       AND (%s)
       AND (d.has_expiration<>0 AND d.expiration<=%d)
       AND (d.is_active=%d)
-      ORDER BY weight", $escaped_codes_string, $roles_clause, $product_ids_clause,
+      ORDER BY weight", $escaped_codes_string, $roles_clause, $roles_not_clause, $product_ids_clause,
       $term_ids_clause, $skus_clause, $classes_clause, $authors_clause, time(), IS_ACTIVE
     );
+    
     $result = db_query($query);
     while ($discount = db_fetch_object($result)) {
       $warnings[] = t('The discount for code "@code" has expired.',
@@ -1326,7 +1332,7 @@ function get_discounts_for_order($order, &$errors = NULL, &$warnings = NULL, &$m
     LEFT JOIN {uc_discounts_classes} dcl ON d.discount_id=dcl.discount_id AND dcl.grouping = $grouping
     LEFT JOIN {uc_discounts_authors} dau ON d.discount_id=dau.discount_id AND dau.grouping = $grouping
     WHERE (d.requires_code=0%s)
-    AND (d.has_role_filter=0%s)
+    AND (d.has_role_filter=0%s%s)
     AND (%s)
     AND (%s)
     AND (%s)
@@ -1335,10 +1341,10 @@ function get_discounts_for_order($order, &$errors = NULL, &$warnings = NULL, &$m
     AND (d.has_activation=0 OR d.activates_on<%d)
     AND (d.has_expiration=0 OR d.expiration>%d)
     AND (d.is_active=%d)
-    ORDER BY weight", $codes_clause, $roles_clause, $product_ids_clause,
+    ORDER BY weight", $codes_clause, $roles_clause, $roles_not_clause, $product_ids_clause,
     $term_ids_clause, $skus_clause, $classes_clause, $authors_clause, time(), time(), IS_ACTIVE
   );
-  
+
   $result = db_query($query);
   $total_discount_amount = 0;
   $discounts = array();
@@ -1895,7 +1901,12 @@ function get_codeless_discounts_for_product_and_quantity($product, $quantity = N
   //Create roles clause
   global $user;
   $auth_rid = ($user->uid != 0) ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID;
-  $roles_clause = sprintf(" OR d.discount_id IN(SELECT dr.discount_id FROM {uc_discounts_roles} dr" . ", {users_roles} ur WHERE (dr.role_id=ur.rid AND ur.uid=%d) OR dr.role_id=%d OR dr.role_id=%d)",
+  $roles_clause = sprintf(" OR (d.role_filter_not = 0 AND d.discount_id IN(SELECT dr.discount_id FROM {uc_discounts_roles} dr" . ", {users_roles} ur WHERE (dr.role_id=ur.rid AND ur.uid=%d) OR dr.role_id=%d OR dr.role_id=%d))",
+    $user->uid, ALL_ROLES, $auth_rid
+  );
+
+  // inverse roles clause.
+  $roles_not_clause = sprintf(" OR (d.role_filter_not = 1 AND d.discount_id NOT IN(SELECT dr.discount_id FROM {uc_discounts_roles} dr" . ", {users_roles} ur WHERE (dr.role_id=ur.rid AND ur.uid=%d) OR dr.role_id=%d OR dr.role_id=%d))",
     $user->uid, ALL_ROLES, $auth_rid
   );
 
@@ -1931,7 +1942,7 @@ function get_codeless_discounts_for_product_and_quantity($product, $quantity = N
     LEFT JOIN {uc_discounts_classes} dcl ON d.discount_id = dcl.discount_id AND dcl.grouping = $grouping
     LEFT JOIN {uc_discounts_authors} dau ON d.discount_id = dau.discount_id AND dau.grouping = $grouping
     WHERE d.requires_code = 0
-    AND (d.has_role_filter = 0%s)
+    AND (d.has_role_filter = 0%s%s)
     AND (%s)
     AND (%s)
     AND (%s)
@@ -1941,15 +1952,17 @@ function get_codeless_discounts_for_product_and_quantity($product, $quantity = N
     AND (d.has_expiration = 0 OR d.expiration > %d)
     AND (d.is_active = %d)
     ORDER BY d.%s %s",
-    $roles_clause, $product_ids_clause, $term_ids_clause, $skus_clause, $classes_clause, $authors_clause,
+    $roles_clause, $roles_not_clause, $product_ids_clause, $term_ids_clause, $skus_clause, $classes_clause, $authors_clause,
     time(), time(), IS_ACTIVE, $sort_column, $sort_order_string
   );
+
   $result = db_query($query);
 
   $discounts = array();
   while ($discount = db_fetch_object($result)) {
     $discounts[] = $discount;
   }
+
   return $discounts;
 }
 
