[CORD-1324-1328-1330-1331] Models for refactored Global ECORD service

Change-Id: Ib9c02d25bd65729c7faaa48d40b54a2ce6ffffac
diff --git a/xos/synchronizer/invokers/__init__.py b/__init__.py
similarity index 100%
copy from xos/synchronizer/invokers/__init__.py
copy to __init__.py
diff --git a/xos/Makefile.service b/xos/Makefile.service
new file mode 100644
index 0000000..9fb96f4
--- /dev/null
+++ b/xos/Makefile.service
@@ -0,0 +1,18 @@
+# Replace the line below with the location of xosgen
+PREFIX=.
+XOSGEN=$(PREFIX)/tool/xosgen
+
+DJANGO_TARGET=$(PREFIX)/targets/service.xtarget
+XPROTOS_TMP := $(shell mktemp)
+
+xprotos = $(wildcard *.xproto)
+
+all: models.py
+
+models.py: $(xprotos)
+	$(XOSGEN) --attic attic --target $(DJANGO_TARGET) --output $@ $<
+
+.PHONY: all
+	
+clean:
+	rm -f models.py
diff --git a/xos/admin.py b/xos/admin.py
index 9f5a2b0..10814b0 100644
--- a/xos/admin.py
+++ b/xos/admin.py
@@ -4,120 +4,36 @@
 from core.admin import XOSBaseAdmin
 from django.contrib import admin
 from django import forms
-from services.metronetwork.models import *
 
 
-class MetroNetworkSystemAdmin(ReadOnlyAwareAdmin):
-    model = MetroNetworkSystem
-    verbose_name = "MetroNetwork System"
-    verbose_name_plural = "MetroNetwork System"
-    list_display = ("name", "administrativeState")
-    list_display_links = ('name',)
-    fieldsets = [(None, {
-        'fields': ['name', 'administrativeState', 'description'],
-        'classes': ['suit-tab suit-tab-general']})]
-
-class NetworkDeviceAdminForm(forms.ModelForm):
-
-    password = forms.CharField(required=False, widget = forms.PasswordInput(render_value=True))
-
-    class Meta:
-        model = NetworkDevice
-        fields = '__all__'
-
-
-class NetworkDeviceAdmin(XOSBaseAdmin):
-    verbose_name = "Network Device"
-    verbose_name_plural = "Network Devices"
-    form = NetworkDeviceAdminForm
-    list_display = ('id', 'restCtrlUrl', 'administrativeState', 'username')
-    list_display_links = ('id', 'restCtrlUrl', 'administrativeState', 'username')
-
-    fields = ('id', 'restCtrlUrl', 'administrativeState', 'username', 'password')
-
-class NetworkEdgePortAdmin(XOSBaseAdmin):
-    verbose_name = "Network Edge Port"
-    verbose_name_plural = "Network Edge Ports"
-    list_display = ('id', 'pid', 'element', 'bwpCfgCbs', 'bwpCfgEbs', 'bwpCfgCir', 'bwpCfgEir', 'name', 'location', 'latlng')
-    list_display_links = ('id', 'pid', 'element', 'bwpCfgCbs', 'bwpCfgEbs', 'bwpCfgCir', 'bwpCfgEir')
-
-    fields = ('id', 'pid', 'element', 'bwpCfgCbs', 'bwpCfgEbs', 'bwpCfgCir', 'bwpCfgEir', 'name', 'location', 'latlng')
-    readonly_fields = ('id', 'pid', 'element', 'bwpCfgCbs', 'bwpCfgEbs', 'bwpCfgCir', 'bwpCfgEir')
-
-class NetworkEdgeToEdgePointConnectionAdmin(XOSBaseAdmin):
-    verbose_name = "Metro Network E-Line Service"
-    verbose_name_plural = "Metro Network E-Line Services"
-    list_display = ('id', 'name', 'sid', 'type', 'vlanid', 'uni1', 'uni2', 'adminstate', 'operstate')
-    list_display_links = ('id', 'name', 'sid', 'type', 'vlanid', 'uni1', 'uni2', 'adminstate', 'operstate')
-
-    fields = ('id', 'name', 'sid', 'type', 'vlanid', 'uni1', 'uni2', 'adminstate', 'operstate', 'backend_status')
-    readonly_fields = ('id', 'sid', 'backend_status')
-
-class NetworkMultipointToMultipointConnectionAdmin(XOSBaseAdmin):
-    verbose_name = "Metro Network E-LAN Service"
-    verbose_name_plural = "Metro Network E-LAN Services"
-    list_display = ('id', 'name', 'sid', 'type', 'vlanid', 'adminstate', 'operstate')
-    list_display_links = ('id', 'name', 'sid', 'type', 'vlanid', 'adminstate', 'operstate')
-
-    fields = ('id', 'name', 'sid', 'type', 'vlanid', 'eps', 'adminstate', 'operstate', 'backend_status')
-    readonly_fields = ('id', 'sid', 'backend_status')
-
-class NetworkEdgeToMultipointConnectionAdmin(XOSBaseAdmin):
-    verbose_name = "Metro Network E-Tree Service"
-    verbose_name_plural = "Metro Network E-Tree Services"
-    list_display = ('id', 'name', 'sid', 'type', 'vlanid', 'adminstate', 'operstate')
-    list_display_links = ('id', 'name', 'sid', 'type', 'vlanid', 'adminstate', 'operstate')
-
-    fields = ('id', 'name', 'sid', 'type', 'vlanid', 'root', 'eps', 'adminstate', 'operstate', 'backend_status')
-    readonly_fields = ('id', 'sid', 'backend_status')
-
-class RemotePortAdmin(XOSBaseAdmin):
-    verbose_name = "Remote Port"
-    verbose_name_plural = "Remote Ports"
-    list_display = ('name', 'remoteportsite', 'edgeport')
-    list_display_links = ('name', 'remoteportsite', 'edgeport')
-
-    fields = ('name', 'remoteportsite', 'edgeport')
-
-class BandwidthProfileAdmin(XOSBaseAdmin):
+class XOSMetronetBandwithProfileAdmin(XOSBaseAdmin):
     verbose_name = "Bandwidth Profile"
-    verbose_name_plural = "Bandwidth Profiles"
-    list_display = ('bwpcfgcbs', 'bwpcfgebs', 'bwpcfgcir', 'bwpcfgeir', 'name')
-    list_display_links = ('bwpcfgcbs', 'bwpcfgebs', 'bwpcfgcir', 'bwpcfgeir', 'name')
+    list_display = ('cbs','ebs','cir','eir','name')
 
-    fields = ('bwpcfgcbs', 'bwpcfgebs', 'bwpcfgcir', 'bwpcfgeir', 'name')
+    fields = ('cbs', 'ebs', 'cir', 'eir', 'name')
 
-class ServiceSpokeAdmin(XOSBaseAdmin):
-    verbose_name = "Service Spoke"
-    verbose_name_plural = "Service Spokes"
-    list_display = ('name','vnodlocalsite', 'remotesubscriber', 'adminstate', 'operstate', 'autoattached')
-    list_display_links = ('name','vnodlocalsite', 'remotesubscriber', 'adminstate', 'operstate', 'autoattached')
+class XOSMetronetUNIAdmin(XOSBaseAdmin):
+    verbose_name = "User Network Interface"
+    list_display = ('tenant', 'vlanIds', 'cpe_id', 'latlng', 'name')
+    fields = ('tenant','vlanIds', 'cpe_id', 'latlng', 'name')
 
-    fields = ('name', 'id','vnodlocalsite', 'vnodlocalport', 'remotesubscriber', 'adminstate', 'operstate', 'backend_status', 'autoattached')
-    readonly_fields = ('id', 'remotesubscriber', 'adminstate', 'operstate', 'backend_status')
+class XOSMetronetEnterpriseLocationAdmin(XOSBaseAdmin):
+    verbose_name = "Enterprise Location"
+    list_display = ('name', 'cord_site_ip', 'cord_site_port', 'cord_site_username', 'cord_site_password', 'cord_site_type')
+    fields = ('name', 'cord_site_ip', 'cord_site_port', 'cord_site_username', 'cord_site_password', 'cord_site_type')
 
-class VnodGlobalServiceAdmin(XOSBaseAdmin):
-    verbose_name = "VNOD Global Service"
-    verbose_name_plural = "VNOD Global Services"
-    list_display = ('servicehandle', 'vlanid', 'type','operstate', 'adminstate')
-    list_display_links = ('servicehandle', 'vlanid', 'type','operstate', 'adminstate')
+class XOSMetronetOnosModelAdmin(XOSBaseAdmin):
+    verbose_name = "Open Network Operating System"
+    list_display = ('name', 'onos_ip', 'onos_port', 'onos_username', 'onos_password', 'onos_type')
+    fields = ('name', 'onos_ip', 'onos_port', 'onos_username', 'onos_password', 'onos_type')
 
-    fields = (
-        'id', 'servicehandle', 'vlanid', 'type', 'metronetworkmultipoint', 'metronetworkpointtopoint', 'metronetworkroottomultipoint', 'operstate', 'adminstate', 'spokes', 'bandwidthProfile')
-    readonly_fields = (
-        'id', 'operstate', 'backend_status', 'metronetworkmultipoint', 'metronetworkpointtopoint', 'metronetworkroottomultipoint')
+class XOSMetronetELineAdmin(XOSBaseAdmin):
+    verbose_name = "Ethernet Virtual Private Line"
+    list_display = ('name', 'connect_point_1_id', 'connect_point_2_id', 'vlanids', 'cord_site_name', 'bwp')
+    fields = ('name', 'connect_point_1_id', 'connect_point_2_id', 'vlanids', 'cord_site_name', 'bwp')
 
