Index: django/conf/global_settings.py
===================================================================
--- django/conf/global_settings.py	(revision 13350)
+++ django/conf/global_settings.py	(working copy)
@@ -190,6 +190,7 @@
 # only parameter and returns a dictionary to add to the context.
 TEMPLATE_CONTEXT_PROCESSORS = (
     'django.contrib.auth.context_processors.auth',
+    'django.contrib.sites.context_processors.site',
     'django.core.context_processors.debug',
     'django.core.context_processors.i18n',
     'django.core.context_processors.media',
Index: django/contrib/syndication/views.py
===================================================================
--- django/contrib/syndication/views.py	(revision 13350)
+++ django/contrib/syndication/views.py	(working copy)
@@ -133,11 +133,11 @@
 
         for item in self.__get_dynamic_attr('items', obj):
             if title_tmp is not None:
-                title = title_tmp.render(RequestContext(request, {'obj': item, 'site': current_site}))
+                title = title_tmp.render(RequestContext(request, {'obj': item}))
             else:
                 title = self.__get_dynamic_attr('item_title', item)
             if description_tmp is not None:
-                description = description_tmp.render(RequestContext(request, {'obj': item, 'site': current_site}))
+                description = description_tmp.render(RequestContext(request, {'obj': item}))
             else:
                 description = self.__get_dynamic_attr('item_description', item)
             link = add_domain(current_site.domain, self.__get_dynamic_attr('item_link', item))
Index: django/contrib/sites/tests/__init__.py
===================================================================
--- django/contrib/sites/tests/__init__.py	(revision 0)
+++ django/contrib/sites/tests/__init__.py	(revision 0)
@@ -0,0 +1,7 @@
+from django.contrib.sites.tests.basic import BASIC_TESTS
+from django.contrib.sites.tests.context_processors import ContextProcessorTest
+from django.contrib.sites.tests.context_processors import RequestSiteContextTest
+
+__test__ = {'BASIC_TESTS': BASIC_TESTS}
+            
+            
\ No newline at end of file
Index: django/contrib/sites/tests/basic.py
===================================================================
--- django/contrib/sites/tests/basic.py	(revision 0)
+++ django/contrib/sites/tests/basic.py	(working copy)
@@ -1,4 +1,4 @@
-"""
+BASIC_TESTS = """
 >>> from django.contrib.sites.models import Site
 >>> from django.conf import settings
 >>> Site(id=settings.SITE_ID, domain="example.com", name="example.com").save()
Index: django/contrib/sites/tests/urls.py
===================================================================
--- django/contrib/sites/tests/urls.py	(revision 0)
+++ django/contrib/sites/tests/urls.py	(revision 0)
@@ -0,0 +1,6 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+    (r'^context_processors/$', 'django.views.generic.simple.direct_to_template',
+     {'template': 'sites/context_processors_test.html'}),
+)
Index: django/contrib/sites/tests/context_processors.py
===================================================================
--- django/contrib/sites/tests/context_processors.py	(revision 0)
+++ django/contrib/sites/tests/context_processors.py	(revision 0)
@@ -0,0 +1,57 @@
+import os
+from django.test import TestCase
+from django.conf import settings
+from django.core.handlers.wsgi import WSGIRequest
+from django.contrib.sites import models as sites
+
+class ContextProcessorTest(TestCase):
+    urls = 'django.contrib.sites.tests.urls'
+    
+    def setUp(self):
+        self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
+        settings.TEMPLATE_DIRS = (
+            os.path.join(
+                os.path.dirname(__file__),
+                'templates'
+            )
+        ,)
+    
+    def tearDown(self):
+        settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
+    
+    def test_context_processor(self):
+        site_obj = sites.Site.objects.get_current()
+        response = self.client.get('/context_processors/')
+        self.assertEqual(response.status_code, 200)
+        self.assertContains(response, 'site.name: %s' % site_obj.name)
+        self.assertContains(response, 'site.domain: %s' % site_obj.domain)
+    
+class RequestSiteContextTest(TestCase):
+    urls = 'django.contrib.sites.tests.urls'
+    
+    def setUp(self):
+        self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
+        settings.TEMPLATE_DIRS = (
+            os.path.join(
+                os.path.dirname(__file__),
+                'templates'
+            )
+        ,)
+        self.old_INSTALLED_APPS = settings.INSTALLED_APPS
+        list_of_apps = list(settings.INSTALLED_APPS)
+        list_of_apps.remove('django.contrib.sites')
+        settings.INSTALLED_APPS = tuple(list_of_apps)
+
+    def tearDown(self):
+        settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
+        settings.INSTALLED_APPS = self.old_INSTALLED_APPS
+    
+    def test_context_processor_without_sites_framework(self):
+        response = self.client.get('/context_processors/', 
+                                   SERVER_NAME='localhost',
+                                   SERVER_PORT=31337)
+        site_obj = sites.RequestSite(WSGIRequest(response.request))
+        self.assertEqual(response.status_code, 200)
+        self.assertContains(response, 'site.name: %s' % site_obj.name)
+        self.assertContains(response, 'site.domain: %s' % site_obj.domain)
+        
\ No newline at end of file
Index: django/contrib/sites/tests/templates/sites/context_processors_test.html
===================================================================
--- django/contrib/sites/tests/templates/sites/context_processors_test.html	(revision 0)
+++ django/contrib/sites/tests/templates/sites/context_processors_test.html	(revision 0)
@@ -0,0 +1,2 @@
+site.name: {{ site.name }}
+site.domain: {{ site.domain }}
Index: django/contrib/sites/tests.py
===================================================================
--- django/contrib/sites/tests.py	(revision 13350)
+++ django/contrib/sites/tests.py	(working copy)
@@ -1,29 +0,0 @@
-"""
->>> from django.contrib.sites.models import Site
->>> from django.conf import settings
->>> Site(id=settings.SITE_ID, domain="example.com", name="example.com").save()
-
-# Make sure that get_current() does not return a deleted Site object.
->>> s = Site.objects.get_current()
->>> isinstance(s, Site)
-True
-
->>> s.delete()
->>> Site.objects.get_current()
-Traceback (most recent call last):
-...
-DoesNotExist: Site matching query does not exist.
-
-# After updating a Site object (e.g. via the admin), we shouldn't return a
-# bogus value from the SITE_CACHE.
->>> _ = Site.objects.create(id=settings.SITE_ID, domain="example.com", name="example.com")
->>> site = Site.objects.get_current()
->>> site.name
-u"example.com"
->>> s2 = Site.objects.get(id=settings.SITE_ID)
->>> s2.name = "Example site"
->>> s2.save()
->>> site = Site.objects.get_current()
->>> site.name
-u"Example site"
-"""
Index: django/contrib/sites/context_processors.py
===================================================================
--- django/contrib/sites/context_processors.py	(revision 0)
+++ django/contrib/sites/context_processors.py	(revision 0)
@@ -0,0 +1,17 @@
+from django.contrib.sites.models import Site, RequestSite
+from django.core.exceptions import ImproperlyConfigured
+from django.db import models
+
+def site(request):
+    """Sets in the present context information about the current site."""
+    # CurrentSiteManager already handles prevention of spurious database calls
+    # If the user does not have the Sites framework installed, for template
+    # purposes, which will be read-only, a RequestSite object is an appropriate
+    # fallback.
+    
+    try:
+        site_app = models.get_app('sites')
+        site_obj = Site.objects.get_current()
+    except ImproperlyConfigured:
+        site_obj = RequestSite(request)
+    return {'site': site_obj}
Index: django/contrib/auth/views.py
===================================================================
--- django/contrib/auth/views.py	(revision 13350)
+++ django/contrib/auth/views.py	(working copy)
@@ -62,7 +62,6 @@
     return render_to_response(template_name, {
         'form': form,
         redirect_field_name: redirect_to,
-        'site': current_site,
         'site_name': current_site.name,
     }, context_instance=RequestContext(request))
 
