diff --git a/django/contrib/sites/models.py b/django/contrib/sites/models.py
index fecbff7..d5419f9 100644
--- a/django/contrib/sites/models.py
+++ b/django/contrib/sites/models.py
@@ -1,8 +1,6 @@
 from django.db import models
 from django.utils.translation import ugettext_lazy as _
-
-
-SITE_CACHE = {}
+from django.core.cache import cache
 
 
 class SiteManager(models.Manager):
@@ -19,17 +17,17 @@ class SiteManager(models.Manager):
         except AttributeError:
             from django.core.exceptions import ImproperlyConfigured
             raise ImproperlyConfigured("You're using the Django \"sites framework\" without having set the SITE_ID setting. Create a site in your database and set the SITE_ID setting to fix this error.")
-        try:
-            current_site = SITE_CACHE[sid]
-        except KeyError:
+
+        current_site = cache.get('site-cache-%s' % sid)
+        if current_site is None:
             current_site = self.get(pk=sid)
-            SITE_CACHE[sid] = current_site
+            cache.set('site-cache-%s' % sid, current_site)
         return current_site
 
     def clear_cache(self):
         """Clears the ``Site`` object cache."""
-        global SITE_CACHE
-        SITE_CACHE = {}
+        for s in self.all():
+            cache.delete('site-cache-%s' % s.id)
 
 
 class Site(models.Model):
@@ -50,16 +48,12 @@ class Site(models.Model):
     def save(self, *args, **kwargs):
         super(Site, self).save(*args, **kwargs)
         # Cached information will likely be incorrect now.
-        if self.id in SITE_CACHE:
-            del SITE_CACHE[self.id]
+        cache.delete('site-cache-%s' % self.id)
 
     def delete(self):
         pk = self.pk
         super(Site, self).delete()
-        try:
-            del SITE_CACHE[pk]
-        except KeyError:
-            pass
+        cache.delete('site-cache-%s' % self.id)
 
 
 class RequestSite(object):
diff --git a/docs/ref/contrib/sites.txt b/docs/ref/contrib/sites.txt
index 8fc434b..7762eac 100644
--- a/docs/ref/contrib/sites.txt
+++ b/docs/ref/contrib/sites.txt
@@ -178,6 +178,8 @@ fallback for cases where it is not installed.
     :class:`~django.contrib.sites.models.RequestSite` object based on
     the request.
 
+Note: ``get_current_site()`` and :attr:`~Site.objects.get_current()` use the cache backend specified in your CACHE_BACKEND setting.
+
 Getting the current domain for display
 --------------------------------------
 
diff --git a/tests/regressiontests/sites_framework/tests.py b/tests/regressiontests/sites_framework/tests.py
index 8e664fd..ee0f277 100644
--- a/tests/regressiontests/sites_framework/tests.py
+++ b/tests/regressiontests/sites_framework/tests.py
@@ -1,5 +1,8 @@
 from __future__ import absolute_import
 
+import time
+from multiprocessing import Process, Queue, Value
+
 from django.conf import settings
 from django.contrib.sites.models import Site
 from django.test import TestCase
@@ -36,3 +39,48 @@ class SitesFrameworkTestCase(TestCase):
     def test_invalid_field_type(self):
         article = ConfusedArticle.objects.create(title="More Bad News!", site=settings.SITE_ID)
         self.assertRaises(TypeError, ConfusedArticle.on_site.all)
+
+    def test_multiprocess(self):
+        def check_if_domain_changed(phase, domain_changed):
+            from django.contrib.sites.models import Site
+
+            # first phase - get domain
+            site = Site.objects.get_current()
+            first_try = site.domain
+            phase.value = 2
+
+            # second phase - wait
+            while phase.value == 2:
+                pass
+
+            # third phase - again get domain
+            s2 = Site.objects.get_current()
+            second_try = s2.domain
+
+            # compare domains
+            domain_changed.value = (first_try != second_try)
+
+        def change_domain(phase):
+            from django.contrib.sites.models import Site
+
+            # first phase - wait
+            while phase.value == 1:
+                pass
+
+            # second phase
+            site = Site.objects.get_current()
+            site.domain = site.domain+'_changed'
+            site.save()
+            phase.value = 3
+
+        phase = Value('i', 1)
+        domain_changed = Value('b', False)
+        first_process = Process(target=check_if_domain_changed, args=(phase, domain_changed))
+        second_process = Process(target=change_domain, args=(phase,))
+
+        first_process.start()
+        second_process.start()
+        first_process.join()
+        second_process.join()
+
+        self.assertTrue(domain_changed.value)
