diff --git a/django/http/__init__.py b/django/http/__init__.py
index 74a5afa..de71f68 100644
--- a/django/http/__init__.py
+++ b/django/http/__init__.py
@@ -257,7 +257,7 @@ class HttpRequest(object):
 
     def _load_post_and_files(self):
         # Populates self._post and self._files
-        if self.method != 'POST':
+        if self.method not in ('POST', 'PUT'):
             self._post, self._files = QueryDict('', encoding=self._encoding), MultiValueDict()
             return
         if self._read_started:
diff --git a/django/test/client.py b/django/test/client.py
index dd0d811..e5e7f0e 100644
--- a/django/test/client.py
+++ b/django/test/client.py
@@ -214,7 +214,7 @@ class RequestFactory(object):
         else:
             return urllib.unquote(parsed[2])
 
-    def get(self, path, data={}, **extra):
+    def _getlike_request(self, method, path, data={}, **extra):
         "Construct a GET request"
 
         parsed = urlparse(path)
@@ -222,16 +222,25 @@ class RequestFactory(object):
             'CONTENT_TYPE':    'text/html; charset=utf-8',
             'PATH_INFO':       self._get_path(parsed),
             'QUERY_STRING':    urlencode(data, doseq=True) or parsed[4],
-            'REQUEST_METHOD': 'GET',
+            'REQUEST_METHOD':  method,
             'wsgi.input':      FakePayload('')
         }
         r.update(extra)
         return self.request(**r)
 
-    def post(self, path, data={}, content_type=MULTIPART_CONTENT,
-             **extra):
-        "Construct a POST request."
+    def get(self, *args, **kwargs):
+        return self._getlike_request("GET", *args, **kwargs)
+
+    def head(self, *args, **kwargs):
+        return self._getlike_request("HEAD", *args, **kwargs)
+
+    def options(self, *args, **kwargs):
+        return self._getlike_request("OPTIONS", *args, **kwargs)
+
+    def delete(self, *args, **kwargs):
+        return self._getlike_request("DELETE", *args, **kwargs)
 
+    def _postlike_request(self, method, path, data={}, content_type=MULTIPART_CONTENT, **extra):
         if content_type is MULTIPART_CONTENT:
             post_data = encode_multipart(BOUNDARY, data)
         else:
@@ -249,78 +258,17 @@ class RequestFactory(object):
             'CONTENT_TYPE':   content_type,
             'PATH_INFO':      self._get_path(parsed),
             'QUERY_STRING':   parsed[4],
-            'REQUEST_METHOD': 'POST',
-            'wsgi.input':     FakePayload(post_data),
-        }
-        r.update(extra)
-        return self.request(**r)
-
-    def head(self, path, data={}, **extra):
-        "Construct a HEAD request."
-
-        parsed = urlparse(path)
-        r = {
-            'CONTENT_TYPE':    'text/html; charset=utf-8',
-            'PATH_INFO':       self._get_path(parsed),
-            'QUERY_STRING':    urlencode(data, doseq=True) or parsed[4],
-            'REQUEST_METHOD': 'HEAD',
-            'wsgi.input':      FakePayload('')
-        }
-        r.update(extra)
-        return self.request(**r)
-
-    def options(self, path, data={}, **extra):
-        "Constrict an OPTIONS request"
-
-        parsed = urlparse(path)
-        r = {
-            'PATH_INFO':       self._get_path(parsed),
-            'QUERY_STRING':    urlencode(data, doseq=True) or parsed[4],
-            'REQUEST_METHOD': 'OPTIONS',
-            'wsgi.input':      FakePayload('')
-        }
-        r.update(extra)
-        return self.request(**r)
-
-    def put(self, path, data={}, content_type=MULTIPART_CONTENT,
-            **extra):
-        "Construct a PUT request."
-
-        if content_type is MULTIPART_CONTENT:
-            post_data = encode_multipart(BOUNDARY, data)
-        else:
-            post_data = data
-
-        # Make `data` into a querystring only if it's not already a string. If
-        # it is a string, we'll assume that the caller has already encoded it.
-        query_string = None
-        if not isinstance(data, basestring):
-            query_string = urlencode(data, doseq=True)
-
-        parsed = urlparse(path)
-        r = {
-            'CONTENT_LENGTH': len(post_data),
-            'CONTENT_TYPE':   content_type,
-            'PATH_INFO':      self._get_path(parsed),
-            'QUERY_STRING':   query_string or parsed[4],
-            'REQUEST_METHOD': 'PUT',
+            'REQUEST_METHOD': method,
             'wsgi.input':     FakePayload(post_data),
         }
         r.update(extra)
         return self.request(**r)
 
-    def delete(self, path, data={}, **extra):
-        "Construct a DELETE request."
+    def post(self, *args, **kwargs):
+        return self._postlike_request("POST", *args, **kwargs)
 
-        parsed = urlparse(path)
-        r = {
-            'PATH_INFO':       self._get_path(parsed),
-            'QUERY_STRING':    urlencode(data, doseq=True) or parsed[4],
-            'REQUEST_METHOD': 'DELETE',
-            'wsgi.input':      FakePayload('')
-        }
-        r.update(extra)
-        return self.request(**r)
+    def put(self, *args, **kwargs):
+        return self._postlike_request("PUT", *args, **kwargs)
 
 
 class Client(RequestFactory):