-admin.site.register(MetroNetworkSystem, MetroNetworkSystemAdmin)
-admin.site.register(NetworkDevice, NetworkDeviceAdmin)
-admin.site.register(NetworkEdgePort, NetworkEdgePortAdmin)
-admin.site.register(NetworkEdgeToEdgePointConnection, NetworkEdgeToEdgePointConnectionAdmin)
-admin.site.register(NetworkMultipointToMultipointConnection, NetworkMultipointToMultipointConnectionAdmin)
-admin.site.register(NetworkEdgeToMultipointConnection, NetworkEdgeToMultipointConnectionAdmin)
-admin.site.register(BandwidthProfile, BandwidthProfileAdmin)
-admin.site.register(ServiceSpoke, ServiceSpokeAdmin)
-admin.site.register(VnodGlobalService, VnodGlobalServiceAdmin)
-admin.site.register(RemotePort, RemotePortAdmin)
-
-
-
-
+admin.site.register(XOSMetronetBandwithProfile, XOSMetronetBandwithProfileAdmin)
+admin.site.register(XOSMetronetUNI, XOSMetronetUNIAdmin)
+admin.site.register(XOSMetronetEnterpriseLocation, XOSMetronetEnterpriseLocationAdmin)
+admin.site.register(XOSMetronetOnosModel, XOSMetronetOnosModelAdmin)
+admin.site.register(XOSMetronetELine, XOSMetronetELineAdmin)
\ No newline at end of file
diff --git a/xos/api/service/metronetworkservice/metronetworkservice.py b/xos/api/service/metronetworkservice/metronetworkservice.py
deleted file mode 100644
index cf6623d..0000000
--- a/xos/api/service/metronetworkservice/metronetworkservice.py
+++ /dev/null
@@ -1,908 +0,0 @@
-from django.http import HttpResponseBadRequest
-from rest_framework.response import Response
-from rest_framework.views import APIView
-from rest_framework import serializers, filters, status
-from api.xosapi_helpers import PlusModelSerializer, XOSViewSet, ReadOnlyField
-from services.metronetwork.models import *
-from random import randint
-import json
-from django.core.exceptions import ObjectDoesNotExist
-from django.core import serializers as jsonserializer
-
-class MetroNetworkSystemSerializer(PlusModelSerializer):
-        id = ReadOnlyField()
-        humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-
-        class Meta:
-            model = MetroNetworkSystem
-            fields = ('humanReadableName',
-                      'id',
-                      'restUrl',
-                      'administrativeState',
-                      'operationalState')
-
-        def getHumanReadableName(self, obj):
-            return obj.name
-
-class MetroNetworkSystemViewSet(XOSViewSet):
-    base_name = "metronetworksystem"
-    method_name = "metronetworksystem"
-    method_kind = "viewset"
-    queryset = MetroNetworkSystem.objects.all()
-    serializer_class = MetroNetworkSystemSerializer
-
-    @classmethod
-    def get_urlpatterns(self, api_path="^"):
-        patterns = super(MetroNetworkSystemViewSet, self).get_urlpatterns(api_path=api_path)
-
-        return patterns
-
-    def list(self, request):
-        object_list = self.filter_queryset(self.get_queryset())
-
-        serializer = self.get_serializer(object_list, many=True)
-
-        return Response(serializer.data)
-
-
-class NetworkEdgePortSerializer(PlusModelSerializer):
-    id = ReadOnlyField()
-    humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-
-    class Meta:
-        model = NetworkEdgePort
-        fields = ('humanReadableName',
-                  'pid',
-                  'id',
-                  'element',
-                  'bwpCfgCbs',
-                  'bwpCfgEbs',
-                  'bwpCfgCir',
-                  'bwpCfgEir',
-                  'name',
-                  'location',
-                  'latlng')
-
-
-    def getHumanReadableName(self, obj):
-        return obj.id
-
-class NetworkEdgePortViewSet(XOSViewSet):
-    base_name = "UNI"
-    method_name = "UNI"
-    method_kind = "viewset"
-    queryset = NetworkEdgePort.objects.all()
-    serializer_class = NetworkEdgePortSerializer
-
-    @classmethod
-    def get_urlpatterns(self, api_path="^"):
-        patterns = super(NetworkEdgePortViewSet, self).get_urlpatterns(api_path=api_path)
-
-        return patterns
-
-    def list(self, request):
-        object_list = self.filter_queryset(self.get_queryset())
-
-        serializer = self.get_serializer(object_list, many=True)
-
-        return Response(serializer.data)
-
-class NetworkEdgeToEdgePointConnectionSerializer(PlusModelSerializer):
-    humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-    uni1 = NetworkEdgePortSerializer(required=True, read_only=False)
-    uni2 = NetworkEdgePortSerializer(required=True, read_only=False)
-
-    class Meta:
-        model = NetworkEdgeToEdgePointConnection
-
-        fields = ('humanReadableName',
-                  'sid',
-                  'id',
-                  'type',
-                  'uni1',
-                  'uni2',
-                  'operstate',
-                  'adminstate'
-                  )
-
-    def getHumanReadableName(self, obj):
-        return obj.id
-
-class NetworkEdgeToEdgePointConnectionViewSet(XOSViewSet):
-    base_name = "ELINE"
-    method_name = "ELINE"
-    method_kind = "viewset"
-    queryset = NetworkEdgeToEdgePointConnection.get_service_objects().all()
-    serializer_class = NetworkEdgeToEdgePointConnectionSerializer
-
-    @classmethod
-    def get_urlpatterns(self, api_path="^"):
-        patterns = super(NetworkEdgeToEdgePointConnectionViewSet, self).get_urlpatterns(api_path=api_path)
-
-        return patterns
-
-    def list(self, request):
-
-        object_list = self.filter_queryset(self.get_queryset())
-
-        serializer = self.get_serializer(object_list, many=True)
-
-        return Response(serializer.data)
-
-    def destroy(self, request, pk=None):
-        ELineConnectionToDelete = NetworkEdgeToEdgePointConnection.objects.get(pk=pk)
-
-        if (ELineConnectionToDelete):
-            ELineConnectionToDelete.adminstate = 'deactivationrequested'
-            ELineConnectionToDelete.save()
-        else:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-
-        return Response(status=status.HTTP_200_OK)
-
-
-    def create(self, validated_data):
-
-        ELineConnection = NetworkEdgeToEdgePointConnection()
-        ELineConnection.sid = validated_data.data.get('sid')
-        ELineConnection.adminstate = validated_data.data.get('adminstate')
-        ELineConnection.operstate = validated_data.data.get('operstate')
-        ELineConnection.sid = validated_data.data.get('sid')
-        ELineConnection.type = 'Point_To_Point'
-
-        uni1 = validated_data.data.get('uni1')
-        uni2 = validated_data.data.get('uni2')
-
-        uni1 = NetworkEdgePort.objects.get(pk=uni1['id'])
-        uni2 = NetworkEdgePort.objects.get(pk=uni2['id'])
-
-        ELineConnection.uni1 = uni1
-        ELineConnection.uni2 = uni2
-        ELineConnection.save()
-
-        response_data = {}
-        response_data['sid'] = ELineConnection.sid
-        response_data['adminstate'] = ELineConnection.adminstate
-        response_data['operstate'] = ELineConnection.operstate
-        response_data['type'] = ELineConnection.type
-
-        response_data['uni1'] = {}
-        response_data['uni1']['id'] = uni1.id
-        response_data['uni1']['pid'] = uni1.pid
-        response_data['uni1']['bwpCfgCbs'] = uni1.bwpCfgCbs
-        response_data['uni1']['bwpCfgEbs'] = uni1.bwpCfgEbs
-        response_data['uni1']['bwpCfgCir'] = uni1.bwpCfgCir
-        response_data['uni1']['bwpCfgEir'] = uni1.bwpCfgEir
-        response_data['uni1']['name'] = uni1.name
-        response_data['uni1']['location'] = uni1.location
-        response_data['uni1']['latlng'] = uni1.latlng
-
-        response_data['uni2'] = {}
-        response_data['uni2']['id'] = uni2.id
-        response_data['uni2']['pid'] = uni2.pid
-        response_data['uni2']['bwpCfgCbs'] = uni2.bwpCfgCbs
-        response_data['uni2']['bwpCfgEbs'] = uni2.bwpCfgEbs
-        response_data['uni2']['bwpCfgCir'] = uni2.bwpCfgCir
-        response_data['uni2']['bwpCfgEir'] = uni2.bwpCfgEir
-        response_data['uni2']['name'] = uni1.name
-        response_data['uni2']['location'] = uni1.location
-        response_data['uni2']['latlng'] = uni1.latlng
-
-        return Response(response_data)
-
-class NetworkEdgeToMultipointConnectionSerializer(PlusModelSerializer):
-    humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-    root = NetworkEdgePortSerializer(required=True, read_only=False)
-    eps = NetworkEdgePortSerializer(required=True, read_only=False, many=True)
-
-    class Meta:
-        model = NetworkEdgeToMultipointConnection
-
-        fields = ('humanReadableName',
-                  'sid',
-                  'id',
-                  'type',
-                  'root',
-                  'eps',
-                  'operstate',
-                  'adminstate'
-                  )
-
-    def getHumanReadableName(self, obj):
-        return obj.id
-
-class NetworkEdgeToMultipointConnectionViewSet(XOSViewSet):
-    base_name = "ETREE"
-    method_name = "ETREE"
-    method_kind = "viewset"
-    queryset = NetworkEdgeToMultipointConnection.get_service_objects().all()
-    serializer_class = NetworkEdgeToMultipointConnectionSerializer
-
-    @classmethod
-    def get_urlpatterns(self, api_path="^"):
-        patterns = super(NetworkEdgeToMultipointConnectionViewSet, self).get_urlpatterns(api_path=api_path)
-
-        return patterns
-
-    def list(self, request):
-
-        object_list = self.filter_queryset(self.get_queryset())
-
-        serializer = self.get_serializer(object_list, many=True)
-
-        return Response(serializer.data)
-
-    def destroy(self, request, pk=None):
-        ETreeConnectionToDelete = NetworkEdgeToMultipointConnection.objects.get(pk=pk)
-
-        if (ETreeConnectionToDelete):
-            ETreeConnectionToDelete.adminstate = 'deactivationrequested'
-            ETreeConnectionToDelete.save()
-        else:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-
-        return Response(status=status.HTTP_200_OK)
-
-    def create(self, validated_data):
-
-        ETreeConnection = NetworkEdgeToMultipointConnection()
-        ETreeConnection.sid = validated_data.data.get('sid')
-        ETreeConnection.adminstate = validated_data.data.get('adminstate')
-        ETreeConnection.operstate = validated_data.data.get('operstate')
-        ETreeConnection.sid = validated_data.data.get('sid')
-        ETreeConnection.type = 'Root_Multipoint'
-
-        root_id = validated_data.data.get('root')
-        eps_list = validated_data.data.get('eps')
-
-        root = NetworkEdgePort.objects.get(pk=root_id)
-        ETreeConnection.root = root
-        ETreeConnection.save()
-
-        for ep in eps_list:
-            port = NetworkEdgePort.objects.get(pk=ep['id'])
-            ETreeConnection.eps.add(port)
-
-        response_data = {}
-        response_data['sid'] = ETreeConnection.sid
-        response_data['adminstate'] = ETreeConnection.adminstate
-        response_data['operstate'] = ETreeConnection.operstate
-        response_data['type'] = ETreeConnection.type
-
-        response_data['root'] = {}
-        response_data['root']['id'] = root.id
-        response_data['root']['pid'] = root.pid
-        response_data['root']['bwpCfgCbs'] = root.bwpCfgCbs
-        response_data['root']['bwpCfgEbs'] = root.bwpCfgEbs
-        response_data['root']['bwpCfgCir'] = root.bwpCfgCir
-        response_data['root']['bwpCfgEir'] = root.bwpCfgEir
-        response_data['root']['name'] = root.name
-        response_data['root']['location'] = root.location
-        response_data['root']['latlng'] = root.latlng
-
-        eps_data = []
-        for ep in ETreeConnection.eps.all():
-            port = {}
-            port['id'] = ep.id
-            port['pid'] = ep.pid
-            port['bwpCfgCbs'] = ep.bwpCfgCbs
-            port['bwpCfgEbs'] = ep.bwpCfgEbs
-            port['bwpCfgCir'] = ep.bwpCfgCir
-            port['bwpCfgEir'] = ep.bwpCfgEir
-            port['name'] = ep.name
-            port['location'] = ep.location
-            port['latlng'] = ep.latlng
-            eps_data.append(port)
-
-        response_data['eps'] = eps_data
-
-        return Response(response_data)
-
-class NetworkMultipointToMultipointConnectionSerializer(PlusModelSerializer):
-    humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-    eps = NetworkEdgePortSerializer(required=True, read_only=False, many=True)
-
-    class Meta:
-        model = NetworkMultipointToMultipointConnection
-
-        fields = ('humanReadableName',
-                  'sid',
-                  'id',
-                  'type',
-                  'eps',
-                  'operstate',
-                  'adminstate'
-                  )
-
-    def getHumanReadableName(self, obj):
-        return obj.id
-
-class NetworkMultipointToMultipointConnectionViewSet(XOSViewSet):
-    base_name = "ELAN"
-    method_name = "ELAN"
-    method_kind = "viewset"
-    queryset = NetworkMultipointToMultipointConnection.get_service_objects().all()
-    serializer_class = NetworkMultipointToMultipointConnectionSerializer
-
-    @classmethod
-    def get_urlpatterns(self, api_path="^"):
-        patterns = super(NetworkMultipointToMultipointConnectionViewSet, self).get_urlpatterns(api_path=api_path)
-
-        return patterns
-
-    def list(self, request):
-
-        object_list = self.filter_queryset(self.get_queryset())
-
-        serializer = self.get_serializer(object_list, many=True)
-
-        return Response(serializer.data)
-
-    def destroy(self, request, pk=None):
-        ETreeConnectionToDelete = NetworkMultipointToMultipointConnection.objects.get(pk=pk)
-
-        if (ETreeConnectionToDelete):
-            ETreeConnectionToDelete.adminstate = 'deactivationrequested'
-            ETreeConnectionToDelete.save()
-        else:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-
-        return Response(status=status.HTTP_200_OK)
-
-    def create(self, validated_data):
-
-        ELanConnection = NetworkMultipointToMultipointConnection()
-        ELanConnection.sid = validated_data.data.get('sid')
-        ELanConnection.adminstate = validated_data.data.get('adminstate')
-        ELanConnection.operstate = validated_data.data.get('operstate')
-        ELanConnection.sid = validated_data.data.get('sid')
-        ELanConnection.type = 'Multipoint_To_Multipoint'
-
-        eps_list = validated_data.data.get('eps')
-        ELanConnection.save()
-
-        for ep in eps_list:
-            port = NetworkEdgePort.objects.get(pk=ep['id'])
-            ELanConnection.eps.add(port)
-
-        response_data = {}
-        response_data['sid'] = ELanConnection.sid
-        response_data['adminstate'] = ELanConnection.adminstate
-        response_data['operstate'] = ELanConnection.operstate
-        response_data['type'] = ELanConnection.type
-
-        eps_data = []
-        for ep in ELanConnection.eps.all():
-            port = {}
-            port['id'] = ep.id
-            port['pid'] = ep.pid
-            port['bwpCfgCbs'] = ep.bwpCfgCbs
-            port['bwpCfgEbs'] = ep.bwpCfgEbs
-            port['bwpCfgCir'] = ep.bwpCfgCir
-            port['bwpCfgEir'] = ep.bwpCfgEir
-            port['name'] = ep.name
-            port['location'] = ep.location
-            port['latlng'] = ep.latlng
-            eps_data.append(port)
-
-        response_data['eps'] = eps_data
-
-        return Response(response_data)
-
-############################
-
-class BandwidthProfileSerializer(PlusModelSerializer):
-    humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-
-    class Meta:
-        model = BandwidthProfile
-
-
-        fields = ('humanReadableName',
-                  'id',
-                  'bwpcfgcbs',
-                  'bwpcfgebs',
-                  'bwpcfgcir',
-                  'bwpcfgeir',
-                  'name'
-                  )
-
-    def getHumanReadableName(self, obj):
-        return obj.name
-
-class BandwidthProfileViewSet(XOSViewSet):
-    base_name = "BANDWIDTH_PROFILE"
-    method_name = "BANDWIDTH_PROFILE"
-    method_kind = "viewset"
-    queryset = BandwidthProfile.objects.all()
-    serializer_class = BandwidthProfileSerializer
-
-    @classmethod
-    def get_urlpatterns(self, api_path="^"):
-        patterns = super(BandwidthProfileViewSet, self).get_urlpatterns(api_path=api_path)
-
-        return patterns
-
-    def list(self, request):
-
-        object_list = self.filter_queryset(self.get_queryset())
-
-        serializer = self.get_serializer(object_list, many=True)
-
-        return Response(serializer.data)
-
-    def create(self, validated_data):
-
-        bandwidthProfile = BandwidthProfile()
-        bandwidthProfile.name = validated_data.data.get('name')
-        bandwidthProfile.bwpcfgcbs = validated_data.data.get('bwpcfgcbs')
-        bandwidthProfile.bwpcfgebs = validated_data.data.get('bwpcfgebs')
-        bandwidthProfile.bwpcfgcir = validated_data.data.get('bwpcfgcir')
-        bandwidthProfile.bwpcfgeir = validated_data.data.get('bwpcfgeir')
-
-        bandwidthProfile.save()
-
-        response_data = {}
-        response_data['name'] = bandwidthProfile.name
-        response_data['bwpcfgcbs'] = bandwidthProfile.bwpcfgcbs
-        response_data['bwpcfgebs'] = bandwidthProfile.bwpcfgebs
-        response_data['bwpcfgcir'] = bandwidthProfile.bwpcfgeir
-        response_data['bwpcfgcir'] = bandwidthProfile.bwpcfgcir
-        response_data['id'] = bandwidthProfile.id
-
-        return Response(response_data)
-
-class UserNetworkInterfaceSerializer(PlusModelSerializer):
-    humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-
-    class Meta:
-        model = UserNetworkInterface
-
-        fields = ('humanReadableName',
-                  'id',
-                  'bwpcfgcbs',
-                  'bwpcfgebs',
-                  'bwpcfgcir',
-                  'bwpcfgeir',
-                  'name'
-                  )
-
-    def getHumanReadableName(self, obj):
-        return obj.name
-
-class UserNetworkInterfaceViewSet(XOSViewSet):
-    base_name = "USER_NETWORK_INTERFACE"
-    method_name = "USER_NETWORK_INTERFACE"
-    method_kind = "viewset"
-    queryset = UserNetworkInterface.objects.all()
-    serializer_class = UserNetworkInterfaceSerializer
-
-    @classmethod
-    def get_urlpatterns(self, api_path="^"):
-        patterns = super(UserNetworkInterfaceViewSet, self).get_urlpatterns(api_path=api_path)
-
-        return patterns
-
-    def list(self, request):
-
-        object_list = self.filter_queryset(self.get_queryset())
-
-        serializer = self.get_serializer(object_list, many=True)
-
-        return Response(serializer.data)
-
-    def create(self, validated_data):
-
-        userNetworkInterface = UserNetworkInterface()
-
-        userNetworkInterface.name = validated_data.data.get('name')
-        userNetworkInterface.capacity = validated_data.data.get('capacity')
-        userNetworkInterface.bw_used = validated_data.data.get('bw_used')
-        userNetworkInterface.vlanIds = validated_data.data.get('vlanIds')
-        userNetworkInterface.location = validated_data.data.get('location')
-        userNetworkInterface.latlng = validated_data.data.get('latlng')
-
-        copyin_props = ['enabled', 'capacity', 'bw_used', 'vlanIds', 'location', 'latlng', 'name']
-
-        userNetworkInterface.save()
-
-        response_data = {}
-        response_data['name'] = userNetworkInterface.name
-        response_data['capacity'] = userNetworkInterface.capacity
-        response_data['bw_used'] = userNetworkInterface.bw_used
-        response_data['vlanIds'] = userNetworkInterface.vlanIds
-        response_data['location'] = userNetworkInterface.location
-        response_data['latlng'] = userNetworkInterface.latlng
-        response_data['id'] = userNetworkInterface.id
-
-        return Response(response_data)
-
-class VnodSiteSerializer(PlusModelSerializer):
-    humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-
-    class Meta:
-        model = Site
-
-        fields = ('humanReadableName',
-                  'site_url',
-                  'enabled',
-                  'longitude',
-                  'latitude',
-                  'name'
-                  )
-
-    def getHumanReadableName(self, obj):
-        return obj.name
-
-class RemotePortSerializer(PlusModelSerializer):
-    humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-    edgeport = NetworkEdgePortSerializer(read_only=True)
-    remoteportsite = VnodSiteSerializer(read_only=True)
-
-    class Meta:
-        model = RemotePort
-
-        fields = ('humanReadableName',
-                  'name',
-                  'edgeport',
-                  'id',
-                  'remoteportsite'
-                  )
-
-    def getHumanReadableName(self, obj):
-        return obj.name
-
-class ServiceSpokeSerializer(PlusModelSerializer):
-    humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-    vnodlocalsite = VnodSiteSerializer(read_only=True)
-    vnodlocalport = RemotePortSerializer(read_only=True)
-
-    class Meta:
-        model = ServiceSpoke
-
-        fields = ('humanReadableName',
-                  'id',
-                  'name',
-                  'remotesubscriber',
-                  'remotevnodid',
-                  'autoattached',
-                  'operstate',
-                  'vnodlocalsite',
-                  'vnodlocalport'
-                  )
-
-    def getHumanReadableName(self, obj):
-        return obj.name
-
-class VnodGlobalServiceSerializer(PlusModelSerializer):
-    humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-    metronetworkroottomultipoint = NetworkEdgeToMultipointConnectionSerializer(read_only=True)
-    metronetworkmultipoint = NetworkMultipointToMultipointConnectionSerializer(read_only=True)
-    metronetworkpointtopoint = NetworkEdgeToEdgePointConnectionSerializer(read_only=True)
-    spokes = ServiceSpokeSerializer(read_only=True, many=True)
-    bandwidthProfile = BandwidthProfileSerializer(read_only=True)
-
-    class Meta:
-        model = VnodGlobalService
-
-        fields = ('humanReadableName',
-                  'servicehandle',
-                  'vlanid',
-                  'id',
-                  'type',
-                  'operstate',
-                  'adminstate',
-                  'metronetworkroottomultipoint',
-                  'metronetworkmultipoint',
-                  'metronetworkpointtopoint',
-                  'spokes',
-                  'bandwidthProfile',
-                  'name'
-                  )
-
-    def getHumanReadableName(self, obj):
-        return obj.name
-
-class VnodGlobalServiceViewSet(XOSViewSet):
-    base_name = "VNOD_GLOBAL_SERVICE"
-    method_name = "VNOD_GLOBAL_SERVICE"
-    method_kind = "viewset"
-    queryset = VnodGlobalService.get_service_objects().all()
-    serializer_class = VnodGlobalServiceSerializer
-
-    @classmethod
-    def get_urlpatterns(self, api_path="^"):
-        patterns = super(VnodGlobalServiceViewSet, self).get_urlpatterns(api_path=api_path)
-
-        return patterns
-
-    def list(self, request):
-
-        object_list = self.filter_queryset(self.get_queryset())
-
-        serializer = self.get_serializer(object_list, many=True)
-
-        return Response(serializer.data)
-
-    def destroy(self, request, pk=None):
-        VnodGlobalServiceToDelete = VnodGlobalService.objects.get(pk=pk)
-
-        if (VnodGlobalServiceToDelete):
-            VnodGlobalServiceToDelete.adminstate = 'deactivationrequested'
-            VnodGlobalServiceToDelete.save()
-        else:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-
-        return Response(status=status.HTTP_200_OK)
-
-    def create(self, validated_data):
-
-        vnodGlobalService = VnodGlobalService()
-
-        vnodGlobalService.name = validated_data.data.get('name')
-
-        if VnodGlobalService.objects.filter(
-                name=vnodGlobalService.name).exists():
-            return HttpResponseBadRequest('Error: VnodGlobalService name \'' +  vnodGlobalService.name
-                            + '\' already exists.')
-
-        vnodGlobalService.servicehandle = validated_data.data.get('servicehandle')
-        vnodGlobalService.adminstate = 'enabled'
-        vnodGlobalService.operstate = 'inactive'
-        vnodGlobalService.type = validated_data.data.get('type')
-
-        vnodGlobalService.vlanid = self.getUniqueVlandId()
-
-        bandwidth_profile = validated_data.data.get('bandwidthProfile')
-        bandwidthprofile = BandwidthProfile.objects.get(pk=bandwidth_profile['id'])
-        if (bandwidth_profile):
-            vnodGlobalService.bandwidthProfile = bandwidthprofile
-
-        vnodGlobalService.save()
-
-        spokes_list = validated_data.data.get('spokes')
-        if (spokes_list is None):
-            vnodGlobalService.delete()
-            return HttpResponseBadRequest('Error: No spokes found in request.')
-
-        for spoke in spokes_list:
-            vnodlocalsite = Site.objects.get(pk=spoke['vnodlocalsite']['id'])
-            servicespoke = ServiceSpoke()
-            servicespoke.vnodlocalsite = vnodlocalsite
-            servicespoke.vnodlocalport = self.getRandomRemotePort(vnodlocalsite)
-            servicespoke.name = spoke['name']
-            if (spoke.get('autoattached')):
-                servicespoke.autoattached = spoke['autoattached']
-            servicespoke.operstate = 'inactive'
-            servicespoke.adminstate = 'disabled'
-            servicespoke.save()
-            vnodGlobalService.spokes.add(servicespoke)
-
-        serializer = self.get_serializer(vnodGlobalService)
-        return Response(serializer.data)
-
-    def getUniqueVlandId(self):
-        unique = False
-        while not unique:
-            vlanid = randint(1, 4095)
-            vnodglobalservice = VnodGlobalService.get_service_objects().filter(vlanid=vlanid)
-            if (not vnodglobalservice):
-                unique = True
-        return vlanid
-
-    def getRandomRemotePort(self, site):
-        remotePort = RemotePort.objects.get(remoteportsite__name=site.name)
-        if (remotePort):
-            return remotePort
-        return None
-
-    @classmethod
-    def calculateVnodGlobalOperState(self, servicehandle):
-        vnodglobalservice = VnodGlobalService.get_service_objects().filter(servicehandle=servicehandle)
-        if (not vnodglobalservice):
-            HttpResponseBadRequest('Error: Could not find VnodGlobalObject with servicehandle=' + servicehandle)
-
-        vnodglobalservice = vnodglobalservice[0]
-        all_spokes_active_and_enabled = True
-
-        for spoke in vnodglobalservice.spokes.all():
-            if (spoke.operstate != 'active' or spoke.adminstate != 'enabled'):
-                all_spokes_active_and_enabled = False
-                break;
-
-        if (all_spokes_active_and_enabled):
-            vnodglobalservice.operstate = 'active'
-        else:
-            vnodglobalservice.operstate = 'inactive'
-
-        vnodglobalservice.save()
-        return all_spokes_active_and_enabled
-
-    @classmethod
-    def createService(self, servicehandle):
-        vnodglobalservice = VnodGlobalService.get_service_objects().filter(servicehandle=servicehandle)
-        if (not vnodglobalservice):
-            HttpResponseBadRequest('Error: Could not find VnodGlobalObject with servicehandle=' + servicehandle)
-
-        vnodglobalservice = vnodglobalservice[0]
-        if (vnodglobalservice.type == 'eline'):
-
-            spokes = vnodglobalservice.spokes.all()
-            uni1 = spokes[0].vnodlocalport.edgeport
-            uni2 = spokes[1].vnodlocalport.edgeport
-            name = 'ELine-' + str(vnodglobalservice.id)
-            type = 'Point_To_Point'
-            operstate = 'active'
-            adminstate = 'activationrequested'
-
-            eline = NetworkEdgeToEdgePointConnection()
-            eline.name = name
-            eline.type = type
-            eline.operstate = operstate
-            eline.adminstate = adminstate
-            eline.vlanid = vnodglobalservice.vlanid
-            eline.sid = name
-            eline.uni1 = NetworkEdgePort.objects.get(pid=uni1.pid)
-            eline.uni2 = NetworkEdgePort.objects.get(pid=uni2.pid)
-
-            eline.save()
-            vnodglobalservice.metronetworkpointtopoint = eline
-            vnodglobalservice.save()
-
-        elif (vnodglobalservice.type == 'elan'):
-
-            spokes = vnodglobalservice.spokes.all()
-
-            name = 'ELAN-' + str(vnodglobalservice.id)
-            type = 'Multipoint_To_Multipoint'
-            operstate = 'active'
-            adminstate = 'activationrequested'
-
-            elan = NetworkMultipointToMultipointConnection()
-            elan.name = name
-            elan.type = type
-            elan.operstate = 'inactive'
-            elan.adminstate = 'disabled'
-            elan.vlanid = vnodglobalservice.vlanid
-            elan.save()
-
-            for spoke in spokes:
-                uni = NetworkEdgePort.objects.get(pid=spoke.vnodlocalport.edgeport.pid)
-                elan.eps.add(uni)
-
-            elan.operstate = operstate
-            elan.adminstate = adminstate
-            elan.save()
-
-            vnodglobalservice.metronetworkmultipoint = elan
-            vnodglobalservice.save()
-
-        # TODO: elif (vnodglobalservice.type == 'etree'):
-
-class VnodGlobalServiceAutoAttachmentView(APIView):
-    method_kind = "list"
-    method_name = "vnodglobal_api_autoattach"
-
-    def get(self, request, format=None):
-        params = request.query_params
-        sitename = params.get('sitename')
-
-        if ( sitename is None):
-            HttpResponseBadRequest("Error: Request requires] 'sitename' as a query param.")
-
-        vnodglobalservices = VnodGlobalService.get_service_objects().filter(spokes__autoattached=True,
-                                                                            spokes__operstate='inactive',
-                                                                            spokes__vnodlocalsite__name=sitename)
-
-        if (not vnodglobalservices):
-            HttpResponseBadRequest({"handles" : []})
-
-        handles = []
-        for vnodglobalservice in vnodglobalservices:
-            if (vnodglobalservice.adminstate != 'disabled'):
-                handles.append(vnodglobalservice.servicehandle)
-
-        response_data = {'servicehandles' : handles}
-        return Response(response_data)
-
-class VnodGlobalServiceConfigurationView(APIView):
-    method_kind = "list"
-    method_name = "vnodglobal_api_configuration"
-
-    def get(self, request, format=None):
-        params = request.query_params
-        servicehandle = params.get('servicehandle')
-        sitename = params.get('sitename')
-
-        if (servicehandle is None or sitename is None):
-            HttpResponseBadRequest("Error: Request requires 'servicehandle' and 'sitename' as query params.")
-
-        vnodglobalservice = VnodGlobalService.get_service_objects().filter(servicehandle=servicehandle)
-        if (not vnodglobalservice):
-            HttpResponseBadRequest('Error: Could not find VnodGlobalObject with servicehandle=' + servicehandle)
-
-        vnodglobalservice = vnodglobalservice[0]
-        response_data = {}
-        response_data['vlanid'] = vnodglobalservice.vlanid
-
-        for spoke in vnodglobalservice.spokes.all():
-            if (spoke.vnodlocalsite.name == sitename and spoke.adminstate != 'configured'):
-                response_data['port'] = {}
-                response_data['port']['name'] = spoke.vnodlocalport.name
-                break;
-
-        return Response(response_data)
-
-class VnodGlobalServiceActivationView(APIView):
-    method_kind = "list"
-    method_name = "vnodglobal_api_activation"
-
-    def post(self, request, format=None):
-        body_json = request.body
-        body = json.loads(body_json)
-
-        servicehandle=body['servicehandle']
-        sitename=body['sitename']
-        activate = body['activate']
-        vnodlocalid = body['vnodlocalid']
-        portid = body.get('portid')
-
-        if (activate == 'true' or activate == 'True'):
-            isActivate = True
-        else:
-            isActivate = False
-
-        vnodglobalservice = VnodGlobalService.get_service_objects().filter(servicehandle=servicehandle)
-        if (not vnodglobalservice):
-            HttpResponseBadRequest('Error: Could not find VnodGlobalObject with servicehandle=' + servicehandle)
-
-        vnodglobalservice = vnodglobalservice[0]
-
-        for spoke in vnodglobalservice.spokes.all():
-            if (spoke.vnodlocalsite.name == sitename and spoke.vnodlocalport.name == portid):
-                spoke_id = spoke.id
-                servicespoke = ServiceSpoke.objects.get(id=spoke_id)
-                servicespoke.remotevnodid = vnodlocalid
-                servicespoke.save()
-                break;
-
-        return Response()
-
-class VnodGlobalServiceAdminOperationalStateView(APIView):
-    method_kind = "list"
-    method_name = "vnodglobal_api_status"
-
-    def post(self, request, format=None):
-        body_json = request.body
-        body = json.loads(body_json)
-
-        servicehandle = body['servicehandle']
-        sitename = body['sitename']
-        operstate = body.get('operstate')
-        adminstate = body.get('adminstate')
-        portid = body.get('portid')
-
-        vnodglobalservice = VnodGlobalService.get_service_objects().filter(servicehandle=servicehandle)
-        if (not vnodglobalservice):
-            HttpResponseBadRequest('Error: Could not find VnodGlobalObject with servicehandle=' + servicehandle)
-
-        vnodglobalservice = vnodglobalservice[0]
-
-        for spoke in vnodglobalservice.spokes.all():
-            if (spoke.vnodlocalsite.name == sitename and spoke.vnodlocalport.name == portid):
-                spoke_id = spoke.id
-                servicespoke = ServiceSpoke.objects.get(id=spoke_id)
-                if (operstate):
-                    servicespoke.operstate = operstate
-                if (adminstate):
-                    servicespoke.adminstate = adminstate
-                servicespoke.save()
-                break;
-
-        isGlobalActive = VnodGlobalServiceViewSet.calculateVnodGlobalOperState(servicehandle=servicehandle)
-
-        if (vnodglobalservice.metronetworkmultipoint is None and vnodglobalservice.metronetworkpointtopoint is None and
-                    vnodglobalservice.metronetworkroottomultipoint is None and isGlobalActive):
-            VnodGlobalServiceViewSet.createService(servicehandle=servicehandle)
-
-        return Response()
diff --git a/xos/attic/remoteport_model.py b/xos/attic/eline_model.py
similarity index 100%
rename from xos/attic/remoteport_model.py
rename to xos/attic/eline_model.py
diff --git a/xos/attic/remoteport_model.py b/xos/attic/enterprisetenant_model.py
similarity index 100%
copy from xos/attic/remoteport_model.py
copy to xos/attic/enterprisetenant_model.py
diff --git a/xos/attic/header.py b/xos/attic/header.py
index f4db591..83b7a8c 100644
--- a/xos/attic/header.py
+++ b/xos/attic/header.py
@@ -6,8 +6,8 @@
 from core.models import PlCoreBase
 from core.models import Site
 
