diff --git a/xos/grpc/orm.py b/xos/grpc/orm.py
index 79d43e9..538a278 100644
--- a/xos/grpc/orm.py
+++ b/xos/grpc/orm.py
@@ -21,8 +21,6 @@
 
 import functools
 from google.protobuf.empty_pb2 import Empty
-from protos.common_pb2 import ID
-from protos.xosoptions_pb2 import foreignKey, reverseForeignKey
 
 from google.protobuf import symbol_database as _symbol_database
 _sym_db = _symbol_database.Default()
@@ -46,6 +44,7 @@
 
         for (name, field) in self._wrapped_class.DESCRIPTOR.fields_by_name.items():
            if name.endswith("_id"):
+               foreignKey = field.GetOptions().Extensions._FindExtensionByName("xos.foreignKey")
                fk = field.GetOptions().Extensions[foreignKey]
                if fk:
                    fkmap[name[:-3]] = {"src_fieldName": name, "modelName": fk.modelName}
@@ -57,6 +56,7 @@
 
         for (name, field) in self._wrapped_class.DESCRIPTOR.fields_by_name.items():
            if name.endswith("_ids"):
+               reverseForeignKey = field.GetOptions().Extensions._FindExtensionByName("xos.reverseForeignKey")
                fk = field.GetOptions().Extensions[reverseForeignKey]
                if fk:
                    reverse_fkmap[name[:-4]] = {"src_fieldName": name, "modelName": fk.modelName}
@@ -68,9 +68,8 @@
             return ORMWrapper(self.cache[name], self.stub)
 
         fk_entry = self._fkmap[name]
-        get_method = getattr(self.stub, "Get%s" % fk_entry["modelName"])
-        id=ID(id=getattr(self, fk_entry["src_fieldName"]))
-        dest_model = get_method(id)
+        id=self.stub.make_ID(id=getattr(self, fk_entry["src_fieldName"]))
+        dest_model = self.stub.invoke("Get%s" % fk_entry["modelName"], id)
 
         self.cache[name] = dest_model
 
@@ -106,18 +105,15 @@
 
     def save(self):
         if self.is_new:
-           create_method = getattr(self.stub,"Create%s" % self._wrapped_class.__class__.__name__)
-           new_class = create_method(self._wrapped_class)
+           new_class = self.stub.invoke("Create%s" % self._wrapped_class.__class__.__name__, self._wrapped_class)
            self._wrapped_class = new_class
            self.is_new = False
         else:
-           update_method = getattr(self.stub,"Update%s" % self._wrapped_class.__class__.__name__)
-           update_method(self._wrapped_class)
+           self.stub.invoke("Update%s" % self._wrapped_class.__class__.__name__, self._wrapped_class)
 
     def delete(self):
-        delete_method = getattr(self.stub,"Delete%s" % self._wrapped_class.__class__.__name__)
-        id = ID(id=self._wrapped_class.id)
-        delete_method(id)
+        id = self.stub.make_ID(id=self._wrapped_class.id)
+        self.stub.invoke("Delete%s" % self._wrapped_class.__class__.__name__, id)
 
 class ORMLocalObjectManager(object):
     """ Manages a local list of objects """
@@ -133,9 +129,8 @@
             return self._cache
 
         models = []
-        get_method = getattr(self._stub, "Get%s" % self._modelName)
         for id in self._idList:
-            models.append(get_method(ID(id=id)))
+            models.append(self._stub.invoke("Get%s" % self._modelName, self._stub.make_ID(id=id)))
 
         self._cache = models
 
@@ -163,12 +158,10 @@
         return result
 
     def all(self):
-        list_method = getattr(self._stub, "List%s" % self._modelName)
-        return self.wrap_list(list_method(Empty()))
+        return self.wrap_list(self._stub.invoke("List%s" % self._modelName, Empty()))
 
     def get(self, id):
-        get_method = getattr(self._stub, "Get%s" % self._modelName)
-        return self.wrap_single(get_method(ID(id=id)))
+        return self.wrap_single(self._stub.invoke("Get%s" % self._modelName, self._stub.make_ID(id=id)))
 
     def new(self, **kwargs):
         full_model_name = "%s.%s" % (self._packageName, self._modelName)
@@ -181,10 +174,20 @@
 
 class ORMStub(object):
     def __init__(self, stub, package_name):
+        self.grpc_stub = stub
+
         for name in dir(stub):
            if name.startswith("Get"):
                model_name = name[3:]
-               setattr(self,model_name, ORMModelClass(stub, model_name, package_name))
+               setattr(self,model_name, ORMModelClass(self, model_name, package_name))
+
+    def invoke(self, name, request):
+        method = getattr(self.grpc_stub, name)
+        return method(request)
+
+    def make_ID(self, id):
+        return _sym_db._classes["xos.ID"](id=id)
+
 
 #def wrap_get(*args, **kwargs):
 #    stub=kwargs.pop("stub")
