--- a
+++ b/ForgeClassic/sfx/middleware.py
@@ -0,0 +1,60 @@
+import sqlalchemy
+from webob import exc, Request
+from paste.deploy.converters import asint
+
+from sf.phpsession import SFXSessionMgr
+
+from pyforge.lib import helpers as h
+
+from . import model as M
+
+class SfxMiddleware(object):
+
+    def __init__(self, app, config):
+        self.app = app
+        self.config = config
+        self.environ_values = {
+            'allura.sfx_session_manager': SFXSessionMgr(),
+            'allura.sfx.site_db':engine_from_config(h.config_with_prefix(config, 'site_db.')),
+            'allura.sfx.mail_db':engine_from_config(h.config_with_prefix(config, 'mail_db.')),
+            'allura.sfx.epic_db':engine_from_config(h.config_with_prefix(config, 'epic_db.'))
+            }
+        self.environ_values['allura.sfx_session_manager'].setup_sessiondb_connection_pool(config)
+        M.site_meta.bind = self.environ_values['allura.sfx.site_db']
+        M.mail_meta.bind = self.environ_values['allura.sfx.mail_db']
+        M.epic_meta.bind =self.environ_values['allura.sfx.epic_db']
+        M.site_meta.reflect()
+        M.mail_meta.reflect()
+        M.epic_meta.reflect()
+        M.mail_group_list = M.site_meta.tables['mail_group_list']
+        M.backend_queue = M.epic_meta.tables['backend_queue']
+        M.lists = M.mail_db.tables['lists']
+
+    def __call__(self, environ, start_response):
+        request = Request(environ)
+        try:
+            self.handle(request)
+        except exc.HTTPException, resp:
+            return resp(environ, start_response)
+        resp = request.get_response(self.app)
+        return resp(environ, start_response)
+
+    def handle(self, request):
+        request.environ.update(self.environ_values)
+
+def engine_from_config(config):
+    sa_scheme = config['scheme']
+    sa_user = config['username']
+    sa_password = config['password']
+    sa_host = config['host']
+    db = config['database']
+    db_recycle = asint(config['pool_recycle'])
+    db_size = asint(config['pool_size'])
+    db_overflow = asint(config['pool_max_overflow'])
+
+    return sqlalchemy.create_engine(
+        '%s://%s:%s@%s/%s' % (sa_scheme, sa_user,sa_password,sa_host,db),
+        pool_recycle=db_recycle,
+        pool_size=db_size,
+        max_overflow=db_overflow,
+        )