-METRONETWORK_KIND = "metronetwork"
-SERVICE_NAME = 'metronetwork'
+METRONETWORK_KIND = "metronet"
+SERVICE_NAME = 'metronet'
 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
deleted file mode 100644
index 358cf8d..0000000
--- a/xos/attic/metronetworksystem_model.py
+++ /dev/null
@@ -1,15 +0,0 @@
-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
deleted file mode 100644
index 52f17fe..0000000
--- a/xos/attic/networkedgeport_model.py
+++ /dev/null
@@ -1,22 +0,0 @@
-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/servicespoke_model.py b/xos/attic/servicespoke_model.py
deleted file mode 100644
index 3fd623e..0000000
--- a/xos/attic/servicespoke_model.py
+++ /dev/null
@@ -1 +0,0 @@
-def __unicode__(self):  return u'%s' % (self.name)
diff --git a/xos/attic/remoteport_model.py b/xos/attic/transportnetowrk_model.py
similarity index 100%
copy from xos/attic/remoteport_model.py
copy to xos/attic/transportnetowrk_model.py
diff --git a/xos/attic/usernetworkinterfaces_model.py b/xos/attic/usernetworkinterface_model.py
similarity index 100%
rename from xos/attic/usernetworkinterfaces_model.py
rename to xos/attic/usernetworkinterface_model.py
diff --git a/xos/metronetwork-onboard.yaml b/xos/metro-net-onboard.yaml
similarity index 70%
rename from xos/metronetwork-onboard.yaml
rename to xos/metro-net-onboard.yaml
index e4ecb69..4608141 100644
--- a/xos/metronetwork-onboard.yaml
+++ b/xos/metro-net-onboard.yaml
@@ -7,16 +7,16 @@
 
 topology_template:
   node_templates:
-     servicecontroller#metronetwork:
+     # this is the culprit probably
+     metronet:
       type: tosca.nodes.ServiceController
       properties:
           base_url: file:///opt/xos_services/metro-net/xos/
           # The following will concatenate with base_url automatically, if
           # base_url is non-null.
           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
+          synchronizer_run: metronetwork-synchronizer.py
           tosca_custom_types: metronet.yaml
+          tosca_resource: tosca/resources/metronetservice.py
+          #admin: admin.py
diff --git a/xos/metronet.m4 b/xos/metronet.m4
index c9e6eb8..9c5a807 100644
--- a/xos/metronet.m4
+++ b/xos/metronet.m4
@@ -7,110 +7,198 @@
 
 node_types:
 
-   tosca.nodes.VNodGlobalService:
-        description: >
-            CORD: The MetroNet Service.
-        derived_from: tosca.nodes.Root
-        capabilities:
-            xos_base_service_caps
-        properties:
-            xos_base_props
-            xos_base_service_props
-
-   tosca.nodes.MetroNetworkSystem:
-        derived_from: tosca.nodes.Root
-        description: >
-            CORD: The Metro Network Service.
-        capabilities:
-            xos_base_service_caps
-        properties:
-            xos_base_props
-            xos_base_service_props
-            administrativeState:
-                type: string
-                required: true
-            restUrl:
-                type: string
-                required: false
-
-
-   tosca.nodes.MetroNetworkDevice:
-        derived_from: tosca.nodes.Root
-        description: >
-            CORD: The Metro Network Device.
-        properties:
-            xos_base_props
-            restCtrlUrl:
-                type: string
-                required: true
-            username:
-                type: string
-                required: true
-            password:
-                type: string
-                required: true
-            administrativeState:
-                type: string
-                required: true
-            authType:
-                type: string
-                required: false
-            id:
-                type: string
-                required: true
-
-   tosca.nodes.EcordBandwidthProfile:
+    tosca.nodes.BandwidthProfile:
         derived_from: tosca.nodes.Root
         description: >
             CORD: The ecord bandwith profile.
         capabilities:
         properties:
-            xos_base_props
-            bwpcfgcbs:
+            no-delete:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to delete this object
+            no-create:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to create this object
+            no-update:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to update this object
+            replaces:
+                type: string
+                required: false
+                descrption: Replaces/renames this object
+            cbs:
                 type: integer
                 required: false
-            bwpcfgebs:
+            ebs:
                 type: integer
                 required: false
-            bwpcfgcir:
+            cir:
                 type: integer
                 required: false
-            bwpcfgeir:
+            eir:
                 type: integer
                 required: false
             name:
                 type: string
                 required: true
 
-   tosca.nodes.EcordUserNetworkInterface:
+    tosca.nodes.UserNetworkInterface:
         derived_from: tosca.nodes.Root
         description: >
             CORD: The ecord user netowrk interface
         capabilities:
         properties:
-            xos_base_props
-            enabled:
+            no-delete:
                 type: boolean
-                required: false
-            capacity:
-                type: integer
-                required: false
-            bw_used:
-                type: integer
-                required: false
-            vlanIds:
+                default: false
+                description: Do not allow Tosca to delete this object
+            no-create:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to create this object
+            no-update:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to update this object
+            replaces:
                 type: string
                 required: false
+                descrption: Replaces/renames this object
+            cpe_id:
+                type: string
+                required: false
+            tenant:
+                type: string
+                required: true
             name:
                 type: string
                 required: true
-            location:
-                type: string
-                required: false
             latlng:
                 type: string
                 required: false
 
-   tosca.relationships.UsesBandwidthProfile:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabilities.xos.EcordBandwidthProfile ]
\ No newline at end of file
+    tosca.nodes.OnosModel:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The ecord ONOS model
+        capabilities:
+        properties:
+            no-delete:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to delete this object
+            no-create:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to create this object
+            no-update:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to update this object
+            replaces:
+                type: string
+                required: false
+                descrption: Replaces/renames this object
+            name:
+                type: string
+                required: false
+            onos_ip:
+                type: string
+                required: false
+            onos_port:
+                type: integer
+                required: false
+            onos_username:
+                type: string
+                required: false
+            onos_password:
+                type: string
+                required: false
+            onos_type:
+                type: string
+                required: false
+
+    tosca.nodes.EnterpriseLocation:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The ecord enterprise location
+        capabilities:
+        properties:
+            no-delete:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to delete this object
+            no-create:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to create this object
+            no-update:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to update this object
+            replaces:
+                type: string
+                required: false
+                descrption: Replaces/renames this object
+            name:
+                type: string
+                required: false
+            cord_site_ip:
+                type: string
+                required: false
+            cord_site_port:
+                type: integer
+                required: false
+            cord_site_username:
+                type: string
+                required: false
+            cord_site_password:
+                type: string
+                required: false
+            cord_site_type:
+                type: string
+                required: false
+
+    tosca.nodes.ELine:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The ecord Ethernet Virtual Private Line
+        capabilities:
+        properties:
+            no-delete:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to delete this object
+            no-create:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to create this object
+            no-update:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to update this object
+            replaces:
+                type: string
+                required: false
+                descrption: Replaces/renames this object
+            name:
+                type: string
+                required: false
+            connect_point_1_id:
+                type: string
+                required: false
+            connect_point_2_id:
+                type: string
+                required: false
+            vlanids:
+                type: string
+                required: false
+            cord_site_name:
+                type: string
+                required: false
+            bwp:
+                type: string
+                required: false
\ No newline at end of file
diff --git a/xos/metronet.m4.old b/xos/metronet.m4.old
new file mode 100644
index 0000000..c9e6eb8
--- /dev/null
+++ b/xos/metronet.m4.old
@@ -0,0 +1,116 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+# compile this with "m4 metronet.m4 > metronet.yaml"
+
+# include macros
+include(macros.m4)
+
+node_types:
+
+   tosca.nodes.VNodGlobalService:
+        description: >
+            CORD: The MetroNet Service.
+        derived_from: tosca.nodes.Root
+        capabilities:
+            xos_base_service_caps
+        properties:
+            xos_base_props
+            xos_base_service_props
+
+   tosca.nodes.MetroNetworkSystem:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The Metro Network Service.
+        capabilities:
+            xos_base_service_caps
+        properties:
+            xos_base_props
+            xos_base_service_props
+            administrativeState:
+                type: string
+                required: true
+            restUrl:
+                type: string
+                required: false
+
+
+   tosca.nodes.MetroNetworkDevice:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The Metro Network Device.
+        properties:
+            xos_base_props
+            restCtrlUrl:
+                type: string
+                required: true
+            username:
+                type: string
+                required: true
+            password:
+                type: string
+                required: true
+            administrativeState:
+                type: string
+                required: true
+            authType:
+                type: string
+                required: false
+            id:
+                type: string
+                required: true
+
+   tosca.nodes.EcordBandwidthProfile:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The ecord bandwith profile.
+        capabilities:
+        properties:
+            xos_base_props
+            bwpcfgcbs:
+                type: integer
+                required: false
+            bwpcfgebs:
+                type: integer
+                required: false
+            bwpcfgcir:
+                type: integer
+                required: false
+            bwpcfgeir:
+                type: integer
+                required: false
+            name:
+                type: string
+                required: true
+
+   tosca.nodes.EcordUserNetworkInterface:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The ecord user netowrk interface
+        capabilities:
+        properties:
+            xos_base_props
+            enabled:
+                type: boolean
+                required: false
+            capacity:
+                type: integer
+                required: false
+            bw_used:
+                type: integer
+                required: false
+            vlanIds:
+                type: string
+                required: false
+            name:
+                type: string
+                required: true
+            location:
+                type: string
+                required: false
+            latlng:
+                type: string
+                required: false
+
+   tosca.relationships.UsesBandwidthProfile:
+        derived_from: tosca.relationships.Root
+        valid_target_types: [ tosca.capabilities.xos.EcordBandwidthProfile ]
\ No newline at end of file
diff --git a/xos/metronet.xproto b/xos/metronet.xproto
index 4094bf4..0e6b35a 100644
--- a/xos/metronet.xproto
+++ b/xos/metronet.xproto
@@ -1,136 +1,59 @@
-option name = "metronetwork";
+option name = "metronet";
 
-message MetroNetworkSystem (PlCoreBase){
-     option verbose_name = "Metro Network System";
+message EnterpriseLocation (PlCoreBase){
+     option verbose_name = "Enterprise Localation";
 
      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'))"];
+     required string cord_site_ip = 2 [help_text = "ip of the local site", db_index = False, max_length = 64, null = False, blank = False];
+     required int32 cord_site_port = 3 [help_text = "port of the local site", db_index = False, null = False, blank = False];
+     required string cord_site_username = 4 [help_text = "username of the local site", db_index = False, max_length = 64, null = False, blank = False];
+     required string cord_site_password  = 5 [help_text = "password of the local site", db_index = False, max_length = 64, null = False, blank = False];
+     required string cord_site_type = 6 [default = "xos", choices = "(('onos', 'ONOS'), ('xos', 'XOS'))", db_index = False, max_length = 64, null = False, blank = False];
+
 }
 
-message NetworkDevice (PlCoreBase){
-     option verbose_name = "Network Device";
+message OnosModel (PlCoreBase){
+     option verbose_name = "Open Network Operating System";
 
-     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];
+     required string name = 1 [db_index = False, max_length = 256, null = False, blank = False];
+     required string onos_ip = 2 [help_text = "ip of the transport manager", db_index = False, max_length = 64, null = False, blank = False];
+     required int32 onos_port = 3 [help_text = "port of the transport manager", db_index = False, null = False, blank = False];
+     required string onos_username = 4 [help_text = "username of the transport manager", db_index = False, max_length = 64, null = False, blank = False];
+     required string onos_password  = 5 [help_text = "password of the transport manager", db_index = False, max_length = 64, null = False, blank = False];
+     required string onos_type = 6 [default = "local", choices = "(('local', 'Local'), ('global', 'Global'))", db_index = False, max_length = 64, null = False, blank = False];
+
 }
 
-message NetworkEdgePort (PlCoreBase){
-     option verbose_name = "Network Edge Port";
+message UserNetworkInterface (PlCoreBase){
+     option verbose_name = "User Network Interface";
 
-     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];
+     required string tenant = 1 [help_text = "tenat name",db_index = False, max_length = 256, null = False, blank = False];
+     required string cpe_id = 2 [db_index = False, max_length = 1024, null = False, blank = False];
+     required string latlng = 3 [help_text = "location, i.e. [37.773972, -122.431297]", db_index = False, max_length = 256, null = False, blank = False];
+     optional string name = 4 [db_index = False, max_length = 256, null = False, blank = False];
 }
 
 
-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];
+     required string name = 1 [db_index = False, max_length = 256, null = False, blank = False];
+     required int32 cbs = 2 [help_text = "committed burst size", db_index = False, null = False, blank = False];
+     required int32 ebs = 3 [help_text = "expected burst size", db_index = False, null = False, blank = False];
+     required int32 cir = 4 [help_text = "committed information rate", db_index = False, null = False, blank = False];
+     required int32 eir = 5 [help_text = "expected information rate", db_index = False, null = False, blank = False];
+
 }
 