diff --git a/tests/modeltests/test_client/models.py b/tests/modeltests/test_client/models.py
index 0960929..a4789fb 100644
--- a/tests/modeltests/test_client/models.py
+++ b/tests/modeltests/test_client/models.py
@@ -23,6 +23,7 @@ rather than the HTML rendered to the end-user.
 from django.conf import settings
 from django.core import mail
 from django.test import Client, TestCase, RequestFactory
+from django.utils import unittest
 
 from views import get_view
 
@@ -445,6 +446,7 @@ class ClientTest(TestCase):
         self.assertEqual(mail.outbox[1].to[0], 'second@example.com')
         self.assertEqual(mail.outbox[1].to[1], 'third@example.com')
 
+
 class CSRFEnabledClientTests(TestCase):
     def setUp(self):
         # Enable the CSRF middleware for this test
@@ -487,4 +489,4 @@ class RequestFactoryTest(TestCase):
         response = get_view(request)
 
         self.assertEqual(response.status_code, 200)
-        self.assertContains(response, 'This is a test')
+        self.assertContains(response, 'This is a test')
\ No newline at end of file
diff --git a/tests/regressiontests/generic_views/edit.py b/tests/regressiontests/generic_views/edit.py
index 923578d..9fdfe83 100644
--- a/tests/regressiontests/generic_views/edit.py
+++ b/tests/regressiontests/generic_views/edit.py
@@ -111,7 +111,6 @@ class UpdateViewTests(TestCase):
         self.assertRedirects(res, 'http://testserver/list/authors/')
         self.assertQuerysetEqual(Author.objects.all(), ['<Author: Randall Munroe (xkcd)>'])
 
-    @expectedFailure
     def test_update_put(self):
         a = Author.objects.create(
             name='Randall Munroe',
diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py
index 8f39961..9ebf3d2 100644
--- a/tests/regressiontests/test_client_regress/models.py
+++ b/tests/regressiontests/test_client_regress/models.py
@@ -744,7 +744,7 @@ class RequestMethodStringDataTests(TestCase):
 
 class QueryStringTests(TestCase):
     def test_get_like_requests(self):
-        for method_name in ('get','head','options','put','delete'):
+        for method_name in ('get','head','options','delete'):
             # A GET-like request can pass a query string as data
             method = getattr(self.client, method_name)
             response = method("/test_client_regress/request_data/", data={'foo':'whiz'})
@@ -768,30 +768,32 @@ class QueryStringTests(TestCase):
             self.assertEqual(response.context['request-bar'], 'bang')
 
     def test_post_like_requests(self):
-        # A POST-like request can pass a query string as data
-        response = self.client.post("/test_client_regress/request_data/", data={'foo':'whiz'})
-        self.assertEqual(response.context['get-foo'], None)
-        self.assertEqual(response.context['post-foo'], 'whiz')
+        for method_name in ('post', 'put'):
+            # A POST-like request can pass a query string as data
+            method = getattr(self.client, method_name)
+            response = method("/test_client_regress/request_data/", data={'foo':'whiz'})
+            self.assertEqual(response.context['get-foo'], None)
+            self.assertEqual(response.context['post-foo'], 'whiz')
 
-        # A POST-like request can pass a query string as part of the URL
-        response = self.client.post("/test_client_regress/request_data/?foo=whiz")
-        self.assertEqual(response.context['get-foo'], 'whiz')
-        self.assertEqual(response.context['post-foo'], None)
-        self.assertEqual(response.context['request-foo'], 'whiz')
+            # A POST-like request can pass a query string as part of the URL
+            response = method("/test_client_regress/request_data/?foo=whiz")
+            self.assertEqual(response.context['get-foo'], 'whiz')
+            self.assertEqual(response.context['post-foo'], None)
+            self.assertEqual(response.context['request-foo'], 'whiz')
 
-        # POST data provided in the URL augments actual form data
-        response = self.client.post("/test_client_regress/request_data/?foo=whiz", data={'foo':'bang'})
-        self.assertEqual(response.context['get-foo'], 'whiz')
-        self.assertEqual(response.context['post-foo'], 'bang')
-        self.assertEqual(response.context['request-foo'], 'bang')
+            # POST data provided in the URL augments actual form data
+            response = method("/test_client_regress/request_data/?foo=whiz", data={'foo':'bang'})
+            self.assertEqual(response.context['get-foo'], 'whiz')
+            self.assertEqual(response.context['post-foo'], 'bang')
+            self.assertEqual(response.context['request-foo'], 'bang')
 
-        response = self.client.post("/test_client_regress/request_data/?foo=whiz", data={'bar':'bang'})
-        self.assertEqual(response.context['get-foo'], 'whiz')
-        self.assertEqual(response.context['get-bar'], None)
-        self.assertEqual(response.context['post-foo'], None)
-        self.assertEqual(response.context['post-bar'], 'bang')
-        self.assertEqual(response.context['request-foo'], 'whiz')
-        self.assertEqual(response.context['request-bar'], 'bang')
+            response = method("/test_client_regress/request_data/?foo=whiz", data={'bar':'bang'})
+            self.assertEqual(response.context['get-foo'], 'whiz')
+            self.assertEqual(response.context['get-bar'], None)
+            self.assertEqual(response.context['post-foo'], None)
+            self.assertEqual(response.context['post-bar'], 'bang')
+            self.assertEqual(response.context['request-foo'], 'whiz')
+            self.assertEqual(response.context['request-bar'], 'bang')
 
 class UnicodePayloadTests(TestCase):
     def test_simple_unicode_payload(self):
