diff --git a/cli/sdncon/coreui/views.py b/cli/sdncon/coreui/views.py
new file mode 100755
index 0000000..b7fbdd9
--- /dev/null
+++ b/cli/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
+    })
+   
