diff --git a/django/test/client.py b/django/test/client.py
index bbd8239..4e76335 100644
--- a/django/test/client.py
+++ b/django/test/client.py
@@ -205,7 +205,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,
@@ -216,9 +216,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]:
+                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:
@@ -235,7 +244,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]:
+                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 7705380..0e941d9 100644
--- a/docs/testing.txt
+++ b/docs/testing.txt
@@ -453,7 +453,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.
 
@@ -467,7 +467,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.
 
@@ -516,6 +519,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 b5d9ae6..6f3f4ac 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 e771707..5d93b2c 100644
--- a/tests/regressiontests/test_client_regress/urls.py
+++ b/tests/regressiontests/test_client_regress/urls.py
@@ -1,9 +1,13 @@
 from django.conf.urls.defaults import *
+from django.views.generic.simple import redirect_to
 import views
 
 urlpatterns = patterns('',
     (r'^no_template_view/$', views.no_template_view),
     (r'^file_upload/$', views.file_upload_view),
     (r'^get_view/$', views.get_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/'}),
 )
