diff --git a/django/test/client.py b/django/test/client.py
index bac28f7..f48560a 100644
--- a/django/test/client.py
+++ b/django/test/client.py
@@ -204,7 +204,7 @@ class Client:
 
         return response
 
-    def get(self, path, data={}, **extra):
+    def get(self, path, data={}, follow=False, **extra):
         "Request a response from the server using GET."
         r = {
             'CONTENT_LENGTH':  None,
@@ -215,9 +215,18 @@ class Client:
         }
         r.update(extra)
 
-        return self.request(**r)
+        response = self.request(**r)
+        if follow:
+            responses = [response]
+            if response.status_code in [301, 302, 303, 307]:
+                new_url = response['Location'][17:]  # Strip the "http://testserver"
+                responses = responses + self.get(new_url, {}, True)
+            return responses
+        else:
+            return response
 
-    def post(self, path, data={}, content_type=MULTIPART_CONTENT, **extra):
+    def post(self, path, data={}, content_type=MULTIPART_CONTENT,
+            follow=False, **extra):
         "Request a response from the server using POST."
 
         if content_type is MULTIPART_CONTENT:
@@ -234,7 +243,15 @@ class Client:
         }
         r.update(extra)
 
-        return self.request(**r)
+        response = self.request(**r)
+        if follow:
+            responses = [response]
+            if response.status_code in [301, 302, 303, 307]:
+                new_url = response['Location'][17:]  # Strip the "http://testserver"
+                responses = responses + self.get(new_url, {}, True)
+            return responses
+        else:
+            return response
 
     def login(self, **credentials):
         """Set the Client to appear as if it has sucessfully logged into a site.
diff --git a/docs/testing.txt b/docs/testing.txt
index 0ff3cce..e2cef77 100644
--- a/docs/testing.txt
+++ b/docs/testing.txt
@@ -460,7 +460,7 @@ arguments at time of construction::
 
 Once you have a ``Client`` instance, you can call any of the following methods:
 
-``get(path, data={})``
+``get(path, data={}, follow=False)``
     Makes a GET request on the provided ``path`` and returns a ``Response``
     object, which is documented below.
 
@@ -474,7 +474,10 @@ Once you have a ``Client`` instance, you can call any of the following methods:
 
         /customers/details/?name=fred&age=7
 
-``post(path, data={}, content_type=MULTIPART_CONTENT)``
+    If you set ``follow`` to ``True`` the client will follow any redirects
+    and return an array containing all the responses obtained.
+
+``post(path, data={}, content_type=MULTIPART_CONTENT, follow=False)``
     Makes a POST request on the provided ``path`` and returns a ``Response``
     object, which is documented below.
 
@@ -523,6 +526,9 @@ Once you have a ``Client`` instance, you can call any of the following methods:
     Note that you should manually close the file after it has been provided to
     ``post()``.
 
+    If you set ``follow`` to ``True`` the client will follow any redirects
+    and return an array containing all the responses obtained.
+
 ``login(**credentials)``
     **New in Django development version**
 
diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py
index 305ccc9..45330c9 100644
--- a/tests/regressiontests/test_client_regress/models.py
+++ b/tests/regressiontests/test_client_regress/models.py
@@ -139,6 +139,24 @@ class AssertRedirectsTests(TestCase):
         except AssertionError, e:
             self.assertEquals(str(e), "Couldn't retrieve redirection page '/test_client/permanent_redirect_view/': response code was 301 (expected 200)")
 
+    def test_redirect_chain(self):
+        # First with GET
+        responses = self.client.get('/test_client_regress/redirects/', {}, True)
+        self.assertEquals(len(responses), 4)
+        self.assertRedirects(responses[0],
+            '/test_client_regress/redirects/further/', 301, 301)
+        self.assertRedirects(responses[1],
+            '/test_client_regress/redirects/further/more/', 301, 301)
+        self.assertRedirects(responses[2],
+            '/test_client_regress/redirects/further/more/end/', 301, 404)
+        
+        # Now with POST
+        responses = self.client.post('/test_client_regress/redirects/',
+            {'nothing': 'to_send'}, follow=True)
+        self.assertEquals(len(responses), 4)
+        self.assertRedirects(responses[0],
+            '/test_client_regress/redirects/further/', 301, 301)
+
 class AssertFormErrorTests(TestCase):
     def test_unknown_form(self):
         "An assertion is raised if the form name is unknown"
diff --git a/tests/regressiontests/test_client_regress/urls.py b/tests/regressiontests/test_client_regress/urls.py
index d3304ca..f70ca6a 100644
--- a/tests/regressiontests/test_client_regress/urls.py
+++ b/tests/regressiontests/test_client_regress/urls.py
@@ -1,4 +1,5 @@
 from django.conf.urls.defaults import *
+from django.views.generic.simple import redirect_to
 import views
 
 urlpatterns = patterns('',
@@ -6,5 +7,8 @@ urlpatterns = patterns('',
     (r'^file_upload/$', views.file_upload_view),
     (r'^get_view/$', views.get_view),
     url(r'^arg_view/(?P<name>.+)/$', views.view_with_argument, name='arg_view'),
-    (r'^login_protected_redirect_view/$', views.login_protected_redirect_view)
+    (r'^login_protected_redirect_view/$', views.login_protected_redirect_view),
+    (r'^redirects/$', redirect_to, {'url': 'further/'}),
+    (r'^redirects/further/$', redirect_to, {'url': 'more/'}),
+    (r'^redirects/further/more/$', redirect_to, {'url': 'end/'}),
 )