-message RemotePort (PlCoreBase){
-     option verbose_name = "Remote Port";
+message ELine (PlCoreBase){
+     option verbose_name = "Ethernet Virtual Private Line";
 
-     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];
+     required string name = 1 [db_index = False, max_length = 256, null = False, blank = False];
+     required string connect_point_1_id = 2 [db_index = False, max_length = 256, null = False, blank = False];
+     required string connect_point_2_id = 3 [db_index = False, max_length = 64, null = False, blank = False];
+     required string vlanids = 4 [help_text = "comma separated list of vlanIds", db_index = False, null = False, blank = False];
+     required string cord_site_name = 5 [db_index = False, max_length = 64, null = False, blank = False];
+     required string bwp  = 6 [help_text = "bandwidth profile name", 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/metronet.yaml b/xos/metronet.yaml
index 6a700fa..9ac1400 100644
--- a/xos/metronet.yaml
+++ b/xos/metronet.yaml
@@ -22,170 +22,7 @@
 
 node_types:
 
-   tosca.nodes.VNodGlobalService:
-        description: >
-            CORD: The MetroNet Service.
-        derived_from: tosca.nodes.Root
-        capabilities:
-            scalable:
-                type: tosca.capabilities.Scalable
-            service:
-                type: tosca.capabilities.xos.Service
-        properties:
-            no-delete:
-                type: boolean
-                default: false
-                description: Do not allow Tosca to delete this object
-            no-create:
-                type: boolean
-                default: false
-                description: Do not allow Tosca to create this object
-            no-update:
-                type: boolean
-                default: false
-                description: Do not allow Tosca to update this object
-            replaces:
-                type: string
-                required: false
-                descrption: Replaces/renames this object
-            kind:
-                type: string
-                default: generic
-                description: Type of service.
-            view_url:
-                type: string
-                required: false
-                description: URL to follow when icon is clicked in the Service Directory.
-            icon_url:
-                type: string
-                required: false
-                description: ICON to display in the Service Directory.
-            enabled:
-                type: boolean
-                default: true
-            published:
-                type: boolean
-                default: true
-                description: If True then display this Service in the Service Directory.
-            public_key:
-                type: string
-                required: false
-                description: Public key to install into Instances to allows Services to SSH into them.
-            private_key_fn:
-                type: string
-                required: false
-                description: Location of private key file
-            versionNumber:
-                type: string
-                required: false
-                description: Version number of Service.
-
-   tosca.nodes.MetroNetworkSystem:
-        derived_from: tosca.nodes.Root
-        description: >
-            CORD: The Metro Network Service.
-        capabilities:
-            scalable:
-                type: tosca.capabilities.Scalable
-            service:
-                type: tosca.capabilities.xos.Service
-        properties:
-            no-delete:
-                type: boolean
-                default: false
-                description: Do not allow Tosca to delete this object
-            no-create:
-                type: boolean
-                default: false
-                description: Do not allow Tosca to create this object
-            no-update:
-                type: boolean
-                default: false
-                description: Do not allow Tosca to update this object
-            replaces:
-                type: string
-                required: false
-                descrption: Replaces/renames this object
-            kind:
-                type: string
-                default: generic
-                description: Type of service.
-            view_url:
-                type: string
-                required: false
-                description: URL to follow when icon is clicked in the Service Directory.
-            icon_url:
-                type: string
-                required: false
-                description: ICON to display in the Service Directory.
-            enabled:
-                type: boolean
-                default: true
-            published:
-                type: boolean
-                default: true
-                description: If True then display this Service in the Service Directory.
-            public_key:
-                type: string
-                required: false
-                description: Public key to install into Instances to allows Services to SSH into them.
-            private_key_fn:
-                type: string
-                required: false
-                description: Location of private key file
-            versionNumber:
-                type: string
-                required: false
-                description: Version number of Service.
-            administrativeState:
-                type: string
-                required: true
-            restUrl:
-                type: string
-                required: false
-
-
-   tosca.nodes.MetroNetworkDevice:
-        derived_from: tosca.nodes.Root
-        description: >
-            CORD: The Metro Network Device.
-        properties:
-            no-delete:
-                type: boolean
-                default: false
-                description: Do not allow Tosca to delete this object
-            no-create:
-                type: boolean
-                default: false
-                description: Do not allow Tosca to create this object
-            no-update:
-                type: boolean
-                default: false
-                description: Do not allow Tosca to update this object
-            replaces:
-                type: string
-                required: false
-                descrption: Replaces/renames this object
-            restCtrlUrl:
-                type: string
-                required: true
-            username:
-                type: string
-                required: true
-            password:
-                type: string
-                required: true
-            administrativeState:
-                type: string
-                required: true
-            authType:
-                type: string
-                required: false
-            id:
-                type: string
-                required: true
-
-   tosca.nodes.EcordBandwidthProfile:
+    tosca.nodes.BandwidthProfile:
         derived_from: tosca.nodes.Root
         description: >
             CORD: The ecord bandwith profile.
@@ -207,23 +44,23 @@
                 type: string
                 required: false
                 descrption: Replaces/renames this object
-            bwpcfgcbs:
+            cbs:
                 type: integer
                 required: false
-            bwpcfgebs:
+            ebs:
                 type: integer
                 required: false
-            bwpcfgcir:
+            cir:
                 type: integer
                 required: false
-            bwpcfgeir:
+            eir:
                 type: integer
                 required: false
             name:
                 type: string
                 required: true
 
-   tosca.nodes.EcordUserNetworkInterface:
+    tosca.nodes.UserNetworkInterface:
         derived_from: tosca.nodes.Root
         description: >
             CORD: The ecord user netowrk interface
@@ -245,28 +82,138 @@
                 type: string
                 required: false
                 descrption: Replaces/renames this object
-            enabled:
-                type: boolean
-                required: false
-            capacity:
-                type: integer
-                required: false
-            bw_used:
-                type: integer
-                required: false
-            vlanIds:
+            cpe_id:
                 type: string
                 required: false
+            tenant:
+                type: string
+                required: true
             name:
                 type: string
                 required: true
-            location:
-                type: string
-                required: false
             latlng:
                 type: string
                 required: false
 
-   tosca.relationships.UsesBandwidthProfile:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabilities.xos.EcordBandwidthProfile ]
\ No newline at end of file
+    tosca.nodes.OnosModel:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The ecord ONOS model
+        capabilities:
+        properties:
+            no-delete:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to delete this object
+            no-create:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to create this object
+            no-update:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to update this object
+            replaces:
+                type: string
+                required: false
+                descrption: Replaces/renames this object
+            name:
+                type: string
+                required: false
+            onos_ip:
+                type: string
+                required: false
+            onos_port:
+                type: integer
+                required: false
+            onos_username:
+                type: string
+                required: false
+            onos_password:
+                type: string
+                required: false
+            onos_type:
+                type: string
+                required: false
+
+    tosca.nodes.EnterpriseLocation:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The ecord enterprise location
+        capabilities:
+        properties:
+            no-delete:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to delete this object
+            no-create:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to create this object
+            no-update:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to update this object
+            replaces:
+                type: string
+                required: false
+                descrption: Replaces/renames this object
+            name:
+                type: string
+                required: false
+            cord_site_ip:
+                type: string
+                required: false
+            cord_site_port:
+                type: integer
+                required: false
+            cord_site_username:
+                type: string
+                required: false
+            cord_site_password:
+                type: string
+                required: false
+            cord_site_type:
+                type: string
+                required: false
+
+    tosca.nodes.ELine:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The ecord Ethernet Virtual Private Line
+        capabilities:
+        properties:
+            no-delete:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to delete this object
+            no-create:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to create this object
+            no-update:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to update this object
+            replaces:
+                type: string
+                required: false
+                descrption: Replaces/renames this object
+            name:
+                type: string
+                required: false
+            connect_point_1_id:
+                type: string
+                required: false
+            connect_point_2_id:
+                type: string
+                required: false
+            vlanids:
+                type: string
+                required: false
+            cord_site_name:
+                type: string
+                required: false
+            bwp:
+                type: string
+                required: false
\ No newline at end of file
diff --git a/xos/metronet.yaml.old b/xos/metronet.yaml.old
new file mode 100644
index 0000000..b6d2de3
--- /dev/null
+++ b/xos/metronet.yaml.old
@@ -0,0 +1,272 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+# compile this with "m4 metronet.m4.old > metronet.yaml"
+
+# include macros
+# Note: Tosca derived_from isn't working the way I think it should, it's not
+#    inheriting from the parent template. Until we get that figured out, use
+#    m4 macros do our inheritance
+
+
+# Service
+
+
+# Subscriber
+
+
+
+
+# end m4 macros
+
+
+
+node_types:
+
+   tosca.nodes.VNodGlobalService:
+        description: >
+            CORD: The MetroNet Service.
+        derived_from: tosca.nodes.Root
+        capabilities:
+            scalable:
+                type: tosca.capabilities.Scalable
+            service:
+                type: tosca.capabilities.xos.Service
+        properties:
+            no-delete:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to delete this object
+            no-create:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to create this object
+            no-update:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to update this object
+            replaces:
+                type: string
+                required: false
+                descrption: Replaces/renames this object
+            kind:
+                type: string
+                default: generic
+                description: Type of service.
+            view_url:
+                type: string
+                required: false
+                description: URL to follow when icon is clicked in the Service Directory.
+            icon_url:
+                type: string
+                required: false
+                description: ICON to display in the Service Directory.
+            enabled:
+                type: boolean
+                default: true
+            published:
+                type: boolean
+                default: true
+                description: If True then display this Service in the Service Directory.
+            public_key:
+                type: string
+                required: false
+                description: Public key to install into Instances to allows Services to SSH into them.
+            private_key_fn:
+                type: string
+                required: false
+                description: Location of private key file
+            versionNumber:
+                type: string
+                required: false
+                description: Version number of Service.
+
+   tosca.nodes.MetroNetworkSystem:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The Metro Network Service.
+        capabilities:
+            scalable:
+                type: tosca.capabilities.Scalable
+            service:
+                type: tosca.capabilities.xos.Service
+        properties:
+            no-delete:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to delete this object
+            no-create:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to create this object
+            no-update:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to update this object
+            replaces:
+                type: string
+                required: false
+                descrption: Replaces/renames this object
+            kind:
+                type: string
+                default: generic
+                description: Type of service.
+            view_url:
+                type: string
+                required: false
+                description: URL to follow when icon is clicked in the Service Directory.
+            icon_url:
+                type: string
+                required: false
+                description: ICON to display in the Service Directory.
+            enabled:
+                type: boolean
+                default: true
+            published:
+                type: boolean
+                default: true
+                description: If True then display this Service in the Service Directory.
+            public_key:
+                type: string
+                required: false
+                description: Public key to install into Instances to allows Services to SSH into them.
+            private_key_fn:
+                type: string
+                required: false
+                description: Location of private key file
+            versionNumber:
+                type: string
+                required: false
+                description: Version number of Service.
+            administrativeState:
+                type: string
+                required: true
+            restUrl:
+                type: string
+                required: false
+
+
+   tosca.nodes.MetroNetworkDevice:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The Metro Network Device.
+        properties:
+            no-delete:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to delete this object
+            no-create:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to create this object
+            no-update:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to update this object
+            replaces:
+                type: string
+                required: false
+                descrption: Replaces/renames this object
+            restCtrlUrl:
+                type: string
+                required: true
+            username:
+                type: string
+                required: true
+            password:
+                type: string
+                required: true
+            administrativeState:
+                type: string
+                required: true
+            authType:
+                type: string
+                required: false
+            id:
+                type: string
+                required: true
+
+   tosca.nodes.EcordBandwidthProfile:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The ecord bandwith profile.
+        capabilities:
+        properties:
+            no-delete:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to delete this object
+            no-create:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to create this object
+            no-update:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to update this object
+            replaces:
+                type: string
+                required: false
+                descrption: Replaces/renames this object
+            bwpcfgcbs:
+                type: integer
+                required: false
+            bwpcfgebs:
+                type: integer
+                required: false
+            bwpcfgcir:
+                type: integer
+                required: false
+            bwpcfgeir:
+                type: integer
+                required: false
+            name:
+                type: string
+                required: true
+
+   tosca.nodes.EcordUserNetworkInterface:
+        derived_from: tosca.nodes.Root
+        description: >
+            CORD: The ecord user netowrk interface
+        capabilities:
+        properties:
+            no-delete:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to delete this object
+            no-create:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to create this object
+            no-update:
+                type: boolean
+                default: false
+                description: Do not allow Tosca to update this object
+            replaces:
+                type: string
+                required: false
+                descrption: Replaces/renames this object
+            enabled:
+                type: boolean
+                required: false
+            capacity:
+                type: integer
+                required: false
+            bw_used:
+                type: integer
+                required: false
+            vlanIds:
+                type: string
+                required: false
+            name:
+                type: string
+                required: true
+            location:
+                type: string
+                required: false
+            latlng:
+                type: string
+                required: false
+
+   tosca.relationships.UsesBandwidthProfile:
+        derived_from: tosca.relationships.Root
+        valid_target_types: [ tosca.capabilities.xos.EcordBandwidthProfile ]
\ No newline at end of file
diff --git a/xos/metronet_old.xproto_old b/xos/metronet_old.xproto_old
new file mode 100644
index 0000000..4094bf4
--- /dev/null
+++ b/xos/metronet_old.xproto_old
@@ -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/models.py b/xos/models.py
new file mode 100644
index 0000000..3c179f0
--- /dev/null
+++ b/xos/models.py
@@ -0,0 +1,177 @@
+from header import *
+
+
+
+#from core.models.tenant import Tenant
+from core.models import Tenant
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class EnterpriseLocation(Tenant):
+
+  KIND = "metronetwork"
+
+  class Meta:
+      app_label = "metronet"
+      name = "metronet"
+      verbose_name = "Enterprise Localation"
+
+  # Primitive Fields (Not Relations)
+  name = CharField( blank = False, max_length = 256, null = False, db_index = False )
+  cord_site_ip = CharField( help_text = "ip of the local site", max_length = 64, null = False, db_index = False, blank = False )
+  cord_site_ip = CharField( help_text = "ip of the local site", max_length = 64, null = False, db_index = False, blank = False )
+  cord_site_port = IntegerField( help_text = "port of the local site", max_length = 256, null = False, db_index = False, blank = False )
+  cord_site_username = CharField( help_text = "username of the local site", max_length = 64, null = False, db_index = False, blank = False )
+  cord_site_password = CharField( help_text = "password of the local site", max_length = 64, null = False, db_index = False, blank = False )
+  cord_site_type = CharField( default = "xos", choices = "(('onos', 'ONOS'), ('xos', 'XOS')", max_length = 64, blank = False, null = False, db_index = False )
+  
+
+  # Relations
+  
+
+  
+  pass
+
+
+
+
+class OnosModel(PlCoreBase):
+
+  KIND = "metronetwork"
+
+  class Meta:
+      app_label = "metronet"
+      name = "metronet"
+      verbose_name = "Open Netowrk Operating System"
+
+  # Primitive Fields (Not Relations)
+  name = CharField( blank = False, max_length = 256, null = False, db_index = False )
+  onos_ip = CharField( help_text = "ip of the transport manager", max_length = 64, null = False, db_index = False, blank = False )
+  onos_port = IntegerField( help_text = "port of the transport manager", max_length = 256, null = False, db_index = False, blank = False )
+  onos_username = CharField( help_text = "username of the transport manager", max_length = 64, null = False, db_index = False, blank = False )
+  onos_password = CharField( help_text = "password of the transport manager", max_length = 64, null = False, db_index = False, blank = False )
+  onos_type = CharField( default = "local", choices = "(('local', 'Local'), ('global', 'Global')", max_length = 64, blank = False, null = False, db_index = False )
+  
+
+  # Relations
+  
+
+  
+  pass
+
+
+
+
+class UserNetworkInterface(PlCoreBase):
+
+  KIND = "metronetwork"
+
+  class Meta:
+      app_label = "metronet"
+      name = "metronet"
+      verbose_name = "User Network Interface"
+
+  # Primitive Fields (Not Relations)
+  tenant = CharField( help_text = "tenat name", max_length = 256, null = False, db_index = False, blank = False )
+  cpe_id = CharField( blank = False, max_length = 1024, null = False, db_index = False )
+  latlng = CharField( help_text = "location, i.e. [37.773972, -122.431297]", max_length = 256, null = False, db_index = False, blank = False )
+  name = CharField( blank = False, max_length = 256, null = False, db_index = False )
+  
+
+  # Relations
+  
+
+  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)
+  pass
+
+
+
+
+class BandwidthProfile(PlCoreBase):
+
+  KIND = "metronetwork"
+
+  class Meta:
+      app_label = "metronet"
+      name = "metronet"
+      verbose_name = "Bandwidth Profile"
+
+  # Primitive Fields (Not Relations)
+  name = CharField( blank = False, max_length = 256, null = False, db_index = False )
+  cbs = IntegerField( help_text = "committed burst size", null = False, blank = False, db_index = False )
+  ebs = IntegerField( help_text = "expected burst size", null = False, blank = False, db_index = False )
+  cir = IntegerField( help_text = "committed information rate", null = False, blank = False, db_index = False )
+  eir = IntegerField( help_text = "expected information rate", null = False, blank = False, db_index = False )
+  
+
+  # Relations
+  
+
+  def __unicode__(self):  return u'%s' % (self.name)
+  pass
+
+
+
+
+class ELine(PlCoreBase):
+
+  KIND = "metronetwork"
+
+  class Meta:
+      app_label = "metronet"
+      name = "metronet"
+      verbose_name = "Ethernet Virtual Private Line"
+
+  # Primitive Fields (Not Relations)
+  name = CharField( blank = False, max_length = 256, null = False, db_index = False )
+  connect_point_1_id = CharField( blank = False, max_length = 256, null = False, db_index = False )
+  connect_point_2_id = CharField( blank = False, max_length = 64, null = False, db_index = False )
+  vlanids = TextField( help_text = "comma separated list of vlanIds", null = False, blank = False, db_index = False )
+  cord_site_username = CharField( blank = False, max_length = 64, null = False, db_index = False )
+  bwp = CharField( help_text = "bandwidth profile name", max_length = 256, null = False, db_index = False, blank = False )
+  
+
+  # Relations
+  
+
+  def __unicode__(self):  return u'%s' % (self.name)
+  pass
+
+
diff --git a/xos/synchronizer/Dockerfile.synchronizer b/xos/synchronizer/Dockerfile.synchronizer
index 9440751..3ff2ebc 100644
--- a/xos/synchronizer/Dockerfile.synchronizer
+++ b/xos/synchronizer/Dockerfile.synchronizer
@@ -6,4 +6,4 @@
 
 WORKDIR "/opt/xos/synchronizers/metro-net"
 
