diff --git a/xos/models.py b/xos/models.py
index 0419fbe..906d125 100644
--- a/xos/models.py
+++ b/xos/models.py
@@ -1,290 +1,141 @@
-from header import *
+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.xosbase import StrippedCharField
+import os
+from django.db import models, transaction
+from django.forms.models import model_to_dict
+from django.db.models import *
+from operator import itemgetter, attrgetter, methodcaller
+from core.models import Tag
+from core.models.service import LeastLoadedNodeScheduler
+import traceback
+from xos.exceptions import *
+from models_decl import *
 
 
+class ConfigurationError(Exception):
+    pass
 
 
+class VRouterService (VRouterService_decl):
+    class Meta:
+        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))
 
+    def get_gateways(self):
+	gateways = []
 
+	aps = self.addresspools.all()
+	for ap in aps:
+	    gateways.append({"gateway_ip": ap.gateway_ip, "gateway_mac": ap.gateway_mac})
 
+	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]
 
+    def get_tenant(self, **kwargs):
+	address_pool_name = kwargs.pop("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)
 
+	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()
 
+	return t
 
 
+class VRouterDevice (VRouterDevice_decl):
 
+    class Meta:
+        proxy = True
+    pass
 
+class VRouterPort (VRouterPort_decl):
 
+    class Meta:
+        proxy = True
+    pass
 
+class VRouterApp (VRouterApp_decl):
 
+    class Meta:
+        proxy = True
+    def _get_interfaces(self):
+        app_interfaces = []
+        devices = VRouterDevice.objects.filter(vrouter_service=self.vrouter_service)
+        for device in devices:
+            ports = VRouterPort.objects.filter(vrouter_device=device.id)
+            for port in ports:
+                interfaces = VRouterInterface.objects.filter(vrouter_port=port.id)
+                for iface in interfaces:
+                    app_interfaces.append(iface.name)
+        return app_interfaces
 
+class VRouterInterface (VRouterInterface_decl):
 
-#from core.models.service import Service
-from core.models import Service
+    class Meta:
+        proxy = True
+    pass
 
+class VRouterIp (VRouterIp_decl):
 
+    class Meta:
+        proxy = True
+    pass
 
-from core.models import AddressPool#from core.models.tenant import Tenant
-from core.models import Tenant
+class VRouterTenant (VRouterTenant_decl):
 
+    class Meta:
+        proxy = True
+    @property
+    def gateway_ip(self):
+        if not self.address_pool:
+            return None
+        return self.address_pool.gateway_ip
 
+    @property
+    def gateway_mac(self):
+        if not self.address_pool:
+            return None
+        return self.address_pool.gateway_mac
 
+    @property
+    def cidr(self):
+        if not self.address_pool:
+            return None
+        return self.address_pool.cidr
 
+    @property
+    def netbits(self):
+        # return number of bits in the network portion of the cidr
+        if self.cidr:
+            parts = self.cidr.split("/")
+            if len(parts) == 2:
+                return int(parts[1].strip())
+        return None
 
-class VRouterApp(XOSBase):
+    def cleanup_addresspool(self):
+        if self.address_pool:
+            ap = self.address_pool
+            if ap:
+                ap.put_address(self.public_ip)
+                self.public_ip = None
 
-  KIND = "vROUTER"
-
-  class Meta:
-      app_label = "vrouter"
-      name = "vrouter"
-      verbose_name = "vRouter Service"
-
-  # Primitive Fields (Not Relations)
-  name = CharField( help_text = "application name", max_length = 50, null = False, db_index = False, blank = False )
-  control_plane_connect_point = CharField( help_text = "port identifier in ONOS", max_length = 21, null = False, db_index = False, blank = False )
-  ospf_enabled = BooleanField( default = True, help_text = "ospf enabled", null = False, db_index = False, blank = True )
-  
-
-  # Relations
-  
-  vrouter_service = ForeignKey(VRouterService, db_index = True, related_name = 'apps', null = False, blank = False )
-
-  def _get_interfaces(self):
-      app_interfaces = []
-      devices = VRouterDevice.objects.filter(vrouter_service=self.vrouter_service)
-      for device in devices:
-          ports = VRouterPort.objects.filter(vrouter_device=device.id)
-          for port in ports:
-              interfaces = VRouterInterface.objects.filter(vrouter_port=port.id)
-              for iface in interfaces:
-                  app_interfaces.append(iface.name)
-      return app_interfaces
-  
-  pass
-
-
-
-
-class VRouterDevice(XOSBase):
-
-  KIND = "vROUTER"
-
-  class Meta:
-      app_label = "vrouter"
-      name = "vrouter"
-      verbose_name = "vRouter Service"
-
-  # Primitive Fields (Not Relations)
-  name = CharField( help_text = "device friendly name", max_length = 20, null = True, db_index = False, blank = True )
-  openflow_id = CharField( help_text = "device identifier in ONOS", max_length = 20, null = False, db_index = False, blank = False )
-  config_key = CharField( default = "basic", max_length = 32, blank = False, help_text = "configuration key", null = False, db_index = False )
-  driver = CharField( help_text = "driver type", max_length = 32, null = False, db_index = False, blank = False )
-  
-
-  # Relations
-  
-  vrouter_service = ForeignKey(VRouterService, db_index = True, related_name = 'devices', null = False, blank = False )
-
-  
-  pass
-
-
-
-
-class VRouterInterface(XOSBase):
-
-  KIND = "vROUTER"
-
-  class Meta:
-      app_label = "vrouter"
-      name = "vrouter"
-      verbose_name = "vRouter Service"
-
-  # Primitive Fields (Not Relations)
-  name = CharField( help_text = "interface name", max_length = 10, null = False, db_index = False, blank = False )
-  mac = CharField( help_text = "interface mac", max_length = 17, null = False, db_index = False, blank = False )
-  vlan = CharField( help_text = "interface vlan id", max_length = 10, null = True, db_index = False, blank = True )
-  
-
-  # Relations
-  
-  vrouter_port = ForeignKey(VRouterPort, db_index = True, related_name = 'interfaces', null = False, blank = False )
-
-  
-  pass
-
-
-
-
-class VRouterIp(XOSBase):
-
-  KIND = "vROUTER"
-
-  class Meta:
-      app_label = "vrouter"
-      name = "vrouter"
-      verbose_name = "vRouter Service"
-
-  # Primitive Fields (Not Relations)
-  name = CharField( help_text = "ip friendly name", max_length = 20, null = True, db_index = False, blank = True )
-  ip = CharField( help_text = "interface ips", max_length = 19, null = False, db_index = False, blank = False )
-  
-
-  # Relations
-  
-  vrouter_interface = ForeignKey(VRouterInterface, db_index = True, related_name = 'ips', null = False, blank = False )
-
-  
-  pass
-
-
-
-
-class VRouterPort(XOSBase):
-
-  KIND = "vROUTER"
-
-  class Meta:
-      app_label = "vrouter"
-      name = "vrouter"
-      verbose_name = "vRouter Service"
-
-  # Primitive Fields (Not Relations)
-  name = CharField( help_text = "port friendly name", max_length = 20, null = True, db_index = False, blank = True )
-  openflow_id = CharField( help_text = "port identifier in ONOS", max_length = 21, null = False, db_index = False, blank = False )
-  
-
-  # Relations
-  
-  vrouter_device = ForeignKey(VRouterDevice, db_index = True, related_name = 'ports', null = False, blank = False )
-  vrouter_service = ForeignKey(VRouterService, db_index = True, related_name = 'device_ports', null = False, blank = False )
-
-  
-  pass
-
-
-
-
-class VRouterService(Service):
-
-  KIND = "vROUTER"
-
-  class Meta:
-      app_label = "vrouter"
-      name = "vrouter"
-      verbose_name = "vRouter Service"
-
-  # Primitive Fields (Not Relations)
-  rest_hostname = StrippedCharField( db_index = False, max_length = 255, null = True, blank = True )
-  rest_port = IntegerField( default = 8181, null = False, blank = False, db_index = False )
-  rest_user = StrippedCharField( default = "onos", max_length = 255, null = False, db_index = False, blank = False )
-  rest_pass = StrippedCharField( default = "rocks", max_length = 255, null = False, db_index = False, blank = False )
-  
-
-  # Relations
-  
-
-  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))
-  
-  def get_gateways(self):
-      gateways = []
-  
-      aps = self.addresspools.all()
-      for ap in aps:
-          gateways.append({"gateway_ip": ap.gateway_ip, "gateway_mac": ap.gateway_mac})
-  
-      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]
-  
-  def get_tenant(self, **kwargs):
-      address_pool_name = kwargs.pop("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)
-  
-      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()
-  
-      return t
-  
-  pass
-
-
-
-
-class VRouterTenant(Tenant):
-
-  KIND = "vROUTER"
-
-  class Meta:
-      app_label = "vrouter"
-      name = "vrouter"
-      verbose_name = "vRouter Service"
-
-  # Primitive Fields (Not Relations)
-  public_ip = StrippedCharField( db_index = False, max_length = 30, null = True, blank = True )
-  public_mac = StrippedCharField( db_index = False, max_length = 30, null = True, blank = True )
-  
-
-  # Relations
-  
-  address_pool = ForeignKey(AddressPool, db_index = True, related_name = 'vrouter_tenants', null = True, blank = True )
-
-  @property
-  def gateway_ip(self):
-      if not self.address_pool:
-          return None
-      return self.address_pool.gateway_ip
-  
-  @property
-  def gateway_mac(self):
-      if not self.address_pool:
-          return None
-      return self.address_pool.gateway_mac
-  
-  @property
-  def cidr(self):
-      if not self.address_pool:
-          return None
-      return self.address_pool.cidr
-  
-  @property
-  def netbits(self):
-      # return number of bits in the network portion of the cidr
-      if self.cidr:
-          parts = self.cidr.split("/")
-          if len(parts) == 2:
-              return int(parts[1].strip())
-      return None
-  
-  def cleanup_addresspool(self):
-      if self.address_pool:
-          ap = self.address_pool
-          if ap:
-              ap[0].put_address(self.public_ip)
-              self.public_ip = None
-  
-  def delete(self, *args, **kwargs):
-      self.cleanup_addresspool()
-      super(VRouterTenant, self).delete(*args, **kwargs)
-  
-  pass
-
+    def delete(self, *args, **kwargs):
+        self.cleanup_addresspool()
+        super(VRouterTenant, self).delete(*args, **kwargs)
 
