diff --git a/openstack-common.conf b/openstack-common.conf
index 695e2862b..fd94e1c65 100644
--- a/openstack-common.conf
+++ b/openstack-common.conf
@@ -7,6 +7,8 @@ module=importutils
 module=jsonutils
 module=network_utils
 module=timeutils
+module=middleware/base
+module=middleware/__init__
 
 script = tools/run_cross_tests.sh
 
diff --git a/oslo/messaging/openstack/common/middleware/__init__.py b/oslo/messaging/openstack/common/middleware/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/oslo/messaging/openstack/common/middleware/base.py b/oslo/messaging/openstack/common/middleware/base.py
new file mode 100644
index 000000000..464a1ccd7
--- /dev/null
+++ b/oslo/messaging/openstack/common/middleware/base.py
@@ -0,0 +1,56 @@
+# Copyright 2011 OpenStack Foundation.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+"""Base class(es) for WSGI Middleware."""
+
+import webob.dec
+
+
+class Middleware(object):
+    """Base WSGI middleware wrapper.
+
+    These classes require an application to be initialized that will be called
+    next.  By default the middleware will simply call its wrapped app, or you
+    can override __call__ to customize its behavior.
+    """
+
+    @classmethod
+    def factory(cls, global_conf, **local_conf):
+        """Factory method for paste.deploy."""
+        return cls
+
+    def __init__(self, application):
+        self.application = application
+
+    def process_request(self, req):
+        """Called on each request.
+
+        If this returns None, the next application down the stack will be
+        executed. If it returns a response then that response will be returned
+        and execution will stop here.
+        """
+        return None
+
+    def process_response(self, response):
+        """Do whatever you'd like to the response."""
+        return response
+
+    @webob.dec.wsgify
+    def __call__(self, req):
+        response = self.process_request(req)
+        if response:
+            return response
+        response = req.get_response(self.application)
+        return self.process_response(response)