diff --git a/xos/models.py b/xos/models.py
index 20fa73f..9f5409e 100644
--- a/xos/models.py
+++ b/xos/models.py
@@ -19,108 +19,31 @@
     class Meta:
         app_label = "onos"
         verbose_name = "ONOS Service"
-        proxy = True
 
-    default_attributes = {"rest_hostname": "",
-                          "rest_port": "8181",
-                          "no_container": False,
-                          "node_key": ""}
-
-    @property
-    def rest_hostname(self):
-        return self.get_attribute("rest_hostname", self.default_attributes["rest_hostname"])
-
-    @rest_hostname.setter
-    def rest_hostname(self, value):
-        self.set_attribute("rest_hostname", value)
-
-    @property
-    def rest_port(self):
-        return self.get_attribute("rest_port", self.default_attributes["rest_port"])
-
-    @rest_port.setter
-    def rest_port(self, value):
-        self.set_attribute("rest_port", value)
-
-    @property
-    def no_container(self):
-        return self.get_attribute("no_container", self.default_attributes["no_container"])
-
-    @no_container.setter
-    def no_container(self, value):
-        self.set_attribute("no_container", value)
-
-    @property
-    def node_key(self):
-        return self.get_attribute("node_key", self.default_attributes["node_key"])
-
-    @node_key.setter
-    def node_key(self, value):
-        self.set_attribute("node_key", value)
-
+    rest_hostname = StrippedCharField(max_length=255, null=True, blank=True)
+    rest_port = models.IntegerField(default=8181)
+    no_container = models.BooleanField(default=False)
+    node_key = StrippedCharField(max_length=1024, null=True, blank=True)
 
 class ONOSApp(Tenant):   # aka 'ONOSTenant'
     class Meta:
-        proxy = True
+        app_label = "onos"
 
     KIND = ONOS_KIND
 
-    default_attributes = {"name": "",
-                          "install_dependencies": "",
-                          "dependencies": ""}
+    name = StrippedCharField(max_length=255, null=True, blank=True)
+    install_dependencies = models.TextField(null=True, blank=True)
+    dependencies = models.TextField(null=True, blank=True)
+
+    # why is this necessary?
+    creator = models.ForeignKey(User, related_name='onos_apps', blank=True, null=True)
+
     def __init__(self, *args, **kwargs):
         onos_services = ONOSService.get_service_objects().all()
         if onos_services:
             self._meta.get_field("provider_service").default = onos_services[0].id
         super(ONOSApp, self).__init__(*args, **kwargs)
 
-    @property
-    def creator(self):
-        from core.models import User
-        if getattr(self, "cached_creator", None):
-            return self.cached_creator
-        creator_id=self.get_attribute("creator_id")
-        if not creator_id:
-            return None
-        users=User.objects.filter(id=creator_id)
-        if not users:
-            return None
-        user=users[0]
-        self.cached_creator = users[0]
-        return user
-
-    @creator.setter
-    def creator(self, value):
-        if value:
-            value = value.id
-        if (value != self.get_attribute("creator_id", None)):
-            self.cached_creator=None
-        self.set_attribute("creator_id", value)
-
-    @property
-    def name(self):
-        return self.get_attribute("name", self.default_attributes["name"])
-
-    @name.setter
-    def name(self, value):
-        self.set_attribute("name", value)
-
-    @property
-    def dependencies(self):
-        return self.get_attribute("dependencies", self.default_attributes["dependencies"])
-
-    @dependencies.setter
-    def dependencies(self, value):
-        self.set_attribute("dependencies", value)
-
-    @property
-    def install_dependencies(self):
-        return self.get_attribute("install_dependencies", self.default_attributes["install_dependencies"])
-
-    @install_dependencies.setter
-    def install_dependencies(self, value):
-        self.set_attribute("install_dependencies", value)
-
     def save(self, *args, **kwargs):
         if not self.creator:
             if not getattr(self, "caller", None):
@@ -131,16 +54,7 @@
                 raise XOSProgrammingError("ONOSApp's self.creator was not set")
 
         super(ONOSApp, self).save(*args, **kwargs)
-        model_policy_onos_app(self.pk)
 
-# TODO: Probably don't need this...
-def model_policy_onos_app(pk):
-    # TODO: this should be made in to a real model_policy
-    with transaction.atomic():
-        oa = ONOSApp.objects.select_for_update().filter(pk=pk)
-        if not oa:
-            return
-        oa = oa[0]
-        #oa.manage_container()
+
 
 
