Merge branch 'master' of git://git.planet-lab.org/plstackapi
diff --git a/planetstack/apigen/deps.template.json b/planetstack/apigen/deps.template.json
old mode 100755
new mode 100644
diff --git a/planetstack/apigen/dot.template.dot b/planetstack/apigen/dot.template.dot
old mode 100755
new mode 100644
diff --git a/planetstack/apigen/modelgen b/planetstack/apigen/modelgen
old mode 100755
new mode 100644
diff --git a/planetstack/core/admin.py b/planetstack/core/admin.py
index e0664a5..c9d3172 100644
--- a/planetstack/core/admin.py
+++ b/planetstack/core/admin.py
@@ -404,15 +404,12 @@
     def queryset(self, request):
         return DeploymentPrivilege.select_by_user(request.user)
 
-class ControllerPrivilegeInline(PlStackTabularInline):
-    model = ControllerPrivilege
+class ControllerSiteInline(PlStackTabularInline):
+    model = ControllerSite
     extra = 0
     suit_classes = 'suit-tab suit-tab-admin-only'
-    fields = ['backend_status_icon', 'user','role','controller']
-    readonly_fields = ('backend_status_icon', )
+    fields = ['controller', 'site', 'tenant_id']
 
-    def queryset(self, request):
-        return ControllerPrivilege.select_by_user(request.user)
 
 class SitePrivilegeInline(PlStackTabularInline):
     model = SitePrivilege
@@ -432,8 +429,8 @@
     def queryset(self, request):
         return SitePrivilege.select_by_user(request.user)
 
-class SiteDeploymentsInline(PlStackTabularInline):
-    model = SiteDeployments
+class SiteDeploymentInline(PlStackTabularInline):
+    model = SiteDeployment
     extra = 0
     suit_classes = 'suit-tab suit-tab-deployments'
     fields = ['backend_status_icon', 'deployment','site', 'controller']
@@ -449,10 +446,10 @@
         if db_field.name == 'controller':
             kwargs['queryset'] = Controller.select_by_user(request.user)
 