-CMD bash -c "cd /opt/xos/synchronizers/metro-net; ./run-from-api.sh
\ No newline at end of file
+CMD bash -c "cd /opt/xos/synchronizers/metro-net; ./run-from-api.sh"
\ No newline at end of file
diff --git a/xos/synchronizer/invokers/invoker.py b/xos/synchronizer/invokers/invoker.py
deleted file mode 100644
index e645285..0000000
--- a/xos/synchronizer/invokers/invoker.py
+++ /dev/null
@@ -1,25 +0,0 @@
-class Invoker(object):
-
-    def __init__(self, **args):
-        pass
-
-    # Method for handline pre save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - None - this is a pure invoke() call, return type is None
-    #
-    def presave(self, obj):
-        return None
-
-
-    # Method for handline post save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - None - this is a pure invoke() call, return type is None
-    #
-    def postsave(self, obj):
-        return None
\ No newline at end of file
diff --git a/xos/synchronizer/invokers/invokerfactory.py b/xos/synchronizer/invokers/invokerfactory.py
deleted file mode 100644
index b3628fe..0000000
--- a/xos/synchronizer/invokers/invokerfactory.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from services.metronetwork.models import *
-from synchronizers.metronetwork.invokers.networkmultipointtomultipointinvoker import NetworkMultipointToMultipointInvoker
-from synchronizers.metronetwork.invokers.networkedgetoedgepointinvoker import NetworkEdgeToEdgePointInvoker
-from synchronizers.metronetwork.invokers.networkedgetomultipointinvoker import NetworkEdgeToMultipointInvoker
-from synchronizers.metronetwork.invokers.servicespokeinvoker import ServiceSpokeInvoker
-from synchronizers.metronetwork.invokers.vnodglobalserviceinvoker import VnodGlobalServiceInvoker
-from synchronizers.metronetwork.invokers.remoteportinvoker import RemotePortInvoker
-
-
-class InvokerFactory(object):
-    @staticmethod
-    def getinvoker(obj):
-        #
-        # Here is where we build various invokers
-        #
-        if isinstance(obj, NetworkMultipointToMultipointConnection):
-            return NetworkMultipointToMultipointInvoker()
-        elif isinstance(obj, NetworkEdgeToEdgePointConnection):
-            return NetworkEdgeToEdgePointInvoker()
-        elif isinstance(obj, NetworkEdgeToMultipointConnection):
-            return NetworkEdgeToMultipointInvoker()
-        elif isinstance(obj, ServiceSpoke):
-            return ServiceSpokeInvoker()
-        elif isinstance(obj, VnodGlobalService):
-            return VnodGlobalServiceInvoker()
-        elif isinstance(obj, RemotePort):
-            return RemotePortInvoker()
-        else:
-            return None
diff --git a/xos/synchronizer/invokers/networkedgetoedgepointinvoker.py b/xos/synchronizer/invokers/networkedgetoedgepointinvoker.py
deleted file mode 100644
index 2c30d79..0000000
--- a/xos/synchronizer/invokers/networkedgetoedgepointinvoker.py
+++ /dev/null
@@ -1,34 +0,0 @@
-import json
-from synchronizers.metronetwork.invokers.invoker import Invoker
-from services.metronetwork.models import NetworkEdgePort
-
-
-class NetworkEdgeToEdgePointInvoker(Invoker):
-    def __init__(self, **args):
-        pass
-
-    # Method for handline pre save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - None - this is a pure invoke() call, return type is None
-    #
-    def presave(self, obj):
-        # Now that the Ports are created - get a proper reference to them and update the
-        # src and dst fields
-        if hasattr(obj, 'uni1_createbuffer'):
-            uni1port = NetworkEdgePort.objects.get(pid=obj.uni1_createbuffer)
-            uni2port = NetworkEdgePort.objects.get(pid=obj.uni2_createbuffer)
-            obj.uni1 = uni1port
-            obj.uni2 = uni2port
-
-    # Method for handline post save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - N/A - this is a pure invoke() call
-    #
-    def postsave(self, obj):
-        pass
diff --git a/xos/synchronizer/invokers/networkedgetomultipointinvoker.py b/xos/synchronizer/invokers/networkedgetomultipointinvoker.py
deleted file mode 100644
index 9b8e88b..0000000
--- a/xos/synchronizer/invokers/networkedgetomultipointinvoker.py
+++ /dev/null
@@ -1,47 +0,0 @@
-import json
-from synchronizers.metronetwork.invokers.invoker import Invoker
-from services.metronetwork.models import NetworkEdgeToMultipointConnection, NetworkEdgePort
-
-class NetworkEdgeToMultipointInvoker(Invoker):
-
-    def __init__(self, **args):
-        pass
-
-    # Method for handline pre save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - None - this is a pure invoke() call, return type is None
-    #
-    def presave(self, obj):
-        # Now that the Ports are created - get a proper reference to them and update the
-        # root field
-        if hasattr(obj, 'root_createbuffer'):
-            rootEdgePort = NetworkEdgePort.objects.get(pid=obj.root_createbuffer)
-            obj.root = rootEdgePort
-
-
-    # Method for handline post save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - N/A - this is a pure invoke() call
-    #
-    def postsave(self, obj):
-        #
-        # Ok - we need to handle the multipoint many-to-many relationships in here
-        #
-        # By design convnetion we will look for them in the 'backend_register' object field
-        # this is a json field that is general purpose - we will expect to find a JSON array
-        # called 'eps' that just containts a reference to a bunch of NetworkEdgePorts
-        #
-        #
-        if hasattr(obj, 'eps_createbuffer'):
-            scratchpad = json.loads(obj.eps_createbuffer)
-            eps = scratchpad['eps']
-
-            for ep in eps:
-                port = NetworkEdgePort.objects.get(pid=ep)
-                obj.eps.add(port)
diff --git a/xos/synchronizer/invokers/networkmultipointtomultipointinvoker.py b/xos/synchronizer/invokers/networkmultipointtomultipointinvoker.py
deleted file mode 100644
index 6b2ab42..0000000
--- a/xos/synchronizer/invokers/networkmultipointtomultipointinvoker.py
+++ /dev/null
@@ -1,43 +0,0 @@
-import json
-from synchronizers.metronetwork.invokers.invoker import Invoker
-from services.metronetwork.models import NetworkMultipointToMultipointConnection, NetworkEdgePort
-
-class NetworkMultipointToMultipointInvoker(Invoker):
-
-    def __init__(self, **args):
-        pass
-
-    # Method for handline pre save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - None - this is a pure invoke() call, return type is None
-    #
-    def presave(self, obj):
-        pass
-
-
-    # Method for handline post save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - N/A - this is a pure invoke() call
-    #
-    def postsave(self, obj):
-        #
-        # Ok - we need to handle the multipoint many-to-many relationships in here
-        #
-        # By design convnetion we will look for them in the 'backend_register' object field
-        # this is a json field that is general purpose - we will expect to find a JSON array
-        # called 'eps' that just containts a reference to a bunch of NetworkEdgePorts
-        #
-        #
-        if hasattr(obj, 'eps_createbuffer'):
-            scratchpad = json.loads(obj.eps_createbuffer)
-            eps = scratchpad['eps']
-
-            for ep in eps:
-                port = NetworkEdgePort.objects.get(pid=ep)
-                obj.eps.add(port)
diff --git a/xos/synchronizer/invokers/remoteportinvoker.py b/xos/synchronizer/invokers/remoteportinvoker.py
deleted file mode 100644
index 1061dc4..0000000
--- a/xos/synchronizer/invokers/remoteportinvoker.py
+++ /dev/null
@@ -1,35 +0,0 @@
-import json
-from synchronizers.metronetwork.invokers.invoker import Invoker
-from core.models import Site
-from services.metronetwork.models import NetworkEdgePort
-
-class RemotePortInvoker(Invoker):
-    def __init__(self, **args):
-        pass
-
-    # Method for handline pre save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - None - this is a pure invoke() call, return type is None
-    #
-    def presave(self, obj):
-        # Now that the Site and EdgePorts are created set the foreign keys
-        if hasattr(obj, 'sitename'):
-            site = Site.objects.get(login_base=obj.sitename)
-            obj.remoteportsite = site
-
-        if hasattr(obj, 'edgeportname'):
-            edgeport = NetworkEdgePort.objects.get(pid=obj.edgeportname)
-            obj.edgeport = edgeport
-
-    # Method for handline post save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - N/A - this is a pure invoke() call
-    #
-    def postsave(self, obj):
-        pass
\ No newline at end of file
diff --git a/xos/synchronizer/invokers/servicespokeinvoker.py b/xos/synchronizer/invokers/servicespokeinvoker.py
deleted file mode 100644
index 8470cf5..0000000
--- a/xos/synchronizer/invokers/servicespokeinvoker.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import json
-from synchronizers.metronetwork.invokers.invoker import Invoker
-from core.models import Site
-from services.metronetwork.models import RemotePort
-
-
-class ServiceSpokeInvoker(Invoker):
-    def __init__(self, **args):
-        pass
-
-    # Method for handline pre save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - None - this is a pure invoke() call, return type is None
-    #
-    def presave(self, obj):
-        # Now that the Ports are created - get a proper reference to them and update the
-        # src and dst fields
-        if hasattr(obj, 'sitename'):
-            site = Site.objects.get(login_base=obj.sitename)
-            obj.vnodlocalsite = site
-
-        if hasattr(obj, 'remoteportname'):
-            remoteport = RemotePort.objects.get(name=obj.remoteportname)
-            obj.vnodlocalport = remoteport
-
-    # Method for handline post save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - N/A - this is a pure invoke() call
-    #
-    def postsave(self, obj):
-        pass
\ No newline at end of file
diff --git a/xos/synchronizer/invokers/vnodglobalserviceinvoker.py b/xos/synchronizer/invokers/vnodglobalserviceinvoker.py
deleted file mode 100644
index a313171..0000000
--- a/xos/synchronizer/invokers/vnodglobalserviceinvoker.py
+++ /dev/null
@@ -1,50 +0,0 @@
-import json
-from synchronizers.metronetwork.invokers.invoker import Invoker
-from services.metronetwork.models import ServiceSpoke
-from services.metronetwork.models import BandwidthProfile
-from services.metronetwork.models import NetworkEdgeToEdgePointConnection
-
-class VnodGlobalServiceInvoker(Invoker):
-
-    def __init__(self, **args):
-        pass
-
-    # Method for handline pre save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - None - this is a pure invoke() call, return type is None
-    #
-    def presave(self, obj):
-
-        if hasattr(obj, 'bwpname'):
-            bwprofile = BandwidthProfile.objects.get(name=obj.bwpname)
-            obj.bandwidthProfile = bwprofile
-
-        if hasattr(obj, 'pointtopointsid'):
-            connection = NetworkEdgeToEdgePointConnection.objects.get(sid=obj.pointtopointsid)
-            obj.metronetworkpointtopoint = connection
-
-    # Method for handline post save semantics
-    #      content here would be model specific but could include handling Many-to-Many relationship
-    #      creation - which must occur post save
-    #
-    # obj     - Whatever obj was just saved
-    # returns - N/A - this is a pure invoke() call
-    #
-    def postsave(self, obj):
-        #
-        # Ok - we need to handle the multipoint many-to-many relationships in here
-        #
-        # By design convnetion we will look for them in the 'backend_register' object field
-        # this is a json field that is general purpose - we will expect to find a JSON array
-        # called 'eps' that just containts a reference to a bunch of NetworkEdgePorts
-        #
-        if hasattr(obj, 'spokes_createbuffer'):
-            scratchpad = json.loads(obj.spokes_createbuffer)
-            spokes = scratchpad['spokes']
-
-            for spokeid in spokes:
-                spoke = ServiceSpoke.objects.get(name=spokeid)
-                obj.spokes.add(spoke)
diff --git a/xos/synchronizer/manifest b/xos/synchronizer/manifest
index 03f1088..4a4ccfe 100644
--- a/xos/synchronizer/manifest
+++ b/xos/synchronizer/manifest
@@ -1,23 +1,7 @@
 metronetwork-synchronizer.py
 __init__.py
 model-deps
-providers/metronetworktestprovider.py
-providers/metronetworkrestprovider.py
-providers/providerfactory.py
-providers/__init__.py
-providers/metronetworkprovider.py
-run_devel.sh
-metronetwork-synchronizer-devel.py
 manifest
-steps/sync_metronetworkservice.py
-invokers/servicespokeinvoker.py
-invokers/networkedgetoedgepointinvoker.py
-invokers/vnodglobalserviceinvoker.py
-invokers/networkmultipointtomultipointinvoker.py
-invokers/__init__.py
-invokers/invoker.py
-invokers/networkedgetomultipointinvoker.py
-invokers/invokerfactory.py
-invokers/remoteportinvoker.py
-run.sh
+steps/sync_metroneteline.py
+run-from-api.sh
 metronetwork_synchronizer_config
diff --git a/xos/synchronizer/metronetwork-synchronizer-devel.py b/xos/synchronizer/metronetwork-synchronizer-devel.py
deleted file mode 100755
index df697ec..0000000
--- a/xos/synchronizer/metronetwork-synchronizer-devel.py
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env python
-
-# This imports and runs ../../xos-observer.py
-
-import importlib
-import os
-import sys
-
-#observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../../synchronizers/base")
-sys.path.append("/opt/xos/synchronizers/base")
-print sys.path
-mod = importlib.import_module("xos-synchronizer")
-mod.main()
diff --git a/xos/synchronizer/providers/__init__.py b/xos/synchronizer/providers/__init__.py
deleted file mode 100644
index 8b13789..0000000
--- a/xos/synchronizer/providers/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/xos/synchronizer/providers/metronetworkprovider.py b/xos/synchronizer/providers/metronetworkprovider.py
deleted file mode 100644
index c316815..0000000
--- a/xos/synchronizer/providers/metronetworkprovider.py
+++ /dev/null
@@ -1,90 +0,0 @@
-from xos.logger import Logger, logging
-from services.metronetwork.models import *
-
-logger = Logger(level=logging.INFO)
-
-
-class MetroNetworkProvider(object):
-    networkdevice = None
-
-    def __init__(self, networkdevice, **args):
-        self.networkdevice = networkdevice
-        pass
-
-    # Methods to support for Synchronization - effectively list all interfaces
-    #
-    # Method for retrieving all network ports from the backend system
-    # Intended for use when doing a re-sync
-    def get_network_ports(self):
-        # Default method needs to be overriden
-        logger.debug("get_network_ports default called - should be overriden")
-
-    # Method for getting a list of network ports to delete
-    # The default imnplementation just gets a list from the local DB
-    # Intended for use when doing a re-sync
-    def get_network_ports_for_deletion(self):
-        # Default method needs to be overriden
-        logger.debug("get_network_ports for deletion called - default is all ports in the db related to this id")
-        objs = []
-        return objs
-
-    # Method for retrieving all network links from the backend system
-    # Includes Connectivity Objects
-    # Intended for use when doing a re-sync
-    def get_network_links(self):
-        # Default method needs to be overriden
-        logger.debug("get_network_links default called - should be overriden")
-        objs = []
-        return objs
-
-    # Method for getting a list of network links to delete
-    # Includes Connectivity Objects
-    # Intended for use when doing a re-sync
-    def get_network_links_for_deletion(self):
-        # Default method needs to be overriden
-        logger.debug("get_network_links for deletion called - should be overidden")
-        objs = []
-        return objs
-
-    # Methods to support Event Management - movement of changes from the Domain to XOS
-    #
-    # Method for Create and Update - Create and Update are together given the base design
-    def get_updated_or_created_objects(self):
-        # Default method needs to be overriden
-        logger.debug("get_updated_or_created_objects default called - should be overriden")
-        objs = []
-        return objs
-
-    # Method for Delete - Create and Update are together given the base design
-    def get_deleted_objects(self):
-        # Default method needs to be overriden
-        logger.debug("get_deleted_objects default called - should be overriden")
-        objs = []
-        return objs
-
-    # Methods to support Movement of changes from XOS into the Domain
-    #
-    # Method for creating point to point connectivity object
-    #
-    # obj     - Connection object - with all configuration variables set
-    # returns - Boolean - indicating whether or not the request succeeded - in either case the Admin/Oper
-    #                     states are assigned - if False the backend_status field
-    #                     should be assigned with the appropriate error code - in the case of True the
-    #                     backend_status will be assigned by the system and should be unassigned
-
-    def create_point_to_point_connectivity(self, obj):
-        # Default method needs to be overriden
-        logger.debug("create_point_to_point_connectivity called - should be overriden")
-        return False
-
-    # Method for deleting point to point connectivity object
-    #
-    # obj     - Connection object
-    # returns - Boolean - indicating whether or not the request succeeded - in either case the Admin/Oper
-    #                     states are assigned - if False the backend_status field
-    #                     should be assigned with the appropriate error code - in the case of True the
-    #                     backend_status will be assigned by the system and should be unassigned
-    def delete_point_to_point_connectivity(self, obj):
-        # Default method needs to be overriden
-        logger.debug("delete_point_to_point_connectivity called - should be overriden")
-        return False
diff --git a/xos/synchronizer/providers/metronetworkrestprovider.py b/xos/synchronizer/providers/metronetworkrestprovider.py
deleted file mode 100644
index 2cb03ab..0000000
--- a/xos/synchronizer/providers/metronetworkrestprovider.py
+++ /dev/null
@@ -1,472 +0,0 @@
-from xos.logger import Logger, logging

-from services.metronetwork.models import *

-from synchronizers.metronetwork.providers.metronetworkprovider import MetroNetworkProvider

-

-import requests, json

-from requests.auth import HTTPBasicAuth

-

-logger = Logger(level=logging.INFO)

-

-

-class MetroNetworkRestProvider(MetroNetworkProvider):

-    def __init__(self, networkdevice, **args):

-        MetroNetworkProvider.__init__(self, networkdevice, **args)

-

