diff --git a/django/contrib/admin/filters.py b/django/contrib/admin/filters.py
index 36dcea1..22ce36f 100644
--- a/django/contrib/admin/filters.py
+++ b/django/contrib/admin/filters.py
@@ -63,7 +63,7 @@ class SimpleListFilter(ListFilter):
             raise ImproperlyConfigured(
                 "The list filter '%s' does not specify "
                 "a 'parameter_name'." % self.__class__.__name__)
-        lookup_choices = self.lookups(request)
+        lookup_choices = self.lookups(request, model_admin)
         if lookup_choices is None:
             lookup_choices = ()
         self.lookup_choices = lookup_choices
@@ -78,7 +78,7 @@ class SimpleListFilter(ListFilter):
         """
         return self.params.get(self.parameter_name, None)
 
-    def lookups(self, request):
+    def lookups(self, request, model_admin):
         """
         Must be overriden to return a list of tuples (value, verbose value)
         """
diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt
index e8bc597..65ca259 100644
--- a/docs/ref/contrib/admin/index.txt
+++ b/docs/ref/contrib/admin/index.txt
@@ -568,7 +568,7 @@ subclass::
                    # Parameter for the filter that will be used in the URL query.
                    parameter_name = 'decade'
 
-                   def lookups(self, request):
+                   def lookups(self, request, model_admin):
                        """
                        Returns a list of tuples. The first element in each
                        tuple is the coded value for the option that will
@@ -578,23 +578,23 @@ subclass::
                        """
                        return (
                            ('80s', 'in the eighties'),
-                           ('other', 'other'),
+                           ('90s', 'in the nineties'),
                        )
 
                    def queryset(self, request, queryset):
                        """
                        Returns the filtered queryset based on the value
                        provided in the query string and retrievable via
