diff --git a/facetapi.admin.inc b/facetapi.admin.inc
index 0d08dbd..6324e79 100644
--- a/facetapi.admin.inc
+++ b/facetapi.admin.inc
@@ -330,10 +330,11 @@ function facetapi_get_widgets(array $realm, array $facet) {
       'requirements' => array(
         'facetapi_requirement_realm_property' => array('element type' => 'links')
       ),
+      'requirements_operator' => 'AND',
     );
 
     // Checks requirements, only saves widgets that pass all requirements.
-    if (facetapi_check_requirements($plugin['handler']['requirements'], $realm, $facet)) {
+    if (facetapi_check_requirements($plugin['handler']['requirements'], $realm, $facet, $plugin['handler']['requirements_operator'])) {
       $plugins[$id] = $plugin;
     }
   }
@@ -728,6 +729,7 @@ function theme_facetapi_sort_settings_table($variables) {
  * Form validation handler for facetapi_facet_display_form().
  */
 function facetapi_facet_display_form_validate($form, &$form_state) {
+  ctools_include('plugins');
   // Gets the selected query type and widget.
   $query_type = $form_state['values']['global']['query_type'];
   $widget_name = $form_state['values']['widget'];
diff --git a/facetapi.module b/facetapi.module
index 2536291..58bb566 100644
--- a/facetapi.module
+++ b/facetapi.module
@@ -971,11 +971,11 @@ function facetapi_build_realm($searcher, $realm_name) {
  * @return
  *   A boolean flagging whether all requirements were passed.
  */
-function facetapi_check_requirements(array $requirements, array $realm, array $facet) {
+function facetapi_check_requirements(array $requirements, array $realm, array $facet, $operator = 'AND') {
   $return = TRUE;
   module_load_include('inc', 'facetapi', 'facetapi.requirements');
   foreach ($requirements as $callback => $options) {
-    if (!call_user_func($callback, $realm, $facet, $options)) {
+    if (!call_user_func($callback, $realm, $facet, $options, $operator)) {
       $return = FALSE;
       break;
     }
diff --git a/facetapi.requirements.inc b/facetapi.requirements.inc
index 79cf63b..ea8bbe0 100644
--- a/facetapi.requirements.inc
+++ b/facetapi.requirements.inc
@@ -18,8 +18,8 @@
  * @return
  *   TRUE if all property values are equal, FALSE otherwise.
  */
-function facetapi_requirement_realm_property(array $realm, array $facet, array $options) {
-  return facetapi_requirement_property($realm, $options);
+function facetapi_requirement_realm_property(array $realm, array $facet, array $options, $operator = 'AND') {
+  return facetapi_requirement_property($realm, $options, $operator);
 }
 
 /**
@@ -35,8 +35,8 @@ function facetapi_requirement_realm_property(array $realm, array $facet, array $
  * @return
  *   TRUE if all property values are equal, FALSE otherwise.
  */
-function facetapi_requirement_facet_property(array $realm, array $facet, array $options) {
-  return facetapi_requirement_property($facet, $options);
+function facetapi_requirement_facet_property(array $realm, array $facet, array $options, $operator = 'AND') {
+  return facetapi_requirement_property($facet, $options, $operator);
 }
 
 /**
@@ -50,18 +50,39 @@ function facetapi_requirement_facet_property(array $realm, array $facet, array $
  * @return
  *   TRUE if all property values are equal, FALSE otherwise.
  */
-function facetapi_requirement_property(array $definition, array $options) {
+function facetapi_requirement_property(array $definition, array $options, $operator) {
   $passed = TRUE;
+
   foreach ($options as $key => $requirement) {
     $condition = $definition[$key];
-    if (is_array($requirement)) {
+
+    // we always expect an array
+    if (!is_array($requirement)) {
+      $requirement = array($requirement);
+    }
+    // we always expect an array
+    if (!is_array($condition)) {
+      $condition = array($condition);
+    }
+
+    // if the keys are numeric, map assoc them so intersect works
+    if (is_int(key($requirement))) {
+      $requirement = drupal_map_assoc($requirement);
+    }
+    // if the keys are numeric, map assoc them so intersect works
+    if (is_int(key($condition))) {
+      $condition = drupal_map_assoc($condition);
+    }
+
+    // Check if it is either an AND or OR operation and act accordingly
+    if ($operator == 'AND') {
       if (array_intersect_key($condition, $requirement) != $requirement) {
         $passed = FALSE;
         break;
       }
     }
-    else {
-      if ($requirement != $condition) {
+    elseif ($operator == 'OR') {
+      if (!array_intersect_key($condition, $requirement)) {
         $passed = FALSE;
         break;
       }
