diff --git a/xos/api/service/activetest.py b/xos/api/service/activetest.py
new file mode 100644
index 0000000..8492d93
--- /dev/null
+++ b/xos/api/service/activetest.py
@@ -0,0 +1,108 @@
+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 import status
+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 api.xosapi_helpers import PlusModelSerializer, XOSViewSet, ReadOnlyField
+from django.shortcuts import get_object_or_404
+from xos.apibase import XOSListCreateAPIView, XOSRetrieveUpdateDestroyAPIView, XOSPermissionDenied
+from xos.exceptions import *
+import json
+import subprocess
+from services.activetest.models import ActiveTestService, VpmaService, Qt600Service
+
+class ActiveTestSerializer(PlusModelSerializer):
+        id = ReadOnlyField()
+        humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
+
+        class Meta:
+            model = ActiveTestService
+            fields = ('humanReadableName',
+                      'id')
+
+        def getHumanReadableName(self, obj):
+            return obj.__unicode__()
+
+class ActiveTestViewSet(XOSViewSet):
+    base_name = "activetest"
+    method_name = "activetest"
+    method_kind = "viewset"
+    queryset = ActiveTestService.get_service_objects().all()
+    serializer_class = ActiveTestSerializer
+
+    @classmethod
+    def get_urlpatterns(self, api_path="^"):
+        patterns = super(ActiveTestViewSet, 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 VpmaSerializer(PlusModelSerializer):
+        id = ReadOnlyField()
+        humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
+
+        class Meta:
+            model = VpmaService
+            fields = ('humanReadableName',
+                      'id')
+
+        def getHumanReadableName(self, obj):
+            return obj.__unicode__()
+
+class VpmaViewSet(XOSViewSet):
+    base_name = "vpma"
+    method_name = "vpma"
+    method_kind = "viewset"
+    queryset = VpmaService.get_service_objects().all()
+    serializer_class = VpmaSerializer
+
+    @classmethod
+    def get_urlpatterns(self, api_path="^"):
+        patterns = super(VpmaViewSet, 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 Qt600Serializer(PlusModelSerializer):
+        id = ReadOnlyField()
+        humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
+
+        class Meta:
+            model = Qt600Service
+            fields = ('humanReadableName',
+                      'id')
+
+        def getHumanReadableName(self, obj):
+            return obj.__unicode__()
+
+class Qt600ViewSet(XOSViewSet):
+    base_name = "qt600"
+    method_name = "qt600"
+    method_kind = "viewset"
+    queryset = Qt600Service.get_service_objects().all()
+    serializer_class = Qt600Serializer
+
+    @classmethod
+    def get_urlpatterns(self, api_path="^"):
+        patterns = super(Qt600ViewSet, 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)
diff --git a/xos/api/tenant/activetesttenant.py b/xos/api/tenant/activetesttenant.py
new file mode 100644
index 0000000..3da66dd
--- /dev/null
+++ b/xos/api/tenant/activetesttenant.py
@@ -0,0 +1,201 @@
+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 xos.apibase import XOSListCreateAPIView, XOSRetrieveUpdateDestroyAPIView, XOSPermissionDenied
+from api.xosapi_helpers import PlusModelSerializer, XOSViewSet, ReadOnlyField
+
+from services.activetest.models import ActiveTestTenant, ActiveTestService, VpmaService, VpmaTenant, Qt600Service, Qt600Tenant
+
+def get_default_activetest_service():
+    activetest_services = ActiveTestService.get_service_objects().all()
+    if activetest_services:
+        return activetest_services[0]
+    return None
+
+class ActiveTestTenantSerializer(PlusModelSerializer):
+        id = ReadOnlyField()
+        provider_service = serializers.PrimaryKeyRelatedField(queryset=ActiveTestService.get_service_objects().all(), default=get_default_activetest_service)
+        backend_status = ReadOnlyField()
+
+        humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
+
+        class Meta:
+            model = ActiveTestTenant
+            fields = ('humanReadableName', 'id', 'provider_service', 'backend_status')
+
+        def getHumanReadableName(self, obj):
+            return obj.__unicode__()
+
+class ActiveTestTenantViewSet(XOSViewSet):
+    base_name = "activetesttenant"
+    method_name = "activetesttenant"
+    method_kind = "viewset"
+    queryset = ActiveTestTenant.get_tenant_objects().all()
+    serializer_class = ActiveTestTenantSerializer
+
+
+    def list(self, request):
+        queryset = self.filter_queryset(self.get_queryset())
+        serializer = self.get_serializer(queryset, many=True)
+        return Response(serializer.data)
+
+#####################################################################################################################
+
+def get_default_vpma_service():
+    vpma_services = VpmaService.get_service_objects().all()
+    if vpma_services:
+        return vpma_services[0]
+    return None
+
+class VpmaTenantSerializer(PlusModelSerializer):
+        id = ReadOnlyField()
+        provider_service = serializers.PrimaryKeyRelatedField(queryset=VpmaService.get_service_objects().all(), default=get_default_vpma_service)
+        backend_status = ReadOnlyField()
+        is_reflector = serializers.BooleanField(required=False)
+        is_initiator = serializers.BooleanField(required=False)
+        reflector = serializers.CharField(required=False)
+
+        humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
+
+        class Meta:
+            model = VpmaTenant
+            fields = ('humanReadableName', 'id', 'provider_service', 'is_reflector', 'is_initiator', 'reflector', 'backend_status')
+
+        def getHumanReadableName(self, obj):
+            return obj.__unicode__()
+
+class VpmaTenantViewSet(XOSViewSet):
+    base_name = "vpmatenant"
+    method_name = "vpmatenant"
+    method_kind = "viewset"
+    queryset = VpmaTenant.get_tenant_objects().all()
+    serializer_class = VpmaTenantSerializer
+
+    @classmethod
+    def get_urlpatterns(self, api_path="^"):
+        patterns = super(VpmaTenantViewSet, self).get_urlpatterns(api_path=api_path)
+
+        # example to demonstrate adding a custom endpoint
+        patterns.append( self.detail_url("is_initiator/$", {"get": "get_is_initiator", "put": "set_is_initiator"}, "is_initiator") )
+        patterns.append( self.detail_url("is_reflector/$", {"get": "get_is_reflector", "put": "set_is_reflector"}, "is_reflector") )
+        patterns.append( self.detail_url("reflector/$", {"get": "get_reflector", "put": "set_reflector"}, "reflector") )
+
+        return patterns
+
+    def list(self, request):
+        queryset = self.filter_queryset(self.get_queryset())
+        serializer = self.get_serializer(queryset, many=True)
+        return Response(serializer.data)
+
+    def get_is_initiator(self, request, pk=None):
+        vpma_tenant = self.get_object()
+        return Response({"is_initiator": vpma_tenant.is_initiator})
+
+    def set_is_initiator(self, request, pk=None):
+        vpma_tenant = self.get_object()
+        vpma_tenant.is_initiator = request.data["is_initiator"]
+        vpma_tenant.save()
+        return Response({"is_initiator": vpma_tenant.is_initiator})
+
+    def get_is_reflector(self, request, pk=None):
+        vpma_tenant = self.get_object()
+        return Response({"is_reflector": vpma_tenant.is_reflector})
+
+    def set_is_reflector(self, request, pk=None):
+        vpma_tenant = self.get_object()
+        vpma_tenant.is_reflector = request.data["is_reflector"]
+        vpma_tenant.save()
+        return Response({"is_reflector": vpma_tenant.is_reflector})
+
+    def get_reflector(self, request, pk=None):
+        vpma_tenant = self.get_object()
+        return Response({"reflector": vpma_tenant.reflector})
+
+    def set_reflector(self, request, pk=None):
+        vpma_tenant = self.get_object()
+        vpma_tenant.reflector = request.data["reflector"]
+        vpma_tenant.save()
+        return Response({"reflector": vpma_tenant.reflector})
+
+#####################################################################################################################
+
+def get_default_qt600_service():
+    qt600_services = Qt600Service.get_service_objects().all()
+    if qt600_services:
+        return qt600_services[0]
+    return None
+
+class Qt600TenantSerializer(PlusModelSerializer):
+        id = ReadOnlyField()
+        provider_service = serializers.PrimaryKeyRelatedField(queryset=Qt600Service.get_service_objects().all(), default=get_default_qt600_service)
+        backend_status = ReadOnlyField()
+        is_reflector = serializers.BooleanField(required=False)
+        is_initiator = serializers.BooleanField(required=False)
+        reflector = serializers.CharField(required=False)
+
+        humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
+
+        class Meta:
+            model = Qt600Tenant
+            fields = ('humanReadableName', 'id', 'provider_service', 'is_reflector', 'is_initiator', 'reflector', 'backend_status')
+
+        def getHumanReadableName(self, obj):
+            return obj.__unicode__()
+
+class Qt600TenantViewSet(XOSViewSet):
+    base_name = "qt600tenant"
+    method_name = "qt600tenant"
+    method_kind = "viewset"
+    queryset = Qt600Tenant.get_tenant_objects().all()
+    serializer_class = Qt600TenantSerializer
+
+    @classmethod
+    def get_urlpatterns(self, api_path="^"):
+        patterns = super(Qt600TenantViewSet, self).get_urlpatterns(api_path=api_path)
+
+        # example to demonstrate adding a custom endpoint
+        patterns.append( self.detail_url("is_initiator/$", {"get": "get_is_initiator", "put": "set_is_initiator"}, "is_initiator") )
+        patterns.append( self.detail_url("is_reflector/$", {"get": "get_is_reflector", "put": "set_is_reflector"}, "is_reflector") )
+        patterns.append( self.detail_url("reflector/$", {"get": "get_reflector", "put": "set_reflector"}, "reflector") )
+
+        return patterns
+
+    def list(self, request):
+        queryset = self.filter_queryset(self.get_queryset())
+        serializer = self.get_serializer(queryset, many=True)
+        return Response(serializer.data)
+
+    def get_is_initiator(self, request, pk=None):
+        qt600_tenant = self.get_object()
+        return Response({"is_initiator": qt600_tenant.is_initiator})
+
+    def set_is_initiator(self, request, pk=None):
+        qt600_tenant = self.get_object()
+        qt600_tenant.is_initiator = request.data["is_initiator"]
+        qt600_tenant.save()
+        return Response({"is_initiator": qt600_tenant.is_initiator})
+
+    def get_is_reflector(self, request, pk=None):
+        qt600_tenant = self.get_object()
+        return Response({"is_reflector": qt600_tenant.is_reflector})
+
+    def set_is_reflector(self, request, pk=None):
+        qt600_tenant = self.get_object()
+        qt600_tenant.is_reflector = request.data["is_reflector"]
+        qt600_tenant.save()
+        return Response({"is_reflector": qt600_tenant.is_reflector})
+
+    def get_reflector(self, request, pk=None):
+        qt600_tenant = self.get_object()
+        return Response({"reflector": qt600_tenant.reflector})
+
+    def set_reflector(self, request, pk=None):
+        qt600_tenant = self.get_object()
+        qt600_tenant.reflector = request.data["reflector"]
+        qt600_tenant.save()
+        return Response({"reflector": qt600_tenant.reflector})
