diff --git a/xos/core/admin.py b/xos/core/admin.py
index 428aceb..bac92de 100644
--- a/xos/core/admin.py
+++ b/xos/core/admin.py
@@ -301,34 +301,34 @@
     class SafeDeleteQuerysetWrapper(object):
         def __init__(self, wrapped_queryset):
             self.wrapped_queryset = wrapped_queryset
-
-        def _safe_delete(self):
-            for obj in list(self.wrapped_queryset):
-                obj.delete()
-
-        def __getattr__(self, attr):
-            if attr == 'delete':
-                return self._safe_delete
-            else:
-                return getattr(self.wrapped_queryset, attr)
-
-        def __iter__(self):
-            for obj in list(self.wrapped_queryset):
-                yield obj
-
-        def __getitem__(self, index):
-            return self.wrapped_queryset[index]
-
-        def __len__(self):
-            return len(self.wrapped_queryset)
-
-    def get_actions(self, request):
-        actions = super(XOSAdminMixin, self).get_actions(request)
-        actions['delete_selected'] = (XOSAdminMixin.action_safe_bulk_delete, 'delete_selected', ugettext_lazy("Delete selected %(verbose_name_plural)s"))
-        return actions
-
-    def action_safe_bulk_delete(self, request, queryset):
-        wrapped_queryset = XOSAdminMixin.SafeDeleteQuerysetWrapper(queryset)
+
+        def _safe_delete(self):
+            for obj in list(self.wrapped_queryset):
+                obj.delete()
+
+        def __getattr__(self, attr):
+            if attr == 'delete':
+                return self._safe_delete
+            else:
+                return getattr(self.wrapped_queryset, attr)
+
+        def __iter__(self):
+            for obj in list(self.wrapped_queryset):
+                yield obj
+
+        def __getitem__(self, index):
+            return self.wrapped_queryset[index]
+
+        def __len__(self):
+            return len(self.wrapped_queryset)
+
+    def get_actions(self, request):
+        actions = super(XOSAdminMixin, self).get_actions(request)
+        actions['delete_selected'] = (XOSAdminMixin.action_safe_bulk_delete, 'delete_selected', ugettext_lazy("Delete selected %(verbose_name_plural)s"))
+        return actions
+
+    def action_safe_bulk_delete(self, request, queryset):
+        wrapped_queryset = XOSAdminMixin.SafeDeleteQuerysetWrapper(queryset)
         return delete_selected(self, request, wrapped_queryset)
 
 
@@ -494,8 +494,8 @@
 
     def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
         if db_field.name == 'deployment':
-            kwargs['queryset'] = Deployment.select_by_acl(request.user).filter(
-                sitedeployments__nodes__isnull=False).distinct()
+#            kwargs['queryset'] = Deployment.select_by_acl(request.user).filter(
+#                sitedeployments__nodes__isnull=False).distinct()
             kwargs['widget'] = forms.Select(
                 attrs={'onChange': "instance_deployment_changed(this);"})
         if db_field.name == 'flavor':
@@ -523,8 +523,8 @@
     def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
         if db_field.name == 'deployment':
 
-            kwargs['queryset'] = Deployment.select_by_acl(request.user).filter(
-                sitedeployments__nodes__isnull=False).distinct()
+#            kwargs['queryset'] = Deployment.select_by_acl(request.user).filter(
+#                sitedeployments__nodes__isnull=False).distinct()
             kwargs['widget'] = forms.Select(
                 attrs={'onChange': "instance_deployment_changed(this);"})
         if db_field.name == 'flavor':
@@ -1460,10 +1460,6 @@
 
     class Meta:
         model = Node
-        widgets = {
-            'site': LinkedSelect,
-            'deployment': LinkedSelect
-        }
         fields = '__all__'
 
     def __init__(self, *args, **kwargs):
@@ -1508,16 +1504,6 @@
     suit_form_tabs = (('details', 'Node Details'), ('instances',
                                                     'Instances'), ('labels', 'Labels'))
 
-    def formfield_for_foreignkey(self, db_field, request, **kwargs):
-        if db_field.name == 'site':
-            kwargs['queryset'] = Site.select_by_user(
-                request.user).filter(hosts_nodes=True)
-
-        field = super(NodeAdmin, self).formfield_for_foreignkey(
-            db_field, request, **kwargs)
-
-        return field
-
 
 class InstanceForm(forms.ModelForm):
 
