diff --git a/oauth2/__init__.py b/oauth2/__init__.py
index 835270e3..228053da 100644
--- a/oauth2/__init__.py
+++ b/oauth2/__init__.py
@@ -32,7 +32,7 @@
 import httplib2
 
 try:
-    from urlparse import parse_qs
+    from urlparse import parse_qs, parse_qsl
     parse_qs # placate pyflakes
 except ImportError:
     # fall back for Python 2.5
@@ -402,7 +402,7 @@ def to_header(self, realm=''):
     def to_postdata(self):
         """Serialize as post data for a POST request."""
         d = {}
-        for k, v in self.iteritems():
+        for k, v in self.get_nonoauth_parameters().iteritems():
             d[k.encode('utf-8')] = to_utf8_optional_iterator(v)
 
         # tell urlencode to deal with sequence values and map them correctly
@@ -419,7 +419,7 @@ def to_url(self):
             # must be python <2.5
             query = base_url[4]
         query = parse_qs(query)
-        for k, v in self.items():
+        for k, v in self.get_nonoauth_parameters().iteritems():
             query.setdefault(k, []).append(v)
         
         try:
@@ -450,7 +450,18 @@ def get_parameter(self, parameter):
     def get_normalized_parameters(self):
         """Return a string that contains the parameters that must be signed."""
         items = []
-        for key, value in self.iteritems():
+
+        params = self.items()
+        # Include any query string parameters from the provided URL
+        query = urlparse.urlparse(self.url)[4]
+        url_items = self._split_url_string(query).items()
+        params.extend(url_items)
+        # Include any form-encoded parameters from the body
+        if self.is_form_encoded:
+           params.extend(parse_qsl(self.body, keep_blank_values=True)) 
+        
+        for p in params:
+            key, value = p
             if key == 'oauth_signature':
                 continue
             # 1.0a/9.1.1 states that kvp must be sorted by key, then by value,
@@ -466,13 +477,6 @@ def get_normalized_parameters(self):
                 else:
                     items.extend((to_utf8_if_string(key), to_utf8_if_string(item)) for item in value)
 
-        # Include any query string parameters from the provided URL
-        query = urlparse.urlparse(self.url)[4]
-
-        url_items = self._split_url_string(query).items()
-        url_items = [(to_utf8(k), to_utf8(v)) for k, v in url_items if k != 'oauth_signature' ]
-        items.extend(url_items)
-
         items.sort()
         encoded_str = urllib.urlencode(items)
         # Encode signature parameters per Oauth Core 1.0 protocol
@@ -519,10 +523,14 @@ def from_request(cls, http_method, http_url, headers=None, parameters=None,
             parameters = {}
  
         # Headers
-        if headers and 'Authorization' in headers:
-            auth_header = headers['Authorization']
+	if headers:
+            auth_header = None
+            if 'Authorization' in headers:
+                auth_header = headers['Authorization']
+            elif 'HTTP_AUTHORIZATION' in headers:
+                auth_header = headers['HTTP_AUTHORIZATION']
             # Check that the authorization header is OAuth.
-            if auth_header[:6] == 'OAuth ':
+            if auth_header and auth_header[:6] == 'OAuth ':
                 auth_header = auth_header[6:]
                 try:
                     # Get the parameters from the header.
@@ -530,9 +538,9 @@ def from_request(cls, http_method, http_url, headers=None, parameters=None,
                     parameters.update(header_params)
                 except:
                     raise Error('Unable to parse OAuth parameters from '
-                        'Authorization header.')
- 
-        # GET or POST query string.
+                        'Authorization header.') 
+        
+	# GET or POST query string.
         if query_string:
             query_params = cls._split_url_string(query_string)
             parameters.update(query_params)
@@ -608,7 +616,7 @@ def _split_url_string(param_str):
         """Turn URL string into parameters."""
         parameters = parse_qs(param_str.encode('utf-8'), keep_blank_values=True)
         for k, v in parameters.iteritems():
-            parameters[k] = urllib.unquote(v[0])
+            parameters[k] = v[0]
         return parameters
 
 
@@ -650,14 +658,9 @@ def request(self, uri, method="GET", body='', headers=None,
         is_form_encoded = \
             headers.get('Content-Type') == 'application/x-www-form-urlencoded'
 
-        if is_form_encoded and body:
-            parameters = parse_qs(body)
-        else:
-            parameters = None
-
         req = Request.from_consumer_and_token(self.consumer, 
             token=self.token, http_method=method, http_url=uri, 
-            parameters=parameters, body=body, is_form_encoded=is_form_encoded)
+            parameters=None, body=body, is_form_encoded=is_form_encoded)
 
         req.sign_request(self.method, self.consumer, self.token)
 
@@ -670,12 +673,12 @@ def request(self, uri, method="GET", body='', headers=None,
 
         realm = schema + ':' + hierpart + host
 
-        if is_form_encoded:
-            body = req.to_postdata()
-        elif method == "GET":
+        # Get querystring request data
+        if method == "GET":
             uri = req.to_url()
-        else:
-            headers.update(req.to_header(realm=realm))
+
+        # Always sign the headers
+        headers.update(req.to_header(realm=realm))
 
         return httplib2.Http.request(self, uri, method=method, body=body,
             headers=headers, redirections=redirections,
