diff --git a/django/template/__init__.py b/django/template/__init__.py
index c316786..60cbc03 100644
--- a/django/template/__init__.py
+++ b/django/template/__init__.py
@@ -54,6 +54,7 @@ from inspect import getargspec
 
 from django.conf import settings
 from django.template.context import Context, RequestContext, ContextPopException
+from django.template.signals import template_rendered
 from django.utils.importlib import import_module
 from django.utils.itercompat import is_iterable
 from django.utils.functional import curry, Promise
@@ -148,6 +149,8 @@ class StringOrigin(Origin):
         return self.source
 
 class Template(object):
+    send_rendered_signal = settings.TEMPLATE_DEBUG
+
     def __init__(self, template_string, origin=None, name='<Unknown Template>'):
         try:
             template_string = smart_unicode(template_string)
@@ -164,6 +167,8 @@ class Template(object):
                 yield subnode
 
     def _render(self, context):
+        if self.send_rendered_signal:
+            template_rendered.send(sender=self, template=self, context=context)
         return self.nodelist.render(context)
 
     def render(self, context):
diff --git a/django/template/signals.py b/django/template/signals.py
new file mode 100644
index 0000000..a328a77
--- /dev/null
+++ b/django/template/signals.py
@@ -0,0 +1,3 @@
+from django.dispatch import Signal
+
+template_rendered = Signal(providing_args=["template", "context"])
diff --git a/django/test/client.py b/django/test/client.py
index 08e3ff6..3251275 100644
--- a/django/test/client.py
+++ b/django/test/client.py
@@ -16,7 +16,7 @@ from django.core.handlers.wsgi import WSGIRequest
 from django.core.signals import got_request_exception
 from django.http import SimpleCookie, HttpRequest, QueryDict
 from django.template import TemplateDoesNotExist
-from django.test import signals
+from django.template import signals
 from django.utils.functional import curry
 from django.utils.encoding import smart_str
 from django.utils.http import urlencode
diff --git a/django/test/signals.py b/django/test/signals.py
deleted file mode 100644
index a328a77..0000000
--- a/django/test/signals.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.dispatch import Signal
-
-template_rendered = Signal(providing_args=["template", "context"])
diff --git a/django/test/utils.py b/django/test/utils.py
index 8ecb5a0..7dda41f 100644
--- a/django/test/utils.py
+++ b/django/test/utils.py
@@ -4,7 +4,6 @@ import os
 from django.conf import settings
 from django.core import mail
 from django.core.mail.backends import locmem
-from django.test import signals
 from django.template import Template
 from django.utils.translation import deactivate
 
@@ -43,14 +42,6 @@ class ContextList(list):
             return False
         return True
 
-def instrumented_test_render(self, context):
-    """
-    An instrumented Template render method, providing a signal
-    that can be intercepted by the test system Client
-    """
-    signals.template_rendered.send(sender=self, template=self, context=context)
-    return self.nodelist.render(context)
-
 
 def setup_test_environment():
     """Perform any global pre-test setup. This involves:
@@ -59,8 +50,8 @@ def setup_test_environment():
         - Set the email backend to the locmem email backend.
         - Setting the active locale to match the LANGUAGE_CODE setting.
     """
-    Template.original_render = Template._render
-    Template._render = instrumented_test_render
+    Template._original_send_rendered_signal = Template.send_rendered_signal
+    Template.send_rendered_signal = True
 
     mail.original_SMTPConnection = mail.SMTPConnection
     mail.SMTPConnection = locmem.EmailBackend
@@ -79,8 +70,8 @@ def teardown_test_environment():
         - Restoring the email sending functions
 
     """
-    Template._render = Template.original_render
-    del Template.original_render
+    Template.send_rendered_signal = Template._original_send_rendered_signal
+    del Template._original_send_rendered_signal
 
     mail.SMTPConnection = mail.original_SMTPConnection
     del mail.original_SMTPConnection
diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py
index bbbcae3..ff049f1 100644
--- a/tests/regressiontests/templates/tests.py
+++ b/tests/regressiontests/templates/tests.py
@@ -16,6 +16,7 @@ import unittest
 from django import template
 from django.core import urlresolvers
 from django.template import loader
+from django.template.signals import template_rendered
 from django.template.loaders import app_directories, filesystem, cached
 from django.utils.translation import activate, deactivate, ugettext as _
 from django.utils.safestring import mark_safe
@@ -1389,5 +1390,41 @@ class TemplateTagLoading(unittest.TestCase):
         settings.INSTALLED_APPS = ('tagsegg',)
         t = template.Template(ttext)
 
+
+class TemplateSignalTests(unittest.TestCase):
+    def setUp(self):
+        self._old_send = template.Template.send_rendered_signal
+
+        self.received = []
+        def _handle_signal(signal, sender, template, context, **kwargs):
+            self.received.append((template, context))
+        template_rendered.connect(_handle_signal, weak=False, dispatch_uid='test-template-rendered')
+
+    def tearDown(self):
+        template_rendered.disconnect(dispatch_uid='test-template-rendered')
+
+        template.Template.send_rendered_signal = self._old_send
+
+    def test_template_rendered_signal_on(self):
+        "If Template.send_rendered_signal is True, template-rendering sends a template_rendered signal."
+        template.Template.send_rendered_signal = True
+
+        t = template.Template("{{ stuff }}")
+        c = template.Context({'stuff': 'something'})
+        t.render(c)
+
+        self.assertEqual(self.received, [(t, c)])
+
+    def test_template_rendered_signal_off(self):
+        "If Template.send_rendered_signal is False, template-rendering does not send template_rendered signal."
+        template.Template.send_rendered_signal = False
+
+        t = template.Template("{{ stuff }}")
+        c = template.Context({'stuff': 'something'})
+        t.render(c)
+
+        self.assertEqual(self.received, [])
+
+
 if __name__ == "__main__":
     unittest.main()
