diff --git css/views-admin.css css/views-admin.css
index 93e895a..c5bd2b0 100644
--- css/views-admin.css
+++ css/views-admin.css
@@ -305,17 +305,28 @@ html.js #views-ajax-pad {
 }
 
 .views-override,
+.views-build-group,
 .views-expose {
   padding: 0.5em 1em 0em 1em;
 }
 
+.views-build-group .form-submit {
+  margin: 0.5em !important;
+}
+
+table.views-filter-groups {
+  margin-bottom: 0px;
+}
+
 #views-ajax-pad .views-override .form-submit,
+#views-ajax-pad .views-build-group .form-submit,
 #views-ajax-pad .views-expose .form-submit {
   float: right;
   margin: 0 .5em 0 1em;
 }
 
 #views-ajax-pad .views-expose .description,
+#views-ajax-pad .views-build-group .description,
 #views-ajax-pad .views-override .description {
   margin-bottom: .25em;
 }
@@ -705,6 +716,7 @@ tr.group-message {
 }
 
 .group-message .form-submit,
+#edit-options-add-group,
 #views-add-group {
   float: right;
   clear: both;
diff --git handlers/views_handler_filter.inc handlers/views_handler_filter.inc
index cf59f14..a02dc2a 100644
--- handlers/views_handler_filter.inc
+++ handlers/views_handler_filter.inc
@@ -15,6 +15,14 @@
  * Base class for filters.
  */
 class views_handler_filter extends views_handler {
+
+  /**
+   * Determine if a handler can be exposed.
+   */
+  function can_expose_groups() {
+    return (bool)count($this->operator_options());
+  }
+
   /**
    * Provide some extra help to get the operator/value easier to use.
    *
@@ -60,7 +68,18 @@ class views_handler_filter extends views_handler {
         'single' => array('default' => 1),
       ),
     );
-
+    $options['build_group'] = array('default' => FALSE);
+    $options['group_info'] = array(
+      'contains' => array(
+        'label' => array('default' => '', 'translatable' => TRUE),
+        'identifier' => array('default' => ''),
+        'optional' => array('default' => TRUE),
+        'widget' => array('default' => 'select'),
+        'remember' => array('default' => 0),
+        'default_group' => array('default' => 'All'),
+        'group_items' => array('default' => array(array(), array())),
+      ),
+    );
     return $options;
   }
 
@@ -85,6 +104,9 @@ class views_handler_filter extends views_handler {
   function options_form(&$form, &$form_state) {
     if ($this->can_expose()) {
       $this->show_expose_button($form, $form_state);
+      if ($this->options['exposed'] && $this->can_expose_groups()) {
+        $this->show_build_group_button($form, $form_state);
+      }
     }
     $form['op_val_start'] = array('#value' => '<div class="clear-block">');
     $this->show_operator_form($form, $form_state);
@@ -92,6 +114,9 @@ class views_handler_filter extends views_handler {
     $form['op_val_end'] = array('#value' => '</div>');
     if ($this->can_expose()) {
       $this->show_expose_form($form, $form_state);
+      if ($this->options['exposed']  && $this->can_expose_groups()) {
+        $this->show_build_group_form($form, $form_state);
+      }
     }
   }
 
@@ -116,6 +141,7 @@ class views_handler_filter extends views_handler {
     $this->value_submit($form, $form_state);
     if (!empty($this->options['exposed'])) {
       $this->expose_submit($form, $form_state);
+      $this->group_submit($form, $form_state);
     }
   }
 
@@ -164,6 +190,46 @@ class views_handler_filter extends views_handler {
   function operator_submit($form, &$form_state) { }
 
   /**
+   * Build a form containing a group of operator | values to apply as a
+   * single filter.
+   */
+  function group_form(&$form, &$form_state) {
+    if (!empty($this->options['group_info']['optional'])) {
+      $any_label = variable_get('views_exposed_filter_any_label', 'old_any') == 'old_any' ? '<Any>' : t('- Any -');
+      $groups = array('All' => $any_label);
+    }
+    foreach ($this->options['group_info']['group_items'] as $id => $group) {
+      if (!empty($group['title'])) {
+        $groups[$id] = t($group['title']);
+      }
+    }
+
+    if (count($groups)) {
+      $form['build_group'] = array(
+        '#title' => t($this->options['group_info']['label']),
+        '#type' => $this->options['group_info']['widget'],
+        '#default_value' => $this->options['group_info']['default_group'],
+        '#options' => $groups,
+      );
+      $this->options['expose']['label'] = '';
+    }
+  }
+
+  /**
+   * Filters out groups without a title.
+   */
+  function group_submit(&$form, &$form_state) {
+    if (!empty($form_state['values']['options']['group_info']['group_items'])) {
+      foreach ($form_state['values']['options']['group_info']['group_items'] as $x => $item) {
+        // Empty would filter out "0" which might be used.
+        if (trim($item['title']) == '') {
+          unset($form_state['values']['options']['group_info']['group_items'][$x]);
+        }
+      }
+    }
+  }
+
+  /**
    * Shortcut to display the value form.
    */
   function show_value_form(&$form, &$form_state) {
@@ -174,6 +240,41 @@ class views_handler_filter extends views_handler {
     }
   }
 
+  function show_build_group_form(&$form, &$form_state) {
+    if (empty($this->options['build_group'])) {
+      return;
+    }
+
+    $form['op_val_start']['#value'] = '<div class = "group-populated">' . $form['op_val_start']['#value'];
+    $form['op_val_end']['#value'] .= '</div>';
+    $form['expose']['#prefix'] .= '<div class = "group-populated">';
+    $form['expose']['#suffix'] .= '</div>';
+    $form['expose']['use_operator']['#default_value'] = TRUE;
+
+    $form['build_group'] = array(
+      '#prefix' => '<div class = "views-expose-options clear-block">',
+      '#suffix' => '</div>',
+    );
+    $this->build_group_form($form, $form_state);
+
+    // When we click the expose button, we add new gadgets to the form but they
+    // have no data in $_POST so their defaults get wiped out. This prevents
+    // these defaults from getting wiped out. This setting will only be TRUE
+    // during a 2nd pass rerender.
+    if (!empty($form_state['force_expose_options'])) {
+      foreach (element_children($form['expose']) as $id) {
+        if (isset($form['expose'][$id]['#default_value']) && !isset($form['expose'][$id]['#value'])) {
+          $form['expose'][$id]['#value'] = $form['expose'][$id]['#default_value'];
+        }
+      }
+      foreach (element_children($form['group_info']) as $id) {
+        if (isset($form['group_info'][$id]['#default_value']) && !isset($form['group_info'][$id]['#value'])) {
+          $form['group_info'][$id]['#value'] = $form['group_info'][$id]['#default_value'];
+        }
+      }
+    }
+  }
+
   /**
    * Provide a form for setting options.
    *
@@ -308,6 +409,23 @@ class views_handler_filter extends views_handler {
       return;
     }
 
+    // If this filter use a group of operator | values
+    if (!empty($this->options['build_group'])) {
+      // Set the flags to be used later.
+      $value = $this->options['expose']['identifier'] = $this->options['group_info']['identifier'];
+      $this->options['expose']['use_operator'] = TRUE;
+      $this->options['expose']['operator'] = $this->options['group_info']['operator'];
+      $this->options['expose']['label'] = $this->options['group_info']['label'];
+
+      $this->group_form($form, $form_state);
+      $form[$value] = $form['build_group'];
+
+      if ($value != 'build_group') {
+        unset($form['build_group']);
+      }
+      return;
+    }
+
     // Build the exposed form, when its based on an operator.
     if (!empty($this->options['expose']['use_operator']) && !empty($this->options['expose']['operator'])) {
       $operator = $this->options['expose']['operator'];
@@ -349,6 +467,116 @@ class views_handler_filter extends views_handler {
     }
   }
 
+  function build_group_form(&$form, &$form_state) {
+    if (empty($this->options['build_group'])) {
+      return;
+    }
+
+    $identifier = !empty($this->options['group_info']['identifier'])?$this->options['group_info']['identifier']:'group_' . $this->options['expose']['identifier'];
+    $form['group_info']['identifier'] = array(
+      '#type' => 'textfield',
+      '#default_value' => $identifier,
+      '#title' => t('Group identifier'),
+      '#size' => 40,
+      '#description' => t('This will appear in the URL after the ? to identify this filter. Cannot be blank.'),
+    );
+    $label = !empty($this->options['group_info']['label'])?$this->options['group_info']['label']:$this->options['expose']['label'];
+    $form['group_info']['label'] = array(
+      '#type' => 'textfield',
+      '#default_value' => $this->options['group_info']['label'],
+      '#title' => t('Label'),
+      '#size' => 40,
+    );
+    $form['group_info']['optional'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Optional'),
+      '#description' => t('This exposed filter is optional and will have added options to allow it not to be set.'),
+      '#default_value' => $this->options['group_info']['optional'],
+    );
+    $form['group_info']['widget'] = array(
+      '#type' => 'radios',
+      '#default_value' => $this->options['group_info']['widget'],
+      '#title' => t('Widget'),
+      '#options' => array(
+        'radios' => t('Radios'),
+        'select' => t('Select'),
+      ),
+      '#description' => t('Select which kind of widget will be used to render the group of filters'),
+    );
+    // TODO: This is not working yet
+    $form['group_info']['remember'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Remember'),
+      '#description' => t('Remember the last setting the user gave this filter.'),
+      '#default_value' => $this->options['group_info']['remember'],
+    );
+
+    $any_label = variable_get('views_exposed_filter_any_label', 'old_any') == 'old_any' ? '<Any>' : t('- Any -');
+    $groups = array('All' => $any_label);
+
+    foreach ($this->options['group_info']['group_items'] as $x => $item) {
+      $row = array();
+      $groups[$x] = '';
+      $this->operator_form($row, $form_state);
+      $row['operator']['#type'] = 'select';
+      $row['operator']['#title'] = '';
+      $this->value_form($row, $form_state);
+      foreach (element_children($row['value']) as $children) {
+        if (isset($row['value'][$children]['#dependency']['edit-options-operator'])) {
+          $row['value'][$children]['#dependency']["edit-options-group-info-group-items-$x-operator"] = $row['value'][$children]['#dependency']['edit-options-operator'];
+          unset($row['value'][$children]['#dependency']['edit-options-operator']);
+          $row['value'][$children]['#title'] = '';
+          $row['value'][$children]['#default_value'] = $this->options['group_info']['group_items'][$x]['value'][$children];
+        }
+      }
+      $row['operator']['#default_value'] = $this->options['group_info']['group_items'][$x]['operator'];
+
+      $form['group_info']['group_items'][$x] = array(
+        'weight' => array(
+          '#type' => 'weight',
+          '#value' => $x,
+          '#delta' => $x,
+          '#attributes' => array('class' => 'weight'),
+        ),
+        'title' => array(
+          '#type' => 'textfield',
+          '#size' => 20,
+          '#default_value' => $this->options['group_info']['group_items'][$x]['title']
+        ),
+        'operator' => $row['operator'],
+        'value' => $row['value'],
+        'removed' => array(
+          '#type' => 'checkbox',
+          '#id' => 'views-removed-' . $x,
+          '#attributes' => array('class' => 'views-remove-checkbox'),
+          '#default_value' => 0,
+        ),
+      );
+    }
+    $form['group_info']['default_group'] = array(
+      '#type' => 'radios',
+      '#options' => $groups,
+      '#default_value' => $this->options['group_info']['default_group'],
+    );
+    $form['group_info']['add_group'] = array(
+      '#prefix' => '<div class="views-build-group clear-block">',
+      '#suffix' => '</div>',
+      '#type' => 'submit',
+      '#value' => t('Add another item'),
+      '#submit' => array('views_ui_config_item_form_add_group'),
+    );
+    $form['group_info']['#theme'] = 'views_ui_build_group_table';
+
+    $form['#js']['tableDrag']['filter-exposed_group']['weight'][0] = array(
+      'target' => 'weight',
+      'source' => NULL,
+      'relationship' => 'sibling',
+      'action' => 'order',
+      'hidden' => TRUE,
+      'limit' => 0,
+    );
+  }
+
   /**
    * Make some translations to a form item to make it more suitable to
    * exposing.
@@ -413,6 +641,17 @@ class views_handler_filter extends views_handler {
       return TRUE;
     }
 
+    if (!empty($this->options['build_group'])) {
+      $selected_group = $input[$this->options['group_info']['identifier']];
+      if (isset($selected_group) && isset($this->options['group_info']['group_items'][$selected_group])) {
+        $input[$this->options['expose']['operator']] = $this->options['group_info']['group_items'][$selected_group]['operator'];
+        $input[$this->options['expose']['identifier']] = $this->options['group_info']['group_items'][$selected_group]['value'];
+        $this->options['expose']['use_operator'] = TRUE;
+      }
+      else {
+        return FALSE;
+      }
+    }
 
     if (!empty($this->options['expose']['use_operator']) && !empty($this->options['expose']['operator']) && isset($input[$this->options['expose']['operator']])) {
       $this->operator = $input[$this->options['expose']['operator']];
@@ -514,6 +753,38 @@ class views_handler_filter extends views_handler {
    function can_group() {
      return TRUE;
    }
+
+  function show_build_group_button(&$form, &$form_state) {
+    $form['build_group_button'] = array(
+      '#prefix' => '<div class="views-build-group clear-block">',
+      '#suffix' => '</div>',
+    );
+    if (empty($this->options['build_group'])) {
+      $form['build_group_button']['button'] = array(
+        '#type' => 'submit',
+        '#value' => t('Build a group'),
+        '#submit' => array('views_ui_config_item_form_build_group'),
+      );
+      $form['build_group_button']['markup'] = array(
+        '#prefix' => '<div class="description">',
+        '#value' => t('This item is currently using a single filter. If you <strong>build a group</strong>, users will see a list of items that represents a pair of operator value.'),
+        '#suffix' => '</div>',
+      );
+    }
+    else {
+      $form['build_group_button']['button'] = array(
+        '#type' => 'submit',
+        '#value' => t('Use single filter'),
+        '#submit' => array('views_ui_config_item_form_build_group'),
+      );
+      $form['build_group_button']['markup'] = array(
+        '#prefix' => '<div class="description">',
+        '#value' => t('This item is currently using a group. If you choose <strong>use single filter</strong> it, users will see the usual exposed filter.'),
+        '#suffix' => '</div>',
+      );
+    }
+  }
+
 }
 
 
diff --git includes/admin.inc includes/admin.inc
index e2a7b90..8876697 100644
--- includes/admin.inc
+++ includes/admin.inc
@@ -367,6 +367,39 @@ function theme_views_ui_list_views_form($form) {
   return drupal_render($form);
 }
 
+function theme_views_ui_build_group_table($form) {
+  $header = array(
+    '',
+    t('Default'),
+    t('Title'),
+    t('Operator'),
+    t('Value'),
+    '',
+  );
+  $rows[] = array(
+    drupal_render($form['default_group']['All']),
+    array(
+      'data' => t('- Any -'),
+      'colspan' => 5,
+    ),
+  );
+  foreach (element_children($form['group_items']) as $group_id) {
+    $output = array(
+      'weight' => drupal_render($form['group_items'][$group_id]['weight']),
+      'default' => drupal_render($form['default_group'][$group_id]),
+      'title' => drupal_render($form['group_items'][$group_id]['title']),
+      'operator' => drupal_render($form['group_items'][$group_id]['operator']),
+      'value' => drupal_render($form['group_items'][$group_id]['value']),
+      'removed' => drupal_render($form['group_items'][$group_id]['removed']) . l('<span>' . t('Remove') . '</span>', 'javascript:void()', array('attributes' => array('id' => 'views-remove-link-' . $group_id, 'class' => 'views-hidden views-button-remove views-remove-link', 'alt' => t('Remove this item'), 'title' => t('Remove this item')), 'html' => true)),
+    );
+    $rows[] = array('data' => $output, 'class' => 'draggable', 'id' => 'views-row-' . $group_id);
+  }
+
+  $table = theme_table($header, $rows, array('id' => 'filter-exposed_group', 'class' => 'views-filter-groups')) . drupal_render($form['add_group']);
+  $render_form = drupal_render($form);
+  return $render_form . $table;
+}
+
 /**
  * Page callback for the live preview.
  *
@@ -3302,6 +3335,46 @@ function views_ui_config_item_form_expose($form, &$form_state) {
   $form_state['force_expose_options'] = TRUE;
 }
 
+
+/**
+ * Override handler for views_ui_edit_display_form
+ */
+function views_ui_config_item_form_build_group($form, &$form_state) {
+  $item =& $form_state['handler']->options;
+  // flip
+  $item['build_group'] = empty($item['build_group']);
+
+  // If necessary, set new defaults:
+  if ($item['build_group']) {
+    $form_state['handler']->expose_options();
+  }
+
+  $form_state['view']->set_item($form_state['display_id'], $form_state['type'], $form_state['id'], $item);
+
+  views_ui_cache_set($form_state['view']);
+  $form_state['rerender'] = TRUE;
+  $form_state['rebuild'] = TRUE;
+  $form_state['force_expose_options'] = TRUE;
+}
+
+/**
+ * Add a new group to the exposed filter groups.
+ */
+function views_ui_config_item_form_add_group($form, &$form_state) {
+  $item =& $form_state['handler']->options;
+
+  // Add a new row.
+  $item['group_info']['group_items'][] = array();
+
+  $form_state['view']->set_item($form_state['display_id'], $form_state['type'], $form_state['id'], $item);
+
+  views_ui_cache_set($form_state['view']);
+  $form_state['rerender'] = TRUE;
+  $form_state['rebuild'] = TRUE;
+  $form_state['force_expose_options'] = TRUE;
+}
+
+
 /**
  * Form to config_item items in the views UI.
  */
diff --git views_ui.module views_ui.module
index cbce972..6f718de 100644
--- views_ui.module
+++ views_ui.module
@@ -232,6 +232,12 @@ function views_ui_theme() {
       'arguments' => array('form' => NULL),
       'file' => 'includes/admin.inc',
     ),
+
+    // Group of filters
+    'views_ui_build_group_table' => array(
+      'arguments' => array('form' => NULL),
+      'file' => 'includes/admin.inc',
+    ),
   );
 }
 
