Index: docs/topics/auth.txt
===================================================================
--- docs/topics/auth.txt	(revision 16594)
+++ docs/topics/auth.txt	(working copy)
@@ -308,6 +308,14 @@
             * ``o``, ``O``, and ``0`` (uppercase letter o, lowercase letter o,
               and zero)
 
+    .. method:: models.UserManager.active()
+
+        Returns ``QuerySet`` containing only active users (i.e. those, which have :attr:`~models.User.is_active` set to ``True``).
+
+    .. method:: models.UserManager.inactive()
+
+        Returns ``QuerySet`` containing only inactive users (i.e. those, which have :attr:`~models.User.is_active` set to ``False``).
+
 Basic usage
 -----------
 
Index: django/contrib/auth/tests/__init__.py
===================================================================
--- django/contrib/auth/tests/__init__.py	(revision 16594)
+++ django/contrib/auth/tests/__init__.py	(working copy)
@@ -10,7 +10,7 @@
 from django.contrib.auth.tests.remote_user import (RemoteUserTest,
     RemoteUserNoCreateTest, RemoteUserCustomTest)
 from django.contrib.auth.tests.management import GetDefaultUsernameTestCase
-from django.contrib.auth.tests.models import ProfileTestCase
+from django.contrib.auth.tests.models import ProfileTestCase, UserManagerTestCase
 from django.contrib.auth.tests.signals import SignalTestCase
 from django.contrib.auth.tests.tokens import TokenGeneratorTest
 from django.contrib.auth.tests.views import (PasswordResetTest,
Index: django/contrib/auth/tests/models.py
===================================================================
--- django/contrib/auth/tests/models.py	(revision 16594)
+++ django/contrib/auth/tests/models.py	(working copy)
@@ -33,3 +33,22 @@
         # module that doesn't exist
         settings.AUTH_PROFILE_MODULE = 'foo.bar'
         self.assertRaises(SiteProfileNotAvailable, user.get_profile)
+
+
+class UserManagerTestCase(TestCase):
+    def setUp(self):
+        User.objects.create_user('active1', 'active1@example.com', 'active1')
+        User.objects.create_user('active2', 'active2@example.com', 'active2')
+
+        User.objects.create_user('inactive1', 'inactive1@example.com', 'inactive1')
+        User.objects.create_user('inactive2', 'inactive2@example.com', 'inactive2')
+        User.objects.create_user('inactive3', 'inactive3@example.com', 'inactive3')
+
+        User.objects.filter(username__startswith='inactive').update(is_active=False)
+
+    def test_active_inactive_methods(self):
+        active_usernames = list(User.objects.active().order_by('username').values_list('username', flat=True))
+        self.assertEqual([u'active1', u'active2'], active_usernames)
+
+        inactive_usernames = list(User.objects.inactive().order_by('username').values_list('username', flat=True))
+        self.assertEqual([u'inactive1', u'inactive2', u'inactive3'], inactive_usernames)
Index: django/contrib/auth/models.py
===================================================================
--- django/contrib/auth/models.py	(revision 16594)
+++ django/contrib/auth/models.py	(working copy)
@@ -128,7 +128,13 @@
         # that look like it -- just to avoid confusion.
         return get_random_string(length, allowed_chars)
 
+    def active(self):
+        return self.filter(is_active=True)
 
+    def inactive(self):
+        return self.filter(is_active=False)
+
+
 # A few helper functions for common logic between User and AnonymousUser.
 def _user_get_all_permissions(user, obj):
     permissions = set()
Index: django/contrib/auth/forms.py
===================================================================
--- django/contrib/auth/forms.py	(revision 16594)
+++ django/contrib/auth/forms.py	(working copy)
@@ -116,9 +116,7 @@
         Validates that an active user exists with the given email address.
         """
         email = self.cleaned_data["email"]
-        self.users_cache = User.objects.filter(
-                                email__iexact=email,
-                                is_active=True)
+        self.users_cache = User.objects.active().filter(email__iexact=email)
         if not len(self.users_cache):
             raise forms.ValidationError(_("That e-mail address doesn't have an associated user account. Are you sure you've registered?"))
         if any((user.password == UNUSABLE_PASSWORD) for user in self.users_cache):
