diff --git a/xos/attic/bandwidthprofile_model.py b/xos/attic/bandwidthprofile_model.py
new file mode 100644
index 0000000..3fd623e
--- /dev/null
+++ b/xos/attic/bandwidthprofile_model.py
@@ -0,0 +1 @@
+def __unicode__(self):  return u'%s' % (self.name)
diff --git a/xos/attic/header.py b/xos/attic/header.py
new file mode 100644
index 0000000..f4db591
--- /dev/null
+++ b/xos/attic/header.py
@@ -0,0 +1,14 @@
+# models.py -  Metro Network Service
+
+from django.db import models
+from django.db.models import *
+from core.models import Service
+from core.models import PlCoreBase
+from core.models import Site
+
+METRONETWORK_KIND = "metronetwork"
+SERVICE_NAME = 'metronetwork'
+SERVICE_NAME_ELINE_VERBOSE = 'E-Line Service'
+SERVICE_NAME_ELAN_VERBOSE = 'E-LAN Service'
+SERVICE_NAME_ETREE_VERBOSE = 'E-Tree Service'
+
diff --git a/xos/attic/metronetworksystem_model.py b/xos/attic/metronetworksystem_model.py
new file mode 100644
index 0000000..358cf8d
--- /dev/null
+++ b/xos/attic/metronetworksystem_model.py
@@ -0,0 +1,15 @@
+def __init__(self, *args, **kwargs):
+    super(MetroNetworkSystem, self).__init__(*args, **kwargs)
+
+def getAdminstrativeState(self):
+     return self.administrativeState
+
+def setAdminstrativeState(self, value):
+    self.administrativeState = value
+
+def getOperationalState(self):
+    return self.operationalState
+
+def getRestUrl(self):
+    return self.restUrl
+
diff --git a/xos/attic/networkedgeport_model.py b/xos/attic/networkedgeport_model.py
new file mode 100644
index 0000000..52f17fe
--- /dev/null
+++ b/xos/attic/networkedgeport_model.py
@@ -0,0 +1,22 @@
+def __unicode__(self):
+    return u'%s' % (self.pid)
+
+def save(self, *args, **kwargs):
+
+    if self.latlng:
+        try:
+            latlng_value = getattr(self, 'latlng').strip()
+            if (latlng_value.startswith('[') and latlng_value.endswith(']') and latlng_value.index(',') > 0):
+                lat = latlng_value[1: latlng_value.index(',')].strip()
+                lng = latlng_value[latlng_value.index(',') + 1: len(latlng_value) - 1].strip()
+
+                #If lat and lng are not floats, the code below should result in an error.
+                lat_validation = float(lat)
+                lng_validation = float(lng)
+            else:
+                raise ValueError("The lat/lng value is not formatted correctly.")
+        except:
+            raise ValueError("The lat/lng value is not formatted correctly.")
+
+    super(NetworkEdgePort, self).save(*args, **kwargs)
+
diff --git a/xos/attic/remoteport_model.py b/xos/attic/remoteport_model.py
new file mode 100644
index 0000000..3fd623e
--- /dev/null
+++ b/xos/attic/remoteport_model.py
@@ -0,0 +1 @@
+def __unicode__(self):  return u'%s' % (self.name)
diff --git a/xos/attic/servicespoke_model.py b/xos/attic/servicespoke_model.py
new file mode 100644
index 0000000..3fd623e
--- /dev/null
+++ b/xos/attic/servicespoke_model.py
@@ -0,0 +1 @@
+def __unicode__(self):  return u'%s' % (self.name)
diff --git a/xos/attic/usernetworkinterfaces_model.py b/xos/attic/usernetworkinterfaces_model.py
new file mode 100644
index 0000000..92d2700
--- /dev/null
+++ b/xos/attic/usernetworkinterfaces_model.py
@@ -0,0 +1,20 @@
+def __unicode__(self):  return u'%s' % (self.name)
+
+def save(self, *args, **kwargs):
+
+    if self.latlng:
+        try:
+            latlng_value = getattr(self, 'latlng').strip()
+            if (latlng_value.startswith('[') and latlng_value.endswith(']') and latlng_value.index(',') > 0):
+                lat = latlng_value[1: latlng_value.index(',')].strip()
+                lng = latlng_value[latlng_value.index(',') + 1: len(latlng_value) - 1].strip()
+
+                # If lat and lng are not floats, the code below should result in an error.
+                lat_validation = float(lat)
+                lng_validation = float(lng)
+            else:
+                raise ValueError("The lat/lng value is not formatted correctly.")
+        except:
+            raise ValueError("The lat/lng value is not formatted correctly.")
+
+    super(UserNetworkInterface, self).save(*args, **kwargs)
diff --git a/xos/header.py b/xos/header.py
new file mode 120000
index 0000000..721b5c0
--- /dev/null
+++ b/xos/header.py
@@ -0,0 +1 @@
+attic/header.py
\ No newline at end of file
diff --git a/xos/metronet.xproto b/xos/metronet.xproto
new file mode 100644
index 0000000..4094bf4
--- /dev/null
+++ b/xos/metronet.xproto
@@ -0,0 +1,136 @@
+option name = "metronetwork";
+
+message MetroNetworkSystem (PlCoreBase){
+     option verbose_name = "Metro Network System";
+
+     required string name = 1 [db_index = False, max_length = 256, null = False, blank = False];
+     required string description = 2 [db_index = False, max_length = 1024, null = False, blank = False];
+     required string restUrl = 3 [db_index = False, max_length = 256, null = False, blank = False];
+     required string administrativeState = 4 [default = "disabled", choices = "(('enabled', 'Enabled'), ('disabled', 'Disabled'))", max_length = 16, blank = False, null = False, db_index = False];
+     required string operationalState = 5 [blank = False, max_length = 256, null = False, db_index = False, choices = "(('active', 'Active'), ('inactive', 'Inactive'))"];
+}
+
+message NetworkDevice (PlCoreBase){
+     option verbose_name = "Network Device";
+
+     optional string name = 1 [help_text = "Device friendly name", max_length = 20, null = True, db_index = False, blank = True];
+     required string restCtrlUrl = 2 [db_index = False, max_length = 256, null = False, blank = False];
+     required string authType = 3 [blank = False, max_length = 16, null = False, db_index = False, choices = "(('basic', 'Basic'), ('key', 'Key'), ('oauth', 'OAuth'))"];
+     required string username = 4 [db_index = False, max_length = 32, null = False, blank = True];
+     required string password = 5 [db_index = False, max_length = 32, null = False, blank = True];
+     required string administrativeState = 6 [default = "disabled", choices = "(('enabled', 'Enabled'), ('disabled', 'Disabled'), ('syncrequested', 'SyncRequested'), ('syncinprogress', 'SyncInProgress'))", max_length = 16, blank = False, null = False, db_index = False];
+}
+
+message NetworkEdgePort (PlCoreBase){
+     option verbose_name = "Network Edge Port";
+
+     required manytoone element->NetworkDevice:networkedgeport = 1 [db_index = True, null = False, blank = False];
+     required string pid = 2 [db_index = False, max_length = 256, null = False, blank = False];
+     required int32 bwpCfgCbs = 3 [db_index = False, null = False, blank = True];
+     required int32 bwpCfgEbs = 4 [db_index = False, null = False, blank = True];
+     required int32 bwpCfgCir = 5 [db_index = False, null = False, blank = True];
+     required int32 bwpCfgEir = 6 [db_index = False, null = False, blank = True];
+     required string name = 7 [db_index = False, max_length = 256, null = False, blank = True];
+     required string location = 8 [db_index = False, max_length = 256, null = False, blank = True];
+     required string latlng = 9 [db_index = False, max_length = 50, null = False, blank = True];
+}
+
+
+message NetworkEdgeToEdgePointConnection (Service){
+     option verbose_name = "E-Line Service";
+
+     required string sid = 1 [db_index = False, max_length = 256, null = False, blank = True];
+     required string type = 2 [blank = False, max_length = 256, null = False, db_index = False, choices = "(('direct', 'Direct'), ('tunnel', 'Tunnel'), ('optical', 'Optical'), ('virtual', 'Virtual'), ('Point_To_Point', 'Point To Point'))"];
+     required string vlanid = 3 [db_index = False, max_length = 64, null = False, blank = False];
+     required manytoone uni1->NetworkEdgePort:EdgePointToEdgePointSrc = 4 [db_index = True, null = False, blank = False];
+     required manytoone uni2->NetworkEdgePort:EdgePointToEdgePointDst = 5 [db_index = True, null = False, blank = False];
+     required string operstate = 6 [blank = False, max_length = 256, null = False, db_index = False, choices = "(('active', 'Active'), ('inactive', 'Inactive'))"];
+     required string adminstate = 7 [blank = False, max_length = 256, null = False, db_index = False, choices = "(('disabled', 'Disabled'), ('activationrequested', 'ActivationRequested'), ('enabled', 'Enabled'), ('invalid', 'Invalid'), ('deactivationrequested', 'DeactivationRequested'))"];
+}
+
+
+message NetworkEdgeToMultipointConnection (Service){
+     option verbose_name = "E-Line Service";
+
+     required string sid = 1 [db_index = False, max_length = 256, null = False, blank = True];
+     required string type = 2 [blank = False, max_length = 256, null = False, db_index = False, choices = "(('vlan', 'VLAN'), ('ip', 'IP'), ('ethernet', 'Ethernet'), ('Root_Multipoint', 'Root Multipoint'))"];
+     required string vlanid = 3 [db_index = False, max_length = 64, null = False, blank = False];
+     required manytoone root->NetworkEdgePort:EdgeToMultipointRoot = 4 [db_index = True, null = False, blank = False];
+     required string operstate = 5 [blank = False, max_length = 256, null = False, db_index = False, choices = "(('active', 'Active'), ('inactive', 'Inactive'))"];
+     required string adminstate = 6 [blank = False, max_length = 256, null = False, db_index = False, choices = "(('disabled', 'Disabled'), ('activationrequested', 'ActivationRequested'), ('enabled', 'Enabled'), ('invalid', 'Invalid'), ('deactivationrequested', 'DeactivationRequested'))"];
+     required manytomany eps->NetworkEdgePort/NetworkMultipointToMultipointConnection_eps:networkedgetomultipointconnection_eps = 7 [db_index = False, null = False, blank = False];
+}
+
+
+message NetworkMultipointToMultipointConnection (Service){
+     option verbose_name = "E-LAN Service";
+
+     required string sid = 1 [db_index = False, max_length = 256, null = False, blank = True];
+     required string type = 2 [blank = False, max_length = 256, null = False, db_index = False, choices = "(('vlan', 'VLAN'), ('ip', 'IP'), ('ethernet', 'Ethernet'), ('Multipoint_To_Multipoint', 'Multipoint To Multipoint'))"];
+     required string vlanid = 3 [db_index = False, max_length = 64, null = False, blank = False];
+     required string operstate = 4 [blank = False, max_length = 256, null = False, db_index = False, choices = "(('active', 'Active'), ('inactive', 'Inactive'))"];
+     required string adminstate = 5 [blank = False, max_length = 256, null = False, db_index = False, choices = "(('disabled', 'Disabled'), ('activationrequested', 'ActivationRequested'), ('enabled', 'Enabled'), ('invalid', 'Invalid'), ('deactivationrequested', 'DeactivationRequested'))"];
+     required manytomany eps->NetworkEdgePort/NetworkMultipointToMultipointConnection_eps:networkmultipointtomultipointconnection_eps = 6 [db_index = False, null = False, blank = False];
+}
+
+message BandwidthProfile (PlCoreBase){
+     option verbose_name = "Bandwidth Profile";
+
+     required int32 bwpcfgcbs = 1 [db_index = False, null = False, blank = False];
+     required int32 bwpcfgebs = 2 [db_index = False, null = False, blank = False];
+     required int32 bwpcfgcir = 3 [db_index = False, null = False, blank = False];
+     required int32 bwpcfgeir = 4 [db_index = False, null = False, blank = False];
+     required string name = 5 [db_index = False, max_length = 256, null = False, blank = False];
+}
+
+message RemotePort (PlCoreBase){
+     option verbose_name = "Remote Port";
+
+     required manytoone remoteportsite->Site:RemotePortSite = 1 [db_index = True, null = False, blank = False];
+     required manytoone edgeport->NetworkEdgePort:RemotePortEdgePort = 2 [db_index = True, null = False, blank = False];
+     required string name = 3 [db_index = False, max_length = 256, null = False, blank = False];
+}
+
+
+message ServiceSpoke (PlCoreBase){
+     option verbose_name = "Service Spoke";
+
+     required manytoone vnodlocalsite->Site:VnodLocalSite = 1 [db_index = True, null = False, blank = False];
+     required manytoone vnodlocalport->RemotePort:VnodLocalPort = 2 [db_index = True, null = False, blank = False];
+     required string name = 3 [db_index = False, max_length = 256, null = False, blank = False];
+     required string remotesubscriber = 4 [db_index = False, max_length = 256, null = False, blank = True];
+     required string remotevnodid = 5 [db_index = False, max_length = 256, null = False, blank = True];
+     required bool autoattached = 6 [default = False, null = False, db_index = False, blank = True];
+     required string operstate = 7 [default = "inactive", choices = "(('active', 'Active'), ('inactive', 'Inactive'))", max_length = 256, blank = False, null = False, db_index = False];
+     required string adminstate = 8 [default = "disabled", choices = "(('disabled', 'Disabled'), ('configured', 'Configured'), ('impaired', 'Impaired'), ('enabled', 'Enabled'))", max_length = 64, blank = False, null = False, db_index = False];
+}
+
+message VnodGlobalService (Service){
+     option verbose_name = "Virtual Network On Demand Global Service"; 
+
+     required string servicehandle = 1 [db_index = False, max_length = 64, null = False, blank = False];
+     required string vlanid = 2 [db_index = False, max_length = 64, null = False, blank = False];
+     required string type = 3 [blank = False, max_length = 256, null = False, db_index = False, choices = "(('eline', 'E-Line Service'), ('elan', 'E-LAN Service'), ('etree', 'E-Tree Service'))"];
+     optional manytoone metronetworkroottomultipoint->NetworkEdgeToMultipointConnection:EtreeService = 4 [db_index = True, null = True, blank = False];
+     optional manytoone metronetworkmultipoint->NetworkMultipointToMultipointConnection:ElanService = 5 [db_index = True, null = True, blank = False];
+     optional manytoone metronetworkpointtopoint->NetworkEdgeToEdgePointConnection:ElineService = 6 [db_index = True, null = True, blank = False];
+     required string operstate = 7 [blank = False, max_length = 256, null = False, db_index = False, choices = "(('active', 'Active'), ('inactive', 'Inactive'))"];
+     required string adminstate = 8 [default = "enabled", choices = "(('disabled', 'Disabled'), ('activationrequested', 'ActivationRequested'), ('enabled', 'Enabled'), ('invalid', 'Invalid'), ('deactivationrequested', 'DeactivationRequested'))", max_length = 256, blank = False, null = False, db_index = False];
+     required manytoone bandwidthProfile->BandwidthProfile:BandwidthProfile = 9 [db_index = True, null = False, blank = False];
+     required manytomany spokes->ServiceSpoke/VnodGlobalService_spokes:ServiceSpokes = 10 [db_index = False, null = False, blank = False];
+}
+
+message UserNetworkInterface (PlCoreBase){
+     option verbose_name = "User Network Interface"; 
+
+     required int32 enabled = 1 [db_index = False, null = False, blank = False];
+     required int32 capacity = 2 [db_index = False, null = False, blank = False];
+     required int32 bw_used = 3 [db_index = False, null = False, blank = False];
+     required string vlanIds = 4 [db_index = False, max_length = 256, null = False, blank = False];
+     required string location = 5 [db_index = False, max_length = 256, null = False, blank = True];
+     required string latlng = 6 [db_index = False, max_length = 50, null = False, blank = True];
+     required string name = 7 [db_index = False, max_length = 256, null = False, blank = False];
+}
+
+
+
diff --git a/xos/metronetwork-onboard.yaml b/xos/metronetwork-onboard.yaml
index 93dfff2..e4ecb69 100644
--- a/xos/metronetwork-onboard.yaml
+++ b/xos/metronetwork-onboard.yaml
@@ -13,10 +13,10 @@
           base_url: file:///opt/xos_services/metro-net/xos/
           # The following will concatenate with base_url automatically, if
           # base_url is non-null.
