CORD-1026: protos and xprotos for core models

Change-Id: I6240cc224860a1e2e86f76eb1e0599973b062116
diff --git a/xos/genx/generator/uber b/xos/genx/generator/uber
index b60071b..1587c4b 100755
--- a/xos/genx/generator/uber
+++ b/xos/genx/generator/uber
@@ -52,21 +52,29 @@
         current_buffer = []
         for l in lines:
             if (l.startswith('+++')):
-                filename = l[4:]
-                fil = open(filename,'w')
+                path = l[4:]
+                
+                direc,filename = path.rsplit('/',1)
+                os.system('mkdir -p %s'%direc)
+              
+                fil = open(path,'w')
                 buf = '\n'.join(current_buffer)
 
                 obuf = buf
+
+                """
                 for d in options.dict:
                     df = open(d).read()
                     d = json.loads(df)
 
                     pattern = re.compile(r'\b(' + '|'.join(d.keys()) + r')\b')
                     obuf = pattern.sub(lambda x: d[x.group()], buf)
+                """
+
                 fil.write(obuf)
                 fil.close()
 
-                print 'Written to file %s'%filename
+                print 'Written to file %s'%path
                 current_buffer = []
             else:
                 current_buffer.append(l)
diff --git a/xos/genx/protos/core/Slice.proto b/xos/genx/protos/core/Slice.proto
new file mode 100644
index 0000000..db788fe
--- /dev/null
+++ b/xos/genx/protos/core/Slice.proto
@@ -0,0 +1,20 @@
+
+message Slice {
+  required string name = 1 [ null = False,  max_length = 80,  content_type = "stripped",  blank = False,  help_text = "The Name of the Slice",  modifier = required,  db_index = False ];
+  required bool enabled = 2 [ null = False,  default = True,  blank = True,  help_text = "Status for this Slice",  modifier = required,  db_index = False ];
+  required bool omf_friendly = 3 [ db_index = False,  default = False,  modifier = required,  null = False,  blank = True ];
+  required string description = 4 [ null = False,  max_length = 1024,  blank = True,  help_text = "High level description of the slice and expected activities",  modifier = required,  db_index = False ];
+  required string slice_url = 5 [ null = False,  max_length = 512,  content_type = "url",  blank = True,  modifier = required,  db_index = False ];
+  required int32 site = 6 [ null = False,  blank = False,  help_text = "The Site this Slice belongs to",  model = Site,  modifier = required,  type = link,  port = slices,  db_index = True ];
+  required int32 max_instances = 7 [ db_index = False,  default = 10,  modifier = required,  null = False,  blank = False ];
+  optional int32 service = 8 [ null = True,  blank = True,  model = Service,  modifier = optional,  type = link,  port = slices,  db_index = True ];
+  optional string network = 9 [ null = True,  choices = "((None, 'Default'), ('host', 'Host'), ('bridged', 'Bridged'), ('noauto', 'No Automatic Networks'))",  max_length = 256,  blank = True,  modifier = optional,  db_index = False ];
+  optional string exposed_ports = 10 [ db_index = False,  max_length = 256,  modifier = optional,  null = True,  blank = True ];
+  optional int32 serviceClass = 11 [ null = True,  blank = True,  model = ServiceClass,  modifier = optional,  type = link,  port = slices,  db_index = True ];
+  optional int32 creator = 12 [ null = True,  blank = True,  model = User,  modifier = optional,  type = link,  port = slices,  db_index = True ];
+  optional int32 default_flavor = 13 [ null = True,  blank = True,  model = Flavor,  modifier = optional,  type = link,  port = slices,  db_index = True ];
+  optional int32 default_image = 14 [ null = True,  blank = True,  model = Image,  modifier = optional,  type = link,  port = slices,  db_index = True ];
+  optional int32 default_node = 15 [ null = True,  blank = True,  model = Node,  modifier = optional,  type = link,  port = slices,  db_index = True ];
+  optional string mount_data_sets = 16 [ null = True,  default = "GenBank",  max_length = 256,  content_type = "stripped",  blank = True,  modifier = optional,  db_index = False ];
+  required string default_isolation = 17 [ null = False,  default = "vm",  choices = "(('vm', 'Virtual Machine'), ('container', 'Container'), ('container_vm', 'Container In VM'))",  max_length = 30,  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/account.proto b/xos/genx/protos/core/account.proto
new file mode 100644
index 0000000..0a011be
--- /dev/null
+++ b/xos/genx/protos/core/account.proto
@@ -0,0 +1,4 @@
+
+message Account {
+  required int32 site = 1 [ null = False,  blank = False,  help_text = "Site for this account",  model = Site,  modifier = required,  type = link,  port = accounts,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/addresspool.proto b/xos/genx/protos/core/addresspool.proto
new file mode 100644
index 0000000..daf7f7c
--- /dev/null
+++ b/xos/genx/protos/core/addresspool.proto
@@ -0,0 +1,10 @@
+
+message AddressPool {
+  required string name = 1 [ db_index = False,  max_length = 32,  modifier = required,  null = False,  blank = False ];
+  optional string addresses = 2 [ db_index = False,  modifier = optional,  null = True,  blank = True ];
+  optional string gateway_ip = 3 [ db_index = False,  max_length = 32,  modifier = optional,  null = True,  blank = False ];
+  optional string gateway_mac = 4 [ db_index = False,  max_length = 32,  modifier = optional,  null = True,  blank = False ];
+  optional string cidr = 5 [ db_index = False,  max_length = 32,  modifier = optional,  null = True,  blank = False ];
+  optional string inuse = 6 [ db_index = False,  modifier = optional,  null = True,  blank = True ];
+  optional int32 service = 7 [ null = True,  blank = True,  model = Service,  modifier = optional,  type = link,  port = addresspools,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/controller.proto b/xos/genx/protos/core/controller.proto
new file mode 100644
index 0000000..fabf0c1
--- /dev/null
+++ b/xos/genx/protos/core/controller.proto
@@ -0,0 +1,15 @@
+
+message Controller {
+  required string name = 1 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "Name of the Controller",  modifier = required,  db_index = False ];
+  required string backend_type = 2 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "Type of compute controller, e.g. EC2, OpenStack, or OpenStack version",  modifier = required,  db_index = False ];
+  required string version = 3 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "Controller version",  modifier = required,  db_index = False ];
+  optional string auth_url = 4 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Auth url for the compute controller",  modifier = optional,  db_index = False ];
+  optional string admin_user = 5 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Username of an admin user at this controller",  modifier = optional,  db_index = False ];
+  optional string admin_password = 6 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Password of theadmin user at this controller",  modifier = optional,  db_index = False ];
+  optional string admin_tenant = 7 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Name of the tenant the admin user belongs to",  modifier = optional,  db_index = False ];
+  optional string domain = 8 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Name of the domain this controller belongs to",  modifier = optional,  db_index = False ];
+  optional string rabbit_host = 9 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "IP address of rabbitmq server at this controller",  modifier = optional,  db_index = False ];
+  optional string rabbit_user = 10 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Username of rabbitmq server at this controller",  modifier = optional,  db_index = False ];
+  optional string rabbit_password = 11 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Password of rabbitmq server at this controller",  modifier = optional,  db_index = False ];
+  required int32 deployment = 12 [ null = False,  blank = False,  model = Deployment,  modifier = required,  type = link,  port = controllerdeployments,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/controllerdashboardview.proto b/xos/genx/protos/core/controllerdashboardview.proto
new file mode 100644
index 0000000..6791403
--- /dev/null
+++ b/xos/genx/protos/core/controllerdashboardview.proto
@@ -0,0 +1,7 @@
+
+message ControllerDashboardView {
+  required int32 controller = 1 [ null = False,  blank = False,  model = Controller,  modifier = required,  type = link,  port = controllerdashboardviews,  db_index = True ];
+  required int32 dashboardView = 2 [ null = False,  blank = False,  model = DashboardView,  modifier = required,  type = link,  port = controllerdashboardviews,  db_index = True ];
+  required bool enabled = 3 [ db_index = False,  default = True,  modifier = required,  null = False,  blank = True ];
+  required string url = 4 [ null = False,  max_length = 1024,  content_type = "stripped",  blank = False,  help_text = "URL of Dashboard",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/controllerimages.proto b/xos/genx/protos/core/controllerimages.proto
new file mode 100644
index 0000000..6539604
--- /dev/null
+++ b/xos/genx/protos/core/controllerimages.proto
@@ -0,0 +1,6 @@
+
+message ControllerImages {
+  required int32 image = 1 [ null = False,  blank = False,  model = Image,  modifier = required,  type = link,  port = controllerimages,  db_index = True ];
+  required int32 controller = 2 [ null = False,  blank = False,  model = Controller,  modifier = required,  type = link,  port = controllerimages,  db_index = True ];
+  optional string glance_image_id = 3 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Glance image id",  modifier = optional,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/controllernetwork.proto b/xos/genx/protos/core/controllernetwork.proto
new file mode 100644
index 0000000..151659f
--- /dev/null
+++ b/xos/genx/protos/core/controllernetwork.proto
@@ -0,0 +1,13 @@
+
+message ControllerNetwork {
+  required int32 network = 1 [ null = False,  blank = False,  model = Network,  modifier = required,  type = link,  port = controllernetworks,  db_index = True ];
+  required int32 controller = 2 [ null = False,  blank = False,  model = Controller,  modifier = required,  type = link,  port = controllernetworks,  db_index = True ];
+  required string subnet = 3 [ db_index = False,  max_length = 32,  modifier = required,  null = False,  blank = True ];
+  required string start_ip = 4 [ db_index = False,  max_length = 32,  modifier = required,  null = False,  blank = True ];
+  required string stop_ip = 5 [ db_index = False,  max_length = 32,  modifier = required,  null = False,  blank = True ];
+  optional string net_id = 6 [ null = True,  max_length = 256,  blank = True,  help_text = "Neutron network",  modifier = optional,  db_index = False ];
+  optional string router_id = 7 [ null = True,  max_length = 256,  blank = True,  help_text = "Neutron router id",  modifier = optional,  db_index = False ];
+  optional string subnet_id = 8 [ null = True,  max_length = 256,  blank = True,  help_text = "Neutron subnet id",  modifier = optional,  db_index = False ];
+  optional string gateway = 9 [ db_index = False,  max_length = 32,  modifier = optional,  null = True,  blank = True ];
+  optional string segmentation_id = 10 [ db_index = False,  max_length = 32,  modifier = optional,  null = True,  blank = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/controllerrole.proto b/xos/genx/protos/core/controllerrole.proto
new file mode 100644
index 0000000..bd9bf13
--- /dev/null
+++ b/xos/genx/protos/core/controllerrole.proto
@@ -0,0 +1,4 @@
+
+message ControllerRole {
+  required string role = 1 [ null = False,  choices = "(('admin', 'Admin'),)",  max_length = 30,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/controllersite.proto b/xos/genx/protos/core/controllersite.proto
new file mode 100644
index 0000000..97f8ac3
--- /dev/null
+++ b/xos/genx/protos/core/controllersite.proto
@@ -0,0 +1,6 @@
+
+message ControllerSite {
+  required int32 site = 1 [ null = False,  blank = False,  model = Site,  modifier = required,  type = link,  port = controllersite,  db_index = True ];
+  optional int32 controller = 2 [ null = True,  blank = True,  model = Controller,  modifier = optional,  type = link,  port = controllersite,  db_index = True ];
+  optional string tenant_id = 3 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Keystone tenant id",  modifier = optional,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/controllersiteprivilege.proto b/xos/genx/protos/core/controllersiteprivilege.proto
new file mode 100644
index 0000000..6814fc7
--- /dev/null
+++ b/xos/genx/protos/core/controllersiteprivilege.proto
@@ -0,0 +1,6 @@
+
+message ControllerSitePrivilege {
+  required int32 controller = 1 [ null = False,  blank = False,  model = Controller,  modifier = required,  type = link,  port = controllersiteprivileges,  db_index = True ];
+  required int32 site_privilege = 2 [ null = False,  blank = False,  model = SitePrivilege,  modifier = required,  type = link,  port = controllersiteprivileges,  db_index = True ];
+  optional string role_id = 3 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Keystone id",  modifier = optional,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/controllerslice.proto b/xos/genx/protos/core/controllerslice.proto
new file mode 100644
index 0000000..16b7346
--- /dev/null
+++ b/xos/genx/protos/core/controllerslice.proto
@@ -0,0 +1,6 @@
+
+message ControllerSlice {
+  required int32 controller = 1 [ null = False,  blank = False,  model = Controller,  modifier = required,  type = link,  port = controllerslices,  db_index = True ];
+  required int32 slice = 2 [ null = False,  blank = False,  model = Slice,  modifier = required,  type = link,  port = controllerslices,  db_index = True ];
+  optional string tenant_id = 3 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Keystone tenant id",  modifier = optional,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/controllersliceprivilege.proto b/xos/genx/protos/core/controllersliceprivilege.proto
new file mode 100644
index 0000000..4dec7f2
--- /dev/null
+++ b/xos/genx/protos/core/controllersliceprivilege.proto
@@ -0,0 +1,6 @@
+
+message ControllerSlicePrivilege {
+  required int32 controller = 1 [ null = False,  blank = False,  model = Controller,  modifier = required,  type = link,  port = controllersliceprivileges,  db_index = True ];
+  required int32 slice_privilege = 2 [ null = False,  blank = False,  model = SlicePrivilege,  modifier = required,  type = link,  port = controllersliceprivileges,  db_index = True ];
+  optional string role_id = 3 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Keystone id",  modifier = optional,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/controlleruser.proto b/xos/genx/protos/core/controlleruser.proto
new file mode 100644
index 0000000..fdf4eca
--- /dev/null
+++ b/xos/genx/protos/core/controlleruser.proto
@@ -0,0 +1,6 @@
+
+message ControllerUser {
+  required int32 user = 1 [ null = False,  blank = False,  model = User,  modifier = required,  type = link,  port = controllerusers,  db_index = True ];
+  required int32 controller = 2 [ null = False,  blank = False,  model = Controller,  modifier = required,  type = link,  port = controllersusers,  db_index = True ];
+  optional string kuser_id = 3 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Keystone user id",  modifier = optional,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/dashboardview.proto b/xos/genx/protos/core/dashboardview.proto
new file mode 100644
index 0000000..097a31c
--- /dev/null
+++ b/xos/genx/protos/core/dashboardview.proto
@@ -0,0 +1,8 @@
+
+message DashboardView {
+  required string name = 1 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "Name of the View",  modifier = required,  db_index = False ];
+  required string url = 2 [ null = False,  max_length = 1024,  content_type = "stripped",  blank = False,  help_text = "URL of Dashboard",  modifier = required,  db_index = False ];
+  required bool enabled = 3 [ db_index = False,  default = True,  modifier = required,  null = False,  blank = True ];
+  required string icon = 4 [ null = False,  default = "default-icon.png",  max_length = 200,  blank = False,  help_text = "Icon for Dashboard",  modifier = required,  db_index = False ];
+  required string icon_active = 5 [ null = False,  default = "default-icon-active.png",  max_length = 200,  blank = False,  help_text = "Icon for active Dashboard",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/deployment.proto b/xos/genx/protos/core/deployment.proto
new file mode 100644
index 0000000..010c9c2
--- /dev/null
+++ b/xos/genx/protos/core/deployment.proto
@@ -0,0 +1,5 @@
+
+message Deployment {
+  required string name = 1 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "Name of the Deployment",  modifier = required,  db_index = False ];
+  required string accessControl = 2 [ null = False,  default = "allow all",  max_length = 200,  blank = False,  help_text = "Access control list that specifies which sites/users may use nodes in this deployment",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/deploymentprivilege.proto b/xos/genx/protos/core/deploymentprivilege.proto
new file mode 100644
index 0000000..9e030a5
--- /dev/null
+++ b/xos/genx/protos/core/deploymentprivilege.proto
@@ -0,0 +1,6 @@
+
+message DeploymentPrivilege {
+  required int32 user = 1 [ null = False,  blank = False,  model = User,  modifier = required,  type = link,  port = deploymentprivileges,  db_index = True ];
+  required int32 deployment = 2 [ null = False,  blank = False,  model = Deployment,  modifier = required,  type = link,  port = deploymentprivileges,  db_index = True ];
+  required int32 role = 3 [ null = False,  blank = False,  model = DeploymentRole,  modifier = required,  type = link,  port = deploymentprivileges,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/deploymentrole.proto b/xos/genx/protos/core/deploymentrole.proto
new file mode 100644
index 0000000..378f207
--- /dev/null
+++ b/xos/genx/protos/core/deploymentrole.proto
@@ -0,0 +1,4 @@
+
+message DeploymentRole {
+  required string role = 1 [ null = False,  choices = "(('admin', 'Admin'),)",  max_length = 30,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/diag.proto b/xos/genx/protos/core/diag.proto
new file mode 100644
index 0000000..4d829ab
--- /dev/null
+++ b/xos/genx/protos/core/diag.proto
@@ -0,0 +1,4 @@
+
+message Diag {
+  required string name = 1 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "Name of the synchronizer",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/flavor.proto b/xos/genx/protos/core/flavor.proto
new file mode 100644
index 0000000..9c8c16e
--- /dev/null
+++ b/xos/genx/protos/core/flavor.proto
@@ -0,0 +1,8 @@
+
+message Flavor {
+  required string name = 1 [ null = False,  max_length = 32,  content_type = "stripped",  blank = False,  help_text = "name of this flavor, as displayed to users",  modifier = required,  db_index = False ];
+  optional string description = 2 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  modifier = optional,  db_index = False ];
+  required string flavor = 3 [ null = False,  max_length = 32,  content_type = "stripped",  blank = False,  help_text = "flavor string used to configure deployments",  modifier = required,  db_index = False ];
+  required int32 order = 4 [ null = False,  default = 0,  blank = False,  help_text = "used to order flavors when displayed in a list",  modifier = required,  db_index = False ];
+  required bool default = 5 [ null = False,  default = False,  blank = True,  help_text = "make this a default flavor to use when creating new instances",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/image.proto b/xos/genx/protos/core/image.proto
new file mode 100644
index 0000000..b0e6b9e
--- /dev/null
+++ b/xos/genx/protos/core/image.proto
@@ -0,0 +1,9 @@
+
+message Image {
+  required string name = 1 [ null = False,  max_length = 256,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  required string kind = 2 [ null = False,  default = "vm",  choices = "(('vm', 'Virtual Machine'), ('container', 'Container'))",  max_length = 30,  blank = False,  modifier = required,  db_index = False ];
+  required string disk_format = 3 [ null = False,  max_length = 256,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  required string container_format = 4 [ null = False,  max_length = 256,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  optional string path = 5 [ null = True,  max_length = 256,  content_type = "stripped",  blank = True,  help_text = "Path to image on local disk",  modifier = optional,  db_index = False ];
+  optional string tag = 6 [ null = True,  max_length = 256,  content_type = "stripped",  blank = True,  help_text = "For Docker Images, tag of image",  modifier = optional,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/imagedeployments.proto b/xos/genx/protos/core/imagedeployments.proto
new file mode 100644
index 0000000..5cb9814
--- /dev/null
+++ b/xos/genx/protos/core/imagedeployments.proto
@@ -0,0 +1,5 @@
+
+message ImageDeployments {
+  required int32 image = 1 [ null = False,  blank = False,  model = Image,  modifier = required,  type = link,  port = imagedeployments,  db_index = True ];
+  required int32 deployment = 2 [ null = False,  blank = False,  model = Deployment,  modifier = required,  type = link,  port = imagedeployments,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/instance.proto b/xos/genx/protos/core/instance.proto
new file mode 100644
index 0000000..0c2f215
--- /dev/null
+++ b/xos/genx/protos/core/instance.proto
@@ -0,0 +1,19 @@
+
+message Instance {
+  optional string instance_id = 1 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Nova instance id",  modifier = optional,  db_index = False ];
+  optional string instance_uuid = 2 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "Nova instance uuid",  modifier = optional,  db_index = False ];
+  required string name = 3 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "Instance name",  modifier = required,  db_index = False ];
+  optional string instance_name = 4 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "OpenStack generated name",  modifier = optional,  db_index = False ];
+  optional string ip = 5 [ null = True,  max_length = 39,  content_type = "ip",  blank = True,  help_text = "Instance ip address",  modifier = optional,  db_index = False ];
+  required int32 image = 6 [ null = False,  blank = False,  model = Image,  modifier = required,  type = link,  port = instances,  db_index = True ];
+  optional int32 creator = 7 [ null = True,  blank = True,  model = User,  modifier = optional,  type = link,  port = instances,  db_index = True ];
+  required int32 slice = 8 [ null = False,  blank = False,  model = Slice,  modifier = required,  type = link,  port = instances,  db_index = True ];
+  required int32 deployment = 9 [ null = False,  blank = False,  model = Deployment,  modifier = required,  type = link,  port = instance_deployment,  db_index = True ];
+  required int32 node = 10 [ null = False,  blank = False,  model = Node,  modifier = required,  type = link,  port = instances,  db_index = True ];
+  required int32 numberCores = 11 [ null = False,  default = 0,  blank = False,  help_text = "Number of cores for instance",  modifier = required,  db_index = False ];
+  required int32 flavor = 12 [ null = False,  default = "get_default_flavor()",  blank = False,  help_text = "Flavor of this instance",  model = Flavor,  modifier = required,  type = link,  port = instance,  db_index = True ];
+  optional string userData = 13 [ db_index = False,  help_text = "user_data passed to instance during creation",  modifier = optional,  null = True,  blank = True ];
+  required string isolation = 14 [ null = False,  default = "vm",  choices = "(('vm', 'Virtual Machine'), ('container', 'Container'), ('container_vm', 'Container In VM'))",  max_length = 30,  blank = False,  modifier = required,  db_index = False ];
+  optional string volumes = 15 [ db_index = False,  help_text = "Comma-separated list of directories to expose to parent context",  modifier = optional,  null = True,  blank = True ];
+  optional int32 parent = 16 [ null = True,  blank = True,  help_text = "Parent Instance for containers nested inside of VMs",  model = Instance,  modifier = optional,  type = link,  port = instance,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/invoice.proto b/xos/genx/protos/core/invoice.proto
new file mode 100644
index 0000000..9a10717
--- /dev/null
+++ b/xos/genx/protos/core/invoice.proto
@@ -0,0 +1,5 @@
+
+message Invoice {
+  required string date = 1 [ db_index = False,  modifier = required,  null = False,  content_type = "date",  blank = False ];
+  required int32 account = 2 [ null = False,  blank = False,  model = Account,  modifier = required,  type = link,  port = invoices,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/library.proto b/xos/genx/protos/core/library.proto
new file mode 100644
index 0000000..67ed5c0
--- /dev/null
+++ b/xos/genx/protos/core/library.proto
@@ -0,0 +1,9 @@
+
+message Library {
+  required int32 xos = 1 [ null = False,  default = "get_xos()",  blank = False,  help_text = "Pointer to XOS",  model = XOS,  modifier = required,  type = link,  port = loadable_modules,  db_index = True ];
+  required string name = 2 [ null = False,  max_length = 30,  content_type = "stripped",  blank = False,  help_text = "Service Name",  modifier = required,  db_index = False ];
+  optional string base_url = 3 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  help_text = "Base URL, allows use of relative URLs for resources",  modifier = optional,  db_index = False ];
+  optional string version = 4 [ null = True,  default = "1.0.0",  max_length = 30,  content_type = "stripped",  blank = True,  help_text = "Version of Service Controller",  modifier = optional,  db_index = False ];
+  optional string provides = 5 [ null = True,  max_length = 254,  content_type = "stripped",  blank = True,  help_text = "Comma-separated list of things provided",  modifier = optional,  db_index = False ];
+  optional string requires = 6 [ null = True,  max_length = 254,  content_type = "stripped",  blank = True,  help_text = "Comma-separated list of required Service Controllers",  modifier = optional,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/loadablemodule.proto b/xos/genx/protos/core/loadablemodule.proto
new file mode 100644
index 0000000..892035f
--- /dev/null
+++ b/xos/genx/protos/core/loadablemodule.proto
@@ -0,0 +1,9 @@
+
+message LoadableModule {
+  required int32 xos = 1 [ null = False,  default = "get_xos()",  blank = False,  help_text = "Pointer to XOS",  model = XOS,  modifier = required,  type = link,  port = loadable_modules,  db_index = True ];
+  required string name = 2 [ null = False,  max_length = 30,  content_type = "stripped",  blank = False,  help_text = "Service Name",  modifier = required,  db_index = False ];
+  optional string base_url = 3 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  help_text = "Base URL, allows use of relative URLs for resources",  modifier = optional,  db_index = False ];
+  optional string version = 4 [ null = True,  default = "1.0.0",  max_length = 30,  content_type = "stripped",  blank = True,  help_text = "Version of Service Controller",  modifier = optional,  db_index = False ];
+  optional string provides = 5 [ null = True,  max_length = 254,  content_type = "stripped",  blank = True,  help_text = "Comma-separated list of things provided",  modifier = optional,  db_index = False ];
+  optional string requires = 6 [ null = True,  max_length = 254,  content_type = "stripped",  blank = True,  help_text = "Comma-separated list of required Service Controllers",  modifier = optional,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/loadablemoduleresource.proto b/xos/genx/protos/core/loadablemoduleresource.proto
new file mode 100644
index 0000000..ccef647
--- /dev/null
+++ b/xos/genx/protos/core/loadablemoduleresource.proto
@@ -0,0 +1,9 @@
+
+message LoadableModuleResource {
+  required int32 loadable_module = 1 [ null = False,  blank = False,  help_text = "The Loadable Module this resource is associated with",  model = LoadableModule,  modifier = required,  type = link,  port = loadable_module_resources,  db_index = True ];
+  required string name = 2 [ null = False,  max_length = 30,  content_type = "stripped",  blank = False,  help_text = "Object Name",  modifier = required,  db_index = False ];
+  optional string subdirectory = 3 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  help_text = "optional subdirectory",  modifier = optional,  db_index = False ];
+  required string kind = 4 [ null = False,  choices = "(('models', 'Models'), ('admin', 'Admin'), ('admin_template', 'Admin Template'), ('django_library', 'Django Library'), ('synchronizer', 'Synchronizer'), ('rest_service', 'REST API (service)'), ('rest_tenant', 'REST API (tenant)'), ('tosca_custom_types', 'Tosca Custom Types'), ('tosca_resource', 'Tosca Resource'), ('private_key', 'Private Key'), ('public_key', 'Public Key'), ('vendor_js', 'Vendor Javascript'))",  max_length = 30,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  required string format = 5 [ null = False,  choices = "(('python', 'Python'), ('manifest', 'Manifest'), ('docker', 'Docker Container'), ('yaml', 'YAML'), ('raw', 'raw'), ('javascript', 'Javascript'))",  max_length = 30,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  optional string url = 6 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  help_text = "URL of resource",  modifier = optional,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/network.proto b/xos/genx/protos/core/network.proto
new file mode 100644
index 0000000..facb4bd
--- /dev/null
+++ b/xos/genx/protos/core/network.proto
@@ -0,0 +1,20 @@
+
+message Network {
+  required string name = 1 [ db_index = False,  max_length = 32,  modifier = required,  null = False,  blank = False ];
+  required int32 template = 2 [ null = False,  blank = False,  model = NetworkTemplate,  modifier = required,  type = link,  port = network,  db_index = True ];
+  required string subnet = 3 [ db_index = False,  max_length = 32,  modifier = required,  null = False,  blank = True ];
+  required string start_ip = 4 [ db_index = False,  max_length = 32,  modifier = required,  null = False,  blank = True ];
+  required string end_ip = 5 [ db_index = False,  max_length = 32,  modifier = required,  null = False,  blank = True ];
+  optional string ports = 6 [ db_index = False,  max_length = 1024,  modifier = optional,  null = True,  blank = True ];
+  optional string labels = 7 [ db_index = False,  max_length = 1024,  modifier = optional,  null = True,  blank = True ];
+  required int32 owner = 8 [ null = False,  blank = False,  help_text = "Slice that owns control of this Network",  model = Slice,  modifier = required,  type = link,  port = ownedNetworks,  db_index = True ];
+  required int32 guaranteed_bandwidth = 9 [ db_index = False,  default = 0,  modifier = required,  null = False,  blank = False ];
+  required bool permit_all_slices = 10 [ db_index = False,  default = False,  modifier = required,  null = False,  blank = True ];
+  optional string topology_parameters = 11 [ db_index = False,  modifier = optional,  null = True,  blank = True ];
+  optional string controller_url = 12 [ db_index = False,  max_length = 1024,  modifier = optional,  null = True,  blank = True ];
+  optional string controller_parameters = 13 [ db_index = False,  modifier = optional,  null = True,  blank = True ];
+  optional string network_id = 14 [ null = True,  max_length = 256,  blank = True,  help_text = "Quantum network",  modifier = optional,  db_index = False ];
+  optional string router_id = 15 [ null = True,  max_length = 256,  blank = True,  help_text = "Quantum router id",  modifier = optional,  db_index = False ];
+  optional string subnet_id = 16 [ null = True,  max_length = 256,  blank = True,  help_text = "Quantum subnet id",  modifier = optional,  db_index = False ];
+  required bool autoconnect = 17 [ null = False,  default = True,  blank = True,  help_text = "This network can be autoconnected to the slice that owns it",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/networkparameter.proto b/xos/genx/protos/core/networkparameter.proto
new file mode 100644
index 0000000..9394e75
--- /dev/null
+++ b/xos/genx/protos/core/networkparameter.proto
@@ -0,0 +1,7 @@
+
+message NetworkParameter {
+  required int32 parameter = 1 [ null = False,  blank = False,  help_text = "The type of the parameter",  model = NetworkParameterType,  modifier = required,  type = link,  port = networkparameters,  db_index = True ];
+  required string value = 2 [ null = False,  max_length = 1024,  blank = False,  help_text = "The value of this parameter",  modifier = required,  db_index = False ];
+  required int32 content_type = 3 [ null = False,  blank = False,  model = ContentType,  modifier = required,  type = link,  port = networkparameter,  db_index = True ];
+  required uint32 object_id = 4 [ db_index = False,  modifier = required,  null = False,  blank = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/networkparametertype.proto b/xos/genx/protos/core/networkparametertype.proto
new file mode 100644
index 0000000..2f9e87b
--- /dev/null
+++ b/xos/genx/protos/core/networkparametertype.proto
@@ -0,0 +1,5 @@
+
+message NetworkParameterType {
+  required string name = 1 [ null = False,  max_length = 128,  blank = False,  help_text = "The name of this parameter",  modifier = required,  db_index = True ];
+  required string description = 2 [ db_index = False,  max_length = 1024,  modifier = required,  null = False,  blank = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/networkslice.proto b/xos/genx/protos/core/networkslice.proto
new file mode 100644
index 0000000..fb697a7
--- /dev/null
+++ b/xos/genx/protos/core/networkslice.proto
@@ -0,0 +1,5 @@
+
+message NetworkSlice {
+  required int32 network = 1 [ null = False,  blank = False,  model = Network,  modifier = required,  type = link,  port = networkslices,  db_index = True ];
+  required int32 slice = 2 [ null = False,  blank = False,  model = Slice,  modifier = required,  type = link,  port = networkslices,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/networktemplate.proto b/xos/genx/protos/core/networktemplate.proto
new file mode 100644
index 0000000..44eaddd
--- /dev/null
+++ b/xos/genx/protos/core/networktemplate.proto
@@ -0,0 +1,14 @@
+
+message NetworkTemplate {
+  required string name = 1 [ db_index = False,  max_length = 32,  modifier = required,  null = False,  blank = False ];
+  optional string description = 2 [ db_index = False,  max_length = 1024,  modifier = optional,  null = True,  blank = True ];
+  required int32 guaranteed_bandwidth = 3 [ db_index = False,  default = 0,  modifier = required,  null = False,  blank = False ];
+  required string visibility = 4 [ null = False,  default = "private",  choices = "(('public', 'public'), ('private', 'private'))",  max_length = 30,  blank = False,  modifier = required,  db_index = False ];
+  required string translation = 5 [ null = False,  default = "none",  choices = "(('none', 'none'), ('NAT', 'NAT'))",  max_length = 30,  blank = False,  modifier = required,  db_index = False ];
+  optional string access = 6 [ null = True,  choices = "((None, 'None'), ('indirect', 'Indirect'), ('direct', 'Direct'))",  max_length = 30,  blank = True,  help_text = "Advertise this network as a means for other slices to contact this slice",  modifier = optional,  db_index = False ];
+  optional string shared_network_name = 7 [ db_index = False,  max_length = 30,  modifier = optional,  null = True,  blank = True ];
+  optional string shared_network_id = 8 [ null = True,  max_length = 256,  blank = True,  help_text = "Quantum network",  modifier = optional,  db_index = False ];
+  required string topology_kind = 9 [ null = False,  default = "bigswitch",  choices = "(('bigswitch', 'BigSwitch'), ('physical', 'Physical'), ('custom', 'Custom'))",  max_length = 30,  blank = False,  modifier = required,  db_index = False ];
+  optional string controller_kind = 10 [ null = True,  choices = "((None, 'None'), ('onos', 'ONOS'), ('custom', 'Custom'))",  max_length = 30,  blank = True,  modifier = optional,  db_index = False ];
+  optional string vtn_kind = 11 [ null = True,  default = "PRIVATE",  choices = "(('PRIVATE', 'Private'), ('PUBLIC', 'Public'), ('MANAGEMENT_LOCAL', 'Management Local'), ('MANAGEMENT_HOST', 'Management Host'), ('VSG', 'VSG'), ('ACCESS_AGENT', 'Access Agent'))",  max_length = 30,  blank = True,  modifier = optional,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/node.proto b/xos/genx/protos/core/node.proto
new file mode 100644
index 0000000..9db6515
--- /dev/null
+++ b/xos/genx/protos/core/node.proto
@@ -0,0 +1,6 @@
+
+message Node {
+  required string name = 1 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "Name of the Node",  modifier = required,  db_index = False ];
+  required int32 site_deployment = 2 [ null = False,  blank = False,  model = SiteDeployment,  modifier = required,  type = link,  port = nodes,  db_index = True ];
+  optional int32 site = 3 [ null = True,  blank = True,  model = Site,  modifier = optional,  type = link,  port = nodes,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/nodelabel.proto b/xos/genx/protos/core/nodelabel.proto
new file mode 100644
index 0000000..4fdaa76
--- /dev/null
+++ b/xos/genx/protos/core/nodelabel.proto
@@ -0,0 +1,4 @@
+
+message NodeLabel {
+  required string name = 1 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "label name",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/port.proto b/xos/genx/protos/core/port.proto
new file mode 100644
index 0000000..b3a84b9
--- /dev/null
+++ b/xos/genx/protos/core/port.proto
@@ -0,0 +1,9 @@
+
+message Port {
+  required int32 network = 1 [ null = False,  blank = False,  model = Network,  modifier = required,  type = link,  port = links,  db_index = True ];
+  optional int32 instance = 2 [ null = True,  blank = True,  model = Instance,  modifier = optional,  type = link,  port = ports,  db_index = True ];
+  optional string ip = 3 [ null = True,  max_length = 39,  content_type = "ip",  blank = True,  help_text = "Instance ip address",  modifier = optional,  db_index = False ];
+  optional string port_id = 4 [ null = True,  max_length = 256,  blank = True,  help_text = "Neutron port id",  modifier = optional,  db_index = False ];
+  optional string mac = 5 [ null = True,  max_length = 256,  blank = True,  help_text = "MAC address associated with this port",  modifier = optional,  db_index = False ];
+  required bool xos_created = 6 [ db_index = False,  default = False,  modifier = required,  null = False,  blank = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/program.proto b/xos/genx/protos/core/program.proto
new file mode 100644
index 0000000..4f685fc
--- /dev/null
+++ b/xos/genx/protos/core/program.proto
@@ -0,0 +1,12 @@
+
+message Program {
+  required string name = 1 [ null = False,  max_length = 30,  content_type = "stripped",  blank = False,  help_text = "Service Name",  modifier = required,  db_index = False ];
+  optional string description = 2 [ null = True,  max_length = 254,  blank = True,  help_text = "Description of Service",  modifier = optional,  db_index = False ];
+  required string kind = 3 [ null = False,  choices = "(('tosca', 'Tosca'),)",  max_length = 30,  content_type = "stripped",  blank = False,  help_text = "Kind of service",  modifier = required,  db_index = False ];
+  optional string command = 4 [ null = True,  choices = "(('run', 'Run'), ('destroy', 'Destroy'))",  max_length = 30,  content_type = "stripped",  blank = True,  help_text = "Command to run",  modifier = optional,  db_index = False ];
+  optional int32 owner = 5 [ null = True,  blank = False,  model = User,  modifier = optional,  type = link,  port = programs,  db_index = True ];
+  optional string contents = 6 [ db_index = False,  help_text = "Contents of Program",  modifier = optional,  null = True,  blank = True ];
+  optional string output = 7 [ db_index = False,  help_text = "Output of Program",  modifier = optional,  null = True,  blank = True ];
+  optional string messages = 8 [ db_index = False,  help_text = "Debug messages",  modifier = optional,  null = True,  blank = True ];
+  optional string status = 9 [ null = True,  max_length = 30,  blank = True,  help_text = "Status of program",  modifier = optional,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/project.proto b/xos/genx/protos/core/project.proto
new file mode 100644
index 0000000..b803895
--- /dev/null
+++ b/xos/genx/protos/core/project.proto
@@ -0,0 +1,4 @@
+
+message Project {
+  required string name = 1 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "Name of Project",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/reservation.proto b/xos/genx/protos/core/reservation.proto
new file mode 100644
index 0000000..8cc18d0
--- /dev/null
+++ b/xos/genx/protos/core/reservation.proto
@@ -0,0 +1,6 @@
+
+message Reservation {
+  required string startTime = 1 [ db_index = False,  modifier = required,  null = False,  content_type = "date",  blank = False ];
+  required int32 slice = 2 [ null = False,  blank = False,  model = Slice,  modifier = required,  type = link,  port = reservations,  db_index = True ];
+  required int32 duration = 3 [ db_index = False,  default = 1,  modifier = required,  null = False,  blank = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/reservedresource.proto b/xos/genx/protos/core/reservedresource.proto
new file mode 100644
index 0000000..33bcf08
--- /dev/null
+++ b/xos/genx/protos/core/reservedresource.proto
@@ -0,0 +1,7 @@
+
+message ReservedResource {
+  required int32 instance = 1 [ null = False,  blank = False,  model = Instance,  modifier = required,  type = link,  port = reservedresources,  db_index = True ];
+  required int32 resource = 2 [ null = False,  blank = False,  model = ServiceResource,  modifier = required,  type = link,  port = reservedresources,  db_index = True ];
+  required int32 quantity = 3 [ db_index = False,  default = 1,  modifier = required,  null = False,  blank = False ];
+  required int32 reservationSet = 4 [ null = False,  blank = False,  model = Reservation,  modifier = required,  type = link,  port = reservedresources,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/role.proto b/xos/genx/protos/core/role.proto
new file mode 100644
index 0000000..ae3539a
--- /dev/null
+++ b/xos/genx/protos/core/role.proto
@@ -0,0 +1,7 @@
+
+message Role {
+  required string role_type = 1 [ null = False,  max_length = 80,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  optional string role = 2 [ null = True,  max_length = 80,  content_type = "stripped",  blank = True,  modifier = optional,  db_index = False ];
+  required string description = 3 [ null = False,  max_length = 120,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  required int32 content_type = 4 [ null = False,  blank = False,  model = ContentType,  modifier = required,  type = link,  port = role,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/router.proto b/xos/genx/protos/core/router.proto
new file mode 100644
index 0000000..8e93565
--- /dev/null
+++ b/xos/genx/protos/core/router.proto
@@ -0,0 +1,5 @@
+
+message Router {
+  required string name = 1 [ db_index = False,  max_length = 32,  modifier = required,  null = False,  blank = False ];
+  required int32 owner = 2 [ null = False,  blank = False,  model = Slice,  modifier = required,  type = link,  port = routers,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/service.proto b/xos/genx/protos/core/service.proto
new file mode 100644
index 0000000..b20e9b1
--- /dev/null
+++ b/xos/genx/protos/core/service.proto
@@ -0,0 +1,16 @@
+
+message Service {
+  optional string description = 1 [ null = True,  max_length = 254,  blank = True,  help_text = "Description of Service",  modifier = optional,  db_index = False ];
+  required bool enabled = 2 [ db_index = False,  default = True,  modifier = required,  null = False,  blank = True ];
+  required string kind = 3 [ null = False,  default = "generic",  max_length = 30,  content_type = "stripped",  blank = False,  help_text = "Kind of service",  modifier = required,  db_index = False ];
+  required string name = 4 [ null = False,  max_length = 30,  content_type = "stripped",  blank = False,  help_text = "Service Name",  modifier = required,  db_index = False ];
+  optional string versionNumber = 5 [ null = True,  max_length = 30,  content_type = "stripped",  blank = True,  help_text = "Version of Service Definition",  modifier = optional,  db_index = False ];
+  required bool published = 6 [ db_index = False,  default = True,  modifier = required,  null = False,  blank = True ];
+  optional string view_url = 7 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  modifier = optional,  db_index = False ];
+  optional string icon_url = 8 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  modifier = optional,  db_index = False ];
+  optional string public_key = 9 [ null = True,  max_length = 1024,  blank = True,  help_text = "Public key string",  modifier = optional,  db_index = False ];
+  optional string private_key_fn = 10 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  modifier = optional,  db_index = False ];
+  optional string service_specific_id = 11 [ null = True,  max_length = 30,  content_type = "stripped",  blank = True,  modifier = optional,  db_index = False ];
+  optional string service_specific_attribute = 12 [ db_index = False,  modifier = optional,  null = True,  blank = True ];
+  optional int32 controller = 13 [ null = True,  blank = True,  help_text = "The Service Controller this Service uses",  model = ServiceController,  modifier = optional,  type = link,  port = services,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/serviceattribute.proto b/xos/genx/protos/core/serviceattribute.proto
new file mode 100644
index 0000000..097e365
--- /dev/null
+++ b/xos/genx/protos/core/serviceattribute.proto
@@ -0,0 +1,6 @@
+
+message ServiceAttribute {
+  required string name = 1 [ null = False,  max_length = 128,  blank = False,  help_text = "Attribute Name",  modifier = required,  db_index = False ];
+  required string value = 2 [ db_index = False,  help_text = "Attribute Value",  modifier = required,  null = False,  blank = False ];
+  required int32 service = 3 [ null = False,  blank = False,  help_text = "The Service this attribute is associated with",  model = Service,  modifier = required,  type = link,  port = serviceattributes,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/serviceclass.proto b/xos/genx/protos/core/serviceclass.proto
new file mode 100644
index 0000000..0061c37
--- /dev/null
+++ b/xos/genx/protos/core/serviceclass.proto
@@ -0,0 +1,9 @@
+
+message ServiceClass {
+  required string name = 1 [ null = False,  max_length = 32,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  required string description = 2 [ null = False,  max_length = 255,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  required int32 commitment = 3 [ db_index = False,  default = 365,  modifier = required,  null = False,  blank = False ];
+  required int32 membershipFee = 4 [ db_index = False,  default = 0,  modifier = required,  null = False,  blank = False ];
+  required int32 membershipFeeMonths = 5 [ db_index = False,  default = 12,  modifier = required,  null = False,  blank = False ];
+  required bool upgradeRequiresApproval = 6 [ db_index = False,  default = False,  modifier = required,  null = False,  blank = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/servicecontroller.proto b/xos/genx/protos/core/servicecontroller.proto
new file mode 100644
index 0000000..4070c1e
--- /dev/null
+++ b/xos/genx/protos/core/servicecontroller.proto
@@ -0,0 +1,15 @@
+
+message ServiceController {
+  required int32 xos = 1 [ null = False,  default = "get_xos()",  blank = False,  help_text = "Pointer to XOS",  model = XOS,  modifier = required,  type = link,  port = loadable_modules,  db_index = True ];
+  required string name = 2 [ null = False,  max_length = 30,  content_type = "stripped",  blank = False,  help_text = "Service Name",  modifier = required,  db_index = False ];
+  optional string base_url = 3 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  help_text = "Base URL, allows use of relative URLs for resources",  modifier = optional,  db_index = False ];
+  optional string version = 4 [ null = True,  default = "1.0.0",  max_length = 30,  content_type = "stripped",  blank = True,  help_text = "Version of Service Controller",  modifier = optional,  db_index = False ];
+  optional string provides = 5 [ null = True,  max_length = 254,  content_type = "stripped",  blank = True,  help_text = "Comma-separated list of things provided",  modifier = optional,  db_index = False ];
+  optional string requires = 6 [ null = True,  max_length = 254,  content_type = "stripped",  blank = True,  help_text = "Comma-separated list of required Service Controllers",  modifier = optional,  db_index = False ];
+  optional string synchronizer_run = 7 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  help_text = "synchronizer run command",  modifier = optional,  db_index = False ];
+  optional string synchronizer_config = 8 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  help_text = "synchronizer config file",  modifier = optional,  db_index = False ];
+  optional string image = 9 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "docker image name",  modifier = optional,  db_index = False ];
+  required bool no_start = 10 [ null = False,  default = False,  blank = True,  help_text = "Do not start the Synchronizer",  modifier = required,  db_index = False ];
+  required bool no_build = 11 [ null = False,  default = False,  blank = True,  help_text = "Do not build the Synchronizer container",  modifier = required,  db_index = False ];
+  required bool no_deploy = 12 [ null = False,  default = False,  blank = True,  help_text = "Do not add synchronizer container to onboarding-docker-compose",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/servicedependency.proto b/xos/genx/protos/core/servicedependency.proto
new file mode 100644
index 0000000..97c0c89
--- /dev/null
+++ b/xos/genx/protos/core/servicedependency.proto
@@ -0,0 +1,14 @@
+
+message ServiceDependency {
+  optional string name = 1 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  modifier = optional,  db_index = False ];
+  required string kind = 2 [ null = False,  default = "generic",  max_length = 30,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  required int32 provider_service = 3 [ null = False,  blank = False,  model = Service,  modifier = required,  type = link,  port = provided_tenants,  db_index = True ];
+  optional int32 subscriber_service = 4 [ null = True,  blank = True,  model = Service,  modifier = optional,  type = link,  port = subscribed_tenants,  db_index = True ];
+  optional int32 subscriber_tenant = 5 [ null = True,  blank = True,  model = Tenant,  modifier = optional,  type = link,  port = subscribed_tenants,  db_index = True ];
+  optional int32 subscriber_user = 6 [ null = True,  blank = True,  model = User,  modifier = optional,  type = link,  port = subscribed_tenants,  db_index = True ];
+  optional int32 subscriber_root = 7 [ null = True,  blank = True,  model = TenantRoot,  modifier = optional,  type = link,  port = subscribed_tenants,  db_index = True ];
+  optional int32 subscriber_network = 8 [ null = True,  blank = True,  model = Network,  modifier = optional,  type = link,  port = subscribed_tenants,  db_index = True ];
+  optional string service_specific_id = 9 [ null = True,  max_length = 30,  content_type = "stripped",  blank = True,  modifier = optional,  db_index = False ];
+  optional string service_specific_attribute = 10 [ db_index = False,  modifier = optional,  null = True,  blank = True ];
+  required string connect_method = 11 [ null = False,  default = "na",  choices = "(('public', 'Public'), ('private', 'Private'), ('private-unidirectional', 'Private Unidirectional'), ('na', 'Not Applicable'))",  max_length = 30,  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/servicemonitoringagentinfo.proto b/xos/genx/protos/core/servicemonitoringagentinfo.proto
new file mode 100644
index 0000000..9fbe098
--- /dev/null
+++ b/xos/genx/protos/core/servicemonitoringagentinfo.proto
@@ -0,0 +1,6 @@
+
+message ServiceMonitoringAgentInfo {
+  required string name = 1 [ null = False,  max_length = 128,  blank = False,  help_text = "Monitoring Agent Name",  modifier = required,  db_index = False ];
+  optional int32 service = 2 [ null = True,  blank = True,  help_text = "The Service this attribute is associated with",  model = Service,  modifier = optional,  type = link,  port = servicemonitoringagents,  db_index = True ];
+  required string target_uri = 3 [ db_index = False,  help_text = "Monitoring collector URI to be used by agents to publish the data",  modifier = required,  null = False,  blank = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/serviceprivilege.proto b/xos/genx/protos/core/serviceprivilege.proto
new file mode 100644
index 0000000..08dba9c
--- /dev/null
+++ b/xos/genx/protos/core/serviceprivilege.proto
@@ -0,0 +1,6 @@
+
+message ServicePrivilege {
+  required int32 user = 1 [ null = False,  blank = False,  model = User,  modifier = required,  type = link,  port = serviceprivileges,  db_index = True ];
+  required int32 service = 2 [ null = False,  blank = False,  model = Service,  modifier = required,  type = link,  port = serviceprivileges,  db_index = True ];
+  required int32 role = 3 [ null = False,  blank = False,  model = ServiceRole,  modifier = required,  type = link,  port = serviceprivileges,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/serviceresource.proto b/xos/genx/protos/core/serviceresource.proto
new file mode 100644
index 0000000..bf72a56
--- /dev/null
+++ b/xos/genx/protos/core/serviceresource.proto
@@ -0,0 +1,12 @@
+
+message ServiceResource {
+  required int32 serviceClass = 1 [ null = False,  blank = False,  model = ServiceClass,  modifier = required,  type = link,  port = serviceresources,  db_index = True ];
+  required string name = 2 [ null = False,  max_length = 32,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  required int32 maxUnitsDeployment = 3 [ db_index = False,  default = 1,  modifier = required,  null = False,  blank = False ];
+  required int32 maxUnitsNode = 4 [ db_index = False,  default = 1,  modifier = required,  null = False,  blank = False ];
+  required int32 maxDuration = 5 [ db_index = False,  default = 1,  modifier = required,  null = False,  blank = False ];
+  required int32 bucketInRate = 6 [ db_index = False,  default = 0,  modifier = required,  null = False,  blank = False ];
+  required int32 bucketMaxSize = 7 [ db_index = False,  default = 0,  modifier = required,  null = False,  blank = False ];
+  required int32 cost = 8 [ db_index = False,  default = 0,  modifier = required,  null = False,  blank = False ];
+  required bool calendarReservable = 9 [ db_index = False,  default = True,  modifier = required,  null = False,  blank = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/servicerole.proto b/xos/genx/protos/core/servicerole.proto
new file mode 100644
index 0000000..0ed7c7e
--- /dev/null
+++ b/xos/genx/protos/core/servicerole.proto
@@ -0,0 +1,4 @@
+
+message ServiceRole {
+  required string role = 1 [ null = False,  choices = "(('admin', 'Admin'),)",  max_length = 30,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/site.proto b/xos/genx/protos/core/site.proto
new file mode 100644
index 0000000..7583135
--- /dev/null
+++ b/xos/genx/protos/core/site.proto
@@ -0,0 +1,13 @@
+
+message Site {
+  required string name = 1 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "Name for this Site",  modifier = required,  db_index = False ];
+  optional string site_url = 2 [ null = True,  max_length = 512,  content_type = "url",  blank = True,  help_text = "Site's Home URL Page",  modifier = optional,  db_index = False ];
+  required bool enabled = 3 [ null = False,  default = True,  blank = True,  help_text = "Status for this Site",  modifier = required,  db_index = False ];
+  required bool hosts_nodes = 4 [ null = False,  default = True,  blank = True,  help_text = "Indicates whether or not the site host nodes",  modifier = required,  db_index = False ];
+  required bool hosts_users = 5 [ null = False,  default = True,  blank = True,  help_text = "Indicates whether or not the site manages user accounts",  modifier = required,  db_index = False ];
+  optional float longitude = 6 [ db_index = False,  modifier = optional,  null = True,  blank = True ];
+  optional float latitude = 7 [ db_index = False,  modifier = optional,  null = True,  blank = True ];
+  required string login_base = 8 [ null = False,  max_length = 50,  content_type = "stripped",  blank = False,  help_text = "Prefix for Slices associated with this Site",  modifier = required,  db_index = False ];
+  required bool is_public = 9 [ null = False,  default = True,  blank = True,  help_text = "Indicates the visibility of this site to other members",  modifier = required,  db_index = False ];
+  required string abbreviated_name = 10 [ null = False,  max_length = 80,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/sitecredential.proto b/xos/genx/protos/core/sitecredential.proto
new file mode 100644
index 0000000..a23858e
--- /dev/null
+++ b/xos/genx/protos/core/sitecredential.proto
@@ -0,0 +1,7 @@
+
+message SiteCredential {
+  required int32 site = 1 [ null = False,  blank = False,  help_text = "The User this credential is associated with",  model = Site,  modifier = required,  type = link,  port = sitecredentials,  db_index = True ];
+  required string name = 2 [ null = False,  max_length = 128,  blank = False,  help_text = "The credential type, e.g. ec2",  modifier = required,  db_index = True ];
+  required string key_id = 3 [ null = False,  max_length = 1024,  content_type = "stripped",  blank = False,  help_text = "The backend id of this credential",  modifier = required,  db_index = False ];
+  required string enc_value = 4 [ null = False,  max_length = 1024,  blank = False,  help_text = "The key value of this credential",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/sitedeployment.proto b/xos/genx/protos/core/sitedeployment.proto
new file mode 100644
index 0000000..8bbdb9c
--- /dev/null
+++ b/xos/genx/protos/core/sitedeployment.proto
@@ -0,0 +1,7 @@
+
+message SiteDeployment {
+  required int32 site = 1 [ null = False,  blank = False,  model = Site,  modifier = required,  type = link,  port = sitedeployments,  db_index = True ];
+  required int32 deployment = 2 [ null = False,  blank = False,  model = Deployment,  modifier = required,  type = link,  port = sitedeployments,  db_index = True ];
+  optional int32 controller = 3 [ null = True,  blank = True,  model = Controller,  modifier = optional,  type = link,  port = sitedeployments,  db_index = True ];
+  optional string availability_zone = 4 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "OpenStack availability zone",  modifier = optional,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/siteprivilege.proto b/xos/genx/protos/core/siteprivilege.proto
new file mode 100644
index 0000000..03fe82f
--- /dev/null
+++ b/xos/genx/protos/core/siteprivilege.proto
@@ -0,0 +1,6 @@
+
+message SitePrivilege {
+  required int32 user = 1 [ null = False,  blank = False,  model = User,  modifier = required,  type = link,  port = siteprivileges,  db_index = True ];
+  required int32 site = 2 [ null = False,  blank = False,  model = Site,  modifier = required,  type = link,  port = siteprivileges,  db_index = True ];
+  required int32 role = 3 [ null = False,  blank = False,  model = SiteRole,  modifier = required,  type = link,  port = siteprivileges,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/siterole.proto b/xos/genx/protos/core/siterole.proto
new file mode 100644
index 0000000..b302d4c
--- /dev/null
+++ b/xos/genx/protos/core/siterole.proto
@@ -0,0 +1,4 @@
+
+message SiteRole {
+  required string role = 1 [ null = False,  choices = "(('admin', 'Admin'), ('pi', 'PI'), ('tech', 'Tech'), ('billing', 'Billing'))",  max_length = 30,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/slicecredential.proto b/xos/genx/protos/core/slicecredential.proto
new file mode 100644
index 0000000..cf3207f
--- /dev/null
+++ b/xos/genx/protos/core/slicecredential.proto
@@ -0,0 +1,7 @@
+
+message SliceCredential {
+  required int32 slice = 1 [ null = False,  blank = False,  help_text = "The User this credential is associated with",  model = Slice,  modifier = required,  type = link,  port = slicecredentials,  db_index = True ];
+  required string name = 2 [ null = False,  max_length = 128,  blank = False,  help_text = "The credential type, e.g. ec2",  modifier = required,  db_index = True ];
+  required string key_id = 3 [ null = False,  max_length = 1024,  content_type = "stripped",  blank = False,  help_text = "The backend id of this credential",  modifier = required,  db_index = False ];
+  required string enc_value = 4 [ null = False,  max_length = 1024,  blank = False,  help_text = "The key value of this credential",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/sliceprivilege.proto b/xos/genx/protos/core/sliceprivilege.proto
new file mode 100644
index 0000000..53783e5
--- /dev/null
+++ b/xos/genx/protos/core/sliceprivilege.proto
@@ -0,0 +1,6 @@
+
+message SlicePrivilege {
+  required int32 user = 1 [ null = False,  blank = False,  model = User,  modifier = required,  type = link,  port = sliceprivileges,  db_index = True ];
+  required int32 slice = 2 [ null = False,  blank = False,  model = Slice,  modifier = required,  type = link,  port = sliceprivileges,  db_index = True ];
+  required int32 role = 3 [ null = False,  blank = False,  model = SliceRole,  modifier = required,  type = link,  port = sliceprivileges,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/slicerole.proto b/xos/genx/protos/core/slicerole.proto
new file mode 100644
index 0000000..a76300c
--- /dev/null
+++ b/xos/genx/protos/core/slicerole.proto
@@ -0,0 +1,4 @@
+
+message SliceRole {
+  required string role = 1 [ null = False,  choices = "(('admin', 'Admin'), ('default', 'Default'))",  max_length = 30,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/slicetag.proto b/xos/genx/protos/core/slicetag.proto
new file mode 100644
index 0000000..cc6efdf
--- /dev/null
+++ b/xos/genx/protos/core/slicetag.proto
@@ -0,0 +1,6 @@
+
+message SliceTag {
+  required int32 slice = 1 [ null = False,  blank = False,  model = Slice,  modifier = required,  type = link,  port = slicetags,  db_index = True ];
+  required string name = 2 [ null = False,  choices = "(('privatekey', 'Private Key'), ('publickey', 'Public Key'))",  max_length = 30,  content_type = "stripped",  blank = False,  help_text = "The name of this tag",  modifier = required,  db_index = False ];
+  required string value = 3 [ null = False,  max_length = 1024,  content_type = "stripped",  blank = False,  help_text = "The value of this tag",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/tag.proto b/xos/genx/protos/core/tag.proto
new file mode 100644
index 0000000..6b89473
--- /dev/null
+++ b/xos/genx/protos/core/tag.proto
@@ -0,0 +1,8 @@
+
+message Tag {
+  required int32 service = 1 [ null = False,  blank = False,  help_text = "The Service this Tag is associated with",  model = Service,  modifier = required,  type = link,  port = tags,  db_index = True ];
+  required string name = 2 [ null = False,  max_length = 128,  blank = False,  help_text = "The name of this tag",  modifier = required,  db_index = True ];
+  required string value = 3 [ null = False,  max_length = 1024,  content_type = "stripped",  blank = False,  help_text = "The value of this tag",  modifier = required,  db_index = False ];
+  required int32 content_type = 4 [ null = False,  blank = False,  model = ContentType,  modifier = required,  type = link,  port = tag,  db_index = True ];
+  required uint32 object_id = 5 [ db_index = False,  modifier = required,  null = False,  blank = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/tenant.proto b/xos/genx/protos/core/tenant.proto
new file mode 100644
index 0000000..2c19a73
--- /dev/null
+++ b/xos/genx/protos/core/tenant.proto
@@ -0,0 +1,14 @@
+
+message Tenant {
+  optional string name = 1 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  modifier = optional,  db_index = False ];
+  required string kind = 2 [ null = False,  default = "generic",  max_length = 30,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  required int32 provider_service = 3 [ null = False,  blank = False,  model = Service,  modifier = required,  type = link,  port = provided_tenants,  db_index = True ];
+  optional int32 subscriber_service = 4 [ null = True,  blank = True,  model = Service,  modifier = optional,  type = link,  port = subscribed_tenants,  db_index = True ];
+  optional int32 subscriber_tenant = 5 [ null = True,  blank = True,  model = Tenant,  modifier = optional,  type = link,  port = subscribed_tenants,  db_index = True ];
+  optional int32 subscriber_user = 6 [ null = True,  blank = True,  model = User,  modifier = optional,  type = link,  port = subscribed_tenants,  db_index = True ];
+  optional int32 subscriber_root = 7 [ null = True,  blank = True,  model = TenantRoot,  modifier = optional,  type = link,  port = subscribed_tenants,  db_index = True ];
+  optional int32 subscriber_network = 8 [ null = True,  blank = True,  model = Network,  modifier = optional,  type = link,  port = subscribed_tenants,  db_index = True ];
+  optional string service_specific_id = 9 [ null = True,  max_length = 30,  content_type = "stripped",  blank = True,  modifier = optional,  db_index = False ];
+  optional string service_specific_attribute = 10 [ db_index = False,  modifier = optional,  null = True,  blank = True ];
+  required string connect_method = 11 [ null = False,  default = "na",  choices = "(('public', 'Public'), ('private', 'Private'), ('private-unidirectional', 'Private Unidirectional'), ('na', 'Not Applicable'))",  max_length = 30,  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/tenantattribute.proto b/xos/genx/protos/core/tenantattribute.proto
new file mode 100644
index 0000000..9487cef
--- /dev/null
+++ b/xos/genx/protos/core/tenantattribute.proto
@@ -0,0 +1,6 @@
+
+message TenantAttribute {
+  required string name = 1 [ null = False,  max_length = 128,  blank = False,  help_text = "Attribute Name",  modifier = required,  db_index = False ];
+  required string value = 2 [ db_index = False,  help_text = "Attribute Value",  modifier = required,  null = False,  blank = False ];
+  required int32 tenant = 3 [ null = False,  blank = False,  help_text = "The Tenant this attribute is associated with",  model = Tenant,  modifier = required,  type = link,  port = tenantattributes,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/tenantprivilege.proto b/xos/genx/protos/core/tenantprivilege.proto
new file mode 100644
index 0000000..5cb62d1
--- /dev/null
+++ b/xos/genx/protos/core/tenantprivilege.proto
@@ -0,0 +1,6 @@
+
+message TenantPrivilege {
+  required int32 user = 1 [ null = False,  blank = False,  model = User,  modifier = required,  type = link,  port = tenantprivileges,  db_index = True ];
+  required int32 tenant = 2 [ null = False,  blank = False,  model = Tenant,  modifier = required,  type = link,  port = tenantprivileges,  db_index = True ];
+  required int32 role = 3 [ null = False,  blank = False,  model = TenantRole,  modifier = required,  type = link,  port = tenantprivileges,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/tenantrole.proto b/xos/genx/protos/core/tenantrole.proto
new file mode 100644
index 0000000..ddbadd8
--- /dev/null
+++ b/xos/genx/protos/core/tenantrole.proto
@@ -0,0 +1,4 @@
+
+message TenantRole {
+  required string role = 1 [ null = False,  choices = "(('admin', 'Admin'), ('access', 'Access'))",  max_length = 30,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/tenantroot.proto b/xos/genx/protos/core/tenantroot.proto
new file mode 100644
index 0000000..eb36bee
--- /dev/null
+++ b/xos/genx/protos/core/tenantroot.proto
@@ -0,0 +1,7 @@
+
+message TenantRoot {
+  required string kind = 1 [ null = False,  default = "generic",  max_length = 30,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  optional string name = 2 [ null = True,  max_length = 255,  content_type = "stripped",  blank = True,  help_text = "name",  modifier = optional,  db_index = False ];
+  optional string service_specific_attribute = 3 [ db_index = False,  modifier = optional,  null = True,  blank = True ];
+  optional string service_specific_id = 4 [ null = True,  max_length = 30,  content_type = "stripped",  blank = True,  modifier = optional,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/tenantrootprivilege.proto b/xos/genx/protos/core/tenantrootprivilege.proto
new file mode 100644
index 0000000..f226ead
--- /dev/null
+++ b/xos/genx/protos/core/tenantrootprivilege.proto
@@ -0,0 +1,6 @@
+
+message TenantRootPrivilege {
+  required int32 user = 1 [ null = False,  blank = False,  model = User,  modifier = required,  type = link,  port = tenant_root_privileges,  db_index = True ];
+  required int32 tenant_root = 2 [ null = False,  blank = False,  model = TenantRoot,  modifier = required,  type = link,  port = tenant_root_privileges,  db_index = True ];
+  required int32 role = 3 [ null = False,  blank = False,  model = TenantRootRole,  modifier = required,  type = link,  port = tenant_root_privileges,  db_index = True ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/tenantrootrole.proto b/xos/genx/protos/core/tenantrootrole.proto
new file mode 100644
index 0000000..eee9755
--- /dev/null
+++ b/xos/genx/protos/core/tenantrootrole.proto
@@ -0,0 +1,4 @@
+
+message TenantRootRole {
+  required string role = 1 [ null = False,  choices = "(('admin', 'Admin'), ('access', 'Access'))",  max_length = 30,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/usableobject.proto b/xos/genx/protos/core/usableobject.proto
new file mode 100644
index 0000000..8cde567
--- /dev/null
+++ b/xos/genx/protos/core/usableobject.proto
@@ -0,0 +1,4 @@
+
+message UsableObject {
+  required string name = 1 [ null = False,  max_length = 1024,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/user.proto b/xos/genx/protos/core/user.proto
new file mode 100644
index 0000000..201751b
--- /dev/null
+++ b/xos/genx/protos/core/user.proto
@@ -0,0 +1,21 @@
+
+message User {
+  required string password = 1 [ db_index = False,  max_length = 128,  modifier = required,  null = False,  blank = False ];
+  optional string last_login = 2 [ db_index = False,  modifier = optional,  null = True,  content_type = "date",  blank = True ];
+  required string email = 3 [ db_index = True,  max_length = 255,  modifier = required,  null = False,  blank = False ];
+  required string username = 4 [ null = False,  default = "Something",  max_length = 255,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  required string firstname = 5 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "person's given name",  modifier = required,  db_index = False ];
+  required string lastname = 6 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "person's surname",  modifier = required,  db_index = False ];
+  optional string phone = 7 [ null = True,  max_length = 100,  content_type = "stripped",  blank = True,  help_text = "phone number contact",  modifier = optional,  db_index = False ];
+  optional string user_url = 8 [ null = True,  max_length = 200,  content_type = "url",  blank = True,  modifier = optional,  db_index = False ];
+  required int32 site = 9 [ null = False,  blank = False,  help_text = "Site this user will be homed too",  model = Site,  modifier = required,  type = link,  port = users,  db_index = True ];
+  optional string public_key = 10 [ null = True,  max_length = 1024,  blank = True,  help_text = "Public key string",  modifier = optional,  db_index = False ];
+  required bool is_active = 11 [ db_index = False,  default = True,  modifier = required,  null = False,  blank = True ];
+  required bool is_admin = 12 [ db_index = False,  default = False,  modifier = required,  null = False,  blank = True ];
+  required bool is_staff = 13 [ db_index = False,  default = True,  modifier = required,  null = False,  blank = True ];
+  required bool is_readonly = 14 [ db_index = False,  default = False,  modifier = required,  null = False,  blank = True ];
+  required bool is_registering = 15 [ db_index = False,  default = False,  modifier = required,  null = False,  blank = True ];
+  required bool is_appuser = 16 [ db_index = False,  default = False,  modifier = required,  null = False,  blank = True ];
+  optional string login_page = 17 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "send this user to a specific page on login",  modifier = optional,  db_index = False ];
+  required string timezone = 18 [ null = False,  default = "America/New_York",  choices = "[('Pacific/Midway', '(GMT-1100) Pacific/Midway'), ('Pacific/Niue', '(GMT-1100) Pacific/Niue'), ('Pacific/Pago_Pago', '(GMT-1100) Pacific/Pago_Pago'), ('Pacific/Honolulu', '(GMT-1000) Pacific/Honolulu'), ('Pacific/Johnston', '(GMT-1000) Pacific/Johnston'), ('Pacific/Rarotonga', '(GMT-1000) Pacific/Rarotonga'), ('Pacific/Tahiti', '(GMT-1000) Pacific/Tahiti'), ('US/Hawaii', '(GMT-1000) US/Hawaii'), ('Pacific/Marquesas', '(GMT-0930) Pacific/Marquesas'), ('America/Adak', '(GMT-0900) America/Adak'), ('Pacific/Gambier', '(GMT-0900) Pacific/Gambier'), ('America/Anchorage', '(GMT-0800) America/Anchorage'), ('America/Juneau', '(GMT-0800) America/Juneau'), ('America/Metlakatla', '(GMT-0800) America/Metlakatla'), ('America/Nome', '(GMT-0800) America/Nome'), ('America/Sitka', '(GMT-0800) America/Sitka'), ('America/Yakutat', '(GMT-0800) America/Yakutat'), ('Pacific/Pitcairn', '(GMT-0800) Pacific/Pitcairn'), ('US/Alaska', '(GMT-0800) US/Alaska'), ('America/Chihuahua', '(GMT-0700) America/Chihuahua'), ('America/Creston', '(GMT-0700) America/Creston'), ('America/Dawson', '(GMT-0700) America/Dawson'), ('America/Dawson_Creek', '(GMT-0700) America/Dawson_Creek'), ('America/Fort_Nelson', '(GMT-0700) America/Fort_Nelson'), ('America/Hermosillo', '(GMT-0700) America/Hermosillo'), ('America/Los_Angeles', '(GMT-0700) America/Los_Angeles'), ('America/Mazatlan', '(GMT-0700) America/Mazatlan'), ('America/Phoenix', '(GMT-0700) America/Phoenix'), ('America/Tijuana', '(GMT-0700) America/Tijuana'), ('America/Vancouver', '(GMT-0700) America/Vancouver'), ('America/Whitehorse', '(GMT-0700) America/Whitehorse'), ('Canada/Pacific', '(GMT-0700) Canada/Pacific'), ('US/Arizona', '(GMT-0700) US/Arizona'), ('US/Pacific', '(GMT-0700) US/Pacific'), ('America/Bahia_Banderas', '(GMT-0600) America/Bahia_Banderas'), ('America/Belize', '(GMT-0600) America/Belize'), ('America/Boise', '(GMT-0600) America/Boise'), ('America/Cambridge_Bay', '(GMT-0600) America/Cambridge_Bay'), ('America/Costa_Rica', '(GMT-0600) America/Costa_Rica'), ('America/Denver', '(GMT-0600) America/Denver'), ('America/Edmonton', '(GMT-0600) America/Edmonton'), ('America/El_Salvador', '(GMT-0600) America/El_Salvador'), ('America/Guatemala', '(GMT-0600) America/Guatemala'), ('America/Inuvik', '(GMT-0600) America/Inuvik'), ('America/Managua', '(GMT-0600) America/Managua'), ('America/Merida', '(GMT-0600) America/Merida'), ('America/Mexico_City', '(GMT-0600) America/Mexico_City'), ('America/Monterrey', '(GMT-0600) America/Monterrey'), ('America/Ojinaga', '(GMT-0600) America/Ojinaga'), ('America/Regina', '(GMT-0600) America/Regina'), ('America/Swift_Current', '(GMT-0600) America/Swift_Current'), ('America/Tegucigalpa', '(GMT-0600) America/Tegucigalpa'), ('America/Yellowknife', '(GMT-0600) America/Yellowknife'), ('Canada/Mountain', '(GMT-0600) Canada/Mountain'), ('Pacific/Galapagos', '(GMT-0600) Pacific/Galapagos'), ('US/Mountain', '(GMT-0600) US/Mountain'), ('America/Atikokan', '(GMT-0500) America/Atikokan'), ('America/Bogota', '(GMT-0500) America/Bogota'), ('America/Cancun', '(GMT-0500) America/Cancun'), ('America/Cayman', '(GMT-0500) America/Cayman'), ('America/Chicago', '(GMT-0500) America/Chicago'), ('America/Eirunepe', '(GMT-0500) America/Eirunepe'), ('America/Guayaquil', '(GMT-0500) America/Guayaquil'), ('America/Indiana/Knox', '(GMT-0500) America/Indiana/Knox'), ('America/Indiana/Tell_City', '(GMT-0500) America/Indiana/Tell_City'), ('America/Jamaica', '(GMT-0500) America/Jamaica'), ('America/Lima', '(GMT-0500) America/Lima'), ('America/Matamoros', '(GMT-0500) America/Matamoros'), ('America/Menominee', '(GMT-0500) America/Menominee'), ('America/North_Dakota/Beulah', '(GMT-0500) America/North_Dakota/Beulah'), ('America/North_Dakota/Center', '(GMT-0500) America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', '(GMT-0500) America/North_Dakota/New_Salem'), ('America/Panama', '(GMT-0500) America/Panama'), ('America/Port-au-Prince', '(GMT-0500) America/Port-au-Prince'), ('America/Rainy_River', '(GMT-0500) America/Rainy_River'), ('America/Rankin_Inlet', '(GMT-0500) America/Rankin_Inlet'), ('America/Resolute', '(GMT-0500) America/Resolute'), ('America/Rio_Branco', '(GMT-0500) America/Rio_Branco'), ('America/Winnipeg', '(GMT-0500) America/Winnipeg'), ('Canada/Central', '(GMT-0500) Canada/Central'), ('Pacific/Easter', '(GMT-0500) Pacific/Easter'), ('US/Central', '(GMT-0500) US/Central'), ('America/Anguilla', '(GMT-0400) America/Anguilla'), ('America/Antigua', '(GMT-0400) America/Antigua'), ('America/Aruba', '(GMT-0400) America/Aruba'), ('America/Asuncion', '(GMT-0400) America/Asuncion'), ('America/Barbados', '(GMT-0400) America/Barbados'), ('America/Blanc-Sablon', '(GMT-0400) America/Blanc-Sablon'), ('America/Boa_Vista', '(GMT-0400) America/Boa_Vista'), ('America/Campo_Grande', '(GMT-0400) America/Campo_Grande'), ('America/Caracas', '(GMT-0400) America/Caracas'), ('America/Cuiaba', '(GMT-0400) America/Cuiaba'), ('America/Curacao', '(GMT-0400) America/Curacao'), ('America/Detroit', '(GMT-0400) America/Detroit'), ('America/Dominica', '(GMT-0400) America/Dominica'), ('America/Grand_Turk', '(GMT-0400) America/Grand_Turk'), ('America/Grenada', '(GMT-0400) America/Grenada'), ('America/Guadeloupe', '(GMT-0400) America/Guadeloupe'), ('America/Guyana', '(GMT-0400) America/Guyana'), ('America/Havana', '(GMT-0400) America/Havana'), ('America/Indiana/Indianapolis', '(GMT-0400) America/Indiana/Indianapolis'), ('America/Indiana/Marengo', '(GMT-0400) America/Indiana/Marengo'), ('America/Indiana/Petersburg', '(GMT-0400) America/Indiana/Petersburg'), ('America/Indiana/Vevay', '(GMT-0400) America/Indiana/Vevay'), ('America/Indiana/Vincennes', '(GMT-0400) America/Indiana/Vincennes'), ('America/Indiana/Winamac', '(GMT-0400) America/Indiana/Winamac'), ('America/Iqaluit', '(GMT-0400) America/Iqaluit'), ('America/Kentucky/Louisville', '(GMT-0400) America/Kentucky/Louisville'), ('America/Kentucky/Monticello', '(GMT-0400) America/Kentucky/Monticello'), ('America/Kralendijk', '(GMT-0400) America/Kralendijk'), ('America/La_Paz', '(GMT-0400) America/La_Paz'), ('America/Lower_Princes', '(GMT-0400) America/Lower_Princes'), ('America/Manaus', '(GMT-0400) America/Manaus'), ('America/Marigot', '(GMT-0400) America/Marigot'), ('America/Martinique', '(GMT-0400) America/Martinique'), ('America/Montserrat', '(GMT-0400) America/Montserrat'), ('America/Nassau', '(GMT-0400) America/Nassau'), ('America/New_York', '(GMT-0400) America/New_York'), ('America/Nipigon', '(GMT-0400) America/Nipigon'), ('America/Pangnirtung', '(GMT-0400) America/Pangnirtung'), ('America/Port_of_Spain', '(GMT-0400) America/Port_of_Spain'), ('America/Porto_Velho', '(GMT-0400) America/Porto_Velho'), ('America/Puerto_Rico', '(GMT-0400) America/Puerto_Rico'), ('America/Santo_Domingo', '(GMT-0400) America/Santo_Domingo'), ('America/St_Barthelemy', '(GMT-0400) America/St_Barthelemy'), ('America/St_Kitts', '(GMT-0400) America/St_Kitts'), ('America/St_Lucia', '(GMT-0400) America/St_Lucia'), ('America/St_Thomas', '(GMT-0400) America/St_Thomas'), ('America/St_Vincent', '(GMT-0400) America/St_Vincent'), ('America/Thunder_Bay', '(GMT-0400) America/Thunder_Bay'), ('America/Toronto', '(GMT-0400) America/Toronto'), ('America/Tortola', '(GMT-0400) America/Tortola'), ('Canada/Eastern', '(GMT-0400) Canada/Eastern'), ('US/Eastern', '(GMT-0400) US/Eastern'), ('America/Araguaina', '(GMT-0300) America/Araguaina'), ('America/Argentina/Buenos_Aires', '(GMT-0300) America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', '(GMT-0300) America/Argentina/Catamarca'), ('America/Argentina/Cordoba', '(GMT-0300) America/Argentina/Cordoba'), ('America/Argentina/Jujuy', '(GMT-0300) America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', '(GMT-0300) America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', '(GMT-0300) America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', '(GMT-0300) America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', '(GMT-0300) America/Argentina/Salta'), ('America/Argentina/San_Juan', '(GMT-0300) America/Argentina/San_Juan'), ('America/Argentina/San_Luis', '(GMT-0300) America/Argentina/San_Luis'), ('America/Argentina/Tucuman', '(GMT-0300) America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', '(GMT-0300) America/Argentina/Ushuaia'), ('America/Bahia', '(GMT-0300) America/Bahia'), ('America/Belem', '(GMT-0300) America/Belem'), ('America/Cayenne', '(GMT-0300) America/Cayenne'), ('America/Fortaleza', '(GMT-0300) America/Fortaleza'), ('America/Glace_Bay', '(GMT-0300) America/Glace_Bay'), ('America/Goose_Bay', '(GMT-0300) America/Goose_Bay'), ('America/Halifax', '(GMT-0300) America/Halifax'), ('America/Maceio', '(GMT-0300) America/Maceio'), ('America/Moncton', '(GMT-0300) America/Moncton'), ('America/Montevideo', '(GMT-0300) America/Montevideo'), ('America/Paramaribo', '(GMT-0300) America/Paramaribo'), ('America/Recife', '(GMT-0300) America/Recife'), ('America/Santarem', '(GMT-0300) America/Santarem'), ('America/Santiago', '(GMT-0300) America/Santiago'), ('America/Sao_Paulo', '(GMT-0300) America/Sao_Paulo'), ('America/Thule', '(GMT-0300) America/Thule'), ('Antarctica/Palmer', '(GMT-0300) Antarctica/Palmer'), ('Antarctica/Rothera', '(GMT-0300) Antarctica/Rothera'), ('Atlantic/Bermuda', '(GMT-0300) Atlantic/Bermuda'), ('Atlantic/Stanley', '(GMT-0300) Atlantic/Stanley'), ('Canada/Atlantic', '(GMT-0300) Canada/Atlantic'), ('America/St_Johns', '(GMT-0230) America/St_Johns'), ('Canada/Newfoundland', '(GMT-0230) Canada/Newfoundland'), ('America/Godthab', '(GMT-0200) America/Godthab'), ('America/Miquelon', '(GMT-0200) America/Miquelon'), ('America/Noronha', '(GMT-0200) America/Noronha'), ('Atlantic/South_Georgia', '(GMT-0200) Atlantic/South_Georgia'), ('Atlantic/Cape_Verde', '(GMT-0100) Atlantic/Cape_Verde'), ('Africa/Abidjan', '(GMT+0000) Africa/Abidjan'), ('Africa/Accra', '(GMT+0000) Africa/Accra'), ('Africa/Bamako', '(GMT+0000) Africa/Bamako'), ('Africa/Banjul', '(GMT+0000) Africa/Banjul'), ('Africa/Bissau', '(GMT+0000) Africa/Bissau'), ('Africa/Conakry', '(GMT+0000) Africa/Conakry'), ('Africa/Dakar', '(GMT+0000) Africa/Dakar'), ('Africa/Freetown', '(GMT+0000) Africa/Freetown'), ('Africa/Lome', '(GMT+0000) Africa/Lome'), ('Africa/Monrovia', '(GMT+0000) Africa/Monrovia'), ('Africa/Nouakchott', '(GMT+0000) Africa/Nouakchott'), ('Africa/Ouagadougou', '(GMT+0000) Africa/Ouagadougou'), ('Africa/Sao_Tome', '(GMT+0000) Africa/Sao_Tome'), ('America/Danmarkshavn', '(GMT+0000) America/Danmarkshavn'), ('America/Scoresbysund', '(GMT+0000) America/Scoresbysund'), ('Atlantic/Azores', '(GMT+0000) Atlantic/Azores'), ('Atlantic/Reykjavik', '(GMT+0000) Atlantic/Reykjavik'), ('Atlantic/St_Helena', '(GMT+0000) Atlantic/St_Helena'), ('GMT', '(GMT+0000) GMT'), ('UTC', '(GMT+0000) UTC'), ('Africa/Algiers', '(GMT+0100) Africa/Algiers'), ('Africa/Bangui', '(GMT+0100) Africa/Bangui'), ('Africa/Brazzaville', '(GMT+0100) Africa/Brazzaville'), ('Africa/Casablanca', '(GMT+0100) Africa/Casablanca'), ('Africa/Douala', '(GMT+0100) Africa/Douala'), ('Africa/El_Aaiun', '(GMT+0100) Africa/El_Aaiun'), ('Africa/Kinshasa', '(GMT+0100) Africa/Kinshasa'), ('Africa/Lagos', '(GMT+0100) Africa/Lagos'), ('Africa/Libreville', '(GMT+0100) Africa/Libreville'), ('Africa/Luanda', '(GMT+0100) Africa/Luanda'), ('Africa/Malabo', '(GMT+0100) Africa/Malabo'), ('Africa/Ndjamena', '(GMT+0100) Africa/Ndjamena'), ('Africa/Niamey', '(GMT+0100) Africa/Niamey'), ('Africa/Porto-Novo', '(GMT+0100) Africa/Porto-Novo'), ('Africa/Tunis', '(GMT+0100) Africa/Tunis'), ('Atlantic/Canary', '(GMT+0100) Atlantic/Canary'), ('Atlantic/Faroe', '(GMT+0100) Atlantic/Faroe'), ('Atlantic/Madeira', '(GMT+0100) Atlantic/Madeira'), ('Europe/Dublin', '(GMT+0100) Europe/Dublin'), ('Europe/Guernsey', '(GMT+0100) Europe/Guernsey'), ('Europe/Isle_of_Man', '(GMT+0100) Europe/Isle_of_Man'), ('Europe/Jersey', '(GMT+0100) Europe/Jersey'), ('Europe/Lisbon', '(GMT+0100) Europe/Lisbon'), ('Europe/London', '(GMT+0100) Europe/London'), ('Africa/Blantyre', '(GMT+0200) Africa/Blantyre'), ('Africa/Bujumbura', '(GMT+0200) Africa/Bujumbura'), ('Africa/Cairo', '(GMT+0200) Africa/Cairo'), ('Africa/Ceuta', '(GMT+0200) Africa/Ceuta'), ('Africa/Gaborone', '(GMT+0200) Africa/Gaborone'), ('Africa/Harare', '(GMT+0200) Africa/Harare'), ('Africa/Johannesburg', '(GMT+0200) Africa/Johannesburg'), ('Africa/Kigali', '(GMT+0200) Africa/Kigali'), ('Africa/Lubumbashi', '(GMT+0200) Africa/Lubumbashi'), ('Africa/Lusaka', '(GMT+0200) Africa/Lusaka'), ('Africa/Maputo', '(GMT+0200) Africa/Maputo'), ('Africa/Maseru', '(GMT+0200) Africa/Maseru'), ('Africa/Mbabane', '(GMT+0200) Africa/Mbabane'), ('Africa/Tripoli', '(GMT+0200) Africa/Tripoli'), ('Africa/Windhoek', '(GMT+0200) Africa/Windhoek'), ('Antarctica/Troll', '(GMT+0200) Antarctica/Troll'), ('Arctic/Longyearbyen', '(GMT+0200) Arctic/Longyearbyen'), ('Asia/Amman', '(GMT+0200) Asia/Amman'), ('Asia/Damascus', '(GMT+0200) Asia/Damascus'), ('Europe/Amsterdam', '(GMT+0200) Europe/Amsterdam'), ('Europe/Andorra', '(GMT+0200) Europe/Andorra'), ('Europe/Belgrade', '(GMT+0200) Europe/Belgrade'), ('Europe/Berlin', '(GMT+0200) Europe/Berlin'), ('Europe/Bratislava', '(GMT+0200) Europe/Bratislava'), ('Europe/Brussels', '(GMT+0200) Europe/Brussels'), ('Europe/Budapest', '(GMT+0200) Europe/Budapest'), ('Europe/Busingen', '(GMT+0200) Europe/Busingen'), ('Europe/Copenhagen', '(GMT+0200) Europe/Copenhagen'), ('Europe/Gibraltar', '(GMT+0200) Europe/Gibraltar'), ('Europe/Kaliningrad', '(GMT+0200) Europe/Kaliningrad'), ('Europe/Ljubljana', '(GMT+0200) Europe/Ljubljana'), ('Europe/Luxembourg', '(GMT+0200) Europe/Luxembourg'), ('Europe/Madrid', '(GMT+0200) Europe/Madrid'), ('Europe/Malta', '(GMT+0200) Europe/Malta'), ('Europe/Monaco', '(GMT+0200) Europe/Monaco'), ('Europe/Oslo', '(GMT+0200) Europe/Oslo'), ('Europe/Paris', '(GMT+0200) Europe/Paris'), ('Europe/Podgorica', '(GMT+0200) Europe/Podgorica'), ('Europe/Prague', '(GMT+0200) Europe/Prague'), ('Europe/Rome', '(GMT+0200) Europe/Rome'), ('Europe/San_Marino', '(GMT+0200) Europe/San_Marino'), ('Europe/Sarajevo', '(GMT+0200) Europe/Sarajevo'), ('Europe/Skopje', '(GMT+0200) Europe/Skopje'), ('Europe/Stockholm', '(GMT+0200) Europe/Stockholm'), ('Europe/Tirane', '(GMT+0200) Europe/Tirane'), ('Europe/Vaduz', '(GMT+0200) Europe/Vaduz'), ('Europe/Vatican', '(GMT+0200) Europe/Vatican'), ('Europe/Vienna', '(GMT+0200) Europe/Vienna'), ('Europe/Warsaw', '(GMT+0200) Europe/Warsaw'), ('Europe/Zagreb', '(GMT+0200) Europe/Zagreb'), ('Europe/Zurich', '(GMT+0200) Europe/Zurich'), ('Africa/Addis_Ababa', '(GMT+0300) Africa/Addis_Ababa'), ('Africa/Asmara', '(GMT+0300) Africa/Asmara'), ('Africa/Dar_es_Salaam', '(GMT+0300) Africa/Dar_es_Salaam'), ('Africa/Djibouti', '(GMT+0300) Africa/Djibouti'), ('Africa/Juba', '(GMT+0300) Africa/Juba'), ('Africa/Kampala', '(GMT+0300) Africa/Kampala'), ('Africa/Khartoum', '(GMT+0300) Africa/Khartoum'), ('Africa/Mogadishu', '(GMT+0300) Africa/Mogadishu'), ('Africa/Nairobi', '(GMT+0300) Africa/Nairobi'), ('Antarctica/Syowa', '(GMT+0300) Antarctica/Syowa'), ('Asia/Aden', '(GMT+0300) Asia/Aden'), ('Asia/Baghdad', '(GMT+0300) Asia/Baghdad'), ('Asia/Bahrain', '(GMT+0300) Asia/Bahrain'), ('Asia/Beirut', '(GMT+0300) Asia/Beirut'), ('Asia/Gaza', '(GMT+0300) Asia/Gaza'), ('Asia/Hebron', '(GMT+0300) Asia/Hebron'), ('Asia/Jerusalem', '(GMT+0300) Asia/Jerusalem'), ('Asia/Kuwait', '(GMT+0300) Asia/Kuwait'), ('Asia/Nicosia', '(GMT+0300) Asia/Nicosia'), ('Asia/Qatar', '(GMT+0300) Asia/Qatar'), ('Asia/Riyadh', '(GMT+0300) Asia/Riyadh'), ('Europe/Athens', '(GMT+0300) Europe/Athens'), ('Europe/Bucharest', '(GMT+0300) Europe/Bucharest'), ('Europe/Chisinau', '(GMT+0300) Europe/Chisinau'), ('Europe/Helsinki', '(GMT+0300) Europe/Helsinki'), ('Europe/Istanbul', '(GMT+0300) Europe/Istanbul'), ('Europe/Kiev', '(GMT+0300) Europe/Kiev'), ('Europe/Kirov', '(GMT+0300) Europe/Kirov'), ('Europe/Mariehamn', '(GMT+0300) Europe/Mariehamn'), ('Europe/Minsk', '(GMT+0300) Europe/Minsk'), ('Europe/Moscow', '(GMT+0300) Europe/Moscow'), ('Europe/Riga', '(GMT+0300) Europe/Riga'), ('Europe/Simferopol', '(GMT+0300) Europe/Simferopol'), ('Europe/Sofia', '(GMT+0300) Europe/Sofia'), ('Europe/Tallinn', '(GMT+0300) Europe/Tallinn'), ('Europe/Uzhgorod', '(GMT+0300) Europe/Uzhgorod'), ('Europe/Vilnius', '(GMT+0300) Europe/Vilnius'), ('Europe/Volgograd', '(GMT+0300) Europe/Volgograd'), ('Europe/Zaporozhye', '(GMT+0300) Europe/Zaporozhye'), ('Indian/Antananarivo', '(GMT+0300) Indian/Antananarivo'), ('Indian/Comoro', '(GMT+0300) Indian/Comoro'), ('Indian/Mayotte', '(GMT+0300) Indian/Mayotte'), ('Asia/Baku', '(GMT+0400) Asia/Baku'), ('Asia/Dubai', '(GMT+0400) Asia/Dubai'), ('Asia/Muscat', '(GMT+0400) Asia/Muscat'), ('Asia/Tbilisi', '(GMT+0400) Asia/Tbilisi'), ('Asia/Yerevan', '(GMT+0400) Asia/Yerevan'), ('Europe/Astrakhan', '(GMT+0400) Europe/Astrakhan'), ('Europe/Samara', '(GMT+0400) Europe/Samara'), ('Europe/Ulyanovsk', '(GMT+0400) Europe/Ulyanovsk'), ('Indian/Mahe', '(GMT+0400) Indian/Mahe'), ('Indian/Mauritius', '(GMT+0400) Indian/Mauritius'), ('Indian/Reunion', '(GMT+0400) Indian/Reunion'), ('Asia/Kabul', '(GMT+0430) Asia/Kabul'), ('Asia/Tehran', '(GMT+0430) Asia/Tehran'), ('Antarctica/Mawson', '(GMT+0500) Antarctica/Mawson'), ('Asia/Aqtau', '(GMT+0500) Asia/Aqtau'), ('Asia/Aqtobe', '(GMT+0500) Asia/Aqtobe'), ('Asia/Ashgabat', '(GMT+0500) Asia/Ashgabat'), ('Asia/Dushanbe', '(GMT+0500) Asia/Dushanbe'), ('Asia/Karachi', '(GMT+0500) Asia/Karachi'), ('Asia/Oral', '(GMT+0500) Asia/Oral'), ('Asia/Samarkand', '(GMT+0500) Asia/Samarkand'), ('Asia/Tashkent', '(GMT+0500) Asia/Tashkent'), ('Asia/Yekaterinburg', '(GMT+0500) Asia/Yekaterinburg'), ('Indian/Kerguelen', '(GMT+0500) Indian/Kerguelen'), ('Indian/Maldives', '(GMT+0500) Indian/Maldives'), ('Asia/Colombo', '(GMT+0530) Asia/Colombo'), ('Asia/Kolkata', '(GMT+0530) Asia/Kolkata'), ('Asia/Kathmandu', '(GMT+0545) Asia/Kathmandu'), ('Antarctica/Vostok', '(GMT+0600) Antarctica/Vostok'), ('Asia/Almaty', '(GMT+0600) Asia/Almaty'), ('Asia/Bishkek', '(GMT+0600) Asia/Bishkek'), ('Asia/Dhaka', '(GMT+0600) Asia/Dhaka'), ('Asia/Omsk', '(GMT+0600) Asia/Omsk'), ('Asia/Qyzylorda', '(GMT+0600) Asia/Qyzylorda'), ('Asia/Thimphu', '(GMT+0600) Asia/Thimphu'), ('Asia/Urumqi', '(GMT+0600) Asia/Urumqi'), ('Indian/Chagos', '(GMT+0600) Indian/Chagos'), ('Asia/Rangoon', '(GMT+0630) Asia/Rangoon'), ('Indian/Cocos', '(GMT+0630) Indian/Cocos'), ('Antarctica/Davis', '(GMT+0700) Antarctica/Davis'), ('Asia/Bangkok', '(GMT+0700) Asia/Bangkok'), ('Asia/Barnaul', '(GMT+0700) Asia/Barnaul'), ('Asia/Ho_Chi_Minh', '(GMT+0700) Asia/Ho_Chi_Minh'), ('Asia/Jakarta', '(GMT+0700) Asia/Jakarta'), ('Asia/Krasnoyarsk', '(GMT+0700) Asia/Krasnoyarsk'), ('Asia/Novokuznetsk', '(GMT+0700) Asia/Novokuznetsk'), ('Asia/Novosibirsk', '(GMT+0700) Asia/Novosibirsk'), ('Asia/Phnom_Penh', '(GMT+0700) Asia/Phnom_Penh'), ('Asia/Pontianak', '(GMT+0700) Asia/Pontianak'), ('Asia/Tomsk', '(GMT+0700) Asia/Tomsk'), ('Asia/Vientiane', '(GMT+0700) Asia/Vientiane'), ('Indian/Christmas', '(GMT+0700) Indian/Christmas'), ('Antarctica/Casey', '(GMT+0800) Antarctica/Casey'), ('Asia/Brunei', '(GMT+0800) Asia/Brunei'), ('Asia/Hong_Kong', '(GMT+0800) Asia/Hong_Kong'), ('Asia/Hovd', '(GMT+0800) Asia/Hovd'), ('Asia/Irkutsk', '(GMT+0800) Asia/Irkutsk'), ('Asia/Kuala_Lumpur', '(GMT+0800) Asia/Kuala_Lumpur'), ('Asia/Kuching', '(GMT+0800) Asia/Kuching'), ('Asia/Macau', '(GMT+0800) Asia/Macau'), ('Asia/Makassar', '(GMT+0800) Asia/Makassar'), ('Asia/Manila', '(GMT+0800) Asia/Manila'), ('Asia/Shanghai', '(GMT+0800) Asia/Shanghai'), ('Asia/Singapore', '(GMT+0800) Asia/Singapore'), ('Asia/Taipei', '(GMT+0800) Asia/Taipei'), ('Australia/Perth', '(GMT+0800) Australia/Perth'), ('Asia/Pyongyang', '(GMT+0830) Asia/Pyongyang'), ('Australia/Eucla', '(GMT+0845) Australia/Eucla'), ('Asia/Chita', '(GMT+0900) Asia/Chita'), ('Asia/Choibalsan', '(GMT+0900) Asia/Choibalsan'), ('Asia/Dili', '(GMT+0900) Asia/Dili'), ('Asia/Jayapura', '(GMT+0900) Asia/Jayapura'), ('Asia/Khandyga', '(GMT+0900) Asia/Khandyga'), ('Asia/Seoul', '(GMT+0900) Asia/Seoul'), ('Asia/Tokyo', '(GMT+0900) Asia/Tokyo'), ('Asia/Ulaanbaatar', '(GMT+0900) Asia/Ulaanbaatar'), ('Asia/Yakutsk', '(GMT+0900) Asia/Yakutsk'), ('Pacific/Palau', '(GMT+0900) Pacific/Palau'), ('Australia/Darwin', '(GMT+0930) Australia/Darwin'), ('Antarctica/DumontDUrville', '(GMT+1000) Antarctica/DumontDUrville'), ('Asia/Ust-Nera', '(GMT+1000) Asia/Ust-Nera'), ('Asia/Vladivostok', '(GMT+1000) Asia/Vladivostok'), ('Australia/Brisbane', '(GMT+1000) Australia/Brisbane'), ('Australia/Lindeman', '(GMT+1000) Australia/Lindeman'), ('Pacific/Chuuk', '(GMT+1000) Pacific/Chuuk'), ('Pacific/Guam', '(GMT+1000) Pacific/Guam'), ('Pacific/Port_Moresby', '(GMT+1000) Pacific/Port_Moresby'), ('Pacific/Saipan', '(GMT+1000) Pacific/Saipan'), ('Australia/Adelaide', '(GMT+1030) Australia/Adelaide'), ('Australia/Broken_Hill', '(GMT+1030) Australia/Broken_Hill'), ('Antarctica/Macquarie', '(GMT+1100) Antarctica/Macquarie'), ('Asia/Magadan', '(GMT+1100) Asia/Magadan'), ('Asia/Sakhalin', '(GMT+1100) Asia/Sakhalin'), ('Asia/Srednekolymsk', '(GMT+1100) Asia/Srednekolymsk'), ('Australia/Currie', '(GMT+1100) Australia/Currie'), ('Australia/Hobart', '(GMT+1100) Australia/Hobart'), ('Australia/Lord_Howe', '(GMT+1100) Australia/Lord_Howe'), ('Australia/Melbourne', '(GMT+1100) Australia/Melbourne'), ('Australia/Sydney', '(GMT+1100) Australia/Sydney'), ('Pacific/Bougainville', '(GMT+1100) Pacific/Bougainville'), ('Pacific/Efate', '(GMT+1100) Pacific/Efate'), ('Pacific/Guadalcanal', '(GMT+1100) Pacific/Guadalcanal'), ('Pacific/Kosrae', '(GMT+1100) Pacific/Kosrae'), ('Pacific/Norfolk', '(GMT+1100) Pacific/Norfolk'), ('Pacific/Noumea', '(GMT+1100) Pacific/Noumea'), ('Pacific/Pohnpei', '(GMT+1100) Pacific/Pohnpei'), ('Asia/Anadyr', '(GMT+1200) Asia/Anadyr'), ('Asia/Kamchatka', '(GMT+1200) Asia/Kamchatka'), ('Pacific/Fiji', '(GMT+1200) Pacific/Fiji'), ('Pacific/Funafuti', '(GMT+1200) Pacific/Funafuti'), ('Pacific/Kwajalein', '(GMT+1200) Pacific/Kwajalein'), ('Pacific/Majuro', '(GMT+1200) Pacific/Majuro'), ('Pacific/Nauru', '(GMT+1200) Pacific/Nauru'), ('Pacific/Tarawa', '(GMT+1200) Pacific/Tarawa'), ('Pacific/Wake', '(GMT+1200) Pacific/Wake'), ('Pacific/Wallis', '(GMT+1200) Pacific/Wallis'), ('Antarctica/McMurdo', '(GMT+1300) Antarctica/McMurdo'), ('Pacific/Auckland', '(GMT+1300) Pacific/Auckland'), ('Pacific/Enderbury', '(GMT+1300) Pacific/Enderbury'), ('Pacific/Fakaofo', '(GMT+1300) Pacific/Fakaofo'), ('Pacific/Tongatapu', '(GMT+1300) Pacific/Tongatapu'), ('Pacific/Chatham', '(GMT+1345) Pacific/Chatham'), ('Pacific/Apia', '(GMT+1400) Pacific/Apia'), ('Pacific/Kiritimati', '(GMT+1400) Pacific/Kiritimati')]",  max_length = 100,  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/usercredential.proto b/xos/genx/protos/core/usercredential.proto
new file mode 100644
index 0000000..5aa414f
--- /dev/null
+++ b/xos/genx/protos/core/usercredential.proto
@@ -0,0 +1,7 @@
+
+message UserCredential {
+  required int32 user = 1 [ null = False,  blank = False,  help_text = "The User this credential is associated with",  model = User,  modifier = required,  type = link,  port = usercredentials,  db_index = True ];
+  required string name = 2 [ null = False,  max_length = 128,  blank = False,  help_text = "The credential type, e.g. ec2",  modifier = required,  db_index = True ];
+  required string key_id = 3 [ null = False,  max_length = 1024,  content_type = "stripped",  blank = False,  help_text = "The backend id of this credential",  modifier = required,  db_index = False ];
+  required string enc_value = 4 [ null = False,  max_length = 1024,  blank = False,  help_text = "The key value of this credential",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/userdashboardview.proto b/xos/genx/protos/core/userdashboardview.proto
new file mode 100644
index 0000000..ddc8b63
--- /dev/null
+++ b/xos/genx/protos/core/userdashboardview.proto
@@ -0,0 +1,6 @@
+
+message UserDashboardView {
+  required int32 user = 1 [ null = False,  blank = False,  model = User,  modifier = required,  type = link,  port = userdashboardviews,  db_index = True ];
+  required int32 dashboardView = 2 [ null = False,  blank = False,  model = DashboardView,  modifier = required,  type = link,  port = userdashboardviews,  db_index = True ];
+  required int32 order = 3 [ db_index = False,  default = 0,  modifier = required,  null = False,  blank = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/xos.proto b/xos/genx/protos/core/xos.proto
new file mode 100644
index 0000000..0eda556
--- /dev/null
+++ b/xos/genx/protos/core/xos.proto
@@ -0,0 +1,14 @@
+
+message XOS {
+  required string name = 1 [ null = False,  default = "XOS",  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "Name of XOS",  modifier = required,  db_index = False ];
+  required int32 ui_port = 2 [ null = False,  default = 80,  blank = False,  help_text = "Port for XOS UI",  modifier = required,  db_index = False ];
+  required int32 bootstrap_ui_port = 3 [ null = False,  default = 81,  blank = False,  help_text = "Port for XOS Bootstrap UI",  modifier = required,  db_index = False ];
+  required string db_container_name = 4 [ null = False,  default = "xos_db",  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "name of XOS db container",  modifier = required,  db_index = False ];
+  required string redis_container_name = 5 [ null = False,  default = "",  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "name of XOS redis container",  modifier = required,  db_index = False ];
+  required string docker_project_name = 6 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "docker project name",  modifier = required,  db_index = False ];
+  required bool enable_build = 7 [ null = False,  default = True,  blank = True,  help_text = "True if Onboarding Synchronizer should build XOS as necessary",  modifier = required,  db_index = False ];
+  required bool frontend_only = 8 [ null = False,  default = False,  blank = True,  help_text = "If True, XOS will not start synchronizer containers",  modifier = required,  db_index = False ];
+  required string source_ui_image = 9 [ null = False,  default = "xosproject/xos",  max_length = 200,  content_type = "stripped",  blank = False,  modifier = required,  db_index = False ];
+  optional string extra_hosts = 10 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  help_text = "list of hostname mappings that will be passed to docker-compose",  modifier = optional,  db_index = False ];
+  required bool no_start = 11 [ null = False,  default = False,  blank = True,  help_text = "Do not start the XOS UI inside of the UI docker container",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/xoscomponent.proto b/xos/genx/protos/core/xoscomponent.proto
new file mode 100644
index 0000000..996b282
--- /dev/null
+++ b/xos/genx/protos/core/xoscomponent.proto
@@ -0,0 +1,14 @@
+
+message XOSComponent {
+  required int32 xos = 1 [ null = False,  default = "get_xos()",  blank = False,  help_text = "Pointer to XOS",  model = XOS,  modifier = required,  type = link,  port = loadable_modules,  db_index = True ];
+  required string name = 2 [ null = False,  max_length = 30,  content_type = "stripped",  blank = False,  help_text = "Service Name",  modifier = required,  db_index = False ];
+  optional string base_url = 3 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  help_text = "Base URL, allows use of relative URLs for resources",  modifier = optional,  db_index = False ];
+  optional string version = 4 [ null = True,  default = "1.0.0",  max_length = 30,  content_type = "stripped",  blank = True,  help_text = "Version of Service Controller",  modifier = optional,  db_index = False ];
+  optional string provides = 5 [ null = True,  max_length = 254,  content_type = "stripped",  blank = True,  help_text = "Comma-separated list of things provided",  modifier = optional,  db_index = False ];
+  optional string requires = 6 [ null = True,  max_length = 254,  content_type = "stripped",  blank = True,  help_text = "Comma-separated list of required Service Controllers",  modifier = optional,  db_index = False ];
+  required string image = 7 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "docker image name",  modifier = required,  db_index = False ];
+  optional string command = 8 [ null = True,  max_length = 1024,  content_type = "stripped",  blank = True,  help_text = "docker run command",  modifier = optional,  db_index = False ];
+  optional string ports = 9 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "port binding",  modifier = optional,  db_index = False ];
+  optional string extra = 10 [ null = True,  max_length = 200,  content_type = "stripped",  blank = True,  help_text = "extra information needed by containers",  modifier = optional,  db_index = False ];
+  required bool no_start = 11 [ null = False,  default = False,  blank = True,  help_text = "Do not start the Component",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/xoscomponentlink.proto b/xos/genx/protos/core/xoscomponentlink.proto
new file mode 100644
index 0000000..847df34
--- /dev/null
+++ b/xos/genx/protos/core/xoscomponentlink.proto
@@ -0,0 +1,7 @@
+
+message XOSComponentLink {
+  required int32 component = 1 [ null = False,  blank = False,  help_text = "The Component object for this Link",  model = XOSComponent,  modifier = required,  type = link,  port = links,  db_index = True ];
+  required string container = 2 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "container to link",  modifier = required,  db_index = False ];
+  required string alias = 3 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "alias for the link",  modifier = required,  db_index = False ];
+  required string kind = 4 [ null = False,  default = "internal",  choices = "(('internal', 'Internal'), ('external', 'External'))",  max_length = 20,  blank = False,  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/xoscomponentvolume.proto b/xos/genx/protos/core/xoscomponentvolume.proto
new file mode 100644
index 0000000..d3075e9
--- /dev/null
+++ b/xos/genx/protos/core/xoscomponentvolume.proto
@@ -0,0 +1,8 @@
+
+message XOSComponentVolume {
+  required int32 component = 1 [ null = False,  blank = False,  help_text = "The Component object for this Volume",  model = XOSComponent,  modifier = required,  type = link,  port = volumes,  db_index = True ];
+  required string name = 2 [ null = False,  max_length = 300,  content_type = "stripped",  blank = False,  help_text = "Volume Name",  modifier = required,  db_index = False ];
+  required string container_path = 3 [ null = False,  max_length = 1024,  content_type = "stripped",  blank = False,  help_text = "Path of Volume in Container",  modifier = required,  db_index = False ];
+  required string host_path = 4 [ null = False,  max_length = 1024,  content_type = "stripped",  blank = False,  help_text = "Path of Volume in Host",  modifier = required,  db_index = False ];
+  required bool read_only = 5 [ null = False,  default = False,  blank = True,  help_text = "True if mount read-only",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/xoscomponentvolumecontainer.proto b/xos/genx/protos/core/xoscomponentvolumecontainer.proto
new file mode 100644
index 0000000..c983894
--- /dev/null
+++ b/xos/genx/protos/core/xoscomponentvolumecontainer.proto
@@ -0,0 +1,6 @@
+
+message XOSComponentVolumeContainer {
+  required int32 component = 1 [ null = False,  blank = False,  help_text = "The Component object for this VolumeContainer",  model = XOSComponent,  modifier = required,  type = link,  port = volumecontainers,  db_index = True ];
+  required string name = 2 [ null = False,  max_length = 300,  content_type = "stripped",  blank = False,  help_text = "Volume Name",  modifier = required,  db_index = False ];
+  required string container = 3 [ null = False,  max_length = 300,  content_type = "stripped",  blank = False,  help_text = "Volume Name",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/xosguiextension.proto b/xos/genx/protos/core/xosguiextension.proto
new file mode 100644
index 0000000..3efe212
--- /dev/null
+++ b/xos/genx/protos/core/xosguiextension.proto
@@ -0,0 +1,5 @@
+
+message XOSGuiExtension {
+  required string name = 1 [ null = False,  max_length = 200,  content_type = "stripped",  blank = False,  help_text = "Name of the GUI Extensions",  modifier = required,  db_index = False ];
+  required string files = 2 [ null = False,  max_length = 1024,  content_type = "stripped",  blank = False,  help_text = "List of comma separated file composing the view",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/protos/core/xosvolume.proto b/xos/genx/protos/core/xosvolume.proto
new file mode 100644
index 0000000..659c548
--- /dev/null
+++ b/xos/genx/protos/core/xosvolume.proto
@@ -0,0 +1,7 @@
+
+message XOSVolume {
+  required int32 xos = 1 [ null = False,  blank = False,  help_text = "The XOS object for this Volume",  model = XOS,  modifier = required,  type = link,  port = volumes,  db_index = True ];
+  required string container_path = 2 [ null = False,  max_length = 1024,  content_type = "stripped",  blank = False,  help_text = "Path of Volume in Container",  modifier = required,  db_index = False ];
+  required string host_path = 3 [ null = False,  max_length = 1024,  content_type = "stripped",  blank = False,  help_text = "Path of Volume in Host",  modifier = required,  db_index = False ];
+  required bool read_only = 4 [ null = False,  default = False,  blank = True,  help_text = "True if mount read-only",  modifier = required,  db_index = False ];
+}
\ No newline at end of file
diff --git a/xos/genx/targets/proto.xtarget b/xos/genx/targets/proto.xtarget
index 9a168ca..c11c0e8 100644
--- a/xos/genx/targets/proto.xtarget
+++ b/xos/genx/targets/proto.xtarget
@@ -3,9 +3,6 @@
   {%- for f in m.fields %}
   {{ f.modifier }} {{f.type}} {{f.name}} = {{ f.id }}{% if f.options %} [{% for k,v in f.options.iteritems() %} {{ k }} = {{ v}}{% if not loop.last %},{% endif %} {% endfor %}]{% endif %};
   {%- endfor %}
-
-  {%- for l in m.links %}
-  {{ l.link_type }}
-  {%- endfor %}
 }
++++ protos/{{ m.name | lower }}.proto
 {% endfor %}
diff --git a/xos/genx/xprotos/core/account.xproto b/xos/genx/xprotos/core/account.xproto
new file mode 100644
index 0000000..641d7c5
--- /dev/null
+++ b/xos/genx/xprotos/core/account.xproto
@@ -0,0 +1,5 @@
+
+
+message Account {
+     required manytoone site->Site:accounts = 1 [help_text = "Site for this account", null = False, db_index = True, blank = False];
+}
diff --git a/xos/genx/xprotos/core/addresspool.xproto b/xos/genx/xprotos/core/addresspool.xproto
new file mode 100644
index 0000000..7ada9d4
--- /dev/null
+++ b/xos/genx/xprotos/core/addresspool.xproto
@@ -0,0 +1,11 @@
+
+
+message AddressPool {
+     required string name = 1 [db_index = False, max_length = 32, null = False, blank = False];
+     optional string addresses = 2 [db_index = False, null = True, blank = True];
+     optional string gateway_ip = 3 [db_index = False, max_length = 32, null = True, blank = False];
+     optional string gateway_mac = 4 [db_index = False, max_length = 32, null = True, blank = False];
+     optional string cidr = 5 [db_index = False, max_length = 32, null = True, blank = False];
+     optional string inuse = 6 [db_index = False, null = True, blank = True];
+     optional manytoone service->Service:addresspools = 7 [db_index = True, null = True, blank = True];
+}
diff --git a/xos/genx/xprotos/core/charge.xproto b/xos/genx/xprotos/core/charge.xproto
new file mode 100644
index 0000000..96afeec
--- /dev/null
+++ b/xos/genx/xprotos/core/charge.xproto
@@ -0,0 +1,13 @@
+
+
+message Charge {
+     required manytoone account->Account:charges = 1 [db_index = True, null = False, blank = False];
+     optional manytoone slice->Slice:charges = 2 [db_index = True, null = True, blank = True];
+     required string kind = 3 [default = "besteffort", choices = "(('besteffort', 'besteffort'), ('reservation', 'reservation'), ('monthlyfee', 'monthlyfee'))", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+     required string state = 4 [default = "pending", choices = "(('pending', 'pending'), ('invoiced', 'invoiced'))", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+     required string date = 5 [db_index = False, null = False, content_type = "date", blank = False];
+     required manytoone object->UsableObject:charge = 6 [db_index = True, null = False, blank = False];
+     required float amount = 7 [default = 0.0, null = False, db_index = False, blank = False];
+     required float coreHours = 8 [default = 0.0, null = False, db_index = False, blank = False];
+     optional manytoone invoice->Invoice:charges = 9 [db_index = True, null = True, blank = True];
+}
diff --git a/xos/genx/xprotos/core/controller.xproto b/xos/genx/xprotos/core/controller.xproto
new file mode 100644
index 0000000..c6d3638
--- /dev/null
+++ b/xos/genx/xprotos/core/controller.xproto
@@ -0,0 +1,16 @@
+
+
+message Controller {
+     required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the Controller", null = False, db_index = False];
+     required string backend_type = 2 [max_length = 200, content_type = "stripped", blank = False, help_text = "Type of compute controller, e.g. EC2, OpenStack, or OpenStack version", null = False, db_index = False];
+     required string version = 3 [max_length = 200, content_type = "stripped", blank = False, help_text = "Controller version", null = False, db_index = False];
+     optional string auth_url = 4 [max_length = 200, content_type = "stripped", blank = True, help_text = "Auth url for the compute controller", null = True, db_index = False];
+     optional string admin_user = 5 [max_length = 200, content_type = "stripped", blank = True, help_text = "Username of an admin user at this controller", null = True, db_index = False];
+     optional string admin_password = 6 [max_length = 200, content_type = "stripped", blank = True, help_text = "Password of theadmin user at this controller", null = True, db_index = False];
+     optional string admin_tenant = 7 [max_length = 200, content_type = "stripped", blank = True, help_text = "Name of the tenant the admin user belongs to", null = True, db_index = False];
+     optional string domain = 8 [max_length = 200, content_type = "stripped", blank = True, help_text = "Name of the domain this controller belongs to", null = True, db_index = False];
+     optional string rabbit_host = 9 [max_length = 200, content_type = "stripped", blank = True, help_text = "IP address of rabbitmq server at this controller", null = True, db_index = False];
+     optional string rabbit_user = 10 [max_length = 200, content_type = "stripped", blank = True, help_text = "Username of rabbitmq server at this controller", null = True, db_index = False];
+     optional string rabbit_password = 11 [max_length = 200, content_type = "stripped", blank = True, help_text = "Password of rabbitmq server at this controller", null = True, db_index = False];
+     required manytoone deployment->Deployment:controllerdeployments = 12 [db_index = True, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/controllerdashboardview.xproto b/xos/genx/xprotos/core/controllerdashboardview.xproto
new file mode 100644
index 0000000..9b8afd2
--- /dev/null
+++ b/xos/genx/xprotos/core/controllerdashboardview.xproto
@@ -0,0 +1,8 @@
+
+
+message ControllerDashboardView {
+     required manytoone controller->Controller:controllerdashboardviews = 1 [db_index = True, null = False, blank = False];
+     required manytoone dashboardView->DashboardView:controllerdashboardviews = 2 [db_index = True, null = False, blank = False];
+     required bool enabled = 3 [default = True, null = False, db_index = False, blank = True];
+     required string url = 4 [max_length = 1024, content_type = "stripped", blank = False, help_text = "URL of Dashboard", null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/controllerimages.xproto b/xos/genx/xprotos/core/controllerimages.xproto
new file mode 100644
index 0000000..ecd750b
--- /dev/null
+++ b/xos/genx/xprotos/core/controllerimages.xproto
@@ -0,0 +1,7 @@
+
+
+message ControllerImages {
+     required manytoone image->Image:controllerimages = 1 [db_index = True, null = False, blank = False];
+     required manytoone controller->Controller:controllerimages = 2 [db_index = True, null = False, blank = False];
+     optional string glance_image_id = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "Glance image id", null = True, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/controllernetwork.xproto b/xos/genx/xprotos/core/controllernetwork.xproto
new file mode 100644
index 0000000..a09cb56
--- /dev/null
+++ b/xos/genx/xprotos/core/controllernetwork.xproto
@@ -0,0 +1,14 @@
+
+
+message ControllerNetwork {
+     required manytoone network->Network:controllernetworks = 1 [db_index = True, null = False, blank = False];
+     required manytoone controller->Controller:controllernetworks = 2 [db_index = True, null = False, blank = False];
+     required string subnet = 3 [db_index = False, max_length = 32, null = False, blank = True];
+     required string start_ip = 4 [db_index = False, max_length = 32, null = False, blank = True];
+     required string stop_ip = 5 [db_index = False, max_length = 32, null = False, blank = True];
+     optional string net_id = 6 [help_text = "Neutron network", max_length = 256, null = True, db_index = False, blank = True];
+     optional string router_id = 7 [help_text = "Neutron router id", max_length = 256, null = True, db_index = False, blank = True];
+     optional string subnet_id = 8 [help_text = "Neutron subnet id", max_length = 256, null = True, db_index = False, blank = True];
+     optional string gateway = 9 [db_index = False, max_length = 32, null = True, blank = True];
+     optional string segmentation_id = 10 [db_index = False, max_length = 32, null = True, blank = True];
+}
diff --git a/xos/genx/xprotos/core/controllerrole.xproto b/xos/genx/xprotos/core/controllerrole.xproto
new file mode 100644
index 0000000..b6cc629
--- /dev/null
+++ b/xos/genx/xprotos/core/controllerrole.xproto
@@ -0,0 +1,5 @@
+
+
+message ControllerRole {
+     required string role = 1 [choices = "(('admin', 'Admin'),)", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/controllersite.xproto b/xos/genx/xprotos/core/controllersite.xproto
new file mode 100644
index 0000000..b016012
--- /dev/null
+++ b/xos/genx/xprotos/core/controllersite.xproto
@@ -0,0 +1,7 @@
+
+
+message ControllerSite {
+     required manytoone site->Site:controllersite = 1 [db_index = True, null = False, blank = False];
+     optional manytoone controller->Controller:controllersite = 2 [db_index = True, null = True, blank = True];
+     optional string tenant_id = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "Keystone tenant id", null = True, db_index = True];
+}
diff --git a/xos/genx/xprotos/core/controllersiteprivilege.xproto b/xos/genx/xprotos/core/controllersiteprivilege.xproto
new file mode 100644
index 0000000..e1741e9
--- /dev/null
+++ b/xos/genx/xprotos/core/controllersiteprivilege.xproto
@@ -0,0 +1,7 @@
+
+
+message ControllerSitePrivilege {
+     required manytoone controller->Controller:controllersiteprivileges = 1 [db_index = True, null = False, blank = False];
+     required manytoone site_privilege->SitePrivilege:controllersiteprivileges = 2 [db_index = True, null = False, blank = False];
+     optional string role_id = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "Keystone id", null = True, db_index = True];
+}
diff --git a/xos/genx/xprotos/core/controllerslice.xproto b/xos/genx/xprotos/core/controllerslice.xproto
new file mode 100644
index 0000000..9df1311
--- /dev/null
+++ b/xos/genx/xprotos/core/controllerslice.xproto
@@ -0,0 +1,7 @@
+
+
+message ControllerSlice {
+     required manytoone controller->Controller:controllerslices = 1 [db_index = True, null = False, blank = False];
+     required manytoone slice->Slice:controllerslices = 2 [db_index = True, null = False, blank = False];
+     optional string tenant_id = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "Keystone tenant id", null = True, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/controllersliceprivilege.xproto b/xos/genx/xprotos/core/controllersliceprivilege.xproto
new file mode 100644
index 0000000..711e522
--- /dev/null
+++ b/xos/genx/xprotos/core/controllersliceprivilege.xproto
@@ -0,0 +1,7 @@
+
+
+message ControllerSlicePrivilege {
+     required manytoone controller->Controller:controllersliceprivileges = 1 [db_index = True, null = False, blank = False];
+     required manytoone slice_privilege->SlicePrivilege:controllersliceprivileges = 2 [db_index = True, null = False, blank = False];
+     optional string role_id = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "Keystone id", null = True, db_index = True];
+}
diff --git a/xos/genx/xprotos/core/controlleruser.xproto b/xos/genx/xprotos/core/controlleruser.xproto
new file mode 100644
index 0000000..49f4c99
--- /dev/null
+++ b/xos/genx/xprotos/core/controlleruser.xproto
@@ -0,0 +1,7 @@
+
+
+message ControllerUser {
+     required manytoone user->User:controllerusers = 1 [db_index = True, null = False, blank = False];
+     required manytoone controller->Controller:controllersusers = 2 [db_index = True, null = False, blank = False];
+     optional string kuser_id = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "Keystone user id", null = True, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/dashboardview.xproto b/xos/genx/xprotos/core/dashboardview.xproto
new file mode 100644
index 0000000..93b1bf7
--- /dev/null
+++ b/xos/genx/xprotos/core/dashboardview.xproto
@@ -0,0 +1,9 @@
+
+
+message DashboardView {
+     required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the View", null = False, db_index = False];
+     required string url = 2 [max_length = 1024, content_type = "stripped", blank = False, help_text = "URL of Dashboard", null = False, db_index = False];
+     required bool enabled = 3 [default = True, null = False, db_index = False, blank = True];
+     required string icon = 4 [default = "default-icon.png", max_length = 200, blank = False, help_text = "Icon for Dashboard", null = False, db_index = False];
+     required string icon_active = 5 [default = "default-icon-active.png", max_length = 200, blank = False, help_text = "Icon for active Dashboard", null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/deployment.xproto b/xos/genx/xprotos/core/deployment.xproto
new file mode 100644
index 0000000..85a0aa8
--- /dev/null
+++ b/xos/genx/xprotos/core/deployment.xproto
@@ -0,0 +1,6 @@
+
+
+message Deployment {
+     required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the Deployment", null = False, db_index = False];
+     required string accessControl = 2 [default = "allow all", max_length = 200, blank = False, help_text = "Access control list that specifies which sites/users may use nodes in this deployment", null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/deploymentprivilege.xproto b/xos/genx/xprotos/core/deploymentprivilege.xproto
new file mode 100644
index 0000000..034cc55
--- /dev/null
+++ b/xos/genx/xprotos/core/deploymentprivilege.xproto
@@ -0,0 +1,7 @@
+
+
+message DeploymentPrivilege {
+     required manytoone user->User:deploymentprivileges = 1 [db_index = True, null = False, blank = False];
+     required manytoone deployment->Deployment:deploymentprivileges = 2 [db_index = True, null = False, blank = False];
+     required manytoone role->DeploymentRole:deploymentprivileges = 3 [db_index = True, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/deploymentrole.xproto b/xos/genx/xprotos/core/deploymentrole.xproto
new file mode 100644
index 0000000..34f3970
--- /dev/null
+++ b/xos/genx/xprotos/core/deploymentrole.xproto
@@ -0,0 +1,5 @@
+
+
+message DeploymentRole {
+     required string role = 1 [choices = "(('admin', 'Admin'),)", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/diag.xproto b/xos/genx/xprotos/core/diag.xproto
new file mode 100644
index 0000000..3570e78
--- /dev/null
+++ b/xos/genx/xprotos/core/diag.xproto
@@ -0,0 +1,5 @@
+
+
+message Diag {
+     required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the synchronizer", null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/flavor.xproto b/xos/genx/xprotos/core/flavor.xproto
new file mode 100644
index 0000000..cf524ec
--- /dev/null
+++ b/xos/genx/xprotos/core/flavor.xproto
@@ -0,0 +1,9 @@
+
+
+message Flavor {
+     required string name = 1 [max_length = 32, content_type = "stripped", blank = False, help_text = "name of this flavor, as displayed to users", null = False, db_index = False];
+     optional string description = 2 [db_index = False, max_length = 1024, null = True, content_type = "stripped", blank = True];
+     required string flavor = 3 [max_length = 32, content_type = "stripped", blank = False, help_text = "flavor string used to configure deployments", null = False, db_index = False];
+     required int32 order = 4 [help_text = "used to order flavors when displayed in a list", default = 0, null = False, db_index = False, blank = False];
+     required bool default = 5 [help_text = "make this a default flavor to use when creating new instances", default = False, null = False, db_index = False, blank = True];
+}
diff --git a/xos/genx/xprotos/core/image.xproto b/xos/genx/xprotos/core/image.xproto
new file mode 100644
index 0000000..a25d5c7
--- /dev/null
+++ b/xos/genx/xprotos/core/image.xproto
@@ -0,0 +1,10 @@
+
+
+message Image {
+     required string name = 1 [db_index = False, max_length = 256, null = False, content_type = "stripped", blank = False];
+     required string kind = 2 [default = "vm", choices = "(('vm', 'Virtual Machine'), ('container', 'Container'))", max_length = 30, blank = False, null = False, db_index = False];
+     required string disk_format = 3 [db_index = False, max_length = 256, null = False, content_type = "stripped", blank = False];
+     required string container_format = 4 [db_index = False, max_length = 256, null = False, content_type = "stripped", blank = False];
+     optional string path = 5 [max_length = 256, content_type = "stripped", blank = True, help_text = "Path to image on local disk", null = True, db_index = False];
+     optional string tag = 6 [max_length = 256, content_type = "stripped", blank = True, help_text = "For Docker Images, tag of image", null = True, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/imagedeployments.xproto b/xos/genx/xprotos/core/imagedeployments.xproto
new file mode 100644
index 0000000..48b4e0e
--- /dev/null
+++ b/xos/genx/xprotos/core/imagedeployments.xproto
@@ -0,0 +1,6 @@
+
+
+message ImageDeployments {
+     required manytoone image->Image:imagedeployments = 1 [db_index = True, null = False, blank = False];
+     required manytoone deployment->Deployment:imagedeployments = 2 [db_index = True, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/instance.xproto b/xos/genx/xprotos/core/instance.xproto
new file mode 100644
index 0000000..9dbf715
--- /dev/null
+++ b/xos/genx/xprotos/core/instance.xproto
@@ -0,0 +1,20 @@
+
+
+message Instance {
+     optional string instance_id = 1 [max_length = 200, content_type = "stripped", blank = True, help_text = "Nova instance id", null = True, db_index = False];
+     optional string instance_uuid = 2 [max_length = 200, content_type = "stripped", blank = True, help_text = "Nova instance uuid", null = True, db_index = False];
+     required string name = 3 [max_length = 200, content_type = "stripped", blank = False, help_text = "Instance name", null = False, db_index = False];
+     optional string instance_name = 4 [max_length = 200, content_type = "stripped", blank = True, help_text = "OpenStack generated name", null = True, db_index = False];
+     optional string ip = 5 [max_length = 39, content_type = "ip", blank = True, help_text = "Instance ip address", null = True, db_index = False];
+     required manytoone image->Image:instances = 6 [db_index = True, null = False, blank = False];
+     optional manytoone creator->User:instances = 7 [db_index = True, null = True, blank = True];
+     required manytoone slice->Slice:instances = 8 [db_index = True, null = False, blank = False];
+     required manytoone deployment->Deployment:instance_deployment = 9 [db_index = True, null = False, blank = False];
+     required manytoone node->Node:instances = 10 [db_index = True, null = False, blank = False];
+     required int32 numberCores = 11 [help_text = "Number of cores for instance", default = 0, null = False, db_index = False, blank = False];
+     required manytoone flavor->Flavor:instance = 12 [help_text = "Flavor of this instance", default = "get_default_flavor()", null = False, db_index = True, blank = False];
+     optional string userData = 13 [help_text = "user_data passed to instance during creation", null = True, db_index = False, blank = True];
+     required string isolation = 14 [default = "vm", choices = "(('vm', 'Virtual Machine'), ('container', 'Container'), ('container_vm', 'Container In VM'))", max_length = 30, blank = False, null = False, db_index = False];
+     optional string volumes = 15 [help_text = "Comma-separated list of directories to expose to parent context", null = True, db_index = False, blank = True];
+     optional manytoone parent->Instance:instance = 16 [help_text = "Parent Instance for containers nested inside of VMs", null = True, db_index = True, blank = True];
+}
diff --git a/xos/genx/xprotos/core/invoice.xproto b/xos/genx/xprotos/core/invoice.xproto
new file mode 100644
index 0000000..fb9b886
--- /dev/null
+++ b/xos/genx/xprotos/core/invoice.xproto
@@ -0,0 +1,6 @@
+
+
+message Invoice {
+     required string date = 1 [db_index = False, null = False, content_type = "date", blank = False];
+     required manytoone account->Account:invoices = 2 [db_index = True, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/library.xproto b/xos/genx/xprotos/core/library.xproto
new file mode 100644
index 0000000..00b7f34
--- /dev/null
+++ b/xos/genx/xprotos/core/library.xproto
@@ -0,0 +1,10 @@
+
+
+message Library {
+     required manytoone xos->XOS:loadable_modules = 1 [help_text = "Pointer to XOS", default = "get_xos()", null = False, db_index = True, blank = False];
+     required string name = 2 [max_length = 30, content_type = "stripped", blank = False, help_text = "Service Name", null = False, db_index = False];
+     optional string base_url = 3 [max_length = 1024, content_type = "stripped", blank = True, help_text = "Base URL, allows use of relative URLs for resources", null = True, db_index = False];
+     optional string version = 4 [default = "1.0.0", max_length = 30, content_type = "stripped", blank = True, help_text = "Version of Service Controller", null = True, db_index = False];
+     optional string provides = 5 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of things provided", null = True, db_index = False];
+     optional string requires = 6 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of required Service Controllers", null = True, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/loadablemodule.xproto b/xos/genx/xprotos/core/loadablemodule.xproto
new file mode 100644
index 0000000..79fa8bd
--- /dev/null
+++ b/xos/genx/xprotos/core/loadablemodule.xproto
@@ -0,0 +1,10 @@
+
+
+message LoadableModule {
+     required manytoone xos->XOS:loadable_modules = 1 [help_text = "Pointer to XOS", default = "get_xos()", null = False, db_index = True, blank = False];
+     required string name = 2 [max_length = 30, content_type = "stripped", blank = False, help_text = "Service Name", null = False, db_index = False];
+     optional string base_url = 3 [max_length = 1024, content_type = "stripped", blank = True, help_text = "Base URL, allows use of relative URLs for resources", null = True, db_index = False];
+     optional string version = 4 [default = "1.0.0", max_length = 30, content_type = "stripped", blank = True, help_text = "Version of Service Controller", null = True, db_index = False];
+     optional string provides = 5 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of things provided", null = True, db_index = False];
+     optional string requires = 6 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of required Service Controllers", null = True, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/loadablemoduleresource.xproto b/xos/genx/xprotos/core/loadablemoduleresource.xproto
new file mode 100644
index 0000000..fabc4af
--- /dev/null
+++ b/xos/genx/xprotos/core/loadablemoduleresource.xproto
@@ -0,0 +1,10 @@
+
+
+message LoadableModuleResource {
+     required manytoone loadable_module->LoadableModule:loadable_module_resources = 1 [help_text = "The Loadable Module this resource is associated with", null = False, db_index = True, blank = False];
+     required string name = 2 [max_length = 30, content_type = "stripped", blank = False, help_text = "Object Name", null = False, db_index = False];
+     optional string subdirectory = 3 [max_length = 1024, content_type = "stripped", blank = True, help_text = "optional subdirectory", null = True, db_index = False];
+     required string kind = 4 [choices = "(('models', 'Models'), ('admin', 'Admin'), ('admin_template', 'Admin Template'), ('django_library', 'Django Library'), ('synchronizer', 'Synchronizer'), ('rest_service', 'REST API (service)'), ('rest_tenant', 'REST API (tenant)'), ('tosca_custom_types', 'Tosca Custom Types'), ('tosca_resource', 'Tosca Resource'), ('private_key', 'Private Key'), ('public_key', 'Public Key'), ('vendor_js', 'Vendor Javascript'))", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+     required string format = 5 [choices = "(('python', 'Python'), ('manifest', 'Manifest'), ('docker', 'Docker Container'), ('yaml', 'YAML'), ('raw', 'raw'), ('javascript', 'Javascript'))", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+     optional string url = 6 [max_length = 1024, content_type = "stripped", blank = True, help_text = "URL of resource", null = True, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/network.xproto b/xos/genx/xprotos/core/network.xproto
new file mode 100644
index 0000000..7eb3bcf
--- /dev/null
+++ b/xos/genx/xprotos/core/network.xproto
@@ -0,0 +1,21 @@
+
+
+message Network {
+     required string name = 1 [db_index = False, max_length = 32, null = False, blank = False];
+     required manytoone template->NetworkTemplate:network = 2 [db_index = True, null = False, blank = False];
+     required string subnet = 3 [db_index = False, max_length = 32, null = False, blank = True];
+     required string start_ip = 4 [db_index = False, max_length = 32, null = False, blank = True];
+     required string end_ip = 5 [db_index = False, max_length = 32, null = False, blank = True];
+     optional string ports = 6 [db_index = False, max_length = 1024, null = True, blank = True];
+     optional string labels = 7 [db_index = False, max_length = 1024, null = True, blank = True];
+     required manytoone owner->Slice:ownedNetworks = 8 [help_text = "Slice that owns control of this Network", null = False, db_index = True, blank = False];
+     required int32 guaranteed_bandwidth = 9 [default = 0, null = False, db_index = False, blank = False];
+     required bool permit_all_slices = 10 [default = False, null = False, db_index = False, blank = True];
+     optional string topology_parameters = 11 [db_index = False, null = True, blank = True];
+     optional string controller_url = 12 [db_index = False, max_length = 1024, null = True, blank = True];
+     optional string controller_parameters = 13 [db_index = False, null = True, blank = True];
+     optional string network_id = 14 [help_text = "Quantum network", max_length = 256, null = True, db_index = False, blank = True];
+     optional string router_id = 15 [help_text = "Quantum router id", max_length = 256, null = True, db_index = False, blank = True];
+     optional string subnet_id = 16 [help_text = "Quantum subnet id", max_length = 256, null = True, db_index = False, blank = True];
+     required bool autoconnect = 17 [help_text = "This network can be autoconnected to the slice that owns it", default = True, null = False, db_index = False, blank = True];
+}
diff --git a/xos/genx/xprotos/core/networkparameter.xproto b/xos/genx/xprotos/core/networkparameter.xproto
new file mode 100644
index 0000000..407ad03
--- /dev/null
+++ b/xos/genx/xprotos/core/networkparameter.xproto
@@ -0,0 +1,8 @@
+
+
+message NetworkParameter {
+     required manytoone parameter->NetworkParameterType:networkparameters = 1 [help_text = "The type of the parameter", null = False, db_index = True, blank = False];
+     required string value = 2 [help_text = "The value of this parameter", max_length = 1024, null = False, db_index = False, blank = False];
+     required manytoone content_type->ContentType:networkparameter = 3 [db_index = True, null = False, blank = False];
+     required uint32 object_id = 4 [db_index = False, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/networkparametertype.xproto b/xos/genx/xprotos/core/networkparametertype.xproto
new file mode 100644
index 0000000..2126749
--- /dev/null
+++ b/xos/genx/xprotos/core/networkparametertype.xproto
@@ -0,0 +1,6 @@
+
+
+message NetworkParameterType {
+     required string name = 1 [help_text = "The name of this parameter", max_length = 128, null = False, db_index = True, blank = False];
+     required string description = 2 [db_index = False, max_length = 1024, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/networkslice.xproto b/xos/genx/xprotos/core/networkslice.xproto
new file mode 100644
index 0000000..3d76ccf
--- /dev/null
+++ b/xos/genx/xprotos/core/networkslice.xproto
@@ -0,0 +1,6 @@
+
+
+message NetworkSlice {
+     required manytoone network->Network:networkslices = 1 [db_index = True, null = False, blank = False];
+     required manytoone slice->Slice:networkslices = 2 [db_index = True, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/networktemplate.xproto b/xos/genx/xprotos/core/networktemplate.xproto
new file mode 100644
index 0000000..2881598
--- /dev/null
+++ b/xos/genx/xprotos/core/networktemplate.xproto
@@ -0,0 +1,15 @@
+
+
+message NetworkTemplate {
+     required string name = 1 [db_index = False, max_length = 32, null = False, blank = False];
+     optional string description = 2 [db_index = False, max_length = 1024, null = True, blank = True];
+     required int32 guaranteed_bandwidth = 3 [default = 0, null = False, db_index = False, blank = False];
+     required string visibility = 4 [default = "private", choices = "(('public', 'public'), ('private', 'private'))", max_length = 30, blank = False, null = False, db_index = False];
+     required string translation = 5 [default = "none", choices = "(('none', 'none'), ('NAT', 'NAT'))", max_length = 30, blank = False, null = False, db_index = False];
+     optional string access = 6 [choices = "((None, 'None'), ('indirect', 'Indirect'), ('direct', 'Direct'))", max_length = 30, blank = True, help_text = "Advertise this network as a means for other slices to contact this slice", null = True, db_index = False];
+     optional string shared_network_name = 7 [db_index = False, max_length = 30, null = True, blank = True];
+     optional string shared_network_id = 8 [help_text = "Quantum network", max_length = 256, null = True, db_index = False, blank = True];
+     required string topology_kind = 9 [default = "bigswitch", choices = "(('bigswitch', 'BigSwitch'), ('physical', 'Physical'), ('custom', 'Custom'))", max_length = 30, blank = False, null = False, db_index = False];
+     optional string controller_kind = 10 [blank = True, max_length = 30, null = True, db_index = False, choices = "((None, 'None'), ('onos', 'ONOS'), ('custom', 'Custom'))"];
+     optional string vtn_kind = 11 [default = "PRIVATE", choices = "(('PRIVATE', 'Private'), ('PUBLIC', 'Public'), ('MANAGEMENT_LOCAL', 'Management Local'), ('MANAGEMENT_HOST', 'Management Host'), ('VSG', 'VSG'), ('ACCESS_AGENT', 'Access Agent'))", max_length = 30, blank = True, null = True, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/node.xproto b/xos/genx/xprotos/core/node.xproto
new file mode 100644
index 0000000..de2f393
--- /dev/null
+++ b/xos/genx/xprotos/core/node.xproto
@@ -0,0 +1,7 @@
+
+
+message Node {
+     required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the Node", null = False, db_index = False];
+     required manytoone site_deployment->SiteDeployment:nodes = 2 [db_index = True, null = False, blank = False];
+     optional manytoone site->Site:nodes = 3 [db_index = True, null = True, blank = True];
+}
diff --git a/xos/genx/xprotos/core/nodelabel.xproto b/xos/genx/xprotos/core/nodelabel.xproto
new file mode 100644
index 0000000..7b01be6
--- /dev/null
+++ b/xos/genx/xprotos/core/nodelabel.xproto
@@ -0,0 +1,5 @@
+
+
+message NodeLabel {
+     required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "label name", null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/payment.xproto b/xos/genx/xprotos/core/payment.xproto
new file mode 100644
index 0000000..28229a9
--- /dev/null
+++ b/xos/genx/xprotos/core/payment.xproto
@@ -0,0 +1,7 @@
+
+
+message Payment {
+     required manytoone account->Account:payments = 1 [db_index = True, null = False, blank = False];
+     required float amount = 2 [default = 0.0, null = False, db_index = False, blank = False];
+     required string date = 3 [default = "now()", null = False, db_index = False, content_type = "date", blank = False];
+}
diff --git a/xos/genx/xprotos/core/port.xproto b/xos/genx/xprotos/core/port.xproto
new file mode 100644
index 0000000..c07f41f
--- /dev/null
+++ b/xos/genx/xprotos/core/port.xproto
@@ -0,0 +1,10 @@
+
+
+message Port {
+     required manytoone network->Network:links = 1 [db_index = True, null = False, blank = False];
+     optional manytoone instance->Instance:ports = 2 [db_index = True, null = True, blank = True];
+     optional string ip = 3 [max_length = 39, content_type = "ip", blank = True, help_text = "Instance ip address", null = True, db_index = False];
+     optional string port_id = 4 [help_text = "Neutron port id", max_length = 256, null = True, db_index = False, blank = True];
+     optional string mac = 5 [help_text = "MAC address associated with this port", max_length = 256, null = True, db_index = False, blank = True];
+     required bool xos_created = 6 [default = False, null = False, db_index = False, blank = True];
+}
diff --git a/xos/genx/xprotos/core/program.xproto b/xos/genx/xprotos/core/program.xproto
new file mode 100644
index 0000000..5ae442a
--- /dev/null
+++ b/xos/genx/xprotos/core/program.xproto
@@ -0,0 +1,13 @@
+
+
+message Program {
+     required string name = 1 [max_length = 30, content_type = "stripped", blank = False, help_text = "Service Name", null = False, db_index = False];
+     optional string description = 2 [help_text = "Description of Service", max_length = 254, null = True, db_index = False, blank = True];
+     required string kind = 3 [choices = "(('tosca', 'Tosca'),)", max_length = 30, content_type = "stripped", blank = False, help_text = "Kind of service", null = False, db_index = False];
+     optional string command = 4 [choices = "(('run', 'Run'), ('destroy', 'Destroy'))", max_length = 30, content_type = "stripped", blank = True, help_text = "Command to run", null = True, db_index = False];
+     optional manytoone owner->User:programs = 5 [db_index = True, null = True, blank = False];
+     optional string contents = 6 [help_text = "Contents of Program", null = True, db_index = False, blank = True];
+     optional string output = 7 [help_text = "Output of Program", null = True, db_index = False, blank = True];
+     optional string messages = 8 [help_text = "Debug messages", null = True, db_index = False, blank = True];
+     optional string status = 9 [help_text = "Status of program", max_length = 30, null = True, db_index = False, blank = True];
+}
diff --git a/xos/genx/xprotos/core/project.xproto b/xos/genx/xprotos/core/project.xproto
new file mode 100644
index 0000000..10bc249
--- /dev/null
+++ b/xos/genx/xprotos/core/project.xproto
@@ -0,0 +1,5 @@
+
+
+message Project {
+     required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of Project", null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/protos.tar.gz b/xos/genx/xprotos/core/protos.tar.gz
new file mode 100644
index 0000000..31a3880
--- /dev/null
+++ b/xos/genx/xprotos/core/protos.tar.gz
Binary files differ
diff --git a/xos/genx/xprotos/core/reservation.xproto b/xos/genx/xprotos/core/reservation.xproto
new file mode 100644
index 0000000..8a02ee5
--- /dev/null
+++ b/xos/genx/xprotos/core/reservation.xproto
@@ -0,0 +1,7 @@
+
+
+message Reservation {
+     required string startTime = 1 [db_index = False, null = False, content_type = "date", blank = False];
+     required manytoone slice->Slice:reservations = 2 [db_index = True, null = False, blank = False];
+     required int32 duration = 3 [default = 1, null = False, db_index = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/reservedresource.xproto b/xos/genx/xprotos/core/reservedresource.xproto
new file mode 100644
index 0000000..78146b3
--- /dev/null
+++ b/xos/genx/xprotos/core/reservedresource.xproto
@@ -0,0 +1,8 @@
+
+
+message ReservedResource {
+     required manytoone instance->Instance:reservedresources = 1 [db_index = True, null = False, blank = False];
+     required manytoone resource->ServiceResource:reservedresources = 2 [db_index = True, null = False, blank = False];
+     required int32 quantity = 3 [default = 1, null = False, db_index = False, blank = False];
+     required manytoone reservationSet->Reservation:reservedresources = 4 [db_index = True, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/role.xproto b/xos/genx/xprotos/core/role.xproto
new file mode 100644
index 0000000..55a4ad1
--- /dev/null
+++ b/xos/genx/xprotos/core/role.xproto
@@ -0,0 +1,8 @@
+
+
+message Role {
+     required string role_type = 1 [db_index = False, max_length = 80, null = False, content_type = "stripped", blank = False];
+     optional string role = 2 [db_index = False, max_length = 80, null = True, content_type = "stripped", blank = True];
+     required string description = 3 [db_index = False, max_length = 120, null = False, content_type = "stripped", blank = False];
+     required manytoone content_type->ContentType:role = 4 [db_index = True, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/router.xproto b/xos/genx/xprotos/core/router.xproto
new file mode 100644
index 0000000..7ca796b
--- /dev/null
+++ b/xos/genx/xprotos/core/router.xproto
@@ -0,0 +1,6 @@
+
+
+message Router {
+     required string name = 1 [db_index = False, max_length = 32, null = False, blank = False];
+     required manytoone owner->Slice:routers = 2 [db_index = True, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/service.xproto b/xos/genx/xprotos/core/service.xproto
new file mode 100644
index 0000000..13a18f1
--- /dev/null
+++ b/xos/genx/xprotos/core/service.xproto
@@ -0,0 +1,17 @@
+
+
+message Service {
+     optional string description = 1 [help_text = "Description of Service", max_length = 254, null = True, db_index = False, blank = True];
+     required bool enabled = 2 [default = True, null = False, db_index = False, blank = True];
+     required string kind = 3 [default = "generic", max_length = 30, content_type = "stripped", blank = False, help_text = "Kind of service", null = False, db_index = False];
+     required string name = 4 [max_length = 30, content_type = "stripped", blank = False, help_text = "Service Name", null = False, db_index = False];
+     optional string versionNumber = 5 [max_length = 30, content_type = "stripped", blank = True, help_text = "Version of Service Definition", null = True, db_index = False];
+     required bool published = 6 [default = True, null = False, db_index = False, blank = True];
+     optional string view_url = 7 [db_index = False, max_length = 1024, null = True, content_type = "stripped", blank = True];
+     optional string icon_url = 8 [db_index = False, max_length = 1024, null = True, content_type = "stripped", blank = True];
+     optional string public_key = 9 [help_text = "Public key string", max_length = 1024, null = True, db_index = False, blank = True];
+     optional string private_key_fn = 10 [db_index = False, max_length = 1024, null = True, content_type = "stripped", blank = True];
+     optional string service_specific_id = 11 [db_index = False, max_length = 30, null = True, content_type = "stripped", blank = True];
+     optional string service_specific_attribute = 12 [db_index = False, null = True, blank = True];
+     optional manytoone controller->ServiceController:services = 13 [help_text = "The Service Controller this Service uses", null = True, db_index = True, blank = True];
+}
diff --git a/xos/genx/xprotos/core/serviceattribute.xproto b/xos/genx/xprotos/core/serviceattribute.xproto
new file mode 100644
index 0000000..5465c62
--- /dev/null
+++ b/xos/genx/xprotos/core/serviceattribute.xproto
@@ -0,0 +1,7 @@
+
+
+message ServiceAttribute {
+     required string name = 1 [help_text = "Attribute Name", max_length = 128, null = False, db_index = False, blank = False];
+     required string value = 2 [help_text = "Attribute Value", null = False, db_index = False, blank = False];
+     required manytoone service->Service:serviceattributes = 3 [help_text = "The Service this attribute is associated with", null = False, db_index = True, blank = False];
+}
diff --git a/xos/genx/xprotos/core/serviceclass.xproto b/xos/genx/xprotos/core/serviceclass.xproto
new file mode 100644
index 0000000..8b665dd
--- /dev/null
+++ b/xos/genx/xprotos/core/serviceclass.xproto
@@ -0,0 +1,10 @@
+
+
+message ServiceClass {
+     required string name = 1 [db_index = False, max_length = 32, null = False, content_type = "stripped", blank = False];
+     required string description = 2 [db_index = False, max_length = 255, null = False, content_type = "stripped", blank = False];
+     required int32 commitment = 3 [default = 365, null = False, db_index = False, blank = False];
+     required int32 membershipFee = 4 [default = 0, null = False, db_index = False, blank = False];
+     required int32 membershipFeeMonths = 5 [default = 12, null = False, db_index = False, blank = False];
+     required bool upgradeRequiresApproval = 6 [default = False, null = False, db_index = False, blank = True];
+}
diff --git a/xos/genx/xprotos/core/servicecontroller.xproto b/xos/genx/xprotos/core/servicecontroller.xproto
new file mode 100644
index 0000000..41cb54d
--- /dev/null
+++ b/xos/genx/xprotos/core/servicecontroller.xproto
@@ -0,0 +1,16 @@
+
+
+message ServiceController {
+     required manytoone xos->XOS:loadable_modules = 1 [help_text = "Pointer to XOS", default = "get_xos()", null = False, db_index = True, blank = False];
+     required string name = 2 [max_length = 30, content_type = "stripped", blank = False, help_text = "Service Name", null = False, db_index = False];
+     optional string base_url = 3 [max_length = 1024, content_type = "stripped", blank = True, help_text = "Base URL, allows use of relative URLs for resources", null = True, db_index = False];
+     optional string version = 4 [default = "1.0.0", max_length = 30, content_type = "stripped", blank = True, help_text = "Version of Service Controller", null = True, db_index = False];
+     optional string provides = 5 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of things provided", null = True, db_index = False];
+     optional string requires = 6 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of required Service Controllers", null = True, db_index = False];
+     optional string synchronizer_run = 7 [max_length = 1024, content_type = "stripped", blank = True, help_text = "synchronizer run command", null = True, db_index = False];
+     optional string synchronizer_config = 8 [max_length = 1024, content_type = "stripped", blank = True, help_text = "synchronizer config file", null = True, db_index = False];
+     optional string image = 9 [max_length = 200, content_type = "stripped", blank = True, help_text = "docker image name", null = True, db_index = False];
+     required bool no_start = 10 [help_text = "Do not start the Synchronizer", default = False, null = False, db_index = False, blank = True];
+     required bool no_build = 11 [help_text = "Do not build the Synchronizer container", default = False, null = False, db_index = False, blank = True];
+     required bool no_deploy = 12 [help_text = "Do not add synchronizer container to onboarding-docker-compose", default = False, null = False, db_index = False, blank = True];
+}
diff --git a/xos/genx/xprotos/core/servicedependency.xproto b/xos/genx/xprotos/core/servicedependency.xproto
new file mode 100644
index 0000000..07a170f
--- /dev/null
+++ b/xos/genx/xprotos/core/servicedependency.xproto
@@ -0,0 +1,15 @@
+
+
+message ServiceDependency {
+     optional string name = 1 [db_index = False, max_length = 200, null = True, content_type = "stripped", blank = True];
+     required string kind = 2 [default = "generic", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+     required manytoone provider_service->Service:provided_tenants = 3 [db_index = True, null = False, blank = False];
+     optional manytoone subscriber_service->Service:subscribed_tenants = 4 [db_index = True, null = True, blank = True];
+     optional manytoone subscriber_tenant->Tenant:subscribed_tenants = 5 [db_index = True, null = True, blank = True];
+     optional manytoone subscriber_user->User:subscribed_tenants = 6 [db_index = True, null = True, blank = True];
+     optional manytoone subscriber_root->TenantRoot:subscribed_tenants = 7 [db_index = True, null = True, blank = True];
+     optional manytoone subscriber_network->Network:subscribed_tenants = 8 [db_index = True, null = True, blank = True];
+     optional string service_specific_id = 9 [db_index = False, max_length = 30, null = True, content_type = "stripped", blank = True];
+     optional string service_specific_attribute = 10 [db_index = False, null = True, blank = True];
+     required string connect_method = 11 [default = "na", choices = "(('public', 'Public'), ('private', 'Private'), ('private-unidirectional', 'Private Unidirectional'), ('na', 'Not Applicable'))", max_length = 30, blank = False, null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/servicemonitoringagentinfo.xproto b/xos/genx/xprotos/core/servicemonitoringagentinfo.xproto
new file mode 100644
index 0000000..0636419
--- /dev/null
+++ b/xos/genx/xprotos/core/servicemonitoringagentinfo.xproto
@@ -0,0 +1,7 @@
+
+
+message ServiceMonitoringAgentInfo {
+     required string name = 1 [help_text = "Monitoring Agent Name", max_length = 128, null = False, db_index = False, blank = False];
+     optional manytoone service->Service:servicemonitoringagents = 2 [help_text = "The Service this attribute is associated with", null = True, db_index = True, blank = True];
+     required string target_uri = 3 [help_text = "Monitoring collector URI to be used by agents to publish the data", null = False, db_index = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/serviceprivilege.xproto b/xos/genx/xprotos/core/serviceprivilege.xproto
new file mode 100644
index 0000000..a6b130b
--- /dev/null
+++ b/xos/genx/xprotos/core/serviceprivilege.xproto
@@ -0,0 +1,7 @@
+
+
+message ServicePrivilege {
+     required manytoone user->User:serviceprivileges = 1 [db_index = True, null = False, blank = False];
+     required manytoone service->Service:serviceprivileges = 2 [db_index = True, null = False, blank = False];
+     required manytoone role->ServiceRole:serviceprivileges = 3 [db_index = True, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/serviceresource.xproto b/xos/genx/xprotos/core/serviceresource.xproto
new file mode 100644
index 0000000..fbd662b
--- /dev/null
+++ b/xos/genx/xprotos/core/serviceresource.xproto
@@ -0,0 +1,13 @@
+
+
+message ServiceResource {
+     required manytoone serviceClass->ServiceClass:serviceresources = 1 [db_index = True, null = False, blank = False];
+     required string name = 2 [db_index = False, max_length = 32, null = False, content_type = "stripped", blank = False];
+     required int32 maxUnitsDeployment = 3 [default = 1, null = False, db_index = False, blank = False];
+     required int32 maxUnitsNode = 4 [default = 1, null = False, db_index = False, blank = False];
+     required int32 maxDuration = 5 [default = 1, null = False, db_index = False, blank = False];
+     required int32 bucketInRate = 6 [default = 0, null = False, db_index = False, blank = False];
+     required int32 bucketMaxSize = 7 [default = 0, null = False, db_index = False, blank = False];
+     required int32 cost = 8 [default = 0, null = False, db_index = False, blank = False];
+     required bool calendarReservable = 9 [default = True, null = False, db_index = False, blank = True];
+}
diff --git a/xos/genx/xprotos/core/servicerole.xproto b/xos/genx/xprotos/core/servicerole.xproto
new file mode 100644
index 0000000..92cb5d4
--- /dev/null
+++ b/xos/genx/xprotos/core/servicerole.xproto
@@ -0,0 +1,5 @@
+
+
+message ServiceRole {
+     required string role = 1 [choices = "(('admin', 'Admin'),)", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/site.xproto b/xos/genx/xprotos/core/site.xproto
new file mode 100644
index 0000000..e525ce2
--- /dev/null
+++ b/xos/genx/xprotos/core/site.xproto
@@ -0,0 +1,14 @@
+
+
+message Site {
+     required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name for this Site", null = False, db_index = False];
+     optional string site_url = 2 [max_length = 512, content_type = "url", blank = True, help_text = "Site's Home URL Page", null = True, db_index = False];
+     required bool enabled = 3 [help_text = "Status for this Site", default = True, null = False, db_index = False, blank = True];
+     required bool hosts_nodes = 4 [help_text = "Indicates whether or not the site host nodes", default = True, null = False, db_index = False, blank = True];
+     required bool hosts_users = 5 [help_text = "Indicates whether or not the site manages user accounts", default = True, null = False, db_index = False, blank = True];
+     optional float longitude = 6 [db_index = False, null = True, blank = True];
+     optional float latitude = 7 [db_index = False, null = True, blank = True];
+     required string login_base = 8 [max_length = 50, content_type = "stripped", blank = False, help_text = "Prefix for Slices associated with this Site", null = False, db_index = False];
+     required bool is_public = 9 [help_text = "Indicates the visibility of this site to other members", default = True, null = False, db_index = False, blank = True];
+     required string abbreviated_name = 10 [db_index = False, max_length = 80, null = False, content_type = "stripped", blank = False];
+}
diff --git a/xos/genx/xprotos/core/sitecredential.xproto b/xos/genx/xprotos/core/sitecredential.xproto
new file mode 100644
index 0000000..44d74f3
--- /dev/null
+++ b/xos/genx/xprotos/core/sitecredential.xproto
@@ -0,0 +1,8 @@
+
+
+message SiteCredential {
+     required manytoone site->Site:sitecredentials = 1 [help_text = "The User this credential is associated with", null = False, db_index = True, blank = False];
+     required string name = 2 [help_text = "The credential type, e.g. ec2", max_length = 128, null = False, db_index = True, blank = False];
+     required string key_id = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "The backend id of this credential", null = False, db_index = False];
+     required string enc_value = 4 [help_text = "The key value of this credential", max_length = 1024, null = False, db_index = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/sitedeployment.xproto b/xos/genx/xprotos/core/sitedeployment.xproto
new file mode 100644
index 0000000..532b042
--- /dev/null
+++ b/xos/genx/xprotos/core/sitedeployment.xproto
@@ -0,0 +1,8 @@
+
+
+message SiteDeployment {
+     required manytoone site->Site:sitedeployments = 1 [db_index = True, null = False, blank = False];
+     required manytoone deployment->Deployment:sitedeployments = 2 [db_index = True, null = False, blank = False];
+     optional manytoone controller->Controller:sitedeployments = 3 [db_index = True, null = True, blank = True];
+     optional string availability_zone = 4 [max_length = 200, content_type = "stripped", blank = True, help_text = "OpenStack availability zone", null = True, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/siteprivilege.xproto b/xos/genx/xprotos/core/siteprivilege.xproto
new file mode 100644
index 0000000..4812f38
--- /dev/null
+++ b/xos/genx/xprotos/core/siteprivilege.xproto
@@ -0,0 +1,7 @@
+
+
+message SitePrivilege {
+     required manytoone user->User:siteprivileges = 1 [db_index = True, null = False, blank = False];
+     required manytoone site->Site:siteprivileges = 2 [db_index = True, null = False, blank = False];
+     required manytoone role->SiteRole:siteprivileges = 3 [db_index = True, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/siterole.xproto b/xos/genx/xprotos/core/siterole.xproto
new file mode 100644
index 0000000..1558503
--- /dev/null
+++ b/xos/genx/xprotos/core/siterole.xproto
@@ -0,0 +1,5 @@
+
+
+message SiteRole {
+     required string role = 1 [choices = "(('admin', 'Admin'), ('pi', 'PI'), ('tech', 'Tech'), ('billing', 'Billing'))", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/slice.xproto b/xos/genx/xprotos/core/slice.xproto
new file mode 100644
index 0000000..06bcdb0
--- /dev/null
+++ b/xos/genx/xprotos/core/slice.xproto
@@ -0,0 +1,21 @@
+
+
+message Slice {
+     required string name = 1 [max_length = 80, content_type = "stripped", blank = False, help_text = "The Name of the Slice", null = False, db_index = False];
+     required bool enabled = 2 [help_text = "Status for this Slice", default = True, null = False, db_index = False, blank = True];
+     required bool omf_friendly = 3 [default = False, null = False, db_index = False, blank = True];
+     required string description = 4 [help_text = "High level description of the slice and expected activities", max_length = 1024, null = False, db_index = False, blank = True];
+     required string slice_url = 5 [db_index = False, max_length = 512, null = False, content_type = "url", blank = True];
+     required manytoone site->Site:slices = 6 [help_text = "The Site this Slice belongs to", null = False, db_index = True, blank = False];
+     required int32 max_instances = 7 [default = 10, null = False, db_index = False, blank = False];
+     optional manytoone service->Service:slices = 8 [db_index = True, null = True, blank = True];
+     optional string network = 9 [blank = True, max_length = 256, null = True, db_index = False, choices = "((None, 'Default'), ('host', 'Host'), ('bridged', 'Bridged'), ('noauto', 'No Automatic Networks'))"];
+     optional string exposed_ports = 10 [db_index = False, max_length = 256, null = True, blank = True];
+     optional manytoone serviceClass->ServiceClass:slices = 11 [db_index = True, null = True, blank = True];
+     optional manytoone creator->User:slices = 12 [db_index = True, null = True, blank = True];
+     optional manytoone default_flavor->Flavor:slices = 13 [db_index = True, null = True, blank = True];
+     optional manytoone default_image->Image:slices = 14 [db_index = True, null = True, blank = True];
+     optional manytoone default_node->Node:slices = 15 [db_index = True, null = True, blank = True];
+     optional string mount_data_sets = 16 [default = "GenBank", max_length = 256, content_type = "stripped", blank = True, null = True, db_index = False];
+     required string default_isolation = 17 [default = "vm", choices = "(('vm', 'Virtual Machine'), ('container', 'Container'), ('container_vm', 'Container In VM'))", max_length = 30, blank = False, null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/slicecredential.xproto b/xos/genx/xprotos/core/slicecredential.xproto
new file mode 100644
index 0000000..31ce074
--- /dev/null
+++ b/xos/genx/xprotos/core/slicecredential.xproto
@@ -0,0 +1,8 @@
+
+
+message SliceCredential {
+     required manytoone slice->Slice:slicecredentials = 1 [help_text = "The User this credential is associated with", null = False, db_index = True, blank = False];
+     required string name = 2 [help_text = "The credential type, e.g. ec2", max_length = 128, null = False, db_index = True, blank = False];
+     required string key_id = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "The backend id of this credential", null = False, db_index = False];
+     required string enc_value = 4 [help_text = "The key value of this credential", max_length = 1024, null = False, db_index = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/sliceprivilege.xproto b/xos/genx/xprotos/core/sliceprivilege.xproto
new file mode 100644
index 0000000..4189a1a
--- /dev/null
+++ b/xos/genx/xprotos/core/sliceprivilege.xproto
@@ -0,0 +1,7 @@
+
+
+message SlicePrivilege {
+     required manytoone user->User:sliceprivileges = 1 [db_index = True, null = False, blank = False];
+     required manytoone slice->Slice:sliceprivileges = 2 [db_index = True, null = False, blank = False];
+     required manytoone role->SliceRole:sliceprivileges = 3 [db_index = True, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/slicerole.xproto b/xos/genx/xprotos/core/slicerole.xproto
new file mode 100644
index 0000000..7a9d941
--- /dev/null
+++ b/xos/genx/xprotos/core/slicerole.xproto
@@ -0,0 +1,5 @@
+
+
+message SliceRole {
+     required string role = 1 [choices = "(('admin', 'Admin'), ('default', 'Default'))", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/slicetag.xproto b/xos/genx/xprotos/core/slicetag.xproto
new file mode 100644
index 0000000..60ce38b
--- /dev/null
+++ b/xos/genx/xprotos/core/slicetag.xproto
@@ -0,0 +1,7 @@
+
+
+message SliceTag {
+     required manytoone slice->Slice:slicetags = 1 [db_index = True, null = False, blank = False];
+     required string name = 2 [choices = "(('privatekey', 'Private Key'), ('publickey', 'Public Key'))", max_length = 30, content_type = "stripped", blank = False, help_text = "The name of this tag", null = False, db_index = False];
+     required string value = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "The value of this tag", null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/tag.xproto b/xos/genx/xprotos/core/tag.xproto
new file mode 100644
index 0000000..088c32d
--- /dev/null
+++ b/xos/genx/xprotos/core/tag.xproto
@@ -0,0 +1,9 @@
+
+
+message Tag {
+     required manytoone service->Service:tags = 1 [help_text = "The Service this Tag is associated with", null = False, db_index = True, blank = False];
+     required string name = 2 [help_text = "The name of this tag", max_length = 128, null = False, db_index = True, blank = False];
+     required string value = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "The value of this tag", null = False, db_index = False];
+     required manytoone content_type->ContentType:tag = 4 [db_index = True, null = False, blank = False];
+     required uint32 object_id = 5 [db_index = False, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/tenant.xproto b/xos/genx/xprotos/core/tenant.xproto
new file mode 100644
index 0000000..daa9da9
--- /dev/null
+++ b/xos/genx/xprotos/core/tenant.xproto
@@ -0,0 +1,15 @@
+
+
+message Tenant {
+     optional string name = 1 [db_index = False, max_length = 200, null = True, content_type = "stripped", blank = True];
+     required string kind = 2 [default = "generic", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+     required manytoone provider_service->Service:provided_tenants = 3 [db_index = True, null = False, blank = False];
+     optional manytoone subscriber_service->Service:subscribed_tenants = 4 [db_index = True, null = True, blank = True];
+     optional manytoone subscriber_tenant->Tenant:subscribed_tenants = 5 [db_index = True, null = True, blank = True];
+     optional manytoone subscriber_user->User:subscribed_tenants = 6 [db_index = True, null = True, blank = True];
+     optional manytoone subscriber_root->TenantRoot:subscribed_tenants = 7 [db_index = True, null = True, blank = True];
+     optional manytoone subscriber_network->Network:subscribed_tenants = 8 [db_index = True, null = True, blank = True];
+     optional string service_specific_id = 9 [db_index = False, max_length = 30, null = True, content_type = "stripped", blank = True];
+     optional string service_specific_attribute = 10 [db_index = False, null = True, blank = True];
+     required string connect_method = 11 [default = "na", choices = "(('public', 'Public'), ('private', 'Private'), ('private-unidirectional', 'Private Unidirectional'), ('na', 'Not Applicable'))", max_length = 30, blank = False, null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/tenantattribute.xproto b/xos/genx/xprotos/core/tenantattribute.xproto
new file mode 100644
index 0000000..a71a783
--- /dev/null
+++ b/xos/genx/xprotos/core/tenantattribute.xproto
@@ -0,0 +1,7 @@
+
+
+message TenantAttribute {
+     required string name = 1 [help_text = "Attribute Name", max_length = 128, null = False, db_index = False, blank = False];
+     required string value = 2 [help_text = "Attribute Value", null = False, db_index = False, blank = False];
+     required manytoone tenant->Tenant:tenantattributes = 3 [help_text = "The Tenant this attribute is associated with", null = False, db_index = True, blank = False];
+}
diff --git a/xos/genx/xprotos/core/tenantprivilege.xproto b/xos/genx/xprotos/core/tenantprivilege.xproto
new file mode 100644
index 0000000..af15f33
--- /dev/null
+++ b/xos/genx/xprotos/core/tenantprivilege.xproto
@@ -0,0 +1,7 @@
+
+
+message TenantPrivilege {
+     required manytoone user->User:tenantprivileges = 1 [db_index = True, null = False, blank = False];
+     required manytoone tenant->Tenant:tenantprivileges = 2 [db_index = True, null = False, blank = False];
+     required manytoone role->TenantRole:tenantprivileges = 3 [db_index = True, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/tenantrole.xproto b/xos/genx/xprotos/core/tenantrole.xproto
new file mode 100644
index 0000000..bb427a9
--- /dev/null
+++ b/xos/genx/xprotos/core/tenantrole.xproto
@@ -0,0 +1,5 @@
+
+
+message TenantRole {
+     required string role = 1 [choices = "(('admin', 'Admin'), ('access', 'Access'))", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/tenantroot.xproto b/xos/genx/xprotos/core/tenantroot.xproto
new file mode 100644
index 0000000..eab7052
--- /dev/null
+++ b/xos/genx/xprotos/core/tenantroot.xproto
@@ -0,0 +1,8 @@
+
+
+message TenantRoot {
+     required string kind = 1 [default = "generic", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+     optional string name = 2 [max_length = 255, content_type = "stripped", blank = True, help_text = "name", null = True, db_index = False];
+     optional string service_specific_attribute = 3 [db_index = False, null = True, blank = True];
+     optional string service_specific_id = 4 [db_index = False, max_length = 30, null = True, content_type = "stripped", blank = True];
+}
diff --git a/xos/genx/xprotos/core/tenantrootprivilege.xproto b/xos/genx/xprotos/core/tenantrootprivilege.xproto
new file mode 100644
index 0000000..baf419a
--- /dev/null
+++ b/xos/genx/xprotos/core/tenantrootprivilege.xproto
@@ -0,0 +1,7 @@
+
+
+message TenantRootPrivilege {
+     required manytoone user->User:tenant_root_privileges = 1 [db_index = True, null = False, blank = False];
+     required manytoone tenant_root->TenantRoot:tenant_root_privileges = 2 [db_index = True, null = False, blank = False];
+     required manytoone role->TenantRootRole:tenant_root_privileges = 3 [db_index = True, null = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/tenantrootrole.xproto b/xos/genx/xprotos/core/tenantrootrole.xproto
new file mode 100644
index 0000000..26798ab
--- /dev/null
+++ b/xos/genx/xprotos/core/tenantrootrole.xproto
@@ -0,0 +1,5 @@
+
+
+message TenantRootRole {
+     required string role = 1 [choices = "(('admin', 'Admin'), ('access', 'Access'))", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/tenantwithcontainer.xproto b/xos/genx/xprotos/core/tenantwithcontainer.xproto
new file mode 100644
index 0000000..78312d6
--- /dev/null
+++ b/xos/genx/xprotos/core/tenantwithcontainer.xproto
@@ -0,0 +1,19 @@
+
+
+message TenantWithContainer {
+     optional string name = 1 [db_index = False, max_length = 200, null = True, content_type = "stripped", blank = True];
+     required string kind = 2 [default = "generic", max_length = 30, content_type = "stripped", blank = False, null = False, db_index = False];
+     required manytoone provider_service->Service:provided_tenants = 3 [db_index = True, null = False, blank = False];
+     optional manytoone subscriber_service->Service:subscribed_tenants = 4 [db_index = True, null = True, blank = True];
+     optional manytoone subscriber_tenant->Tenant:subscribed_tenants = 5 [db_index = True, null = True, blank = True];
+     optional manytoone subscriber_user->User:subscribed_tenants = 6 [db_index = True, null = True, blank = True];
+     optional manytoone subscriber_root->TenantRoot:subscribed_tenants = 7 [db_index = True, null = True, blank = True];
+     optional manytoone subscriber_network->Network:subscribed_tenants = 8 [db_index = True, null = True, blank = True];
+     optional string service_specific_id = 9 [db_index = False, max_length = 30, null = True, content_type = "stripped", blank = True];
+     optional string service_specific_attribute = 10 [db_index = False, null = True, blank = True];
+     required string connect_method = 11 [default = "na", choices = "(('public', 'Public'), ('private', 'Private'), ('private-unidirectional', 'Private Unidirectional'), ('na', 'Not Applicable'))", max_length = 30, blank = False, null = False, db_index = False];
+     optional manytoone instance->Instance:+ = 12 [help_text = "Instance used by this Tenant", null = True, db_index = True, blank = True];
+     optional manytoone creator->User:+ = 13 [help_text = "Creator of this Tenant", null = True, db_index = True, blank = True];
+     optional string external_hostname = 14 [max_length = 30, content_type = "stripped", blank = True, help_text = "External host name", null = True, db_index = False];
+     optional string external_container = 15 [max_length = 30, content_type = "stripped", blank = True, help_text = "External host name", null = True, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/usableobject.xproto b/xos/genx/xprotos/core/usableobject.xproto
new file mode 100644
index 0000000..6bff808
--- /dev/null
+++ b/xos/genx/xprotos/core/usableobject.xproto
@@ -0,0 +1,5 @@
+
+
+message UsableObject {
+     required string name = 1 [db_index = False, max_length = 1024, null = False, content_type = "stripped", blank = False];
+}
diff --git a/xos/genx/xprotos/core/user.xproto b/xos/genx/xprotos/core/user.xproto
new file mode 100644
index 0000000..006b67c
--- /dev/null
+++ b/xos/genx/xprotos/core/user.xproto
@@ -0,0 +1,22 @@
+
+
+message User {
+     required string password = 1 [db_index = False, max_length = 128, null = False, blank = False];
+     optional string last_login = 2 [db_index = False, null = True, content_type = "date", blank = True];
+     required string email = 3 [db_index = True, max_length = 255, null = False, blank = False];
+     required string username = 4 [default = "Something", max_length = 255, content_type = "stripped", blank = False, null = False, db_index = False];
+     required string firstname = 5 [max_length = 200, content_type = "stripped", blank = False, help_text = "person's given name", null = False, db_index = False];
+     required string lastname = 6 [max_length = 200, content_type = "stripped", blank = False, help_text = "person's surname", null = False, db_index = False];
+     optional string phone = 7 [max_length = 100, content_type = "stripped", blank = True, help_text = "phone number contact", null = True, db_index = False];
+     optional string user_url = 8 [db_index = False, max_length = 200, null = True, content_type = "url", blank = True];
+     required manytoone site->Site:users = 9 [help_text = "Site this user will be homed too", null = False, db_index = True, blank = False];
+     optional string public_key = 10 [help_text = "Public key string", max_length = 1024, null = True, db_index = False, blank = True];
+     required bool is_active = 11 [default = True, null = False, db_index = False, blank = True];
+     required bool is_admin = 12 [default = False, null = False, db_index = False, blank = True];
+     required bool is_staff = 13 [default = True, null = False, db_index = False, blank = True];
+     required bool is_readonly = 14 [default = False, null = False, db_index = False, blank = True];
+     required bool is_registering = 15 [default = False, null = False, db_index = False, blank = True];
+     required bool is_appuser = 16 [default = False, null = False, db_index = False, blank = True];
+     optional string login_page = 17 [max_length = 200, content_type = "stripped", blank = True, help_text = "send this user to a specific page on login", null = True, db_index = False];
+     required string timezone = 18 [default = "America/New_York", choices = "[('Pacific/Midway', '(GMT-1100) Pacific/Midway'), ('Pacific/Niue', '(GMT-1100) Pacific/Niue'), ('Pacific/Pago_Pago', '(GMT-1100) Pacific/Pago_Pago'), ('Pacific/Honolulu', '(GMT-1000) Pacific/Honolulu'), ('Pacific/Johnston', '(GMT-1000) Pacific/Johnston'), ('Pacific/Rarotonga', '(GMT-1000) Pacific/Rarotonga'), ('Pacific/Tahiti', '(GMT-1000) Pacific/Tahiti'), ('US/Hawaii', '(GMT-1000) US/Hawaii'), ('Pacific/Marquesas', '(GMT-0930) Pacific/Marquesas'), ('America/Adak', '(GMT-0900) America/Adak'), ('Pacific/Gambier', '(GMT-0900) Pacific/Gambier'), ('America/Anchorage', '(GMT-0800) America/Anchorage'), ('America/Juneau', '(GMT-0800) America/Juneau'), ('America/Metlakatla', '(GMT-0800) America/Metlakatla'), ('America/Nome', '(GMT-0800) America/Nome'), ('America/Sitka', '(GMT-0800) America/Sitka'), ('America/Yakutat', '(GMT-0800) America/Yakutat'), ('Pacific/Pitcairn', '(GMT-0800) Pacific/Pitcairn'), ('US/Alaska', '(GMT-0800) US/Alaska'), ('America/Chihuahua', '(GMT-0700) America/Chihuahua'), ('America/Creston', '(GMT-0700) America/Creston'), ('America/Dawson', '(GMT-0700) America/Dawson'), ('America/Dawson_Creek', '(GMT-0700) America/Dawson_Creek'), ('America/Fort_Nelson', '(GMT-0700) America/Fort_Nelson'), ('America/Hermosillo', '(GMT-0700) America/Hermosillo'), ('America/Los_Angeles', '(GMT-0700) America/Los_Angeles'), ('America/Mazatlan', '(GMT-0700) America/Mazatlan'), ('America/Phoenix', '(GMT-0700) America/Phoenix'), ('America/Tijuana', '(GMT-0700) America/Tijuana'), ('America/Vancouver', '(GMT-0700) America/Vancouver'), ('America/Whitehorse', '(GMT-0700) America/Whitehorse'), ('Canada/Pacific', '(GMT-0700) Canada/Pacific'), ('US/Arizona', '(GMT-0700) US/Arizona'), ('US/Pacific', '(GMT-0700) US/Pacific'), ('America/Bahia_Banderas', '(GMT-0600) America/Bahia_Banderas'), ('America/Belize', '(GMT-0600) America/Belize'), ('America/Boise', '(GMT-0600) America/Boise'), ('America/Cambridge_Bay', '(GMT-0600) America/Cambridge_Bay'), ('America/Costa_Rica', '(GMT-0600) America/Costa_Rica'), ('America/Denver', '(GMT-0600) America/Denver'), ('America/Edmonton', '(GMT-0600) America/Edmonton'), ('America/El_Salvador', '(GMT-0600) America/El_Salvador'), ('America/Guatemala', '(GMT-0600) America/Guatemala'), ('America/Inuvik', '(GMT-0600) America/Inuvik'), ('America/Managua', '(GMT-0600) America/Managua'), ('America/Merida', '(GMT-0600) America/Merida'), ('America/Mexico_City', '(GMT-0600) America/Mexico_City'), ('America/Monterrey', '(GMT-0600) America/Monterrey'), ('America/Ojinaga', '(GMT-0600) America/Ojinaga'), ('America/Regina', '(GMT-0600) America/Regina'), ('America/Swift_Current', '(GMT-0600) America/Swift_Current'), ('America/Tegucigalpa', '(GMT-0600) America/Tegucigalpa'), ('America/Yellowknife', '(GMT-0600) America/Yellowknife'), ('Canada/Mountain', '(GMT-0600) Canada/Mountain'), ('Pacific/Galapagos', '(GMT-0600) Pacific/Galapagos'), ('US/Mountain', '(GMT-0600) US/Mountain'), ('America/Atikokan', '(GMT-0500) America/Atikokan'), ('America/Bogota', '(GMT-0500) America/Bogota'), ('America/Cancun', '(GMT-0500) America/Cancun'), ('America/Cayman', '(GMT-0500) America/Cayman'), ('America/Chicago', '(GMT-0500) America/Chicago'), ('America/Eirunepe', '(GMT-0500) America/Eirunepe'), ('America/Guayaquil', '(GMT-0500) America/Guayaquil'), ('America/Indiana/Knox', '(GMT-0500) America/Indiana/Knox'), ('America/Indiana/Tell_City', '(GMT-0500) America/Indiana/Tell_City'), ('America/Jamaica', '(GMT-0500) America/Jamaica'), ('America/Lima', '(GMT-0500) America/Lima'), ('America/Matamoros', '(GMT-0500) America/Matamoros'), ('America/Menominee', '(GMT-0500) America/Menominee'), ('America/North_Dakota/Beulah', '(GMT-0500) America/North_Dakota/Beulah'), ('America/North_Dakota/Center', '(GMT-0500) America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', '(GMT-0500) America/North_Dakota/New_Salem'), ('America/Panama', '(GMT-0500) America/Panama'), ('America/Port-au-Prince', '(GMT-0500) America/Port-au-Prince'), ('America/Rainy_River', '(GMT-0500) America/Rainy_River'), ('America/Rankin_Inlet', '(GMT-0500) America/Rankin_Inlet'), ('America/Resolute', '(GMT-0500) America/Resolute'), ('America/Rio_Branco', '(GMT-0500) America/Rio_Branco'), ('America/Winnipeg', '(GMT-0500) America/Winnipeg'), ('Canada/Central', '(GMT-0500) Canada/Central'), ('Pacific/Easter', '(GMT-0500) Pacific/Easter'), ('US/Central', '(GMT-0500) US/Central'), ('America/Anguilla', '(GMT-0400) America/Anguilla'), ('America/Antigua', '(GMT-0400) America/Antigua'), ('America/Aruba', '(GMT-0400) America/Aruba'), ('America/Asuncion', '(GMT-0400) America/Asuncion'), ('America/Barbados', '(GMT-0400) America/Barbados'), ('America/Blanc-Sablon', '(GMT-0400) America/Blanc-Sablon'), ('America/Boa_Vista', '(GMT-0400) America/Boa_Vista'), ('America/Campo_Grande', '(GMT-0400) America/Campo_Grande'), ('America/Caracas', '(GMT-0400) America/Caracas'), ('America/Cuiaba', '(GMT-0400) America/Cuiaba'), ('America/Curacao', '(GMT-0400) America/Curacao'), ('America/Detroit', '(GMT-0400) America/Detroit'), ('America/Dominica', '(GMT-0400) America/Dominica'), ('America/Grand_Turk', '(GMT-0400) America/Grand_Turk'), ('America/Grenada', '(GMT-0400) America/Grenada'), ('America/Guadeloupe', '(GMT-0400) America/Guadeloupe'), ('America/Guyana', '(GMT-0400) America/Guyana'), ('America/Havana', '(GMT-0400) America/Havana'), ('America/Indiana/Indianapolis', '(GMT-0400) America/Indiana/Indianapolis'), ('America/Indiana/Marengo', '(GMT-0400) America/Indiana/Marengo'), ('America/Indiana/Petersburg', '(GMT-0400) America/Indiana/Petersburg'), ('America/Indiana/Vevay', '(GMT-0400) America/Indiana/Vevay'), ('America/Indiana/Vincennes', '(GMT-0400) America/Indiana/Vincennes'), ('America/Indiana/Winamac', '(GMT-0400) America/Indiana/Winamac'), ('America/Iqaluit', '(GMT-0400) America/Iqaluit'), ('America/Kentucky/Louisville', '(GMT-0400) America/Kentucky/Louisville'), ('America/Kentucky/Monticello', '(GMT-0400) America/Kentucky/Monticello'), ('America/Kralendijk', '(GMT-0400) America/Kralendijk'), ('America/La_Paz', '(GMT-0400) America/La_Paz'), ('America/Lower_Princes', '(GMT-0400) America/Lower_Princes'), ('America/Manaus', '(GMT-0400) America/Manaus'), ('America/Marigot', '(GMT-0400) America/Marigot'), ('America/Martinique', '(GMT-0400) America/Martinique'), ('America/Montserrat', '(GMT-0400) America/Montserrat'), ('America/Nassau', '(GMT-0400) America/Nassau'), ('America/New_York', '(GMT-0400) America/New_York'), ('America/Nipigon', '(GMT-0400) America/Nipigon'), ('America/Pangnirtung', '(GMT-0400) America/Pangnirtung'), ('America/Port_of_Spain', '(GMT-0400) America/Port_of_Spain'), ('America/Porto_Velho', '(GMT-0400) America/Porto_Velho'), ('America/Puerto_Rico', '(GMT-0400) America/Puerto_Rico'), ('America/Santo_Domingo', '(GMT-0400) America/Santo_Domingo'), ('America/St_Barthelemy', '(GMT-0400) America/St_Barthelemy'), ('America/St_Kitts', '(GMT-0400) America/St_Kitts'), ('America/St_Lucia', '(GMT-0400) America/St_Lucia'), ('America/St_Thomas', '(GMT-0400) America/St_Thomas'), ('America/St_Vincent', '(GMT-0400) America/St_Vincent'), ('America/Thunder_Bay', '(GMT-0400) America/Thunder_Bay'), ('America/Toronto', '(GMT-0400) America/Toronto'), ('America/Tortola', '(GMT-0400) America/Tortola'), ('Canada/Eastern', '(GMT-0400) Canada/Eastern'), ('US/Eastern', '(GMT-0400) US/Eastern'), ('America/Araguaina', '(GMT-0300) America/Araguaina'), ('America/Argentina/Buenos_Aires', '(GMT-0300) America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', '(GMT-0300) America/Argentina/Catamarca'), ('America/Argentina/Cordoba', '(GMT-0300) America/Argentina/Cordoba'), ('America/Argentina/Jujuy', '(GMT-0300) America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', '(GMT-0300) America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', '(GMT-0300) America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', '(GMT-0300) America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', '(GMT-0300) America/Argentina/Salta'), ('America/Argentina/San_Juan', '(GMT-0300) America/Argentina/San_Juan'), ('America/Argentina/San_Luis', '(GMT-0300) America/Argentina/San_Luis'), ('America/Argentina/Tucuman', '(GMT-0300) America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', '(GMT-0300) America/Argentina/Ushuaia'), ('America/Bahia', '(GMT-0300) America/Bahia'), ('America/Belem', '(GMT-0300) America/Belem'), ('America/Cayenne', '(GMT-0300) America/Cayenne'), ('America/Fortaleza', '(GMT-0300) America/Fortaleza'), ('America/Glace_Bay', '(GMT-0300) America/Glace_Bay'), ('America/Goose_Bay', '(GMT-0300) America/Goose_Bay'), ('America/Halifax', '(GMT-0300) America/Halifax'), ('America/Maceio', '(GMT-0300) America/Maceio'), ('America/Moncton', '(GMT-0300) America/Moncton'), ('America/Montevideo', '(GMT-0300) America/Montevideo'), ('America/Paramaribo', '(GMT-0300) America/Paramaribo'), ('America/Recife', '(GMT-0300) America/Recife'), ('America/Santarem', '(GMT-0300) America/Santarem'), ('America/Santiago', '(GMT-0300) America/Santiago'), ('America/Sao_Paulo', '(GMT-0300) America/Sao_Paulo'), ('America/Thule', '(GMT-0300) America/Thule'), ('Antarctica/Palmer', '(GMT-0300) Antarctica/Palmer'), ('Antarctica/Rothera', '(GMT-0300) Antarctica/Rothera'), ('Atlantic/Bermuda', '(GMT-0300) Atlantic/Bermuda'), ('Atlantic/Stanley', '(GMT-0300) Atlantic/Stanley'), ('Canada/Atlantic', '(GMT-0300) Canada/Atlantic'), ('America/St_Johns', '(GMT-0230) America/St_Johns'), ('Canada/Newfoundland', '(GMT-0230) Canada/Newfoundland'), ('America/Godthab', '(GMT-0200) America/Godthab'), ('America/Miquelon', '(GMT-0200) America/Miquelon'), ('America/Noronha', '(GMT-0200) America/Noronha'), ('Atlantic/South_Georgia', '(GMT-0200) Atlantic/South_Georgia'), ('Atlantic/Cape_Verde', '(GMT-0100) Atlantic/Cape_Verde'), ('Africa/Abidjan', '(GMT+0000) Africa/Abidjan'), ('Africa/Accra', '(GMT+0000) Africa/Accra'), ('Africa/Bamako', '(GMT+0000) Africa/Bamako'), ('Africa/Banjul', '(GMT+0000) Africa/Banjul'), ('Africa/Bissau', '(GMT+0000) Africa/Bissau'), ('Africa/Conakry', '(GMT+0000) Africa/Conakry'), ('Africa/Dakar', '(GMT+0000) Africa/Dakar'), ('Africa/Freetown', '(GMT+0000) Africa/Freetown'), ('Africa/Lome', '(GMT+0000) Africa/Lome'), ('Africa/Monrovia', '(GMT+0000) Africa/Monrovia'), ('Africa/Nouakchott', '(GMT+0000) Africa/Nouakchott'), ('Africa/Ouagadougou', '(GMT+0000) Africa/Ouagadougou'), ('Africa/Sao_Tome', '(GMT+0000) Africa/Sao_Tome'), ('America/Danmarkshavn', '(GMT+0000) America/Danmarkshavn'), ('America/Scoresbysund', '(GMT+0000) America/Scoresbysund'), ('Atlantic/Azores', '(GMT+0000) Atlantic/Azores'), ('Atlantic/Reykjavik', '(GMT+0000) Atlantic/Reykjavik'), ('Atlantic/St_Helena', '(GMT+0000) Atlantic/St_Helena'), ('GMT', '(GMT+0000) GMT'), ('UTC', '(GMT+0000) UTC'), ('Africa/Algiers', '(GMT+0100) Africa/Algiers'), ('Africa/Bangui', '(GMT+0100) Africa/Bangui'), ('Africa/Brazzaville', '(GMT+0100) Africa/Brazzaville'), ('Africa/Casablanca', '(GMT+0100) Africa/Casablanca'), ('Africa/Douala', '(GMT+0100) Africa/Douala'), ('Africa/El_Aaiun', '(GMT+0100) Africa/El_Aaiun'), ('Africa/Kinshasa', '(GMT+0100) Africa/Kinshasa'), ('Africa/Lagos', '(GMT+0100) Africa/Lagos'), ('Africa/Libreville', '(GMT+0100) Africa/Libreville'), ('Africa/Luanda', '(GMT+0100) Africa/Luanda'), ('Africa/Malabo', '(GMT+0100) Africa/Malabo'), ('Africa/Ndjamena', '(GMT+0100) Africa/Ndjamena'), ('Africa/Niamey', '(GMT+0100) Africa/Niamey'), ('Africa/Porto-Novo', '(GMT+0100) Africa/Porto-Novo'), ('Africa/Tunis', '(GMT+0100) Africa/Tunis'), ('Atlantic/Canary', '(GMT+0100) Atlantic/Canary'), ('Atlantic/Faroe', '(GMT+0100) Atlantic/Faroe'), ('Atlantic/Madeira', '(GMT+0100) Atlantic/Madeira'), ('Europe/Dublin', '(GMT+0100) Europe/Dublin'), ('Europe/Guernsey', '(GMT+0100) Europe/Guernsey'), ('Europe/Isle_of_Man', '(GMT+0100) Europe/Isle_of_Man'), ('Europe/Jersey', '(GMT+0100) Europe/Jersey'), ('Europe/Lisbon', '(GMT+0100) Europe/Lisbon'), ('Europe/London', '(GMT+0100) Europe/London'), ('Africa/Blantyre', '(GMT+0200) Africa/Blantyre'), ('Africa/Bujumbura', '(GMT+0200) Africa/Bujumbura'), ('Africa/Cairo', '(GMT+0200) Africa/Cairo'), ('Africa/Ceuta', '(GMT+0200) Africa/Ceuta'), ('Africa/Gaborone', '(GMT+0200) Africa/Gaborone'), ('Africa/Harare', '(GMT+0200) Africa/Harare'), ('Africa/Johannesburg', '(GMT+0200) Africa/Johannesburg'), ('Africa/Kigali', '(GMT+0200) Africa/Kigali'), ('Africa/Lubumbashi', '(GMT+0200) Africa/Lubumbashi'), ('Africa/Lusaka', '(GMT+0200) Africa/Lusaka'), ('Africa/Maputo', '(GMT+0200) Africa/Maputo'), ('Africa/Maseru', '(GMT+0200) Africa/Maseru'), ('Africa/Mbabane', '(GMT+0200) Africa/Mbabane'), ('Africa/Tripoli', '(GMT+0200) Africa/Tripoli'), ('Africa/Windhoek', '(GMT+0200) Africa/Windhoek'), ('Antarctica/Troll', '(GMT+0200) Antarctica/Troll'), ('Arctic/Longyearbyen', '(GMT+0200) Arctic/Longyearbyen'), ('Asia/Amman', '(GMT+0200) Asia/Amman'), ('Asia/Damascus', '(GMT+0200) Asia/Damascus'), ('Europe/Amsterdam', '(GMT+0200) Europe/Amsterdam'), ('Europe/Andorra', '(GMT+0200) Europe/Andorra'), ('Europe/Belgrade', '(GMT+0200) Europe/Belgrade'), ('Europe/Berlin', '(GMT+0200) Europe/Berlin'), ('Europe/Bratislava', '(GMT+0200) Europe/Bratislava'), ('Europe/Brussels', '(GMT+0200) Europe/Brussels'), ('Europe/Budapest', '(GMT+0200) Europe/Budapest'), ('Europe/Busingen', '(GMT+0200) Europe/Busingen'), ('Europe/Copenhagen', '(GMT+0200) Europe/Copenhagen'), ('Europe/Gibraltar', '(GMT+0200) Europe/Gibraltar'), ('Europe/Kaliningrad', '(GMT+0200) Europe/Kaliningrad'), ('Europe/Ljubljana', '(GMT+0200) Europe/Ljubljana'), ('Europe/Luxembourg', '(GMT+0200) Europe/Luxembourg'), ('Europe/Madrid', '(GMT+0200) Europe/Madrid'), ('Europe/Malta', '(GMT+0200) Europe/Malta'), ('Europe/Monaco', '(GMT+0200) Europe/Monaco'), ('Europe/Oslo', '(GMT+0200) Europe/Oslo'), ('Europe/Paris', '(GMT+0200) Europe/Paris'), ('Europe/Podgorica', '(GMT+0200) Europe/Podgorica'), ('Europe/Prague', '(GMT+0200) Europe/Prague'), ('Europe/Rome', '(GMT+0200) Europe/Rome'), ('Europe/San_Marino', '(GMT+0200) Europe/San_Marino'), ('Europe/Sarajevo', '(GMT+0200) Europe/Sarajevo'), ('Europe/Skopje', '(GMT+0200) Europe/Skopje'), ('Europe/Stockholm', '(GMT+0200) Europe/Stockholm'), ('Europe/Tirane', '(GMT+0200) Europe/Tirane'), ('Europe/Vaduz', '(GMT+0200) Europe/Vaduz'), ('Europe/Vatican', '(GMT+0200) Europe/Vatican'), ('Europe/Vienna', '(GMT+0200) Europe/Vienna'), ('Europe/Warsaw', '(GMT+0200) Europe/Warsaw'), ('Europe/Zagreb', '(GMT+0200) Europe/Zagreb'), ('Europe/Zurich', '(GMT+0200) Europe/Zurich'), ('Africa/Addis_Ababa', '(GMT+0300) Africa/Addis_Ababa'), ('Africa/Asmara', '(GMT+0300) Africa/Asmara'), ('Africa/Dar_es_Salaam', '(GMT+0300) Africa/Dar_es_Salaam'), ('Africa/Djibouti', '(GMT+0300) Africa/Djibouti'), ('Africa/Juba', '(GMT+0300) Africa/Juba'), ('Africa/Kampala', '(GMT+0300) Africa/Kampala'), ('Africa/Khartoum', '(GMT+0300) Africa/Khartoum'), ('Africa/Mogadishu', '(GMT+0300) Africa/Mogadishu'), ('Africa/Nairobi', '(GMT+0300) Africa/Nairobi'), ('Antarctica/Syowa', '(GMT+0300) Antarctica/Syowa'), ('Asia/Aden', '(GMT+0300) Asia/Aden'), ('Asia/Baghdad', '(GMT+0300) Asia/Baghdad'), ('Asia/Bahrain', '(GMT+0300) Asia/Bahrain'), ('Asia/Beirut', '(GMT+0300) Asia/Beirut'), ('Asia/Gaza', '(GMT+0300) Asia/Gaza'), ('Asia/Hebron', '(GMT+0300) Asia/Hebron'), ('Asia/Jerusalem', '(GMT+0300) Asia/Jerusalem'), ('Asia/Kuwait', '(GMT+0300) Asia/Kuwait'), ('Asia/Nicosia', '(GMT+0300) Asia/Nicosia'), ('Asia/Qatar', '(GMT+0300) Asia/Qatar'), ('Asia/Riyadh', '(GMT+0300) Asia/Riyadh'), ('Europe/Athens', '(GMT+0300) Europe/Athens'), ('Europe/Bucharest', '(GMT+0300) Europe/Bucharest'), ('Europe/Chisinau', '(GMT+0300) Europe/Chisinau'), ('Europe/Helsinki', '(GMT+0300) Europe/Helsinki'), ('Europe/Istanbul', '(GMT+0300) Europe/Istanbul'), ('Europe/Kiev', '(GMT+0300) Europe/Kiev'), ('Europe/Kirov', '(GMT+0300) Europe/Kirov'), ('Europe/Mariehamn', '(GMT+0300) Europe/Mariehamn'), ('Europe/Minsk', '(GMT+0300) Europe/Minsk'), ('Europe/Moscow', '(GMT+0300) Europe/Moscow'), ('Europe/Riga', '(GMT+0300) Europe/Riga'), ('Europe/Simferopol', '(GMT+0300) Europe/Simferopol'), ('Europe/Sofia', '(GMT+0300) Europe/Sofia'), ('Europe/Tallinn', '(GMT+0300) Europe/Tallinn'), ('Europe/Uzhgorod', '(GMT+0300) Europe/Uzhgorod'), ('Europe/Vilnius', '(GMT+0300) Europe/Vilnius'), ('Europe/Volgograd', '(GMT+0300) Europe/Volgograd'), ('Europe/Zaporozhye', '(GMT+0300) Europe/Zaporozhye'), ('Indian/Antananarivo', '(GMT+0300) Indian/Antananarivo'), ('Indian/Comoro', '(GMT+0300) Indian/Comoro'), ('Indian/Mayotte', '(GMT+0300) Indian/Mayotte'), ('Asia/Baku', '(GMT+0400) Asia/Baku'), ('Asia/Dubai', '(GMT+0400) Asia/Dubai'), ('Asia/Muscat', '(GMT+0400) Asia/Muscat'), ('Asia/Tbilisi', '(GMT+0400) Asia/Tbilisi'), ('Asia/Yerevan', '(GMT+0400) Asia/Yerevan'), ('Europe/Astrakhan', '(GMT+0400) Europe/Astrakhan'), ('Europe/Samara', '(GMT+0400) Europe/Samara'), ('Europe/Ulyanovsk', '(GMT+0400) Europe/Ulyanovsk'), ('Indian/Mahe', '(GMT+0400) Indian/Mahe'), ('Indian/Mauritius', '(GMT+0400) Indian/Mauritius'), ('Indian/Reunion', '(GMT+0400) Indian/Reunion'), ('Asia/Kabul', '(GMT+0430) Asia/Kabul'), ('Asia/Tehran', '(GMT+0430) Asia/Tehran'), ('Antarctica/Mawson', '(GMT+0500) Antarctica/Mawson'), ('Asia/Aqtau', '(GMT+0500) Asia/Aqtau'), ('Asia/Aqtobe', '(GMT+0500) Asia/Aqtobe'), ('Asia/Ashgabat', '(GMT+0500) Asia/Ashgabat'), ('Asia/Dushanbe', '(GMT+0500) Asia/Dushanbe'), ('Asia/Karachi', '(GMT+0500) Asia/Karachi'), ('Asia/Oral', '(GMT+0500) Asia/Oral'), ('Asia/Samarkand', '(GMT+0500) Asia/Samarkand'), ('Asia/Tashkent', '(GMT+0500) Asia/Tashkent'), ('Asia/Yekaterinburg', '(GMT+0500) Asia/Yekaterinburg'), ('Indian/Kerguelen', '(GMT+0500) Indian/Kerguelen'), ('Indian/Maldives', '(GMT+0500) Indian/Maldives'), ('Asia/Colombo', '(GMT+0530) Asia/Colombo'), ('Asia/Kolkata', '(GMT+0530) Asia/Kolkata'), ('Asia/Kathmandu', '(GMT+0545) Asia/Kathmandu'), ('Antarctica/Vostok', '(GMT+0600) Antarctica/Vostok'), ('Asia/Almaty', '(GMT+0600) Asia/Almaty'), ('Asia/Bishkek', '(GMT+0600) Asia/Bishkek'), ('Asia/Dhaka', '(GMT+0600) Asia/Dhaka'), ('Asia/Omsk', '(GMT+0600) Asia/Omsk'), ('Asia/Qyzylorda', '(GMT+0600) Asia/Qyzylorda'), ('Asia/Thimphu', '(GMT+0600) Asia/Thimphu'), ('Asia/Urumqi', '(GMT+0600) Asia/Urumqi'), ('Indian/Chagos', '(GMT+0600) Indian/Chagos'), ('Asia/Rangoon', '(GMT+0630) Asia/Rangoon'), ('Indian/Cocos', '(GMT+0630) Indian/Cocos'), ('Antarctica/Davis', '(GMT+0700) Antarctica/Davis'), ('Asia/Bangkok', '(GMT+0700) Asia/Bangkok'), ('Asia/Barnaul', '(GMT+0700) Asia/Barnaul'), ('Asia/Ho_Chi_Minh', '(GMT+0700) Asia/Ho_Chi_Minh'), ('Asia/Jakarta', '(GMT+0700) Asia/Jakarta'), ('Asia/Krasnoyarsk', '(GMT+0700) Asia/Krasnoyarsk'), ('Asia/Novokuznetsk', '(GMT+0700) Asia/Novokuznetsk'), ('Asia/Novosibirsk', '(GMT+0700) Asia/Novosibirsk'), ('Asia/Phnom_Penh', '(GMT+0700) Asia/Phnom_Penh'), ('Asia/Pontianak', '(GMT+0700) Asia/Pontianak'), ('Asia/Tomsk', '(GMT+0700) Asia/Tomsk'), ('Asia/Vientiane', '(GMT+0700) Asia/Vientiane'), ('Indian/Christmas', '(GMT+0700) Indian/Christmas'), ('Antarctica/Casey', '(GMT+0800) Antarctica/Casey'), ('Asia/Brunei', '(GMT+0800) Asia/Brunei'), ('Asia/Hong_Kong', '(GMT+0800) Asia/Hong_Kong'), ('Asia/Hovd', '(GMT+0800) Asia/Hovd'), ('Asia/Irkutsk', '(GMT+0800) Asia/Irkutsk'), ('Asia/Kuala_Lumpur', '(GMT+0800) Asia/Kuala_Lumpur'), ('Asia/Kuching', '(GMT+0800) Asia/Kuching'), ('Asia/Macau', '(GMT+0800) Asia/Macau'), ('Asia/Makassar', '(GMT+0800) Asia/Makassar'), ('Asia/Manila', '(GMT+0800) Asia/Manila'), ('Asia/Shanghai', '(GMT+0800) Asia/Shanghai'), ('Asia/Singapore', '(GMT+0800) Asia/Singapore'), ('Asia/Taipei', '(GMT+0800) Asia/Taipei'), ('Australia/Perth', '(GMT+0800) Australia/Perth'), ('Asia/Pyongyang', '(GMT+0830) Asia/Pyongyang'), ('Australia/Eucla', '(GMT+0845) Australia/Eucla'), ('Asia/Chita', '(GMT+0900) Asia/Chita'), ('Asia/Choibalsan', '(GMT+0900) Asia/Choibalsan'), ('Asia/Dili', '(GMT+0900) Asia/Dili'), ('Asia/Jayapura', '(GMT+0900) Asia/Jayapura'), ('Asia/Khandyga', '(GMT+0900) Asia/Khandyga'), ('Asia/Seoul', '(GMT+0900) Asia/Seoul'), ('Asia/Tokyo', '(GMT+0900) Asia/Tokyo'), ('Asia/Ulaanbaatar', '(GMT+0900) Asia/Ulaanbaatar'), ('Asia/Yakutsk', '(GMT+0900) Asia/Yakutsk'), ('Pacific/Palau', '(GMT+0900) Pacific/Palau'), ('Australia/Darwin', '(GMT+0930) Australia/Darwin'), ('Antarctica/DumontDUrville', '(GMT+1000) Antarctica/DumontDUrville'), ('Asia/Ust-Nera', '(GMT+1000) Asia/Ust-Nera'), ('Asia/Vladivostok', '(GMT+1000) Asia/Vladivostok'), ('Australia/Brisbane', '(GMT+1000) Australia/Brisbane'), ('Australia/Lindeman', '(GMT+1000) Australia/Lindeman'), ('Pacific/Chuuk', '(GMT+1000) Pacific/Chuuk'), ('Pacific/Guam', '(GMT+1000) Pacific/Guam'), ('Pacific/Port_Moresby', '(GMT+1000) Pacific/Port_Moresby'), ('Pacific/Saipan', '(GMT+1000) Pacific/Saipan'), ('Australia/Adelaide', '(GMT+1030) Australia/Adelaide'), ('Australia/Broken_Hill', '(GMT+1030) Australia/Broken_Hill'), ('Antarctica/Macquarie', '(GMT+1100) Antarctica/Macquarie'), ('Asia/Magadan', '(GMT+1100) Asia/Magadan'), ('Asia/Sakhalin', '(GMT+1100) Asia/Sakhalin'), ('Asia/Srednekolymsk', '(GMT+1100) Asia/Srednekolymsk'), ('Australia/Currie', '(GMT+1100) Australia/Currie'), ('Australia/Hobart', '(GMT+1100) Australia/Hobart'), ('Australia/Lord_Howe', '(GMT+1100) Australia/Lord_Howe'), ('Australia/Melbourne', '(GMT+1100) Australia/Melbourne'), ('Australia/Sydney', '(GMT+1100) Australia/Sydney'), ('Pacific/Bougainville', '(GMT+1100) Pacific/Bougainville'), ('Pacific/Efate', '(GMT+1100) Pacific/Efate'), ('Pacific/Guadalcanal', '(GMT+1100) Pacific/Guadalcanal'), ('Pacific/Kosrae', '(GMT+1100) Pacific/Kosrae'), ('Pacific/Norfolk', '(GMT+1100) Pacific/Norfolk'), ('Pacific/Noumea', '(GMT+1100) Pacific/Noumea'), ('Pacific/Pohnpei', '(GMT+1100) Pacific/Pohnpei'), ('Asia/Anadyr', '(GMT+1200) Asia/Anadyr'), ('Asia/Kamchatka', '(GMT+1200) Asia/Kamchatka'), ('Pacific/Fiji', '(GMT+1200) Pacific/Fiji'), ('Pacific/Funafuti', '(GMT+1200) Pacific/Funafuti'), ('Pacific/Kwajalein', '(GMT+1200) Pacific/Kwajalein'), ('Pacific/Majuro', '(GMT+1200) Pacific/Majuro'), ('Pacific/Nauru', '(GMT+1200) Pacific/Nauru'), ('Pacific/Tarawa', '(GMT+1200) Pacific/Tarawa'), ('Pacific/Wake', '(GMT+1200) Pacific/Wake'), ('Pacific/Wallis', '(GMT+1200) Pacific/Wallis'), ('Antarctica/McMurdo', '(GMT+1300) Antarctica/McMurdo'), ('Pacific/Auckland', '(GMT+1300) Pacific/Auckland'), ('Pacific/Enderbury', '(GMT+1300) Pacific/Enderbury'), ('Pacific/Fakaofo', '(GMT+1300) Pacific/Fakaofo'), ('Pacific/Tongatapu', '(GMT+1300) Pacific/Tongatapu'), ('Pacific/Chatham', '(GMT+1345) Pacific/Chatham'), ('Pacific/Apia', '(GMT+1400) Pacific/Apia'), ('Pacific/Kiritimati', '(GMT+1400) Pacific/Kiritimati')]", max_length = 100, blank = False, null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/usercredential.xproto b/xos/genx/xprotos/core/usercredential.xproto
new file mode 100644
index 0000000..21dd1a3
--- /dev/null
+++ b/xos/genx/xprotos/core/usercredential.xproto
@@ -0,0 +1,8 @@
+
+
+message UserCredential {
+     required manytoone user->User:usercredentials = 1 [help_text = "The User this credential is associated with", null = False, db_index = True, blank = False];
+     required string name = 2 [help_text = "The credential type, e.g. ec2", max_length = 128, null = False, db_index = True, blank = False];
+     required string key_id = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "The backend id of this credential", null = False, db_index = False];
+     required string enc_value = 4 [help_text = "The key value of this credential", max_length = 1024, null = False, db_index = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/userdashboardview.xproto b/xos/genx/xprotos/core/userdashboardview.xproto
new file mode 100644
index 0000000..65a4a96
--- /dev/null
+++ b/xos/genx/xprotos/core/userdashboardview.xproto
@@ -0,0 +1,7 @@
+
+
+message UserDashboardView {
+     required manytoone user->User:userdashboardviews = 1 [db_index = True, null = False, blank = False];
+     required manytoone dashboardView->DashboardView:userdashboardviews = 2 [db_index = True, null = False, blank = False];
+     required int32 order = 3 [default = 0, null = False, db_index = False, blank = False];
+}
diff --git a/xos/genx/xprotos/core/xos.xproto b/xos/genx/xprotos/core/xos.xproto
new file mode 100644
index 0000000..409c513
--- /dev/null
+++ b/xos/genx/xprotos/core/xos.xproto
@@ -0,0 +1,15 @@
+
+
+message XOS {
+     required string name = 1 [default = "XOS", max_length = 200, content_type = "stripped", blank = False, help_text = "Name of XOS", null = False, db_index = False];
+     required int32 ui_port = 2 [help_text = "Port for XOS UI", default = 80, null = False, db_index = False, blank = False];
+     required int32 bootstrap_ui_port = 3 [help_text = "Port for XOS Bootstrap UI", default = 81, null = False, db_index = False, blank = False];
+     required string db_container_name = 4 [default = "xos_db", max_length = 200, content_type = "stripped", blank = False, help_text = "name of XOS db container", null = False, db_index = False];
+     required string redis_container_name = 5 [default = "", max_length = 200, content_type = "stripped", blank = True, help_text = "name of XOS redis container", null = False, db_index = False];
+     required string docker_project_name = 6 [max_length = 200, content_type = "stripped", blank = False, help_text = "docker project name", null = False, db_index = False];
+     required bool enable_build = 7 [help_text = "True if Onboarding Synchronizer should build XOS as necessary", default = True, null = False, db_index = False, blank = True];
+     required bool frontend_only = 8 [help_text = "If True, XOS will not start synchronizer containers", default = False, null = False, db_index = False, blank = True];
+     required string source_ui_image = 9 [default = "xosproject/xos", max_length = 200, content_type = "stripped", blank = False, null = False, db_index = False];
+     optional string extra_hosts = 10 [max_length = 1024, content_type = "stripped", blank = True, help_text = "list of hostname mappings that will be passed to docker-compose", null = True, db_index = False];
+     required bool no_start = 11 [help_text = "Do not start the XOS UI inside of the UI docker container", default = False, null = False, db_index = False, blank = True];
+}
diff --git a/xos/genx/xprotos/core/xoscomponent.xproto b/xos/genx/xprotos/core/xoscomponent.xproto
new file mode 100644
index 0000000..eb0aefd
--- /dev/null
+++ b/xos/genx/xprotos/core/xoscomponent.xproto
@@ -0,0 +1,15 @@
+
+
+message XOSComponent {
+     required manytoone xos->XOS:loadable_modules = 1 [help_text = "Pointer to XOS", default = "get_xos()", null = False, db_index = True, blank = False];
+     required string name = 2 [max_length = 30, content_type = "stripped", blank = False, help_text = "Service Name", null = False, db_index = False];
+     optional string base_url = 3 [max_length = 1024, content_type = "stripped", blank = True, help_text = "Base URL, allows use of relative URLs for resources", null = True, db_index = False];
+     optional string version = 4 [default = "1.0.0", max_length = 30, content_type = "stripped", blank = True, help_text = "Version of Service Controller", null = True, db_index = False];
+     optional string provides = 5 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of things provided", null = True, db_index = False];
+     optional string requires = 6 [max_length = 254, content_type = "stripped", blank = True, help_text = "Comma-separated list of required Service Controllers", null = True, db_index = False];
+     required string image = 7 [max_length = 200, content_type = "stripped", blank = False, help_text = "docker image name", null = False, db_index = False];
+     optional string command = 8 [max_length = 1024, content_type = "stripped", blank = True, help_text = "docker run command", null = True, db_index = False];
+     optional string ports = 9 [max_length = 200, content_type = "stripped", blank = True, help_text = "port binding", null = True, db_index = False];
+     optional string extra = 10 [max_length = 200, content_type = "stripped", blank = True, help_text = "extra information needed by containers", null = True, db_index = False];
+     required bool no_start = 11 [help_text = "Do not start the Component", default = False, null = False, db_index = False, blank = True];
+}
diff --git a/xos/genx/xprotos/core/xoscomponentlink.xproto b/xos/genx/xprotos/core/xoscomponentlink.xproto
new file mode 100644
index 0000000..9e3b8db
--- /dev/null
+++ b/xos/genx/xprotos/core/xoscomponentlink.xproto
@@ -0,0 +1,8 @@
+
+
+message XOSComponentLink {
+     required manytoone component->XOSComponent:links = 1 [help_text = "The Component object for this Link", null = False, db_index = True, blank = False];
+     required string container = 2 [max_length = 200, content_type = "stripped", blank = False, help_text = "container to link", null = False, db_index = False];
+     required string alias = 3 [max_length = 200, content_type = "stripped", blank = False, help_text = "alias for the link", null = False, db_index = False];
+     required string kind = 4 [default = "internal", choices = "(('internal', 'Internal'), ('external', 'External'))", max_length = 20, blank = False, null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/xoscomponentvolume.xproto b/xos/genx/xprotos/core/xoscomponentvolume.xproto
new file mode 100644
index 0000000..9ed9af1
--- /dev/null
+++ b/xos/genx/xprotos/core/xoscomponentvolume.xproto
@@ -0,0 +1,9 @@
+
+
+message XOSComponentVolume {
+     required manytoone component->XOSComponent:volumes = 1 [help_text = "The Component object for this Volume", null = False, db_index = True, blank = False];
+     required string name = 2 [max_length = 300, content_type = "stripped", blank = False, help_text = "Volume Name", null = False, db_index = False];
+     required string container_path = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "Path of Volume in Container", null = False, db_index = False];
+     required string host_path = 4 [max_length = 1024, content_type = "stripped", blank = False, help_text = "Path of Volume in Host", null = False, db_index = False];
+     required bool read_only = 5 [help_text = "True if mount read-only", default = False, null = False, db_index = False, blank = True];
+}
diff --git a/xos/genx/xprotos/core/xoscomponentvolumecontainer.xproto b/xos/genx/xprotos/core/xoscomponentvolumecontainer.xproto
new file mode 100644
index 0000000..acf36a8
--- /dev/null
+++ b/xos/genx/xprotos/core/xoscomponentvolumecontainer.xproto
@@ -0,0 +1,7 @@
+
+
+message XOSComponentVolumeContainer {
+     required manytoone component->XOSComponent:volumecontainers = 1 [help_text = "The Component object for this VolumeContainer", null = False, db_index = True, blank = False];
+     required string name = 2 [max_length = 300, content_type = "stripped", blank = False, help_text = "Volume Name", null = False, db_index = False];
+     required string container = 3 [max_length = 300, content_type = "stripped", blank = False, help_text = "Volume Name", null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/xosguiextension.xproto b/xos/genx/xprotos/core/xosguiextension.xproto
new file mode 100644
index 0000000..d15cf64
--- /dev/null
+++ b/xos/genx/xprotos/core/xosguiextension.xproto
@@ -0,0 +1,6 @@
+
+
+message XOSGuiExtension {
+     required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the GUI Extensions", null = False, db_index = False];
+     required string files = 2 [max_length = 1024, content_type = "stripped", blank = False, help_text = "List of comma separated file composing the view", null = False, db_index = False];
+}
diff --git a/xos/genx/xprotos/core/xosvolume.xproto b/xos/genx/xprotos/core/xosvolume.xproto
new file mode 100644
index 0000000..1449549
--- /dev/null
+++ b/xos/genx/xprotos/core/xosvolume.xproto
@@ -0,0 +1,8 @@
+
+
+message XOSVolume {
+     required manytoone xos->XOS:volumes = 1 [help_text = "The XOS object for this Volume", null = False, db_index = True, blank = False];
+     required string container_path = 2 [max_length = 1024, content_type = "stripped", blank = False, help_text = "Path of Volume in Container", null = False, db_index = False];
+     required string host_path = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "Path of Volume in Host", null = False, db_index = False];
+     required bool read_only = 4 [help_text = "True if mount read-only", default = False, null = False, db_index = False, blank = True];
+}