-        return super(SiteDeploymentsInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
+        return super(SiteDeploymentInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
     def queryset(self, request):
-        return SiteDeployments.select_by_user(request.user)
+        return SiteDeployment.select_by_user(request.user)
 
 
 class SlicePrivilegeInline(PlStackTabularInline):
@@ -597,7 +594,7 @@
         #    create/destroy the through models ourselves. There has to be
         #    a better way...
 
-        self.manipulate_m2m_objs(deployment, self.cleaned_data['sites'], deployment.sitedeployments.all(), SiteDeployments, "deployment", "site")
+        self.manipulate_m2m_objs(deployment, self.cleaned_data['sites'], deployment.sitedeployments.all(), SiteDeployment, "deployment", "site")
         self.manipulate_m2m_objs(deployment, self.cleaned_data['images'], deployment.imagedeployments.all(), ImageDeployments, "deployment", "image")
         # manipulate_m2m_objs doesn't work for Flavor/Deployment relationship
         # so well handle that manually here
@@ -655,12 +652,12 @@
         return AdminFormMetaClass
 
 class ControllerAdminForm(forms.ModelForm):
-    site_deployments = forms.ModelMultipleChoiceField(
-        queryset=SiteDeployments.objects.all(),
+    sites = forms.ModelMultipleChoiceField(
+        queryset=Site.objects.all(),
         required=False,
-        help_text="Select which sites deployments are managed by this controller",
+        help_text="Select which sites are managed by this controller",
         widget=FilteredSelectMultiple(
-            verbose_name=('Site Deployments'), is_stacked=False
+            verbose_name=('Sites'), is_stacked=False
         )
     )
 
@@ -672,7 +669,7 @@
         super(ControllerAdminForm, self).__init__(*args, **kwargs)  
 
         if self.instance and self.instance.pk:
-            self.fields['site_deployments'].initial = [x.site_deployment for x in self.instance.controllersitedeployments.all()]
+            self.fields['sites'].initial = [x.site_deployment for x in self.instance.controllersite.all()]
 
     def manipulate_m2m_objs(self, this_obj, selected_objs, all_relations, relation_class, local_attrname, foreign_attrname):
         """ helper function for handling m2m relations from the MultipleChoiceField
@@ -710,7 +707,7 @@
             # save_m2m() doesn't seem to work with 'through' relations. So we
             #    create/destroy the through models ourselves. There has to be
             #    a better way...
-            #self.manipulate_m2m_objs(controller, self.cleaned_data['site_deployments'], controller.controllersitedeployments.all(), ControllerSiteDeployments, "controller", "site_deployment")
+            self.manipulate_m2m_objs(controller, self.cleaned_data['sites'], controller.controllersite.all(), ControllerSite, "controller", "site")
             pass
     	
         self.save_m2m()
@@ -721,7 +718,7 @@
     model = Controller 
     fieldList = ['name', 'version', 'backend_type', 'auth_url', 'admin_user', 'admin_tenant','admin_password']
     #fieldsets = [(None, {'fields': fieldList, 'classes':['suit-tab suit-tab-general']})]
-    inlines = [] # ,ControllerImagesInline]
+    inlines = [ControllerSiteInline] # ,ControllerImagesInline]
     list_display = ['backend_status_icon', 'name', 'version', 'backend_type']
     list_display_links = ('backend_status_icon', 'name', )
     readonly_fields = ('backend_status_text',)
@@ -787,7 +784,7 @@
     list_display = ('backend_status_icon', 'name', 'login_base','site_url', 'enabled')
     list_display_links = ('backend_status_icon', 'name', )
     filter_horizontal = ('deployments',)
-    inlines = [SliceInline,UserInline,TagInline, SitePrivilegeInline, SiteDeploymentsInline]
+    inlines = [SliceInline,UserInline,TagInline, SitePrivilegeInline, SiteDeploymentInline]
     search_fields = ['name']
 
     def queryset(self, request):
@@ -888,8 +885,8 @@
             raise forms.ValidationError('slice name must begin with %s' % site.login_base)
         return cleaned_data
 
-class ControllerSlicesInline(PlStackTabularInline):
-    model = ControllerSlices
+class ControllerSliceInline(PlStackTabularInline):
+    model = ControllerSlice
     extra = 0
     verbose_name = "Controller Slices"
     verbose_name_plural = "Controller Slices"
@@ -905,7 +902,7 @@
     list_display = ('backend_status_icon', 'name', 'site','serviceClass', 'slice_url', 'max_slivers')
     list_display_links = ('backend_status_icon', 'name', )
     inlines = [SlicePrivilegeInline,SliverInline, TagInline, ReservationInline,SliceNetworkInline]
-    admin_inlines = [ControllerSlicesInline]
+    admin_inlines = [ControllerSliceInline]
 
     user_readonly_fields = fieldList
 
@@ -1210,7 +1207,7 @@
     # that reference specific fields on auth.User.
     list_display = ('email', 'firstname', 'lastname', 'site', 'last_login')
     list_filter = ('site',)
-    inlines = [SlicePrivilegeInline,SitePrivilegeInline,ControllerPrivilegeInline,UserDashboardViewInline]
+    inlines = [SlicePrivilegeInline,SitePrivilegeInline,UserDashboardViewInline]
 
     fieldListLoginDetails = ['backend_status_text', 'email','site','password','is_active','is_readonly','is_admin','public_key']
     fieldListContactInfo = ['firstname','lastname','phone','timezone']
@@ -1472,8 +1469,8 @@
     fields = ['backend_status_icon', 'network','slice']
     readonly_fields = ('backend_status_icon', )
 
-class ControllerNetworksInline(PlStackTabularInline):
-    model = ControllerNetworks
+class ControllerNetworkInline(PlStackTabularInline):
+    model = ControllerNetwork
     extra = 0
     verbose_name_plural = "Controller Networks"
     verbose_name = "Controller Network"
@@ -1495,7 +1492,7 @@
     readonly_fields = ("subnet", )
 
     inlines = [NetworkParameterInline, NetworkSliversInline, NetworkSlicesInline, RouterInline]
-    admin_inlines = [ControllerNetworksInline]
+    admin_inlines = [ControllerNetworkInline]
 
     form=NetworkForm
 
diff --git a/planetstack/core/fixtures/demo_data.json b/planetstack/core/fixtures/demo_data.json
index 400148f..12ee426 100644
--- a/planetstack/core/fixtures/demo_data.json
+++ b/planetstack/core/fixtures/demo_data.json
@@ -636,7 +636,7 @@
 },
 {
     "pk": 1, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-07T23:52:01.453Z", 
         "created": "2014-05-07T23:52:01.453Z", 
@@ -650,7 +650,7 @@
 },
 {
     "pk": 2, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-07T23:52:01.455Z", 
         "created": "2014-05-07T23:52:01.455Z", 
@@ -664,7 +664,7 @@
 },
 {
     "pk": 3, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-07T23:52:01.456Z", 
         "created": "2014-05-07T23:52:01.456Z", 
@@ -678,7 +678,7 @@
 },
 {
     "pk": 4, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-07T23:52:01.457Z", 
         "created": "2014-05-07T23:52:01.456Z", 
@@ -692,7 +692,7 @@
 },
 {
     "pk": 5, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-07T23:52:01.457Z", 
         "created": "2014-05-07T23:52:01.457Z", 
@@ -706,7 +706,7 @@
 },
 {
     "pk": 6, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-07T23:52:01.458Z", 
         "created": "2014-05-07T23:52:01.458Z", 
@@ -720,7 +720,7 @@
 },
 {
     "pk": 7, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:00:37.305Z", 
         "created": "2014-05-08T00:00:37.305Z", 
@@ -734,7 +734,7 @@
 },
 {
     "pk": 8, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:01:18.181Z", 
         "created": "2014-05-08T00:01:18.181Z", 
@@ -748,7 +748,7 @@
 },
 {
     "pk": 9, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:01:29.768Z", 
         "created": "2014-05-08T00:01:29.768Z", 
@@ -762,7 +762,7 @@
 },
 {
     "pk": 10, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:01:52.173Z", 
         "created": "2014-05-08T00:01:52.173Z", 
@@ -776,7 +776,7 @@
 },
 {
     "pk": 11, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:02:03.435Z", 
         "created": "2014-05-08T00:02:03.435Z", 
@@ -790,7 +790,7 @@
 },
 {
     "pk": 12, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:02:16.038Z", 
         "created": "2014-05-08T00:02:16.038Z", 
@@ -804,7 +804,7 @@
 },
 {
     "pk": 13, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:02:33.626Z", 
         "created": "2014-05-08T00:02:33.626Z", 
@@ -818,7 +818,7 @@
 },
 {
     "pk": 14, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:02:46.549Z", 
         "created": "2014-05-08T00:02:46.549Z", 
@@ -832,7 +832,7 @@
 },
 {
     "pk": 15, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:03:01.445Z", 
         "created": "2014-05-08T00:03:01.445Z", 
@@ -846,7 +846,7 @@
 },
 {
     "pk": 16, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:03:18.238Z", 
         "created": "2014-05-08T00:03:18.238Z", 
@@ -860,7 +860,7 @@
 },
 {
     "pk": 17, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:03:32.156Z", 
         "created": "2014-05-08T00:03:32.156Z", 
@@ -874,7 +874,7 @@
 },
 {
     "pk": 18, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:03:45.449Z", 
         "created": "2014-05-08T00:03:45.448Z", 
@@ -888,7 +888,7 @@
 },
 {
     "pk": 19, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:03:59.510Z", 
         "created": "2014-05-08T00:03:59.510Z", 
@@ -902,7 +902,7 @@
 },
 {
     "pk": 20, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:04:12.516Z", 
         "created": "2014-05-08T00:04:12.516Z", 
@@ -916,7 +916,7 @@
 },
 {
     "pk": 21, 
-    "model": "core.sitedeployments", 
+    "model": "core.sitedeployment", 
     "fields": {
         "updated": "2014-05-08T00:04:25.576Z", 
         "created": "2014-05-08T00:04:25.576Z", 
@@ -1851,7 +1851,7 @@
     "model": "core.slice", 
     "fields": {
         "updated": "2014-08-27T22:40:05.088Z", 
-        "imagePreference": "Ubuntu 12.04 LTS", 
+        "image_preference": "Ubuntu 12.04 LTS", 
         "name": "HyperCache", 
         "service": 14, 
         "created": "2013-04-03T23:14:11.072Z", 
@@ -1864,7 +1864,7 @@
         "omf_friendly": false, 
         "network": "Private Only", 
         "max_slivers": 10, 
-        "mountDataSets": "GenBank", 
+        "mount_data_sets": "GenBank", 
         "backend_status": "Provisioning in progress", 
         "creator": 1, 
         "enacted": null
@@ -1875,7 +1875,7 @@
     "model": "core.slice", 
     "fields": {
         "updated": "2014-03-23T23:12:27.541Z", 
-        "imagePreference": "Ubuntu 12.04 LTS", 
+        "image_preference": "Ubuntu 12.04 LTS", 
         "name": "Syndicate", 
         "service": 5, 
         "created": "2013-04-03T23:14:11.072Z", 
@@ -1888,7 +1888,7 @@
         "omf_friendly": false, 
         "network": "Private Only", 
         "max_slivers": 10, 
-        "mountDataSets": "GenBank", 
+        "mount_data_sets": "GenBank", 
         "backend_status": "Provisioning in progress", 
         "creator": 1, 
         "enacted": null
@@ -1899,7 +1899,7 @@
     "model": "core.slice", 
     "fields": {
         "updated": "2014-03-23T23:17:33.686Z", 
-        "imagePreference": "Ubuntu 12.04 LTS", 
+        "image_preference": "Ubuntu 12.04 LTS", 
         "name": "DnsRedir", 
         "service": 4, 
         "created": "2013-12-04T22:48:35.584Z", 
@@ -1912,7 +1912,7 @@
         "omf_friendly": false, 
         "network": "Private Only", 
         "max_slivers": 10, 
-        "mountDataSets": "GenBank", 
+        "mount_data_sets": "GenBank", 
         "backend_status": "Provisioning in progress", 
         "creator": 8, 
         "enacted": null
@@ -1923,7 +1923,7 @@
     "model": "core.slice", 
     "fields": {
         "updated": "2014-03-23T23:18:00.528Z", 
-        "imagePreference": "Ubuntu 12.04 LTS", 
+        "image_preference": "Ubuntu 12.04 LTS", 
         "name": "DnsDemux", 
         "service": 4, 
         "created": "2013-12-04T22:49:23.051Z", 
@@ -1936,7 +1936,7 @@
         "omf_friendly": false, 
         "network": "Private Only", 
         "max_slivers": 10, 
-        "mountDataSets": "GenBank", 
+        "mount_data_sets": "GenBank", 
         "backend_status": "Provisioning in progress", 
         "creator": 8, 
         "enacted": null
@@ -1947,7 +1947,7 @@
     "model": "core.slice", 
     "fields": {
         "updated": "2014-03-23T23:19:56.253Z", 
-        "imagePreference": "Ubuntu 12.04 LTS", 
+        "image_preference": "Ubuntu 12.04 LTS", 
         "name": "Infrastructure", 
         "service": null, 
         "created": "2013-12-09T14:13:15.392Z", 
@@ -1960,7 +1960,7 @@
         "omf_friendly": false, 
         "network": "Private Only", 
         "max_slivers": 10, 
-        "mountDataSets": "GenBank", 
+        "mount_data_sets": "GenBank", 
         "backend_status": "Provisioning in progress", 
         "creator": 1, 
         "enacted": null
@@ -1971,7 +1971,7 @@
     "model": "core.slice", 
     "fields": {
         "updated": "2014-03-23T23:15:29.953Z", 
-        "imagePreference": "Ubuntu 12.04 LTS", 
+        "image_preference": "Ubuntu 12.04 LTS", 
         "name": "Stork", 
         "service": 8, 
         "created": "2013-12-13T21:49:59.476Z", 
@@ -1984,7 +1984,7 @@
         "omf_friendly": false, 
         "network": "Private Only", 
         "max_slivers": 10, 
-        "mountDataSets": "GenBank", 
+        "mount_data_sets": "GenBank", 
         "backend_status": "Provisioning in progress", 
         "creator": 1, 
         "enacted": null
@@ -1995,7 +1995,7 @@
     "model": "core.slice", 
     "fields": {
         "updated": "2014-03-23T23:16:01.742Z", 
-        "imagePreference": "Ubuntu 12.04 LTS", 
+        "image_preference": "Ubuntu 12.04 LTS", 
         "name": "Owl", 
         "service": 8, 
         "created": "2013-12-13T21:52:15.590Z", 
@@ -2008,7 +2008,7 @@
         "omf_friendly": false, 
         "network": "Private Only", 
         "max_slivers": 10, 
-        "mountDataSets": "GenBank", 
+        "mount_data_sets": "GenBank", 
         "backend_status": "Provisioning in progress", 
         "creator": 1, 
         "enacted": null
@@ -2019,7 +2019,7 @@
     "model": "core.slice", 
     "fields": {
         "updated": "2014-03-23T23:15:02.712Z", 
-        "imagePreference": "Ubuntu 12.04 LTS", 
+        "image_preference": "Ubuntu 12.04 LTS", 
         "name": "Hadoop", 
         "service": null, 
         "created": "2013-12-13T21:54:20.895Z", 
@@ -2032,7 +2032,7 @@
         "omf_friendly": false, 
         "network": "Private Only", 
         "max_slivers": 10, 
-        "mountDataSets": "GenBank", 
+        "mount_data_sets": "GenBank", 
         "backend_status": "Provisioning in progress", 
         "creator": 1, 
         "enacted": null
@@ -2043,7 +2043,7 @@
     "model": "core.slice", 
     "fields": {
         "updated": "2014-03-23T23:14:27.648Z", 
-        "imagePreference": "Ubuntu 12.04 LTS", 
+        "image_preference": "Ubuntu 12.04 LTS", 
         "name": "test", 
         "service": null, 
         "created": "2013-12-13T21:56:57.299Z", 
@@ -2056,7 +2056,7 @@
         "omf_friendly": false, 
         "network": "Private Only", 
         "max_slivers": 10, 
-        "mountDataSets": "GenBank", 
+        "mount_data_sets": "GenBank", 
         "backend_status": "Provisioning in progress", 
         "creator": 1, 
         "enacted": null
@@ -2067,7 +2067,7 @@
     "model": "core.slice", 
     "fields": {
         "updated": "2014-03-23T23:14:00.911Z", 
-        "imagePreference": "Ubuntu 12.04 LTS", 
+        "image_preference": "Ubuntu 12.04 LTS", 
         "name": "test2", 
         "service": null, 
         "created": "2013-12-13T22:00:03.049Z", 
@@ -2080,7 +2080,7 @@
         "omf_friendly": false, 
         "network": "Private Only", 
         "max_slivers": 10, 
-        "mountDataSets": "GenBank", 
+        "mount_data_sets": "GenBank", 
         "backend_status": "Provisioning in progress", 
         "creator": 1, 
         "enacted": null
@@ -2091,7 +2091,7 @@
     "model": "core.slice", 
     "fields": {
         "updated": "2014-05-27T14:05:40.950Z", 
-        "imagePreference": "Hadoop 2.4.0", 
+        "image_preference": "Hadoop 2.4.0", 
         "name": "Analytics", 
         "service": null, 
         "created": "2014-05-20T17:54:07.100Z", 
@@ -2104,7 +2104,7 @@
         "omf_friendly": false, 
         "network": "Private Only", 
         "max_slivers": 10, 
-        "mountDataSets": "GenBank-11-2013", 
+        "mount_data_sets": "GenBank-11-2013", 
         "backend_status": "Provisioning in progress", 
         "creator": 8, 
         "enacted": null
@@ -12784,10 +12784,10 @@
         "created": "2013-12-09T14:15:16.899Z", 
         "deleted": false, 
         "description": "Connect a sliver to the public network using dedicated public IPv4 address", 
-        "sharedNetworkName": "ext-net", 
-        "guaranteedBandwidth": 0, 
+        "shared_network_name": "ext-net", 
+        "guaranteed_bandwidth": 0, 
         "visibility": "public", 
-        "sharedNetworkId": "", 
+        "shared_network_id": "", 
         "translation": "none", 
         "backend_status": "Provisioning in progress", 
         "enacted": "2014-05-12T19:24:09Z"
@@ -12802,10 +12802,10 @@
         "created": "2013-12-09T14:17:29.551Z", 
         "deleted": false, 
         "description": "Connect a sliver to the public network via NAT, with port forwarding", 
-        "sharedNetworkName": "nat-net", 
-        "guaranteedBandwidth": 0, 
+        "shared_network_name": "nat-net", 
+        "guaranteed_bandwidth": 0, 
         "visibility": "private", 
-        "sharedNetworkId": "", 
+        "shared_network_id": "", 
         "translation": "NAT", 
         "backend_status": "Provisioning in progress", 
         "enacted": "2014-05-12T19:23:54Z"
@@ -12820,10 +12820,10 @@
         "created": "2013-12-09T14:18:02.336Z", 
         "deleted": false, 
         "description": "A private virtual network", 
-        "sharedNetworkName": "", 
-        "guaranteedBandwidth": 0, 
+        "shared_network_name": "", 
+        "guaranteed_bandwidth": 0, 
         "visibility": "private", 
-        "sharedNetworkId": "", 
+        "shared_network_id": "", 
         "translation": "none", 
         "backend_status": "Provisioning in progress", 
         "enacted": "2014-05-12T19:23:30Z"
@@ -12841,10 +12841,10 @@
         "created": "2013-12-09T14:24:19.970Z", 
         "deleted": false, 
         "network_id": "7cb4291d-f8d3-4797-83b0-8deefd85bdf5", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 10, 
         "backend_status": "Provisioning in progress", 
@@ -12864,10 +12864,10 @@
         "created": "2013-12-09T14:31:41.605Z", 
         "deleted": false, 
         "network_id": "810b4cb8-9d8e-4eee-becc-676785a07725", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 10, 
         "backend_status": "Provisioning in progress", 
@@ -12887,10 +12887,10 @@
         "created": "2013-12-09T14:33:10.312Z", 
         "deleted": false, 
         "network_id": "4b37f048-11de-4ddd-acaf-2fc5e8716f0e", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 10, 
         "backend_status": "Provisioning in progress", 
@@ -12910,10 +12910,10 @@
         "created": "2013-12-09T14:34:55.754Z", 
         "deleted": false, 
         "network_id": "684386d7-1286-4e58-acda-8ff45deac99e", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 10, 
         "backend_status": "Provisioning in progress", 
@@ -12933,10 +12933,10 @@
         "created": "2013-12-09T14:36:09.261Z", 
         "deleted": false, 
         "network_id": "fa090174-ec59-4b7a-812b-9206d911fb61", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 10, 
         "backend_status": "Provisioning in progress", 
@@ -12956,10 +12956,10 @@
         "created": "2013-12-09T14:37:02.420Z", 
         "deleted": false, 
         "network_id": "017a3914-5eaf-4bcb-8609-6d17ebcdf075", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 10, 
         "backend_status": "Provisioning in progress", 
@@ -12979,10 +12979,10 @@
         "created": "2013-12-09T14:38:11.552Z", 
         "deleted": false, 
         "network_id": "fdf0e3b1-439b-4673-b56e-d9dfe52b2bb7", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 10, 
         "backend_status": "Provisioning in progress", 
@@ -13002,10 +13002,10 @@
         "created": "2013-12-09T14:39:51.262Z", 
         "deleted": false, 
         "network_id": "fdf0e3b1-439b-4673-b56e-d9dfe52b2bb7", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 10, 
         "backend_status": "Provisioning in progress", 
@@ -13025,10 +13025,10 @@
         "created": "2013-12-09T14:41:00.237Z", 
         "deleted": false, 
         "network_id": "fdf0e3b1-439b-4673-b56e-d9dfe52b2bb7", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 10, 
         "backend_status": "Provisioning in progress", 
@@ -13048,10 +13048,10 @@
         "created": "2013-12-09T14:42:03.158Z", 
         "deleted": false, 
         "network_id": "ecdbaf66-b659-4d59-b0b7-1bf6d232ccba", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 10, 
         "backend_status": "Provisioning in progress", 
@@ -13071,10 +13071,10 @@
         "created": "2013-12-09T14:42:49.781Z", 
         "deleted": false, 
         "network_id": "ae4d42e8-a97c-440d-9533-4bcbd62dfb00", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "public-net", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 10, 
         "backend_status": "Provisioning in progress", 
@@ -13094,10 +13094,10 @@
         "created": "2013-12-13T21:51:04.425Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": true, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": true, 
         "template": 4, 
         "owner": 11, 
         "backend_status": "Provisioning in progress", 
@@ -13117,10 +13117,10 @@
         "created": "2013-12-13T21:53:07.783Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": true, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": true, 
         "template": 4, 
         "owner": 12, 
         "backend_status": "Provisioning in progress", 
@@ -13140,10 +13140,10 @@
         "created": "2013-12-13T21:55:51.703Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": true, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": true, 
         "template": 4, 
         "owner": 13, 
         "backend_status": "Provisioning in progress", 
@@ -13163,10 +13163,10 @@
         "created": "2013-12-13T21:57:38.995Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 14, 
         "backend_status": "Provisioning in progress", 
@@ -13186,10 +13186,10 @@
         "created": "2013-12-13T22:00:40.549Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 3, 
         "owner": 15, 
         "backend_status": "Provisioning in progress", 
@@ -13209,10 +13209,10 @@
         "created": "2013-12-18T22:05:09.944Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 4, 
         "owner": 10, 
         "backend_status": "Provisioning in progress", 
@@ -13232,10 +13232,10 @@
         "created": "2013-12-18T22:05:50.112Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 10, 
         "backend_status": "Provisioning in progress", 
@@ -13255,10 +13255,10 @@
         "created": "2013-12-18T22:13:17.310Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 4, 
         "owner": 9, 
         "backend_status": "Provisioning in progress", 
@@ -13278,10 +13278,10 @@
         "created": "2013-12-18T22:13:38.194Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 9, 
         "backend_status": "Provisioning in progress", 
@@ -13301,10 +13301,10 @@
         "created": "2013-12-18T22:16:19.797Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 4, 
         "owner": 8, 
         "backend_status": "Provisioning in progress", 
@@ -13324,10 +13324,10 @@
         "created": "2013-12-18T22:16:38.335Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 8, 
         "backend_status": "Provisioning in progress", 
@@ -13347,13 +13347,13 @@
         "created": "2013-12-18T22:24:19.109Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [
+        "permitted_slices": [
             6, 
             8
         ], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 4, 
         "owner": 4, 
         "backend_status": "Provisioning in progress", 
@@ -13373,10 +13373,10 @@
         "created": "2013-12-18T22:24:38.066Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 4, 
         "backend_status": "Provisioning in progress", 
@@ -13396,10 +13396,10 @@
         "created": "2013-12-18T22:26:46.435Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 4, 
         "owner": 6, 
         "backend_status": "Provisioning in progress", 
@@ -13419,10 +13419,10 @@
         "created": "2013-12-18T22:27:12.647Z", 
         "deleted": false, 
         "network_id": "", 
-        "permittedSlices": [], 
+        "permitted_slices": [], 
         "labels": "", 
-        "guaranteedBandwidth": 0, 
-        "permitAllSlices": false, 
+        "guaranteed_bandwidth": 0, 
+        "permit_all_slices": false, 
         "template": 1, 
         "owner": 6, 
         "backend_status": "Provisioning in progress", 
diff --git a/planetstack/core/fixtures/initial_data.json b/planetstack/core/fixtures/initial_data.json
index aef01f1..a7abdbe 100644
--- a/planetstack/core/fixtures/initial_data.json
+++ b/planetstack/core/fixtures/initial_data.json
@@ -721,7 +721,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": "2014-06-20T01:53:28.687Z"
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 19
 },
 {
@@ -734,7 +734,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": "2014-06-20T01:53:34.657Z"
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 20
 },
 {
@@ -747,7 +747,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": "2014-06-20T01:53:40.604Z"
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 21
 },
 {
@@ -760,7 +760,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": "2014-06-20T01:53:47.047Z"
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 22
 },
 {
@@ -773,7 +773,7 @@
         "backend_status": "Authorization Failed: unsupported operand type(s) for +: 'NoneType' and 'str'",
         "enacted": "2014-08-08T03:49:32.318Z"
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 27
 },
 {
@@ -786,7 +786,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": "2014-08-06T17:46:03.289Z"
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 28
 },
 {
@@ -799,7 +799,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": "2014-08-06T17:46:07.804Z"
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 29
 },
 {
@@ -812,7 +812,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": "2014-08-06T17:46:12.521Z"
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 30
 },
 {
@@ -825,7 +825,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 31
 },
 {
@@ -838,7 +838,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 32
 },
 {
@@ -851,7 +851,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 33
 },
 {
@@ -864,7 +864,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 34
 },
 {
@@ -877,7 +877,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 35
 },
 {
@@ -890,7 +890,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 36
 },
 {
@@ -903,7 +903,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 37
 },
 {
@@ -916,7 +916,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 38
 },
 {
@@ -929,7 +929,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 39
 },
 {
@@ -942,7 +942,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 40
 },
 {
@@ -955,7 +955,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 41
 },
 {
@@ -968,7 +968,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 42
 },
 {
@@ -981,7 +981,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 43
 },
 {
@@ -994,7 +994,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 44
 },
 {
@@ -1007,7 +1007,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 45
 },
 {
@@ -1020,7 +1020,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 46
 },
 {
@@ -1033,7 +1033,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 47
 },
 {
@@ -1046,7 +1046,7 @@
         "backend_status": "Provisioning in progress",
         "enacted": null
     },
-    "model": "core.sitedeployments",
+    "model": "core.sitedeployment",
     "pk": 48
 },
 {
diff --git a/planetstack/core/migrations/0001_initial.py b/planetstack/core/migrations/0001_initial.py
index 8e1ec76..d440ded 100644
--- a/planetstack/core/migrations/0001_initial.py
+++ b/planetstack/core/migrations/0001_initial.py
@@ -41,7 +41,7 @@
                 ('enacted', models.DateTimeField(default=None, null=True)),
                 ('backend_status', models.CharField(default=b'Provisioning in progress', max_length=140)),
                 ('deleted', models.BooleanField(default=False)),
-                ('timezone', timezones.fields.TimeZoneField(default=b'America/New_York', max_length=100, choices=[(b'Pacific/Midway', b'(GMT-1100) Pacific/Midway'), (b'Pacific/Niue', b'(GMT-1100) Pacific/Niue'), (b'Pacific/Pago_Pago', b'(GMT-1100) Pacific/Pago_Pago'), (b'America/Adak', b'(GMT-1000) America/Adak'), (b'Pacific/Honolulu', b'(GMT-1000) Pacific/Honolulu'), (b'Pacific/Johnston', b'(GMT-1000) Pacific/Johnston'), (b'Pacific/Rarotonga', b'(GMT-1000) Pacific/Rarotonga'), (b'Pacific/Tahiti', b'(GMT-1000) Pacific/Tahiti'), (b'US/Hawaii', b'(GMT-1000) US/Hawaii'), (b'Pacific/Marquesas', b'(GMT-0930) Pacific/Marquesas'), (b'America/Anchorage', b'(GMT-0900) America/Anchorage'), (b'America/Juneau', b'(GMT-0900) America/Juneau'), (b'America/Nome', b'(GMT-0900) America/Nome'), (b'America/Sitka', b'(GMT-0900) America/Sitka'), (b'America/Yakutat', b'(GMT-0900) America/Yakutat'), (b'Pacific/Gambier', b'(GMT-0900) Pacific/Gambier'), (b'US/Alaska', b'(GMT-0900) US/Alaska'), (b'America/Dawson', b'(GMT-0800) America/Dawson'), (b'America/Los_Angeles', b'(GMT-0800) America/Los_Angeles'), (b'America/Metlakatla', b'(GMT-0800) America/Metlakatla'), (b'America/Santa_Isabel', b'(GMT-0800) America/Santa_Isabel'), (b'America/Tijuana', b'(GMT-0800) America/Tijuana'), (b'America/Vancouver', b'(GMT-0800) America/Vancouver'), (b'America/Whitehorse', b'(GMT-0800) America/Whitehorse'), (b'Canada/Pacific', b'(GMT-0800) Canada/Pacific'), (b'Pacific/Pitcairn', b'(GMT-0800) Pacific/Pitcairn'), (b'US/Pacific', b'(GMT-0800) US/Pacific'), (b'America/Boise', b'(GMT-0700) America/Boise'), (b'America/Cambridge_Bay', b'(GMT-0700) America/Cambridge_Bay'), (b'America/Chihuahua', b'(GMT-0700) America/Chihuahua'), (b'America/Creston', b'(GMT-0700) America/Creston'), (b'America/Dawson_Creek', b'(GMT-0700) America/Dawson_Creek'), (b'America/Denver', b'(GMT-0700) America/Denver'), (b'America/Edmonton', b'(GMT-0700) America/Edmonton'), (b'America/Hermosillo', b'(GMT-0700) America/Hermosillo'), (b'America/Inuvik', b'(GMT-0700) America/Inuvik'), (b'America/Mazatlan', b'(GMT-0700) America/Mazatlan'), (b'America/Ojinaga', b'(GMT-0700) America/Ojinaga'), (b'America/Phoenix', b'(GMT-0700) America/Phoenix'), (b'America/Yellowknife', b'(GMT-0700) America/Yellowknife'), (b'Canada/Mountain', b'(GMT-0700) Canada/Mountain'), (b'US/Arizona', b'(GMT-0700) US/Arizona'), (b'US/Mountain', b'(GMT-0700) US/Mountain'), (b'America/Bahia_Banderas', b'(GMT-0600) America/Bahia_Banderas'), (b'America/Belize', b'(GMT-0600) America/Belize'), (b'America/Cancun', b'(GMT-0600) America/Cancun'), (b'America/Chicago', b'(GMT-0600) America/Chicago'), (b'America/Costa_Rica', b'(GMT-0600) America/Costa_Rica'), (b'America/El_Salvador', b'(GMT-0600) America/El_Salvador'), (b'America/Guatemala', b'(GMT-0600) America/Guatemala'), (b'America/Indiana/Knox', b'(GMT-0600) America/Indiana/Knox'), (b'America/Indiana/Tell_City', b'(GMT-0600) America/Indiana/Tell_City'), (b'America/Managua', b'(GMT-0600) America/Managua'), (b'America/Matamoros', b'(GMT-0600) America/Matamoros'), (b'America/Menominee', b'(GMT-0600) America/Menominee'), (b'America/Merida', b'(GMT-0600) America/Merida'), (b'America/Mexico_City', b'(GMT-0600) America/Mexico_City'), (b'America/Monterrey', b'(GMT-0600) America/Monterrey'), (b'America/North_Dakota/Beulah', b'(GMT-0600) America/North_Dakota/Beulah'), (b'America/North_Dakota/Center', b'(GMT-0600) America/North_Dakota/Center'), (b'America/North_Dakota/New_Salem', b'(GMT-0600) America/North_Dakota/New_Salem'), (b'America/Rainy_River', b'(GMT-0600) America/Rainy_River'), (b'America/Rankin_Inlet', b'(GMT-0600) America/Rankin_Inlet'), (b'America/Regina', b'(GMT-0600) America/Regina'), (b'America/Resolute', b'(GMT-0600) America/Resolute'), (b'America/Swift_Current', b'(GMT-0600) America/Swift_Current'), (b'America/Tegucigalpa', b'(GMT-0600) America/Tegucigalpa'), (b'America/Winnipeg', b'(GMT-0600) America/Winnipeg'), (b'Canada/Central', b'(GMT-0600) Canada/Central'), (b'Pacific/Galapagos', b'(GMT-0600) Pacific/Galapagos'), (b'US/Central', b'(GMT-0600) US/Central'), (b'America/Atikokan', b'(GMT-0500) America/Atikokan'), (b'America/Bogota', b'(GMT-0500) America/Bogota'), (b'America/Cayman', b'(GMT-0500) America/Cayman'), (b'America/Detroit', b'(GMT-0500) America/Detroit'), (b'America/Eirunepe', b'(GMT-0500) America/Eirunepe'), (b'America/Guayaquil', b'(GMT-0500) America/Guayaquil'), (b'America/Havana', b'(GMT-0500) America/Havana'), (b'America/Indiana/Indianapolis', b'(GMT-0500) America/Indiana/Indianapolis'), (b'America/Indiana/Marengo', b'(GMT-0500) America/Indiana/Marengo'), (b'America/Indiana/Petersburg', b'(GMT-0500) America/Indiana/Petersburg'), (b'America/Indiana/Vevay', b'(GMT-0500) America/Indiana/Vevay'), (b'America/Indiana/Vincennes', b'(GMT-0500) America/Indiana/Vincennes'), (b'America/Indiana/Winamac', b'(GMT-0500) America/Indiana/Winamac'), (b'America/Iqaluit', b'(GMT-0500) America/Iqaluit'), (b'America/Jamaica', b'(GMT-0500) America/Jamaica'), (b'America/Kentucky/Louisville', b'(GMT-0500) America/Kentucky/Louisville'), (b'America/Kentucky/Monticello', b'(GMT-0500) America/Kentucky/Monticello'), (b'America/Lima', b'(GMT-0500) America/Lima'), (b'America/Montreal', b'(GMT-0500) America/Montreal'), (b'America/Nassau', b'(GMT-0500) America/Nassau'), (b'America/New_York', b'(GMT-0500) America/New_York'), (b'America/Nipigon', b'(GMT-0500) America/Nipigon'), (b'America/Panama', b'(GMT-0500) America/Panama'), (b'America/Pangnirtung', b'(GMT-0500) America/Pangnirtung'), (b'America/Port-au-Prince', b'(GMT-0500) America/Port-au-Prince'), (b'America/Rio_Branco', b'(GMT-0500) America/Rio_Branco'), (b'America/Thunder_Bay', b'(GMT-0500) America/Thunder_Bay'), (b'America/Toronto', b'(GMT-0500) America/Toronto'), (b'Canada/Eastern', b'(GMT-0500) Canada/Eastern'), (b'Pacific/Easter', b'(GMT-0500) Pacific/Easter'), (b'US/Eastern', b'(GMT-0500) US/Eastern'), (b'America/Caracas', b'(GMT-0430) America/Caracas'), (b'America/Anguilla', b'(GMT-0400) America/Anguilla'), (b'America/Antigua', b'(GMT-0400) America/Antigua'), (b'America/Aruba', b'(GMT-0400) America/Aruba'), (b'America/Barbados', b'(GMT-0400) America/Barbados'), (b'America/Blanc-Sablon', b'(GMT-0400) America/Blanc-Sablon'), (b'America/Boa_Vista', b'(GMT-0400) America/Boa_Vista'), (b'America/Curacao', b'(GMT-0400) America/Curacao'), (b'America/Dominica', b'(GMT-0400) America/Dominica'), (b'America/Glace_Bay', b'(GMT-0400) America/Glace_Bay'), (b'America/Goose_Bay', b'(GMT-0400) America/Goose_Bay'), (b'America/Grand_Turk', b'(GMT-0400) America/Grand_Turk'), (b'America/Grenada', b'(GMT-0400) America/Grenada'), (b'America/Guadeloupe', b'(GMT-0400) America/Guadeloupe'), (b'America/Guyana', b'(GMT-0400) America/Guyana'), (b'America/Halifax', b'(GMT-0400) America/Halifax'), (b'America/Kralendijk', b'(GMT-0400) America/Kralendijk'), (b'America/La_Paz', b'(GMT-0400) America/La_Paz'), (b'America/Lower_Princes', b'(GMT-0400) America/Lower_Princes'), (b'America/Manaus', b'(GMT-0400) America/Manaus'), (b'America/Marigot', b'(GMT-0400) America/Marigot'), (b'America/Martinique', b'(GMT-0400) America/Martinique'), (b'America/Moncton', b'(GMT-0400) America/Moncton'), (b'America/Montserrat', b'(GMT-0400) America/Montserrat'), (b'America/Port_of_Spain', b'(GMT-0400) America/Port_of_Spain'), (b'America/Porto_Velho', b'(GMT-0400) America/Porto_Velho'), (b'America/Puerto_Rico', b'(GMT-0400) America/Puerto_Rico'), (b'America/Santo_Domingo', b'(GMT-0400) America/Santo_Domingo'), (b'America/St_Barthelemy', b'(GMT-0400) America/St_Barthelemy'), (b'America/St_Kitts', b'(GMT-0400) America/St_Kitts'), (b'America/St_Lucia', b'(GMT-0400) America/St_Lucia'), (b'America/St_Thomas', b'(GMT-0400) America/St_Thomas'), (b'America/St_Vincent', b'(GMT-0400) America/St_Vincent'), (b'America/Thule', b'(GMT-0400) America/Thule'), (b'America/Tortola', b'(GMT-0400) America/Tortola'), (b'Atlantic/Bermuda', b'(GMT-0400) Atlantic/Bermuda'), (b'Canada/Atlantic', b'(GMT-0400) Canada/Atlantic'), (b'America/St_Johns', b'(GMT-0330) America/St_Johns'), (b'Canada/Newfoundland', b'(GMT-0330) Canada/Newfoundland'), (b'America/Araguaina', b'(GMT-0300) America/Araguaina'), (b'America/Argentina/Buenos_Aires', b'(GMT-0300) America/Argentina/Buenos_Aires'), (b'America/Argentina/Catamarca', b'(GMT-0300) America/Argentina/Catamarca'), (b'America/Argentina/Cordoba', b'(GMT-0300) America/Argentina/Cordoba'), (b'America/Argentina/Jujuy', b'(GMT-0300) America/Argentina/Jujuy'), (b'America/Argentina/La_Rioja', b'(GMT-0300) America/Argentina/La_Rioja'), (b'America/Argentina/Mendoza', b'(GMT-0300) America/Argentina/Mendoza'), (b'America/Argentina/Rio_Gallegos', b'(GMT-0300) America/Argentina/Rio_Gallegos'), (b'America/Argentina/Salta', b'(GMT-0300) America/Argentina/Salta'), (b'America/Argentina/San_Juan', b'(GMT-0300) America/Argentina/San_Juan'), (b'America/Argentina/San_Luis', b'(GMT-0300) America/Argentina/San_Luis'), (b'America/Argentina/Tucuman', b'(GMT-0300) America/Argentina/Tucuman'), (b'America/Argentina/Ushuaia', b'(GMT-0300) America/Argentina/Ushuaia'), (b'America/Asuncion', b'(GMT-0300) America/Asuncion'), (b'America/Bahia', b'(GMT-0300) America/Bahia'), (b'America/Belem', b'(GMT-0300) America/Belem'), (b'America/Campo_Grande', b'(GMT-0300) America/Campo_Grande'), (b'America/Cayenne', b'(GMT-0300) America/Cayenne'), (b'America/Cuiaba', b'(GMT-0300) America/Cuiaba'), (b'America/Fortaleza', b'(GMT-0300) America/Fortaleza'), (b'America/Godthab', b'(GMT-0300) America/Godthab'), (b'America/Maceio', b'(GMT-0300) America/Maceio'), (b'America/Miquelon', b'(GMT-0300) America/Miquelon'), (b'America/Paramaribo', b'(GMT-0300) America/Paramaribo'), (b'America/Recife', b'(GMT-0300) America/Recife'), (b'America/Santarem', b'(GMT-0300) America/Santarem'), (b'America/Santiago', b'(GMT-0300) America/Santiago'), (b'Antarctica/Palmer', b'(GMT-0300) Antarctica/Palmer'), (b'Antarctica/Rothera', b'(GMT-0300) Antarctica/Rothera'), (b'Atlantic/Stanley', b'(GMT-0300) Atlantic/Stanley'), (b'America/Montevideo', b'(GMT-0200) America/Montevideo'), (b'America/Noronha', b'(GMT-0200) America/Noronha'), (b'America/Sao_Paulo', b'(GMT-0200) America/Sao_Paulo'), (b'Atlantic/South_Georgia', b'(GMT-0200) Atlantic/South_Georgia'), (b'America/Scoresbysund', b'(GMT-0100) America/Scoresbysund'), (b'Atlantic/Azores', b'(GMT-0100) Atlantic/Azores'), (b'Atlantic/Cape_Verde', b'(GMT-0100) Atlantic/Cape_Verde'), (b'Africa/Abidjan', b'(GMT+0000) Africa/Abidjan'), (b'Africa/Accra', b'(GMT+0000) Africa/Accra'), (b'Africa/Bamako', b'(GMT+0000) Africa/Bamako'), (b'Africa/Banjul', b'(GMT+0000) Africa/Banjul'), (b'Africa/Bissau', b'(GMT+0000) Africa/Bissau'), (b'Africa/Casablanca', b'(GMT+0000) Africa/Casablanca'), (b'Africa/Conakry', b'(GMT+0000) Africa/Conakry'), (b'Africa/Dakar', b'(GMT+0000) Africa/Dakar'), (b'Africa/El_Aaiun', b'(GMT+0000) Africa/El_Aaiun'), (b'Africa/Freetown', b'(GMT+0000) Africa/Freetown'), (b'Africa/Lome', b'(GMT+0000) Africa/Lome'), (b'Africa/Monrovia', b'(GMT+0000) Africa/Monrovia'), (b'Africa/Nouakchott', b'(GMT+0000) Africa/Nouakchott'), (b'Africa/Ouagadougou', b'(GMT+0000) Africa/Ouagadougou'), (b'Africa/Sao_Tome', b'(GMT+0000) Africa/Sao_Tome'), (b'America/Danmarkshavn', b'(GMT+0000) America/Danmarkshavn'), (b'Antarctica/Troll', b'(GMT+0000) Antarctica/Troll'), (b'Atlantic/Canary', b'(GMT+0000) Atlantic/Canary'), (b'Atlantic/Faroe', b'(GMT+0000) Atlantic/Faroe'), (b'Atlantic/Madeira', b'(GMT+0000) Atlantic/Madeira'), (b'Atlantic/Reykjavik', b'(GMT+0000) Atlantic/Reykjavik'), (b'Atlantic/St_Helena', b'(GMT+0000) Atlantic/St_Helena'), (b'Europe/Dublin', b'(GMT+0000) Europe/Dublin'), (b'Europe/Guernsey', b'(GMT+0000) Europe/Guernsey'), (b'Europe/Isle_of_Man', b'(GMT+0000) Europe/Isle_of_Man'), (b'Europe/Jersey', b'(GMT+0000) Europe/Jersey'), (b'Europe/Lisbon', b'(GMT+0000) Europe/Lisbon'), (b'Europe/London', b'(GMT+0000) Europe/London'), (b'GMT', b'(GMT+0000) GMT'), (b'UTC', b'(GMT+0000) UTC'), (b'Africa/Algiers', b'(GMT+0100) Africa/Algiers'), (b'Africa/Bangui', b'(GMT+0100) Africa/Bangui'), (b'Africa/Brazzaville', b'(GMT+0100) Africa/Brazzaville'), (b'Africa/Ceuta', b'(GMT+0100) Africa/Ceuta'), (b'Africa/Douala', b'(GMT+0100) Africa/Douala'), (b'Africa/Kinshasa', b'(GMT+0100) Africa/Kinshasa'), (b'Africa/Lagos', b'(GMT+0100) Africa/Lagos'), (b'Africa/Libreville', b'(GMT+0100) Africa/Libreville'), (b'Africa/Luanda', b'(GMT+0100) Africa/Luanda'), (b'Africa/Malabo', b'(GMT+0100) Africa/Malabo'), (b'Africa/Ndjamena', b'(GMT+0100) Africa/Ndjamena'), (b'Africa/Niamey', b'(GMT+0100) Africa/Niamey'), (b'Africa/Porto-Novo', b'(GMT+0100) Africa/Porto-Novo'), (b'Africa/Tunis', b'(GMT+0100) Africa/Tunis'), (b'Arctic/Longyearbyen', b'(GMT+0100) Arctic/Longyearbyen'), (b'Europe/Amsterdam', b'(GMT+0100) Europe/Amsterdam'), (b'Europe/Andorra', b'(GMT+0100) Europe/Andorra'), (b'Europe/Belgrade', b'(GMT+0100) Europe/Belgrade'), (b'Europe/Berlin', b'(GMT+0100) Europe/Berlin'), (b'Europe/Bratislava', b'(GMT+0100) Europe/Bratislava'), (b'Europe/Brussels', b'(GMT+0100) Europe/Brussels'), (b'Europe/Budapest', b'(GMT+0100) Europe/Budapest'), (b'Europe/Busingen', b'(GMT+0100) Europe/Busingen'), (b'Europe/Copenhagen', b'(GMT+0100) Europe/Copenhagen'), (b'Europe/Gibraltar', b'(GMT+0100) Europe/Gibraltar'), (b'Europe/Ljubljana', b'(GMT+0100) Europe/Ljubljana'), (b'Europe/Luxembourg', b'(GMT+0100) Europe/Luxembourg'), (b'Europe/Madrid', b'(GMT+0100) Europe/Madrid'), (b'Europe/Malta', b'(GMT+0100) Europe/Malta'), (b'Europe/Monaco', b'(GMT+0100) Europe/Monaco'), (b'Europe/Oslo', b'(GMT+0100) Europe/Oslo'), (b'Europe/Paris', b'(GMT+0100) Europe/Paris'), (b'Europe/Podgorica', b'(GMT+0100) Europe/Podgorica'), (b'Europe/Prague', b'(GMT+0100) Europe/Prague'), (b'Europe/Rome', b'(GMT+0100) Europe/Rome'), (b'Europe/San_Marino', b'(GMT+0100) Europe/San_Marino'), (b'Europe/Sarajevo', b'(GMT+0100) Europe/Sarajevo'), (b'Europe/Skopje', b'(GMT+0100) Europe/Skopje'), (b'Europe/Stockholm', b'(GMT+0100) Europe/Stockholm'), (b'Europe/Tirane', b'(GMT+0100) Europe/Tirane'), (b'Europe/Vaduz', b'(GMT+0100) Europe/Vaduz'), (b'Europe/Vatican', b'(GMT+0100) Europe/Vatican'), (b'Europe/Vienna', b'(GMT+0100) Europe/Vienna'), (b'Europe/Warsaw', b'(GMT+0100) Europe/Warsaw'), (b'Europe/Zagreb', b'(GMT+0100) Europe/Zagreb'), (b'Europe/Zurich', b'(GMT+0100) Europe/Zurich'), (b'Africa/Blantyre', b'(GMT+0200) Africa/Blantyre'), (b'Africa/Bujumbura', b'(GMT+0200) Africa/Bujumbura'), (b'Africa/Cairo', b'(GMT+0200) Africa/Cairo'), (b'Africa/Gaborone', b'(GMT+0200) Africa/Gaborone'), (b'Africa/Harare', b'(GMT+0200) Africa/Harare'), (b'Africa/Johannesburg', b'(GMT+0200) Africa/Johannesburg'), (b'Africa/Kigali', b'(GMT+0200) Africa/Kigali'), (b'Africa/Lubumbashi', b'(GMT+0200) Africa/Lubumbashi'), (b'Africa/Lusaka', b'(GMT+0200) Africa/Lusaka'), (b'Africa/Maputo', b'(GMT+0200) Africa/Maputo'), (b'Africa/Maseru', b'(GMT+0200) Africa/Maseru'), (b'Africa/Mbabane', b'(GMT+0200) Africa/Mbabane'), (b'Africa/Tripoli', b'(GMT+0200) Africa/Tripoli'), (b'Africa/Windhoek', b'(GMT+0200) Africa/Windhoek'), (b'Asia/Amman', b'(GMT+0200) Asia/Amman'), (b'Asia/Beirut', b'(GMT+0200) Asia/Beirut'), (b'Asia/Damascus', b'(GMT+0200) Asia/Damascus'), (b'Asia/Gaza', b'(GMT+0200) Asia/Gaza'), (b'Asia/Hebron', b'(GMT+0200) Asia/Hebron'), (b'Asia/Jerusalem', b'(GMT+0200) Asia/Jerusalem'), (b'Asia/Nicosia', b'(GMT+0200) Asia/Nicosia'), (b'Europe/Athens', b'(GMT+0200) Europe/Athens'), (b'Europe/Bucharest', b'(GMT+0200) Europe/Bucharest'), (b'Europe/Chisinau', b'(GMT+0200) Europe/Chisinau'), (b'Europe/Helsinki', b'(GMT+0200) Europe/Helsinki'), (b'Europe/Istanbul', b'(GMT+0200) Europe/Istanbul'), (b'Europe/Kaliningrad', b'(GMT+0200) Europe/Kaliningrad'), (b'Europe/Kiev', b'(GMT+0200) Europe/Kiev'), (b'Europe/Mariehamn', b'(GMT+0200) Europe/Mariehamn'), (b'Europe/Riga', b'(GMT+0200) Europe/Riga'), (b'Europe/Sofia', b'(GMT+0200) Europe/Sofia'), (b'Europe/Tallinn', b'(GMT+0200) Europe/Tallinn'), (b'Europe/Uzhgorod', b'(GMT+0200) Europe/Uzhgorod'), (b'Europe/Vilnius', b'(GMT+0200) Europe/Vilnius'), (b'Europe/Zaporozhye', b'(GMT+0200) Europe/Zaporozhye'), (b'Africa/Addis_Ababa', b'(GMT+0300) Africa/Addis_Ababa'), (b'Africa/Asmara', b'(GMT+0300) Africa/Asmara'), (b'Africa/Dar_es_Salaam', b'(GMT+0300) Africa/Dar_es_Salaam'), (b'Africa/Djibouti', b'(GMT+0300) Africa/Djibouti'), (b'Africa/Juba', b'(GMT+0300) Africa/Juba'), (b'Africa/Kampala', b'(GMT+0300) Africa/Kampala'), (b'Africa/Khartoum', b'(GMT+0300) Africa/Khartoum'), (b'Africa/Mogadishu', b'(GMT+0300) Africa/Mogadishu'), (b'Africa/Nairobi', b'(GMT+0300) Africa/Nairobi'), (b'Antarctica/Syowa', b'(GMT+0300) Antarctica/Syowa'), (b'Asia/Aden', b'(GMT+0300) Asia/Aden'), (b'Asia/Baghdad', b'(GMT+0300) Asia/Baghdad'), (b'Asia/Bahrain', b'(GMT+0300) Asia/Bahrain'), (b'Asia/Kuwait', b'(GMT+0300) Asia/Kuwait'), (b'Asia/Qatar', b'(GMT+0300) Asia/Qatar'), (b'Asia/Riyadh', b'(GMT+0300) Asia/Riyadh'), (b'Europe/Minsk', b'(GMT+0300) Europe/Minsk'), (b'Europe/Moscow', b'(GMT+0300) Europe/Moscow'), (b'Europe/Simferopol', b'(GMT+0300) Europe/Simferopol'), (b'Europe/Volgograd', b'(GMT+0300) Europe/Volgograd'), (b'Indian/Antananarivo', b'(GMT+0300) Indian/Antananarivo'), (b'Indian/Comoro', b'(GMT+0300) Indian/Comoro'), (b'Indian/Mayotte', b'(GMT+0300) Indian/Mayotte'), (b'Asia/Tehran', b'(GMT+0330) Asia/Tehran'), (b'Asia/Baku', b'(GMT+0400) Asia/Baku'), (b'Asia/Dubai', b'(GMT+0400) Asia/Dubai'), (b'Asia/Muscat', b'(GMT+0400) Asia/Muscat'), (b'Asia/Tbilisi', b'(GMT+0400) Asia/Tbilisi'), (b'Asia/Yerevan', b'(GMT+0400) Asia/Yerevan'), (b'Europe/Samara', b'(GMT+0400) Europe/Samara'), (b'Indian/Mahe', b'(GMT+0400) Indian/Mahe'), (b'Indian/Mauritius', b'(GMT+0400) Indian/Mauritius'), (b'Indian/Reunion', b'(GMT+0400) Indian/Reunion'), (b'Asia/Kabul', b'(GMT+0430) Asia/Kabul'), (b'Antarctica/Mawson', b'(GMT+0500) Antarctica/Mawson'), (b'Asia/Aqtau', b'(GMT+0500) Asia/Aqtau'), (b'Asia/Aqtobe', b'(GMT+0500) Asia/Aqtobe'), (b'Asia/Ashgabat', b'(GMT+0500) Asia/Ashgabat'), (b'Asia/Dushanbe', b'(GMT+0500) Asia/Dushanbe'), (b'Asia/Karachi', b'(GMT+0500) Asia/Karachi'), (b'Asia/Oral', b'(GMT+0500) Asia/Oral'), (b'Asia/Samarkand', b'(GMT+0500) Asia/Samarkand'), (b'Asia/Tashkent', b'(GMT+0500) Asia/Tashkent'), (b'Asia/Yekaterinburg', b'(GMT+0500) Asia/Yekaterinburg'), (b'Indian/Kerguelen', b'(GMT+0500) Indian/Kerguelen'), (b'Indian/Maldives', b'(GMT+0500) Indian/Maldives'), (b'Asia/Colombo', b'(GMT+0530) Asia/Colombo'), (b'Asia/Kolkata', b'(GMT+0530) Asia/Kolkata'), (b'Asia/Kathmandu', b'(GMT+0545) Asia/Kathmandu'), (b'Antarctica/Vostok', b'(GMT+0600) Antarctica/Vostok'), (b'Asia/Almaty', b'(GMT+0600) Asia/Almaty'), (b'Asia/Bishkek', b'(GMT+0600) Asia/Bishkek'), (b'Asia/Dhaka', b'(GMT+0600) Asia/Dhaka'), (b'Asia/Novosibirsk', b'(GMT+0600) Asia/Novosibirsk'), (b'Asia/Omsk', b'(GMT+0600) Asia/Omsk'), (b'Asia/Qyzylorda', b'(GMT+0600) Asia/Qyzylorda'), (b'Asia/Thimphu', b'(GMT+0600) Asia/Thimphu'), (b'Asia/Urumqi', b'(GMT+0600) Asia/Urumqi'), (b'Indian/Chagos', b'(GMT+0600) Indian/Chagos'), (b'Asia/Rangoon', b'(GMT+0630) Asia/Rangoon'), (b'Indian/Cocos', b'(GMT+0630) Indian/Cocos'), (b'Antarctica/Davis', b'(GMT+0700) Antarctica/Davis'), (b'Asia/Bangkok', b'(GMT+0700) Asia/Bangkok'), (b'Asia/Ho_Chi_Minh', b'(GMT+0700) Asia/Ho_Chi_Minh'), (b'Asia/Hovd', b'(GMT+0700) Asia/Hovd'), (b'Asia/Jakarta', b'(GMT+0700) Asia/Jakarta'), (b'Asia/Krasnoyarsk', b'(GMT+0700) Asia/Krasnoyarsk'), (b'Asia/Novokuznetsk', b'(GMT+0700) Asia/Novokuznetsk'), (b'Asia/Phnom_Penh', b'(GMT+0700) Asia/Phnom_Penh'), (b'Asia/Pontianak', b'(GMT+0700) Asia/Pontianak'), (b'Asia/Vientiane', b'(GMT+0700) Asia/Vientiane'), (b'Indian/Christmas', b'(GMT+0700) Indian/Christmas'), (b'Antarctica/Casey', b'(GMT+0800) Antarctica/Casey'), (b'Asia/Brunei', b'(GMT+0800) Asia/Brunei'), (b'Asia/Chita', b'(GMT+0800) Asia/Chita'), (b'Asia/Choibalsan', b'(GMT+0800) Asia/Choibalsan'), (b'Asia/Hong_Kong', b'(GMT+0800) Asia/Hong_Kong'), (b'Asia/Irkutsk', b'(GMT+0800) Asia/Irkutsk'), (b'Asia/Kuala_Lumpur', b'(GMT+0800) Asia/Kuala_Lumpur'), (b'Asia/Kuching', b'(GMT+0800) Asia/Kuching'), (b'Asia/Macau', b'(GMT+0800) Asia/Macau'), (b'Asia/Makassar', b'(GMT+0800) Asia/Makassar'), (b'Asia/Manila', b'(GMT+0800) Asia/Manila'), (b'Asia/Shanghai', b'(GMT+0800) Asia/Shanghai'), (b'Asia/Singapore', b'(GMT+0800) Asia/Singapore'), (b'Asia/Taipei', b'(GMT+0800) Asia/Taipei'), (b'Asia/Ulaanbaatar', b'(GMT+0800) Asia/Ulaanbaatar'), (b'Australia/Perth', b'(GMT+0800) Australia/Perth'), (b'Australia/Eucla', b'(GMT+0845) Australia/Eucla'), (b'Asia/Dili', b'(GMT+0900) Asia/Dili'), (b'Asia/Jayapura', b'(GMT+0900) Asia/Jayapura'), (b'Asia/Khandyga', b'(GMT+0900) Asia/Khandyga'), (b'Asia/Pyongyang', b'(GMT+0900) Asia/Pyongyang'), (b'Asia/Seoul', b'(GMT+0900) Asia/Seoul'), (b'Asia/Tokyo', b'(GMT+0900) Asia/Tokyo'), (b'Asia/Yakutsk', b'(GMT+0900) Asia/Yakutsk'), (b'Pacific/Palau', b'(GMT+0900) Pacific/Palau'), (b'Australia/Darwin', b'(GMT+0930) Australia/Darwin'), (b'Antarctica/DumontDUrville', b'(GMT+1000) Antarctica/DumontDUrville'), (b'Asia/Magadan', b'(GMT+1000) Asia/Magadan'), (b'Asia/Sakhalin', b'(GMT+1000) Asia/Sakhalin'), (b'Asia/Ust-Nera', b'(GMT+1000) Asia/Ust-Nera'), (b'Asia/Vladivostok', b'(GMT+1000) Asia/Vladivostok'), (b'Australia/Brisbane', b'(GMT+1000) Australia/Brisbane'), (b'Australia/Lindeman', b'(GMT+1000) Australia/Lindeman'), (b'Pacific/Chuuk', b'(GMT+1000) Pacific/Chuuk'), (b'Pacific/Guam', b'(GMT+1000) Pacific/Guam'), (b'Pacific/Port_Moresby', b'(GMT+1000) Pacific/Port_Moresby'), (b'Pacific/Saipan', b'(GMT+1000) Pacific/Saipan'), (b'Australia/Adelaide', b'(GMT+1030) Australia/Adelaide'), (b'Australia/Broken_Hill', b'(GMT+1030) Australia/Broken_Hill'), (b'Antarctica/Macquarie', b'(GMT+1100) Antarctica/Macquarie'), (b'Asia/Srednekolymsk', b'(GMT+1100) Asia/Srednekolymsk'), (b'Australia/Currie', b'(GMT+1100) Australia/Currie'), (b'Australia/Hobart', b'(GMT+1100) Australia/Hobart'), (b'Australia/Lord_Howe', b'(GMT+1100) Australia/Lord_Howe'), (b'Australia/Melbourne', b'(GMT+1100) Australia/Melbourne'), (b'Australia/Sydney', b'(GMT+1100) Australia/Sydney'), (b'Pacific/Efate', b'(GMT+1100) Pacific/Efate'), (b'Pacific/Guadalcanal', b'(GMT+1100) Pacific/Guadalcanal'), (b'Pacific/Kosrae', b'(GMT+1100) Pacific/Kosrae'), (b'Pacific/Noumea', b'(GMT+1100) Pacific/Noumea'), (b'Pacific/Pohnpei', b'(GMT+1100) Pacific/Pohnpei'), (b'Pacific/Norfolk', b'(GMT+1130) Pacific/Norfolk'), (b'Asia/Anadyr', b'(GMT+1200) Asia/Anadyr'), (b'Asia/Kamchatka', b'(GMT+1200) Asia/Kamchatka'), (b'Pacific/Funafuti', b'(GMT+1200) Pacific/Funafuti'), (b'Pacific/Kwajalein', b'(GMT+1200) Pacific/Kwajalein'), (b'Pacific/Majuro', b'(GMT+1200) Pacific/Majuro'), (b'Pacific/Nauru', b'(GMT+1200) Pacific/Nauru'), (b'Pacific/Tarawa', b'(GMT+1200) Pacific/Tarawa'), (b'Pacific/Wake', b'(GMT+1200) Pacific/Wake'), (b'Pacific/Wallis', b'(GMT+1200) Pacific/Wallis'), (b'Antarctica/McMurdo', b'(GMT+1300) Antarctica/McMurdo'), (b'Pacific/Auckland', b'(GMT+1300) Pacific/Auckland'), (b'Pacific/Enderbury', b'(GMT+1300) Pacific/Enderbury'), (b'Pacific/Fakaofo', b'(GMT+1300) Pacific/Fakaofo'), (b'Pacific/Fiji', b'(GMT+1300) Pacific/Fiji'), (b'Pacific/Tongatapu', b'(GMT+1300) Pacific/Tongatapu'), (b'Pacific/Chatham', b'(GMT+1345) Pacific/Chatham'), (b'Pacific/Apia', b'(GMT+1400) Pacific/Apia'), (b'Pacific/Kiritimati', b'(GMT+1400) Pacific/Kiritimati')])),
+                ('timezone', timezones.fields.TimeZoneField(default=b'America/New_York', max_length=100, choices=[(b'Pacific/Midway', b'(GMT-1100) Pacific/Midway'), (b'Pacific/Niue', b'(GMT-1100) Pacific/Niue'), (b'Pacific/Pago_Pago', b'(GMT-1100) Pacific/Pago_Pago'), (b'America/Adak', b'(GMT-1000) America/Adak'), (b'Pacific/Honolulu', b'(GMT-1000) Pacific/Honolulu'), (b'Pacific/Johnston', b'(GMT-1000) Pacific/Johnston'), (b'Pacific/Rarotonga', b'(GMT-1000) Pacific/Rarotonga'), (b'Pacific/Tahiti', b'(GMT-1000) Pacific/Tahiti'), (b'US/Hawaii', b'(GMT-1000) US/Hawaii'), (b'Pacific/Marquesas', b'(GMT-0930) Pacific/Marquesas'), (b'America/Anchorage', b'(GMT-0900) America/Anchorage'), (b'America/Juneau', b'(GMT-0900) America/Juneau'), (b'America/Nome', b'(GMT-0900) America/Nome'), (b'America/Sitka', b'(GMT-0900) America/Sitka'), (b'America/Yakutat', b'(GMT-0900) America/Yakutat'), (b'Pacific/Gambier', b'(GMT-0900) Pacific/Gambier'), (b'US/Alaska', b'(GMT-0900) US/Alaska'), (b'America/Dawson', b'(GMT-0800) America/Dawson'), (b'America/Los_Angeles', b'(GMT-0800) America/Los_Angeles'), (b'America/Metlakatla', b'(GMT-0800) America/Metlakatla'), (b'America/Santa_Isabel', b'(GMT-0800) America/Santa_Isabel'), (b'America/Tijuana', b'(GMT-0800) America/Tijuana'), (b'America/Vancouver', b'(GMT-0800) America/Vancouver'), (b'America/Whitehorse', b'(GMT-0800) America/Whitehorse'), (b'Canada/Pacific', b'(GMT-0800) Canada/Pacific'), (b'Pacific/Pitcairn', b'(GMT-0800) Pacific/Pitcairn'), (b'US/Pacific', b'(GMT-0800) US/Pacific'), (b'America/Boise', b'(GMT-0700) America/Boise'), (b'America/Cambridge_Bay', b'(GMT-0700) America/Cambridge_Bay'), (b'America/Chihuahua', b'(GMT-0700) America/Chihuahua'), (b'America/Creston', b'(GMT-0700) America/Creston'), (b'America/Dawson_Creek', b'(GMT-0700) America/Dawson_Creek'), (b'America/Denver', b'(GMT-0700) America/Denver'), (b'America/Edmonton', b'(GMT-0700) America/Edmonton'), (b'America/Hermosillo', b'(GMT-0700) America/Hermosillo'), (b'America/Inuvik', b'(GMT-0700) America/Inuvik'), (b'America/Mazatlan', b'(GMT-0700) America/Mazatlan'), (b'America/Ojinaga', b'(GMT-0700) America/Ojinaga'), (b'America/Phoenix', b'(GMT-0700) America/Phoenix'), (b'America/Shiprock', b'(GMT-0700) America/Shiprock'), (b'America/Yellowknife', b'(GMT-0700) America/Yellowknife'), (b'Canada/Mountain', b'(GMT-0700) Canada/Mountain'), (b'US/Arizona', b'(GMT-0700) US/Arizona'), (b'US/Mountain', b'(GMT-0700) US/Mountain'), (b'America/Bahia_Banderas', b'(GMT-0600) America/Bahia_Banderas'), (b'America/Belize', b'(GMT-0600) America/Belize'), (b'America/Cancun', b'(GMT-0600) America/Cancun'), (b'America/Chicago', b'(GMT-0600) America/Chicago'), (b'America/Costa_Rica', b'(GMT-0600) America/Costa_Rica'), (b'America/El_Salvador', b'(GMT-0600) America/El_Salvador'), (b'America/Guatemala', b'(GMT-0600) America/Guatemala'), (b'America/Indiana/Knox', b'(GMT-0600) America/Indiana/Knox'), (b'America/Indiana/Tell_City', b'(GMT-0600) America/Indiana/Tell_City'), (b'America/Managua', b'(GMT-0600) America/Managua'), (b'America/Matamoros', b'(GMT-0600) America/Matamoros'), (b'America/Menominee', b'(GMT-0600) America/Menominee'), (b'America/Merida', b'(GMT-0600) America/Merida'), (b'America/Mexico_City', b'(GMT-0600) America/Mexico_City'), (b'America/Monterrey', b'(GMT-0600) America/Monterrey'), (b'America/North_Dakota/Beulah', b'(GMT-0600) America/North_Dakota/Beulah'), (b'America/North_Dakota/Center', b'(GMT-0600) America/North_Dakota/Center'), (b'America/North_Dakota/New_Salem', b'(GMT-0600) America/North_Dakota/New_Salem'), (b'America/Rainy_River', b'(GMT-0600) America/Rainy_River'), (b'America/Rankin_Inlet', b'(GMT-0600) America/Rankin_Inlet'), (b'America/Regina', b'(GMT-0600) America/Regina'), (b'America/Resolute', b'(GMT-0600) America/Resolute'), (b'America/Swift_Current', b'(GMT-0600) America/Swift_Current'), (b'America/Tegucigalpa', b'(GMT-0600) America/Tegucigalpa'), (b'America/Winnipeg', b'(GMT-0600) America/Winnipeg'), (b'Canada/Central', b'(GMT-0600) Canada/Central'), (b'Pacific/Galapagos', b'(GMT-0600) Pacific/Galapagos'), (b'US/Central', b'(GMT-0600) US/Central'), (b'America/Atikokan', b'(GMT-0500) America/Atikokan'), (b'America/Bogota', b'(GMT-0500) America/Bogota'), (b'America/Cayman', b'(GMT-0500) America/Cayman'), (b'America/Detroit', b'(GMT-0500) America/Detroit'), (b'America/Eirunepe', b'(GMT-0500) America/Eirunepe'), (b'America/Grand_Turk', b'(GMT-0500) America/Grand_Turk'), (b'America/Guayaquil', b'(GMT-0500) America/Guayaquil'), (b'America/Havana', b'(GMT-0500) America/Havana'), (b'America/Indiana/Indianapolis', b'(GMT-0500) America/Indiana/Indianapolis'), (b'America/Indiana/Marengo', b'(GMT-0500) America/Indiana/Marengo'), (b'America/Indiana/Petersburg', b'(GMT-0500) America/Indiana/Petersburg'), (b'America/Indiana/Vevay', b'(GMT-0500) America/Indiana/Vevay'), (b'America/Indiana/Vincennes', b'(GMT-0500) America/Indiana/Vincennes'), (b'America/Indiana/Winamac', b'(GMT-0500) America/Indiana/Winamac'), (b'America/Iqaluit', b'(GMT-0500) America/Iqaluit'), (b'America/Jamaica', b'(GMT-0500) America/Jamaica'), (b'America/Kentucky/Louisville', b'(GMT-0500) America/Kentucky/Louisville'), (b'America/Kentucky/Monticello', b'(GMT-0500) America/Kentucky/Monticello'), (b'America/Lima', b'(GMT-0500) America/Lima'), (b'America/Montreal', b'(GMT-0500) America/Montreal'), (b'America/Nassau', b'(GMT-0500) America/Nassau'), (b'America/New_York', b'(GMT-0500) America/New_York'), (b'America/Nipigon', b'(GMT-0500) America/Nipigon'), (b'America/Panama', b'(GMT-0500) America/Panama'), (b'America/Pangnirtung', b'(GMT-0500) America/Pangnirtung'), (b'America/Port-au-Prince', b'(GMT-0500) America/Port-au-Prince'), (b'America/Rio_Branco', b'(GMT-0500) America/Rio_Branco'), (b'America/Thunder_Bay', b'(GMT-0500) America/Thunder_Bay'), (b'America/Toronto', b'(GMT-0500) America/Toronto'), (b'Canada/Eastern', b'(GMT-0500) Canada/Eastern'), (b'Pacific/Easter', b'(GMT-0500) Pacific/Easter'), (b'US/Eastern', b'(GMT-0500) US/Eastern'), (b'America/Caracas', b'(GMT-0430) America/Caracas'), (b'America/Anguilla', b'(GMT-0400) America/Anguilla'), (b'America/Antigua', b'(GMT-0400) America/Antigua'), (b'America/Aruba', b'(GMT-0400) America/Aruba'), (b'America/Barbados', b'(GMT-0400) America/Barbados'), (b'America/Blanc-Sablon', b'(GMT-0400) America/Blanc-Sablon'), (b'America/Boa_Vista', b'(GMT-0400) America/Boa_Vista'), (b'America/Curacao', b'(GMT-0400) America/Curacao'), (b'America/Dominica', b'(GMT-0400) America/Dominica'), (b'America/Glace_Bay', b'(GMT-0400) America/Glace_Bay'), (b'America/Goose_Bay', b'(GMT-0400) America/Goose_Bay'), (b'America/Grenada', b'(GMT-0400) America/Grenada'), (b'America/Guadeloupe', b'(GMT-0400) America/Guadeloupe'), (b'America/Guyana', b'(GMT-0400) America/Guyana'), (b'America/Halifax', b'(GMT-0400) America/Halifax'), (b'America/Kralendijk', b'(GMT-0400) America/Kralendijk'), (b'America/La_Paz', b'(GMT-0400) America/La_Paz'), (b'America/Lower_Princes', b'(GMT-0400) America/Lower_Princes'), (b'America/Manaus', b'(GMT-0400) America/Manaus'), (b'America/Marigot', b'(GMT-0400) America/Marigot'), (b'America/Martinique', b'(GMT-0400) America/Martinique'), (b'America/Moncton', b'(GMT-0400) America/Moncton'), (b'America/Montserrat', b'(GMT-0400) America/Montserrat'), (b'America/Port_of_Spain', b'(GMT-0400) America/Port_of_Spain'), (b'America/Porto_Velho', b'(GMT-0400) America/Porto_Velho'), (b'America/Puerto_Rico', b'(GMT-0400) America/Puerto_Rico'), (b'America/Santo_Domingo', b'(GMT-0400) America/Santo_Domingo'), (b'America/St_Barthelemy', b'(GMT-0400) America/St_Barthelemy'), (b'America/St_Kitts', b'(GMT-0400) America/St_Kitts'), (b'America/St_Lucia', b'(GMT-0400) America/St_Lucia'), (b'America/St_Thomas', b'(GMT-0400) America/St_Thomas'), (b'America/St_Vincent', b'(GMT-0400) America/St_Vincent'), (b'America/Thule', b'(GMT-0400) America/Thule'), (b'America/Tortola', b'(GMT-0400) America/Tortola'), (b'Atlantic/Bermuda', b'(GMT-0400) Atlantic/Bermuda'), (b'Canada/Atlantic', b'(GMT-0400) Canada/Atlantic'), (b'America/St_Johns', b'(GMT-0330) America/St_Johns'), (b'Canada/Newfoundland', b'(GMT-0330) Canada/Newfoundland'), (b'America/Araguaina', b'(GMT-0300) America/Araguaina'), (b'America/Argentina/Buenos_Aires', b'(GMT-0300) America/Argentina/Buenos_Aires'), (b'America/Argentina/Catamarca', b'(GMT-0300) America/Argentina/Catamarca'), (b'America/Argentina/Cordoba', b'(GMT-0300) America/Argentina/Cordoba'), (b'America/Argentina/Jujuy', b'(GMT-0300) America/Argentina/Jujuy'), (b'America/Argentina/La_Rioja', b'(GMT-0300) America/Argentina/La_Rioja'), (b'America/Argentina/Mendoza', b'(GMT-0300) America/Argentina/Mendoza'), (b'America/Argentina/Rio_Gallegos', b'(GMT-0300) America/Argentina/Rio_Gallegos'), (b'America/Argentina/Salta', b'(GMT-0300) America/Argentina/Salta'), (b'America/Argentina/San_Juan', b'(GMT-0300) America/Argentina/San_Juan'), (b'America/Argentina/San_Luis', b'(GMT-0300) America/Argentina/San_Luis'), (b'America/Argentina/Tucuman', b'(GMT-0300) America/Argentina/Tucuman'), (b'America/Argentina/Ushuaia', b'(GMT-0300) America/Argentina/Ushuaia'), (b'America/Asuncion', b'(GMT-0300) America/Asuncion'), (b'America/Bahia', b'(GMT-0300) America/Bahia'), (b'America/Belem', b'(GMT-0300) America/Belem'), (b'America/Campo_Grande', b'(GMT-0300) America/Campo_Grande'), (b'America/Cayenne', b'(GMT-0300) America/Cayenne'), (b'America/Cuiaba', b'(GMT-0300) America/Cuiaba'), (b'America/Fortaleza', b'(GMT-0300) America/Fortaleza'), (b'America/Godthab', b'(GMT-0300) America/Godthab'), (b'America/Maceio', b'(GMT-0300) America/Maceio'), (b'America/Miquelon', b'(GMT-0300) America/Miquelon'), (b'America/Paramaribo', b'(GMT-0300) America/Paramaribo'), (b'America/Recife', b'(GMT-0300) America/Recife'), (b'America/Santarem', b'(GMT-0300) America/Santarem'), (b'America/Santiago', b'(GMT-0300) America/Santiago'), (b'Antarctica/Palmer', b'(GMT-0300) Antarctica/Palmer'), (b'Antarctica/Rothera', b'(GMT-0300) Antarctica/Rothera'), (b'Atlantic/Stanley', b'(GMT-0300) Atlantic/Stanley'), (b'America/Montevideo', b'(GMT-0200) America/Montevideo'), (b'America/Noronha', b'(GMT-0200) America/Noronha'), (b'America/Sao_Paulo', b'(GMT-0200) America/Sao_Paulo'), (b'Atlantic/South_Georgia', b'(GMT-0200) Atlantic/South_Georgia'), (b'America/Scoresbysund', b'(GMT-0100) America/Scoresbysund'), (b'Atlantic/Azores', b'(GMT-0100) Atlantic/Azores'), (b'Atlantic/Cape_Verde', b'(GMT-0100) Atlantic/Cape_Verde'), (b'Africa/Abidjan', b'(GMT+0000) Africa/Abidjan'), (b'Africa/Accra', b'(GMT+0000) Africa/Accra'), (b'Africa/Bamako', b'(GMT+0000) Africa/Bamako'), (b'Africa/Banjul', b'(GMT+0000) Africa/Banjul'), (b'Africa/Bissau', b'(GMT+0000) Africa/Bissau'), (b'Africa/Casablanca', b'(GMT+0000) Africa/Casablanca'), (b'Africa/Conakry', b'(GMT+0000) Africa/Conakry'), (b'Africa/Dakar', b'(GMT+0000) Africa/Dakar'), (b'Africa/El_Aaiun', b'(GMT+0000) Africa/El_Aaiun'), (b'Africa/Freetown', b'(GMT+0000) Africa/Freetown'), (b'Africa/Lome', b'(GMT+0000) Africa/Lome'), (b'Africa/Monrovia', b'(GMT+0000) Africa/Monrovia'), (b'Africa/Nouakchott', b'(GMT+0000) Africa/Nouakchott'), (b'Africa/Ouagadougou', b'(GMT+0000) Africa/Ouagadougou'), (b'Africa/Sao_Tome', b'(GMT+0000) Africa/Sao_Tome'), (b'America/Danmarkshavn', b'(GMT+0000) America/Danmarkshavn'), (b'Atlantic/Canary', b'(GMT+0000) Atlantic/Canary'), (b'Atlantic/Faroe', b'(GMT+0000) Atlantic/Faroe'), (b'Atlantic/Madeira', b'(GMT+0000) Atlantic/Madeira'), (b'Atlantic/Reykjavik', b'(GMT+0000) Atlantic/Reykjavik'), (b'Atlantic/St_Helena', b'(GMT+0000) Atlantic/St_Helena'), (b'Europe/Dublin', b'(GMT+0000) Europe/Dublin'), (b'Europe/Guernsey', b'(GMT+0000) Europe/Guernsey'), (b'Europe/Isle_of_Man', b'(GMT+0000) Europe/Isle_of_Man'), (b'Europe/Jersey', b'(GMT+0000) Europe/Jersey'), (b'Europe/Lisbon', b'(GMT+0000) Europe/Lisbon'), (b'Europe/London', b'(GMT+0000) Europe/London'), (b'GMT', b'(GMT+0000) GMT'), (b'UTC', b'(GMT+0000) UTC'), (b'Africa/Algiers', b'(GMT+0100) Africa/Algiers'), (b'Africa/Bangui', b'(GMT+0100) Africa/Bangui'), (b'Africa/Brazzaville', b'(GMT+0100) Africa/Brazzaville'), (b'Africa/Ceuta', b'(GMT+0100) Africa/Ceuta'), (b'Africa/Douala', b'(GMT+0100) Africa/Douala'), (b'Africa/Kinshasa', b'(GMT+0100) Africa/Kinshasa'), (b'Africa/Lagos', b'(GMT+0100) Africa/Lagos'), (b'Africa/Libreville', b'(GMT+0100) Africa/Libreville'), (b'Africa/Luanda', b'(GMT+0100) Africa/Luanda'), (b'Africa/Malabo', b'(GMT+0100) Africa/Malabo'), (b'Africa/Ndjamena', b'(GMT+0100) Africa/Ndjamena'), (b'Africa/Niamey', b'(GMT+0100) Africa/Niamey'), (b'Africa/Porto-Novo', b'(GMT+0100) Africa/Porto-Novo'), (b'Africa/Tunis', b'(GMT+0100) Africa/Tunis'), (b'Arctic/Longyearbyen', b'(GMT+0100) Arctic/Longyearbyen'), (b'Europe/Amsterdam', b'(GMT+0100) Europe/Amsterdam'), (b'Europe/Andorra', b'(GMT+0100) Europe/Andorra'), (b'Europe/Belgrade', b'(GMT+0100) Europe/Belgrade'), (b'Europe/Berlin', b'(GMT+0100) Europe/Berlin'), (b'Europe/Bratislava', b'(GMT+0100) Europe/Bratislava'), (b'Europe/Brussels', b'(GMT+0100) Europe/Brussels'), (b'Europe/Budapest', b'(GMT+0100) Europe/Budapest'), (b'Europe/Copenhagen', b'(GMT+0100) Europe/Copenhagen'), (b'Europe/Gibraltar', b'(GMT+0100) Europe/Gibraltar'), (b'Europe/Ljubljana', b'(GMT+0100) Europe/Ljubljana'), (b'Europe/Luxembourg', b'(GMT+0100) Europe/Luxembourg'), (b'Europe/Madrid', b'(GMT+0100) Europe/Madrid'), (b'Europe/Malta', b'(GMT+0100) Europe/Malta'), (b'Europe/Monaco', b'(GMT+0100) Europe/Monaco'), (b'Europe/Oslo', b'(GMT+0100) Europe/Oslo'), (b'Europe/Paris', b'(GMT+0100) Europe/Paris'), (b'Europe/Podgorica', b'(GMT+0100) Europe/Podgorica'), (b'Europe/Prague', b'(GMT+0100) Europe/Prague'), (b'Europe/Rome', b'(GMT+0100) Europe/Rome'), (b'Europe/San_Marino', b'(GMT+0100) Europe/San_Marino'), (b'Europe/Sarajevo', b'(GMT+0100) Europe/Sarajevo'), (b'Europe/Skopje', b'(GMT+0100) Europe/Skopje'), (b'Europe/Stockholm', b'(GMT+0100) Europe/Stockholm'), (b'Europe/Tirane', b'(GMT+0100) Europe/Tirane'), (b'Europe/Vaduz', b'(GMT+0100) Europe/Vaduz'), (b'Europe/Vatican', b'(GMT+0100) Europe/Vatican'), (b'Europe/Vienna', b'(GMT+0100) Europe/Vienna'), (b'Europe/Warsaw', b'(GMT+0100) Europe/Warsaw'), (b'Europe/Zagreb', b'(GMT+0100) Europe/Zagreb'), (b'Europe/Zurich', b'(GMT+0100) Europe/Zurich'), (b'Africa/Blantyre', b'(GMT+0200) Africa/Blantyre'), (b'Africa/Bujumbura', b'(GMT+0200) Africa/Bujumbura'), (b'Africa/Cairo', b'(GMT+0200) Africa/Cairo'), (b'Africa/Gaborone', b'(GMT+0200) Africa/Gaborone'), (b'Africa/Harare', b'(GMT+0200) Africa/Harare'), (b'Africa/Johannesburg', b'(GMT+0200) Africa/Johannesburg'), (b'Africa/Kigali', b'(GMT+0200) Africa/Kigali'), (b'Africa/Lubumbashi', b'(GMT+0200) Africa/Lubumbashi'), (b'Africa/Lusaka', b'(GMT+0200) Africa/Lusaka'), (b'Africa/Maputo', b'(GMT+0200) Africa/Maputo'), (b'Africa/Maseru', b'(GMT+0200) Africa/Maseru'), (b'Africa/Mbabane', b'(GMT+0200) Africa/Mbabane'), (b'Africa/Tripoli', b'(GMT+0200) Africa/Tripoli'), (b'Africa/Windhoek', b'(GMT+0200) Africa/Windhoek'), (b'Asia/Amman', b'(GMT+0200) Asia/Amman'), (b'Asia/Beirut', b'(GMT+0200) Asia/Beirut'), (b'Asia/Damascus', b'(GMT+0200) Asia/Damascus'), (b'Asia/Gaza', b'(GMT+0200) Asia/Gaza'), (b'Asia/Hebron', b'(GMT+0200) Asia/Hebron'), (b'Asia/Jerusalem', b'(GMT+0200) Asia/Jerusalem'), (b'Asia/Nicosia', b'(GMT+0200) Asia/Nicosia'), (b'Europe/Athens', b'(GMT+0200) Europe/Athens'), (b'Europe/Bucharest', b'(GMT+0200) Europe/Bucharest'), (b'Europe/Chisinau', b'(GMT+0200) Europe/Chisinau'), (b'Europe/Helsinki', b'(GMT+0200) Europe/Helsinki'), (b'Europe/Istanbul', b'(GMT+0200) Europe/Istanbul'), (b'Europe/Kiev', b'(GMT+0200) Europe/Kiev'), (b'Europe/Mariehamn', b'(GMT+0200) Europe/Mariehamn'), (b'Europe/Riga', b'(GMT+0200) Europe/Riga'), (b'Europe/Sofia', b'(GMT+0200) Europe/Sofia'), (b'Europe/Tallinn', b'(GMT+0200) Europe/Tallinn'), (b'Europe/Uzhgorod', b'(GMT+0200) Europe/Uzhgorod'), (b'Europe/Vilnius', b'(GMT+0200) Europe/Vilnius'), (b'Europe/Zaporozhye', b'(GMT+0200) Europe/Zaporozhye'), (b'Africa/Addis_Ababa', b'(GMT+0300) Africa/Addis_Ababa'), (b'Africa/Asmara', b'(GMT+0300) Africa/Asmara'), (b'Africa/Dar_es_Salaam', b'(GMT+0300) Africa/Dar_es_Salaam'), (b'Africa/Djibouti', b'(GMT+0300) Africa/Djibouti'), (b'Africa/Juba', b'(GMT+0300) Africa/Juba'), (b'Africa/Kampala', b'(GMT+0300) Africa/Kampala'), (b'Africa/Khartoum', b'(GMT+0300) Africa/Khartoum'), (b'Africa/Mogadishu', b'(GMT+0300) Africa/Mogadishu'), (b'Africa/Nairobi', b'(GMT+0300) Africa/Nairobi'), (b'Antarctica/Syowa', b'(GMT+0300) Antarctica/Syowa'), (b'Asia/Aden', b'(GMT+0300) Asia/Aden'), (b'Asia/Baghdad', b'(GMT+0300) Asia/Baghdad'), (b'Asia/Bahrain', b'(GMT+0300) Asia/Bahrain'), (b'Asia/Kuwait', b'(GMT+0300) Asia/Kuwait'), (b'Asia/Qatar', b'(GMT+0300) Asia/Qatar'), (b'Asia/Riyadh', b'(GMT+0300) Asia/Riyadh'), (b'Europe/Kaliningrad', b'(GMT+0300) Europe/Kaliningrad'), (b'Europe/Minsk', b'(GMT+0300) Europe/Minsk'), (b'Indian/Antananarivo', b'(GMT+0300) Indian/Antananarivo'), (b'Indian/Comoro', b'(GMT+0300) Indian/Comoro'), (b'Indian/Mayotte', b'(GMT+0300) Indian/Mayotte'), (b'Asia/Tehran', b'(GMT+0330) Asia/Tehran'), (b'Asia/Baku', b'(GMT+0400) Asia/Baku'), (b'Asia/Dubai', b'(GMT+0400) Asia/Dubai'), (b'Asia/Muscat', b'(GMT+0400) Asia/Muscat'), (b'Asia/Tbilisi', b'(GMT+0400) Asia/Tbilisi'), (b'Asia/Yerevan', b'(GMT+0400) Asia/Yerevan'), (b'Europe/Moscow', b'(GMT+0400) Europe/Moscow'), (b'Europe/Samara', b'(GMT+0400) Europe/Samara'), (b'Europe/Simferopol', b'(GMT+0400) Europe/Simferopol'), (b'Europe/Volgograd', b'(GMT+0400) Europe/Volgograd'), (b'Indian/Mahe', b'(GMT+0400) Indian/Mahe'), (b'Indian/Mauritius', b'(GMT+0400) Indian/Mauritius'), (b'Indian/Reunion', b'(GMT+0400) Indian/Reunion'), (b'Asia/Kabul', b'(GMT+0430) Asia/Kabul'), (b'Antarctica/Mawson', b'(GMT+0500) Antarctica/Mawson'), (b'Asia/Aqtau', b'(GMT+0500) Asia/Aqtau'), (b'Asia/Aqtobe', b'(GMT+0500) Asia/Aqtobe'), (b'Asia/Ashgabat', b'(GMT+0500) Asia/Ashgabat'), (b'Asia/Dushanbe', b'(GMT+0500) Asia/Dushanbe'), (b'Asia/Karachi', b'(GMT+0500) Asia/Karachi'), (b'Asia/Oral', b'(GMT+0500) Asia/Oral'), (b'Asia/Samarkand', b'(GMT+0500) Asia/Samarkand'), (b'Asia/Tashkent', b'(GMT+0500) Asia/Tashkent'), (b'Indian/Kerguelen', b'(GMT+0500) Indian/Kerguelen'), (b'Indian/Maldives', b'(GMT+0500) Indian/Maldives'), (b'Asia/Colombo', b'(GMT+0530) Asia/Colombo'), (b'Asia/Kolkata', b'(GMT+0530) Asia/Kolkata'), (b'Asia/Kathmandu', b'(GMT+0545) Asia/Kathmandu'), (b'Antarctica/Vostok', b'(GMT+0600) Antarctica/Vostok'), (b'Asia/Almaty', b'(GMT+0600) Asia/Almaty'), (b'Asia/Bishkek', b'(GMT+0600) Asia/Bishkek'), (b'Asia/Dhaka', b'(GMT+0600) Asia/Dhaka'), (b'Asia/Qyzylorda', b'(GMT+0600) Asia/Qyzylorda'), (b'Asia/Thimphu', b'(GMT+0600) Asia/Thimphu'), (b'Asia/Yekaterinburg', b'(GMT+0600) Asia/Yekaterinburg'), (b'Indian/Chagos', b'(GMT+0600) Indian/Chagos'), (b'Asia/Rangoon', b'(GMT+0630) Asia/Rangoon'), (b'Indian/Cocos', b'(GMT+0630) Indian/Cocos'), (b'Antarctica/Davis', b'(GMT+0700) Antarctica/Davis'), (b'Asia/Bangkok', b'(GMT+0700) Asia/Bangkok'), (b'Asia/Ho_Chi_Minh', b'(GMT+0700) Asia/Ho_Chi_Minh'), (b'Asia/Hovd', b'(GMT+0700) Asia/Hovd'), (b'Asia/Jakarta', b'(GMT+0700) Asia/Jakarta'), (b'Asia/Novokuznetsk', b'(GMT+0700) Asia/Novokuznetsk'), (b'Asia/Novosibirsk', b'(GMT+0700) Asia/Novosibirsk'), (b'Asia/Omsk', b'(GMT+0700) Asia/Omsk'), (b'Asia/Phnom_Penh', b'(GMT+0700) Asia/Phnom_Penh'), (b'Asia/Pontianak', b'(GMT+0700) Asia/Pontianak'), (b'Asia/Vientiane', b'(GMT+0700) Asia/Vientiane'), (b'Indian/Christmas', b'(GMT+0700) Indian/Christmas'), (b'Antarctica/Casey', b'(GMT+0800) Antarctica/Casey'), (b'Asia/Brunei', b'(GMT+0800) Asia/Brunei'), (b'Asia/Choibalsan', b'(GMT+0800) Asia/Choibalsan'), (b'Asia/Chongqing', b'(GMT+0800) Asia/Chongqing'), (b'Asia/Harbin', b'(GMT+0800) Asia/Harbin'), (b'Asia/Hong_Kong', b'(GMT+0800) Asia/Hong_Kong'), (b'Asia/Kashgar', b'(GMT+0800) Asia/Kashgar'), (b'Asia/Krasnoyarsk', b'(GMT+0800) Asia/Krasnoyarsk'), (b'Asia/Kuala_Lumpur', b'(GMT+0800) Asia/Kuala_Lumpur'), (b'Asia/Kuching', b'(GMT+0800) Asia/Kuching'), (b'Asia/Macau', b'(GMT+0800) Asia/Macau'), (b'Asia/Makassar', b'(GMT+0800) Asia/Makassar'), (b'Asia/Manila', b'(GMT+0800) Asia/Manila'), (b'Asia/Shanghai', b'(GMT+0800) Asia/Shanghai'), (b'Asia/Singapore', b'(GMT+0800) Asia/Singapore'), (b'Asia/Taipei', b'(GMT+0800) Asia/Taipei'), (b'Asia/Ulaanbaatar', b'(GMT+0800) Asia/Ulaanbaatar'), (b'Asia/Urumqi', b'(GMT+0800) Asia/Urumqi'), (b'Australia/Perth', b'(GMT+0800) Australia/Perth'), (b'Australia/Eucla', b'(GMT+0845) Australia/Eucla'), (b'Asia/Dili', b'(GMT+0900) Asia/Dili'), (b'Asia/Irkutsk', b'(GMT+0900) Asia/Irkutsk'), (b'Asia/Jayapura', b'(GMT+0900) Asia/Jayapura'), (b'Asia/Pyongyang', b'(GMT+0900) Asia/Pyongyang'), (b'Asia/Seoul', b'(GMT+0900) Asia/Seoul'), (b'Asia/Tokyo', b'(GMT+0900) Asia/Tokyo'), (b'Pacific/Palau', b'(GMT+0900) Pacific/Palau'), (b'Australia/Darwin', b'(GMT+0930) Australia/Darwin'), (b'Antarctica/DumontDUrville', b'(GMT+1000) Antarctica/DumontDUrville'), (b'Asia/Yakutsk', b'(GMT+1000) Asia/Yakutsk'), (b'Australia/Brisbane', b'(GMT+1000) Australia/Brisbane'), (b'Australia/Lindeman', b'(GMT+1000) Australia/Lindeman'), (b'Pacific/Chuuk', b'(GMT+1000) Pacific/Chuuk'), (b'Pacific/Guam', b'(GMT+1000) Pacific/Guam'), (b'Pacific/Port_Moresby', b'(GMT+1000) Pacific/Port_Moresby'), (b'Pacific/Saipan', b'(GMT+1000) Pacific/Saipan'), (b'Australia/Adelaide', b'(GMT+1030) Australia/Adelaide'), (b'Australia/Broken_Hill', b'(GMT+1030) Australia/Broken_Hill'), (b'Antarctica/Macquarie', b'(GMT+1100) Antarctica/Macquarie'), (b'Asia/Sakhalin', b'(GMT+1100) Asia/Sakhalin'), (b'Asia/Vladivostok', b'(GMT+1100) Asia/Vladivostok'), (b'Australia/Currie', b'(GMT+1100) Australia/Currie'), (b'Australia/Hobart', b'(GMT+1100) Australia/Hobart'), (b'Australia/Lord_Howe', b'(GMT+1100) Australia/Lord_Howe'), (b'Australia/Melbourne', b'(GMT+1100) Australia/Melbourne'), (b'Australia/Sydney', b'(GMT+1100) Australia/Sydney'), (b'Pacific/Efate', b'(GMT+1100) Pacific/Efate'), (b'Pacific/Guadalcanal', b'(GMT+1100) Pacific/Guadalcanal'), (b'Pacific/Kosrae', b'(GMT+1100) Pacific/Kosrae'), (b'Pacific/Noumea', b'(GMT+1100) Pacific/Noumea'), (b'Pacific/Pohnpei', b'(GMT+1100) Pacific/Pohnpei'), (b'Pacific/Norfolk', b'(GMT+1130) Pacific/Norfolk'), (b'Asia/Anadyr', b'(GMT+1200) Asia/Anadyr'), (b'Asia/Kamchatka', b'(GMT+1200) Asia/Kamchatka'), (b'Asia/Magadan', b'(GMT+1200) Asia/Magadan'), (b'Pacific/Funafuti', b'(GMT+1200) Pacific/Funafuti'), (b'Pacific/Kwajalein', b'(GMT+1200) Pacific/Kwajalein'), (b'Pacific/Majuro', b'(GMT+1200) Pacific/Majuro'), (b'Pacific/Nauru', b'(GMT+1200) Pacific/Nauru'), (b'Pacific/Tarawa', b'(GMT+1200) Pacific/Tarawa'), (b'Pacific/Wake', b'(GMT+1200) Pacific/Wake'), (b'Pacific/Wallis', b'(GMT+1200) Pacific/Wallis'), (b'Antarctica/McMurdo', b'(GMT+1300) Antarctica/McMurdo'), (b'Antarctica/South_Pole', b'(GMT+1300) Antarctica/South_Pole'), (b'Pacific/Auckland', b'(GMT+1300) Pacific/Auckland'), (b'Pacific/Enderbury', b'(GMT+1300) Pacific/Enderbury'), (b'Pacific/Fakaofo', b'(GMT+1300) Pacific/Fakaofo'), (b'Pacific/Fiji', b'(GMT+1300) Pacific/Fiji'), (b'Pacific/Tongatapu', b'(GMT+1300) Pacific/Tongatapu'), (b'Pacific/Chatham', b'(GMT+1345) Pacific/Chatham'), (b'Pacific/Apia', b'(GMT+1400) Pacific/Apia'), (b'Pacific/Kiritimati', b'(GMT+1400) Pacific/Kiritimati')])),
             ],
             options={
             },
@@ -159,7 +159,7 @@
             bases=(models.Model,),
         ),
         migrations.CreateModel(
-            name='ControllerNetworks',
+            name='ControllerNetwork',
             fields=[
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('created', models.DateTimeField(default=django.utils.timezone.now, auto_now_add=True)),
@@ -211,7 +211,24 @@
             bases=(models.Model,),
         ),
         migrations.CreateModel(
-            name='ControllerSlices',
+            name='ControllerSite',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('created', models.DateTimeField(default=django.utils.timezone.now, auto_now_add=True)),
+                ('updated', models.DateTimeField(default=django.utils.timezone.now, auto_now=True)),
+                ('enacted', models.DateTimeField(default=None, null=True, blank=True)),
+                ('backend_status', models.CharField(default=b'Provisioning in progress', max_length=140)),
+                ('deleted', models.BooleanField(default=False)),
+                ('tenant_id', models.CharField(help_text=b'Keystone tenant id', max_length=200, null=True, db_index=True, blank=True)),
+                ('controller', models.ForeignKey(related_name=b'controllersite', blank=True, to='core.Controller', null=True)),
+            ],
+            options={
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='ControllerSlice',
             fields=[
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('created', models.DateTimeField(default=django.utils.timezone.now, auto_now_add=True)),
@@ -220,7 +237,7 @@
                 ('backend_status', models.CharField(default=b'Provisioning in progress', max_length=140)),
                 ('deleted', models.BooleanField(default=False)),
                 ('tenant_id', models.CharField(help_text=b'Keystone tenant id', max_length=200, null=True, blank=True)),
-                ('controller', models.ForeignKey(related_name=b'controllerslices', to='core.Controller')),
+                ('controller', models.ForeignKey(related_name=b'controllerslice', to='core.Controller')),
             ],
             options={
                 'abstract': False,
@@ -228,7 +245,7 @@
             bases=(models.Model,),
         ),
         migrations.CreateModel(
-            name='ControllerUsers',
+            name='ControllerUser',
             fields=[
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('created', models.DateTimeField(default=django.utils.timezone.now, auto_now_add=True)),
@@ -399,11 +416,11 @@
                 ('subnet', models.CharField(max_length=32, blank=True)),
                 ('ports', models.CharField(blank=True, max_length=1024, null=True, validators=[core.models.network.ValidateNatList])),
                 ('labels', models.CharField(max_length=1024, null=True, blank=True)),
-                ('guaranteedBandwidth', models.IntegerField(default=0)),
-                ('permitAllSlices', models.BooleanField(default=False)),
-                ('topologyParameters', models.TextField(null=True, blank=True)),
-                ('controllerUrl', models.CharField(max_length=1024, null=True, blank=True)),
-                ('controllerParameters', models.TextField(null=True, blank=True)),
+                ('guaranteed_bandwidth', models.IntegerField(default=0)),
+                ('permit_all_slices', models.BooleanField(default=False)),
+                ('topology_parameters', models.TextField(null=True, blank=True)),
+                ('controller_url', models.CharField(max_length=1024, null=True, blank=True)),
+                ('controller_parameters', models.TextField(null=True, blank=True)),
                 ('network_id', models.CharField(help_text=b'Quantum network', max_length=256, null=True, blank=True)),
                 ('router_id', models.CharField(help_text=b'Quantum router id', max_length=256, null=True, blank=True)),
                 ('subnet_id', models.CharField(help_text=b'Quantum subnet id', max_length=256, null=True, blank=True)),
@@ -493,13 +510,13 @@
                 ('deleted', models.BooleanField(default=False)),
                 ('name', models.CharField(max_length=32)),
                 ('description', models.CharField(max_length=1024, null=True, blank=True)),
-                ('guaranteedBandwidth', models.IntegerField(default=0)),
+                ('guaranteed_bandwidth', models.IntegerField(default=0)),
                 ('visibility', models.CharField(default=b'private', max_length=30, choices=[(b'public', b'public'), (b'private', b'private')])),
                 ('translation', models.CharField(default=b'none', max_length=30, choices=[(b'none', b'none'), (b'NAT', b'NAT')])),
-                ('sharedNetworkName', models.CharField(max_length=30, null=True, blank=True)),
-                ('sharedNetworkId', models.CharField(help_text=b'Quantum network', max_length=256, null=True, blank=True)),
-                ('topologyKind', models.CharField(default=b'BigSwitch', max_length=30, choices=[(b'bigswitch', b'BigSwitch'), (b'physical', b'Physical'), (b'custom', b'Custom')])),
-                ('controllerKind', models.CharField(default=None, max_length=30, null=True, blank=True, choices=[(None, b'None'), (b'onos', b'ONOS'), (b'custom', b'Custom')])),
+                ('shared_network_name', models.CharField(max_length=30, null=True, blank=True)),
+                ('shared_network_id', models.CharField(help_text=b'Quantum network', max_length=256, null=True, blank=True)),
+                ('topology_kind', models.CharField(default=b'BigSwitch', max_length=30, choices=[(b'bigswitch', b'BigSwitch'), (b'physical', b'Physical'), (b'custom', b'Custom')])),
+                ('controller_kind', models.CharField(default=None, max_length=30, null=True, blank=True, choices=[(None, b'None'), (b'onos', b'ONOS'), (b'custom', b'Custom')])),
             ],
             options={
                 'abstract': False,
@@ -804,7 +821,7 @@
             bases=(models.Model,),
         ),
         migrations.CreateModel(
-            name='SiteDeployments',
+            name='SiteDeployment',
             fields=[
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('created', models.DateTimeField(default=django.utils.timezone.now, auto_now_add=True)),
@@ -812,11 +829,10 @@
                 ('enacted', models.DateTimeField(default=None, null=True, blank=True)),
                 ('backend_status', models.CharField(default=b'Provisioning in progress', max_length=140)),
                 ('deleted', models.BooleanField(default=False)),
-                ('tenant_id', models.CharField(help_text=b'Keystone tenant id', max_length=200, null=True, blank=True)),
                 ('availability_zone', models.CharField(help_text=b'OpenStack availability zone', max_length=200, null=True, blank=True)),
-                ('controller', models.ForeignKey(related_name=b'sitedeployments', blank=True, to='core.Controller', null=True)),
-                ('deployment', models.ForeignKey(related_name=b'sitedeployments', to='core.Deployment')),
-                ('site', models.ForeignKey(related_name=b'sitedeployments', to='core.Site')),
+                ('controller', models.ForeignKey(related_name=b'sitedeployment', blank=True, to='core.Controller', null=True)),
+                ('deployment', models.ForeignKey(related_name=b'sitedeployment', to='core.Deployment')),
+                ('site', models.ForeignKey(related_name=b'sitedeployment', to='core.Site')),
             ],
             options={
                 'abstract': False,
@@ -869,9 +885,9 @@
                 ('description', models.TextField(help_text=b'High level description of the slice and expected activities', max_length=1024, blank=True)),
                 ('slice_url', models.URLField(max_length=512, blank=True)),
                 ('max_slivers', models.IntegerField(default=10)),
-                ('imagePreference', models.CharField(default=b'Ubuntu 12.04 LTS', max_length=256, null=True, blank=True)),
                 ('network', models.CharField(default=b'Private Only', max_length=256, null=True, blank=True)),
-                ('mountDataSets', models.CharField(default=b'GenBank', max_length=256, null=True, blank=True)),
+                ('image_preference', models.CharField(default=b'Ubuntu 12.04 LTS', max_length=256, null=True, blank=True)),
+                ('mount_data_sets', models.CharField(default=b'GenBank', max_length=256, null=True, blank=True)),
                 ('creator', models.ForeignKey(related_name=b'slices', blank=True, to=settings.AUTH_USER_MODEL, null=True)),
                 ('service', models.ForeignKey(related_name=b'service', blank=True, to='core.Service', null=True)),
                 ('serviceClass', models.ForeignKey(related_name=b'slices', default=core.models.serviceclass.get_default_serviceclass, to='core.ServiceClass', null=True)),
@@ -1089,7 +1105,7 @@
         migrations.AddField(
             model_name='site',
             name='deployments',
-            field=models.ManyToManyField(help_text=b'Select which sites are allowed to host nodes in this deployment', related_name=b'sites', through='core.SiteDeployments', to='core.Deployment', blank=True),
+            field=models.ManyToManyField(help_text=b'Select which sites are allowed to host nodes in this deployment', related_name=b'sites', through='core.SiteDeployment', to='core.Deployment', blank=True),
             preserve_default=True,
         ),
         migrations.AddField(
@@ -1137,7 +1153,7 @@
         migrations.AddField(
             model_name='node',
             name='site_deployment',
-            field=models.ForeignKey(related_name=b'nodes', to='core.SiteDeployments'),
+            field=models.ForeignKey(related_name=b'nodes', to='core.SiteDeployment'),
             preserve_default=True,
         ),
         migrations.AddField(
@@ -1166,7 +1182,7 @@
         ),
         migrations.AddField(
             model_name='network',
-            name='permittedSlices',
+            name='permitted_slices',
             field=models.ManyToManyField(related_name=b'availableNetworks', to='core.Slice', blank=True),
             preserve_default=True,
         ),
@@ -1207,15 +1223,15 @@
             preserve_default=True,
         ),
         migrations.AddField(
-            model_name='controllerslices',
+            model_name='controllerslice',
             name='slice',
-            field=models.ForeignKey(related_name=b'controllerslices', to='core.Slice'),
+            field=models.ForeignKey(related_name=b'controllerslice', to='core.Slice'),
             preserve_default=True,
         ),
         migrations.AddField(
-            model_name='controllersitedeployments',
-            name='site_deployment',
-            field=models.ForeignKey(related_name=b'controllersitedeployments', to='core.SiteDeployments'),
+            model_name='controllersite',
+            name='site',
+            field=models.ForeignKey(related_name=b'controllersite', to='core.Site'),
             preserve_default=True,
         ),
         migrations.AddField(
@@ -1231,7 +1247,7 @@
             preserve_default=True,
         ),
         migrations.AddField(
-            model_name='controllernetworks',
+            model_name='controllernetwork',
             name='network',
             field=models.ForeignKey(related_name=b'controllernetworks', to='core.Network'),
             preserve_default=True,
diff --git a/planetstack/core/migrations/0002_network_field_case.py b/planetstack/core/migrations/0002_network_field_case.py
deleted file mode 100644
index aa94338..0000000
--- a/planetstack/core/migrations/0002_network_field_case.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import unicode_literals
-
-from django.db import models, migrations
-import timezones.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.RenameField(
-            model_name='networktemplate',
-            old_name='controllerKind',
-            new_name='controller_kind',
-        ),
-        migrations.RenameField(
-            model_name='networktemplate',
-            old_name='guaranteedBandwidth',
-            new_name='guaranteed_bandwidth',
-        ),
-        migrations.RenameField(
-            model_name='networktemplate',
-            old_name='sharedNetworkId',
-            new_name='shared_network_id',
-        ),
-        migrations.RenameField(
-            model_name='networktemplate',
-            old_name='sharedNetworkName',
-            new_name='shared_network_name',
-        ),
-        migrations.RenameField(
-            model_name='networktemplate',
-            old_name='topologyKind',
-            new_name='topology_kind',
-        ),
-    ]
diff --git a/planetstack/core/migrations/0003_network_field_case.py b/planetstack/core/migrations/0003_network_field_case.py
deleted file mode 100644
index d063363..0000000
--- a/planetstack/core/migrations/0003_network_field_case.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import unicode_literals
-
-from django.db import models, migrations
-import timezones.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0002_network_field_case'),
-    ]
-
-    operations = [
-        migrations.RenameField(
-            model_name='network',
-            old_name='controllerParameters',
-            new_name='controller_parameters',
-        ),
-        migrations.RenameField(
-            model_name='network',
-            old_name='controllerUrl',
-            new_name='controller_url',
-        ),
-        migrations.RenameField(
-            model_name='network',
-            old_name='guaranteedBandwidth',
-            new_name='guaranteed_bandwidth',
-        ),
-        migrations.RenameField(
-            model_name='network',
-            old_name='permitAllSlices',
-            new_name='permit_all_slices',
-        ),
-        migrations.RenameField(
-            model_name='network',
-            old_name='permittedSlices',
-            new_name='permitted_slices',
-        ),
-        migrations.RenameField(
-            model_name='network',
-            old_name='topologyParameters',
-            new_name='topology_parameters',
-        ),
-    ]
diff --git a/planetstack/core/migrations/0004_slice_field_case.py b/planetstack/core/migrations/0004_slice_field_case.py
deleted file mode 100644
index 0b911b3..0000000
--- a/planetstack/core/migrations/0004_slice_field_case.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import unicode_literals
-
-from django.db import models, migrations
-import timezones.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0003_network_field_case'),
-    ]
-
-    operations = [
-        migrations.RenameField(
-            model_name='slice',
-            old_name='imagePreference',
-            new_name='image_preference',
-        ),
-        migrations.RenameField(
-            model_name='slice',
-            old_name='mountDataSets',
-            new_name='mount_data_sets',
-        ),
-    ]
diff --git a/planetstack/core/models/__init__.py b/planetstack/core/models/__init__.py
index 3a63602..fcb50be 100644
--- a/planetstack/core/models/__init__.py
+++ b/planetstack/core/models/__init__.py
@@ -5,13 +5,13 @@
 from .service import ServiceAttribute
 from .tag import Tag
 from .role import Role
-from .site import Site, Deployment, DeploymentRole, DeploymentPrivilege, Controller, ControllerRole, ControllerPrivilege, SiteDeployments
+from .site import Site, Deployment, DeploymentRole, DeploymentPrivilege, Controller, ControllerRole, ControllerSite, SiteDeployment
 from .dashboard import DashboardView, ControllerDashboardView
 from .user import User, UserDashboardView
 from .serviceclass import ServiceClass
 from .site import ControllerManager, ControllerDeletionManager, ControllerLinkManager,ControllerLinkDeletionManager
-from .slice import Slice, ControllerSlices
-from .controllerusers import ControllerUsers
+from .slice import Slice, ControllerSlice
+from .controlleruser import ControllerUser, ControllerSitePrivilege, ControllerSlicePrivilege
 from .image import Image, ImageDeployments, ControllerImages
 from .node import Node
 from .serviceresource import ServiceResource
@@ -26,6 +26,6 @@
 from .sliver import Sliver
 from .reservation import ReservedResource
 from .reservation import Reservation
-from .network import Network, NetworkParameterType, NetworkParameter, NetworkSliver, NetworkTemplate, Router, NetworkSlice, ControllerNetworks
+from .network import Network, NetworkParameterType, NetworkParameter, NetworkSliver, NetworkTemplate, Router, NetworkSlice, ControllerNetwork
 from .billing import Account, Invoice, Charge, UsableObject, Payment
 
diff --git a/planetstack/core/models/controlleruser.py b/planetstack/core/models/controlleruser.py
new file mode 100644
index 0000000..678ab77
--- /dev/null
+++ b/planetstack/core/models/controlleruser.py
@@ -0,0 +1,89 @@
+import os
+import datetime
+from collections import defaultdict
+from django.db import models
+from django.db.models import F, Q
+from core.models import PlCoreBase,User,Controller
+from core.models import Controller,ControllerLinkManager,ControllerLinkDeletionManager
+
+class ControllerUser(PlCoreBase):
+    objects = ControllerLinkManager()
+    deleted_objects = ControllerLinkDeletionManager()
+
+    user = models.ForeignKey(User,related_name='controllerusers')
+    controller = models.ForeignKey(Controller,related_name='controllersusers')
+    kuser_id = models.CharField(null=True, blank=True, max_length=200, help_text="Keystone user id")
+
+    def __unicode__(self):  return u'%s %s' % (self.controller, self.user)
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = ControllerUser.objects.all()
+        else:
+            users = Users.select_by_user(user)
+            qs = ControllerUser.objects.filter(user__in=users)
+        return qs
+
+
+class ControllerSitePrivilege(PlCoreBase):
+    objects = ControllerLinkManager()
+    deleted_objects = ControllerLinkDeletionManager()
+
+    controller = models.ForeignKey('Controller', related_name='controllersiteprivileges')
+    site_privilege = models.ForeignKey('SitePrivilege', related_name='controllersiteprivileges')
+    role_id = models.CharField(null=True, blank=True, max_length=200, db_index=True, help_text="Keystone id")
+
+    def __unicode__(self):  return u'%s %s' % (self.controller, self.site_privilege)
+
+    def can_update(self, user):
+        if user.is_readonly:
+            return False
+        if user.is_admin:
+            return True
+        cprivs = ControllerSitePrivilege.objects.filter(site_privilege__user=user)
+        for cpriv in dprivs:
+            if cpriv.site_privilege.role.role == ['admin', 'Admin']:
+                return True
+        return False
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = ControllerSitePrivilege.objects.all()
+        else:
+            cpriv_ids = [cp.id for cp in ControllerSitePrivilege.objects.filter(site_privilege__user=user)]
+            qs = ControllerSitePrivilege.objects.filter(id__in=cpriv_ids)
+        return qs
+
+
+class ControllerSlicePrivilege(PlCoreBase):
+    objects = ControllerLinkManager()
+    deleted_objects = ControllerLinkDeletionManager()
+
+    controller = models.ForeignKey('Controller', related_name='controllersliceprivileges')
+    slice_privilege = models.ForeignKey('SlicePrivilege', related_name='controllersliceprivileges')
+    role_id = models.CharField(null=True, blank=True, max_length=200, db_index=True, help_text="Keystone id")
+
+    def __unicode__(self):  return u'%s %s' % (self.controller, self.slice_privilege)
+
+    def can_update(self, user):
+        if user.is_readonly:
+            return False
+        if user.is_admin:
+            return True
+        cprivs = ControllerSlicePrivilege.objects.filter(slice_privilege__user=user)
+        for cpriv in dprivs:
+            if cpriv.role.role == ['admin', 'Admin']:
+                return True
+        return False
+
+    @staticmethod
+    def select_by_user(user):
+        if user.is_admin:
+            qs = ControllerSlicePrivilege.objects.all()
+        else:
+            cpriv_ids = [cp.id for cp in ControllerSlicePrivilege.objects.filter(slice_privilege__user=user)]
+            qs = ControllerSlicePrivilege.objects.filter(id__in=cpriv_ids)
+        return qs
+
diff --git a/planetstack/core/models/controllerusers.py b/planetstack/core/models/controllerusers.py
deleted file mode 100644
index 5a3568a..0000000
--- a/planetstack/core/models/controllerusers.py
+++ /dev/null
@@ -1,26 +0,0 @@
-import os
-import datetime
-from collections import defaultdict
-from django.db import models
-from django.db.models import F, Q
-from core.models import PlCoreBase,User,Controller
-from core.models import Controller,ControllerLinkManager,ControllerLinkDeletionManager
-
-class ControllerUsers(PlCoreBase):
-    objects = ControllerLinkManager()
-    deleted_objects = ControllerLinkDeletionManager()
-
-    user = models.ForeignKey(User,related_name='controllerusers')
-    controller = models.ForeignKey(Controller,related_name='controllersusers')
-    kuser_id = models.CharField(null=True, blank=True, max_length=200, help_text="Keystone user id")
-
-    def __unicode__(self):  return u'%s %s' % (self.controller, self.user)
-
-    @staticmethod
-    def select_by_user(user):
-        if user.is_admin:
-            qs = ControllerUsers.objects.all()
-        else:
-            users = Users.select_by_user(user)
-            qs = ControllerUsers.objects.filter(user__in=users)
-        return qs
diff --git a/planetstack/core/models/network.py b/planetstack/core/models/network.py
index 554bbf5..c7a97a9 100644
--- a/planetstack/core/models/network.py
+++ b/planetstack/core/models/network.py
@@ -1,5 +1,6 @@
 import os
 import socket
+import sys
 from django.db import models
 from core.models import PlCoreBase, Site, Slice, Sliver, Controller
 from core.models import ControllerLinkManager,ControllerLinkDeletionManager
@@ -84,13 +85,13 @@
         # somehow these got set wrong inside of the live database. Remove this
         # code after all is well...
         if (self.topology_kind=="BigSwitch"):
-            print "XXX warning: topology_kind invalid case"
+            print >> sys.stderr, "XXX warning: topology_kind invalid case"
             self.topology_kind="bigswitch"
         elif (self.topology_kind=="Physical"):
-            print "XXX warning: topology_kind invalid case"
+            print >> sys.stderr, "XXX warning: topology_kind invalid case"
             self.topology_kind="physical"
         elif (self.topology_kind=="Custom"):
-            print "XXX warning: topology_kind invalid case"
+            print >> sys.stderr, "XXX warning: topology_kind invalid case"
             self.toplogy_kind="custom"
 
     def __unicode__(self):  return u'%s' % (self.name)
@@ -143,7 +144,7 @@
             qs = Network.objects.filter(owner__in=slices)
         return qs
 
-class ControllerNetworks(PlCoreBase):
+class ControllerNetwork(PlCoreBase):
     objects = ControllerLinkManager()
     deleted_objects = ControllerLinkDeletionManager()
 
diff --git a/planetstack/core/models/node.py b/planetstack/core/models/node.py
index 2ff503e..0884ec1 100644
--- a/planetstack/core/models/node.py
+++ b/planetstack/core/models/node.py
@@ -1,7 +1,7 @@
 import os
 from django.db import models
 from core.models import PlCoreBase
-from core.models import SiteDeployments
+from core.models import SiteDeployment
 from core.models import Tag
 from django.contrib.contenttypes import generic
 
@@ -9,7 +9,7 @@
 
 class Node(PlCoreBase):
     name = models.CharField(max_length=200, unique=True, help_text="Name of the Node")
-    site_deployment = models.ForeignKey(SiteDeployments, related_name='nodes')
+    site_deployment = models.ForeignKey(SiteDeployment, related_name='nodes')
     tags = generic.GenericRelation(Tag)
 
     def __unicode__(self):  return u'%s' % (self.name)
diff --git a/planetstack/core/models/site.py b/planetstack/core/models/site.py
index 69863eb..881468a 100644
--- a/planetstack/core/models/site.py
+++ b/planetstack/core/models/site.py
@@ -105,7 +105,7 @@
     abbreviated_name = models.CharField(max_length=80)
 
     #deployments = models.ManyToManyField('Deployment', blank=True, related_name='sites')
-    deployments = models.ManyToManyField('Deployment', through='SiteDeployments', blank=True, help_text="Select which sites are allowed to host nodes in this deployment", related_name='sites')
+    deployments = models.ManyToManyField('Deployment', through='SiteDeployment', blank=True, help_text="Select which sites are allowed to host nodes in this deployment", related_name='sites')
     tags = generic.GenericRelation(Tag)
 
     def __unicode__(self):  return u'%s' % (self.name)
@@ -263,43 +263,13 @@
 
     def __unicode__(self):  return u'%s' % (self.role)
 
-class ControllerPrivilege(PlCoreBase):
-    objects = ControllerLinkManager()
-    deleted_objects = ControllerLinkDeletionManager()
-
-    user = models.ForeignKey('User', related_name='controllerprivileges')
-    controller = models.ForeignKey('Controller', related_name='controllerprivileges')
-    role = models.ForeignKey('ControllerRole',related_name='controllerprivileges')
-
-    def __unicode__(self):  return u'%s %s %s' % (self.controller, self.user, self.role)
-
-    def can_update(self, user):
-        if user.is_readonly:
-            return False
-        if user.is_admin:
-            return True
-        cprivs = ControllerPrivilege.objects.filter(user=user)
-        for cpriv in dprivs:
-            if cpriv.role.role == 'admin':
-                return True
-        return False
-
-    @staticmethod
-    def select_by_user(user):
-        if user.is_admin:
-            qs = ControllerPrivilege.objects.all()
-        else:
-            cpriv_ids = [cp.id for cp in ControllerPrivilege.objects.filter(user=user)]
-            qs = ControllerPrivilege.objects.filter(id__in=cpriv_ids)
-        return qs 
-
 class Controller(PlCoreBase):
 
     objects = ControllerManager()
     deleted_objects = ControllerDeletionManager()
 
     name = models.CharField(max_length=200, unique=True, help_text="Name of the Controller")
-    version = models.CharField(max_length=200, unique=True, help_text="Controller version")
+    version = models.CharField(max_length=200, help_text="Controller version")
     backend_type = models.CharField(max_length=200, null=True, blank=True, help_text="Type of compute controller, e.g. EC2, OpenStack, or OpenStack version")
     auth_url = models.CharField(max_length=200, null=True, blank=True, help_text="Auth url for the compute controller")
     admin_user = models.CharField(max_length=200, null=True, blank=True, help_text="Username of an admin user at this controller")
@@ -308,14 +278,19 @@
 
     def __unicode__(self):  return u'%s %s %s' % (self.name, self.backend_type, self.version)
 
-class SiteDeployments(PlCoreBase):
+class SiteDeployment(PlCoreBase):
     objects = ControllerLinkManager()
     deleted_objects = ControllerLinkDeletionManager()
 
-    site = models.ForeignKey(Site,related_name='sitedeployments')
-    deployment = models.ForeignKey(Deployment,related_name='sitedeployments')
-    controller = models.ForeignKey(Controller, null=True, blank=True, related_name='sitedeployments')
+    site = models.ForeignKey(Site,related_name='sitedeployment')
+    deployment = models.ForeignKey(Deployment,related_name='sitedeployment')
+    controller = models.ForeignKey(Controller, null=True, blank=True, related_name='sitedeployment')
     availability_zone = models.CharField(max_length=200, null=True, blank=True, help_text="OpenStack availability zone")
-    tenant_id = models.CharField(null=True, blank=True, max_length=200, db_index=True, help_text="Keystone tenant id")
 
     def __unicode__(self):  return u'%s %s' % (self.deployment, self.site)
+    
+class ControllerSite(PlCoreBase):
+     
+    site = models.ForeignKey(Site,related_name='controllersite')
+    controller = models.ForeignKey(Controller, null=True, blank=True, related_name='controllersite')
+    tenant_id = models.CharField(null=True, blank=True, max_length=200, db_index=True, help_text="Keystone tenant id")
diff --git a/planetstack/core/models/slice.py b/planetstack/core/models/slice.py
index 52a5dd6..e182388 100644
--- a/planetstack/core/models/slice.py
+++ b/planetstack/core/models/slice.py
@@ -94,7 +94,7 @@
         nets = Network.objects.filter(slices=self)
         nets.delete() 
         # delete slice controllers
-        slice_controllers = ControllerSlices.objects.filter(slice=self)
+        slice_controllers = ControllerSlice.objects.filter(slice=self)
         slice_controllers.delete()
         # delete slice privilege
         slice_privileges = SlicePrivilege.objects.filter(slice=self)
@@ -129,7 +129,7 @@
             qs = SlicePrivilege.objects.filter(id__in=sp_ids)
         return qs
 
-class ControllerSlices(PlCoreBase):
+class ControllerSlice(PlCoreBase):
     objects = ControllerLinkManager()
     deleted_objects = ControllerLinkDeletionManager()
 
@@ -142,10 +142,10 @@
     @staticmethod
     def select_by_user(user):
         if user.is_admin:
-            qs = ControllerSlices.objects.all()
+            qs = ControllerSlice.objects.all()
         else:
             slices = Slice.select_by_user(user)
-            qs = ControllerSlices.objects.filter(slice__in=slices)
+            qs = ControllerSlice.objects.filter(slice__in=slices)
         return qs    
 
     def get_cpu_stats(self):
diff --git a/planetstack/core/models/user.py b/planetstack/core/models/user.py
index fb0d232..7fdde19 100644
--- a/planetstack/core/models/user.py
+++ b/planetstack/core/models/user.py
@@ -112,6 +112,22 @@
 
     def get_field_diff(self, field_name):
         return self.diff.get(field_name, None)
+
+    #classmethod
+    def getValidators(cls):
+        """ primarily for REST API, return a dictionary of field names mapped
+            to lists of the type of validations that need to be applied to
+            those fields.
+        """
+        validators = {}
+        for field in cls._meta.fields:
+            l = []
+            if field.blank==False:
+                l.append("notBlank")
+            if field.__class__.__name__=="URLField":
+                l.append("url")
+            validators[field.name] = l
+        return validators
     # ---- end copy stuff from DiffModelMixin ----
 
     @property
diff --git a/planetstack/core/static/dashboardStatic.PNG b/planetstack/core/static/dashboardStatic.PNG
old mode 100755
new mode 100644
Binary files differ
diff --git a/planetstack/core/static/logo_opague_circles.png b/planetstack/core/static/logo_opague_circles.png
old mode 100755
new mode 100644
Binary files differ
diff --git a/planetstack/core/static/open-cloud-themed1.png b/planetstack/core/static/open-cloud-themed1.png
old mode 100755
new mode 100644
Binary files differ
diff --git a/planetstack/core/static/opencloudApp.png b/planetstack/core/static/opencloudApp.png
old mode 100755
new mode 100644
Binary files differ
diff --git a/planetstack/core/xoslib/static/js/xosAdminSite.js b/planetstack/core/xoslib/static/js/xosAdminSite.js
index c4512c8..833f40d 100644
--- a/planetstack/core/xoslib/static/js/xosAdminSite.js
+++ b/planetstack/core/xoslib/static/js/xosAdminSite.js
@@ -1,4 +1,4 @@
-OBJS = ['deployment', 'image', 'networkTemplate', 'network', 'networkSliver', 'node', 'service', 'site', 'slice',  'slicePrivilege', 'sliver', 'user', 'sliceRole',  'flavor', 'controller', 'siteDeployment', 'controllerSiteDeployment'];
+OBJS = ['deployment', 'image', 'networkTemplate', 'network', 'networkSliver', 'node', 'service', 'site', 'slice',  'slicePrivilege', 'sliver', 'user', 'sliceRole',  'flavor', 'controller', 'siteDeployment'];
 // 'networkDeployment', 'userDeployment', 'sliceDeployment', 'imageDeployment'
 NAV_OBJS = ['deployment', 'site', 'slice', 'user'];
 
diff --git a/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js b/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js
index 952dfb4..47ea66a 100644
--- a/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js
+++ b/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js
@@ -20,7 +20,10 @@
     NETWORKDEPLOYMENT_API = "/plstackapi/networkdeployments/";
     FLAVOR_API = "/plstackapi/flavors/";
     CONTROLLER_API = "/plstackapi/controllers/";
+
+    /* removed
     CONTROLLERSITEDEPLOYMENT_API = "/plstackapi/controllersitedeploymentses";
+    */
 
     /* changed as a side effect of the big rename
     SLICEDEPLOYMENT_API = "/plstackapi/slice_deployments/";
@@ -500,7 +503,6 @@
                             });
 
         define_model(this, {urlRoot: SITEDEPLOYMENT_API,
-                            relatedCollections: {"controllerSiteDeployments": "site_deployment"},
                             foreignCollections: ["sites", "deployments", "controllers"],
                             foreignFields: {"site": "sites", "deployment": "deployments", "controller": "controllers"},
                             modelName: "siteDeployment",
@@ -576,6 +578,7 @@
                             detailFields: ["backend_status", "name", "version", "backend_type", "auth_url", "admin_user", "admin_password", "admin_tenant"],
                             });
 
+        /* removed
         define_model(this, {urlRoot: CONTROLLERSITEDEPLOYMENT_API,
                             modelName: "controllerSiteDeployment",
                             foreignCollections: ["site_deployments", "controllers"],
@@ -583,6 +586,7 @@
                             listFields: ["backend_status", "id", "site_deployment", "controller", "tenant_id"],
                             detailFields: ["backend_status", "site_deployment", "controller", "tenant_id"],
                             });
+        */
 
         /* DELETED in site-controller branch
 
diff --git a/planetstack/core/xoslib/static/js/xoslib/xos-defaults.js b/planetstack/core/xoslib/static/js/xoslib/xos-defaults.js
index b536eaf..314d3be 100644
--- a/planetstack/core/xoslib/static/js/xoslib/xos-defaults.js
+++ b/planetstack/core/xoslib/static/js/xoslib/xos-defaults.js
@@ -15,7 +15,7 @@
   this.networkParameterType = {"updated": null, "description": "", "created": null, "deleted": false, "enacted": null, "backend_status": "Provisioning in progress", "name": ""};
   this.networkSlice = {"updated": null, "slice": null, "network": null, "created": null, "deleted": false, "backend_status": "Provisioning in progress", "enacted": null};
   this.networkSliver = {"updated": null, "network": null, "created": null, "deleted": false, "ip": null, "enacted": null, "backend_status": "Provisioning in progress", "port_id": null, "sliver": null};
-  this.networkTemplate = {"enacted": null, "updated": null, "backend_status": "Provisioning in progress", "description": null, "created": null, "deleted": false, "shared_network_name": null, "guaranteed_bandwidth": 0, "visibility": "private", "translation": "none", "shared_network_id": null, "name": ""};
+  this.networkTemplate = {"enacted": null, "updated": null, "backend_status": "Provisioning in progress", "description": null, "created": null, "deleted": false, "sharedNetworkName": null, "guaranteedBandwidth": 0, "visibility": "private", "translation": "none", "sharedNetworkId": null, "name": ""};
   this.node = {"updated": null, "name": "", "created": null, "deleted": false, "site": null, "deployment": null, "backend_status": "Provisioning in progress", "enacted": null};
   this.payment = {"updated": null, "created": null, "deleted": false, "account": null, "amount": 0.0, "date": "2014-11-12T01:19:50.077Z", "backend_status": "Provisioning in progress", "enacted": null};
   this.planetStack = {"updated": null, "description": "PlanetStack", "created": null, "deleted": false, "backend_status": "Provisioning in progress", "enacted": null};
diff --git a/planetstack/core/xoslib/static/js/xoslib/xos-validators.js b/planetstack/core/xoslib/static/js/xoslib/xos-validators.js
index 9af6ba7..8865ce6 100644
--- a/planetstack/core/xoslib/static/js/xoslib/xos-validators.js
+++ b/planetstack/core/xoslib/static/js/xoslib/xos-validators.js
@@ -15,7 +15,7 @@
   this.networkParameterType = {"updated": [], "name": ["notBlank"], "created": [], "deleted": [], "description": ["notBlank"], "backend_status": ["notBlank"], "id": [], "enacted": ["notBlank"]};
   this.networkSlice = {"updated": [], "slice": ["notBlank"], "network": ["notBlank"], "created": [], "deleted": [], "backend_status": ["notBlank"], "id": [], "enacted": ["notBlank"]};
   this.networkSliver = {"updated": [], "network": ["notBlank"], "created": [], "deleted": [], "ip": [], "sliver": ["notBlank"], "backend_status": ["notBlank"], "port_id": [], "id": [], "enacted": ["notBlank"]};
-  this.networkTemplate = {"controller_kind": [], "updated": [], "name": ["notBlank"], "created": [], "deleted": [], "description": [], "shared_network_name": [], "guaranteed_bandwidth": ["notBlank"], "visibility": ["notBlank"], "topology_kind": ["notBlank"], "shared_network_id": [], "translation": ["notBlank"], "backend_status": ["notBlank"], "id": [], "enacted": ["notBlank"]};
+  this.networkTemplate = {"controllerKind": [], "updated": [], "name": ["notBlank"], "created": [], "deleted": [], "description": [], "sharedNetworkName": [], "guaranteedBandwidth": ["notBlank"], "visibility": ["notBlank"], "topologyKind": ["notBlank"], "sharedNetworkId": [], "translation": ["notBlank"], "backend_status": ["notBlank"], "id": [], "enacted": ["notBlank"]};
   this.node = {"updated": [], "name": ["notBlank"], "created": [], "deleted": [], "site": ["notBlank"], "deployment": ["notBlank"], "backend_status": ["notBlank"], "id": [], "enacted": ["notBlank"]};
   this.payment = {"updated": [], "created": [], "deleted": [], "account": ["notBlank"], "amount": ["notBlank"], "date": ["notBlank"], "backend_status": ["notBlank"], "id": [], "enacted": ["notBlank"]};
   this.planetStack = {"updated": [], "description": ["notBlank"], "created": [], "deleted": [], "backend_status": ["notBlank"], "id": [], "enacted": ["notBlank"]};
diff --git a/planetstack/core/xoslib/templates/xosAdmin.html b/planetstack/core/xoslib/templates/xosAdmin.html
index 700fd19..4862cea 100644
--- a/planetstack/core/xoslib/templates/xosAdmin.html
+++ b/planetstack/core/xoslib/templates/xosAdmin.html
@@ -84,7 +84,7 @@
 </script>
 
 <script type="text/template" id="xos-backend-status-icon-template">
-    <% if (model.enacted === undefined) { %>
+    <% if (! ("enacted" in arguments) ) { %>
         <!-- enacted is undefined; this must be a new object -->
     <% } else if ((enacted) && (enacted >= updated)) { %>
         <span style="min-width:16px;"><img src="/static/admin/img/icon_success.gif"></span>
diff --git a/planetstack/core/xoslib/up.sh b/planetstack/core/xoslib/up.sh
old mode 100755
new mode 100644
index bc2d469..206c0d7
--- a/planetstack/core/xoslib/up.sh
+++ b/planetstack/core/xoslib/up.sh
@@ -1,4 +1,6 @@
-scp static/js/*.js princeton_planetstack@node43.princeton.vicci.org:/opt/planetstack/core/xoslib/static/js/
-scp templates/mustache/*.mustache princeton_planetstack@node43.princeton.vicci.org:/opt/planetstack/core/xoslib/templates/mustache/
-scp static/xsh/*.js princeton_planetstack@node43.princeton.vicci.org:/opt/planetstack/core/xoslib/static/xsh/
-scp dashboards/*.html princeton_planetstack@node43.princeton.vicci.org:/opt/planetstack/templates/admin/dashboard/
+SLICE=princeton_planetstack
+HOST=node54.princeton.vicci.org
+#SLICE=service_vini
+#HOST=bilby.cs.princeton.edu
+rsync -avz --exclude "__history" --exclude "*~" -e ssh . $SLICE@$HOST:/opt/planetstack/core/xoslib/
+
diff --git a/planetstack/dependency_walker.py b/planetstack/dependency_walker.py
old mode 100755
new mode 100644
index bc75b0c..e8d9e9a
--- a/planetstack/dependency_walker.py
+++ b/planetstack/dependency_walker.py
@@ -68,6 +68,7 @@
 			except AttributeError:
 				if not missing_links.has_key(model+'.'+link):
 					print "Model %s missing link for dependency %s"%(model, link)
+                                        logger.log_exc("Model %s missing link for dependency %s"%(model, link))
 					missing_links[model+'.'+link]=True
 
 		if (peer):
diff --git a/planetstack/dmdot b/planetstack/dmdot
old mode 100755
new mode 100644
diff --git a/planetstack/ec2_observer/deleters/__init__.py b/planetstack/ec2_observer/deleters/__init__.py
old mode 100755
new mode 100644
diff --git a/planetstack/ec2_observer/deleters/site_deleter.py b/planetstack/ec2_observer/deleters/site_deleter.py
index b8ca6a1..88a4008 100644
--- a/planetstack/ec2_observer/deleters/site_deleter.py
+++ b/planetstack/ec2_observer/deleters/site_deleter.py
@@ -1,14 +1,14 @@
-from core.models import Site, SiteDeployments
+from core.models import Site, SiteDeployment
 from observer.deleter import Deleter
-from observer.deleters.site_deployment_deleter import SiteDeploymentsDeleter
+from observer.deleters.site_deployment_deleter import SiteDeploymentDeleter
 
 class SiteDeleter(Deleter):
     model='Site'
     
     def call(self, pk):
         site = Site.objects.get(pk=pk)
-        site_deployments = SiteDeployments.objects.filter(site=site)
-        site_deployment_deleter = SiteDeploymentsDeleter()
+        site_deployments = SiteDeployment.objects.filter(site=site)
+        site_deployment_deleter = SiteDeploymentDeleter()
         for site_deployment in site_deployments:
             site_deployment_deleter(site_deployment.id)
         site.delete() 
diff --git a/planetstack/ec2_observer/deleters/site_deployment_deleter.py b/planetstack/ec2_observer/deleters/site_deployment_deleter.py
index cc71d43..db344cd 100644
--- a/planetstack/ec2_observer/deleters/site_deployment_deleter.py
+++ b/planetstack/ec2_observer/deleters/site_deployment_deleter.py
@@ -1,11 +1,11 @@
-from core.models import Site, SiteDeployments
+from core.models import Site, SiteDeployment
 from observer.deleter import Deleter
 
-class SiteDeploymentsDeleter(Deleter):
-    model='SiteDeployments'
+class SiteDeploymentDeleter(Deleter):
+    model='SiteDeployment'
 
     def call(self, pk):
-        site_deployment = SiteDeployments.objects.get(pk=pk)
+        site_deployment = SiteDeployment.objects.get(pk=pk)
         if site_deployment.tenant_id:
             driver = self.driver.admin_driver(deployment=site_deployment.deployment.name)
             driver.delete_tenant(site_deployment.tenant_id)
diff --git a/planetstack/ec2_observer/dmdot b/planetstack/ec2_observer/dmdot
old mode 100755
new mode 100644
diff --git a/planetstack/ec2_observer/event_loop.py b/planetstack/ec2_observer/event_loop.py
index 1f15a8e..1319fec 100644
--- a/planetstack/ec2_observer/event_loop.py
+++ b/planetstack/ec2_observer/event_loop.py
@@ -49,7 +49,7 @@
 	return ig
 
 class PlanetStackObserver:
-	#sync_steps = [SyncNetworks,SyncNetworkSlivers,SyncSites,SyncSitePrivileges,SyncSlices,SyncSliceMemberships,SyncSlivers,SyncSliverIps,SyncExternalRoutes,SyncUsers,SyncRoles,SyncNodes,SyncImages,GarbageCollector]
+	#sync_steps = [SyncNetworks,SyncNetworkSlivers,SyncSites,SyncSitePrivilege,SyncSlices,SyncSliceMemberships,SyncSlivers,SyncSliverIps,SyncExternalRoutes,SyncUsers,SyncRoles,SyncNodes,SyncImages,GarbageCollector]
 	sync_steps = []
 
 	
diff --git a/planetstack/ec2_observer/start.sh b/planetstack/ec2_observer/start.sh
old mode 100755
new mode 100644
diff --git a/planetstack/ec2_observer/steps/__init__.py b/planetstack/ec2_observer/steps/__init__.py
index e56c4b1..ed44fdb 100644
--- a/planetstack/ec2_observer/steps/__init__.py
+++ b/planetstack/ec2_observer/steps/__init__.py
@@ -2,7 +2,7 @@
 #from .sync_network_slivers import SyncNetworkSlivers
 #from .sync_networks import SyncNetworks
 #from .sync_network_deployments import SyncNetworkDeployments
-#from .sync_site_privileges import SyncSitePrivileges
+#from .sync_site_privileges import SyncSitePrivilege
 #from .sync_slice_memberships import SyncSliceMemberships
 #from .sync_slices import SyncSlices
 #from .sync_sliver_ips import SyncSliverIps
diff --git a/planetstack/ec2_observer/steps/sync_nodes.py b/planetstack/ec2_observer/steps/sync_nodes.py
index 9f032ed..0fa8b61 100644
--- a/planetstack/ec2_observer/steps/sync_nodes.py
+++ b/planetstack/ec2_observer/steps/sync_nodes.py
@@ -20,7 +20,7 @@
             return []
 
         deployment = Deployment.objects.filter(Q(name="Amazon EC2"))[0]
-        current_site_deployments = SiteDeployments.objects.filter(Q(deployment=deployment))
+        current_site_deployments = SiteDeployment.objects.filter(Q(deployment=deployment))
 
         zone_ret = aws_run('ec2 describe-availability-zones')
         zones = zone_ret['AvailabilityZones']
diff --git a/planetstack/ec2_observer/steps/sync_site_deployments.py b/planetstack/ec2_observer/steps/sync_site_deployments.py
index 7c24f68..5adccb7 100644
--- a/planetstack/ec2_observer/steps/sync_site_deployments.py
+++ b/planetstack/ec2_observer/steps/sync_site_deployments.py
@@ -7,9 +7,9 @@
 from ec2_observer.awslib import *
 import pdb
 
-class SyncSiteDeployments(SyncStep):
+class SyncSiteDeployment(SyncStep):
     requested_interval=86400
-    provides=[SiteDeployments]
+    provides=[SiteDeployment]
 
     def fetch_pending(self, deletion):
         if (deletion):
@@ -29,7 +29,7 @@
         # The syncstep should catch it
         # At any rate, we should not run if there are no deployments
         deployment = Deployment.objects.filter(Q(name="Amazon EC2"))[0]
-        current_site_deployments = SiteDeployments.objects.filter(Q(deployment=deployment))
+        current_site_deployments = SiteDeployment.objects.filter(Q(deployment=deployment))
         site_dict = {}
 
         for sd in current_site_deployments:
@@ -40,7 +40,7 @@
             try:
                 site_record = site_dict[site]
             except KeyError:
-                sd = SiteDeployments(site=site,deployment=deployment,tenant_id=base64.urlsafe_b64encode(os.urandom(12)))
+                sd = SiteDeployment(site=site,deployment=deployment,tenant_id=base64.urlsafe_b64encode(os.urandom(12)))
                 updated_site_deployments.append(sd)
 
         return updated_site_deployments
diff --git a/planetstack/ec2_observer/steps/sync_sites.py b/planetstack/ec2_observer/steps/sync_sites.py
index 0c1c7cf..0959c71 100644
--- a/planetstack/ec2_observer/steps/sync_sites.py
+++ b/planetstack/ec2_observer/steps/sync_sites.py
@@ -16,7 +16,7 @@
             return []
 
         deployment = Deployment.objects.filter(Q(name="Amazon EC2"))[0]
-        current_site_deployments = SiteDeployments.objects.filter(Q(deployment=deployment))
+        current_site_deployments = SiteDeployment.objects.filter(Q(deployment=deployment))
 
         zone_ret = aws_run('ec2 describe-availability-zones')
         zones = zone_ret['AvailabilityZones']
diff --git a/planetstack/genapi.py b/planetstack/genapi.py
index 00a5c94..2e10d74 100644
--- a/planetstack/genapi.py
+++ b/planetstack/genapi.py
@@ -68,9 +68,6 @@
         url(r'plstackapi/planetstackroles/$', PlanetStackRoleList.as_view(), name='planetstackrole-list'),
         url(r'plstackapi/planetstackroles/(?P<pk>[a-zA-Z0-9\-]+)/$', PlanetStackRoleDetail.as_view(), name ='planetstackrole-detail'),
     
-        url(r'plstackapi/controllerprivileges/$', ControllerPrivilegeList.as_view(), name='controllerprivilege-list'),
-        url(r'plstackapi/controllerprivileges/(?P<pk>[a-zA-Z0-9\-]+)/$', ControllerPrivilegeDetail.as_view(), name ='controllerprivilege-detail'),
-    
         url(r'plstackapi/networkslivers/$', NetworkSliverList.as_view(), name='networksliver-list'),
         url(r'plstackapi/networkslivers/(?P<pk>[a-zA-Z0-9\-]+)/$', NetworkSliverDetail.as_view(), name ='networksliver-detail'),
     
@@ -89,8 +86,8 @@
         url(r'plstackapi/serviceclasses/$', ServiceClassList.as_view(), name='serviceclass-list'),
         url(r'plstackapi/serviceclasses/(?P<pk>[a-zA-Z0-9\-]+)/$', ServiceClassDetail.as_view(), name ='serviceclass-detail'),
     
-        url(r'plstackapi/controllernetworks/$', ControllerNetworksList.as_view(), name='controllernetworks-list'),
-        url(r'plstackapi/controllernetworks/(?P<pk>[a-zA-Z0-9\-]+)/$', ControllerNetworksDetail.as_view(), name ='controllernetworks-detail'),
+        url(r'plstackapi/controllernetworks/$', ControllerNetworkList.as_view(), name='controllernetworks-list'),
+        url(r'plstackapi/controllernetworks/(?P<pk>[a-zA-Z0-9\-]+)/$', ControllerNetworkDetail.as_view(), name ='controllernetworks-detail'),
     
         url(r'plstackapi/charges/$', ChargeList.as_view(), name='charge-list'),
         url(r'plstackapi/charges/(?P<pk>[a-zA-Z0-9\-]+)/$', ChargeDetail.as_view(), name ='charge-detail'),
@@ -170,8 +167,8 @@
         url(r'plstackapi/deploymentprivileges/$', DeploymentPrivilegeList.as_view(), name='deploymentprivilege-list'),
         url(r'plstackapi/deploymentprivileges/(?P<pk>[a-zA-Z0-9\-]+)/$', DeploymentPrivilegeDetail.as_view(), name ='deploymentprivilege-detail'),
     
-        url(r'plstackapi/controllerusers/$', ControllerUsersList.as_view(), name='controllerusers-list'),
-        url(r'plstackapi/controllerusers/(?P<pk>[a-zA-Z0-9\-]+)/$', ControllerUsersDetail.as_view(), name ='controllerusers-detail'),
+        url(r'plstackapi/controllerusers/$', ControllerUserList.as_view(), name='controllerusers-list'),
+        url(r'plstackapi/controllerusers/(?P<pk>[a-zA-Z0-9\-]+)/$', ControllerUserDetail.as_view(), name ='controllerusers-detail'),
     
         url(r'plstackapi/deploymentroles/$', DeploymentRoleList.as_view(), name='deploymentrole-list'),
         url(r'plstackapi/deploymentroles/(?P<pk>[a-zA-Z0-9\-]+)/$', DeploymentRoleDetail.as_view(), name ='deploymentrole-detail'),
@@ -179,8 +176,8 @@
         url(r'plstackapi/usercredentials/$', UserCredentialList.as_view(), name='usercredential-list'),
         url(r'plstackapi/usercredentials/(?P<pk>[a-zA-Z0-9\-]+)/$', UserCredentialDetail.as_view(), name ='usercredential-detail'),
     
-        url(r'plstackapi/sitedeployments/$', SiteDeploymentsList.as_view(), name='sitedeployments-list'),
-        url(r'plstackapi/sitedeployments/(?P<pk>[a-zA-Z0-9\-]+)/$', SiteDeploymentsDetail.as_view(), name ='sitedeployments-detail'),
+        url(r'plstackapi/sitedeployments/$', SiteDeploymentList.as_view(), name='sitedeployments-list'),
+        url(r'plstackapi/sitedeployments/(?P<pk>[a-zA-Z0-9\-]+)/$', SiteDeploymentDetail.as_view(), name ='sitedeployments-detail'),
     
         url(r'plstackapi/slicetags/$', SliceTagList.as_view(), name='slicetag-list'),
         url(r'plstackapi/slicetags/(?P<pk>[a-zA-Z0-9\-]+)/$', SliceTagDetail.as_view(), name ='slicetag-detail'),
@@ -194,8 +191,8 @@
         url(r'plstackapi/serviceresources/$', ServiceResourceList.as_view(), name='serviceresource-list'),
         url(r'plstackapi/serviceresources/(?P<pk>[a-zA-Z0-9\-]+)/$', ServiceResourceDetail.as_view(), name ='serviceresource-detail'),
     
-        url(r'plstackapi/controllerslices/$', ControllerSlicesList.as_view(), name='controllerslices-list'),
-        url(r'plstackapi/controllerslices/(?P<pk>[a-zA-Z0-9\-]+)/$', ControllerSlicesDetail.as_view(), name ='controllerslices-detail'),
+        url(r'plstackapi/controllerslices/$', ControllerSliceList.as_view(), name='controllerslices-list'),
+        url(r'plstackapi/controllerslices/(?P<pk>[a-zA-Z0-9\-]+)/$', ControllerSliceDetail.as_view(), name ='controllerslices-detail'),
     
     )
 
@@ -725,41 +722,6 @@
 
 
 
-class ControllerPrivilegeSerializer(serializers.HyperlinkedModelSerializer):
-    id = IdField()
-    
-    humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-    validators = serializers.SerializerMethodField("getValidators")
-    def getHumanReadableName(self, obj):

-        return str(obj)
-    def getValidators(self, obj):
-        try:
-            return obj.getValidators()
-        except:
-            return None
-    class Meta:
-        model = ControllerPrivilege
-        fields = ('humanReadableName', 'validators', 'id','created','updated','enacted','backend_status','deleted','user','controller','role',)
-
-class ControllerPrivilegeIdSerializer(XOSModelSerializer):
-    id = IdField()
-    
-    humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-    validators = serializers.SerializerMethodField("getValidators")
-    def getHumanReadableName(self, obj):

-        return str(obj)

-    def getValidators(self, obj):

-        try:
-            return obj.getValidators()
-        except:
-            return None

-    class Meta:

-        model = ControllerPrivilege
-        fields = ('humanReadableName', 'validators', 'id','created','updated','enacted','backend_status','deleted','user','controller','role',)
-
-
-
-
 class NetworkSliverSerializer(serializers.HyperlinkedModelSerializer):
     id = IdField()
     
@@ -1026,7 +988,7 @@
 
 
 
-class ControllerNetworksSerializer(serializers.HyperlinkedModelSerializer):
+class ControllerNetworkSerializer(serializers.HyperlinkedModelSerializer):
     id = IdField()
     
     humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
@@ -1039,10 +1001,10 @@
         except:
             return None
     class Meta:
-        model = ControllerNetworks
+        model = ControllerNetwork
         fields = ('humanReadableName', 'validators', 'id','created','updated','enacted','backend_status','deleted','network','controller','net_id','router_id','subnet_id','subnet',)
 
-class ControllerNetworksIdSerializer(XOSModelSerializer):
+class ControllerNetworkIdSerializer(XOSModelSerializer):
     id = IdField()
     
     humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
@@ -1055,7 +1017,7 @@
         except:
             return None

     class Meta:

-        model = ControllerNetworks
+        model = ControllerNetwork
         fields = ('humanReadableName', 'validators', 'id','created','updated','enacted','backend_status','deleted','network','controller','net_id','router_id','subnet_id','subnet',)
 
 
@@ -2016,7 +1978,7 @@
 
 
 
-class ControllerUsersSerializer(serializers.HyperlinkedModelSerializer):
+class ControllerUserSerializer(serializers.HyperlinkedModelSerializer):
     id = IdField()
     
     humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
@@ -2029,10 +1991,10 @@
         except:
             return None
     class Meta:
-        model = ControllerUsers
+        model = ControllerUser
         fields = ('humanReadableName', 'validators', 'id','created','updated','enacted','backend_status','deleted','user','controller','kuser_id',)
 
-class ControllerUsersIdSerializer(XOSModelSerializer):
+class ControllerUserIdSerializer(XOSModelSerializer):
     id = IdField()
     
     humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
@@ -2045,7 +2007,7 @@
         except:
             return None

     class Meta:

-        model = ControllerUsers
+        model = ControllerUser
         fields = ('humanReadableName', 'validators', 'id','created','updated','enacted','backend_status','deleted','user','controller','kuser_id',)
 
 
@@ -2121,7 +2083,7 @@
 
 
 
-class SiteDeploymentsSerializer(serializers.HyperlinkedModelSerializer):
+class SiteDeploymentSerializer(serializers.HyperlinkedModelSerializer):
     id = IdField()
     
     humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
@@ -2134,10 +2096,10 @@
         except:
             return None
     class Meta:
-        model = SiteDeployments
+        model = SiteDeployment
         fields = ('humanReadableName', 'validators', 'id','created','updated','enacted','backend_status','deleted','site','deployment','controller','availability_zone',)
 
-class SiteDeploymentsIdSerializer(XOSModelSerializer):
+class SiteDeploymentIdSerializer(XOSModelSerializer):
     id = IdField()
     
     humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
@@ -2150,7 +2112,7 @@
         except:
             return None

     class Meta:

-        model = SiteDeployments
+        model = SiteDeployment
         fields = ('humanReadableName', 'validators', 'id','created','updated','enacted','backend_status','deleted','site','deployment','controller','availability_zone',)
 
 
@@ -2312,7 +2274,7 @@
 
 
 
-class ControllerSlicesSerializer(serializers.HyperlinkedModelSerializer):
+class ControllerSliceSerializer(serializers.HyperlinkedModelSerializer):
     id = IdField()
     
     humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
@@ -2325,10 +2287,10 @@
         except:
             return None
     class Meta:
-        model = ControllerSlices
+        model = ControllerSlice
         fields = ('humanReadableName', 'validators', 'id','created','updated','enacted','backend_status','deleted','controller','slice','tenant_id',)
 
-class ControllerSlicesIdSerializer(XOSModelSerializer):
+class ControllerSliceIdSerializer(XOSModelSerializer):
     id = IdField()
     
     humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
@@ -2341,7 +2303,7 @@
         except:
             return None

     class Meta:

-        model = ControllerSlices
+        model = ControllerSlice
         fields = ('humanReadableName', 'validators', 'id','created','updated','enacted','backend_status','deleted','controller','slice','tenant_id',)
 
 
@@ -2371,8 +2333,6 @@
 
                  PlanetStackRole: PlanetStackRoleSerializer,
 
-                 ControllerPrivilege: ControllerPrivilegeSerializer,
-
                  NetworkSliver: NetworkSliverSerializer,
 
                  Project: ProjectSerializer,
@@ -2385,7 +2345,7 @@
 
                  ServiceClass: ServiceClassSerializer,
 
-                 ControllerNetworks: ControllerNetworksSerializer,
+                 ControllerNetwork: ControllerNetworkSerializer,
 
                  Charge: ChargeSerializer,
 
@@ -2439,13 +2399,13 @@
 
                  DeploymentPrivilege: DeploymentPrivilegeSerializer,
 
-                 ControllerUsers: ControllerUsersSerializer,
+                 ControllerUser: ControllerUserSerializer,
 
                  DeploymentRole: DeploymentRoleSerializer,
 
                  UserCredential: UserCredentialSerializer,
 
-                 SiteDeployments: SiteDeploymentsSerializer,
+                 SiteDeployment: SiteDeploymentSerializer,
 
                  SliceTag: SliceTagSerializer,
 
@@ -2455,7 +2415,7 @@
 
                  ServiceResource: ServiceResourceSerializer,
 
-                 ControllerSlices: ControllerSlicesSerializer,
+                 ControllerSlice: ControllerSliceSerializer,
 
                  None: None,
                 }
@@ -3161,65 +3121,6 @@
 
 
 
-class ControllerPrivilegeList(generics.ListCreateAPIView):
-    queryset = ControllerPrivilege.objects.select_related().all()
-    serializer_class = ControllerPrivilegeSerializer
-    id_serializer_class = ControllerPrivilegeIdSerializer
-    filter_backends = (filters.DjangoFilterBackend,)
-    filter_fields = ('id','created','updated','enacted','backend_status','deleted','user','controller','role',)
-
-    def get_serializer_class(self):
-        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
-        if (no_hyperlinks):
-            return self.id_serializer_class
-        else:
-            return self.serializer_class
-
-    def get_queryset(self):
-        return ControllerPrivilege.select_by_user(self.request.user)
-
-    def create(self, request, *args, **kwargs):
-        serializer = self.get_serializer(data=request.DATA, files=request.FILES)
-        if not (serializer.is_valid()):
-            response = {"error": "validation",
-                        "specific_error": "not serializer.is_valid()",

-                        "reasons": serializer.errors}

-            return Response(response, status=status.HTTP_400_BAD_REQUEST)
-        obj = serializer.object
-        obj.caller = request.user
-        if obj.can_update(request.user):
-            return super(ControllerPrivilegeList, self).create(request, *args, **kwargs)
-        else:
-            raise Exception("failed obj.can_update")
-
-        ret = super(ControllerPrivilegeList, self).create(request, *args, **kwargs)
-        if (ret.status_code%100 != 200):
-            raise Exception(ret.data)
-
-        return ret
-
-
-class ControllerPrivilegeDetail(PlanetStackRetrieveUpdateDestroyAPIView):
-    queryset = ControllerPrivilege.objects.select_related().all()
-    serializer_class = ControllerPrivilegeSerializer
-    id_serializer_class = ControllerPrivilegeIdSerializer
-
-    def get_serializer_class(self):
-        no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
-        if (no_hyperlinks):
-            return self.id_serializer_class
-        else:
-            return self.serializer_class
-    
-    def get_queryset(self):
-        return ControllerPrivilege.select_by_user(self.request.user)
-
-    # update() is handled by PlanetStackRetrieveUpdateDestroyAPIView
-
-    # destroy() is handled by PlanetStackRetrieveUpdateDestroyAPIView
-
-
-
 class NetworkSliverList(generics.ListCreateAPIView):
     queryset = NetworkSliver.objects.select_related().all()
     serializer_class = NetworkSliverSerializer
@@ -3574,10 +3475,10 @@
 
 
 
-class ControllerNetworksList(generics.ListCreateAPIView):
-    queryset = ControllerNetworks.objects.select_related().all()
-    serializer_class = ControllerNetworksSerializer
-    id_serializer_class = ControllerNetworksIdSerializer
+class ControllerNetworkList(generics.ListCreateAPIView):
+    queryset = ControllerNetwork.objects.select_related().all()
+    serializer_class = ControllerNetworkSerializer
+    id_serializer_class = ControllerNetworkIdSerializer
     filter_backends = (filters.DjangoFilterBackend,)
     filter_fields = ('id','created','updated','enacted','backend_status','deleted','network','controller','net_id','router_id','subnet_id','subnet',)
 
@@ -3589,7 +3490,7 @@
             return self.serializer_class
 
     def get_queryset(self):
-        return ControllerNetworks.select_by_user(self.request.user)
+        return ControllerNetwork.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
         serializer = self.get_serializer(data=request.DATA, files=request.FILES)
@@ -3601,21 +3502,21 @@
         obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
-            return super(ControllerNetworksList, self).create(request, *args, **kwargs)
+            return super(ControllerNetworkList, self).create(request, *args, **kwargs)
         else:
             raise Exception("failed obj.can_update")
 
-        ret = super(ControllerNetworksList, self).create(request, *args, **kwargs)
+        ret = super(ControllerNetworkList, self).create(request, *args, **kwargs)
         if (ret.status_code%100 != 200):
             raise Exception(ret.data)
 
         return ret
 
 
-class ControllerNetworksDetail(PlanetStackRetrieveUpdateDestroyAPIView):
-    queryset = ControllerNetworks.objects.select_related().all()
-    serializer_class = ControllerNetworksSerializer
-    id_serializer_class = ControllerNetworksIdSerializer
+class ControllerNetworkDetail(PlanetStackRetrieveUpdateDestroyAPIView):
+    queryset = ControllerNetwork.objects.select_related().all()
+    serializer_class = ControllerNetworkSerializer
+    id_serializer_class = ControllerNetworkIdSerializer
 
     def get_serializer_class(self):
         no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
@@ -3625,7 +3526,7 @@
             return self.serializer_class
     
     def get_queryset(self):
-        return ControllerNetworks.select_by_user(self.request.user)
+        return ControllerNetwork.select_by_user(self.request.user)
 
     # update() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
@@ -5166,10 +5067,10 @@
 
 
 
-class ControllerUsersList(generics.ListCreateAPIView):
-    queryset = ControllerUsers.objects.select_related().all()
-    serializer_class = ControllerUsersSerializer
-    id_serializer_class = ControllerUsersIdSerializer
+class ControllerUserList(generics.ListCreateAPIView):
+    queryset = ControllerUser.objects.select_related().all()
+    serializer_class = ControllerUserSerializer
+    id_serializer_class = ControllerUserIdSerializer
     filter_backends = (filters.DjangoFilterBackend,)
     filter_fields = ('id','created','updated','enacted','backend_status','deleted','user','controller','kuser_id',)
 
@@ -5181,7 +5082,7 @@
             return self.serializer_class
 
     def get_queryset(self):
-        return ControllerUsers.select_by_user(self.request.user)
+        return ControllerUser.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
         serializer = self.get_serializer(data=request.DATA, files=request.FILES)
@@ -5193,21 +5094,21 @@
         obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
-            return super(ControllerUsersList, self).create(request, *args, **kwargs)
+            return super(ControllerUserList, self).create(request, *args, **kwargs)
         else:
             raise Exception("failed obj.can_update")
 
-        ret = super(ControllerUsersList, self).create(request, *args, **kwargs)
+        ret = super(ControllerUserList, self).create(request, *args, **kwargs)
         if (ret.status_code%100 != 200):
             raise Exception(ret.data)
 
         return ret
 
 
-class ControllerUsersDetail(PlanetStackRetrieveUpdateDestroyAPIView):
-    queryset = ControllerUsers.objects.select_related().all()
-    serializer_class = ControllerUsersSerializer
-    id_serializer_class = ControllerUsersIdSerializer
+class ControllerUserDetail(PlanetStackRetrieveUpdateDestroyAPIView):
+    queryset = ControllerUser.objects.select_related().all()
+    serializer_class = ControllerUserSerializer
+    id_serializer_class = ControllerUserIdSerializer
 
     def get_serializer_class(self):
         no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
@@ -5217,7 +5118,7 @@
             return self.serializer_class
     
     def get_queryset(self):
-        return ControllerUsers.select_by_user(self.request.user)
+        return ControllerUser.select_by_user(self.request.user)
 
     # update() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
@@ -5343,10 +5244,10 @@
 
 
 
-class SiteDeploymentsList(generics.ListCreateAPIView):
-    queryset = SiteDeployments.objects.select_related().all()
-    serializer_class = SiteDeploymentsSerializer
-    id_serializer_class = SiteDeploymentsIdSerializer
+class SiteDeploymentList(generics.ListCreateAPIView):
+    queryset = SiteDeployment.objects.select_related().all()
+    serializer_class = SiteDeploymentSerializer
+    id_serializer_class = SiteDeploymentIdSerializer
     filter_backends = (filters.DjangoFilterBackend,)
     filter_fields = ('id','created','updated','enacted','backend_status','deleted','site','deployment','controller','availability_zone',)
 
@@ -5358,7 +5259,7 @@
             return self.serializer_class
 
     def get_queryset(self):
-        return SiteDeployments.select_by_user(self.request.user)
+        return SiteDeployment.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
         serializer = self.get_serializer(data=request.DATA, files=request.FILES)
@@ -5370,21 +5271,21 @@
         obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
-            return super(SiteDeploymentsList, self).create(request, *args, **kwargs)
+            return super(SiteDeploymentList, self).create(request, *args, **kwargs)
         else:
             raise Exception("failed obj.can_update")
 
-        ret = super(SiteDeploymentsList, self).create(request, *args, **kwargs)
+        ret = super(SiteDeploymentList, self).create(request, *args, **kwargs)
         if (ret.status_code%100 != 200):
             raise Exception(ret.data)
 
         return ret
 
 
-class SiteDeploymentsDetail(PlanetStackRetrieveUpdateDestroyAPIView):
-    queryset = SiteDeployments.objects.select_related().all()
-    serializer_class = SiteDeploymentsSerializer
-    id_serializer_class = SiteDeploymentsIdSerializer
+class SiteDeploymentDetail(PlanetStackRetrieveUpdateDestroyAPIView):
+    queryset = SiteDeployment.objects.select_related().all()
+    serializer_class = SiteDeploymentSerializer
+    id_serializer_class = SiteDeploymentIdSerializer
 
     def get_serializer_class(self):
         no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
@@ -5394,7 +5295,7 @@
             return self.serializer_class
     
     def get_queryset(self):
-        return SiteDeployments.select_by_user(self.request.user)
+        return SiteDeployment.select_by_user(self.request.user)
 
     # update() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
@@ -5638,10 +5539,10 @@
 
 
 
-class ControllerSlicesList(generics.ListCreateAPIView):
-    queryset = ControllerSlices.objects.select_related().all()
-    serializer_class = ControllerSlicesSerializer
-    id_serializer_class = ControllerSlicesIdSerializer
+class ControllerSliceList(generics.ListCreateAPIView):
+    queryset = ControllerSlice.objects.select_related().all()
+    serializer_class = ControllerSliceSerializer
+    id_serializer_class = ControllerSliceIdSerializer
     filter_backends = (filters.DjangoFilterBackend,)
     filter_fields = ('id','created','updated','enacted','backend_status','deleted','controller','slice','tenant_id',)
 
@@ -5653,7 +5554,7 @@
             return self.serializer_class
 
     def get_queryset(self):
-        return ControllerSlices.select_by_user(self.request.user)
+        return ControllerSlice.select_by_user(self.request.user)
 
     def create(self, request, *args, **kwargs):
         serializer = self.get_serializer(data=request.DATA, files=request.FILES)
@@ -5665,21 +5566,21 @@
         obj = serializer.object
         obj.caller = request.user
         if obj.can_update(request.user):
-            return super(ControllerSlicesList, self).create(request, *args, **kwargs)
+            return super(ControllerSliceList, self).create(request, *args, **kwargs)
         else:
             raise Exception("failed obj.can_update")
 
-        ret = super(ControllerSlicesList, self).create(request, *args, **kwargs)
+        ret = super(ControllerSliceList, self).create(request, *args, **kwargs)
         if (ret.status_code%100 != 200):
             raise Exception(ret.data)
 
         return ret
 
 
-class ControllerSlicesDetail(PlanetStackRetrieveUpdateDestroyAPIView):
-    queryset = ControllerSlices.objects.select_related().all()
-    serializer_class = ControllerSlicesSerializer
-    id_serializer_class = ControllerSlicesIdSerializer
+class ControllerSliceDetail(PlanetStackRetrieveUpdateDestroyAPIView):
+    queryset = ControllerSlice.objects.select_related().all()
+    serializer_class = ControllerSliceSerializer
+    id_serializer_class = ControllerSliceIdSerializer
 
     def get_serializer_class(self):
         no_hyperlinks = self.request.QUERY_PARAMS.get('no_hyperlinks', False)
@@ -5689,7 +5590,7 @@
             return self.serializer_class
     
     def get_queryset(self):
-        return ControllerSlices.select_by_user(self.request.user)
+        return ControllerSlice.select_by_user(self.request.user)
 
     # update() is handled by PlanetStackRetrieveUpdateDestroyAPIView
 
diff --git a/planetstack/hpc_observer/run.sh b/planetstack/hpc_observer/run.sh
old mode 100755
new mode 100644
diff --git a/planetstack/hpc_observer/start.sh b/planetstack/hpc_observer/start.sh
old mode 100755
new mode 100644
diff --git a/planetstack/hpc_observer/stop.sh b/planetstack/hpc_observer/stop.sh
old mode 100755
new mode 100644
diff --git a/planetstack/hpc_observer/upload.sh b/planetstack/hpc_observer/upload.sh
old mode 100755
new mode 100644
diff --git a/planetstack/model-deps b/planetstack/model-deps
index 33cb695..6647031 100644
--- a/planetstack/model-deps
+++ b/planetstack/model-deps
@@ -35,7 +35,7 @@
         "Node", 
         "Flavor"
     ], 
-    "ControllerNetworks": [
+    "ControllerNetwork": [
         "Network", 
         "Controller"
     ], 
@@ -70,7 +70,7 @@
     "ServiceAttribute": [
         "Service"
     ], 
-    "ControllerSiteDeployments": [
+    "ControllerSites": [
         "Controller"
     ], 
     "SlicePrivilege": [
@@ -87,17 +87,17 @@
         "Site", 
         "Role"
     ], 
-    "ControllerUsers": [
+    "ControllerUser": [
         "User", 
         "Controller"
     ], 
     "SiteCredential": [
         "Site"
     ], 
-    "ControllerSlices": [
+    "ControllerSlice": [
         "Controller", 
         "Slice",
-        "ControllerUsers"
+        "ControllerUser"
     ], 
     "SiteDeployments": [
         "Site", 
diff --git a/planetstack/model_policies/__init__.py b/planetstack/model_policies/__init__.py
index 8671d6a..f1c8071 100644
--- a/planetstack/model_policies/__init__.py
+++ b/planetstack/model_policies/__init__.py
@@ -1,3 +1,6 @@
 from .model_policy_Slice import *
 from .model_policy_User import *
 from .model_policy_Network import *
+from .model_policy_Site import *
+from .model_policy_SitePrivilege import *
+from .model_policy_SlicePrivilege import *
diff --git a/planetstack/model_policies/model_policy_Network.py b/planetstack/model_policies/model_policy_Network.py
index d9d138d..f822bf2 100644
--- a/planetstack/model_policies/model_policy_Network.py
+++ b/planetstack/model_policies/model_policy_Network.py
@@ -1,16 +1,16 @@
 from core.models import *
 
 def handle(network):
-	from core.models import ControllerSlices,ControllerNetworks
+	from core.models import ControllerSlice,ControllerNetwork
 	from collections import defaultdict
 	# network controllers are not visible to users. We must ensure
 	# networks are deployed at all deploymets available to their slices.
-	slice_controllers = ControllerSlices.objects.all()
+	slice_controllers = ControllerSlice.objects.all()
 	slice_deploy_lookup = defaultdict(list)
 	for slice_controller in slice_controllers:
 		slice_deploy_lookup[slice_controller.slice].append(slice_controller.controller)
 
-	network_controllers = ControllerNetworks.objects.all()
+	network_controllers = ControllerNetwork.objects.all()
 	network_deploy_lookup = defaultdict(list)
 	for network_controller in network_controllers:
 		network_deploy_lookup[network_controller.network].append(network_controller.controller)
@@ -19,5 +19,5 @@
 	for expected_controller in expected_controllers:
 		if network not in network_deploy_lookup or \
 		  expected_controller not in network_deploy_lookup[network]:
-			nd = ControllerNetworks(network=network, controller=expected_controller)
+			nd = ControllerNetwork(network=network, controller=expected_controller)
 			nd.save()
diff --git a/planetstack/model_policies/model_policy_Site.py b/planetstack/model_policies/model_policy_Site.py
new file mode 100644
index 0000000..7d96264
--- /dev/null
+++ b/planetstack/model_policies/model_policy_Site.py
@@ -0,0 +1,12 @@
+
+def handle(site):
+    from core.models import Controller, ControllerSite 
+    # make sure site has a ControllerSite record for each controller
+    ctrl_sites = ControllerSite.objects.filter(site=site)
+    existing_controllers = [cs.controller for cs in ctrl_sites]
+
+    all_controllers = Controller.objects.all()
+    for ctrl in all_controllers:
+        if ctrl not in existing_controllers:
+            ctrl_site = ControllerSite(controller=ctrl, site=site)
+            ctrl_site.save() 
diff --git a/planetstack/model_policies/model_policy_SitePrivilege.py b/planetstack/model_policies/model_policy_SitePrivilege.py
new file mode 100644
index 0000000..90280a3
--- /dev/null
+++ b/planetstack/model_policies/model_policy_SitePrivilege.py
@@ -0,0 +1,14 @@
+def handle(site_privilege):
+    from core.models import Controller, SitePrivilege, ControllerSitePrivilege
+    
+    # apply site privilage at all controllers
+    controller_site_privileges = ControllerSitePrivilege.objects.filter(
+        site_privilege = site_privilege,
+        )
+    existing_controllers = [csp.controller for sp in controller_site_privileges]
+    all_controllers = Controller.objects.all()
+    for controller in all_controllers:
+        if controller not in existing_controllers:
+            ctrl_site_priv = ControllerSitePrivilege(controller=controller, site_privilege=site_privilege)
+            ctrl_site_priv.save()  
+
diff --git a/planetstack/model_policies/model_policy_Slice.py b/planetstack/model_policies/model_policy_Slice.py
index 0d83d68..cc9f2b0 100644
--- a/planetstack/model_policies/model_policy_Slice.py
+++ b/planetstack/model_policies/model_policy_Slice.py
@@ -1,64 +1,59 @@
 
 def handle(slice):
-	from core.models import Controller,ControllerSlices,Controller,Network,NetworkSlice,NetworkTemplate
-	from collections import defaultdict
-	ctrl_site_deployments = SiteDeployments.objects.all()
-	
-	slice_controllers = ControllerSlices.objects.all()
-	slice_deploy_lookup = defaultdict(list)
-	for slice_controller in slice_controllers:
-		slice_deploy_lookup[slice_controller.slice].append(slice_controller)
-	
-        all_controllers = Controller.objects.all() 
-	for expected_controller in all_controllers:
-		if slice not in slice_deploy_lookup or \
-		   expected_controller not in slice_deploy_lookup[slice]:
-			sd = ControllerSlices(slice=slice, controller=expected_controller)
-			sd.save()
+    from core.models import Controller, ControllerSlice, SiteDeployment, Network, NetworkSlice,NetworkTemplate
+    from collections import defaultdict
+    controller_slices = ControllerSlice.objects.filter(slice=slice)
+    existing_controllers = [cs.controller for cs in controller_slices] 
+    
+    all_controllers = Controller.objects.all() 
+    for controller in all_controllers:
+        if controller not in existing_controllers:
+            sd = ControllerSlice(slice=slice, controller=controller)
+            sd.save()
 
-	# make sure slice has at least 1 public and 1 private networkd
-	public_nets = []
-	private_net = None
-	networks = Network.objects.filter(owner=slice)
-	for network in networks:
-		if network.template.name == 'Public dedicated IPv4':
-			public_nets.append(network)
-		elif network.template.name == 'Public shared IPv4':
-			public_nets.append(network)
-		elif network.template.name == 'Private':
-			private_net = network
-	if not public_nets:
+    # make sure slice has at least 1 public and 1 private networkd
+    public_nets = []
+    private_net = None
+    networks = Network.objects.filter(owner=slice)
+    for network in networks:
+        if network.template.name == 'Public dedicated IPv4':
+            public_nets.append(network)
+        elif network.template.name == 'Public shared IPv4':
+            public_nets.append(network)
+        elif network.template.name == 'Private':
+            private_net = network
+    if not public_nets:
                 # ensure there is at least one public network, and default it to dedicated
-		nat_net = Network(
-          	    name = slice.name+'-nat',
-             	    template = NetworkTemplate.objects.get(name='Public shared IPv4'),
-          	    owner = slice
-      		    )
-		nat_net.save()
-                public_nets.append(nat_net)
+        nat_net = Network(
+                name = slice.name+'-nat',
+                    template = NetworkTemplate.objects.get(name='Public shared IPv4'),
+                owner = slice
+                )
+        nat_net.save()
+        public_nets.append(nat_net)
 
-	if not private_net:
-        	private_net = Network(
-          	name = slice.name+'-private',
-          	template = NetworkTemplate.objects.get(name='Private'),
-          	owner = slice
-      		)
-      		private_net.save()
-	# create slice networks
-	public_net_slice = None
-	private_net_slice = None
-	net_slices = NetworkSlice.objects.filter(slice=slice, network__in=[private_net]+public_nets)
-	for net_slice in net_slices:
-		if net_slice.network in public_nets:
-			public_net_slice = net_slice
-		elif net_slice.network == private_net:
-			private_net_slice = net_slice
-	if not public_net_slice:
-		public_net_slice = NetworkSlice(slice=slice, network=public_nets[0])
-		public_net_slice.save()
-	if not private_net_slice:
-		private_net_slice = NetworkSlice(slice=slice, network=private_net)
-		private_net_slice.save()
+    if not private_net:
+        private_net = Network(
+        name = slice.name+'-private',
+        template = NetworkTemplate.objects.get(name='Private'),
+        owner = slice
+        )
+        private_net.save()
+    # create slice networks
+    public_net_slice = None
+    private_net_slice = None
+    net_slices = NetworkSlice.objects.filter(slice=slice, network__in=[private_net]+public_nets)
+    for net_slice in net_slices:
+        if net_slice.network in public_nets:
+            public_net_slice = net_slice
+        elif net_slice.network == private_net:
+            private_net_slice = net_slice
+    if not public_net_slice:
+        public_net_slice = NetworkSlice(slice=slice, network=public_nets[0])
+        public_net_slice.save()
+    if not private_net_slice:
+        private_net_slice = NetworkSlice(slice=slice, network=private_net)
+        private_net_slice.save()
 
 
 
diff --git a/planetstack/model_policies/model_policy_SlicePrivilege.py b/planetstack/model_policies/model_policy_SlicePrivilege.py
new file mode 100644
index 0000000..0f772cb
--- /dev/null
+++ b/planetstack/model_policies/model_policy_SlicePrivilege.py
@@ -0,0 +1,14 @@
+def handle(slice_privilege):
+    from core.models import Controller, SlicePrivilege, ControllerSlicePrivilege
+    
+    # apply slice privilage at all controllers
+    controller_slice_privileges = ControllerSlicePrivilege.objects.filter(
+        slice_privilege = slice_privilege,
+        )
+    existing_controllers = [csp.controller for sp in controller_slice_privileges]
+    all_controllers = Controller.objects.all()
+    for controller in all_controllers:
+        if controller not in existing_controllers:
+            ctrl_slice_priv = ControllerSlicePrivilege(controller=controller, slice_privilege=slice_privilege)
+            ctrl_slice_priv.save()  
+
diff --git a/planetstack/model_policies/model_policy_User.py b/planetstack/model_policies/model_policy_User.py
index 703b28c..b7b16ad 100644
--- a/planetstack/model_policies/model_policy_User.py
+++ b/planetstack/model_policies/model_policy_User.py
@@ -1,30 +1,12 @@
-from core.models import *
-
 def handle(user):
-	from core.models import Controller, ControllerSiteDeployments, ControllerUsers
-	from collections import defaultdict
-	ctrl_site_deployments = ControllerSiteDeployments.objects.all()
-	controller_lookup = defaultdict(list)
-	for ctrl_site_deployment in ctrl_site_deployments:
-		controller_site_lookup[ctrl_site_deployment.site_deployment].append(ctrl_site_deployment)
-
-	controller_user_lookup = defaultdict(list)
-	for controller_user in ControllerUsers.objects.all():
-		controller_user_lookup[controller_user.user].append(controller_user.controller)
-   
-	if user.is_admin:
-		# admins should have an account at all controllers
-		expected_controllers = controllers
-	else:
-		# normal users should have an account at their site's controllers
-		#expected_controllers = controller_site_lookup[user.site]
-		# users are added to all controllers for now
-		expected_controllers = controllers        
-
-	for expected_controller in expected_controllers:
-		if not user in controller_user_lookup or \
-		  expected_controller not in controller_user_lookup[user]: 
-			# add new record
-			ud = ControllerUsers(user=user, controller=expected_controller)
-			ud.save()    
+    from core.models import Controller, ControllerSite, ControllerUser
+    from collections import defaultdict
+    
+    controller_users = ControllerUser.objects.filter(user=user)
+    existing_controllers = [cu.controller for cu in controller_users]
+    all_controllers = Controller.objects.all()
+    for controller in all_controllers:
+        if controller not in existing_controllers:
+            ctrl_user = ControllerUser(controller=controller, user=user)
+            ctrl_user.save()  
 
diff --git a/planetstack/model_policy.py b/planetstack/model_policy.py
index de6f73d..e12b15c 100644
--- a/planetstack/model_policy.py
+++ b/planetstack/model_policy.py
@@ -4,6 +4,7 @@
 from core.models import *
 from dependency_walker import *
 import model_policies
+from util.logger import logger
 
 modelPolicyEnabled = True
 
@@ -41,7 +42,7 @@
 			if policy_handler is not None:
 				policy_handler.handle(instance)
 		except:
-			pass
+			logger.log_exc("Model Policy Error:") 
 	elif 'deleted' in kwargs['update_fields']:
 		walk_inv_deps(delete_if_inactive, instance)
 	
diff --git a/planetstack/openstack/driver.py b/planetstack/openstack/driver.py
index f448e40..53b8e3f 100644
--- a/planetstack/openstack/driver.py
+++ b/planetstack/openstack/driver.py
@@ -43,7 +43,8 @@
         return driver
 
     def admin_driver(self, tenant=None, controller=None):
-        controller = Controller.objects.get(id=controller.id)
+        if isinstance(controller, int):
+            controller = Controller.objects.get(id=controller.id)
         client = OpenStackClient(tenant=tenant, controller=controller)
         driver = OpenStackDriver(client=client)
         driver.admin_user = client.keystone.users.find(name=controller.admin_user)
diff --git a/planetstack/openstack_observer/ansible.py b/planetstack/openstack_observer/ansible.py
old mode 100755
new mode 100644
diff --git a/planetstack/openstack_observer/event_loop.py b/planetstack/openstack_observer/event_loop.py
index 500c0e0..cdd94a2 100644
--- a/planetstack/openstack_observer/event_loop.py
+++ b/planetstack/openstack_observer/event_loop.py
@@ -50,7 +50,7 @@
 	return ig
 
 class PlanetStackObserver:
-	#sync_steps = [SyncNetworks,SyncNetworkSlivers,SyncSites,SyncSitePrivileges,SyncSlices,SyncSliceMemberships,SyncSlivers,SyncSliverIps,SyncExternalRoutes,SyncUsers,SyncRoles,SyncNodes,SyncImages,GarbageCollector]
+	#sync_steps = [SyncNetworks,SyncNetworkSlivers,SyncSites,SyncSitePrivilege,SyncSlices,SyncSliceMemberships,SyncSlivers,SyncSliverIps,SyncExternalRoutes,SyncUsers,SyncRoles,SyncNodes,SyncImages,GarbageCollector]
 	sync_steps = []
 
 	
diff --git a/planetstack/openstack_observer/run_ansible b/planetstack/openstack_observer/run_ansible
old mode 100755
new mode 100644
diff --git a/planetstack/openstack_observer/steps/__init__.py b/planetstack/openstack_observer/steps/__init__.py
index 3f8dca4..72b0b12 100644
--- a/planetstack/openstack_observer/steps/__init__.py
+++ b/planetstack/openstack_observer/steps/__init__.py
@@ -1,14 +1,5 @@
-from .sync_controller_site_deployments import SyncControllerSiteDeployments
-from .sync_network_slivers import SyncNetworkSlivers
-from .sync_networks import SyncNetworks
-from .sync_controller_networks import SyncControllerNetworks
-from .sync_site_privileges import SyncSitePrivileges
-from .sync_sites import SyncSites
-from .sync_slice_memberships import SyncSliceMemberships
-from .sync_slices import SyncSlices
-from .sync_slivers import SyncSlivers
-from .sync_users import SyncUsers
-from .sync_roles import SyncRoles
-from .sync_nodes import SyncNodes
-from .sync_images import SyncImages
-from .sync_controller_images import SyncControllerImages
+from .sync_controller_sites import SyncControllerSites
+from .sync_controller_slices import SyncControllerSlices
+from .sync_controller_users import SyncControllerUsers
+from .sync_controller_site_privileges import SyncControllerSitePrivileges
+from .sync_controller_slice_privileges import SyncControllerSlicePrivileges
diff --git a/planetstack/openstack_observer/steps/sync_controller_networks.py b/planetstack/openstack_observer/steps/sync_controller_networks.py
index 3cff7c2..fa1f439 100644
--- a/planetstack/openstack_observer/steps/sync_controller_networks.py
+++ b/planetstack/openstack_observer/steps/sync_controller_networks.py
@@ -13,9 +13,9 @@
 
 logger = Logger(level=logging.INFO)
 
-class SyncControllerNetworks(OpenStackSyncStep):
+class SyncControllerNetwork(OpenStackSyncStep):
     requested_interval = 0
-    provides=[Network, ControllerNetworks, Sliver]
+    provides=[Network, ControllerNetwork, Sliver]
 
     def alloc_subnet(self, uuid):
         a = 10
@@ -29,9 +29,9 @@
 
     def fetch_pending(self, deleted):
         if (deleted):
-            return ControllerNetworks.deleted_objects.all()
+            return ControllerNetwork.deleted_objects.all()
         else:
-            return ControllerNetworks.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+            return ControllerNetwork.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
 
 
     def save_controller_network(self, controller_network):
diff --git a/planetstack/openstack_observer/steps/sync_controller_site_deployments.py b/planetstack/openstack_observer/steps/sync_controller_site_deployments.py
deleted file mode 100644
index 907325a..0000000
--- a/planetstack/openstack_observer/steps/sync_controller_site_deployments.py
+++ /dev/null
@@ -1,63 +0,0 @@
-import os
-import base64
-from django.db.models import F, Q
-from planetstack.config import Config
-from observer.openstacksyncstep import OpenStackSyncStep
-from core.models.site import *
-from observer.ansible import *
-
-class SyncControllerSiteDeployments(OpenStackSyncStep):
-    requested_interval=0
-    provides=[SiteDeployments]
-
-    def fetch_pending(self, deleted=False):
-        pending = super(OpenStackSyncStep, self).fetch_pending(deleted)
-        return pending.filter(controller__isnull=False)
-
-    def sync_record(self, site_deployment):
-
-	template = os_template_env.get_template('sync_controller_site_deployments.yaml')
-	tenant_fields = {'endpoint':site_deployment.controller.auth_url,
-		         'admin_user': site_deployment.controller.admin_user,
-		         'admin_password': site_deployment.controller.admin_password,
-		         'admin_tenant': site_deployment.controller.admin_tenant,
-	                 'ansible_tag': '%s@%s'%(site_deployment.site.login_base,site_deployment.deployment.name), # name of ansible playbook
-		         'tenant': site_deployment.site.login_base,
-		         'tenant_description': site_deployment.site.name}
-
-	rendered = template.render(tenant_fields)
-	res = run_template('sync_controller_site_deployments.yaml', tenant_fields, path='controller_site_deployments')
-
-	if (len(res)==1):
-		site_deployment.tenant_id = res[0]['id']
-        	site_deployment.save()
-	elif (len(res)):
-		raise Exception('Could not assign roles for user %s'%tenant_fields['tenant'])
-	else:
-		raise Exception('Could not create or update user %s'%tenant_fields['tenant'])
-            
-    def delete_record(self, site_deployment):
-	if site_deployment.tenant_id:
-            driver = self.driver.admin_driver(controller=site_deployment.controller)
-            driver.delete_tenant(site_deployment.tenant_id)
-
-	"""
-        Ansible does not support tenant deletion yet
-
-	import pdb
-	pdb.set_trace()
-        template = os_template_env.get_template('delete_site_deployments.yaml')
-	tenant_fields = {'endpoint':site_deployment.controller.auth_url,
-		         'admin_user': site_deployment.controller.admin_user,
-		         'admin_password': site_deployment.controller.admin_password,
-		         'admin_tenant': 'admin',
-	                 'ansible_tag': 'site_deployments/%s@%s'%(site_deployment.site_deployment.site.login_base,site_deployment.site_deployment.deployment.name), # name of ansible playbook
-		         'tenant': site_deployment.site_deployment.site.login_base,
-		         'delete': True}
-
-	rendered = template.render(tenant_fields)
-	res = run_template('sync_site_deployments.yaml', tenant_fields)
-
-	if (len(res)!=1):
-		raise Exception('Could not assign roles for user %s'%tenant_fields['tenant'])
-	"""
diff --git a/planetstack/openstack_observer/steps/sync_controller_site_privileges.py b/planetstack/openstack_observer/steps/sync_controller_site_privileges.py
new file mode 100644
index 0000000..dd5bf3a
--- /dev/null
+++ b/planetstack/openstack_observer/steps/sync_controller_site_privileges.py
@@ -0,0 +1,92 @@
+import os
+import base64
+from collections import defaultdict
+from django.db.models import F, Q
+from planetstack.config import Config
+from observer.openstacksyncstep import OpenStackSyncStep
+from core.models.site import Controller, SitePrivilege 
+from core.models.user import User
+from core.models.controlleruser import ControllerUser, ControllerSitePrivilege
+from util.logger import Logger, logging
+
+from observer.ansible import *
+
+logger = Logger(level=logging.INFO)
+
+class SyncControllerSitePrivileges(OpenStackSyncStep):
+    provides=[ControllerSitePrivilege]
+    requested_interval=0
+
+    def fetch_pending(self, deleted):
+
+        if (deleted):
+            return ControllerSitePrivilege.deleted_objects.all()
+        else:
+            return ControllerSitePrivilege.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None)) 
+
+    def sync_record(self, controller_site_privilege):
+        logger.info("sync'ing controler_site_privilege %s at controller %s" % (controller_site_privilege, controller_site_privilege.controller))
+
+        if not controller_site_privilege.controller.admin_user:
+            logger.info("controller %r has no admin_user, skipping" % controller_site_privilege.controller)
+            return
+
+	template = os_template_env.get_template('sync_controller_users.yaml')
+        roles = [controller_site_privilege.site_privilege.role.role]
+	# setup user home site roles at controller 
+        if not controller_site_privilege.site_privilege.user.site:
+            raise Exception('Siteless user %s'%controller_site_privilege.site_privilege.user.email)
+        else:
+            # look up tenant id for the user's site at the controller
+            #ctrl_site_deployments = SiteDeployment.objects.filter(
+            #  site_deployment__site=controller_site_privilege.user.site,
+            #  controller=controller_site_privilege.controller)
+
+            #if ctrl_site_deployments:
+            #    # need the correct tenant id for site at the controller
+            #    tenant_id = ctrl_site_deployments[0].tenant_id  
+            #    tenant_name = ctrl_site_deployments[0].site_deployment.site.login_base
+            user_fields = {
+                       'endpoint':controller_site_privilege.controller.auth_url,
+		       'name': controller_site_privilege.site_privilege.user.email,
+                       'email': controller_site_privilege.site_privilege.user.email,
+                       'password': controller_site_privilege.site_privilege.user.remote_password,
+                       'admin_user': controller_site_privilege.controller.admin_user,
+		       'admin_password': controller_site_privilege.controller.admin_password,
+	               'ansible_tag':'%s@%s'%(controller_site_privilege.site_privilege.user.email.replace('@','-at-'),controller_site_privilege.controller.name),
+		       'admin_tenant': controller_site_privilege.controller.admin_tenant,
+		       'roles':roles,
+		       'tenant':controller_site_privilege.site_privilege.site.login_base}    
+	
+	    rendered = template.render(user_fields)
+	    res = run_template('sync_controller_users.yaml', user_fields,path='controller_site_privileges')
+
+	    # results is an array in which each element corresponds to an 
+	    # "ok" string received per operation. If we get as many oks as
+	    # the number of operations we issued, that means a grand success.
+	    # Otherwise, the number of oks tell us which operation failed.
+	    expected_length = len(roles) + 1
+	    if (len(res)==expected_length):
+                controller_site_privilege.role_id = res[0]['id']
+                controller_site_privilege.save()
+	    elif (len(res)):
+	        raise Exception('Could not assign roles for user %s'%user_fields['name'])
+	    else:
+	        raise Exception('Could not create or update user %s'%user_fields['name'])
+
+    def delete_record(self, controller_site_privilege):
+        if controller_site_privilege.role_id:
+            driver = self.driver.admin_driver(controller=controller_site_privilege.controller)
+            user = ControllerUser.objects.get(
+                controller=controller_site_privilege.controller, 
+                user=controller_site_privilege.site_privilege.user
+            )
+            site = ControllerSite.objects.get(
+                controller=controller_site_privilege.controller, 
+                user=controller_site_privilege.site_privilege.user
+            )
+            driver.delete_user_role(
+                user.kuser_id, 
+                site.tenant_id, 
+                controller_site_privilege.site_prvilege.role.role
+            )
diff --git a/planetstack/openstack_observer/steps/sync_controller_sites.py b/planetstack/openstack_observer/steps/sync_controller_sites.py
new file mode 100644
index 0000000..865ae07
--- /dev/null
+++ b/planetstack/openstack_observer/steps/sync_controller_sites.py
@@ -0,0 +1,63 @@
+import os
+import base64
+from django.db.models import F, Q
+from planetstack.config import Config
+from openstack_observer.openstacksyncstep import OpenStackSyncStep
+from core.models.site import *
+from observer.ansible import *
+
+class SyncControllerSites(OpenStackSyncStep):
+    requested_interval=0
+    provides=[ControllerSite]
+
+    def fetch_pending(self, deleted=False):
+        pending = super(OpenStackSyncStep, self).fetch_pending(deleted)
+        return pending.filter(controller__isnull=False)
+
+    def sync_record(self, controller_site):
+
+	template = os_template_env.get_template('sync_controller_sites.yaml')
+	tenant_fields = {'endpoint':controller_site.controller.auth_url,
+		         'admin_user': controller_site.controller.admin_user,
+		         'admin_password': controller_site.controller.admin_password,
+		         'admin_tenant': controller_site.controller.admin_tenant,
+	                 'ansible_tag': '%s@%s'%(controller_site.site.login_base,controller_site.controller.name), # name of ansible playbook
+		         'tenant': controller_site.site.login_base,
+		         'tenant_description': controller_site.site.name}
+
+	rendered = template.render(tenant_fields)
+	res = run_template('sync_controller_sites.yaml', tenant_fields, path='controller_sites')
+
+	if (len(res)==1):
+		controller_site.tenant_id = res[0]['id']
+        	controller_site.save()
+	elif (len(res)):
+		raise Exception('Could not assign roles for user %s'%tenant_fields['tenant'])
+	else:
+		raise Exception('Could not create or update user %s'%tenant_fields['tenant'])
+            
+    def delete_record(self, controller_site):
+	if controller_site.tenant_id:
+            driver = self.driver.admin_driver(controller=controller_site.controller)
+            driver.delete_tenant(controller_site.tenant_id)
+
+	"""
+        Ansible does not support tenant deletion yet
+
+	import pdb
+	pdb.set_trace()
+        template = os_template_env.get_template('delete_controller_sites.yaml')
+	tenant_fields = {'endpoint':controller_site.controller.auth_url,
+		         'admin_user': controller_site.controller.admin_user,
+		         'admin_password': controller_site.controller.admin_password,
+		         'admin_tenant': 'admin',
+	                 'ansible_tag': 'controller_sites/%s@%s'%(controller_site.controller_site.site.login_base,controller_site.controller_site.deployment.name), # name of ansible playbook
+		         'tenant': controller_site.controller_site.site.login_base,
+		         'delete': True}
+
+	rendered = template.render(tenant_fields)
+	res = run_template('sync_controller_sites.yaml', tenant_fields)
+
+	if (len(res)!=1):
+		raise Exception('Could not assign roles for user %s'%tenant_fields['tenant'])
+	"""
diff --git a/planetstack/openstack_observer/steps/sync_controller_site_deployments.yaml b/planetstack/openstack_observer/steps/sync_controller_sites.yaml
similarity index 100%
rename from planetstack/openstack_observer/steps/sync_controller_site_deployments.yaml
rename to planetstack/openstack_observer/steps/sync_controller_sites.yaml
diff --git a/planetstack/openstack_observer/steps/sync_controller_slice_privileges.py b/planetstack/openstack_observer/steps/sync_controller_slice_privileges.py
new file mode 100644
index 0000000..f981f16
--- /dev/null
+++ b/planetstack/openstack_observer/steps/sync_controller_slice_privileges.py
@@ -0,0 +1,92 @@
+import os
+import base64
+from collections import defaultdict
+from django.db.models import F, Q
+from planetstack.config import Config
+from observer.openstacksyncstep import OpenStackSyncStep
+from core.models.slice import Controller, SlicePrivilege 
+from core.models.user import User
+from core.models.controlleruser import ControllerUser, ControllerSlicePrivilege
+from util.logger import Logger, logging
+
+from observer.ansible import *
+
+logger = Logger(level=logging.INFO)
+
+class SyncControllerSlicePrivileges(OpenStackSyncStep):
+    provides=[ControllerSlicePrivilege]
+    requested_interval=0
+
+    def fetch_pending(self, deleted):
+
+        if (deleted):
+            return ControllerSlicePrivilege.deleted_objects.all()
+        else:
+            return ControllerSlicePrivilege.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None)) 
+
+    def sync_record(self, controller_slice_privilege):
+        logger.info("sync'ing controler_slice_privilege %s at controller %s" % (controller_slice_privilege, controller_slice_privilege.controller))
+
+        if not controller_slice_privilege.controller.admin_user:
+            logger.info("controller %r has no admin_user, skipping" % controller_slice_privilege.controller)
+            return
+
+	template = os_template_env.get_template('sync_controller_users.yaml')
+        roles = [controller_slice_privilege.slice_privilege.role.role]
+	# setup user home slice roles at controller 
+        if not controller_slice_privilege.slice_privilege.user.site:
+            raise Exception('Sliceless user %s'%controller_slice_privilege.slice_privilege.user.email)
+        else:
+            # look up tenant id for the user's slice at the controller
+            #ctrl_slice_deployments = SliceDeployment.objects.filter(
+            #  slice_deployment__slice=controller_slice_privilege.user.slice,
+            #  controller=controller_slice_privilege.controller)
+
+            #if ctrl_slice_deployments:
+            #    # need the correct tenant id for slice at the controller
+            #    tenant_id = ctrl_slice_deployments[0].tenant_id  
+            #    tenant_name = ctrl_slice_deployments[0].slice_deployment.slice.login_base
+            user_fields = {
+                       'endpoint':controller_slice_privilege.controller.auth_url,
+		       'name': controller_slice_privilege.slice_privilege.user.email,
+                       'email': controller_slice_privilege.slice_privilege.user.email,
+                       'password': controller_slice_privilege.slice_privilege.user.remote_password,
+                       'admin_user': controller_slice_privilege.controller.admin_user,
+		       'admin_password': controller_slice_privilege.controller.admin_password,
+	               'ansible_tag':'%s@%s'%(controller_slice_privilege.slice_privilege.user.email.replace('@','-at-'),controller_slice_privilege.controller.name),
+		       'admin_tenant': controller_slice_privilege.controller.admin_tenant,
+		       'roles':roles,
+		       'tenant':controller_slice_privilege.slice_privilege.slice.name}    
+	
+	    rendered = template.render(user_fields)
+	    res = run_template('sync_controller_users.yaml', user_fields,path='controller_slice_privileges')
+
+	    # results is an array in which each element corresponds to an 
+	    # "ok" string received per operation. If we get as many oks as
+	    # the number of operations we issued, that means a grand success.
+	    # Otherwise, the number of oks tell us which operation failed.
+	    expected_length = len(roles) + 1
+	    if (len(res)==expected_length):
+                controller_slice_privilege.role_id = res[0]['id']
+                controller_slice_privilege.save()
+	    elif (len(res)):
+	        raise Exception('Could not assign roles for user %s'%user_fields['name'])
+	    else:
+	        raise Exception('Could not create or update user %s'%user_fields['name'])
+
+    def delete_record(self, controller_slice_privilege):
+        if controller_slice_privilege.role_id:
+            driver = self.driver.admin_driver(controller=controller_slice_privilege.controller)
+            user = ControllerUser.objects.get(
+                controller=controller_slice_privilege.controller, 
+                user=controller_slice_privilege.slice_privilege.user
+            )
+            slice = ControllerSlice.objects.get(
+                controller=controller_slice_privilege.controller, 
+                user=controller_slice_privilege.slice_privilege.user
+            )
+            driver.delete_user_role(
+                user.kuser_id, 
+                slice.tenant_id, 
+                controller_slice_privilege.slice_prvilege.role.role
+            )
diff --git a/planetstack/openstack_observer/steps/sync_controller_slices.py b/planetstack/openstack_observer/steps/sync_controller_slices.py
index b1a1f55..7331fac 100644
--- a/planetstack/openstack_observer/steps/sync_controller_slices.py
+++ b/planetstack/openstack_observer/steps/sync_controller_slices.py
@@ -5,22 +5,23 @@
 from django.db.models import F, Q
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
-from core.models.slice import Slice, ControllerSlices
-from core.models.controllerusers import ControllerUsers
-from util.logger import Logger, logging
+from core.models.slice import Slice, ControllerSlice
+from core.models.controlleruser import ControllerUser
+from util.logger import Logger, logging, logger
 from observer.ansible import *
+from openstack.driver import OpenStackDriver
 
 logger = Logger(level=logging.INFO)
 
 class SyncControllerSlices(OpenStackSyncStep):
-    provides=[ControllerSlices]
+    provides=[ControllerSlice]
     requested_interval=0
 
     def fetch_pending(self, deleted):
         if (deleted):
-            return ControllerSlices.deleted_objects.all()
+            return ControllerSlice.deleted_objects.all()
         else:
-            return ControllerSlices.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+            return ControllerSlice.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
 
     def sync_record(self, controller_slice):
         logger.info("sync'ing slice controller %s" % controller_slice)
@@ -29,13 +30,13 @@
             logger.info("controller %r has no admin_user, skipping" % controller_slice.controller)
             return
 
-        controller_users = ControllerUsers.objects.filter(user=controller_slice.slice.creator,
+        controller_users = ControllerUser.objects.filter(user=controller_slice.slice.creator,
                                                              controller=controller_slice.controller)
         if not controller_users:
             raise Exception("slice createor %s has not accout at controller %s" % (controller_slice.slice.creator, controller_slice.controller.name))
         else:
             controller_user = controller_users[0]
-            roles = ['admin']
+            roles = ['Admin']
 
         max_instances=int(controller_slice.slice.max_slivers)
         tenant_fields = {'endpoint':controller_slice.controller.auth_url,
@@ -57,19 +58,16 @@
             tenant_id = res[0]['id']
             if (not controller_slice.tenant_id):
                 try:
-                        driver = OpenStackDriver().client_driver(caller=controller_slice.controller.admin_user,
-                                                         tenant=controller_slice.controller.admin_tenant,
-                                                         controller=controller_network.controller)
-                        driver.shell.nova.quotas.update(tenant_id=controller_slice.slice.name, instances=int(controller_slice.slice.max_slivers))
+                        driver = OpenStackDriver().admin_driver(controller=controller_slice.controller)
+                        driver.shell.nova.quotas.update(tenant_id=controller_slice.tenant_id, instances=int(controller_slice.slice.max_slivers))
                 except:
-                        logging.info('Could not update quota for %s'%controller_slice.slice.name)
+                        logger.log_exc('Could not update quota for %s'%controller_slice.slice.name)
                         raise Exception('Could not update quota for %s'%controller_slice.slice.name)
-
+                
                 controller_slice.tenant_id = tenant_id
                 controller_slice.save()
 
 
-
     def delete_record(self, controller_slice):
         user = User.objects.get(id=controller_slice.slice.creator.id)
         driver = OpenStackDriver().admin_driver(controller=controller_slice.controller.name)
diff --git a/planetstack/openstack_observer/steps/sync_controller_users.py b/planetstack/openstack_observer/steps/sync_controller_users.py
index 1b57b81..0c35047 100644
--- a/planetstack/openstack_observer/steps/sync_controller_users.py
+++ b/planetstack/openstack_observer/steps/sync_controller_users.py
@@ -4,9 +4,9 @@
 from django.db.models import F, Q
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
-from core.models.site import Controller, SiteDeployments, SiteDeployments
+from core.models.site import Controller, SiteDeployment, SiteDeployment
 from core.models.user import User
-from core.models.controllerusers import ControllerUsers
+from core.models.controlleruser import ControllerUser
 from util.logger import Logger, logging
 
 from observer.ansible import *
@@ -14,15 +14,15 @@
 logger = Logger(level=logging.INFO)
 
 class SyncControllerUsers(OpenStackSyncStep):
-    provides=[ControllerUsers, User]
+    provides=[ControllerUser, User]
     requested_interval=0
 
     def fetch_pending(self, deleted):
 
         if (deleted):
-            return ControllerUsers.deleted_objects.all()
+            return ControllerUser.deleted_objects.all()
         else:
-            return ControllerUsers.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None)) 
+            return ControllerUser.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None)) 
 
     def sync_record(self, controller_user):
         logger.info("sync'ing user %s at controller %s" % (controller_user.user, controller_user.controller))
@@ -37,14 +37,14 @@
         # We must also check if the user should have the admin role 		 		
 	roles = ['user']
         if controller_user.user.is_admin:
-            roles.append('admin')
+            roles.append('Admin')
    
 	# setup user home site roles at controller 
         if not controller_user.user.site:
             raise Exception('Siteless user %s'%controller_user.user.email)
         else:
             # look up tenant id for the user's site at the controller
-            #ctrl_site_deployments = SiteDeployments.objects.filter(
+            #ctrl_site_deployments = SiteDeployment.objects.filter(
             #  site_deployment__site=controller_user.user.site,
             #  controller=controller_user.controller)
 
diff --git a/planetstack/openstack_observer/steps/sync_networks.py b/planetstack/openstack_observer/steps/sync_networks.py
index a4e9552..9f36ed5 100644
--- a/planetstack/openstack_observer/steps/sync_networks.py
+++ b/planetstack/openstack_observer/steps/sync_networks.py
@@ -17,8 +17,8 @@
         network.save()
 
     def delete_record(self, network):
-        controller_networks_deleter = SyncControllerNetworks().delete_record
-        for controller_network in ControllerNetworks.objects.filter(network=network):
+        controller_networks_deleter = SyncControllerNetwork().delete_record
+        for controller_network in ControllerNetwork.objects.filter(network=network):
             try:
                 controller_network_deleter(controller_network)    
             except Exception,e:
diff --git a/planetstack/openstack_observer/steps/sync_nodes.py b/planetstack/openstack_observer/steps/sync_nodes.py
index 9d51073..e2c63bc 100644
--- a/planetstack/openstack_observer/steps/sync_nodes.py
+++ b/planetstack/openstack_observer/steps/sync_nodes.py
@@ -6,7 +6,7 @@
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
 from core.models.node import Node
-from core.models.site import SiteDeployments, Controller, SiteDeployments
+from core.models.site import SiteDeployment, Controller
 from util.logger import Logger, logging
 
 logger = Logger(level=logging.INFO)
@@ -30,7 +30,7 @@
         new_nodes = []
         for controller in controllers:
             try:
-            	controller_site_deployments = SiteDeployments.objects.filter(controller=controller)[0]
+            	controller_site_deployments = SiteDeployment.objects.filter(controller=controller)[0]
 	    except IndexError:
                 raise Exception("Controller %s not bound to any site deployments"%controller.name)
 
diff --git a/planetstack/openstack_observer/steps/sync_site_privileges.py b/planetstack/openstack_observer/steps/sync_site_privileges.py
index 6354d1f..bfc04b3 100644
--- a/planetstack/openstack_observer/steps/sync_site_privileges.py
+++ b/planetstack/openstack_observer/steps/sync_site_privileges.py
@@ -3,9 +3,9 @@
 from django.db.models import F, Q
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
-from core.models import User, ControllerUsers, SitePrivilege, SiteDeployments   
+from core.models import User, ControllerUser, SitePrivilege, SiteDeployment   
 
-class SyncSitePrivileges(OpenStackSyncStep):
+class SyncSitePrivilege(OpenStackSyncStep):
     requested_interval=0
     provides=[SitePrivilege]
 
@@ -18,9 +18,9 @@
 
     def sync_record(self, site_priv):
         # sync site privileges at all site controllers
-        ctrl_site_deployments = SiteDeployments.objects.filter(site_deployment__site=site_priv.site)
+        ctrl_site_deployments = SiteDeployment.objects.filter(site_deployment__site=site_priv.site)
         for ctrl_site_deployment in ctrl_site_deployments:
-            controller_users = ControllerUsers.objects.filter(controller=ctrl_site_deployment.controller,
+            controller_users = ControllerUser.objects.filter(controller=ctrl_site_deployment.controller,
                                                               user=site_priv.user)
             if controller_users:
                 kuser_id  = controller_users[0].kuser_id
diff --git a/planetstack/openstack_observer/steps/sync_sites.py b/planetstack/openstack_observer/steps/sync_sites.py
deleted file mode 100644
index ea7df7e..0000000
--- a/planetstack/openstack_observer/steps/sync_sites.py
+++ /dev/null
@@ -1,25 +0,0 @@
-import os
-import base64
-from django.db.models import F, Q
-from planetstack.config import Config
-from observer.openstacksyncstep import OpenStackSyncStep
-from core.models.site import Site, SiteDeployments, SiteDeployments 
-from observer.steps.sync_controller_site_deployments import *
-
-class SyncSites(OpenStackSyncStep):
-    provides=[Site]
-    requested_interval=0
-
-    def sync_record(self, site):
-        site.save()
-
-    def delete_record(self, site):
-        # delete associated controllers site deployments
-        site_deployments = SiteDeployments.objects.filter(site=site)
-        site_deploy_deleter = SyncControllerSiteDeployments().delete_record
-        for site_deployment in site_deployments:
-            site_deployment_deleter(site_deployment)
-
-         
-
-	
diff --git a/planetstack/openstack_observer/steps/sync_slice_memberships.py b/planetstack/openstack_observer/steps/sync_slice_memberships.py
index 600f012..e95c533 100644
--- a/planetstack/openstack_observer/steps/sync_slice_memberships.py
+++ b/planetstack/openstack_observer/steps/sync_slice_memberships.py
@@ -4,7 +4,7 @@
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
 from core.models.slice import *
-from core.models.controllerusers import ControllerUsers
+from core.models.controllerusers import ControllerUser
 from util.logger import Logger, logging
 
 logger = Logger(level=logging.INFO)
@@ -22,11 +22,11 @@
     def sync_record(self, slice_memb):
         # sync slice memberships at all slice controllers 
         logger.info("syncing slice privilege: %s %s" % (slice_memb.slice.name, slice_memb.user.email))
-        slice_controllers = ControllerSlices.objects.filter(slice=slice_memb.slice)
+        slice_controllers = ControllerSlice.objects.filter(slice=slice_memb.slice)
         for slice_controller in slice_controllers:
             if not slice_controller.tenant_id:
                 continue
-            controller_users = ControllerUsers.objects.filter(controller=slice_controller.controller,
+            controller_users = ControllerUser.objects.filter(controller=slice_controller.controller,
                                                               user=slice_memb.user)
             if controller_users:
                 kuser_id  = controller_users[0].kuser_id
diff --git a/planetstack/openstack_observer/steps/sync_slices.py b/planetstack/openstack_observer/steps/sync_slices.py
index a792b48..99ed44c 100644
--- a/planetstack/openstack_observer/steps/sync_slices.py
+++ b/planetstack/openstack_observer/steps/sync_slices.py
@@ -4,7 +4,7 @@
 from django.db.models import F, Q
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
-from core.models.slice import Slice, ControllerSlices
+from core.models.slice import Slice, ControllerSlice
 from util.logger import Logger, logging
 from observer.steps.sync_controller_slices import *
 
@@ -15,14 +15,14 @@
     requested_interval=0
 
     def sync_record(self, slice):
-        for controller_slice in ControllerSlices.objects.filter(slice=slice):
+        for controller_slice in ControllerSlice.objects.filter(slice=slice):
             # bump the 'updated' timestamp and trigger observer to update
             # slice across all controllers 
             controller_slice.save()    
 
     def delete_record(self, slice):
-        controller_slice_deleter = SyncControllerSlices().delete_record
-        for controller_slice in ControllerSlices.objects.filter(slice=slice):
+        controller_slice_deleter = SyncControllerSlice().delete_record
+        for controller_slice in ControllerSlice.objects.filter(slice=slice):
             try:
                 controller_slice_deleter(controller_slice)
             except Exception,e:
diff --git a/planetstack/openstack_observer/steps/sync_slivers.py b/planetstack/openstack_observer/steps/sync_slivers.py
index 94fd0d5..8adb50c 100644
--- a/planetstack/openstack_observer/steps/sync_slivers.py
+++ b/planetstack/openstack_observer/steps/sync_slivers.py
@@ -4,8 +4,8 @@
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
 from core.models.sliver import Sliver
-from core.models.slice import Slice, SlicePrivilege, ControllerSlices
-from core.models.network import Network, NetworkSlice, ControllerNetworks
+from core.models.slice import Slice, SlicePrivilege, ControllerSlice
+from core.models.network import Network, NetworkSlice, ControllerNetwork
 from util.logger import Logger, logging
 from observer.ansible import *
 
@@ -45,7 +45,7 @@
 
         nics = []
         networks = [ns.network for ns in NetworkSlice.objects.filter(slice=sliver.slice)]
-        controller_networks = ControllerNetworks.objects.filter(network__in=networks,
+        controller_networks = ControllerNetwork.objects.filter(network__in=networks,
                                                                 controller=sliver.node.site_deployment.controller)
 
         for controller_network in controller_networks:
diff --git a/planetstack/openstack_observer/steps/sync_users.py b/planetstack/openstack_observer/steps/sync_users.py
index 3c69cad..4cb1a26 100644
--- a/planetstack/openstack_observer/steps/sync_users.py
+++ b/planetstack/openstack_observer/steps/sync_users.py
@@ -5,20 +5,20 @@
 from planetstack.config import Config
 from observer.openstacksyncstep import OpenStackSyncStep
 from core.models.user import User
-from core.models.controllerusers import  ControllerUsers
-from observer.steps.sync_controller_users import SyncControllerUsers
+from core.models.controllerusers import  ControllerUser
+from observer.steps.sync_controller_users import SyncControllerUser
 
 class SyncUsers(OpenStackSyncStep):
     provides=[User]
     requested_interval=0
 
     def sync_record(self, user):
-        for controller_user in ControllerUsers.objects.filter(user=user):
+        for controller_user in ControllerUser.objects.filter(user=user):
             # bump the 'updated' field so user account are updated across 
             # controllers.
             controller_user.save()
 
     def delete_record(self, user):
-        controller_user_deleter = SyncControllerUsers().delete_record
-        for controller_user in ControllerUsers.objects.filter(user=user):
+        controller_user_deleter = SyncControllerUser().delete_record
+        for controller_user in ControllerUser.objects.filter(user=user):
             controller_user_deleter(controller_user)
diff --git a/planetstack/planetstack-config.py b/planetstack/planetstack-config.py
old mode 100755
new mode 100644
diff --git a/planetstack/redhat/planetstack-backend.service b/planetstack/redhat/planetstack-backend.service
old mode 100755
new mode 100644
diff --git a/planetstack/scripts/opencloud b/planetstack/scripts/opencloud
old mode 100755
new mode 100644
diff --git a/planetstack/syndicate_observer/run.sh b/planetstack/syndicate_observer/run.sh
old mode 100755
new mode 100644
diff --git a/planetstack/syndicate_observer/start.sh b/planetstack/syndicate_observer/start.sh
old mode 100755
new mode 100644
diff --git a/planetstack/syndicate_observer/stop.sh b/planetstack/syndicate_observer/stop.sh
old mode 100755
new mode 100644
diff --git a/planetstack/syndicate_observer/syndicate-backend.py b/planetstack/syndicate_observer/syndicate-backend.py
old mode 100755
new mode 100644
diff --git a/planetstack/templates/admin/login.html b/planetstack/templates/admin/login.html
index a165707..293834c 100644
--- a/planetstack/templates/admin/login.html
+++ b/planetstack/templates/admin/login.html
@@ -25,7 +25,12 @@
 {% endif %}
 
 {% if form.non_field_errors or form.this_is_the_login_form.errors %}
-{% for error in form.non_field_errors|add:form.this_is_the_login_form.errors %}
+{% for error in form.non_field_errors %}
+<p class="errornote">
+    {{ error }}
+</p>
+{% endfor %}
+{% for error in form.this_is_the_login_form.errors %}
 <p class="errornote">
     {{ error }}
 </p>
diff --git a/planetstack/tools/diff-opencloud.py b/planetstack/tools/diff-opencloud.py
old mode 100755
new mode 100644
diff --git a/planetstack/tools/openstack-db-cleanup.sh b/planetstack/tools/openstack-db-cleanup.sh
old mode 100755
new mode 100644
diff --git a/planetstack/tools/openstack-healthcheck.py b/planetstack/tools/openstack-healthcheck.py
old mode 100755
new mode 100644
diff --git a/planetstack/tools/ssh-myslice b/planetstack/tools/ssh-myslice
old mode 100755
new mode 100644