diff --git a/xos/models.py b/xos/models.py
index a67b509..d4d9485 100644
--- a/xos/models.py
+++ b/xos/models.py
@@ -12,19 +12,19 @@
 from operator import itemgetter, attrgetter, methodcaller
 from core.models import Tag
 from core.models.service import LeastLoadedNodeScheduler
-from services.vsgwc.models import VSGWCService, VSGWCTenant
-from services.vpgwc.models import VPGWCService, VPGWCTenant
-from services.vhss.models import VHSSService, VHSSTenant
 import traceback
 from xos.exceptions import *
 from xos.config import Config
-from django.contrib.contenttypes.models import ContentType
-from django.contrib.contenttypes.fields import GenericForeignKey
 
 class VMMEService(VMMEService_decl):
    class Meta:
         proxy = True 
 
+   def create_tenant(self, **kwargs):
+       t = VMMETenant(kind="vEPC", provider_service=self, connect_method="na", **kwargs)
+       t.save()
+       return t
+
 class VMMETenant(VMMETenant_decl):
    class Meta:
         proxy = True 
@@ -34,140 +34,15 @@
        if vmmeservices:
            self._meta.get_field("provider_service").default = vmmeservices[0].id
        super(VMMETenant, self).__init__(*args, **kwargs)
-       self.cached_vsgwc = None
-       self.cached_vpgwc = None
-       self.cached_vhss = None
-
-   @property
-   def vsgwc(self):
-       vsgwc = self.get_newest_subscribed_tenant(VSGWCTenant)
-       if not vsgwc:
-           return None
-
-       if (self.cached_vsgwc) and (self.cached_vsgwc.id == vsgwc.id):
-            return self.cached_vsgwc
-
-       vsgwc.caller = self.creator
-       self.cached_vsgwc = vsgwc
-       return vsgwc      
-
-   @vsgwc.setter
-   def vsgwc(self, value):
-       raise XOSConfigurationError("VMMETenant.vsgwc setter is not implemeneted")
-
-   @property
-   def vpgwc(self):
-       vpgwc = self.get_newest_subscribed_tenant(VPGWCTenant)
-       if not vpgwc:
-           return None
-
-       if (self.cached_vpgwc) and (self.cached_vpgwc.id == vpgwc.id):
-            return self.cached_vpgwc
-
-       vpgwc.caller = self.creator
-       self.cached_vpgwc = vpgwc
-       return vpgwc      
-
-   @vpgwc.setter
-   def vpgwc(self, value):
-       raise XOSConfigurationError("VMMETenant.vpgwc setter is not implemeneted")
-
-   @property
-   def vhss(self):
-       vhss = self.get_newest_subscribed_tenant(VHSSTenant)
-       if not vhss:
-           return None
-
-       if (self.cached_vhss) and (self.cached_vhss.id == vhss.id):
-            return self.cached_vhss
-
-       vhss.caller = self.creator
-       self.cached_vhss = vhss
-       return vhss      
-
-   @vhss.setter
-   def vhss(self, value):
-       raise XOSConfigurationError("VMMETenant.vhss setter is not implemeneted")
-
-   # This model breaks down if there are multiple service objects
-   def get_vsgwc_service(self):
-       vsgwcservices = VSGWCService.get_service_objects().all()
-       if not vsgwcservices:
-           raise XOSConfigurationError("No VSGWC Services available")
-       return vsgwcservices[0]
-
-   def get_vpgwc_service(self):
-       vpgwcservices = VPGWCService.get_service_objects().all()
-       if not vpgwcservices:
-           raise XOSConfigurationError("No VPGWC Services available")
-       return vpgwcservices[0]
-
-   def get_vhss_service(self):
-       vhssservices = VHSSService.get_service_objects().all()
-       if not vhssservices:
-           raise XOSConfigurationError("No VHSS Services available")
-       return vhssservices[0]
-
-   def manage_vsgwc(self):
-       # Each vMME object owns exactly one VSGWCTenant object
-       if self.deleted:
-           return
-
-       if self.vsgwc is None:
-           vsgwc = self.get_vsgwc_service().create_tenant(subscriber_tenant=self, creator=self.creator)
-
-   def manage_vpgwc(self):
-       # Each vMME object owns exactly one VPGWCTenant object
-       if self.deleted:
-           return
-
-       if self.vpgwc is None:
-           vpgwc = self.get_vpgwc_service().create_tenant(subscriber_tenant=self, creator=self.creator)
-
-   def manage_vhss(self):
-       # Each vMME object owns exactly one VHSSTenant object
-       if self.deleted:
-           return
-
-       if self.vhss is None:
-           vhss = self.get_vhss_service().create_tenant(subscriber_tenant=self, creator=self.creator)
-
-   def cleanup_vsgwc(self):
-       if self.vsgwc:
-           self.vsgwc.delete()
-
-   def cleanup_vpgwc(self):
-       if self.vpgwc:
-           self.vpgwc.delete()
-
-   def cleanup_vhss(self):
-       if self.vhss:
-           self.vhss.delete()
-  
-   def cleanup_orphans(self):
-       # ensure vMME only has one vSGWC, vPGWC, and vHSS
-       cur_vsgwc = self.vsgwc
-       cur_vpgwc = self.vpgwc
-       cur_vhss = self.vhss
-
-       for vsgwc in list(self.get_subscribed_tenants(VSGWCTenant)):
-           if (not cur_vsgwc) or (vsgwc.id != cur_vsgwc.id):
-              vsgwc.delete()
-
-       for vpgwc in list(self.get_subscribed_tenants(VPGWCTenant)):
-           if (not cur_vpgwc) or (vpgwc.id != cur_vpgwc.id):
-              vpgwc.delete()
-
-       for vhss in list(self.get_subscribed_tenants(VHSSTenant)):
-           if (not cur_vhss) or (vhss.id != cur_vhss.id):
-              vhss.delete()
-
-       if self.orig_instance_id and (self.orig_instance_id != self.get_attribute("instance_id")):
-           instances = Instance.objects.filter(id=self.orig_instance.id)
-           if instances:
-               instances[0].delete()
 
    def save(self, *args, **kwargs):
+       if not self.creator:
+           if not getattr(self, "caller", None):
+               raise XOSProgrammingError("VMMETenant's self.caller was not set")
+           self.creator = self.caller
+           if not self.creator:
+               raise XOSProgrammingError("VMMETenant's self.creator was not set")
+
        super(VMMETenant, self).save(*args, **kwargs)
        # This call needs to happen so that an instance is created for this
        # tenant is created in the slice. One instance is created per tenant.
@@ -175,9 +50,6 @@
 
    def delete(self, *args, **kwargs):
        # Delete the instance that was created for this tenant
-       self.cleanup_vsgwc()
-       self.cleanup_vpgwc()
-       self.cleanup_vhss()
        self.cleanup_container()
        super(VMMETenant, self).delete(*args, **kwargs)
 
@@ -191,7 +63,4 @@
         # Since this code is atomic it is safe to always use the first tenant
         tenant = tenant[0]
         tenant.manage_container()
-        tenant.manage_vsgwc()
-        tenant.manage_vpgwc()
-        tenant.manage_vhss()
-        tenant.cleanup_orphans()
+
