diff --git a/xos/models.py b/xos/models.py
index 48a9911..fac349b 100644
--- a/xos/models.py
+++ b/xos/models.py
@@ -1,6 +1,6 @@
 from core.models.plcorebase import *
-from models_decl import VSGWService_decl
-from models_decl import VSGWTenant_decl
+from models_decl import VSGWCService_decl
+from models_decl import VSGWCTenant_decl
 
 from django.db import models
 from core.models import Service, PlCoreBase, Slice, Instance, Tenant, TenantWithContainer, Node, Image, User, Flavor, NetworkParameter, NetworkParameterType, Port, AddressPool
@@ -18,49 +18,49 @@
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.contenttypes.fields import GenericForeignKey
 
-class VSGWService(VSGWService_decl):
+class VSGWCService(VSGWCService_decl):
    class Meta:
         proxy = True 
 
-   def create_tenant(self, **kwargs):
-       t = VSGWTenant(kind="vEPC", provider_service=self, connect_method="na", tenant_message="vsgw tenant in service chain", **kwargs)
+   def VSGWC_tenant(self, **kwargs):
+       t = VSGWCTenant(kind="vEPC", provider_service=self, connect_method="na", tenant_message="vsgwc tenant in service chain", **kwargs)
        t.save()
        return t
 
-class VSGWTenant(VSGWTenant_decl):
+class VSGWCTenant(VSGWCTenant_decl):
    class Meta:
         proxy = True 
         
    def __init__(self, *args, **kwargs):
-       vsgwservice = VSGWService.get_service_objects().all()
-       if vsgwservice:
+       vsgwcservice = VSGWCService.get_service_objects().all()
+       if vsgwcservice:
            self._meta.get_field(
-                   "provider_service").default = vsgwservice[0].id
-       super(VSGWTenant, self).__init__(*args, **kwargs)
+                   "provider_service").default = vsgwcservice[0].id
+       super(VSGWCTenant, self).__init__(*args, **kwargs)
 
    def save(self, *args, **kwargs):
        if not self.creator:
            if not getattr(self, "caller", None):
-               raise XOSProgrammingError("VSGWTenant's self.caller was not set")
+               raise XOSProgrammingError("VSGWCTenant's self.caller was not set")
            self.creator = self.caller
            if not self.creator:
-               raise XOSProgrammingError("VSGWTenant's self.creator was not set")
+               raise XOSProgrammingError("VSGWCTenant's self.creator was not set")
 
-       super(VSGWTenant, self).save(*args, **kwargs)
+       super(VSGWCTenant, 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.
-       model_policy_vsgwtenant(self.pk)
+       model_policy_vsgwctenant(self.pk)
 
    def delete(self, *args, **kwargs):
        # Delete the instance that was created for this tenant
        self.cleanup_container()
-       super(VSGWTenant, self).delete(*args, **kwargs)
+       super(VSGWCTenant, self).delete(*args, **kwargs)
 
-def model_policy_vsgwtenant(pk):
+def model_policy_vsgwctenant(pk):
     # This section of code is atomic to prevent race conditions
     with transaction.atomic():
         # We find all of the tenants that are waiting to update
-        tenant = VSGWTenant.objects.select_for_update().filter(pk=pk)
+        tenant = VSGWCTenant.objects.select_for_update().filter(pk=pk)
         if not tenant:
             return
         # Since this code is atomic it is safe to always use the first tenant
