diff --git a/handlers/views_handler_filter.inc b/handlers/views_handler_filter.inc
index 5959f18..14735a7 100644
--- a/handlers/views_handler_filter.inc
+++ b/handlers/views_handler_filter.inc
@@ -60,7 +60,7 @@ class views_handler_filter extends views_handler {
 
     $options['operator'] = array('default' => '=');
     $options['value'] = array('default' => '');
-    $options['group'] = array('default' => '0');
+    $options['group'] = array('default' => '1');
     $options['exposed'] = array('default' => FALSE);
     $options['expose'] = array(
       'contains' => array(
diff --git a/includes/admin.inc b/includes/admin.inc
index 1e6f182..864990d 100644
--- a/includes/admin.inc
+++ b/includes/admin.inc
@@ -2723,14 +2723,14 @@ function views_ui_rearrange_filter_form(&$form_state) {
     );
 
     $form['remove_groups'][$id] = array(); // to prevent a notice
-    if ($id != 0) {
+    if ($id != 1) {
       $form['remove_groups'][$id] = array(
         '#type' => 'submit',
         '#value' => t('Remove group @group', array('@group' => $id)),
         '#group' => $id,
       );
     }
-    $group_options[$id] = $id == 0 ? t('Default group') : t('Group @group', array('@group' => $id));
+    $group_options[$id] = $id == 1 ? t('Default group') : t('Group @group', array('@group' => $id));
     $form['#group_renders'][$id] = array();
   }
 
@@ -2742,7 +2742,7 @@ function views_ui_rearrange_filter_form(&$form_state) {
   foreach ($handlers as $id => $field) {
     // If the group does not exist, move the filters to the default group.
     if (empty($field['group']) || empty($groups['groups'][$field['group']])) {
-      $field['group'] = 0;
+      $field['group'] = 1;
     }
 
     $handler = $display->handler->get_handler($type, $id);
@@ -2754,7 +2754,7 @@ function views_ui_rearrange_filter_form(&$form_state) {
     // the default group to prevent weird errors from having it be in its
     // own group:
     if (!$grouping && $field['group'] == 'ungroupable') {
-      $field['group'] = 0;
+      $field['group'] = 1;
     }
 
     // Place this item into the proper group for rendering.
diff --git a/plugins/views_plugin_display.inc b/plugins/views_plugin_display.inc
index 90d3802..89b4b62 100644
--- a/plugins/views_plugin_display.inc
+++ b/plugins/views_plugin_display.inc
@@ -169,6 +169,21 @@ class views_plugin_display extends views_plugin {
       // Clear the values
       $this->set_option('distinct', NULL);
     }
+
+    // Convert filter groups.
+    $filter_groups = $this->get_option('filter_groups');
+    // Only convert if it wasn't converted yet, which is the case if there is a 0 group.
+    if (isset($filter_groups['groups'][0])) {
+      // Update filter groups.
+      $filter_groups ['groups'] = views_array_key_plus($filter_groups['groups']);
+      $this->set_option('filter_groups', $filter_groups);
+      // Update the filter group on each filter.
+      $filters = $this->get_option('filters');
+      foreach ($filters as &$filter) {
+        $filter['group']++;
+      }
+      $this->set_option('filters', $filters);
+    }
   }
 
   function construct() {
@@ -602,7 +617,7 @@ class views_plugin_display extends views_plugin {
       'filter_groups' => array(
         'contains' => array(
           'operator' => array('default' => 'AND'),
-          'groups' => array('default' => array(0 => 'AND')),
+          'groups' => array('default' => array(1 => 'AND')),
         ),
       ),
       'filters' => array(
diff --git a/plugins/views_plugin_query_default.inc b/plugins/views_plugin_query_default.inc
index 1839419..fcfeff4 100644
--- a/plugins/views_plugin_query_default.inc
+++ b/plugins/views_plugin_query_default.inc
@@ -888,11 +888,21 @@ class views_plugin_query_default extends views_plugin_query{
   /**
    * Construct the "WHERE" or "HAVING" part of the query.
    *
+   * As views has to wrap the conditions from arguments with AND, a special
+   * group is wrapped around all conditions. This special group has the ID 0.
+   * There is other code in filters which makes sure that the group IDs are
+   * higher than zero.
+   *
    * @param $where
    *   'where' or 'having'.
    */
   function condition_sql($where = 'where') {
     $clauses = array();
+    // Respekt the special group, which is always AND.
+    $has_arguments = FALSE;
+    $clauses_main = array();
+    $has_filter = FALSE;
+
     foreach ($this->$where as $group => $info) {
       if (empty($info['clauses'])) {
         continue;
@@ -902,18 +912,39 @@ class views_plugin_query_default extends views_plugin_query{
       if (count($info['clauses']) > 1) {
         $clause = '(' . $clause . ')';
       }
-      $clauses[] = $clause;
+
+      if ($group == 0) {
+        $has_arguments = TRUE;
+        $clauses_main[] = $clause;
+      }
+      else {
+        $has_filter = TRUE;
+        $clauses[] = $clause;
+      }
+
     }
 
-    if ($clauses) {
-      $keyword = drupal_strtoupper($where);
+    $keyword = drupal_strtoupper($where);
+
+    if ($has_filter) {
       if (count($clauses) > 1) {
-        return "$keyword (" . implode(")\n    " . $this->group_operator . ' (', array_filter($clauses)) . ")\n";
+        $filter_group = "(" . implode(")\n    " . $this->group_operator . ' (', array_filter($clauses)) . ")\n";
       }
       else {
-        return "$keyword " . array_shift($clauses) . "\n";
+        $filter_group = array_shift($clauses) . "\n";
       }
+      $clauses_main[] = $filter_group;
     }
+
+    if ($clauses_main) {
+      if (count($clauses_main) > 1) {
+        return "$keyword " . "(" . implode(")\n    " . 'AND' . ' (', array_filter($clauses_main)) . ")\n";
+      }
+      else {
+        return "$keyword " . array_shift($clauses_main) . "\n";
+      }
+    }
+
     return "";
   }
 
@@ -1053,6 +1084,9 @@ class views_plugin_query_default extends views_plugin_query{
    */
   function get_where_args() {
     $args = array();
+    // Sort the groups by key, so the args are sorted right.
+    ksort($this->where);
+    ksort($this->having);
     foreach ($this->where as $group => $where) {
       $args = array_merge($args, $where['args']);
     }
diff --git a/views.module b/views.module
index 75392a7..84a4311 100644
--- a/views.module
+++ b/views.module
@@ -1777,3 +1777,19 @@ function views_trim_text($alter, $value) {
 
   return $value;
 }
+
+/**
+ * Adds one to each key of the array.
+ *
+ * For example array(0 => 'foo') would be array(1 => 'foo').
+ */
+function views_array_key_plus($array) {
+  $keys = array_keys($array);
+  rsort($keys);
+  foreach ($keys as $key) {
+    $array[$key + 1] = $array[$key];
+    unset($array[$key]);
+  }
+  asort($array);
+  return $array;
+}
