diff -rupN django/contrib/admin/filterspecs.py ../django/contrib/admin/filterspecs.py
--- django/contrib/admin/filterspecs.py	2010-09-13 22:08:17.000000000 +0000
+++ ../django/contrib/admin/filterspecs.py	2010-09-13 21:59:22.000000000 +0000
@@ -26,7 +26,7 @@ class FilterSpec(object):
     def title(self):
         raise NotImplementedError()
         
-    def get_query_set(self, cl, qs):
+    def get_query_set(self, cl):
         return False
     
     def consumed_params(self):
diff -rupN django/contrib/admin/views/main.py ../django/contrib/admin/views/main.py
--- django/contrib/admin/views/main.py	2010-09-13 22:08:17.000000000 +0000
+++ ../django/contrib/admin/views/main.py	2010-09-13 21:59:39.000000000 +0000
@@ -172,6 +172,12 @@ class ChangeList(object):
             order_type = params[ORDER_TYPE_VAR]
         return order_field, order_type
 
+    def apply_filter_specs(self,qs,filter_dict):
+        # Here we apply the results of Q objects collected from our FilterSpecs
+        # The & operator becomes a sensible default which can be overridden in
+        # particular cases.
+        return qs.filter(reduce(operator.__and__(filter_dict.values())))
+
     def get_query_set(self):
         qs = self.root_query_set
         lookup_params = self.params.copy() # a dictionary of the query string
@@ -191,11 +197,14 @@ class ChangeList(object):
                 lookup_params[key] = value.split(',')
                 
         # Let every filter spec modify the qs and params to its liking
+        # Redux to above comment -- Let every filter spec return a Q object
+
+        filter_dict = {} # A handy repository for our collected Q objects
         for filter_spec in self.filter_specs:
-            new_qs = filter_spec.get_query_set(self, qs)
-            if new_qs is not None and new_qs is not False:
-                qs = new_qs
-                # Only consume params if we got a new queryset
+            new_q = filter_spec.get_query_set(self)
+            if new_q:
+                filter_dict[filter_spec] = new_q
+                # Only consume params if we got a new Q obj
                 for param in filter_spec.consumed_params():
                     try:
                         del lookup_params[param]
@@ -209,6 +218,11 @@ class ChangeList(object):
                 else:
                     lookup_params[key] = True
 
+        # The below allows the user to override the querying assumption
+        # among filters (x = y AND z = a AND ...)
+        if filter_dict:
+            qs = self.apply_filter_specs(filter_dict)
+
         # Apply lookup parameters from the query string.
         try:
             qs = qs.filter(**lookup_params)
