diff --git a/contrib/search_api_views/includes/handler_filter.inc b/contrib/search_api_views/includes/handler_filter.inc
index 770526a..c39e925 100644
--- a/contrib/search_api_views/includes/handler_filter.inc
+++ b/contrib/search_api_views/includes/handler_filter.inc
@@ -31,6 +31,34 @@ class SearchApiViewsHandlerFilter extends views_handler_filter {
    */
   public $query;
 
+  public function init(&$view, &$options) {
+    parent::init($view, $options);
+
+    // Backward compatibility.
+    if (!is_array($this->value)) {
+      $this->value = array(
+        'value' => $this->value,
+        'min' => '',
+        'max' => '',
+      );
+    }
+  }
+
+  /**
+   * 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(
+        'min' => array('default' => ''),
+        'max' => array('default' => ''),
+        'value' => array('default' => ''),
+      ),
+    );
+    return $options;
+  }
+
   /**
    * Provide a list of options for the operator form.
    */
@@ -44,37 +72,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;
+  function value_form(&$form, &$form_state) {
+    $form['value']['#tree'] = TRUE;
+
+    $single_field_operators = $this->operator_options();
+    unset($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 (!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'),
+    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' => $this->value['value'],
       );
+      if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier])) {
+        $form_state['input'][$identifier] = $this->value['value'];
+      }
+    }
+
+    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') {
+        $dependency = array(
+          '#dependency' => array($source => array('between')),
+        );
+        $form['value']['min'] = $dependency;
+        $form['value']['max'] = $dependency;
+      }
+      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'])) {
+        // Ensure there is something in the 'value'.
+        $form['value'] = array(
+          '#type' => 'value',
+          '#value' => NULL,
+        );
+      }
     }
   }
 
@@ -82,6 +177,9 @@ class SearchApiViewsHandlerFilter extends views_handler_filter {
    * Display the filter on the administrative summary
    */
   function admin_summary() {
+    if ($this->operator === 'between') {
+      return 'is between ' . check_plain((string) $this->value['min']) . ' / ' . check_plain((string) $this->value['max']);
+    }
     if (!empty($this->options['exposed'])) {
       return t('exposed');
     }
@@ -106,6 +204,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;