@@ -1639,8 +1625,8 @@
 
     def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
         if db_field.name == 'deployment':
-            kwargs['queryset'] = Deployment.select_by_acl(request.user).filter(
-                sitedeployments__nodes__isnull=False).distinct()
+#            kwargs['queryset'] = Deployment.select_by_acl(request.user).filter(
+#                sitedeployments__nodes__isnull=False).distinct()
             kwargs['widget'] = forms.Select(
                 attrs={'onChange': "instance_deployment_changed(this);"})
         if db_field.name == 'flavor':
diff --git a/xos/core/models/attic/controller_model.py b/xos/core/models/attic/controller_model.py
index 78a6896..1e07807 100644
--- a/xos/core/models/attic/controller_model.py
+++ b/xos/core/models/attic/controller_model.py
@@ -1,14 +1,3 @@
-def __init__(self, *args, **kwargs):
-    super(Controller, self).__init__(*args, **kwargs)
-    self.no_sync=True
-
-@property
-def auth_url_v3(self):
-    if self.auth_url and self.auth_url[-1] == '/':
-        return '{}/v3/'.format('/'.join(self.auth_url.split('/')[:-2]))
-    else:
-        return '{}/v3/'.format('/'.join(self.auth_url.split('/')[:-1]))
-
 @staticmethod
 def select_by_user(user):
 
diff --git a/xos/core/models/attic/deployment_model.py b/xos/core/models/attic/deployment_model.py
index 78f6e4e..d9da903 100644
--- a/xos/core/models/attic/deployment_model.py
+++ b/xos/core/models/attic/deployment_model.py
@@ -1,7 +1,3 @@
-def __init__(self, *args, **kwargs):
-    super(Deployment, self).__init__(*args, **kwargs)
-    self.no_sync=True
-
 def get_acl(self):
     return AccessControlList(self.accessControl)
 
diff --git a/xos/core/models/attic/diag_model.py b/xos/core/models/attic/diag_model.py
deleted file mode 100644
index bf6bd68..0000000
--- a/xos/core/models/attic/diag_model.py
+++ /dev/null
@@ -1,7 +0,0 @@
-@property
-def enacted(self):
-    return None
-
-@enacted.setter
-def enacted(self, value):
-    pass # Ignore sets, Diag objects are always pending.
diff --git a/xos/core/models/attic/flavor_model.py b/xos/core/models/attic/flavor_model.py
deleted file mode 100644
index 56e0e52..0000000
--- a/xos/core/models/attic/flavor_model.py
+++ /dev/null
@@ -1,8 +0,0 @@
-class Meta:
-    app_label = "core"
-    ordering = ('order', 'name')
-
-def __init__(self, *args, **kwargs):
-    super(Flavor, self).__init__(*args, **kwargs)
-    self.no_sync=True
-
diff --git a/xos/core/models/attic/header.py b/xos/core/models/attic/header.py
index 300f57f..122b6a0 100644
--- a/xos/core/models/attic/header.py
+++ b/xos/core/models/attic/header.py
@@ -21,10 +21,6 @@
 
 config = Config()
 