Index: docs/ref/contrib/sites.txt
===================================================================
--- docs/ref/contrib/sites.txt	(revision 13350)
+++ docs/ref/contrib/sites.txt	(working copy)
@@ -185,26 +185,32 @@
 lawrence.com alerts." On LJWorld.com, the e-mail has the subject "Thanks for
 subscribing to LJWorld.com alerts." Same goes for the e-mail's message body.
 
-Note that an even more flexible (but more heavyweight) way of doing this would
-be to use Django's template system. Assuming Lawrence.com and LJWorld.com have
-different template directories (:setting:`TEMPLATE_DIRS`), you could simply farm out
-to the template system like so::
+The current Site object is made available in the 
+:ref:`template context <ref-templates-api>` when you use
+:class:`~django.template.context.RequestContext` and when your
+:setting:`TEMPLATE_CONTEXT_PROCESSORS` setting contains
+``"django.contrib.sites.context_processors.site"``, which is default.
 
+Using template context, an even more flexible (but more heavyweight) way of 
+sending email-notifications would be to use Django's template system::
+
     from django.core.mail import send_mail
-    from django.template import loader, Context
+    from django.template import loader, RequestContext
 
     def register_for_newsletter(request):
         # Check form values, etc., and subscribe the user.
         # ...
 
-        subject = loader.get_template('alerts/subject.txt').render(Context({}))
-        message = loader.get_template('alerts/message.txt').render(Context({}))
+        subject_template = loader.get_template('alerts/subject.txt')
+        subject = subject_template.render(RequestContext(request, {}))
+        message_template = loader.get_template('alerts/message.txt')
+        message = message_template.render(RequestContext(request, {}))
         send_mail(subject, message, 'editor@ljworld.com', [user.email])
 
         # ...
 
 In this case, you'd have to create :file:`subject.txt` and :file:`message.txt` template
-files for both the LJWorld.com and Lawrence.com template directories. That
+files that include ``{{ site.name }}`` and ``{{ site.domain }}``. That
 gives you more flexibility, but it's also more complex.
 
 It's a good idea to exploit the :class:`~django.contrib.sites.models.Site`
@@ -358,11 +364,8 @@
   :class:`~django.contrib.flatpages.middleware.FlatpageFallbackMiddleware`
   checks the current :setting:`SITE_ID` in retrieving flatpages to display.
 
-* In the :mod:`syndication framework <django.contrib.syndication>`, the
-  templates for ``title`` and ``description`` automatically have access to a
-  variable ``{{ site }}``, which is the
-  :class:`~django.contrib.sites.models.Site` object representing the current
-  site. Also, the hook for providing item URLs will use the ``domain`` from
+* In the :mod:`syndication framework <django.contrib.syndication>`, the 
+  hook for providing item URLs will use the ``domain`` from
   the current :class:`~django.contrib.sites.models.Site` object if you don't
   specify a fully-qualified domain.
 
