diff --git a/xos/models.py b/xos/models.py
index 906d125..32dd4f2 100644
--- a/xos/models.py
+++ b/xos/models.py
@@ -1,5 +1,5 @@
 from django.db import models
-from core.models import Service, XOSBase, Slice, Instance, Tenant, TenantWithContainer, Node, Image, User, Flavor, NetworkParameter, NetworkParameterType, Port, AddressPool
+from core.models import Service, XOSBase, Slice, Instance, ServiceInstance, Node, Image, User, Flavor, NetworkParameter, NetworkParameterType, Port, AddressPool
 from core.models.xosbase import StrippedCharField
 import os
 from django.db import models, transaction
@@ -22,40 +22,39 @@
         proxy = True
 
     def ip_to_mac(self, ip):
-	(a, b, c, d) = ip.split('.')
-	return "02:42:%02x:%02x:%02x:%02x" % (int(a), int(b), int(c), int(d))
+        (a, b, c, d) = ip.split('.')
+        return "02:42:%02x:%02x:%02x:%02x" % (int(a), int(b), int(c), int(d))
 
     def get_gateways(self):
-	gateways = []
+        gateways = []
+        aps = self.addresspools.all()
+        for ap in aps:
+            gateways.append({"gateway_ip": ap.gateway_ip, "gateway_mac": ap.gateway_mac})
 
-	aps = self.addresspools.all()
-	for ap in aps:
-	    gateways.append({"gateway_ip": ap.gateway_ip, "gateway_mac": ap.gateway_mac})
-
-	return gateways
+        return gateways
 
     def get_address_pool(self, name):
-	ap = AddressPool.objects.filter(name=name, service=self)
-	if not ap:
-	    raise Exception("vRouter unable to find addresspool %s" % name)
-	return ap[0]
+        ap = AddressPool.objects.filter(name=name, service=self)
+        if not ap:
+            raise Exception("vRouter unable to find addresspool %s" % name)
+        return ap[0]
 
     def get_tenant(self, **kwargs):
-	address_pool_name = kwargs.pop("address_pool_name")
+        address_pool_name = kwargs.pop("address_pool_name")
 
-	ap = self.get_address_pool(address_pool_name)
+        ap = self.get_address_pool(address_pool_name)
 
-	ip = ap.get_address()
-	if not ip:
-	    raise Exception("AddressPool '%s' has run out of addresses." % ap.name)
+        ip = ap.get_address()
+        if not ip:
+            raise Exception("AddressPool '%s' has run out of addresses." % ap.name)
 
-	t = VRouterTenant(provider_service=self, **kwargs)
-	t.public_ip = ip
-	t.public_mac = self.ip_to_mac(ip)
-	t.address_pool_id = ap.id
-	t.save()
+        t = VRouterTenant(owner=self, **kwargs)
+        t.public_ip = ip
+        t.public_mac = self.ip_to_mac(ip)
+        t.address_pool_id = ap.id
+        t.save()
 
-	return t
+        return t
 
 
 class VRouterDevice (VRouterDevice_decl):
