diff --git a/contrib/search_api_views/includes/handler_filter_options.inc b/contrib/search_api_views/includes/handler_filter_options.inc
index eda4344..e6f19fb 100644
--- a/contrib/search_api_views/includes/handler_filter_options.inc
+++ b/contrib/search_api_views/includes/handler_filter_options.inc
@@ -17,7 +17,8 @@ class SearchApiViewsHandlerFilterOptions extends SearchApiViewsHandlerFilter {
   public function operator_options() {
     return array(
       '=' => t('Is one of'),
-      '<>' => t('Is not one of'),
+      'all of' => t('Is all of'),
+      '<>' => t('Is none of'),
       'empty' => t('Is empty'),
       'not empty' => t('Is not empty'),
     );
@@ -101,7 +102,6 @@ class SearchApiViewsHandlerFilterOptions extends SearchApiViewsHandlerFilter {
       '#size' => min(4, count($this->definition['options'])),
       '#default_value' => isset($this->value) ? $this->value : array(),
     );
-
     // Hide the value box if operator is 'empty' or 'not empty'.
     // Radios share the same selector so we have to add some dummy selector.
     // #states replace #dependency (http://drupal.org/node/1595022).
@@ -142,14 +142,44 @@ class SearchApiViewsHandlerFilterOptions extends SearchApiViewsHandlerFilter {
     }
     // Choose different kind of ouput for 0, a single and multiple values.
     if (count($this->value) == 0) {
-      return $this->operator == '=' ? t('none') : t('any');
+      switch ($this->operator) {
+        case '=':
+        case 'all of':
+          return t('none');
+
+        case '<>':
+          return t('any');
+      }
     }
     elseif (count($this->value) == 1) {
+      switch ($this->operator) {
+        case '=':
+        case 'all of':
+          $operator = '=';
+          break;
+
+        case '<>':
+          $operator = '<>';
+          break;
+      }
       // If there is only a single value, use just the plain operator, = or <>.
-      $operator = check_plain($this->operator);
+      $operator = check_plain($operator);
       $values = check_plain($this->definition['options'][reset($this->value)]);
     }
     else {
+      switch ($this->operator) {
+        case '=':
+          $operator = 'one of';
+          break;
+
+        case 'all of':
+          $operator = 'all of';
+          break;
+
+        case '<>':
+          $operator = 'not one of';
+          break;
+      }
       foreach ($this->value as $value) {
         if ($values !== '') {
           $values .= ', ';
@@ -180,24 +210,73 @@ class SearchApiViewsHandlerFilterOptions extends SearchApiViewsHandlerFilter {
         $this->value = reset($this->value);
       }
       if (is_scalar($this->value) && $this->value !== '') {
-        $this->query->condition($this->real_field, $this->value, $this->operator, $this->options['group']);
+        switch ($this->operator) {
+          case '=':
+          case 'all of':
+            $operator = '=';
+            break;
+
+          case '<>':
+            $operator = '<>';
+            break;
+        }
+        $this->query->condition($this->real_field, $this->value, $operator, $this->options['group']);
       }
-      elseif ($this->value) {
-        if ($this->operator == '=') {
-          $filter = $this->query->createFilter('OR');
+      else {
+        // if empty array then we want all the values.
+        if (is_array($this->value) && count($this->value) === 0) {
+          switch ($this->operator) {
+            // None ('=' nothing or 'all of' nothing).
+            case '=':
+            case 'all of':
+              $operator = '<>';
+              $conjunction = 'AND';
+              break;
+
+            // Any ('<>' nothing).
+            case '<>':
+              // Save a bit of processing if the value can be anything
+              // by discarding the filter.
+              return;
+          }
+
+          // Get all the possible values.
+          if (!empty($this->options['expose']['reduce']) && !empty($this->options['exposed'])) {
+            $this->value = array_keys($this->reduce_value_options());
+          }
+          else {
+            $this->value = array_keys($this->definition['options']);
+          }
+        }
+        else {
+          switch ($this->operator) {
+            case '=':
+              $operator = '=';
+              $conjunction = 'OR';
+              break;
+
+            case 'all of':
+              $operator = '=';
+              $conjunction = 'AND';
+              break;
+
+            case '<>':
+              $operator = '<>';
+              $conjunction = 'AND';
+              break;
+          }
+        }
+
+        if ($this->value) {
+          $filter = $this->query->createFilter($conjunction);
           // $filter will be NULL if there were errors in the query.
           if ($filter) {
             foreach ($this->value as $v) {
-              $filter->condition($this->real_field, $v, '=');
+              $filter->condition($this->real_field, $v, $operator);
             }
             $this->query->filter($filter, $this->options['group']);
           }
         }
-        else {
-          foreach ($this->value as $v) {
-            $this->query->condition($this->real_field, $v, $this->operator, $this->options['group']);
-          }
-        }
       }
     }
   }
