diff --git a/sdncon/__init__.py b/sdncon/__init__.py
new file mode 100755
index 0000000..f6d7d82
--- /dev/null
+++ b/sdncon/__init__.py
@@ -0,0 +1,121 @@
+#
+# Copyright (c) 2013 Big Switch Networks, Inc.
+#
+# Licensed under the Eclipse Public License, Version 1.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.eclipse.org/legal/epl-v10.html
+#
+# 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.
+#
+
+import os
+# this line must be before the next imports
+import constants
+SDN_ROOT = constants.SDN_ROOT
+from sdncon.apploader import AppLoader
+from sdncon.urls import urlpatterns
+from django.conf.urls.defaults import *
+from django.http import HttpResponse
+import os.path
+
+coreui_inited = False
+
+ROLE_PATH = "%s/current_role" % SDN_ROOT
+UPGRADE_PATH = "%s/upgrading" % SDN_ROOT
+CASSANDRA_SENTINEL = "%s/run/starting" %SDN_ROOT
+
+SLAVE_RO_URL_WHITELIST = ["/rest/v1/system",
+                       "/rest/v1/controller/storage/tables",
+                       "/rest/v1/model/controller-node",
+                       "/rest/v1/model/controller-alias",
+                       "/rest/v1/model/syncd-config/default",
+                       "/rest/v1/model/feature",
+                       "/rest/v1/model/statdropd-progress-info",
+                       "/rest/v1/model/statdropd-config/default",
+                       "/rest/v1/model/firewall-rule",
+                       "/rest/v1/model/controller-domain-name-server",
+                       "/rest/v1/stats/metadata",
+                       "/rest/v1/system/ha/clustername",
+                       "/rest/v1/system/ha/role",
+                       "/rest/v1/system/reload",
+                       ]
+
+SLAVE_RW_URL_WHITELIST = [
+                         "/rest/v1/stats/data/default",
+                         # Need to make controller-interface RW because the
+                         # discover_ip daemon monitors changes to the network
+                         # interfaces and updates the "discovered_ip" and "mac"
+                         # fields in the controller-interface, even on the slave.
+                         # FIXME: Really those fields should be in a different model so
+                         # we wouldn't be mixing configuration and discovered state,
+                         # but it's too late in the release cycle to make that change.
+                         "/rest/v1/model/controller-interface",
+                         # Needs to be RW, to allow cluster number update
+                         # even if all the controllers are slaves
+                         "/rest/v1/model/global-config",
+                         "/rest/v1/model/firewall-rule",
+                         "/rest/v1/model/controller-node",
+                         "/rest/v1/system/upgrade/image-name",
+                         "/rest/v1/system/upgrade/extract-image-manifest",
+                         "/rest/v1/system/upgrade/execute-upgrade-step",
+                         "/rest/v1/system/upgrade/abort",
+                         "/rest/v1/system/rollback/config",
+                         "/rest/v1/system/ha/decommission",
+                         "/rest/v1/system/ha/role",
+                         "/rest/v1/system/reload",
+                         "/rest/v1/system/resetbsc",
+                         "/rest/v1/system/upload-data",
+                         ]
+
+class SDNConAppLoaderMiddleWare(object):
+    def process_request(self, request):
+        global coreui_inited, urlpatterns
+        if not coreui_inited:
+            try:
+                AppLoader.registerAllApps()
+                coreui_inited = True
+            except Exception, e:
+                print "**** panic! AppLoader.registerAllApps() threw this Exception:"
+                print e
+            for index, app in enumerate(AppLoader.apps):
+                # Redirect / to the first app in the list
+                if (index == 0):
+                    urlpatterns += patterns( '', (r'^$', 'django.views.generic.simple.redirect_to', {'url': '/'+app.name}),)
+                urlpatterns += patterns( '', (r'^'+app.name+'/?$', 'sdncon.coreui.views.show_application_tabs', {'app':app.name}) )
+                urlpatterns += patterns( '', (r'^'+app.name+'/', include(app.name+'.urls')), )
+                for t in app.tabs:
+                    urlpatterns += patterns(app.name+'.views', (r'^'+app.name+'/'+t["id"]+'/?$', t["view"]) )
+
+class HARedirectMiddleWare(object):
+    def process_request (self, request):
+        pinfo = request.path_info
+        if pinfo[-1] == "/" :
+            pinfo = pinfo[:-1]
+
+        if request.method == "GET":
+            for match in SLAVE_RO_URL_WHITELIST:
+                if pinfo.startswith(match):
+                    return None
+
+        for match in SLAVE_RW_URL_WHITELIST:
+            if pinfo.startswith(match):
+                return None
+
+        role = "MASTER"
+        try:
+            with open(ROLE_PATH, "r") as f:
+                for line in f:
+                    if line.startswith("sdnplatform.role"):
+                        role = line.split("=")[1].strip()
+        except IOError, e: # Firstboot doesn't have the file
+            return None
+        if role == "SLAVE" and os.path.exists(UPGRADE_PATH) == False:
+            return HttpResponse(status = 303)
+        else:
+            return None