-    def get_network_ports(self):

-

-        objs = []

-

-        restCtrlUrl = self.networkdevice.restCtrlUrl

-        username = self.networkdevice.username

-        password = self.networkdevice.password

-

-        resp = requests.get("{}/mef-sca-api/SCA_ETH_FPP_UNI_N".format(restCtrlUrl),

-                            auth=HTTPBasicAuth(username, password))

-

-        if resp.status_code == 200:

-            for uni in resp.json():

-                hostname = uni['transportPort']['Hostname']

-                port = uni['transportPort']['Port']

-

-                # Default values

-                bwpCfgCbs = 0

-                bwpCfgEbs = 0

-                bwpCfgCir = 0

-                bwpCfgEir = 0

-

-                if 'interfaceCfgIngressBwp' in uni:

-                    bwpCfgCbs = uni['interfaceCfgIngressBwp']['bwpCfgCbs']

-                    bwpCfgEbs = uni['interfaceCfgIngressBwp']['bwpCfgEbs']

-                    bwpCfgCir = uni['interfaceCfgIngressBwp']['bwpCfgCir']

-                    bwpCfgEir = uni['interfaceCfgIngressBwp']['bwpCfgEir']

-

-                uniPort = NetworkEdgePort()

-                uniPort.element = self.networkdevice

-                uniPort.pid = "{}.{}/{}".format(self.networkdevice.id, hostname, port)

-                uniPort.bwpCfgCbs = bwpCfgCbs

-                uniPort.bwpCfgEbs = bwpCfgEbs

-                uniPort.bwpCfgCir = bwpCfgCir

-                uniPort.bwpCfgEir = bwpCfgEir

-

-                objs.append(uniPort)

-

-            return objs

-

-        else:

-            raise Exception("OnosApiError: get_network_ports()")

-

-    def get_network_ports(self):

-

-        objs = []

-

-        restCtrlUrl = self.networkdevice.restCtrlUrl

-        username = self.networkdevice.username

-        password = self.networkdevice.password

-

-        resp = requests.get("{}/mef-sca-api/SCA_ETH_FPP_UNI_N".format(restCtrlUrl),

-                            auth=HTTPBasicAuth(username, password))

-

-        if resp.status_code == 200:

-            for uni in resp.json():

-                hostname = uni['transportPort']['Hostname']

-                port = uni['transportPort']['Port']

-

-                # Default values

-                bwpCfgCbs = 0

-                bwpCfgEbs = 0

-                bwpCfgCir = 0

-                bwpCfgEir = 0

-

-                if 'interfaceCfgIngressBwp' in uni:

-                    bwpCfgCbs = uni['interfaceCfgIngressBwp']['bwpCfgCbs']

-                    bwpCfgEbs = uni['interfaceCfgIngressBwp']['bwpCfgEbs']

-                    bwpCfgCir = uni['interfaceCfgIngressBwp']['bwpCfgCir']

-                    bwpCfgEir = uni['interfaceCfgIngressBwp']['bwpCfgEir']

-

-                uniPort = NetworkEdgePort()

-                uniPort.element = self.networkdevice

-                uniPort.pid = "{}.{}/{}".format(self.networkdevice.id, hostname, port)

-                uniPort.bwpCfgCbs = bwpCfgCbs

-                uniPort.bwpCfgEbs = bwpCfgEbs

-                uniPort.bwpCfgCir = bwpCfgCir

-                uniPort.bwpCfgEir = bwpCfgEir

-

-                objs.append(uniPort)

-

-            return objs

-

-        else:

-            raise Exception("OnosApiError: get_network_ports()")

-

-    def get_network_eline_link(self, networkDevice, evc):

-

-        sid = evc['id']

-        uni1 = evc['SCA_ETH_Flow_Points'][0]

-        hostname = uni1['scaEthFppUniN']['transportPort']['Hostname']

-        port = uni1['scaEthFppUniN']['transportPort']['Port']

-

-        edgePort1 = NetworkEdgePort()

-        edgePort1.element = networkDevice

-        edgePort1.pid = "{}.{}/{}".format(networkDevice.id, hostname, port)

-

-        if 'interfaceCfgIngressBwp' in uni1['scaEthFppUniN']:

-            edgePort1.bwpCfgCbs = uni1['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCbs']

-            edgePort1.bwpCfgEbs = uni1['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEbs']

-            edgePort1.bwpCfgCir = uni1['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCir']

-            edgePort1.bwpCfgEir = uni1['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEir']

-

-        uni2 = evc['SCA_ETH_Flow_Points'][1]

-        hostname = uni2['scaEthFppUniN']['transportPort']['Hostname']

-        port = uni2['scaEthFppUniN']['transportPort']['Port']

-

-        edgePort2 = NetworkEdgePort()

-        edgePort2.element = networkDevice

-        edgePort2.pid = "{}.{}/{}".format(networkDevice.id, hostname, port)

-

-        if 'interfaceCfgIngressBwp' in uni1['scaEthFppUniN']:

-            edgePort2.bwpCfgCbs = uni2['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCbs']

-            edgePort2.bwpCfgEbs = uni2['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEbs']

-            edgePort2.bwpCfgCir = uni2['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCir']

-            edgePort2.bwpCfgEir = uni2['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEir']

-

-        edgeToEdgeConnectivity = NetworkEdgeToEdgePointConnection()

-        edgeToEdgeConnectivity.sid = sid

-        edgeToEdgeConnectivity.type = "Point_To_Point"

-        edgeToEdgeConnectivity.uni1 = edgePort1

-        edgeToEdgeConnectivity.uni2 = edgePort2

-        edgeToEdgeConnectivity.operstate = "active"

-        edgeToEdgeConnectivity.adminstate = "enabled"

-

-        return(edgeToEdgeConnectivity)

-

-    def get_network_elan_link(self, networkDevice, evc):

-

-        sid = evc['id']

-        eps = []

-

-        for ep in evc['SCA_ETH_Flow_Points']:

-            hostname = ep['scaEthFppUniN']['transportPort']['Hostname']

-            port = ep['scaEthFppUniN']['transportPort']['Port']

-

-            edgePort = NetworkEdgePort()

-            edgePort.element = networkDevice

-            edgePort.pid = "{}.{}/{}".format(networkDevice.id, hostname, port)

-

-            if 'interfaceCfgIngressBwp' in ep['scaEthFppUniN']:

-                edgePort.bwpCfgCbs = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCbs']

-                edgePort.bwpCfgEbs = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEbs']

-                edgePort.bwpCfgCir = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCir']

-                edgePort.bwpCfgEir = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEir']

-

-            eps.append(edgePort)

-

-        multipointToMultipointConnectivity = NetworkMultipointToMultipointConnection()

-        multipointToMultipointConnectivity.sid = sid

-        multipointToMultipointConnectivity.type = "Multipoint_To_Multipoint"

-        multipointToMultipointConnectivity.eps = eps

-        multipointToMultipointConnectivity.operstate = "active"

-        multipointToMultipointConnectivity.adminstate = "enabled"

-

-        return(multipointToMultipointConnectivity)

-

-    def get_network_etree_link(self, networkDevice, evc):

-

-        sid = evc['id']

-        eps = []

-

-        root = evc['SCA_ETH_Flow_Points'][0]

-        hostname = root['scaEthFppUniN']['transportPort']['Hostname']

-        port = root['scaEthFppUniN']['transportPort']['Port']

-

-        edgePort = NetworkEdgePort()

-        edgePort.element = networkDevice

-        edgePort.pid = "{}.{}/{}".format(networkDevice.id, hostname, port)

-

-        if 'interfaceCfgIngressBwp' in root['scaEthFppUniN']:

-            edgePort.bwpCfgCbs = root['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCbs']

-            edgePort.bwpCfgEbs = root['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEbs']

-            edgePort.bwpCfgCir = root['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCir']

-            edgePort.bwpCfgEir = root['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEir']

-

-        edgeToMultipointConnectivity = NetworkEdgeToMultipointConnection()

-        edgeToMultipointConnectivity.sid = sid

-        edgeToMultipointConnectivity.type = "Root_Multipoint"

-        edgeToMultipointConnectivity.root = edgePort

-

-        for ep in evc['SCA_ETH_Flow_Points'][1:]:

-            hostname = ep['scaEthFppUniN']['transportPort']['Hostname']

-            port = ep['scaEthFppUniN']['transportPort']['Port']

-

-            edgePort = NetworkEdgePort()

-            edgePort.element = networkDevice

-            edgePort.pid = "{}.{}/{}".format(networkDevice.id, hostname, port)

-

-            if 'interfaceCfgIngressBwp' in ep['scaEthFppUniN']:

-                edgePort.bwpCfgCbs = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCbs']

-                edgePort.bwpCfgEbs = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEbs']

-                edgePort.bwpCfgCir = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCir']

-                edgePort.bwpCfgEir = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEir']

-

-            eps.append(edgePort)

-

-        edgeToMultipointConnectivity.eps = eps

-        edgeToMultipointConnectivity.operstate = "active"

-        edgeToMultipointConnectivity.adminstate = "enabled"

-

-        return(edgeToMultipointConnectivity)

-

-    def get_network_links(self):

-

-        objs = []

-

-        networkDevice = self.networkdevice

-        restCtrlUrl = self.networkdevice.restCtrlUrl

-        username = self.networkdevice.username

-        password = self.networkdevice.password

-

-        resp = requests.get("{}/mef-sca-api/SCA_ETH_FDFr_EC/findByState?state=Active".format(restCtrlUrl),

-                            auth=HTTPBasicAuth(username, password))

-

-        if resp.status_code == 200:

-            for evc in resp.json():

-                evcServiceType = evc['evcServiceType']

-                if (evcServiceType == "Point_To_Point"):

-                    objs.append(self.get_network_eline_link(networkDevice, evc))

-                elif (evcServiceType == "Multipoint_To_Multipoint"):

-                    objs.append(self.get_network_elan_link(networkDevice, evc))

-                elif (evcServiceType == "Root_Multipoint"):

-                    objs.append(self.get_network_etree_link(networkDevice, evc))

-                else:

-                    raise Exception("OnosApiError: get_network_links() - unknown link type")

-        else:

-            raise Exception("OnosApiError: get_network_links()")

-

-        return objs

-

-    def create_point_to_point_connectivity_json_data(self, obj):

-

-        p2p_json_data = {}

-        p2p_json_data["evcServiceType"] = "Point_To_Point"

-

-        uni1 = obj.uni1

-        uni1Id = uni1.pid

-        uni1IdToken = (uni1Id.split('.', 1))[1].split('/', 1)

-        uni1Hostname = uni1IdToken[0]

-        uni1Port = uni1IdToken[1]

-        uni1BwpCfgCbs = uni1.bwpCfgCbs

-        uni1BwpCfgEbs = uni1.bwpCfgEbs

-        uni1BwpCfgCir = uni1.bwpCfgCir

-        uni1BwpCfgEir = uni1.bwpCfgEir

-

-        uni1_json_data = {}

-        uni1_json_data['scaEthFppUniN'] = {}

-        uni1_json_data['scaEthFppUniN']['ceVlanId'] = obj.vlanid

-        uni1_json_data['scaEthFppUniN']["transportPort"] = {}

-        uni1_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"] = {}

-

-        uni1_json_data['scaEthFppUniN']["transportPort"]["Hostname"] = uni1Hostname

-        uni1_json_data['scaEthFppUniN']["transportPort"]["Port"] = uni1Port

-        uni1_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCbs"] = uni1BwpCfgCbs

-        uni1_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEbs"] = uni1BwpCfgEbs

-        uni1_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCir"] = uni1BwpCfgCir

-        uni1_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEir"] = uni1BwpCfgEir

-

-        uni2 = obj.uni2

-        uni2Id = uni2.pid

-        uni2IdToken = (uni2Id.split('.', 1))[1].split('/', 1)

-        uni2Hostname = uni2IdToken[0]

-        uni2Port = uni2IdToken[1]

-        uni2BwpCfgCbs = uni2.bwpCfgCbs

-        uni2BwpCfgEbs = uni2.bwpCfgEbs

-        uni2BwpCfgCir = uni2.bwpCfgCir

-        uni2BwpCfgEir = uni2.bwpCfgEir

-

-        uni2_json_data = {}

-        uni2_json_data['scaEthFppUniN'] = {}

-        uni2_json_data['scaEthFppUniN']['ceVlanId'] = obj.vlanid

-        uni2_json_data['scaEthFppUniN']["transportPort"] = {}

-        uni2_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"] = {}

-

-        uni2_json_data['scaEthFppUniN']["transportPort"]["Hostname"] = uni2Hostname

-        uni2_json_data['scaEthFppUniN']["transportPort"]["Port"] = uni2Port

-        uni2_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCbs"] = uni2BwpCfgCbs

-        uni2_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEbs"] = uni2BwpCfgEbs

-        uni2_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCir"] = uni2BwpCfgCir

-        uni2_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEir"] = uni2BwpCfgEir

-

-        p2p_json_data["SCA_ETH_Flow_Points"] = []

-        p2p_json_data["SCA_ETH_Flow_Points"].append(uni1_json_data)

-        p2p_json_data["SCA_ETH_Flow_Points"].append(uni2_json_data)

-

-        return p2p_json_data

-

-    # nchoi: create elan service json data

-    def create_multipoint_to_multipoint_connectivity_json_data(self, obj):

-

-        mp2mp_json_data = {}

-        mp2mp_json_data["evcServiceType"] = "Multipoint_To_Multipoint"

-        mp2mp_json_data["SCA_ETH_Flow_Points"] = []

-

-        for ep in obj.eps.all():

-            uniId = ep.pid

-            uniIdToken = (uniId.split('.', 1))[1].split('/', 1)

-            uniHostname = uniIdToken[0]

-            uniPort = uniIdToken[1]

-            uniBwpCfgCbs = ep.bwpCfgCbs

-            uniBwpCfgEbs = ep.bwpCfgEbs

-            uniBwpCfgCir = ep.bwpCfgCir

-            uniBwpCfgEir = ep.bwpCfgEir

-

-            uni_json_data = {}

-            uni_json_data['scaEthFppUniN'] = {}

-            uni_json_data['scaEthFppUniN']['ceVlanId'] = obj.vlanid

-            uni_json_data['scaEthFppUniN']["transportPort"] = {}

-            uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"] = {}

-

-            uni_json_data['scaEthFppUniN']["transportPort"]["Hostname"] = uniHostname

-            uni_json_data['scaEthFppUniN']["transportPort"]["Port"] = uniPort

-            uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCbs"] = uniBwpCfgCbs

-            uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEbs"] = uniBwpCfgEbs

-            uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCir"] = uniBwpCfgCir

-            uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEir"] = uniBwpCfgEir

-

-            mp2mp_json_data["SCA_ETH_Flow_Points"].append(uni_json_data)

-

-        return mp2mp_json_data

-

-    # nchoi: create etree service json data

-    def create_root_multipoint_connectivity_json_data(self, obj):

-

-        r2mp_json_data = {}

-        r2mp_json_data["evcServiceType"] = "Root_Multipoint"

-        r2mp_json_data["SCA_ETH_Flow_Points"] = []

-

-        root = obj.root

-        uniId = root.pid

-        uniIdToken = (uniId.split('.', 1))[1].split('/', 1)

-        uniHostname = uniIdToken[0]

-        uniPort = uniIdToken[1]

-        uniBwpCfgCbs = root.bwpCfgCbs

-        uniBwpCfgEbs = root.bwpCfgEbs

-        uniBwpCfgCir = root.bwpCfgCir

-        uniBwpCfgEir = root.bwpCfgEir

-

-        uni_json_data = {}

-        uni_json_data['scaEthFppUniN'] = {}

-        uni_json_data['scaEthFppUniN']['ceVlanId'] = obj.vlanid

-        uni_json_data['scaEthFppUniN']["transportPort"] = {}

-        uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"] = {}

-

-        uni_json_data['scaEthFppUniN']["transportPort"]["Hostname"] = uniHostname

-        uni_json_data['scaEthFppUniN']["transportPort"]["Port"] = uniPort

-        uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCbs"] = uniBwpCfgCbs

-        uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEbs"] = uniBwpCfgEbs

-        uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCir"] = uniBwpCfgCir

-        uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEir"] = uniBwpCfgEir

-

-        r2mp_json_data["SCA_ETH_Flow_Points"].append(uni_json_data)

-

-        for ep in obj.eps.all():

-            uniId = ep.pid

-            uniIdToken = (uniId.split('.', 1))[1].split('/', 1)

-            uniHostname = uniIdToken[0]

-            uniPort = uniIdToken[1]

-            uniBwpCfgCbs = ep.bwpCfgCbs

-            uniBwpCfgEbs = ep.bwpCfgEbs

-            uniBwpCfgCir = ep.bwpCfgCir

-            uniBwpCfgEir = ep.bwpCfgEir

-

-            uni_json_data = {}

-            uni_json_data['scaEthFppUniN'] = {}

-            uni_json_data['scaEthFppUniN']['ceVlanId'] = obj.vlanid

-            uni_json_data['scaEthFppUniN']["transportPort"] = {}

-            uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"] = {}

-

-            uni_json_data['scaEthFppUniN']["transportPort"]["Hostname"] = uniHostname

-            uni_json_data['scaEthFppUniN']["transportPort"]["Port"] = uniPort

-            uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCbs"] = uniBwpCfgCbs

-            uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEbs"] = uniBwpCfgEbs

-            uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCir"] = uniBwpCfgCir

-            uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEir"] = uniBwpCfgEir

-

-            r2mp_json_data["SCA_ETH_Flow_Points"].append(uni_json_data)

-

-        return r2mp_json_data

-

-    def create_network_connectivity(self, obj):

-

-        restCtrlUrl = self.networkdevice.restCtrlUrl

-        username = self.networkdevice.username

-        password = self.networkdevice.password

-

-        evcServiceType = obj.type

-        if (evcServiceType == "Point_To_Point"):

-            network_connectivity_json_data = self.create_point_to_point_connectivity_json_data(obj)

-        elif (evcServiceType == "Multipoint_To_Multipoint"):

-            network_connectivity_json_data = self.create_multipoint_to_multipoint_connectivity_json_data(obj)

-        elif (evcServiceType == "Root_Multipoint"):

-            network_connectivity_json_data = self.create_root_multipoint_connectivity_json_data(obj)

-        else:

-            raise Exception("OnosApiError: get_network_links() - unknown link type")

-

-        headers = {'Content-Type': 'application/json'}

-        resp = requests.post('{}/mef-sca-api/SCA_ETH_FDFr_EC'.format(restCtrlUrl),

-                             data=json.dumps(network_connectivity_json_data), headers=headers, auth=HTTPBasicAuth(username, password))

-

-        if resp.status_code == 201:

-            result = resp.json()

-            message = result['message']

-

-            msg_token = message.split()