-                       ``value()``.
+                       `self.value()`.
                        """
                        # Compare the requested value (either '80s' or 'other')
                        # to decide how to filter the queryset.
                        if self.value() == '80s':
                            return queryset.filter(birthday__year__gte=1980,
                                                    birthday__year__lte=1989)
-                       if self.value() == 'other':
-                           return queryset.filter(Q(year__lte=1979) |
-                                                   Q(year__gte=1990))
+                       if self.value() == '90s':
+                           return queryset.filter(birthday__year__gte=1990,
+                                                  birthday__year__lte=1999)
 
                class PersonAdmin(ModelAdmin):
                    list_filter = (DecadeBornListFilter,)
@@ -602,17 +602,43 @@ subclass::
           .. note::
 
               As a convenience, the ``HttpRequest`` object is passed to the
-              filter's methods, for example::
+              ``lookups`` and ``queryset`` methods, for example::
 
                   class AuthDecadeBornListFilter(DecadeBornListFilter):
 
-                      def lookups(self, request):
+                      def lookups(self, request, model_admin):
                           if request.user.is_superuser:
-                              return super(AuthDecadeBornListFilter, self).lookups(request)
+                              return super(AuthDecadeBornListFilter, self) \
+                                         .lookups(request, model_admin)
 
                       def queryset(self, request, queryset):
                           if request.user.is_superuser:
-                              return super(AuthDecadeBornListFilter, self).queryset(request, queryset)
+                              return super(AuthDecadeBornListFilter, self) \
+                                         .queryset(request, queryset)
+
+              Also as a convenience, the ``ModelAdmin`` object is passed to the
+              ``lookups`` method, for example if you want to base the lookups on the
+              available data::
+              
+                  class AnotherDecadeBornListFilter(DecadeBornListFilter):
+                  
+                      def lookups(self, request, model_admin):
+                          """
+                          Only show the lookups if there actually is anyone born in
+                          the corresponding decades.
+                          """
+                          born_in_80s = model_admin.queryset(request) \
+                                            .filter(birthday__year__gte=1980,
+                                                    birthday__year__lte=1989)
+                          born_in_90s = model_admin.queryset(request) \
+                                            .filter(birthday__year__gte=1990,
+                                                    birthday__year__lte=1999)
+                          options = tuple()
+                          if born_in_80s.count() > 0:
+                              options += (('80s', "in the eighties"),)
+                          if born_in_90s.count() > 0:
+                              options += (('90s', "in the nineties"),)
+                          return options
 
         * a tuple, where the first element is a field name and the second
           element is a class inheriting from
diff --git a/tests/regressiontests/admin_filters/tests.py b/tests/regressiontests/admin_filters/tests.py
index 6b32475..72776d7 100644
--- a/tests/regressiontests/admin_filters/tests.py
+++ b/tests/regressiontests/admin_filters/tests.py
@@ -19,8 +19,9 @@ def select_by(dictlist, key, value):
 
 class DecadeListFilter(SimpleListFilter):
 
-    def lookups(self, request):
+    def lookups(self, request, model_admin):
         return (
+            ('the 80s', "the 1980's"),
             ('the 90s', "the 1990's"),
             ('the 00s', "the 2000's"),
             ('other', "other decades"),
@@ -28,6 +29,8 @@ class DecadeListFilter(SimpleListFilter):
 
     def queryset(self, request, queryset):
         decade = self.value()
+        if decade == 'the 80s':
+            return queryset.filter(year__gte=1980, year__lte=1989)
         if decade == 'the 90s':
             return queryset.filter(year__gte=1990, year__lte=1999)
         if decade == 'the 00s':
@@ -45,9 +48,25 @@ class DecadeListFilterWithoutParameter(DecadeListFilter):
 
 class DecadeListFilterWithNoneReturningLookups(DecadeListFilterWithTitleAndParameter):
 
-    def lookups(self, request):
+    def lookups(self, request, model_admin):
         pass
 
+class DecadeListFilterWithQuerysetBasedLookups(DecadeListFilterWithTitleAndParameter):
+
+    def lookups(self, request, model_admin):
+        books_80s = model_admin.queryset(request).filter(year__gte=1980, year__lte=1989)
+        books_90s = model_admin.queryset(request).filter(year__gte=1990, year__lte=1999)
+        books_00s = model_admin.queryset(request).filter(year__gte=2000, year__lte=2009)
+        options = tuple()
+        if books_80s.count() > 0:
+            options += (('the 80s', "the 1980's"),)
+        if books_90s.count() > 0:
+            options += (('the 90s', "the 1990's"),)
+        if books_00s.count() > 0:
+            options += (('the 00s', "the 2000's"),)
+        return options
+        
+    
 class CustomUserAdmin(UserAdmin):
     list_filter = ('books_authored', 'books_contributed')
 
@@ -68,6 +87,9 @@ class DecadeFilterBookAdminWithoutParameter(ModelAdmin):
 class DecadeFilterBookAdminWithNoneReturningLookups(ModelAdmin):
     list_filter = (DecadeListFilterWithNoneReturningLookups,)
 
+class DecadeFilterBookAdminWithQuerysetBasedLookups(ModelAdmin):
+    list_filter = (DecadeListFilterWithQuerysetBasedLookups,)
+    
 class ListFiltersTests(TestCase):
 
     def setUp(self):
@@ -385,6 +407,23 @@ class ListFiltersTests(TestCase):
         self.assertEqual(choices[0]['selected'], True)
         self.assertEqual(choices[0]['query_string'], '?')
 
+        # Look for books in the 1980s ----------------------------------------
+
+        request = self.request_factory.get('/', {'publication-decade': 'the 80s'})
+        changelist = self.get_changelist(request, Book, modeladmin)
+
+        # Make sure the correct queryset is returned
+        queryset = changelist.get_query_set(request)
+        self.assertEqual(list(queryset), [])
+
+        # Make sure the correct choice is selected
+        filterspec = changelist.get_filters(request)[0][1]
+        self.assertEqual(force_unicode(filterspec.title), u'publication decade')
+        choices = list(filterspec.choices(changelist))
+        self.assertEqual(choices[1]['display'], u'the 1980\'s')
+        self.assertEqual(choices[1]['selected'], True)
+        self.assertEqual(choices[1]['query_string'], '?publication-decade=the+80s')
+        
         # Look for books in the 1990s ----------------------------------------
 
         request = self.request_factory.get('/', {'publication-decade': 'the 90s'})
@@ -398,9 +437,9 @@ class ListFiltersTests(TestCase):
         filterspec = changelist.get_filters(request)[0][1]
         self.assertEqual(force_unicode(filterspec.title), u'publication decade')
         choices = list(filterspec.choices(changelist))
-        self.assertEqual(choices[1]['display'], u'the 1990\'s')
-        self.assertEqual(choices[1]['selected'], True)
-        self.assertEqual(choices[1]['query_string'], '?publication-decade=the+90s')
+        self.assertEqual(choices[2]['display'], u'the 1990\'s')
+        self.assertEqual(choices[2]['selected'], True)
+        self.assertEqual(choices[2]['query_string'], '?publication-decade=the+90s')
 
         # Look for books in the 2000s ----------------------------------------
 
@@ -415,9 +454,9 @@ class ListFiltersTests(TestCase):
         filterspec = changelist.get_filters(request)[0][1]
         self.assertEqual(force_unicode(filterspec.title), u'publication decade')
         choices = list(filterspec.choices(changelist))
-        self.assertEqual(choices[2]['display'], u'the 2000\'s')
-        self.assertEqual(choices[2]['selected'], True)
-        self.assertEqual(choices[2]['query_string'], '?publication-decade=the+00s')
+        self.assertEqual(choices[3]['display'], u'the 2000\'s')
+        self.assertEqual(choices[3]['selected'], True)
+        self.assertEqual(choices[3]['query_string'], '?publication-decade=the+00s')
 
         # Combine multiple filters -------------------------------------------
 
@@ -432,9 +471,9 @@ class ListFiltersTests(TestCase):
         filterspec = changelist.get_filters(request)[0][1]
         self.assertEqual(force_unicode(filterspec.title), u'publication decade')
         choices = list(filterspec.choices(changelist))
-        self.assertEqual(choices[2]['display'], u'the 2000\'s')
-        self.assertEqual(choices[2]['selected'], True)
-        self.assertEqual(choices[2]['query_string'], '?publication-decade=the+00s&author__id__exact=%s' % self.alfred.pk)
+        self.assertEqual(choices[3]['display'], u'the 2000\'s')
+        self.assertEqual(choices[3]['selected'], True)
+        self.assertEqual(choices[3]['query_string'], '?publication-decade=the+00s&author__id__exact=%s' % self.alfred.pk)
 
         filterspec = changelist.get_filters(request)[0][0]
         self.assertEqual(force_unicode(filterspec.title), u'author')
@@ -472,3 +511,25 @@ class ListFiltersTests(TestCase):
         changelist = self.get_changelist(request, Book, modeladmin)
         filterspec = changelist.get_filters(request)[0]
         self.assertEqual(len(filterspec), 0)
+
+    def test_simplelistfilter_with_queryset_based_lookups(self):
+        modeladmin = DecadeFilterBookAdminWithQuerysetBasedLookups(Book, site)
+        request = self.request_factory.get('/', {})
+        changelist = self.get_changelist(request, Book, modeladmin)
+        
+        filterspec = changelist.get_filters(request)[0][0]
+        self.assertEqual(force_unicode(filterspec.title), u'publication decade')
+        choices = list(filterspec.choices(changelist))
+        self.assertEqual(len(choices), 3)
+        
+        self.assertEqual(choices[0]['display'], u'All')
+        self.assertEqual(choices[0]['selected'], True)
+        self.assertEqual(choices[0]['query_string'], '?')
+        
+        self.assertEqual(choices[1]['display'], u'the 1990\'s')
+        self.assertEqual(choices[1]['selected'], False)
+        self.assertEqual(choices[1]['query_string'], '?publication-decade=the+90s')
+        
+        self.assertEqual(choices[2]['display'], u'the 2000\'s')
+        self.assertEqual(choices[2]['selected'], False)
+        self.assertEqual(choices[2]['query_string'], '?publication-decade=the+00s')