-# If true, then IP addresses will be allocated by the model. If false, then
-# we will assume the observer handles it.
-NO_OBSERVER=False
-
 def ParseNatList(ports):
     """ Support a list of ports in the format "protocol:port, protocol:port, ..."
         examples:
@@ -76,24 +72,3 @@
     except Exception,e:
         raise ValidationError(str(e))
 
-
-
-def get_default_flavor(controller = None):
-    # Find a default flavor that can be used for a instance. This is particularly
-    # useful in evolution. It's also intended this helper function can be used
-    # for admin.py when users
-
-    if controller:
-        flavors = controller.flavors.all()
-    else:
-        from core.models.flavor import Flavor
-        flavors = Flavor.objects.all()
-
-    if not flavors:
-        return None
-
-    for flavor in flavors:
-        if flavor.default:
-            return flavor
-
-    return flavors[0]
diff --git a/xos/core/models/attic/instance_bottom.py b/xos/core/models/attic/instance_bottom.py
deleted file mode 100644
index 7b87eab..0000000
--- a/xos/core/models/attic/instance_bottom.py
+++ /dev/null
@@ -1,7 +0,0 @@
-def controller_setter(instance, **kwargs):
-    try:
-        instance.controller = instance.node.site_deployment.controller
-    except:
-        instance.controller = None
-
-models.signals.post_init.connect(controller_setter, Instance)
diff --git a/xos/core/models/attic/network_model.py b/xos/core/models/attic/network_model.py
index 20180a2..c58639a 100644
--- a/xos/core/models/attic/network_model.py
+++ b/xos/core/models/attic/network_model.py
@@ -1,13 +1,6 @@
-def save(self, *args, **kwds):
-    super(Network, self).save(*args, **kwds)
-
 def can_update(self, user):
     return user.can_update_slice(self.owner)
 
-@property
-def nat_list(self):
-    return ParseNatList(self.ports)
-
 @staticmethod
 def select_by_user(user):
     if user.is_admin:
@@ -18,11 +11,4 @@
         qs = Network.objects.filter(owner__in=slices)
     return qs
 
-def get_parameters(self):
-    # returns parameters from the template, updated by self.
-    p={}
-    if self.template:
-        p = self.template.get_parameters()
-    p.update(ParameterMixin.get_parameters(self))
-    return p
 
diff --git a/xos/core/models/attic/network_top.py b/xos/core/models/attic/network_top.py
deleted file mode 100644
index 47ae705..0000000
--- a/xos/core/models/attic/network_top.py
+++ /dev/null
@@ -1,34 +0,0 @@
-
-from core.models.networkparameter import NetworkParameter
-
-class ParameterMixin(object):
-    # helper classes for dealing with NetworkParameter
-
-    def get_parameters(self):
-        parameter_dict = {}
-
-        instance_type = ContentType.objects.get_for_model(self)
-        for param in NetworkParameter.objects.filter(content_type__pk=instance_type.id, object_id=self.id):
-            parameter_dict[param.parameter.name] = param.value
-
-        return parameter_dict
-
-    def set_parameter(self, name, value):
-        instance_type = ContentType.objects.get_for_model(self)
-        existing_params = NetworkParameter.objects.filter(parameter__name=name, content_type__pk=instance_type.id, object_id=self.id)
-        if existing_params:
-            p=existing_params[0]
-            p.value = value
-            p.save()
-        else:
-            from core.models.networkparametertype import NetworkParameterType
-            pt = NetworkParameterType.objects.get(name=name)
-            p = NetworkParameter(parameter=pt, content_type=instance_type, object_id=self.id, value=value)
-            p.save()
-
-    def unset_parameter(self, name):
-        instance_type = ContentType.objects.get_for_model(self)
-        existing_params = NetworkParameter.objects.filter(parameter__name=name, content_type__pk=instance_type.id, object_id=self.id)
-        for p in existing_params:
-            p.delete()
-
diff --git a/xos/core/models/attic/node_model.py b/xos/core/models/attic/node_model.py
index 98c5ed4..763f480 100644
--- a/xos/core/models/attic/node_model.py
+++ b/xos/core/models/attic/node_model.py
@@ -1,12 +1,3 @@
-def __init__(self, *args, **kwargs):
-    super(Node, self).__init__(*args, **kwargs)
-    self.no_sync=True
-
 def can_update(self, user):
-    return user.can_update_site(self.site, allow=['tech'])
+    return user.can_update_site(self.site_deployment.site, allow=['tech'])
 
-def save(self, *args, **kwds):
-    if self.site is None and self.site_deployment is not None:
-        self.site = self.site_deployment.site
-
-    super(Node, self).save(*args, **kwds)
diff --git a/xos/core/models/attic/port_model.py b/xos/core/models/attic/port_model.py
index 507e923..00f59ad 100644
--- a/xos/core/models/attic/port_model.py
+++ b/xos/core/models/attic/port_model.py
@@ -32,11 +32,3 @@
         qs = Port.objects.filter(Q(instance__in=instance_ids) | Q(network__in=network_ids))
     return qs
 
-def get_parameters(self):
-    # returns parameters from the network, updated by self.
-    p={}
-    if self.network:
-        p = self.network.get_parameters()
-    p.update(ParameterMixin.get_parameters(self))
-    return p
-
diff --git a/xos/core/models/attic/port_top.py b/xos/core/models/attic/port_top.py
deleted file mode 100644
index 5fa8ca9..0000000
--- a/xos/core/models/attic/port_top.py
+++ /dev/null
@@ -1,34 +0,0 @@
-
-from core.models.networkparameter import NetworkParameter
-from core.models.networkparametertype import NetworkParameterType
-
-class ParameterMixin(object):
-    # helper classes for dealing with NetworkParameter
-
-    def get_parameters(self):
-        parameter_dict = {}
-
-        instance_type = self.get_content_type_key()
-        for param in NetworkParameter.objects.filter(content_type=instance_type, object_id=self.id):
-            parameter_dict[param.parameter.name] = param.value
-
-        return parameter_dict
-
-    def set_parameter(self, name, value):
-        instance_type = self.get_content_type_key()
-        existing_params = NetworkParameter.objects.filter(parameter__name=name, content_type=instance_type, object_id=self.id)
-        if existing_params:
-            p=existing_params[0]
-            p.value = value
-            p.save()
-        else:
-            pt = NetworkParameterType.objects.get(name=name)
-            p = NetworkParameter(parameter=pt, content_type=instance_type, object_id=self.id, value=value)
-            p.save()
-
-    def unset_parameter(self, name):
-        instance_type = self.get_content_type_key()
-        existing_params = NetworkParameter.objects.filter(parameter__name=name, content_type=instance_type, object_id=self.id)
-        for p in existing_params:
-            p.delete()
-
diff --git a/xos/core/models/attic/service_model.py b/xos/core/models/attic/service_model.py
index 5959f86..d7175b6 100644
--- a/xos/core/models/attic/service_model.py
+++ b/xos/core/models/attic/service_model.py
@@ -6,18 +6,6 @@
     super(Service, self).__init__(*args, **kwargs)
 
 @classmethod
-def get_service_objects(cls):
-    return cls.objects.filter(kind=cls.KIND)
-
-@classmethod
-def get_deleted_service_objects(cls):
-    return cls.deleted_objects.filter(kind=cls.KIND)
-
-@classmethod
-def get_service_objects_by_user(cls, user):
-    return cls.select_by_user(user).filter(kind=cls.KIND)
-
-@classmethod
 def select_by_user(cls, user):
     if user.is_admin:
         return cls.objects.all()
diff --git a/xos/core/models/attic/serviceprivilege_model.py b/xos/core/models/attic/serviceprivilege_model.py
index a5bb038..294fd90 100644
--- a/xos/core/models/attic/serviceprivilege_model.py
+++ b/xos/core/models/attic/serviceprivilege_model.py
@@ -1,21 +1,6 @@
 class Meta:
     unique_together = ('user', 'service', 'role')
 
-def can_update(self, user):
-    if not self.service.enabled:
-        raise PermissionDenied, "Cannot modify permission(s) of a disabled service"
-    return self.service.can_update(user)
-
-def save(self, *args, **kwds):
-    if not self.service.enabled:
-        raise PermissionDenied, "Cannot modify permission(s) of a disabled service"
-    super(ServicePrivilege, self).save(*args, **kwds)
-
-def delete(self, *args, **kwds):
-    if not self.service.enabled:
-        raise PermissionDenied, "Cannot modify permission(s) of a disabled service"
-    super(ServicePrivilege, self).delete(*args, **kwds)
-
 @classmethod
 def select_by_user(cls, user):
     if user.is_admin:
diff --git a/xos/core/models/attic/siteprivilege_model.py b/xos/core/models/attic/siteprivilege_model.py
index 6130d6a..0a05b5f 100644
--- a/xos/core/models/attic/siteprivilege_model.py
+++ b/xos/core/models/attic/siteprivilege_model.py
@@ -10,7 +10,3 @@
         qs = SitePrivilege.objects.filter(id__in=sp_ids)
     return qs
 
-def save(self, *args, **kwds):
-    if not self.user.is_active:
-        raise PermissionDenied, "Cannot modify role(s) of a disabled user"
-    super(SitePrivilege, self).save(*args, **kwds)
diff --git a/xos/core/models/attic/slice_model.py b/xos/core/models/attic/slice_model.py
index 503a3f9..e296429 100644
--- a/xos/core/models/attic/slice_model.py
+++ b/xos/core/models/attic/slice_model.py
@@ -61,19 +61,4 @@
         qs = Slice.objects.filter(id__in=slice_ids)
     return qs
 
-"""
-def delete(self, *args, **kwds):
-    # delete networks associated with this slice
-    from core.models.network import Network
-    nets = Network.objects.filter(slices=self)
-    nets.delete() 
-    # delete slice controllers
-    slice_controllers = ControllerSlice.objects.filter(slice=self)
-    slice_controllers.delete()
-    # delete slice privilege
-    slice_privileges = SlicePrivilege.objects.filter(slice=self)
-    slice_privileges.delete() 
-    # continue with normal delete
-    super(Slice, self).delete(*args, **kwds) 
-"""
 
diff --git a/xos/core/models/attic/sliceprivilege_model.py b/xos/core/models/attic/sliceprivilege_model.py
index 3dd30e4..8516454 100644
--- a/xos/core/models/attic/sliceprivilege_model.py
+++ b/xos/core/models/attic/sliceprivilege_model.py
@@ -1,9 +1,6 @@
 class Meta:
     unique_together = ('user', 'slice', 'role')
 
-def save(self, *args, **kwds):
-    super(SlicePrivilege, self).save(*args, **kwds)
-
 def can_update(self, user):
     return user.can_update_slice(self.slice)
 
diff --git a/xos/core/models/attic/tag_model.py b/xos/core/models/attic/tag_model.py
index f67ee60..364baa2 100644
--- a/xos/core/models/attic/tag_model.py
+++ b/xos/core/models/attic/tag_model.py
@@ -1,10 +1,6 @@
 def can_update(self, user):
     return user.can_update_root()
 
-@classmethod
-def select_by_content_object(cls, obj):
-    return cls.objects.filter(content_type=obj.get_content_type_key(), object_id=obj.id)
-
 @staticmethod
 def select_by_user(user):
     return Tag.objects.all()
diff --git a/xos/core/models/attic/tenant_model.py b/xos/core/models/attic/tenant_model.py
index 168c7ad..e283c5a 100644
--- a/xos/core/models/attic/tenant_model.py
+++ b/xos/core/models/attic/tenant_model.py
@@ -5,18 +5,6 @@
     self._meta.get_field("kind").default = self.KIND
     super(Tenant, self).__init__(*args, **kwargs)
 
-@classmethod
-def get_tenant_objects(cls):
-    return cls.objects.filter(kind=cls.KIND)
-
-@classmethod
-def get_tenant_objects_by_user(cls, user):
-    return cls.select_by_user(user).filter(kind=cls.KIND)
-
-@classmethod
-def get_deleted_tenant_objects(cls):
-    return cls.deleted_objects.filter(kind=cls.KIND)
-
 @property
 def tenantattribute_dict(self):
     attrs = {}
@@ -32,7 +20,7 @@
             raise XOSMissingField("subscriber_specific_id is None, and it's a required field", fields={
                                   "service_specific_id": "cannot be none"})
 
-        conflicts = self.get_tenant_objects().filter(
+        conflicts = self.__class__.objects.filter(
             service_specific_id=self.service_specific_id)
         if conflicts:
             raise XOSDuplicateKey("service_specific_id %s already exists" % self.service_specific_id, fields={
diff --git a/xos/core/models/attic/tenantprivilege_model.py b/xos/core/models/attic/tenantprivilege_model.py
index 1c416f2..0b59d81 100644
--- a/xos/core/models/attic/tenantprivilege_model.py
+++ b/xos/core/models/attic/tenantprivilege_model.py
@@ -1,8 +1,3 @@
-def save(self, *args, **kwds):
-    if not self.user.is_active:
-        raise PermissionDenied, "Cannot modify role(s) of a disabled user"
-    super(TenantPrivilege, self).save(*args, **kwds)
-
 def can_update(self, user):
     return user.can_update_tenant_privilege(self)
 
diff --git a/xos/core/models/attic/tenantroot_model.py b/xos/core/models/attic/tenantroot_model.py
index 20e3480..bb09b1e 100644
--- a/xos/core/models/attic/tenantroot_model.py
+++ b/xos/core/models/attic/tenantroot_model.py
@@ -19,14 +19,6 @@
     return sorted(st, key=attrgetter('id'))[0]
 
 @classmethod
-def get_tenant_objects(cls):
-    return cls.objects.filter(kind=cls.KIND)
-
-@classmethod
-def get_tenant_objects_by_user(cls, user):
-    return cls.select_by_user(user).filter(kind=cls.KIND)
-
-@classmethod
 def select_by_user(cls, user):
     if user.is_admin:
         return cls.objects.all()
@@ -44,7 +36,7 @@
                               "service_specific_id": "cannot be none"})
 
     if self.service_specific_id:
-        conflicts = self.get_tenant_objects().filter(
+        conflicts = self.__class__.objects.filter(
             service_specific_id=self.service_specific_id)
         if self.pk:
             conflicts = conflicts.exclude(pk=self.pk)
diff --git a/xos/core/models/attic/tenantrootprivilege_model.py b/xos/core/models/attic/tenantrootprivilege_model.py
index c2d054e..8dee9a1 100644
--- a/xos/core/models/attic/tenantrootprivilege_model.py
+++ b/xos/core/models/attic/tenantrootprivilege_model.py
@@ -1,11 +1,6 @@
 class Meta:
     unique_together = ('user', 'tenant_root', 'role')
 
-def save(self, *args, **kwds):
-    if not self.user.is_active:
-        raise PermissionDenied, "Cannot modify role(s) of a disabled user"
-    super(TenantRootPrivilege, self).save(*args, **kwds)
-
 def can_update(self, user):
     return user.can_update_tenant_root_privilege(self)
 
diff --git a/xos/core/models/attic/tenantwithcontainer_model.py b/xos/core/models/attic/tenantwithcontainer_model.py
index 7b11323..5e87c04 100644
--- a/xos/core/models/attic/tenantwithcontainer_model.py
+++ b/xos/core/models/attic/tenantwithcontainer_model.py
@@ -61,7 +61,7 @@
 # not permit any new attributes to be defined. Find if any better solutions
 def count_of_tenants_of_an_instance(self, instance):
     tenant_count = 0
-    for tenant in self.get_tenant_objects().all():
+    for tenant in self.__class__.objects.all():
         if tenant.get_attribute("instance_id", None) == instance.id:
             tenant_count += 1
     return tenant_count
diff --git a/xos/core/models/attic/xosguiextension_model.py b/xos/core/models/attic/xosguiextension_model.py
deleted file mode 100644
index dbbad60..0000000
--- a/xos/core/models/attic/xosguiextension_model.py
+++ /dev/null
@@ -1,4 +0,0 @@
-"""Persist GUI Extension"""
-class Meta:
-    app_label = "core"
-
diff --git a/xos/core/models/flavor.xproto b/xos/core/models/flavor.xproto
index 08714d0..b76f419 100644
--- a/xos/core/models/flavor.xproto
+++ b/xos/core/models/flavor.xproto
@@ -4,7 +4,5 @@
      required string name = 1 [max_length = 32, content_type = "stripped", blank = False, help_text = "name of this flavor, as displayed to users", null = False, db_index = False];
      optional string description = 2 [db_index = False, max_length = 1024, null = True, content_type = "stripped", blank = True];
      required string flavor = 3 [max_length = 32, content_type = "stripped", blank = False, help_text = "flavor string used to configure deployments", null = False, db_index = False];
-     required int32 order = 4 [help_text = "used to order flavors when displayed in a list", default = 0, null = False, db_index = False, blank = False];
-     required bool default = 5 [help_text = "make this a default flavor to use when creating new instances", default = False, null = False, db_index = False, blank = True];
      required manytomany deployments->Deployment/DashboardView_deployments:flavors = 6 [db_index = False, null = False, blank = True];
 }
diff --git a/xos/core/models/instance.xproto b/xos/core/models/instance.xproto
index b34291e..dbbd4cd 100644
--- a/xos/core/models/instance.xproto
+++ b/xos/core/models/instance.xproto
@@ -12,7 +12,7 @@
      required manytoone deployment->Deployment:instance_deployment = 9 [db_index = True, null = False, blank = False];
      required manytoone node->Node:instances = 10 [db_index = True, null = False, blank = False];
      required int32 numberCores = 11 [help_text = "Number of cores for instance", default = 0, null = False, db_index = False, blank = False];
-     required manytoone flavor->Flavor:instance = 12 [help_text = "Flavor of this instance", default = "get_default_flavor()", null = False, db_index = True, blank = False];
+     required manytoone flavor->Flavor:instance = 12 [help_text = "Flavor of this instance", null = False, db_index = True, blank = False];
      optional string userData = 13 [help_text = "user_data passed to instance during creation", null = True, db_index = False, blank = True];
      required string isolation = 14 [default = "vm", choices = "(('vm', 'Virtual Machine'), ('container', 'Container'), ('container_vm', 'Container In VM'))", max_length = 30, blank = False, null = False, db_index = False];
      optional string volumes = 15 [help_text = "Comma-separated list of directories to expose to parent context", null = True, db_index = False, blank = True];
diff --git a/xos/core/models/network.xproto b/xos/core/models/network.xproto
index ffd1eb1..a44d378 100644
--- a/xos/core/models/network.xproto
+++ b/xos/core/models/network.xproto
@@ -1,6 +1,4 @@
-
-
-message Network (XOSBase,ParameterMixin){
+message Network (XOSBase){
      required string name = 1 [db_index = False, max_length = 32, null = False, blank = False];
      required manytoone template->NetworkTemplate:network = 2 [db_index = True, null = False, blank = False];
      required string subnet = 3 [db_index = False, max_length = 32, null = False, blank = True];
diff --git a/xos/core/models/networktemplate.xproto b/xos/core/models/networktemplate.xproto
index d9653ab..ab7fe1d 100644
--- a/xos/core/models/networktemplate.xproto
+++ b/xos/core/models/networktemplate.xproto
@@ -1,6 +1,4 @@
-
-
-message NetworkTemplate (XOSBase,ParameterMixin){
+message NetworkTemplate (XOSBase){
      required string name = 1 [db_index = False, max_length = 32, null = False, blank = False];
      optional string description = 2 [db_index = False, max_length = 1024, null = True, blank = True];
      required string visibility = 4 [default = "private", choices = "(('public', 'public'), ('private', 'private'))", max_length = 30, blank = False, null = False, db_index = False];
diff --git a/xos/core/models/node.xproto b/xos/core/models/node.xproto
index 36495d5..f4b12b0 100644
--- a/xos/core/models/node.xproto
+++ b/xos/core/models/node.xproto
@@ -1,5 +1,4 @@
 message Node (XOSBase){
      required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the Node", null = False, db_index = False];
      required manytoone site_deployment->SiteDeployment:nodes = 2 [db_index = True, null = False, blank = False];
-     optional manytoone site->Site:nodes = 3 [db_index = True, null = True, blank = True];
 }
diff --git a/xos/core/models/port.xproto b/xos/core/models/port.xproto
index 115b0db..d7841ab 100644
--- a/xos/core/models/port.xproto
+++ b/xos/core/models/port.xproto
@@ -1,6 +1,4 @@
-
-
-message Port (XOSBase,ParameterMixin){
+message Port (XOSBase){
      required manytoone network->Network:links = 1 [db_index = True, null = False, blank = False];
      optional manytoone instance->Instance:ports = 2 [db_index = True, null = True, blank = True];
      optional string ip = 3 [max_length = 39, content_type = "ip", blank = True, help_text = "Instance ip address", null = True, db_index = False];
diff --git a/xos/tosca/resources/node.py b/xos/tosca/resources/node.py
index 399a3e6..2051dd8 100644
--- a/xos/tosca/resources/node.py
+++ b/xos/tosca/resources/node.py
@@ -12,7 +12,6 @@
         siteName = self.get_requirement("tosca.relationships.MemberOfSite", throw_exception=False)
         if siteName:
             site = self.get_xos_object(Site, login_base=siteName)
-            args["site"] = site
 
         deploymentName = self.get_requirement("tosca.relationships.MemberOfDeployment", throw_exception=False)
         if deploymentName:
@@ -36,8 +35,6 @@
     def create(self):
         xos_args = self.get_xos_args()
 
-        if not xos_args.get("site", None):
-            raise Exception("Site is a required field of Node")
         if not xos_args.get("site_deployment", None):
             raise Exception("Deployment is a required field of Node")
 
@@ -47,7 +44,7 @@
 
         self.postprocess(node)
 
-        self.info("Created Node '%s' on Site '%s' Deployment '%s'" % (str(node), str(node.site), str(node.site_deployment.deployment)))
+        self.info("Created Node '%s' on Site '%s' Deployment '%s'" % (str(node), str(node.site_deployment.site), str(node.site_deployment.deployment)))
 
     def delete(self, obj):
         super(XOSNode, self).delete(obj)
