diff --git a/django/views/generic/simple.py b/django/views/generic/simple.py
index 3b5309d..4c4ad6a 100644
--- a/django/views/generic/simple.py
+++ b/django/views/generic/simple.py
@@ -19,7 +19,7 @@ def direct_to_template(request, template, extra_context=None, mimetype=None, **k
 
 def redirect_to(request, url, permanent=True, **kwargs):
     """
-    Redirect to a given URL.
+    Redirect to a given URL, passing through the query string.
 
     The given url may contain dict-style string formatting, which will be
     interpolated against the params in the URL.  For example, to redirect from
@@ -34,6 +34,10 @@ def redirect_to(request, url, permanent=True, **kwargs):
     If the ``permanent`` argument is False, then the response will have a 302
     HTTP status code. Otherwise, the status code will be 301.
     """
+    query_string = request.META["QUERY_STRING"]
+    if query_string and url is not None:
+        url = "%s?%s" % (url, query_string)
+
     if url is not None:
         klass = permanent and HttpResponsePermanentRedirect or HttpResponseRedirect
         return klass(url % kwargs)
diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py
index 5d65092..adca836 100644
--- a/tests/regressiontests/test_client_regress/models.py
+++ b/tests/regressiontests/test_client_regress/models.py
@@ -204,7 +204,7 @@ class AssertRedirectsTests(TestCase):
         response = self.client.head('/test_client_regress/redirects/',
             {'nothing': 'to_send'}, follow=True)
         self.assertRedirects(response,
-            '/test_client_regress/no_template_view/', 301, 200)
+            '/test_client_regress/no_template_view/?nothing=to_send', 301, 200)
         self.assertEquals(len(response.redirect_chain), 3)
 
     def test_redirect_chain_options(self):
@@ -212,7 +212,7 @@ class AssertRedirectsTests(TestCase):
         response = self.client.options('/test_client_regress/redirects/',
             {'nothing': 'to_send'}, follow=True)
         self.assertRedirects(response,
-            '/test_client_regress/no_template_view/', 301, 200)
+            '/test_client_regress/no_template_view/?nothing=to_send', 301, 200)
         self.assertEquals(len(response.redirect_chain), 3)
 
     def test_redirect_chain_put(self):
@@ -220,7 +220,7 @@ class AssertRedirectsTests(TestCase):
         response = self.client.put('/test_client_regress/redirects/',
             {'nothing': 'to_send'}, follow=True)
         self.assertRedirects(response,
-            '/test_client_regress/no_template_view/', 301, 200)
+            '/test_client_regress/no_template_view/?nothing=to_send', 301, 200)
         self.assertEquals(len(response.redirect_chain), 3)
 
     def test_redirect_chain_delete(self):
@@ -228,7 +228,7 @@ class AssertRedirectsTests(TestCase):
         response = self.client.delete('/test_client_regress/redirects/',
             {'nothing': 'to_send'}, follow=True)
         self.assertRedirects(response,
-            '/test_client_regress/no_template_view/', 301, 200)
+            '/test_client_regress/no_template_view/?nothing=to_send', 301, 200)
         self.assertEquals(len(response.redirect_chain), 3)
 
     def test_redirect_chain_on_non_redirect_page(self):
diff --git a/tests/regressiontests/views/tests/__init__.py b/tests/regressiontests/views/tests/__init__.py
index 9964cd5..12863ae 100644
--- a/tests/regressiontests/views/tests/__init__.py
+++ b/tests/regressiontests/views/tests/__init__.py
@@ -3,3 +3,5 @@ from i18n import *
 from static import *
 from generic.date_based import *
 from generic.create_update import *
+from generic.simple import *
+
diff --git a/tests/regressiontests/views/tests/generic/simple.py b/tests/regressiontests/views/tests/generic/simple.py
new file mode 100644
index 0000000..3b3ff79
--- /dev/null
+++ b/tests/regressiontests/views/tests/generic/simple.py
@@ -0,0 +1,33 @@
+# coding: utf-8
+
+from django.test import TestCase
+
+class RedirectToTest(TestCase):
+    def test_redirect_to_returns_permanent_redirect(self):
+        "simple.redirect_to returns a permanent redirect (301) by default"
+        response = self.client.get('/views/simple/redirect_to/')
+        self.assertEqual(response.status_code, 301)
+        self.assertEqual('http://testserver/views/simple/target/', response['Location'])
+
+    def test_redirect_to_can_return_a_temporary_redirect(self):
+        "simple.redirect_to returns a temporary redirect (302) when explicitely asked to"
+        response = self.client.get('/views/simple/redirect_to_temp/')
+        self.assertEqual(response.status_code, 302)
+        self.assertEqual('http://testserver/views/simple/target/', response['Location'])
+
+    def test_redirect_to_on_empty_url_returns_gone(self):
+        "simple.redirect_to returns resource gone (410) when given a None url"
+        response = self.client.get('/views/simple/redirect_to_none/')
+        self.assertEqual(response.status_code, 410)
+
+    def test_redirect_to_allows_formatted_url_string(self):
+        "simple.redirect_to uses string interpolation on target url for keyword args"
+        response = self.client.get('/views/simple/redirect_to_arg/42/')
+        self.assertEqual(response.status_code, 301)
+        self.assertEqual('http://testserver/views/simple/target_arg/42/', response['Location'])
+
+    def test_redirect_to_passes_on_query_parameters(self):
+        "simple.redirect_to passes on any GET parameters to the target url"
+        response = self.client.get('/views/simple/redirect_to/?param1=foo&param2=bar')
+        self.assertEqual(response.status_code, 301)
+        self.assertEqual('http://testserver/views/simple/target/?param1=foo&param2=bar', response['Location'])
diff --git a/tests/regressiontests/views/urls.py b/tests/regressiontests/views/urls.py
index 6403ab3..246903b 100644
--- a/tests/regressiontests/views/urls.py
+++ b/tests/regressiontests/views/urls.py
@@ -82,3 +82,12 @@ urlpatterns += patterns('django.views.generic.create_update',
     (r'^create_update/no_url/update/article/(?P<slug>[-\w]+)/$',
         'update_object', dict(slug_field='slug', model=UrlArticle)),
 )
+
+# simple generic views.
+
+urlpatterns += patterns('django.views.generic.simple',
+    (r'^simple/redirect_to/$', 'redirect_to', dict(url='/views/simple/target/')),
+    (r'^simple/redirect_to_temp/$', 'redirect_to', dict(url='/views/simple/target/', permanent=False)),
+    (r'^simple/redirect_to_none/$', 'redirect_to', dict(url=None)),
+    (r'^simple/redirect_to_arg/(?P<id>\d+)/$', 'redirect_to', dict(url='/views/simple/target_arg/%(id)s/')),
+)
