diff --git a/sdncon/coreui/__init__.py b/sdncon/coreui/__init__.py
new file mode 100755
index 0000000..9ab2783
--- /dev/null
+++ b/sdncon/coreui/__init__.py
@@ -0,0 +1,16 @@
+#
+# 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.
+#
+
diff --git a/sdncon/coreui/dummy_keyfile b/sdncon/coreui/dummy_keyfile
new file mode 100755
index 0000000..46173df
--- /dev/null
+++ b/sdncon/coreui/dummy_keyfile
@@ -0,0 +1 @@
+67685bfa8762baeb27672d6859e9cea71b319ccb37c0d77fbd8b8448ed33c9650ab5c2141f3b7cad25a3f738305a67103a96a9af7e855fa02d1c06360e2cfa36
diff --git a/sdncon/coreui/img/bsnlogo-l.png b/sdncon/coreui/img/bsnlogo-l.png
new file mode 100755
index 0000000..1a66153
--- /dev/null
+++ b/sdncon/coreui/img/bsnlogo-l.png
Binary files differ
diff --git a/sdncon/coreui/img/bsnlogo-s.png b/sdncon/coreui/img/bsnlogo-s.png
new file mode 100755
index 0000000..afce497
--- /dev/null
+++ b/sdncon/coreui/img/bsnlogo-s.png
Binary files differ
diff --git a/sdncon/coreui/img/bsnlogo.png b/sdncon/coreui/img/bsnlogo.png
new file mode 100755
index 0000000..70b98b5
--- /dev/null
+++ b/sdncon/coreui/img/bsnlogo.png
Binary files differ
diff --git a/sdncon/coreui/img/footer.png b/sdncon/coreui/img/footer.png
new file mode 100755
index 0000000..50d0440
--- /dev/null
+++ b/sdncon/coreui/img/footer.png
Binary files differ
diff --git a/sdncon/coreui/img/gradient.png b/sdncon/coreui/img/gradient.png
new file mode 100755
index 0000000..b096cef
--- /dev/null
+++ b/sdncon/coreui/img/gradient.png
Binary files differ
diff --git a/sdncon/coreui/img/handandsticker2.jpg b/sdncon/coreui/img/handandsticker2.jpg
new file mode 100755
index 0000000..5e18485
--- /dev/null
+++ b/sdncon/coreui/img/handandsticker2.jpg
Binary files differ
diff --git a/sdncon/coreui/img/loading-circle.gif b/sdncon/coreui/img/loading-circle.gif
new file mode 100755
index 0000000..411b115
--- /dev/null
+++ b/sdncon/coreui/img/loading-circle.gif
Binary files differ
diff --git a/sdncon/coreui/models.py b/sdncon/coreui/models.py
new file mode 100755
index 0000000..9ab2783
--- /dev/null
+++ b/sdncon/coreui/models.py
@@ -0,0 +1,16 @@
+#
+# 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.
+#
+
diff --git a/sdncon/coreui/templatetags/__init__.py b/sdncon/coreui/templatetags/__init__.py
new file mode 100755
index 0000000..9ab2783
--- /dev/null
+++ b/sdncon/coreui/templatetags/__init__.py
@@ -0,0 +1,16 @@
+#
+# 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.
+#
+
diff --git a/sdncon/coreui/templatetags/gravatar.py b/sdncon/coreui/templatetags/gravatar.py
new file mode 100755
index 0000000..a39fa2d
--- /dev/null
+++ b/sdncon/coreui/templatetags/gravatar.py
@@ -0,0 +1,34 @@
+#
+# 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.
+#
+
+from django import template
+register = template.Library()
+
+from hashlib import md5
+from sdncon.clusterAdmin.utils import isCloudBuild
+
+@register.filter
+def gravatar(email):
+    try:
+        secure = isCloudBuild()
+        options='?d=mm&s=48'
+        url = 'http://www.gravatar.com/avatar/%s.jpg%s'
+        if secure:
+            url = 'https://secure.gravatar.com/avatar/%s.jpg%s'
+        return  url % (md5(email.lower().strip()).hexdigest(), options)
+    except:
+        # Filters must fail silently
+        return '#'
diff --git a/sdncon/coreui/tests.py b/sdncon/coreui/tests.py
new file mode 100755
index 0000000..793e610
--- /dev/null
+++ b/sdncon/coreui/tests.py
@@ -0,0 +1,39 @@
+#
+# 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.
+#
+
+"""
+This file demonstrates two different styles of tests (one doctest and one
+unittest). These will both pass when you run "manage.py test".
+
+Replace these with more appropriate tests for your application.
+"""
+
+from django.test import TestCase
+
+class SimpleTest(TestCase):
+    def test_basic_addition(self):
+        """
+        Tests that 1 + 1 always equals 2.
+        """
+        self.failUnlessEqual(1 + 1, 2)
+
+__test__ = {"doctest": """
+Another way to test that 1 + 1 is equal to 2.
+
+>>> 1 + 1 == 2
+True
+"""}
+
diff --git a/sdncon/coreui/urls.py b/sdncon/coreui/urls.py
new file mode 100755
index 0000000..423221a
--- /dev/null
+++ b/sdncon/coreui/urls.py
@@ -0,0 +1,29 @@
+#
+# 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.
+#
+
+from django.conf.urls.defaults import *
+import os
+
+# Note: Looking for the views for top level tabs? Theya re added automagically in the global urls.py
+
+urlpatterns= patterns('',
+    # Serve static files (for development only - this should be a real webserver for production.)
+    (r'^static/(?P<path>.*)$', 'django.views.static.serve', \
+        {'document_root': os.path.join(os.path.dirname(__file__),'static')}),
+    (r'^img/(?P<path>.*)$', 'django.views.static.serve', \
+        {'document_root': os.path.join(os.path.dirname(__file__),'img')}),
+)
+
diff --git a/sdncon/coreui/views.py b/sdncon/coreui/views.py
new file mode 100755
index 0000000..b7fbdd9
--- /dev/null
+++ b/sdncon/coreui/views.py
@@ -0,0 +1,153 @@
+#
+# 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.
+#
+
+#  Views for the core controller UI
+#
+
+from django.shortcuts import render_to_response
+from django.utils import simplejson
+from django.http import HttpResponse
+from django.contrib.auth.decorators import login_required
+from django.contrib.auth.models import User
+from django.template import RequestContext
+from sdncon.apploader import AppLoader, AppLister
+from sdncon.clusterAdmin.utils import conditionally, isCloudBuild
+from sdncon.clusterAdmin.models import Customer, Cluster, CustomerUser
+import os
+
+JSON_CONTENT_TYPE = 'application/json'
+
+# --- View for the root page of any application
+@conditionally(login_required, isCloudBuild())
+def show_application_tabs(request, app):
+    clusterlist = []
+    cus = CustomerUser.objects.all()
+    for cu in cus:
+        if cu.user.username == request.user.username:
+            for cluster in cu.customer.cluster_set.all():
+                clusterlist.append({'customer': cluster.customer.customername,
+                                    'clustername': cluster.clustername,
+                                    'clusterid': unicode(cluster)})
+
+    return render_to_response('coreui/templates/showapp.html', 
+                {'apps':[x for x in AppLoader.getApps() if not hasattr(x,'invisible')],'currentapp':app,'tabs':AppLoader.getApp(app).tabs,'clusterlist':clusterlist, 'isCloudBuild': isCloudBuild()},
+                context_instance=RequestContext(request))
+
+# --- Generic Views
+def embedded_datatable(request, model, options=None, skip_columns=[]): 
+
+    model_name = model.__name__
+    title = model_name + " Table"
+    tablename = model_name+"-embed"
+    table_data = Switch.objects.all()
+
+    # Find headers
+    table_headers = []
+    for field in model._meta.local_fields:
+        table_headers.append(field.name)
+    print table_headers
+
+    # Skip unwanted columns
+    for c in skip_columns:
+        if c in table_headers:
+            table_headers.remove(c)
+
+    # Populate data
+    table_data = []
+    for instance in model.objects.all():
+        table_row = []
+        for field in table_headers:
+            value = instance.__dict__.get(field)
+            table_row.append(value)
+        table_data.append(table_row)
+
+    # Beautify Headers
+    ##TODO ALEX query model info directly, don't use model info list then remove import and delete file
+    #print model_name
+    #if model_name.lower() in model_info_list.model_info_dict:
+    #    print "yes"
+    #    table_headers_c = []
+    #    field_dict = model_info_list.model_info_dict[model_name.lower()]["fields"]
+    #    for h in table_headers:
+    #        h = h.replace("_","-")
+    #        print h, field_dict
+    #        if h in field_dict:
+    #            table_headers_c.append(field_dict[h]['verbose_name'])
+    #        else:
+    #            table_headers_c.append(h)
+    #    table_headers = table_headers_c
+
+    return render_to_response('coreui/templates/datatable-embed.html', {
+        'tabletitle': title,
+        'tablename' : tablename,
+        'tableheaders' : table_headers, 
+        'tabledata' : table_data,
+        'dataTableOptions': options
+    })
+
+def embedded_datatable_from_model(request, model, options=None, skip_columns=[]): 
+    
+    model_name = model.__name__
+    title = model_name + " Table"
+    tablename = model_name+"-embed"
+    table_data = Switch.objects.all()
+    
+    # Find headers
+    table_headers = []
+    for field in model._meta.local_fields:
+        table_headers.append(field.name)
+    print table_headers
+    
+    # Skip unwanted columns
+    for c in skip_columns:
+        if c in table_headers:
+            table_headers.remove(c)
+
+    # Populate data
+    table_data = []
+    for instance in model.objects.all():
+        table_row = []
+        for field in table_headers:
+            value = instance.__dict__.get(field)
+            table_row.append(value)
+        table_data.append(table_row)
+
+    # Beautify Headers
+    print model_name
+    if model_name.lower() in model_info_list.model_info_dict:
+        print "yes"
+        table_headers_c = []
+        field_dict = model_info_list.model_info_dict[model_name.lower()]["fields"]
+        for h in table_headers:
+            h = h.replace("_","-")
+            print h, field_dict
+            if h in field_dict:
+                if 'verbose_name' in field_dict[h]:
+                    table_headers_c.append(field_dict[h]['verbose_name'])
+                else:
+                    table_headers_c.append(h)
+            else:
+                table_headers_c.append(h)
+        table_headers = table_headers_c
+    
+    return render_to_response('coreui/templates/datatable-embed.html', {
+        'tabletitle': title,
+        'tablename' : tablename,
+        'tableheaders' : table_headers, 
+        'tabledata' : table_data,
+        'dataTableOptions': options
+    })
+   
