diff --git a/xos/tosca/resources/activetest.py b/xos/tosca/resources/activetest.py
new file mode 100644
index 0000000..9b734b5
--- /dev/null
+++ b/xos/tosca/resources/activetest.py
@@ -0,0 +1,105 @@
+from core.models import Service,User,CoarseTenant
+from services.activetest.models import ActiveTestService, Qt600Service, VpmaService, VtaService
+
+from xosresource import XOSResource
+
+class XOSActiveTestService(XOSResource):
+    provides = "tosca.nodes.ActiveTest"
+    xos_model = ActiveTestService
+    copyin_props = ["view_url", "icon_url", "enabled", "published", "public_key", "private_key_fn", "versionNumber"]
+
+    def postprocess(self, obj):
+        for provider_service_name in self.get_requirements("tosca.relationships.TenantOfService"):
+            provider_service = self.get_xos_object(ActiveTestService, name=provider_service_name)
+
+            existing_tenancy = CoarseTenant.get_tenant_objects().filter(provider_service = provider_service, subscriber_service = obj)
+            if existing_tenancy:
+                self.info("Tenancy relationship from %s to %s already exists" % (str(obj), str(provider_service)))
+            else:
+                tenancy = CoarseTenant(provider_service = provider_service,
+                                       subscriber_service = obj)
+                tenancy.save()
+
+                self.info("Created Tenancy relationship  from %s to %s" % (str(obj), str(provider_service)))
+
+    def can_delete(self, obj):
+        if obj.slices.exists():
+            self.info("Service %s has active slices; skipping delete" % obj.name)
+            return False
+        return super(XOSActiveTestService, self).can_delete(obj)
+
+class XOSQt600Service(XOSResource):
+    provides = "tosca.nodes.Qt600Service"
+    xos_model = Qt600Service
+    copyin_props = ["view_url", "icon_url", "enabled", "published", "public_key", "private_key_fn", "versionNumber"]
+
+    def postprocess(self, obj):
+        for provider_service_name in self.get_requirements("tosca.relationships.TenantOfService"):
+            provider_service = self.get_xos_object(Qt600Service, name=provider_service_name)
+
+            existing_tenancy = CoarseTenant.get_tenant_objects().filter(provider_service = provider_service, subscriber_service = obj)
+            if existing_tenancy:
+                self.info("Tenancy relationship from %s to %s already exists" % (str(obj), str(provider_service)))
+            else:
+                tenancy = CoarseTenant(provider_service = provider_service,
+                                       subscriber_service = obj)
+                tenancy.save()
+
+                self.info("Created Tenancy relationship  from %s to %s" % (str(obj), str(provider_service)))
+
+    def can_delete(self, obj):
+        if obj.slices.exists():
+            self.info("Service %s has active slices; skipping delete" % obj.name)
+            return False
+        return super(XOSQt600Service, self).can_delete(obj)
+
+class XOSVpmaService(XOSResource):
+    provides = "tosca.nodes.VpmaService"
+    xos_model = VpmaService
+    copyin_props = ["view_url", "icon_url", "enabled", "published", "public_key", "private_key_fn", "versionNumber"]
+
+    def postprocess(self, obj):
+        for provider_service_name in self.get_requirements("tosca.relationships.TenantOfService"):
+            provider_service = self.get_xos_object(VpmaService, name=provider_service_name)
+
+            existing_tenancy = CoarseTenant.get_tenant_objects().filter(provider_service = provider_service, subscriber_service = obj)
+            if existing_tenancy:
+                self.info("Tenancy relationship from %s to %s already exists" % (str(obj), str(provider_service)))
+            else:
+                tenancy = CoarseTenant(provider_service = provider_service,
+                                       subscriber_service = obj)
+                tenancy.save()
+
+                self.info("Created Tenancy relationship  from %s to %s" % (str(obj), str(provider_service)))
+
+    def can_delete(self, obj):
+        if obj.slices.exists():
+            self.info("Service %s has active slices; skipping delete" % obj.name)
+            return False
+        return super(XOSVpmaService, self).can_delete(obj)
+
+class XOSVtaService(XOSResource):
+    provides = "tosca.nodes.VtaService"
+    xos_model = VtaService
+    copyin_props = ["view_url", "icon_url", "enabled", "published", "public_key", "private_key_fn", "versionNumber"]
+
+    def postprocess(self, obj):
+        for provider_service_name in self.get_requirements("tosca.relationships.TenantOfService"):
+            provider_service = self.get_xos_object(VtaService, name=provider_service_name)
+
+            existing_tenancy = CoarseTenant.get_tenant_objects().filter(provider_service = provider_service, subscriber_service = obj)
+            if existing_tenancy:
+                self.info("Tenancy relationship from %s to %s already exists" % (str(obj), str(provider_service)))
+            else:
+                tenancy = CoarseTenant(provider_service = provider_service,
+                                       subscriber_service = obj)
+                tenancy.save()
+
+                self.info("Created Tenancy relationship  from %s to %s" % (str(obj), str(provider_service)))
+
+    def can_delete(self, obj):
+        if obj.slices.exists():
+            self.info("Service %s has active slices; skipping delete" % obj.name)
+            return False
+        return super(XOSVtaService, self).can_delete(obj)
+
diff --git a/xos/tosca/resources/activetesttenant.py b/xos/tosca/resources/activetesttenant.py
new file mode 100644
index 0000000..7b1a09d
--- /dev/null
+++ b/xos/tosca/resources/activetesttenant.py
@@ -0,0 +1,29 @@
+from core.models import Tenant, Service
+from services.activetest.models import ActiveTestTenant, ACTIVETEST_KIND as ACTIVETESTTENANT_KIND
+
+from xosresource import XOSResource
+
+class XOSActiveTestTenant(XOSResource):
+    provides = "tosca.nodes.ActiveTestTenant"
+    xos_model = ActiveTestTenant
+    name_field = "service_specific_id"
+    copyin_props = ("tenant_message",)
+
+    def get_xos_args(self, throw_exception=True):
+        args = super(XOSActiveTestTenant, self).get_xos_args()
+
+        # ActiveTestTenant must always have a provider_service
+        provider_name = self.get_requirement("tosca.relationships.TenantOfService", throw_exception=True)
+        if provider_name:
+            args["provider_service"] = self.get_xos_object(Service, throw_exception=True, name=provider_name)
+
+        return args
+
+    def get_existing_objs(self):
+        args = self.get_xos_args(throw_exception=False)
+        return ActiveTestTenant.get_tenant_objects().filter(provider_service=args["provider_service"], service_specific_id=args["service_specific_id"])
+        return []
+
+    def can_delete(self, obj):
+        return super(XOSActiveTestTenant, self).can_delete(obj)
+
diff --git a/xos/tosca/resources/qt600tenant.py b/xos/tosca/resources/qt600tenant.py
new file mode 100644
index 0000000..e223428
--- /dev/null
+++ b/xos/tosca/resources/qt600tenant.py
@@ -0,0 +1,28 @@
+from core.models import Tenant, Service
+from services.activetest.models import Qt600Tenant
+
+from xosresource import XOSResource
+
+class XOSQt600Tenant(XOSResource):
+    name_field = "service_specific_id"
+    provides = "tosca.nodes.Qt600Tenant"
+    copyin_props = ("is_reflector","is_initiator","reflector",)
+    xos_model = Qt600Tenant
+
+    def get_xos_args(self, throw_exception=True):
+        args = super(XOSQt600Tenant, self).get_xos_args()
+
+        # Qt600Tenant must always have a provider_service
+        provider_name = self.get_requirement("tosca.relationships.TenantOfService", throw_exception=True)
+        if provider_name:
+            args["provider_service"] = self.get_xos_object(Service, throw_exception=True, name=provider_name)
+
+        return args
+
+    def can_delete(self, obj):
+        return super(XOSQt600Tenant, self).can_delete(obj)
+
+    def get_existing_objs(self):
+        args = self.get_xos_args(throw_exception=False)
+        return Qt600Tenant.get_tenant_objects().filter(provider_service=args["provider_service"], service_specific_id=args["service_specific_id"])
+        return []
diff --git a/xos/tosca/resources/vpmatenant.py b/xos/tosca/resources/vpmatenant.py
new file mode 100644
index 0000000..3e45e26
--- /dev/null
+++ b/xos/tosca/resources/vpmatenant.py
@@ -0,0 +1,28 @@
+from core.models import Tenant, Service
+from services.activetest.models import VpmaTenant
+
+from xosresource import XOSResource
+
+class XOSVpmaTenant(XOSResource):
+    name_field = "service_specific_id"
+    provides = "tosca.nodes.VpmaTenant"
+    copyin_props = ("is_reflector","is_initiator","reflector",)
+    xos_model = VpmaTenant
+
+    def get_xos_args(self, throw_exception=True):
+        args = super(XOSVpmaTenant, self).get_xos_args()
+
+        # VpmaTenant must always have a provider_service
+        provider_name = self.get_requirement("tosca.relationships.TenantOfService", throw_exception=True)
+        if provider_name:
+            args["provider_service"] = self.get_xos_object(Service, throw_exception=True, name=provider_name)
+
+        return args
+
+    def can_delete(self, obj):
+        return super(XOSVpmaTenant, self).can_delete(obj)
+
+    def get_existing_objs(self):
+        args = self.get_xos_args(throw_exception=False)
+        return VpmaTenant.get_tenant_objects().filter(provider_service=args["provider_service"], service_specific_id=args["service_specific_id"])
+        return []
diff --git a/xos/tosca/resources/vtatenant.py b/xos/tosca/resources/vtatenant.py
new file mode 100644
index 0000000..e2ecf25
--- /dev/null
+++ b/xos/tosca/resources/vtatenant.py
@@ -0,0 +1,27 @@
+from core.models import Tenant, Service
+from services.activetest.models import VtaTenant
+
+from xosresource import XOSResource
+
+class XOSVtaTenant(XOSResource):
+    name_field = "service_specific_id"
+    provides = "tosca.nodes.VtaTenant"
+    xos_model = VtaTenant
+
+    def get_xos_args(self, throw_exception=True):
+        args = super(XOSVtaTenant, self).get_xos_args()
+
+        # VtaTenant must always have a provider_service
+        provider_name = self.get_requirement("tosca.relationships.TenantOfService", throw_exception=True)
+        if provider_name:
+            args["provider_service"] = self.get_xos_object(Service, throw_exception=True, name=provider_name)
+
+        return args
+
+    def can_delete(self, obj):
+        return super(XOSVtaTenant, self).can_delete(obj)
+
+    def get_existing_objs(self):
+        args = self.get_xos_args(throw_exception=False)
+        return VtaTenant.get_tenant_objects().filter(provider_service=args["provider_service"], service_specific_id=args["service_specific_id"])
+        return []
