Remove circular dependency.
Reviwed in https://codereview.appspot.com/7506043/.
diff --git a/apiclient/discovery.py b/apiclient/discovery.py
index 580db0e..19af41a 100644
--- a/apiclient/discovery.py
+++ b/apiclient/discovery.py
@@ -58,6 +58,7 @@
 from email.mime.multipart import MIMEMultipart
 from email.mime.nonmultipart import MIMENonMultipart
 from oauth2client.util import positional
+from oauth2client.util import _add_query_parameter
 from oauth2client.anyjson import simplejson
 
 # The client library requires a version of httplib2 that supports RETRIES.
@@ -108,29 +109,6 @@
     return name
 
 
-def _add_query_parameter(url, name, value):
-  """Adds a query parameter to a url.
-
-  Replaces the current value if it already exists in the URL.
-
-  Args:
-    url: string, url to add the query parameter to.
-    name: string, query parameter name.
-    value: string, query parameter value.
-
-  Returns:
-    Updated query parameter. Does not update the url if value is None.
-  """
-  if value is None:
-    return url
-  else:
-    parsed = list(urlparse.urlparse(url))
-    q = dict(parse_qsl(parsed[4]))
-    q[name] = value
-    parsed[4] = urllib.urlencode(q)
-    return urlparse.urlunparse(parsed)
-
-
 def key2param(key):
   """Converts key names into parameter names.
 
diff --git a/oauth2client/appengine.py b/oauth2client/appengine.py
index a4738f8..570f0f5 100644
--- a/oauth2client/appengine.py
+++ b/oauth2client/appengine.py
@@ -36,7 +36,6 @@
 from google.appengine.ext import webapp
 from google.appengine.ext.webapp.util import login_required
 from google.appengine.ext.webapp.util import run_wsgi_app
-from apiclient import discovery
 from oauth2client import GOOGLE_AUTH_URI
 from oauth2client import GOOGLE_REVOKE_URI
 from oauth2client import GOOGLE_TOKEN_URI
@@ -799,7 +798,7 @@
 
           if decorator._token_response_param and credentials.token_response:
             resp_json = simplejson.dumps(credentials.token_response)
-            redirect_uri = discovery._add_query_parameter(
+            redirect_uri = util._add_query_parameter(
               redirect_uri, decorator._token_response_param, resp_json)
 
           self.redirect(redirect_uri)
diff --git a/oauth2client/util.py b/oauth2client/util.py
index 178d218..ee6a100 100644
--- a/oauth2client/util.py
+++ b/oauth2client/util.py
@@ -28,6 +28,13 @@
 import inspect
 import logging
 import types
+import urllib
+import urlparse
+
+try:
+  from urlparse import parse_qsl
+except ImportError:
+  from cgi import parse_qsl
 
 logger = logging.getLogger(__name__)
 
@@ -160,3 +167,26 @@
     A tuple representing the dictionary in it's naturally sorted ordering.
   """
   return tuple(sorted(dictionary.items()))
+
+
+def _add_query_parameter(url, name, value):
+  """Adds a query parameter to a url.
+
+  Replaces the current value if it already exists in the URL.
+
+  Args:
+    url: string, url to add the query parameter to.
+    name: string, query parameter name.
+    value: string, query parameter value.
+
+  Returns:
+    Updated query parameter. Does not update the url if value is None.
+  """
+  if value is None:
+    return url
+  else:
+    parsed = list(urlparse.urlparse(url))
+    q = dict(parse_qsl(parsed[4]))
+    q[name] = value
+    parsed[4] = urllib.urlencode(q)
+    return urlparse.urlunparse(parsed)
diff --git a/tests/test_discovery.py b/tests/test_discovery.py
index 92213ac..b8b5ac0 100644
--- a/tests/test_discovery.py
+++ b/tests/test_discovery.py
@@ -41,7 +41,6 @@
   from cgi import parse_qs
 
 
-from apiclient.discovery import _add_query_parameter
 from apiclient.discovery import _fix_up_media_upload
 from apiclient.discovery import _fix_up_method_description
 from apiclient.discovery import _fix_up_parameters
@@ -68,6 +67,7 @@
 from oauth2client import GOOGLE_TOKEN_URI
 from oauth2client.anyjson import simplejson
 from oauth2client.client import OAuth2Credentials
+from oauth2client.util import _add_query_parameter
 import uritemplate