diff --git a/xos/models.py b/xos/models.py
index 98faaad..09ef583 100644
--- a/xos/models.py
+++ b/xos/models.py
@@ -1,200 +1,290 @@
-from django.db import models
-from core.models import Service, PlCoreBase, Slice, Instance, Tenant, TenantWithContainer, Node, Image, User, Flavor, NetworkParameter, NetworkParameterType, Port, AddressPool
-from core.models.plcorebase import StrippedCharField
-import os
-from django.db import models, transaction
-from django.forms.models import model_to_dict
-from django.db.models import Q
-from operator import itemgetter, attrgetter, methodcaller
-from core.models import Tag
-from core.models.service import LeastLoadedNodeScheduler
-import traceback
-from xos.exceptions import *
-from xos.config import Config
+from header import *
 
 
-class ConfigurationError(Exception):
-    pass
 
 
-VROUTER_KIND = "vROUTER"
-APP_LABEL = "vrouter"
-
-# NOTE: don't change VROUTER_KIND unless you also change the reference to it
-#   in tosca/resources/network.py
-
-CORD_USE_VTN = getattr(Config(), "networking_use_vtn", False)
 
 
-class VRouterService(Service):
-    KIND = VROUTER_KIND
-
-    class Meta:
-        app_label = APP_LABEL
-        verbose_name = "vRouter Service"
-
-    # Are rest_hostname and rest_port redundant with ONOS service?
-    # Should ONOSService be augmented with rest_user and rest_pass?
-
-    rest_hostname = StrippedCharField(max_length=255, null=True, blank=True)
-    rest_port = models.IntegerField(default=8181)
-    rest_user = StrippedCharField(max_length=255, default="onos")
-    rest_pass = StrippedCharField(max_length=255, default="rocks")
-
-    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 VRouterTenant(Tenant):
-    class Meta:
-        verbose_name = "vRouter Tenant"
-
-    KIND = VROUTER_KIND
-
-    public_ip = StrippedCharField(max_length = 30, null=True, blank=True)
-    public_mac = StrippedCharField(max_length = 30, null=True, blank=True)
-    address_pool = models.ForeignKey(AddressPool, related_name='vrouter_tenants', blank=True, null=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)
 
 
-# DEVICES
+
+
+
+
+
+
+
+
+
+
+
+
+
+#from core.models.service import Service
+from core.models import Service
+
+
+
+from core.models import AddressPool#from core.models.tenant import Tenant
+from core.models import Tenant
+
+
+
+
+
+class VRouterApp(PlCoreBase):
+
+  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(PlCoreBase):
-    """define the information related to an device used by vRouter"""
-    class Meta:
-        app_label = APP_LABEL
-        verbose_name = "vRouter Device"
 
-    name = models.CharField(max_length=20, help_text="device friendly name", null=True, blank=True)
-    openflow_id = models.CharField(max_length=20, help_text="device identifier in ONOS", null=False, blank=False)
-    config_key = models.CharField(max_length=32, help_text="configuration key", null=False, blank=False, default="basic")
-    driver = models.CharField(max_length=32, help_text="driver type", null=False, blank=False)
-    vrouter_service = models.ForeignKey(VRouterService, related_name='devices')
+  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
 
 
-# PORTS
-class VRouterPort(PlCoreBase):
-    class Meta:
-        app_label = APP_LABEL
-        verbose_name = "vRouter Port"
-
-    name = models.CharField(max_length=20, help_text="port friendly name", null=True, blank=True)
-    openflow_id = models.CharField(max_length=21, help_text="port identifier in ONOS", null=False, blank=False)
-    vrouter_device = models.ForeignKey(VRouterDevice, related_name='ports')
-    # NOTE probably is not meaningful to relate a port to a service
-    vrouter_service = models.ForeignKey(VRouterService, related_name='device_ports')
 
 
 class VRouterInterface(PlCoreBase):
-    class Meta:
-        app_label = APP_LABEL
-        verbose_name = "vRouter Interface"
 
-    name = models.CharField(max_length=20, help_text="interface friendly name", null=True, blank=True)
-    vrouter_port = models.ForeignKey(VRouterPort, related_name='interfaces')
-    name = models.CharField(max_length=10, help_text="interface name", null=False, blank=False)
-    mac = models.CharField(max_length=17, help_text="interface mac", null=False, blank=False)
-    vlan = models.CharField(max_length=10, help_text="interface vlan id", null=True, blank=True)
+  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(PlCoreBase):
-    class Meta:
-        app_label = APP_LABEL
-        verbose_name = "vRouter Ip"
 
-    name = models.CharField(max_length=20, help_text="ip friendly name", null=True, blank=True)
-    vrouter_interface = models.ForeignKey(VRouterInterface, related_name='ips')
-    ip = models.CharField(max_length=19, help_text="interface ips", null=False, blank=False)
+  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
 
 
-# APPS
-class VRouterApp(PlCoreBase):
-    class Meta:
-        app_label = "vrouter"
-        verbose_name = "vRouter App"
 
-    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
 
-    vrouter_service = models.ForeignKey(VRouterService, related_name='apps')
-    name = models.CharField(max_length=50, help_text="application name", null=False, blank=False)
-    control_plane_connect_point = models.CharField(max_length=21, help_text="port identifier in ONOS", null=False, blank=False)
-    ospf_enabled = models.BooleanField(default=True, help_text="ospf enabled")
-    interfaces = property(_get_interfaces)
+class VRouterPort(PlCoreBase):
+
+  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
+
+