-            for i, token in enumerate(msg_token):

-                if token == 'id':

-                    service_id = msg_token[i + 1]

-                    obj.sid = service_id

-                    obj.adminstate = "enabled"

-                    obj.operstate = "active"

-

-                    return True

-

-        elif resp.status_code == 204:

-            obj.adminstate = "invalid"  # what's the meaning?

-            obj.operstate = "inactive"

-            obj.backend_status = '204 - No network resource'

-

-            return False

-

-        elif resp.status_code == 500:

-            obj.adminstate = "enabled"

-            obj.operstate = "inactive"

-            obj.backend_status = '500 - Internal Server Error'

-            return False

-

-        else:

-            raise Exception("OnosApiError: create_network_connectivity()")

-

-    def delete_network_connectivity(self, obj):

-

-        restCtrlUrl = self.networkdevice.restCtrlUrl

-        username = self.networkdevice.username

-        password = self.networkdevice.password

-        evcId = obj.sid

-

-        resp = requests.delete("{}/mef-sca-api/SCA_ETH_FDFr_EC/{}".format(restCtrlUrl, evcId),

-                               auth=HTTPBasicAuth(username, password))

-

-        if resp.status_code == 200:

-            obj.adminstate = 'disabled'

-            obj.operstate = 'inactive'

-            return True

-

-        elif resp.status_code == 204:

-            obj.adminstate = "invalid"  # what's the meaning?

-            obj.backend_status = '204 - No such network resource: {}'.format(evcId)

-            return False

-

-        elif resp.status_code == 500:

-            obj.adminstate = "disabled"

-            obj.backend_status = '500 - Internal Server Error'

-            return False

-

-        else:

-            raise Exception("OnosApiError: delete_network_connectivity()")

diff --git a/xos/synchronizer/providers/metronetworktestprovider.py b/xos/synchronizer/providers/metronetworktestprovider.py
deleted file mode 100644
index 3bcbb92..0000000
--- a/xos/synchronizer/providers/metronetworktestprovider.py
+++ /dev/null
@@ -1,339 +0,0 @@
-import random
-import json
-
-from xos.logger import Logger, logging
-from services.metronetwork.models import *
-from core.models import Site
-from synchronizers.metronetwork.providers.metronetworkprovider import MetroNetworkProvider
-
-logger = Logger(level=logging.INFO)
-
-
-class MetroNetworkTestProvider(MetroNetworkProvider):
-    def __init__(self, networkdevice, **args):
-        MetroNetworkProvider.__init__(self, networkdevice, **args)
-
-    # Method for retrieving all network ports from the backend system
-    def get_network_ports(self):
-        #
-        # Our Test Network Consists of one NetworkDevice (which correspond to ONOS instance):
-        #
-        #  8 Ports
-        #  1 Eline (2 ports)
-        #  1 Etree (3 ports)
-        #  1 Elan (3 ports)
-        #
-        #  2 Sites - Representing Two R-CORD Pods
-        #  2 Ports, One-per-site
-        #  1 Bandwidth Profile
-        #  2 Service Spokes
-        #  1 VnodGlobalService
-
-        objs = []
-
-        # For The Test Provider we don't handle re-sync for anything but the Metro Test Network
-        if self.networkdevice.id != 'TestMetroNet':
-            return objs
-
-        # Set the parent device id to just be the Test NetworkDevice
-        device1 = NetworkDevice()
-        device1.id = self.networkdevice.id
-
-        port1 = NetworkEdgePort()
-        port1.element = device1
-        port1.pid = device1.id + "." + "of:000000001/1"
-        port1.bwpCfgCbs = 1000000
-        port1.bwpCfgEbs = 1000000
-        port1.bwpCfgEir = 1000000
-        port1.bwpCfgCir = 1000000
-        port1.location = "San Francisco"
-        port1.name = "Central Office 1"
-        port1.latlng = "[-122.419416, 37.774929]"
-        objs.append(port1)
-
-        port2 = NetworkEdgePort()
-        port2.element = device1
-        port2.pid = device1.id + "." + "of:000000001/2"
-        port2.bwpCfgCbs = 1000000
-        port2.bwpCfgEbs = 1000000
-        port2.bwpCfgEir = 1000000
-        port2.bwpCfgCir = 1000000
-        port2.location = "San Jose"
-        port2.name = "Central Office 2"
-        port2.latlng = "[-121.886329, 37.338208]"
-        objs.append(port2)
-
-        port3 = NetworkEdgePort()
-        port3.element = device1
-        port3.pid = device1.id + "." + "of:000000001/3"
-        port3.bwpCfgCbs = 1000000
-        port3.bwpCfgEbs = 1000000
-        port3.bwpCfgEir = 1000000
-        port3.bwpCfgCir = 1000000
-        port3.location = "Palo Alto"
-        port3.name = "Central Office 3"
-        port3.latlng = "[-122.143019, 37.441883]"
-        objs.append(port3)
-
-        port4 = NetworkEdgePort()
-        port4.element = device1
-        port4.pid = device1.id + "." + "of:000000001/4"
-        port4.bwpCfgCbs = 1000000
-        port4.bwpCfgEbs = 1000000
-        port4.bwpCfgEir = 1000000
-        port4.bwpCfgCir = 1000000
-        port4.location = "Oakland"
-        port4.name = "Central Office 4"
-        port4.latlng = "[-122.271114, 37.804364]"
-        objs.append(port4)
-
-        port5 = NetworkEdgePort()
-        port5.element = device1
-        port5.pid = device1.id + "." + "of:000000001/5"
-        port5.bwpCfgCbs = 1000000
-        port5.bwpCfgEbs = 1000000
-        port5.bwpCfgEir = 1000000
-        port5.bwpCfgCir = 1000000
-        port5.location = "San Rafael"
-        port5.name = "Central Office 5"
-        port5.latlng = "[-122.531087, 37.973535]"
-        objs.append(port5)
-
-        port6 = NetworkEdgePort()
-        port6.element = device1
-        port6.pid = device1.id + "." + "of:000000001/6"
-        port6.bwpCfgCbs = 1000000
-        port6.bwpCfgEbs = 1000000
-        port6.bwpCfgEir = 1000000
-        port6.bwpCfgCir = 1000000
-        port6.location = "San Mateo"
-        port6.name = "Central Office 6"
-        port6.latlng = "[-122.325525, 37.562992]"
-        objs.append(port6)
-
-        port7 = NetworkEdgePort()
-        port7.element = device1
-        port7.pid = device1.id + "." + "of:000000001/7"
-        port7.bwpCfgCbs = 1000000
-        port7.bwpCfgEbs = 1000000
-        port7.bwpCfgEir = 1000000
-        port7.bwpCfgCir = 1000000
-        port7.location = "Hayward"
-        port7.name = "Central Office 7"
-        port7.latlng = "[-122.080796, 37.668821]"
-        objs.append(port7)
-
-        port8 = NetworkEdgePort()
-        port8.element = device1
-        port8.pid = device1.id + "." + "of:000000001/8"
-        port8.bwpCfgCbs = 1000000
-        port8.bwpCfgEbs = 1000000
-        port8.bwpCfgEir = 1000000
-        port8.bwpCfgCir = 1000000
-        port8.location = "Fremont"
-        port8.name = "Central Office 8"
-        port8.latlng = "[-121.988572, 37.548270]"
-        objs.append(port8)
-
-        return objs
-
-    def get_network_ports_for_deletion(self):
-
-        objs = []
-
-        # For The Test Provider we don't handle re-sync for anything but the Metro Test Network
-        if self.networkdevice.id != 'TestMetroNet':
-            return objs
-
-        allports = MetroNetworkProvider.get_network_ports_for_deletion(self)
-
-        for port in allports:
-            objs.append(port)
-
-        return objs
-
-    def get_network_links(self):
-
-        objs = []
-
-        # Connectivity object - Point to Point
-        cordpod1device = NetworkDevice()
-        cordpod1device.id = self.networkdevice.id
-
-        # Edge to Edge Point Connectivity Objects
-        edgetoedgeconnectivity = NetworkEdgeToEdgePointConnection()
-        edgetoedgeconnectivity.uni1_createbuffer = cordpod1device.id + "." + "of:000000001/1"
-        edgetoedgeconnectivity.uni2_createbuffer = cordpod1device.id + "." + "of:000000001/2"
-        edgetoedgeconnectivity.type = 'direct'
-        edgetoedgeconnectivity.operstate = 'active'
-        edgetoedgeconnectivity.adminstate = 'enabled'
-        edgetoedgeconnectivity.sid = 'EdgeToEdgePointConnectivity_1'
-        objs.append(edgetoedgeconnectivity)
-
-
-        # Multipoint to Multipoint Connectivity Objects
-        multipoint2multipointconnectivity=NetworkMultipointToMultipointConnection()
-        multipoint2multipointconnectivity.operstate = 'active'
-        multipoint2multipointconnectivity.adminstate = 'enabled'
-        multipoint2multipointconnectivity.type = 'ethernet'
-        multipoint2multipointconnectivity.sid = 'MultipointToMultipointConnectivity_1'
-
-        #
-        # Create JSON array for post-save behaviour
-        #
-        eps = []
-        eps.append(cordpod1device.id + "." + "of:000000001/3")
-        eps.append(cordpod1device.id + "." + "of:000000001/4")
-        eps.append(cordpod1device.id + "." + "of:000000001/5")
-
-        myjsonstr = {'eps': eps, 'foo':0, 'bar':0}
-        multipoint2multipointconnectivity.eps_createbuffer = json.dumps(myjsonstr)
-        objs.append(multipoint2multipointconnectivity)
-
-        # Edge to Multipoint Connectivity Objects
-        edge2multipointconnectivity = NetworkEdgeToMultipointConnection()
-        edge2multipointconnectivity.operstate = 'active'
-        edge2multipointconnectivity.adminstate = 'enabled'
-        edge2multipointconnectivity.type = 'ethernet'
-        edge2multipointconnectivity.sid = 'EdgeToMultipointConnectivity_1'
-        edge2multipointconnectivity.root_createbuffer = cordpod1device.id + "." + "of:000000001/7"
-        #
-        # Create JSON array for post-save behaviour
-        #
-        eps = []
-        eps.append(cordpod1device.id + "." + "of:000000001/6")
-        eps.append(cordpod1device.id + "." + "of:000000001/8")
-
-        myjsonstr = {'eps': eps, 'foo': 0, 'bar': 0}
-        edge2multipointconnectivity.eps_createbuffer = json.dumps(myjsonstr)
-        objs.append(edge2multipointconnectivity)
-
-        # Create Objects for VnodGlobal Sort of Testing
-
-        # Bandwidth Profile
-
-        bwprofile = BandwidthProfile()
-        bwprofile.bwpcfgcbs  = 0
-        bwprofile.bwpcfgcir = 0
-        bwprofile.bwpcfgebs = 0
-        bwprofile.bwpcfgeir = 0
-        bwprofile.name = 'TestBWP'
-        objs.append(bwprofile)
-
-        # Two Sites
-        site1 = Site()
-        site1.name = 'CORDPod1'
-        site1.login_base = 'CordPod1'
-        site1.site_url = 'http://1.2.3.4:8080/VnodLocalApi'
-        objs.append(site1)
-
-        site2 = Site()
-        site2.name = 'CORDPod2'
-        site2.login_base = 'CordPod2'
-        site2.site_url = 'http://10.11.12.13:8080/VnodLocalApi'
-        objs.append(site2)
-
-        # Two Ports - one per Site
-
-        remoteport1 = RemotePort()
-        remoteport1.name = "CORDPOD1:Port1"
-        remoteport1.sitename = 'CordPod1'
-        remoteport1.edgeportname = cordpod1device.id + "." + "of:000000001/1"
-        objs.append(remoteport1)
-
-        remoteport2 = RemotePort()
-        remoteport2.name = "CORDPOD2:Port1"
-        remoteport2.sitename = 'CordPod2'
-        remoteport2.edgeportname = cordpod1device.id + "." + "of:000000001/2"
-        objs.append(remoteport2)
-
-        # One Spoke/Site
-        spoke1 = ServiceSpoke()
-        spoke1.name = 'TestSpoke1'
-        spoke1.remoteportname = "CORDPOD1:Port1"
-        spoke1.remotevnodid = 'CORDPod1:VnodLocal:1'
-        spoke1.operstate = 'inactive'
-        spoke1.adminstate = 'enabled'
-        spoke1.sitename = 'CordPod1'
-        objs.append(spoke1)
-
-        spoke2 = ServiceSpoke()
-        spoke2.name = 'TestSpoke2'
-        spoke2.remoteportname = "CORDPOD2:Port1"
-        spoke2.remotevnodid = 'CORDPod2:VnodLocal:1'
-        spoke2.operstate = 'active'
-        spoke2.adminstate = 'enabled'
-        spoke2.sitename = 'CordPod2'
-        objs.append(spoke2)
-
-        # One VnodGlobal Service
-        vnodglobal = VnodGlobalService()
-        vnodglobal.name = 'VnodGlobalPtToPtTest1'
-        vnodglobal.type = 'eline'
-        vnodglobal.vlanid = '100'
-        vnodglobal.operstate = 'active'
-        vnodglobal.adminstate = 'enabled'
-        vnodglobal.servicehandle = 'testhandle1'
-        vnodglobal.pointtopointsid = 'onos_eline_id'
-        vnodglobal.bwpname = 'TestBWP'
-
-        # Create JSON array for post-save behaviour
-        #
-        spokes = ['TestSpoke1', 'TestSpoke2']
-        myjsonstr = {'spokes': spokes}
-        vnodglobal.spokes_createbuffer = json.dumps(myjsonstr)
-        objs.append(vnodglobal)
-
-        return objs
-
-    def get_network_links_for_deletion(self):
-
-        # For now we'll rely on cascade deletes in the port area - so from the test provider nothing to do
-        objs = []
-        return objs
-
-    def create_point_to_point_connectivity(self, obj):
-
-        # Ok - here is what we'll do to simulate the 'real world' - get a random number between 1 and 10
-        # 1-7 is considered 'successful' 8 is considered a transient error - 9 is a configuration problem
-        # 10 is a - resource exhausted problem - there you go!!
-        scenario = random.randint(1, 10)
-
-        if (scenario >= 1 and scenario <= 7):
-            obj.adminstate = 'enabled'
-            obj.operstate = 'active'
-            return True
-        elif (scenario == 8):
-            obj.adminstate = 'enabled'
-            obj.operstate = 'inactive'
-            obj.backend_status = '8 - Transient Server Error'
-            return False
-        elif (scenario == 9):
-            obj.adminstate = 'invalid'
-            obj.operstate = 'inactive'
-            obj.backend_status = '9 - Configuration Error'
-            return False
-        else:
-            obj.adminstate = 'enabled'
-            obj.operstate = 'inactive'
-            obj.backend_status = '10 - Resource Exhaustion'
-            return False
-
-    def delete_point_to_point_connectivity(self, obj):
-
-        # Ok - here is what we'll do to simulate the 'real world' - get a random number between 1 and 10
-        # 1-8 is considered 'successful' 8 is considered a transient error - 9 is a configuration problem
-        scenario = random.randint(1, 10)
-
-        if (scenario >= 1 and scenario <= 8):
-            obj.adminstate = 'disabled'
-            obj.operstate = 'inactive'
-            return True
-        elif (scenario == 9):
-            obj.adminstate = 'disabled'
-            obj.backend_status = '8 - Transient Server Error'
-            return False
-        else:
-            obj.adminstate = 'invalid'
-            obj.backend_status = '9 - Configuration Error'
-            return False
diff --git a/xos/synchronizer/providers/providerfactory.py b/xos/synchronizer/providers/providerfactory.py
deleted file mode 100644
index 9ef6cb8..0000000
--- a/xos/synchronizer/providers/providerfactory.py
+++ /dev/null
@@ -1,21 +0,0 @@
-import sys
-
-from synchronizers.metronetwork.providers.metronetworktestprovider import MetroNetworkTestProvider
-from synchronizers.metronetwork.providers.metronetworkrestprovider import MetroNetworkRestProvider
-
-
-class ProviderFactory(object):
-    @staticmethod
-    def getprovider(networkdevice):
-
-        undertest = False
-
-        # We either return Test or Rest
-        # By convention a NetworkDevice with name TestDomain will use test objects
-        if networkdevice.id == 'TestMetroNet' or networkdevice.id == 'TestCORD1Net' or networkdevice.id == 'TestCORD2Net':
-            undertest = True
-
-        if undertest:
-            return MetroNetworkTestProvider(networkdevice)
-        else:
-            return MetroNetworkRestProvider(networkdevice)
diff --git a/xos/synchronizer/run-from-api.sh b/xos/synchronizer/run-from-api.sh
old mode 100644
new mode 100755
index 95ba5dd..73f5eec
--- a/xos/synchronizer/run-from-api.sh
+++ b/xos/synchronizer/run-from-api.sh
@@ -1,2 +1,3 @@
+#!/usr/bin/env bash
 export XOS_DIR=/opt/xos
 python metronetwork-synchronizer.py  -C $XOS_DIR/synchronizers/metro-net/metronetwork_from_api_config
