diff --git a/xos/core/xoslib/methods/cordsubscriber._unused b/xos/core/xoslib/methods/cordsubscriber._unused
deleted file mode 100644
index 8fc88e0..0000000
--- a/xos/core/xoslib/methods/cordsubscriber._unused
+++ /dev/null
@@ -1,380 +0,0 @@
-from rest_framework.decorators import api_view
-from rest_framework.response import Response
-from rest_framework.reverse import reverse
-from rest_framework import serializers
-from rest_framework import generics
-from rest_framework import viewsets
-from rest_framework.decorators import detail_route, list_route
-from rest_framework.views import APIView
-from core.models import *
-from django.forms import widgets
-from django.conf.urls import patterns, url
-from services.volt.models import VOLTTenant, CordSubscriberRoot
-from core.xoslib.objects.cordsubscriber import CordSubscriber
-from plus import PlusSerializerMixin, XOSViewSet
-from django.shortcuts import get_object_or_404
-from xos.apibase import XOSListCreateAPIView, XOSRetrieveUpdateDestroyAPIView, XOSPermissionDenied
-from xos.exceptions import *
-import json
-import subprocess
-
-if hasattr(serializers, "ReadOnlyField"):
-    # rest_framework 3.x
-    ReadOnlyField = serializers.ReadOnlyField
-else:
-    # rest_framework 2.x
-    ReadOnlyField = serializers.Field
-
-class CordSubscriberIdSerializer(serializers.ModelSerializer, PlusSerializerMixin):
-        id = ReadOnlyField()
-        service_specific_id = ReadOnlyField()
-        c_tag = ReadOnlyField()
-        s_tag = ReadOnlyField()
-        vcpe_id = ReadOnlyField()
-        instance = ReadOnlyField()
-        image = ReadOnlyField()
-        vbng_id = ReadOnlyField()
-        firewall_enable = serializers.BooleanField()
-        firewall_rules = serializers.CharField()
-        url_filter_enable = serializers.BooleanField()
-        url_filter_rules = serializers.CharField()
-        url_filter_level = serializers.CharField(required=False)
-        cdn_enable = serializers.BooleanField()
-        instance_name = ReadOnlyField()
-        image_name = ReadOnlyField()
-        routeable_subnet = serializers.CharField(required=False)
-        ssh_command = ReadOnlyField()
-        bbs_account = ReadOnlyField()
-
-        wan_container_ip = ReadOnlyField()
-        uplink_speed = serializers.CharField(required=False)
-        downlink_speed = serializers.CharField(required=False)
-        status = serializers.CharField()
-        enable_uverse = serializers.BooleanField()
-
-        lan_ip = ReadOnlyField()
-        wan_ip = ReadOnlyField()
-        nat_ip = ReadOnlyField()
-        private_ip = ReadOnlyField()
-
-        wan_mac = ReadOnlyField()
-
-        vcpe_synced = serializers.BooleanField()
-
-        humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-
-        class Meta:
-            model = CordSubscriber
-            fields = ('humanReadableName', 'id',
-                      'service_specific_id', 's_tag', 'c_tag',
-                      'vcpe_id', 'instance', 'instance_name', 'image', 'image_name',
-                      'firewall_enable', 'firewall_rules',
-                      'url_filter_enable', 'url_filter_rules', 'url_filter_level',
-                      'bbs_account',
-                      'ssh_command',
-                      'vcpe_synced',
-                      'cdn_enable', 'vbng_id', 'routeable_subnet', 'nat_ip', 'lan_ip', 'wan_ip', 'private_ip', 'wan_mac',
-                      'wan_container_ip',
-                      'uplink_speed', 'downlink_speed', 'status', 'enable_uverse')
-
-
-        def getHumanReadableName(self, obj):
-            return obj.__unicode__()
-
-#------------------------------------------------------------------------------
-# The "old" API
-# This is used by the xoslib-based GUI
-#------------------------------------------------------------------------------
-
-class CordSubscriberList(XOSListCreateAPIView):
-    queryset = CordSubscriber.get_tenant_objects().select_related().all()
-    serializer_class = CordSubscriberIdSerializer
-
-    method_kind = "list"
-    method_name = "cordsubscriber"
-
-class CordSubscriberDetail(XOSRetrieveUpdateDestroyAPIView):
-    queryset = CordSubscriber.get_tenant_objects().select_related().all()
-    serializer_class = CordSubscriberIdSerializer
-
-    method_kind = "detail"
-    method_name = "cordsubscriber"
-
-# We fake a user object by pulling the user data struct out of the
-# subscriber object...
-
-def serialize_user(subscriber, user):
-    return {"id": "%d-%d" % (subscriber.id, user["id"]),
-            "name": user["name"],
-            "level": user.get("level",""),
-            "mac": user.get("mac", ""),
-            "subscriber": subscriber.id }
-
-class CordUserList(APIView):
-    method_kind = "list"
-    method_name = "corduser"
-
-    def get(self, request, format=None):
-        instances=[]
-        for subscriber in CordSubscriber.get_tenant_objects().all():
-            for user in subscriber.devices:
-                instances.append( serialize_user(subscriber, user) )
-
-        return Response(instances)
-
-    def post(self, request, format=None):
-        data = request.DATA
-        subscriber = CordSubscriber.get_tenant_objects().get(id=int(data["subscriber"]))
-        user = subscriber.create_user(name=data["name"],
-                                    level=data["level"],
-                                    mac=data["mac"])
-        subscriber.save()
-
-        return Response(serialize_user(subscriber,user))
-
-class CordUserDetail(APIView):
-    method_kind = "detail"
-    method_name = "corduser"
-
-    def get(self, request, format=None, pk=0):
-        parts = pk.split("-")
-        subscriber = CordSubscriber.get_tenant_objects().filter(id=parts[0])
-        for user in subscriber.devices:
-            return Response( [ serialize_user(subscriber, user) ] )
-        raise XOSNotFound("Failed to find user %s" % pk)
-
-    def delete(self, request, pk):
-        parts = pk.split("-")
-        subscriber = CordSubscriber.get_tenant_objects().get(id=int(parts[0]))
-        subscriber.delete_user(parts[1])
-        subscriber.save()
-        return Response("okay")
-
-    def put(self, request, pk):
-        kwargs={}
-        if "name" in request.DATA:
-             kwargs["name"] = request.DATA["name"]
-        if "level" in request.DATA:
-             kwargs["level"] = request.DATA["level"]
-        if "mac" in request.DATA:
-             kwargs["mac"] = request.DATA["mac"]
-
-        parts = pk.split("-")
-        subscriber = CordSubscriber.get_tenant_objects().get(id=int(parts[0]))
-        user = subscriber.update_user(parts[1], **kwargs)
-        subscriber.save()
-        return Response(serialize_user(subscriber,user))
-
-#------------------------------------------------------------------------------
-# The "new" API with many more REST endpoints.
-# This is for integration with with the subscriber GUI
-#------------------------------------------------------------------------------
-
-class CordSubscriberViewSet(XOSViewSet):
-    base_name = "subscriber"
-    method_name = "rs/subscriber"
-    method_kind = "viewset"
-    queryset = CordSubscriber.get_tenant_objects().select_related().all()
-    serializer_class = CordSubscriberIdSerializer
-
-    def get_vcpe(self):
-        subscriber = self.get_object()
-        if not subscriber.vcpe:
-            raise XOSMissingField("vCPE object is not present for subscriber")
-        return subscriber.vcpe
-
-    @classmethod
-    def get_urlpatterns(self):
-        patterns = super(CordSubscriberViewSet, self).get_urlpatterns()
-        patterns.append( self.detail_url("vcpe_synced/$", {"get": "get_vcpe_synced"}, "vcpe_synced") )
-        patterns.append( self.detail_url("url_filter/$", {"get": "get_url_filter"}, "url_filter") )
-        patterns.append( self.detail_url("url_filter/(?P<level>[a-zA-Z0-9\-_]+)/$", {"put": "set_url_filter"}, "url_filter") )
-        patterns.append( self.detail_url("services/$", {"get": "get_services"}, "services") )
-        patterns.append( self.detail_url("services/(?P<service>[a-zA-Z0-9\-_]+)/$", {"get": "get_service"}, "get_service") )
-        patterns.append( self.detail_url("services/(?P<service>[a-zA-Z0-9\-_]+)/true/$", {"put": "enable_service"}, "enable_service") )
-        patterns.append( self.detail_url("services/(?P<service>[a-zA-Z0-9\-_]+)/false/$", {"put": "disable_service"}, "disable_service") )
-
-        patterns.append( self.detail_url("users/$", {"get": "get_users", "post": "create_user"}, "users") )
-        patterns.append( self.detail_url("users/clearusers/$", {"get": "clear_users", "put": "clear_users", "post": "clear_users"}, "clearusers") )
-        patterns.append( self.detail_url("users/newuser/$", {"put": "create_user", "post": "create_user"}, "newuser") )
-        patterns.append( self.detail_url("users/(?P<uid>[0-9\-]+)/$", {"delete": "delete_user"}, "user") )
-        patterns.append( self.detail_url("users/(?P<uid>[0-9\-]+)/url_filter/$", {"get": "get_user_level"}, "user_level") )
-        patterns.append( self.detail_url("users/(?P<uid>[0-9\-]+)/url_filter/(?P<level>[a-zA-Z0-9\-_]+)/$", {"put": "set_user_level"}, "set_user_level") )
-
-        patterns.append( self.detail_url("bbsdump/$", {"get": "get_bbsdump"}, "bbsdump") )
-
-        patterns.append( url("^rs/initdemo/$", self.as_view({"put": "initdemo", "get": "initdemo"}), name="initdemo") )
-
-        patterns.append( url("^rs/subidlookup/(?P<ssid>[0-9\-]+)/$", self.as_view({"get": "ssiddetail"}), name="ssiddetail") )
-        patterns.append( url("^rs/subidlookup/$", self.as_view({"get": "ssidlist"}), name="ssidlist") )
-
-        #patterns.append( url("^rs/vbng_mapping/$", self.as_view({"get": "get_vbng_mapping"}), name="vbng_mapping") )
-
-        return patterns
-
-    def list(self, request):
-        object_list = self.filter_queryset(self.get_queryset())
-
-        serializer = self.get_serializer(object_list, many=True)
-
-        return Response({"subscribers": serializer.data})
-
-    def get_vcpe_synced(self, request, pk=None):
-        subscriber = self.get_object()
-        return Response({"vcpe_synced": subscriber.vcpe_synced})
-
-    def get_url_filter(self, request, pk=None):
-        subscriber = self.get_object()
-        return Response({"level": subscriber.url_filter_level})
-
-    def set_url_filter(self, request, pk=None, level=None):
-        subscriber = self.get_object()
-        subscriber.url_filter_level = level
-        subscriber.save()
-        return Response({"level": subscriber.url_filter_level})
-
-    def get_users(self, request, pk=None):
-        subscriber = self.get_object()
-        return Response(subscriber.devices)
-
-    def get_user_level(self, request, pk=None, uid=None):
-        subscriber = self.get_object()
-        user = subscriber.find_user(uid)
-        if user and user.get("level", None):
-            level = user["level"]
-        else:
-            level = self.get_object().url_filter_level
-
-        return Response( {"id": uid, "level": level} )
-
-    def set_user_level(self, request, pk=None, uid=None, level=None):
-        subscriber = self.get_object()
-        subscriber.update_user(uid, level=level)
-        subscriber.save()
-        return self.get_user_level(request, pk, uid)
-
-    def create_user(self, request, pk=None):
-        data = request.DATA
-        name = data.get("name",None)
-        mac = data.get("mac",None)
-        if (not name):
-             raise XOSMissingField("name must be specified when creating user")
-        if (not mac):
-             raise XOSMissingField("mac must be specified when creating user")
-
-        subscriber = self.get_object()
-        newuser = subscriber.create_user(name=name, mac=mac)
-        subscriber.save()
-
-        return Response(newuser)
-
-    def delete_user(self, request, pk=None, uid=None):
-        subscriber = self.get_object()
-        subscriber.delete_user(uid)
-        subscriber.save()
-
-        return Response( {"id": uid, "deleted": True} )
-
-    def clear_users(self, request, pk=None):
-        subscriber = self.get_object()
-        subscriber.devices = []
-        subscriber.save()
-
-        return Response( "Okay" )
-
-    def get_services(self, request, pk=None):
-        subscriber = self.get_object()
-        return Response(subscriber.services)
-
-    def get_service(self, request, pk=None, service=None):
-        service_attr = service+"_enable"
-        subscriber = self.get_object()
-        return Response({service: getattr(subscriber, service_attr)})
-
-    def enable_service(self, request, pk=None, service=None):
-        service_attr = service+"_enable"
-        subscriber = self.get_object()
-        setattr(subscriber, service_attr, True)
-        subscriber.save()
-        return Response({service: getattr(subscriber, service_attr)})
-
-    def disable_service(self, request, pk=None, service=None):
-        service_attr = service+"_enable"
-        subscriber = self.get_object()
-        setattr(subscriber, service_attr, False)
-        subscriber.save()
-        return Response({service: getattr(subscriber, service_attr)})
-
-    def get_bbsdump(self, request, pk=None):
-        subscriber = self.get_object()
-        if not subsciber.volt or not subscriber.volt.vcpe:
-            raise XOSMissingField("subscriber has no vCPE")
-        if not subscriber.volt.vcpe.bbs_account:
-            raise XOSMissingField("subscriber has no bbs_account")
-
-        result=subprocess.check_output(["python", "/opt/xos/observers/vcpe/broadbandshield.py", "dump", subscriber.volt.vcpe.bbs_account, "123"])
-        if request.GET.get("theformat",None)=="text":
-            from django.http import HttpResponse
-            return HttpResponse(result, content_type="text/plain")
-        else:
-            return Response( {"bbs_dump": result } )
-
-    def setup_demo_subscriber(self, subscriber):
-        # nuke the users and start over
-        subscriber.devices = []
-        subscriber.create_user(name="Mom's PC",      mac="010203040506", level="PG_13")
-        subscriber.create_user(name="Dad's PC",      mac="90E2Ba82F975", level="PG_13")
-        subscriber.create_user(name="Jack's Laptop", mac="685B359D91D5", level="PG_13")
-        subscriber.create_user(name="Jill's Laptop", mac="34363BC9B6A6", level="PG_13")
-        subscriber.save()
-
-    def initdemo(self, request):
-        object_list = CordSubscriber.get_tenant_objects().all()
-
-        # reset the parental controls in any existing demo vCPEs
-        for o in object_list:
-            if str(o.service_specific_id) in ["0", "1"]:
-                self.setup_demo_subscriber(o)
-
-        demo_subscribers = [o for o in object_list if o.is_demo_user]
-
-        if demo_subscribers:
-            return Response({"id": demo_subscribers[0].id})
-
-        subscriber = CordSubscriberRoot(service_specific_id=1234,
-                                        name="demo-subscriber",)
-        subscriber.is_demo_user = True
-        subscriber.save()
-
-        self.setup_demo_subscriber(subscriber)
-
-        return Response({"id": subscriber.id})
-
-    def ssidlist(self, request):
-        object_list = CordSubscriber.get_tenant_objects().all()
-
-        ssidmap = [ {"service_specific_id": x.service_specific_id, "subscriber_id": x.id} for x in object_list ]
-
-        return Response({"ssidmap": ssidmap})
-
-    def ssiddetail(self, pk=None, ssid=None):
-        object_list = CordSubscriber.get_tenant_objects().all()
-
-        ssidmap = [ {"service_specific_id": x.service_specific_id, "subscriber_id": x.id} for x in object_list if str(x.service_specific_id)==str(ssid) ]
-
-        if len(ssidmap)==0:
-            raise XOSNotFound("didn't find ssid %s" % str(ssid))
-
-        return Response( ssidmap[0] )
-
-    #def get_vbng_mapping(self, request):
-    #    object_list = VBNGTenant.get_tenant_objects().all()
-    #
-    #    mappings = []
-    #    for vbng in object_list:
-    #        if vbng.mapped_ip and vbng.routeable_subnet:
-    #            mappings.append( {"private_ip": vbng.mapped_ip, "routeable_subnet": vbng.routeable_subnet, "mac": vbng.mapped_mac, "hostname": vbng.mapped_hostname} )
-    #
-    #    return Response( {"vbng_mapping": mappings} )
-
-
diff --git a/xos/core/xoslib/methods/monitoringchannel._unused b/xos/core/xoslib/methods/monitoringchannel._unused
deleted file mode 100644
index 66ca2ae..0000000
--- a/xos/core/xoslib/methods/monitoringchannel._unused
+++ /dev/null
@@ -1,89 +0,0 @@
-from rest_framework.decorators import api_view
-from rest_framework.response import Response
-from rest_framework.reverse import reverse
-from rest_framework import serializers
-from rest_framework import generics
-from rest_framework import status
-from core.models import *
-from django.forms import widgets
-from services.ceilometer.models import MonitoringChannel, CeilometerService
-from plus import PlusSerializerMixin
-from xos.apibase import XOSListCreateAPIView, XOSRetrieveUpdateDestroyAPIView, XOSPermissionDenied
-
-if hasattr(serializers, "ReadOnlyField"):
-    # rest_framework 3.x
-    ReadOnlyField = serializers.ReadOnlyField
-else:
-    # rest_framework 2.x
-    ReadOnlyField = serializers.Field
-
-def get_default_ceilometer_service():
-    ceilometer_services = CeilometerService.get_service_objects().all()
-    if ceilometer_services:
-        return ceilometer_services[0].id
-    return None
-
-class MonitoringChannelSerializer(serializers.ModelSerializer, PlusSerializerMixin):
-        id = ReadOnlyField()
-        service_specific_attribute = ReadOnlyField()
-        ceilometer_url = ReadOnlyField()
-        tenant_list_str = ReadOnlyField()
-        creator = ReadOnlyField()
-        instance = ReadOnlyField()
-        provider_service = serializers.PrimaryKeyRelatedField(queryset=CeilometerService.get_service_objects().all(), default=get_default_ceilometer_service)
-
-        humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-
-        computeNodeName = serializers.SerializerMethodField("getComputeNodeName")
-
-        class Meta:
-            model = MonitoringChannel
-            fields = ('humanReadableName', 'id', 'provider_service', 'service_specific_attribute', 'ceilometer_url', 'tenant_list_str', 'creator', 'instance', 'computeNodeName' )
-
-        def getHumanReadableName(self, obj):
-            return obj.__unicode__()
-
-        def getComputeNodeName(self, obj):
-            instance = obj.instance
-            if not instance:
-                return None
-            return instance.node.name
-
-class MonitoringChannelList(XOSListCreateAPIView):
-    serializer_class = MonitoringChannelSerializer
-
-    method_kind = "list"
-    method_name = "monitoringchannel"
-
-    def get_queryset(self):
-        queryset = MonitoringChannel.get_tenant_objects().select_related().all()
-
-        current_user = self.request.user.username
-        if current_user is not None:
-            ids = [x.id for x in queryset if x.creator.username==current_user]
-            queryset = queryset.filter(id__in=ids)
-
-        return queryset
-
-    def post(self, request, format=None):
-        current_user = request.user.username
-        existing_obj = None
-        for obj in MonitoringChannel.get_tenant_objects().all():
-            if (obj.creator.username == current_user):
-               existing_obj = obj
-               break
-
-        if existing_obj:
-            serializer = MonitoringChannelSerializer(existing_obj)
-            headers = self.get_success_headers(serializer.data)
-            return Response( serializer.data, status=status.HTTP_200_OK )
-
-        return super(MonitoringChannelList, self).post(request, format)
-
-class MonitoringChannelDetail(XOSRetrieveUpdateDestroyAPIView):
-    serializer_class = MonitoringChannelSerializer
-    queryset = MonitoringChannel.get_tenant_objects().select_related().all()
-
-    method_kind = "detail"
-    method_name = "monitoringchannel"
-
diff --git a/xos/core/xoslib/methods/volttenant._unused b/xos/core/xoslib/methods/volttenant._unused
deleted file mode 100644
index 03a2a97..0000000
--- a/xos/core/xoslib/methods/volttenant._unused
+++ /dev/null
@@ -1,104 +0,0 @@
-from rest_framework.decorators import api_view
-from rest_framework.response import Response
-from rest_framework.reverse import reverse
-from rest_framework import serializers
-from rest_framework import generics
-from rest_framework import status
-from core.models import *
-from django.forms import widgets
-from services.volt.models import VOLTTenant, VOLTService, CordSubscriberRoot
-from plus import PlusSerializerMixin
-from xos.apibase import XOSListCreateAPIView, XOSRetrieveUpdateDestroyAPIView, XOSPermissionDenied
-
-if hasattr(serializers, "ReadOnlyField"):
-    # rest_framework 3.x
-    ReadOnlyField = serializers.ReadOnlyField
-else:
-    # rest_framework 2.x
-    ReadOnlyField = serializers.Field
-
-def get_default_volt_service():
-    volt_services = VOLTService.get_service_objects().all()
-    if volt_services:
-        return volt_services[0].id
-    return None
-
-class VOLTTenantIdSerializer(serializers.ModelSerializer, PlusSerializerMixin):
-        id = ReadOnlyField()
-        service_specific_id = serializers.CharField()
-        s_tag = serializers.CharField()
-        c_tag = serializers.CharField()
-        provider_service = serializers.PrimaryKeyRelatedField(queryset=VOLTService.get_service_objects().all(), default=get_default_volt_service)
-        subscriber_root = serializers.PrimaryKeyRelatedField(queryset=CordSubscriberRoot.get_tenant_objects().all(), required=False)
-
-        humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
-
-        computeNodeName = serializers.SerializerMethodField("getComputeNodeName")
-
-        class Meta:
-            model = VOLTTenant
-            fields = ('humanReadableName', 'id', 'provider_service', 'service_specific_id', 's_tag', 'c_tag', 'computeNodeName', 'subscriber_root' )
-
-        def getHumanReadableName(self, obj):
-            return obj.__unicode__()
-
-        def getComputeNodeName(self, obj):
-            vcpe = obj.vcpe
-            if not vcpe:
-                return None
-            instance = vcpe.instance
-            if not instance:
-                return None
-            return instance.node.name
-
-class VOLTTenantList(XOSListCreateAPIView):
-    serializer_class = VOLTTenantIdSerializer
-
-    method_kind = "list"
-    method_name = "volttenant"
-
-    def get_queryset(self):
-        queryset = VOLTTenant.get_tenant_objects().select_related().all()
-
-        service_specific_id = self.request.query_params.get('service_specific_id', None)
-        if service_specific_id is not None:
-            queryset = queryset.filter(service_specific_id=service_specific_id)
-
-        c_tag = self.request.query_params.get('c_tag', None)
-        if c_tag is not None:
-            ids = [x.id for x in queryset if x.get_attribute("c_tag", None)==c_tag]
-            queryset = queryset.filter(id__in=ids)
-
-        s_tag = self.request.query_params.get('s_tag', None)
-        if s_tag is not None:
-            ids = [x.id for x in queryset if x.get_attribute("s_tag", None)==s_tag]
-            queryset = queryset.filter(id__in=ids)
-
-        return queryset
-
-    def post(self, request, format=None):
-        data = request.DATA
-
-        existing_obj = None
-        for obj in VOLTTenant.get_tenant_objects().all():
-            if (obj.c_tag == data.get("c_tag", None)) and (obj.s_tag == data.get("s_tag", None)) and  (obj.service_specific_id == data.get("service_specific_id",None)):
-               existing_obj = obj
-
-        if existing_obj:
-            serializer = VOLTTenantIdSerializer(existing_obj)
-            headers = self.get_success_headers(serializer.data)
-            return Response( serializer.data, status=status.HTTP_200_OK )
-
-        return super(VOLTTenantList, self).post(request, format)
-
-class VOLTTenantDetail(XOSRetrieveUpdateDestroyAPIView):
-    serializer_class = VOLTTenantIdSerializer
-    queryset = VOLTTenant.get_tenant_objects().select_related().all()
-
-    method_kind = "detail"
-    method_name = "volttenant"
-
-
-
-
-
diff --git a/xos/core/xoslib/methods/vtn._unused b/xos/core/xoslib/methods/vtn._unused
deleted file mode 100644
index c9dbf3a..0000000
--- a/xos/core/xoslib/methods/vtn._unused
+++ /dev/null
@@ -1,65 +0,0 @@
-from rest_framework.decorators import api_view
-from rest_framework.response import Response
-from rest_framework.reverse import reverse
-from rest_framework import serializers
-from rest_framework import generics
-from rest_framework import viewsets
-from rest_framework.decorators import detail_route, list_route
-from rest_framework.views import APIView
-from core.models import *
-from django.forms import widgets
-from django.conf.urls import patterns, url
-from plus import PlusSerializerMixin, XOSViewSet
-from django.shortcuts import get_object_or_404
-from xos.apibase import XOSListCreateAPIView, XOSRetrieveUpdateDestroyAPIView, XOSPermissionDenied
-from xos.exceptions import *
-import json
-import subprocess
-
-class VTNViewSet(XOSViewSet):
-    base_name = "vtn"
-    method_name = "rs/vtn"
-    method_kind = "viewset"
-
-    # these are just because ViewSet needs some queryset and model, even if we don't use the
-    # default endpoints
-    queryset = Service.objects.none() # CordSubscriber.get_tenant_objects().select_related().all()
-    model = Service
-
-    @classmethod
-    def get_urlpatterns(self):
-        patterns = []
-        patterns.append( self.list_url("services/$", {"get": "get_services"}, "services") )
-        patterns.append( self.list_url("services_names/$", {"get": "get_services_names"}, "services") )
-        patterns.append( self.list_url("services/(?P<service>[a-zA-Z0-9\-_]+)/$", {"get": "get_service"}, "get_service") )
-
-        return patterns
-
-    def get_services_names(self, request, pk=None):
-        result = {}
-        for service in Service.objects.all():
-           for id in service.get_vtn_src_names():
-               dependencies = service.get_vtn_dependencies_names()
-               if dependencies:
-                   result[id] = dependencies
-        return Response(result)
-
-    def get_services(self, request, pk=None):
-        result = {}
-        for service in Service.objects.all():
-           for id in service.get_vtn_src_ids():
-               dependencies = service.get_vtn_dependencies_ids()
-               if dependencies:
-                   result[id] = dependencies
-        return Response(result)
-
-    def get_service(self, request, pk=None, service=None):
-        for xos_service in Service.objects.all():
-            if service in xos_service.get_vtn_src_ids():
-                return Response(xos_service.get_vtn_dependencies_ids())
-        return Response([])
-        # raise DoesNotExist()
-
-    def list(self, request):
-        raise Exception("Not Implemented")
-
diff --git a/xos/tosca/custom_types/exampleservice.m4._unused b/xos/tosca/custom_types/exampleservice.m4._unused
deleted file mode 100644
index 720913e..0000000
--- a/xos/tosca/custom_types/exampleservice.m4._unused
+++ /dev/null
@@ -1,31 +0,0 @@
-tosca_definitions_version: tosca_simple_yaml_1_0
-
-# compile this with "m4 exampleservice.m4 > exampleservice.yaml"
-
-# include macros
-include(macros.m4)
-
-node_types:
-    tosca.nodes.ExampleService:
-        derived_from: tosca.nodes.Root
-        description: >
-            Example Service
-        capabilities:
-            xos_base_service_caps
-        properties:
-            xos_base_props
-            xos_base_service_props
-            service_message:
-                type: string
-                required: false
-
-    tosca.nodes.ExampleTenant:
-        derived_from: tosca.nodes.Root
-        description: >
-            A Tenant of the example service
-        properties:
-            xos_base_tenant_props
-            tenant_message:
-                type: string
-                required: false
-
diff --git a/xos/tosca/custom_types/exampleservice.yaml._unused b/xos/tosca/custom_types/exampleservice.yaml._unused
deleted file mode 100644
index 2cd70dd..0000000
--- a/xos/tosca/custom_types/exampleservice.yaml._unused
+++ /dev/null
@@ -1,101 +0,0 @@
-tosca_definitions_version: tosca_simple_yaml_1_0
-
-# compile this with "m4 exampleservice.m4 > exampleservice.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.ExampleService:
-        derived_from: tosca.nodes.Root
-        description: >
-            Example 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.
-            service_message:
-                type: string
-                required: false
-
-    tosca.nodes.ExampleTenant:
-        derived_from: tosca.nodes.Root
-        description: >
-            A Tenant of the example service
-        properties:
-            kind:
-                type: string
-                default: generic
-                description: Kind of tenant
-            service_specific_id:
-                type: string
-                required: false
-                description: Service specific ID opaque to XOS but meaningful to service
-            tenant_message:
-                type: string
-                required: false
-
