diff --git a/kong/common/http.py b/kong/common/http.py
new file mode 100644
index 0000000..47ac058
--- /dev/null
+++ b/kong/common/http.py
@@ -0,0 +1,57 @@
+from kong import exceptions
+
+import httplib2
+import os
+import time
+
+
+class Client(object):
+
+    USER_AGENT = 'python-nova_test_client'
+
+    def __init__(self, host='localhost', port=80, base_url=''):
+        #TODO: join these more robustly
+        self.base_url = "http://%s:%s/%s" % (host, port, base_url)
+
+    def poll_request(self, method, url, check_response, **kwargs):
+
+        timeout = kwargs.pop('timeout', 180)
+        interval = kwargs.pop('interval', 2)
+        # Start timestamp
+        start_ts = int(time.time())
+
+        while True:
+            resp, body = self.request(method, url, **kwargs)
+            if (check_response(resp, body)):
+                break
+            if (int(time.time()) - start_ts >= timeout):
+                raise exceptions.TimeoutException
+            time.sleep(interval)
+
+    def poll_request_status(self, method, url, status=200, **kwargs):
+
+        def check_response(resp, body):
+            return resp['status'] == str(status)
+
+        self.poll_request(method, url, check_response, **kwargs)
+
+
+    def request(self, method, url, **kwargs):
+        # Default to management_url, but can be overridden here 
+        # (for auth requests)
+        base_url = kwargs.get('base_url', self.management_url)
+
+        self.http_obj = httplib2.Http()
+
+        params = {}
+        params['headers'] = {'User-Agent': self.USER_AGENT}
+        params['headers'].update(kwargs.get('headers', {}))
+        if 'Content-Type' not in params.get('headers',{}):
+            params['headers']['Content-Type'] = 'application/json'
+
+        if 'body' in kwargs:
+            params['body'] = kwargs.get('body')
+
+        req_url = os.path.join(base_url, url.strip('/'))
+        resp, body = self.http_obj.request(req_url, method, **params)
+        return resp, body
