diff --git a/contrib/search_api_views/includes/handler_filter.inc b/contrib/search_api_views/includes/handler_filter.inc
index 770526a8..841d7bba 100644
--- a/contrib/search_api_views/includes/handler_filter.inc
+++ b/contrib/search_api_views/includes/handler_filter.inc
@@ -32,6 +32,22 @@ class SearchApiViewsHandlerFilter extends views_handler_filter {
   public $query;
 
   /**
+   * Redefine the value option to be able to deal with multiple values.
+   */
+  public function option_definition() {
+    $options = parent::option_definition();
+    $options['value'] = array(
+      'contains' => array(
+        'value' => array('default' => ''),
+        'min' => array('default' => ''),
+        'max' => array('default' => ''),
+      ),
+    );
+
+    return $options;
+  }
+
+  /**
    * Provide a list of options for the operator form.
    */
   public function operator_options() {
@@ -44,37 +60,104 @@ class SearchApiViewsHandlerFilter extends views_handler_filter {
       '>' => t('Is greater than'),
       'empty' => t('Is empty'),
       'not empty' => t('Is not empty'),
+      'between' => t('Is between'),
     );
   }
 
   /**
    * Provide a form for setting the filter value.
+   *
+   * Heavily borrowed from views_handler_filter_numeric
+   *
+   * @see views_handler_filter_numeric::value_form()
    */
   public function value_form(&$form, &$form_state) {
-    while (is_array($this->value) && count($this->value) < 2) {
-      $this->value = $this->value ? reset($this->value) : NULL;
+    $form['value']['#tree'] = TRUE;
+
+    $single_field_operators = $this->operator_options();
+    unset($single_field_operators['empty'], $single_field_operators['not empty'], $single_field_operators['between']);
+
+    // We have to make some choices when creating this as an exposed
+    // filter form. For example, if the operator is locked and thus
+    // not rendered, we can't render dependencies; instead we only
+    // render the form items we need.
+    $which = 'all';
+    if (!empty($form['operator'])) {
+      $source = ($form['operator']['#type'] == 'radios') ? 'radio:options[operator]' : 'edit-options-operator';
+    }
+
+    if (!empty($form_state['exposed'])) {
+      $identifier = $this->options['expose']['identifier'];
+      if (empty($this->options['expose']['use_operator']) || empty($this->options['expose']['operator_id'])) {
+        // Exposed and locked.
+        $which = ($this->operator == 'between') ? 'minmax' : 'value';
+      }
+      else {
+        $source = 'edit-' . drupal_html_id($this->options['expose']['operator_id']);
+      }
     }
-    $form['value'] = array(
-      '#type' => 'textfield',
-      '#title' => empty($form_state['exposed']) ? t('Value') : '',
-      '#size' => 30,
-      '#default_value' => isset($this->value) ? $this->value : '',
-    );
 
     // Hide the value box if the operator is 'empty' or 'not empty'.
     // Radios share the same selector so we have to add some dummy selector.
-    if (empty($form_state['exposed'])) {
-      $form['value']['#states']['visible'] = array(
-        ':input[name="options[operator]"],dummy-empty' => array('!value' => 'empty'),
-        ':input[name="options[operator]"],dummy-not-empty' => array('!value' => 'not empty'),
+    if ($which == 'all') {
+      $form['value']['value'] = array(
+        '#type' => 'textfield',
+        '#title' => empty($form_state['exposed']) ? t('Value') : '',
+        '#size' => 30,
+        '#default_value' => $this->value['value'],
+        '#dependency' => array($source => array_keys($single_field_operators)),
+      );
+      if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier]['value'])) {
+        $form_state['input'][$identifier]['value'] = $this->value['value'];
+      }
+    }
+    elseif ($which == 'value') {
+      // When exposed we drop the value-value and just do value if
+      // the operator is locked.
+      $form['value'] = array(
+        '#type' => 'textfield',
+        '#title' => empty($form_state['exposed']) ? t('Value') : '',
+        '#size' => 30,
+        '#default_value' => isset($this->value['value']) ? $this->value['value'] : '',
       );
+      if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier])) {
+        $form_state['input'][$identifier] = isset($this->value['value']) ? $this->value['value'] : '';
+      }
     }
-    elseif (!empty($this->options['expose']['use_operator'])) {
-      $name = $this->options['expose']['operator_id'];
-      $form['value']['#states']['visible'] = array(
-        ':input[name="' . $name . '"],dummy-empty' => array('!value' => 'empty'),
-        ':input[name="' . $name . '"],dummy-not-empty' => array('!value' => 'not empty'),
+
+    if ($which == 'all' || $which == 'minmax') {
+      $form['value']['min'] = array(
+        '#type' => 'textfield',
+        '#title' => empty($form_state['exposed']) ? t('Min') : '',
+        '#size' => 30,
+        '#default_value' => $this->value['min'],
       );
+      $form['value']['max'] = array(
+        '#type' => 'textfield',
+        '#title' => empty($form_state['exposed']) ? t('And max') : t('And'),
+        '#size' => 30,
+        '#default_value' => $this->value['max'],
+      );
+
+      if ($which == 'all') {
+        $form['value']['min']['#dependency'] = array($source => array('between'));
+        $form['value']['max']['#dependency'] = array($source => array('between'));
+      }
+
+      if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier]['min'])) {
+        $form_state['input'][$identifier]['min'] = $this->value['min'];
+      }
+      if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier]['max'])) {
+        $form_state['input'][$identifier]['max'] = $this->value['max'];
+      }
+
+      if (!isset($form['value']['value'])) {
+        // Ensure there is something in the 'value'.
+        $form['value']['value'] = array(
+          '#type' => 'value',
+          '#value' => NULL,
+        );
+      }
     }
   }
 
@@ -93,7 +176,11 @@ class SearchApiViewsHandlerFilter extends views_handler_filter {
       return t('is not empty');
     }
 
-    return check_plain((string) $this->operator) . ' ' . check_plain((string) $this->value);
+    if ($this->operator === 'between') {
+      return 'is between ' . check_plain((string) $this->value['min']) . ' / ' . check_plain((string) $this->value['max']);
+    }
+
+    return check_plain((string) $this->operator) . ' ' . check_plain((string) $this->value['value']);
   }
 
   /**
@@ -106,6 +193,11 @@ class SearchApiViewsHandlerFilter extends views_handler_filter {
     elseif ($this->operator === 'not empty') {
       $this->query->condition($this->real_field, NULL, '<>', $this->options['group']);
     }
+    elseif ($this->operator === 'between') {
+      if (isset($this->value[0]['min']) && isset($this->value[0]['max']) && $this->value[0]['max'] > 0 ) {
+        $this->query->condition($this->real_field, array( $this->value[0]['min'], $this->value[0]['max']), 'BETWEEN', $this->options['group']);
+      }
+    }
     else {
       while (is_array($this->value)) {
         $this->value = $this->value ? reset($this->value) : NULL;
diff --git a/contrib/search_api_views/includes/handler_filter_options.inc b/contrib/search_api_views/includes/handler_filter_options.inc
index c63c07e7..750c12ce 100644
--- a/contrib/search_api_views/includes/handler_filter_options.inc
+++ b/contrib/search_api_views/includes/handler_filter_options.inc
@@ -121,6 +121,7 @@ class SearchApiViewsHandlerFilterOptions extends SearchApiViewsHandlerFilter {
    */
   public function option_definition() {
     $options = parent::option_definition();
+    $options['value'] = array('default' => '');
     $options['expose']['contains']['reduce'] = array('default' => FALSE);
     return $options;
   }