-          models: models.py
+          xproto: ./
           admin: admin.py
           rest_service: subdirectory:metronetworkservice api/service/metronetworkservice/metronetworkservice.py
           synchronizer: synchronizer/manifest
           synchronizer_run: metronetworkervice-synchronizer.py
           tosca_resource: tosca/resources/metronetservice.py
-          tosca_custom_types: metronet.yaml
\ No newline at end of file
+          tosca_custom_types: metronet.yaml
diff --git a/xos/models.py b/xos/models.py
deleted file mode 100644
index 580bb4f..0000000
--- a/xos/models.py
+++ /dev/null
@@ -1,503 +0,0 @@
-# models.py -  Metro Network Service
-
-from django.db import models
-from core.models import Service
-from core.models import PlCoreBase
-from core.models import Site
-
-METRONETWORK_KIND = "metronetwork"
-SERVICE_NAME = 'metronetwork'
-SERVICE_NAME_ELINE_VERBOSE = 'E-Line Service'
-SERVICE_NAME_ELAN_VERBOSE = 'E-LAN Service'
-SERVICE_NAME_ETREE_VERBOSE = 'E-Tree Service'
-
-class MetroNetworkSystem(PlCoreBase):
-
-    class Meta:
-        app_label = METRONETWORK_KIND
-        verbose_name = "Metro Network System"
-
-    ADMINISTRATIVE_STATE = (
-        ('enabled', 'Enabled'),
-        ('disabled', 'Disabled')
-    )
-
-    OPERATIONALSTATE = (
-        ('active', 'Active'),
-        ('inactive', 'Inactive')
-    )
-
-    name = models.CharField(unique=True,
-                           verbose_name="Name",
-                           max_length=256,
-                           editable=True)
-
-    description = models.CharField(verbose_name="Description",
-                                   max_length=1024,
-                                   editable=True)
-
-    restUrl = models.CharField(verbose_name="Rest URL",
-                               max_length=256,
-                               editable=True)
-
-    administrativeState = models.CharField(choices=ADMINISTRATIVE_STATE,
-                                           default='disabled',
-                                           verbose_name="AdministrativeState",
-                                           max_length=16,
-                                           editable=True)
-
-    operationalState = models.CharField(choices=OPERATIONALSTATE,
-                                        verbose_name="OperationalState",
-                                        max_length=256,
-                                        editable=True)
-
-    def __init__(self, *args, **kwargs):
-        super(MetroNetworkSystem, self).__init__(*args, **kwargs)
-
-    def getAdminstrativeState(self):
-         return self.administrativeState
-
-    def setAdminstrativeState(self, value):
-        self.administrativeState = value
-
-    def getOperationalState(self):
-        return self.operationalState
-
-    def getRestUrl(self):
-        return self.restUrl
-
-
-class NetworkDevice(PlCoreBase):
-
-    class Meta:
-        app_label = METRONETWORK_KIND
-        verbose_name = "Network Device"
-
-    ADMINISTRATIVE_STATE = (
-        ('enabled', 'Enabled'),
-        ('disabled', 'Disabled'),
-        ('syncrequested', 'SyncRequested'),
-        ('syncinprogress', 'SyncInProgress')
-    )
-
-    AUTH_TYPE = (
-        ('basic', 'Basic'),
-        ('key', 'Key'),
-        ('oauth', 'OAuth')
-    )
-
-    # Leaving out the attributes below for now - not clear we will need them
-    # type = models.CharField(choices=TYPE, verbose_name="Type", max_length=256, editable=False)
-    # manufacturer = models.CharField(unique=False, verbose_name="Manufacturer", max_length=256, editable=False)
-    # serialNumber = models.CharField(unique=True, verbose_name="Serial Number", max_length=256, editable=False)
-    # chassisId = models.CharField(unique=False, verbose_name="Chassis ID", max_length=256, editable=False)
-
-    name = models.CharField(max_length=20, help_text="Device friendly name", null=True, blank=True)
-    restCtrlUrl = models.CharField(unique=True,
-                               verbose_name="RestCtrlURL",
-                               max_length=256,
-                               editable=True)
-    authType = models.CharField(choices=AUTH_TYPE, verbose_name='Auth Type', max_length=16, editable=True)
-    username = models.CharField(verbose_name='Username', max_length=32, editable=True, blank=True)
-    password = models.CharField(max_length=32, verbose_name='Password', editable=True, blank=True)
-    administrativeState = models.CharField(choices=ADMINISTRATIVE_STATE,
-                                           default='disabled',
-                                           verbose_name="AdministrativeState",
-                                           max_length=16,
-                                           editable=True)
-    id = models.CharField(unique=True,
-                          verbose_name="Element Id",
-                          primary_key=True,
-                          max_length=256,
-                          editable=True)
-
-    def __init__(self, *args, **kwargs):
-        super(NetworkDevice, self).__init__(*args, **kwargs)
-
-class NetworkEdgePort(PlCoreBase):
-
-    class Meta:
-        app_label = METRONETWORK_KIND
-        verbose_name = "Network Edge Port"
-
-    element = models.ForeignKey(NetworkDevice, on_delete=models.CASCADE)
-    id = models.AutoField(verbose_name="id", primary_key=True, editable=False)
-    pid = models.CharField(unique=True, verbose_name="Port ID", max_length=256, editable=False)
-    bwpCfgCbs = models.IntegerField(verbose_name="Committed Burst Size", editable=False, blank=True)
-    bwpCfgEbs = models.IntegerField(verbose_name="Excess Burst Size", editable=False, blank=True)
-    bwpCfgCir = models.IntegerField(verbose_name="Committed Information Rate", editable=False, blank=True)
-    bwpCfgEir = models.IntegerField(verbose_name="Excess Information Rate", editable=False, blank=True)
-    name = models.CharField(verbose_name="Name", max_length=256, editable=True, blank=True)
-    location = models.CharField(verbose_name="Location", max_length=256, editable=True, blank=True)
-    latlng = models.CharField(verbose_name="Latitude/Longitude", max_length=50, editable=True, blank=True)
-
-    def __init__(self, *args, **kwargs):
-        super(NetworkEdgePort, self).__init__(*args, **kwargs)
-
-    def __unicode__(self):
-        return u'%s' % (self.pid)
-
-    def save(self, *args, **kwargs):
-
-        if self.latlng:
-            try:
-                latlng_value = getattr(self, 'latlng').strip()
-                if (latlng_value.startswith('[') and latlng_value.endswith(']') and latlng_value.index(',') > 0):
-                    lat = latlng_value[1: latlng_value.index(',')].strip()
-                    lng = latlng_value[latlng_value.index(',') + 1: len(latlng_value) - 1].strip()
-
-                    #If lat and lng are not floats, the code below should result in an error.
-                    lat_validation = float(lat)
-                    lng_validation = float(lng)
-                else:
-                    raise ValueError("The lat/lng value is not formatted correctly.")
-            except:
-                raise ValueError("The lat/lng value is not formatted correctly.")
-
-        super(NetworkEdgePort, self).save(*args, **kwargs)
-
-#E-Line Service
-class NetworkEdgeToEdgePointConnection(Service):
-
-    class Meta:
-        app_label = SERVICE_NAME
-        verbose_name = SERVICE_NAME_ELINE_VERBOSE
-
-    TYPE = (
-        ('direct', 'Direct'),
-        ('tunnel', 'Tunnel'),
-        ('optical', 'Optical'),
-        ('virtual', 'Virtual'),
-        ('Point_To_Point', 'Point To Point')
-    )
-
-    OPERATIONALSTATE = (
-        ('active', 'Active'),
-        ('inactive', 'Inactive')
-    )
-
-    ADMINISTRATIVESTATE = (
-        ('disabled', 'Disabled'),
-        ('activationrequested', 'ActivationRequested'),
-        ('enabled', 'Enabled'),
-        ('invalid', 'Invalid'),
-        ('deactivationrequested', 'DeactivationRequested')
-    )
-
-    sid = models.CharField(verbose_name="Service ID", max_length=256, editable=True, blank=True)
-    type = models.CharField(choices=TYPE, verbose_name="Type", max_length=256, editable=True)
-    vlanid = models.CharField(verbose_name="Vlanid", max_length=64, editable=True)
-    uni1 = models.ForeignKey(NetworkEdgePort,
-                            related_name='EdgePointToEdgePointSrc',
-                            verbose_name="UNI 1",
-                            editable=True,
-                            on_delete=models.CASCADE)
-    uni2 = models.ForeignKey(NetworkEdgePort,
-                             related_name='EdgePointToEdgePointDst',
-                             verbose_name="UNI 2",
-                             editable=True,
-                             on_delete=models.CASCADE)
-    operstate = models.CharField(choices=OPERATIONALSTATE, verbose_name="OperationalState", max_length=256, editable=True)
-    adminstate = models.CharField(choices=ADMINISTRATIVESTATE, verbose_name="AdministrativeState", max_length=256, editable=True)
-
-    #uni1_createbuffer = models.CharField(max_length=256, default="{}", null=True)
-    #uni2_createbuffer = models.CharField(max_length=256, default="{}", null=True)
-
-    def __init__(self, *args, **kwargs):
-        super(NetworkEdgeToEdgePointConnection, self).__init__(*args, **kwargs)
-
-#E-Tree Service
-class NetworkEdgeToMultipointConnection(Service):
-
-    class Meta:
-        app_label = SERVICE_NAME
-        verbose_name = SERVICE_NAME_ETREE_VERBOSE
-
-    TYPE = (
-        ('vlan', 'VLAN'),
-        ('ip', 'IP'),
-        ('ethernet', 'Ethernet'),
-        ('Root_Multipoint', 'Root Multipoint')
-    )
-
-    OPERATIONALSTATE = (
-        ('active', 'Active'),
-        ('inactive', 'Inactive')
-    )
-
-    ADMINISTRATIVESTATE = (
-        ('disabled', 'Disabled'),
-        ('activationrequested', 'ActivationRequested'),
-        ('enabled', 'Enabled'),
-        ('invalid', 'Invalid'),
-        ('deactivationrequested', 'DeactivationRequested')
-    )
-
-    sid = models.CharField(verbose_name="Service ID", max_length=256, editable=True, blank=True)
-    type = models.CharField(choices=TYPE, verbose_name="Type", max_length=256, editable=True)
-    vlanid = models.CharField(verbose_name="Vlanid", max_length=64, editable=True)
-    root = models.ForeignKey(NetworkEdgePort,
-                            related_name='EdgeToMultipointRoot',
-                            verbose_name="Root",
-                            editable=True,
-                            on_delete=models.CASCADE)
-    eps = models.ManyToManyField(NetworkEdgePort,
-                                 related_name='%(class)s_eps',
-                                 verbose_name="Endpoints",
-                                 editable=True)
-    operstate = models.CharField(choices=OPERATIONALSTATE, verbose_name="OperationalState", max_length=256,
-                                 editable=True)
-    adminstate = models.CharField(choices=ADMINISTRATIVESTATE, verbose_name="AdministrativeState", max_length=256,
-                                  editable=True)
-
-    # Scratch Area to help deal with the Many to Many relationship with the eps
-    #eps_createbuffer = models.CharField(max_length=1024, default="{}", null=True)
-
-    def __init__(self, *args, **kwargs):
-        super(NetworkEdgeToMultipointConnection, self).__init__(*args, **kwargs)
-
-#E-LAN Service
-class NetworkMultipointToMultipointConnection(Service):
-
-    class Meta:
-        app_label = SERVICE_NAME
-        verbose_name = SERVICE_NAME_ELAN_VERBOSE
-
-    TYPE = (
-        ('vlan', 'VLAN'),
-        ('ip', 'IP'),
-        ('ethernet', 'Ethernet'),
-        ('Multipoint_To_Multipoint', 'Multipoint To Multipoint')
-    )
-
-    OPERATIONALSTATE = (
-        ('active', 'Active'),
-        ('inactive', 'Inactive')
-    )
-
-    ADMINISTRATIVESTATE = (
-        ('disabled', 'Disabled'),
-        ('activationrequested', 'ActivationRequested'),
-        ('enabled', 'Enabled'),
-        ('invalid', 'Invalid'),
-        ('deactivationrequested', 'DeactivationRequested')
-    )
-
-    sid = models.CharField(verbose_name="Service ID", max_length=256, editable=True, blank=True)
-    type = models.CharField(choices=TYPE, verbose_name="Type", max_length=256, editable=True)
-    vlanid = models.CharField(verbose_name="Vlanid", max_length=64, editable=True)
-    eps = models.ManyToManyField(NetworkEdgePort,
-                                 related_name='%(class)s_eps',
-                                 verbose_name="Endpoints",
-                                 editable=True)
-
-    operstate = models.CharField(choices=OPERATIONALSTATE, verbose_name="OperationalState", max_length=256,
-                                 editable=True)
-    adminstate = models.CharField(choices=ADMINISTRATIVESTATE, verbose_name="AdministrativeState", max_length=256,
-                              editable=True)
-
-    # Scratch Area to help deal with the Many to Many relationship with the eps
-    #eps_createbuffer = models.CharField(max_length=1024, default="{}", null=True)
-
-    def __init__(self, *args, **kwargs):
-        super(NetworkMultipointToMultipointConnection, self).__init__(*args, **kwargs)
-
-class BandwidthProfile(PlCoreBase):
-
-    class Meta:
-        app_label = METRONETWORK_KIND
-        verbose_name = "Bandwidth Profile"
-
-    id = models.AutoField(verbose_name="id", primary_key=True, editable=False)
-    bwpcfgcbs = models.IntegerField(verbose_name="Committed Burst Size", editable=True)
-    bwpcfgebs = models.IntegerField(verbose_name="Excess Burst Size", editable=True)
-    bwpcfgcir = models.IntegerField(verbose_name="Committed Information Rate", editable=True)
-    bwpcfgeir = models.IntegerField(verbose_name="Excess Information Rate", editable=True)
-    name = models.CharField(unique=True, verbose_name="Name", max_length=256, editable=True)
-
-    def __init__(self, *args, **kwargs):
-        super(BandwidthProfile, self).__init__(*args, **kwargs)
-
-    def __unicode__(self):  return u'%s' % (self.name)
-
-# VNoD Global Objects - model is included in metro-net for simplicity
-
-class RemotePort(PlCoreBase):
-    class Meta:
-        app_label = METRONETWORK_KIND
-        verbose_name = "Remote Port"
-
-    remoteportsite = models.ForeignKey(Site,
-                                       related_name='RemotePortSite',
-                                       verbose_name="RemotePortSite",
-                                       editable=True,
-                                       on_delete=models.CASCADE)
-
-    edgeport = models.ForeignKey(NetworkEdgePort,
-                                 related_name='RemotePortEdgePort',
-                                 verbose_name="RemotePortEdgePort",
-                                 editable=True,
-                                 on_delete=models.CASCADE)
-
-    id = models.AutoField(verbose_name="id", primary_key=True, editable=False)
-    name = models.CharField(unique=True, verbose_name="Name", max_length=256, editable=True)
-
-    def __init__(self, *args, **kwargs):
-        super(RemotePort, self).__init__(*args, **kwargs)
-
-    def __unicode__(self):  return u'%s' % (self.name)
-
-class ServiceSpoke(PlCoreBase):
-
-    class Meta:
-        app_label = METRONETWORK_KIND
-        verbose_name = "Service Spoke"
-
-    OPERATIONALSTATE = (
-        ('active', 'Active'),
-        ('inactive', 'Inactive')
-    )
-
-    ADMINISTRATIVE_STATE = (
-        ('disabled', 'Disabled'),
-        ('configured', 'Configured'),
-        ('impaired', 'Impaired'),
-        ('enabled', 'Enabled')
-    )
-
-    vnodlocalsite = models.ForeignKey(Site,
-                      related_name='VnodLocalSite',
-                      verbose_name="VnodLocalSite",
-                      editable=True,
-                      on_delete=models.CASCADE)
-
-    vnodlocalport = models.ForeignKey(RemotePort,
-                                      related_name='VnodLocalPort',
-                                      verbose_name="VnodLocalPort",
-                                      editable=True,
-                                      on_delete=models.CASCADE)
-
-    id = models.AutoField(verbose_name="id", primary_key=True, editable=False)
-    name = models.CharField(unique=True, verbose_name="Name", max_length=256, editable=True)
-    remotesubscriber = models.CharField(verbose_name="RemoteSubscriber", max_length=256, blank=True, editable=False)
-    remotevnodid = models.CharField(verbose_name="RemoteVnodId", max_length=256, blank=True, editable=False)
-    autoattached = models.BooleanField(verbose_name="Auto-Attached", default=False, editable=True)
-    operstate = models.CharField(choices=OPERATIONALSTATE, verbose_name="OperationalState", max_length=256,
-                                 editable=True, default='inactive')
-    adminstate = models.CharField(choices=ADMINISTRATIVE_STATE, default='disabled', verbose_name="AdministrativeState",
-                                           max_length=64, editable=True)
-
-    def __init__(self, *args, **kwargs):
-        super(ServiceSpoke, self).__init__(*args, **kwargs)
-
-    def __unicode__(self):  return u'%s' % (self.name)
-
-class VnodGlobalService(Service):
-
-    class Meta:
-        app_label = SERVICE_NAME
-        verbose_name = "Virtual Network On Demand Global Service"
-
-    TYPE = (
-        ('eline', SERVICE_NAME_ELINE_VERBOSE),
-        ('elan', SERVICE_NAME_ELAN_VERBOSE),
-        ('etree', SERVICE_NAME_ETREE_VERBOSE),
-    )
-
-    OPERATIONALSTATE = (
-        ('active', 'Active'),
-        ('inactive', 'Inactive')
-    )
-
-    ADMINISTRATIVESTATE = (
-        ('disabled', 'Disabled'),
-        ('activationrequested', 'ActivationRequested'),
-        ('enabled', 'Enabled'),
-        ('invalid', 'Invalid'),
-        ('deactivationrequested', 'DeactivationRequested')
-    )
-
-    servicehandle = models.CharField(unique=True, verbose_name="Servicehandle", max_length=64, editable=True)
-    vlanid = models.CharField(verbose_name="Vlanid", max_length=64, editable=True)
-    type = models.CharField(choices=TYPE, verbose_name="Type", max_length=256, editable=True)
-
-    metronetworkroottomultipoint = models.ForeignKey(NetworkEdgeToMultipointConnection,
-                            related_name='EtreeService',
-                            verbose_name="EtreeService",
-                            null=True,
-                            editable=True,
-                            on_delete=models.CASCADE)
-
-    metronetworkmultipoint = models.ForeignKey(NetworkMultipointToMultipointConnection,
-                                                     related_name='ElanService',
-                                                     verbose_name="ElanService",
-                                                     null=True,
-                                                     editable=True,
-                                                     on_delete=models.CASCADE)
-
-    metronetworkpointtopoint = models.ForeignKey(NetworkEdgeToEdgePointConnection,
-                                               related_name='ElineService',
-                                               verbose_name="ElineService",
-                                               null=True,
-                                               editable=True,
-                                               on_delete=models.CASCADE)
-
-    operstate = models.CharField(choices=OPERATIONALSTATE, verbose_name="OperationalState", max_length=256,
-                                 editable=True)
-
-    adminstate = models.CharField(choices=ADMINISTRATIVESTATE, verbose_name="AdministrativeState", max_length=256,
-                                  editable=True, default='enabled')
-
-    spokes = models.ManyToManyField(ServiceSpoke,
-                                 related_name='ServiceSpokes',
-                                 verbose_name="Spokes",
-                                 editable=True)
-
-    bandwidthProfile = models.ForeignKey(BandwidthProfile,
-                                               related_name='BandwidthProfile',
-                                               verbose_name="BandwidthProfile",
-                                               editable=True,
-                                               on_delete=models.CASCADE)
-
-    def __init__(self, *args, **kwargs):
-        super(VnodGlobalService, self).__init__(*args, **kwargs)
-
-
-class UserNetworkInterface(PlCoreBase):
-
-    class Meta:
-        app_label = METRONETWORK_KIND
-        verbose_name = "User Network Interface"
-
-    id = models.AutoField(verbose_name="id", primary_key=True, editable=False)
-    enabled = models.IntegerField(verbose_name="State of UNI", editable=True)
-    capacity = models.IntegerField(verbose_name="UNI Capacity", editable=True)
-    bw_used = models.IntegerField(verbose_name="UNI bandwidth used", editable=True)
-    vlanIds = models.CharField(verbose_name="VlanIds in this UNI", max_length=256, editable=True)
-    location = models.CharField(verbose_name="Location", max_length=256, editable=True, blank=True)
-    latlng = models.CharField(verbose_name="Latitude/Longitude", max_length=50, editable=True, blank=True)
-    name = models.CharField(unique=True, verbose_name="Name", max_length=256, editable=True)
-
-    def __init__(self, *args, **kwargs):
-        super(UserNetworkInterface, self).__init__(*args, **kwargs)
-
-    def __unicode__(self):  return u'%s' % (self.name)
-
-    def save(self, *args, **kwargs):
-
-        if self.latlng:
-            try:
-                latlng_value = getattr(self, 'latlng').strip()
-                if (latlng_value.startswith('[') and latlng_value.endswith(']') and latlng_value.index(',') > 0):
-                    lat = latlng_value[1: latlng_value.index(',')].strip()
-                    lng = latlng_value[latlng_value.index(',') + 1: len(latlng_value) - 1].strip()
-
-                    # If lat and lng are not floats, the code below should result in an error.
-                    lat_validation = float(lat)
-                    lng_validation = float(lng)
-                else:
-                    raise ValueError("The lat/lng value is not formatted correctly.")
-            except:
-                raise ValueError("The lat/lng value is not formatted correctly.")
-
-        super(UserNetworkInterface, self).save(*args, **kwargs)
\ No newline at end of file
