diff --git a/django/contrib/auth/models.py b/django/contrib/auth/models.py
index 8064a4e..51ebd41 100644
--- a/django/contrib/auth/models.py
+++ b/django/contrib/auth/models.py
@@ -116,21 +116,29 @@ class Group(models.Model):
 
 
 class UserManager(models.Manager):
-    def create_user(self, username, email=None, password=None):
+
+    @staticmethod
+    def normalize_email(email):
         """
-        Creates and saves a User with the given username, email and password.
+        Normalize the address by lowercasing the domain part of the email
+        address.
         """
-        now = timezone.now()
-
-        # Normalize the address by lowercasing the domain part of the email
-        # address.
         email = email or ''
         try:
-            email_name, domain_part = email.strip().split('@', 1)
+            email_name, domain_part = email.strip().rsplit('@', 1)
         except ValueError:
             pass
         else:
             email = '@'.join([email_name, domain_part.lower()])
+        return email
+
+    def create_user(self, username, email=None, password=None):
+        """
+        Creates and saves a User with the given username, email and password.
+        """
+        now = timezone.now()
+
+        email = UserManager.normalize_email(email)
 
         user = self.model(username=username, email=email, is_staff=False,
                          is_active=True, is_superuser=False, last_login=now,
diff --git a/django/contrib/auth/tests/__init__.py b/django/contrib/auth/tests/__init__.py
index 883e4c9..6bb6e68 100644
--- a/django/contrib/auth/tests/__init__.py
+++ b/django/contrib/auth/tests/__init__.py
@@ -10,12 +10,12 @@ from django.contrib.auth.tests.forms import (UserCreationFormTest,
 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.hashers import TestUtilsHashPass
 from django.contrib.auth.tests.signals import SignalTestCase
 from django.contrib.auth.tests.tokens import TokenGeneratorTest
-from django.contrib.auth.tests.views import (AuthViewNamedURLTests, 
-    PasswordResetTest, ChangePasswordTest, LoginTest, LogoutTest, 
+from django.contrib.auth.tests.views import (AuthViewNamedURLTests,
+    PasswordResetTest, ChangePasswordTest, LoginTest, LogoutTest,
     LoginURLSettings)
 
 # The password for the fixture data users is 'password'
diff --git a/django/contrib/auth/tests/models.py b/django/contrib/auth/tests/models.py
index 754c6db..52e44c6 100644
--- a/django/contrib/auth/tests/models.py
+++ b/django/contrib/auth/tests/models.py
@@ -1,9 +1,11 @@
 from django.conf import settings
 from django.test import TestCase
-from django.contrib.auth.models import User, SiteProfileNotAvailable
+from django.contrib.auth.models import User, SiteProfileNotAvailable, UserManager
+
 
 class ProfileTestCase(TestCase):
     fixtures = ['authtestdata.json']
+
     def setUp(self):
         """Backs up the AUTH_PROFILE_MODULE"""
         self.old_AUTH_PROFILE_MODULE = getattr(settings,
@@ -26,10 +28,38 @@ class ProfileTestCase(TestCase):
         user = User.objects.get(username='testclient')
         self.assertRaises(SiteProfileNotAvailable, user.get_profile)
 
-        # Bad syntax in AUTH_PROFILE_MODULE: 
+        # Bad syntax in AUTH_PROFILE_MODULE:
         settings.AUTH_PROFILE_MODULE = 'foobar'
         self.assertRaises(SiteProfileNotAvailable, user.get_profile)
 
         # module that doesn't exist
         settings.AUTH_PROFILE_MODULE = 'foo.bar'
         self.assertRaises(SiteProfileNotAvailable, user.get_profile)
+
+
+class UserManagerTestCase(TestCase):
+
+    def setUp(self):
+        self.manager = UserManager()
+        self.manager.contribute_to_class(User, 'name')
+
+    def test_create_user(self):
+        email_lowercase = 'normal@normal.com'
+        user = self.manager.create_user('user', email_lowercase)
+        self.assertEquals(user.email, email_lowercase)
+        self.assertEquals(user.username, 'user')
+        self.assertEquals(user.password, '!')
+
+    def test_create_user_email_domain_normalize_rfc3696(self):
+        # According to  http://tools.ietf.org/html/rfc3696#section-3
+        # the "@" symbol can be part of the local part of an email address
+        returned = UserManager.normalize_email(r'Abc\@DEF@EXAMPLE.com')
+        self.assertEquals(returned, r'Abc\@DEF@example.com')
+
+    def test_create_user_email_domain_normalize(self):
+        returned = UserManager.normalize_email('normal@DOMAIN.COM')
+        self.assertEquals(returned, 'normal@domain.com')
+
+    def test_create_user_email_domain_normalize_with_whitespace(self):
+        returned = UserManager.normalize_email('email\ with_whitespace@D.COM')
+        self.assertEquals(returned, 'email\ with_whitespace@d.com')
