diff --git a/django/contrib/admin/filters.py b/django/contrib/admin/filters.py
index 76b8d30..f33cde4 100644
--- a/django/contrib/admin/filters.py
+++ b/django/contrib/admin/filters.py
@@ -164,7 +164,7 @@ class RelatedFieldListFilter(FieldListFilter):
         self.lookup_val = request.GET.get(self.lookup_kwarg, None)
         self.lookup_val_isnull = request.GET.get(
                                       self.lookup_kwarg_isnull, None)
-        self.lookup_choices = field.get_choices(include_blank=False)
+        self.lookup_choices = self.field_choices(field, request, model_admin)
         super(RelatedFieldListFilter, self).__init__(
             field, request, params, model, model_admin, field_path)
         if hasattr(field, 'verbose_name'):
@@ -185,6 +185,9 @@ class RelatedFieldListFilter(FieldListFilter):
     def expected_parameters(self):
         return [self.lookup_kwarg, self.lookup_kwarg_isnull]
 
+    def field_choices(self, field, request, model_admin):
+        return field.get_choices(include_blank=False)
+
     def choices(self, cl):
         from django.contrib.admin.views.main import EMPTY_CHANGELIST_VALUE
         yield {
@@ -403,3 +406,9 @@ class AllValuesFieldListFilter(FieldListFilter):
             }
 
 FieldListFilter.register(lambda f: True, AllValuesFieldListFilter)
+
+
+class RelatedOnlyFieldListFilter(RelatedFieldListFilter):
+    def field_choices(self, field, request, model_admin):
+        limit_choices_to = {'pk__in': set(model_admin.queryset(request).values_list(field.name, flat=True))}
+        return field.get_choices(include_blank=False, limit_choices_to=limit_choices_to) 
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 22546c2..db2c5bf 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -386,22 +386,23 @@ class Field(object):
     def get_validator_unique_lookup_type(self):
         return '%s__exact' % self.name
 
-    def get_choices(self, include_blank=True, blank_choice=BLANK_CHOICE_DASH):
+    def get_choices(self, include_blank=True, blank_choice=BLANK_CHOICE_DASH, limit_choices_to=None):
         """Returns choices with a default blank choices included, for use
         as SelectField choices for this field."""
         first_choice = include_blank and blank_choice or []
         if self.choices:
             return first_choice + list(self.choices)
         rel_model = self.rel.to
+        limit_choices_to = limit_choices_to and limit_choices_to or self.rel.limit_choices_to
         if hasattr(self.rel, 'get_related_field'):
             lst = [(getattr(x, self.rel.get_related_field().attname),
                         smart_unicode(x))
                    for x in rel_model._default_manager.complex_filter(
-                       self.rel.limit_choices_to)]
+                       limit_choices_to)]
         else:
-            lst = [(x._get_pk_val(), smart_unicode(x))
+            lst = [(x._get_pk_val(), smart_unicode(x)) 
                    for x in rel_model._default_manager.complex_filter(
-                       self.rel.limit_choices_to)]
+                       limit_choices_to)]
         return first_choice + lst
 
     def get_choices_default(self):
diff --git a/tests/regressiontests/admin_filters/tests.py b/tests/regressiontests/admin_filters/tests.py
index e2a12c9..178e3cd 100644
--- a/tests/regressiontests/admin_filters/tests.py
+++ b/tests/regressiontests/admin_filters/tests.py
@@ -7,6 +7,7 @@ from django.contrib.admin import (site, ModelAdmin, SimpleListFilter,
 from django.contrib.admin.views.main import ChangeList
 from django.contrib.auth.admin import UserAdmin
 from django.contrib.auth.models import User
+from django.contrib.admin.filters import RelatedOnlyFieldListFilter
 from django.core.exceptions import ImproperlyConfigured
 from django.test import TestCase, RequestFactory
 from django.test.utils import override_settings
@@ -87,6 +88,11 @@ class BookAdmin(ModelAdmin):
 class BookAdminWithTupleBooleanFilter(BookAdmin):
     list_filter = ('year', 'author', 'contributors', ('is_best_seller', BooleanFieldListFilter), 'date_registered', 'no')
 
+class BookAdminRelatedOnlyFilter(ModelAdmin):
+    list_filter = ('year', ('author', RelatedOnlyFieldListFilter), ('contributors', RelatedOnlyFieldListFilter),\
+                   'is_best_seller', 'date_registered', 'no')
+    ordering = ('-id',)
+
 class DecadeFilterBookAdmin(ModelAdmin):
     list_filter = ('author', DecadeListFilterWithTitleAndParameter)
     ordering = ('-id',)
@@ -261,6 +267,13 @@ class ListFiltersTests(TestCase):
     def test_relatedfieldlistfilter_foreignkey(self):
         modeladmin = BookAdmin(Book, site)
 
+        request = self.request_factory.get('/')
+        changelist = self.get_changelist(request, Book, modeladmin)
+
+        # Make sure that all users are present in the author's list filter
+        filterspec = changelist.get_filters(request)[0][1]
+        self.assertEqual(filterspec.lookup_choices, [(1, u'alfred'), (2, u'bob'), (3, u'lisa')])
+
         request = self.request_factory.get('/', {'author__isnull': 'True'})
         changelist = self.get_changelist(request, Book, modeladmin)
 
@@ -289,6 +302,13 @@ class ListFiltersTests(TestCase):
     def test_relatedfieldlistfilter_manytomany(self):
         modeladmin = BookAdmin(Book, site)
 
+        request = self.request_factory.get('/')
+        changelist = self.get_changelist(request, Book, modeladmin)
+
+        # Make sure that all users are present in the contrib's list filter
+        filterspec = changelist.get_filters(request)[0][2]
+        self.assertEqual(filterspec.lookup_choices, [(1, u'alfred'), (2, u'bob'), (3, u'lisa')])
+
         request = self.request_factory.get('/', {'contributors__isnull': 'True'})
         changelist = self.get_changelist(request, Book, modeladmin)
 
@@ -366,6 +386,26 @@ class ListFiltersTests(TestCase):
         self.assertEqual(choice['selected'], True)
         self.assertEqual(choice['query_string'], '?books_contributed__id__exact=%d' % self.django_book.pk)
 
+    def test_relatedonlyfieldlistfilter_foreignkey(self):
+        modeladmin = BookAdminRelatedOnlyFilter(Book, site)
+
+        request = self.request_factory.get('/')
+        changelist = self.get_changelist(request, Book, modeladmin)
+
+        # Make sure that only actual authors are present in author's list filter
+        filterspec = changelist.get_filters(request)[0][1]
+        self.assertEqual(filterspec.lookup_choices, [(1, u'alfred'), (2, u'bob')])
+
+    def test_relatedonlyfieldlistfilter_manytomany(self):
+        modeladmin = BookAdminRelatedOnlyFilter(Book, site)
+
+        request = self.request_factory.get('/')
+        changelist = self.get_changelist(request, Book, modeladmin)
+
+        # Make sure that only actual contributors are present in contrib's list filter
+        filterspec = changelist.get_filters(request)[0][2]
+        self.assertEqual(filterspec.lookup_choices, [(2, u'bob'), (3, u'lisa')])
+
     def test_booleanfieldlistfilter(self):
         modeladmin = BookAdmin(Book, site)
         self.verify_booleanfieldlistfilter(modeladmin)