\ No newline at end of file
diff --git a/xos/synchronizer/invokers/__init__.py b/xos/synchronizer/steps/__init__.py
similarity index 100%
rename from xos/synchronizer/invokers/__init__.py
rename to xos/synchronizer/steps/__init__.py
diff --git a/xos/synchronizer/steps/sync_metroneteline.py b/xos/synchronizer/steps/sync_metroneteline.py
new file mode 100644
index 0000000..bd0bfef
--- /dev/null
+++ b/xos/synchronizer/steps/sync_metroneteline.py
@@ -0,0 +1,89 @@
+import os
+import sys
+import requests
+import json
+from synchronizers.new_base.syncstep import SyncStep
+from synchronizers.new_base.modelaccessor import *
+#from xos.logger import Logger, logging
+
+from requests.auth import HTTPBasicAuth
+#logger = Logger(level=logging.INFO)
+
+parentdir = os.path.join(os.path.dirname(__file__), "..")
+sys.path.insert(0, parentdir)
+
+
+class SyncMetroNetEline(SyncStep):
+    provides = [ELine]
+
+    observes = ELine
+
+    requested_interval = 0
+
+    def __init__(self, *args, **kwargs):
+        super(SyncMetroNetEline, self).__init__(*args, **kwargs)
+
+    def get_onos_global_addr(self, onos):
+        #Fetching ip and port from the Global ONOS, append the CE specif API
+
+        onos_url = "http://%s:%s/onos/" % (onos.onos_ip, onos.onos_port)
+        evc_endpoint = "carrierethernet/evc"
+        return onos_url + evc_endpoint
+
+    def get_onos_global_auth(self, onos):
+        #Fetching username and password from the Global ONOS
+
+        return HTTPBasicAuth(onos.onos_username, onos.onos_password)
+
+    def sync_record(self, evc):
+        print "POST %s " % (evc)
+        #logger.info("Syncing Edited EVC: %s" % evc.name)
+        # Fetch the bwp from the DB
+        bwp = BandwidthProfile.objects.get(name=evc.bwp)
+
+        # json to configure ONOS to start the EVC.
+        # {
+        #     "evcId": "evc1",
+        #     "evcCfgId": "evpl1",
+        #     "uniList": [
+        #         "netconf:192.168.56.10:830/0",
+        #         "netconf:192.168.56.20:830/0"
+        #     ],
+        #     "evcType": "POINT_TO_POINT",
+        #     "vlanId": 100,
+        #     "cir": "400",
+        #     "eir": "200",
+        #     "cbs": "3000",
+        #     "ebs": "2000"
+        # }
+
+        data = {}
+        data["evcId"] = evc.name
+        data["evcCfgId"] = evc.name
+        data["uniList"] = [evc.connect_point_1_id, evc.connect_point_2_id]
+        data["evcType"] = "POINT_TO_POINT"
+        data["vlanId"] = evc.vlanids.split(",")
+        data["cbs"] = bwp.cbs
+        data["ebs"] = bwp.ebs
+        data["cir"] = bwp.cir
+        data["eir"] = bwp.eir
+        print "data %s" % data
+        # assuming that the CPEs are controller by the fabric ONOS
+        onos = OnosModel.objects.get(onos_type="global")
+        onos_addr = self.get_onos_global_addr(onos)
+
+        # FIXME - hardcoded auth
+        auth = self.get_onos_global_auth(onos)
+
+        print "POST %s for app %s, data = %s" % (onos_addr, evc.name, data)
+
+        r = requests.post(onos_addr, data=json.dumps(data), auth=auth)
+        #TODO XOS might fail to connect to ONOS.
+        if (r.status_code != 200):
+            print r
+            raise Exception("Received error from EVC Installation update (%d)" % r.status_code)
+
+    def delete_record(self, evc):
+        # TODO evaluate what to in this case.
+        print "Syncing delete EVC: %s" % evc.name
+        #logger.info("Syncing delete EVC: %s" % evc.name)
diff --git a/xos/synchronizer/steps/sync_metronetworkservice.py b/xos/synchronizer/steps/sync_metronetworkservice.py
deleted file mode 100644
index 3468d2b..0000000
--- a/xos/synchronizer/steps/sync_metronetworkservice.py
+++ /dev/null
@@ -1,254 +0,0 @@
-import os, sys
-from itertools import chain
-
-from synchronizers.new_base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible #if needed
-from synchronizers.new_base.ansible_helper import run_template_ssh #if needed
-from synchronizers.new_base.modelaccessor import *
-from xos.logger import Logger, logging
-from synchronizers.metronetwork.providers.providerfactory import ProviderFactory
-from synchronizers.metronetwork.invokers.invokerfactory import InvokerFactory
-
-# metronetwork will be in steps/..
-parentdir = os.path.join(os.path.dirname(__file__), "..")
-sys.path.insert(0, parentdir)
-
-logger = Logger(level=logging.INFO)
-
-
-class SyncMetroNetworkSystem(SyncStep):
-    provides = [MetroNetworkSystem]
-    observes = MetroNetworkSystem
-    requested_interval = 0
-    initialized = False
-
-    def __init__(self, **args):
-        SyncStep.__init__(self, **args)
-
-    def fetch_pending(self, deletion=False):
-
-        # The general idea:
-        # We do one of two things in here:
-        #    1. Full Synchronization of the DBS (XOS <-> MetroONOS)
-        #    2. Look for updates between the two stores
-        # The first thing is potentially a much bigger
-        # operation and should not happen as often
-        #
-        # The Sync operation must take into account the 'deletion' flag
-
-        objs = []
-
-        # Get the NetworkSystem object - if it exists it will test us
-        # whether we should do a full sync or not - it all has our config
-        # information about the REST interface
-
-        metronetworksystem = self.get_metronetwork_system()
-        if not metronetworksystem:
-            logger.debug("No Service configured")
-            return objs
-
-        # Check to make sure the Metro Network System is enabled
-        metronetworksystem = self.get_metronetwork_system()
-        if metronetworksystem.administrativeState == 'disabled':
-            # Nothing to do
-            logger.debug("MetroService configured - state is Disabled")
-            return objs
-
-        # The Main Loop - retrieve all the NetworkDevice objects - for each of these
-        # Apply synchronization aspects
-        networkdevices = NetworkDevice.objects.all()
-
-        for dev in networkdevices:
-
-            # Set up the provider
-            provider = ProviderFactory.getprovider(dev)
-
-            # First check is for the AdminState of Disabled - do nothing
-            if dev.administrativeState == 'disabled':
-                # Nothing to do with this device
-                logger.debug("NetworkDevice %s: administrativeState set to Disabled - continuing" % dev.id)
-
-            # Now to the main options - are we syncing - deletion portion
-            elif dev.administrativeState == 'syncrequested' and deletion is True:
-
-                logger.info("NetworkDevice %s: administrativeState set to SyncRequested" % dev.id)
-
-                # Kill Links
-                networklinks = provider.get_network_links_for_deletion()
-                for link in networklinks:
-                    objs.append(link)
-
-                # Kill Ports
-                allports = provider.get_network_ports_for_deletion()
-                for port in allports:
-                    objs.append(port)
-
-                logger.info("NetworkDevice %s: Deletion part of Sync completed" % dev.id)
-                dev.administrativeState = 'syncinprogress'
-                dev.save(update_fields=['administrativeState'])
-
-            # Now to the main options - are we syncing - creation portion
-            elif dev.administrativeState == 'syncinprogress' and deletion is False:
-
-                logger.info("NetworkDevice %s: administrativeState set to SyncRequested" % dev.id)
-                # Reload objects in the reverse order of deletion
-
-                # Add Ports
-                networkports = provider.get_network_ports()
-                for port in networkports:
-                    objs.append(port)
-
-                # Add Links
-                networklinks = provider.get_network_links()
-                for link in networklinks:
-                    objs.append(link)
-
-                logger.info("NetworkDevice %s: Creation part of Sync completed" % dev.id)
-                dev.administrativeState = 'enabled'
-                dev.save(update_fields=['administrativeState'])
-
-            # If we are enabled - then check for events - in either direction and sync
-            elif dev.administrativeState == 'enabled' and deletion is False:
-                logger.debug("NetworkDevice: administrativeState set to Enabled - non deletion phase")
-
-                # This should be the 'normal running state' when we are not deleting - a few things to do in here
-
-                # Get the changed objects from the provider - deletions are handled separately
-                eventobjs = provider.get_updated_or_created_objects()
-                for eventobj in eventobjs:
-                    # Simply put in the queue for update - this will handle both new and changed objects
-                    objs.append(eventobj)
-
-                # Handle changes XOS -> ONOS
-                # Check for ConnectivityObjects that are in acticationequested state - creates to the backend
-                p2pactivatereqs = NetworkEdgeToEdgePointConnection.objects.filter(adminstate='activationrequested')
-                mp2mpactivatereqs = NetworkMultipointToMultipointConnection.objects.filter(adminstate='activationrequested')
-                r2mpactivatereqs = NetworkEdgeToMultipointConnection.objects.filter(adminstate='activationrequested')
-                activatereqs = list(chain(p2pactivatereqs, mp2mpactivatereqs, r2mpactivatereqs))
-                for activatereq in activatereqs:
-
-                    # Call the XOS Interface to create the service
-                    logger.debug("Attempting to create EdgePointToEdgePointConnectivity: %s" % activatereq.id)
-                    if (provider.create_network_connectivity(activatereq)):
-                        # Everyting is OK, lets let the system handle the persist
-                        objs.append(activatereq)
-                    else:
-                        # In the case of an error we persist the state of the object directly to preserve
-                        # the error code - and because that is how the base synchronizer is designed
-                        activatereq.save()
-
-                # Check for ConnectivityObjects that are in deacticationequested state - deletes to the backend
-                p2pdeactivatereqs = NetworkEdgeToEdgePointConnection.objects.filter(adminstate='deactivationrequested')
-                mp2mpdeactivatereqs = NetworkMultipointToMultipointConnection.objects.filter(adminstate='deactivationrequested')
-                r2mpdeactivatereqs = NetworkEdgeToMultipointConnection.objects.filter(adminstate='deactivationrequested')
-                deactivatereqs = list(chain(p2pdeactivatereqs, mp2mpdeactivatereqs, r2mpdeactivatereqs))
-                for deactivatereq in deactivatereqs:
-
-                    # Call the XOS Interface to delete the service
-                    logger.debug("Attempting to delete EdgePointToEdgePointConnectivity: %s" % deactivatereq.id)
-                    if provider.delete_network_connectivity(deactivatereq):
-                        # Everyting is OK, lets let the system handle the persist
-                        objs.append(deactivatereq)
-                    else:
-                        # In the case of an error we persist the state of the object directly to preserve
-                        # the error code - and because that is how the base synchronizer is designed
-                        deactivatereq.save()
-
-            # If we are enabled - and in our deletion pass then look for objects waiting for deletion
-            elif dev.administrativeState == 'enabled' and deletion is True:
-                logger.debug("NetworkDevice: administrativeState set to Enabled - deletion phase")
-
-                # Any object that is simply deleted in the model gets removed automatically - the synchronizer
-                # doesn't get involved - we just need to check for deleted objects in the domain and reflect that
-                # in the model
-                #
-                # Get the deleted objects from the provider
-                eventobjs = provider.get_deleted_objects()
-                for eventobj in eventobjs:
-                    # Simply put in the queue for update - this will handle both new and changed objects
-                    objs.append(eventobj)
-
-                # Handle the case where we have deleted Eline Services from our side - if the Service is in
-                # enabled state then we call the provider, otherwise just queue it for deletion
-                elinedeletedobjs = NetworkEdgeToEdgePointConnection.deleted_objects.all()
-                for elinedeletedobj in elinedeletedobjs:
-                    if elinedeletedobj.adminstate == 'enabled':
-                        provider.delete_network_connectivity(elinedeletedobj)
-                    # Either way queue it for deletion
-                    objs.append(elinedeletedobj)
-
-                # Handle the case where we have deleted Etree Services from our side - if the Service is in
-                # enabled state then we call the provider, otherwise just queue it for deletion
-                etreedeletedobjs = NetworkEdgeToMultipointConnection.deleted_objects.all()
-                for etreedeletedobj in etreedeletedobjs:
-                    # TODO: Handle the case where its connected, we need to disconnect first
-                    if etreedeletedobj.adminstate == 'enabled':
-                        provider.delete_network_connectivity(etreedeletedobj)
-                    # Either way queue it for deletion
-                    objs.append(etreedeletedobj)
-
-                # Handle the case where we have deleted Elan Services from our side - if the Service is in
-                # enabled state then we call the provider, otherwise just queue it for deletion
-                elandeletedobjs = NetworkMultipointToMultipointConnection.deleted_objects.all()
-                for elandeletedobj in elandeletedobjs:
-                    # TODO: Handle the case where its connected, we need to disconnect first
-                    if elandeletedobj.adminstate == 'enabled':
-                        provider.delete_network_connectivity(elandeletedobj)
-                    # Either way queue it for deletion
-                    objs.append(elandeletedobj)
-
-                # Handle the case where we have deleted VnodGlobal Services from our side - if there is
-                # an attached Eline/Etree/Elan we set that to deleted
-                vnodbloaldeletedobjs = VnodGlobalService.deleted_objects.all()
-                for vnodbloaldeletedobj in vnodbloaldeletedobjs:
-                    # Check for dependent eline service
-                    if vnodbloaldeletedobj.metronetworkpointtopoint is not None:
-                        elineobj = vnodbloaldeletedobj.metronetworkpointtopoint
-                        elineobj.deleted = True
-                        objs.append(elineobj)
-                    # Check for dependent elan service
-                    if vnodbloaldeletedobj.metronetworkmultipoint is not None:
-                        elanobj = vnodbloaldeletedobj.metronetworkmultipoint
-                        elanobj.deleted = True
-                        objs.append(elanobj)
-                    # Check for dependent etree service
-                    if vnodbloaldeletedobj.metronetworkroottomultipoint is not None:
-                        etreeobj = vnodbloaldeletedobj.metronetworkroottomultipoint
-                        etreeobj.deleted = True
-                        objs.append(etreeobj)
-
-                    objs.append(vnodbloaldeletedobj)
-
-        # In add cases return the objects we are interested in
-        return objs
-
-    def sync_record(self, o):
-
-        # First we call and see if there is an invoker for this object - the idea of the invoker
-        # is to wrap the save with a pre/post paradigm to handle special cases
-        # It will only exist for a subset of ojbects
-        invoker = InvokerFactory.getinvoker(o)
-
-        # Call Pre-save on the inovker (if it exists)
-        if invoker is not None:
-            invoker.presave(o)
-
-        # Simply save the record to the DB - both updates and adds are handled the same way
-        o.save()
-
-        # Call Post-save on the inovker (if it exists)
-        if invoker is not None:
-            invoker.postsave(o)
-
-    def delete_record(self, o):
-        # Overriden to customize our behaviour - the core sync step for will remove the record directly
-        # We just log and return
-        logger.debug("deleting Object %s" % str(o), extra=o.tologdict())
-
-    def get_metronetwork_system(self):
-        # We only expect to have one of these objects in the system in the curent design
-        # So get the first element from the query
-        metronetworksystem = MetroNetworkSystem.objects.all()
-        if not metronetworksystem:
-            return None
-
-        return metronetworksystem[0]
diff --git a/xos/tosca/resources/metronetservice.py b/xos/tosca/resources/metronetservice.py
index 372337f..37d1d7d 100644
--- a/xos/tosca/resources/metronetservice.py
+++ b/xos/tosca/resources/metronetservice.py
@@ -1,37 +1,28 @@
 from xosresource import XOSResource
 from service import XOSService
-from services.metronetwork.models import *
-
-class XOSMetroNetworkSystem(XOSResource):
-    provides = "tosca.nodes.MetroNetworkSystem"
-    xos_model = MetroNetworkSystem
-    copyin_props = ["name", "administrativeState", "restUrl"]
-
-class MetroNetworkDevice(XOSResource):
-    provides = "tosca.nodes.MetroNetworkDevice"
-    xos_model = NetworkDevice
-    copyin_props = ["id", "name", "administrativeState", "username", "password", "authType", "restCtrlUrl"]
-
-class VnodGlobalService(XOSService):
-    provides = "tosca.nodes.VNodGlobalService"
-    xos_model = VnodGlobalService
-    copyin_props = ["view_url", "icon_url", "enabled", "published", "public_key", "versionNumber"]
-
-    def get_xos_args(self):
-        args = super(VnodGlobalService, self).get_xos_args()
-
-        profile = self.get_requirement("tosca.relationships.UsesBandwidthProfile", throw_exception=False)
-        if profile:
-            profile = self.get_xos_object(BandwidthProfile, name=profile)
-            args["bandwidthProfile"] = profile
-        return args
-
-class XOSMetronetBandwithProficle(XOSResource):
-    provides = "tosca.nodes.EcordBandwidthProfile"
-    xos_model = BandwidthProfile
-    copyin_props = ['bwpcfgcbs','bwpcfgebs','bwpcfgcir','bwpcfgeir','name']
+from services.metronet.models import *
 
 class XOSMetronetUNI(XOSResource):
-    provides = "tosca.nodes.EcordUserNetworkInterface"
+    provides = "tosca.nodes.UserNetworkInterface"
     xos_model = UserNetworkInterface
-    copyin_props = ['enabled','capacity','bw_used','vlanIds', 'location', 'latlng', 'name']
\ No newline at end of file
+    copyin_props = ['tenant','vlanIds', 'cpe_id', 'latlng', 'name']
+
+class XOSMetronetEnterpriseLocation(XOSResource):
+    provides = "tosca.nodes.EnterpriseLocation"
+    xos_model = EnterpriseLocation
+    copyin_props = ['name', 'cord_site_ip', 'cord_site_port', 'cord_site_username', 'cord_site_password', 'cord_site_type']
+
+class XOSMetronetOnosModel(XOSResource):
+    provides = "tosca.nodes.OnosModel"
+    xos_model = OnosModel
+    copyin_props = ['name', 'onos_ip', 'onos_port', 'onos_username', 'onos_password', 'onos_type']
+
+class XOSMetronetBandwithProfile(XOSResource):
+    provides = "tosca.nodes.BandwidthProfile"
+    xos_model = BandwidthProfile
+    copyin_props = ['cbs', 'ebs', 'cir', 'eir', 'name']
+
+class XOSMetronetELine(XOSResource):
+    provides = "tosca.nodes.ELine"
+    xos_model = ELine
+    copyin_props = ['name', 'connect_point_1_id', 'connect_point_2_id', 'vlanids', 'cord_site_name', 'bwp']
\ No newline at end of file
diff --git a/xos/tosca/resources/metronetservice.py.old b/xos/tosca/resources/metronetservice.py.old
new file mode 100644
index 0000000..372337f
--- /dev/null
+++ b/xos/tosca/resources/metronetservice.py.old
@@ -0,0 +1,37 @@
+from xosresource import XOSResource
+from service import XOSService
+from services.metronetwork.models import *
+
+class XOSMetroNetworkSystem(XOSResource):
+    provides = "tosca.nodes.MetroNetworkSystem"
+    xos_model = MetroNetworkSystem
+    copyin_props = ["name", "administrativeState", "restUrl"]
+
+class MetroNetworkDevice(XOSResource):
+    provides = "tosca.nodes.MetroNetworkDevice"
+    xos_model = NetworkDevice
+    copyin_props = ["id", "name", "administrativeState", "username", "password", "authType", "restCtrlUrl"]
+
+class VnodGlobalService(XOSService):
+    provides = "tosca.nodes.VNodGlobalService"
+    xos_model = VnodGlobalService
+    copyin_props = ["view_url", "icon_url", "enabled", "published", "public_key", "versionNumber"]
+
+    def get_xos_args(self):
+        args = super(VnodGlobalService, self).get_xos_args()
+
+        profile = self.get_requirement("tosca.relationships.UsesBandwidthProfile", throw_exception=False)
+        if profile:
+            profile = self.get_xos_object(BandwidthProfile, name=profile)
+            args["bandwidthProfile"] = profile
+        return args
+
+class XOSMetronetBandwithProficle(XOSResource):
+    provides = "tosca.nodes.EcordBandwidthProfile"
+    xos_model = BandwidthProfile
+    copyin_props = ['bwpcfgcbs','bwpcfgebs','bwpcfgcir','bwpcfgeir','name']
+
+class XOSMetronetUNI(XOSResource):
+    provides = "tosca.nodes.EcordUserNetworkInterface"
+    xos_model = UserNetworkInterface
+    copyin_props = ['enabled','capacity','bw_used','vlanIds', 'location', 'latlng', 'name']
\ No newline at end of file