diff --git a/xos/synchronizer/invokers/__init__.py b/xos/synchronizer/invokers/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/xos/synchronizer/invokers/__init__.py
diff --git a/xos/synchronizer/invokers/invoker.py b/xos/synchronizer/invokers/invoker.py
new file mode 100644
index 0000000..e645285
--- /dev/null
+++ b/xos/synchronizer/invokers/invoker.py
@@ -0,0 +1,25 @@
+class Invoker(object):
+
+    def __init__(self, **args):
+        pass
+
+    # Method for handline pre save semantics
+    #      content here would be model specific but could include handling Many-to-Many relationship
+    #      creation - which must occur post save
+    #
+    # obj     - Whatever obj was just saved
+    # returns - None - this is a pure invoke() call, return type is None
+    #
+    def presave(self, obj):
+        return None
+
+
+    # Method for handline post save semantics
+    #      content here would be model specific but could include handling Many-to-Many relationship
+    #      creation - which must occur post save
+    #
+    # obj     - Whatever obj was just saved
+    # returns - None - this is a pure invoke() call, return type is None
+    #
+    def postsave(self, obj):
+        return None
\ No newline at end of file
diff --git a/xos/synchronizer/invokers/invokerfactory.py b/xos/synchronizer/invokers/invokerfactory.py
new file mode 100644
index 0000000..786f99d
--- /dev/null
+++ b/xos/synchronizer/invokers/invokerfactory.py
@@ -0,0 +1,20 @@
+from services.metronetwork.models import *
+from synchronizers.metronetwork.invokers.networkmultipointtomultipointinvoker import NetworkMultipointToMultipointInvoker
+from synchronizers.metronetwork.invokers.networkedgetoedgepointinvoker import NetworkEdgeToEdgePointInvoker
+from synchronizers.metronetwork.invokers.networkedgetomultipointinvoker import NetworkEdgeToMultipointInvoker
+
+
+class InvokerFactory(object):
+    @staticmethod
+    def getinvoker(obj):
+        #
+        # Here is where we build various invokers
+        #
+        if isinstance(obj, NetworkMultipointToMultipointConnection):
+            return NetworkMultipointToMultipointInvoker()
+        elif isinstance(obj, NetworkEdgeToEdgePointConnection):
+            return NetworkEdgeToEdgePointInvoker()
+        elif isinstance(obj, NetworkEdgeToMultipointConnection):
+            return NetworkEdgeToMultipointInvoker()
+        else:
+            return None
diff --git a/xos/synchronizer/invokers/networkedgetoedgepointinvoker.py b/xos/synchronizer/invokers/networkedgetoedgepointinvoker.py
new file mode 100644
index 0000000..ebc4d12
--- /dev/null
+++ b/xos/synchronizer/invokers/networkedgetoedgepointinvoker.py
@@ -0,0 +1,33 @@
+import json
+from synchronizers.metronetwork.invokers.invoker import Invoker
+from services.metronetwork.models import NetworkEdgePort
+
+
+class NetworkEdgeToEdgePointInvoker(Invoker):
+    def __init__(self, **args):
+        pass
+
+    # Method for handline pre save semantics
+    #      content here would be model specific but could include handling Many-to-Many relationship
+    #      creation - which must occur post save
+    #
+    # obj     - Whatever obj was just saved
+    # returns - None - this is a pure invoke() call, return type is None
+    #
+    def presave(self, obj):
+        # Now that the Ports are created - get a proper reference to them and update the
+        # src and dst fields
+        uni1port = NetworkEdgePort.objects.get(pid=obj.uni1_createbuffer)
+        uni2port = NetworkEdgePort.objects.get(pid=obj.uni2_createbuffer)
+        obj.uni1 = uni1port
+        obj.uni2 = uni2port
+
+    # Method for handline post save semantics
+    #      content here would be model specific but could include handling Many-to-Many relationship
+    #      creation - which must occur post save
+    #
+    # obj     - Whatever obj was just saved
+    # returns - N/A - this is a pure invoke() call
+    #
+    def postsave(self, obj):
+        pass
diff --git a/xos/synchronizer/invokers/networkedgetomultipointinvoker.py b/xos/synchronizer/invokers/networkedgetomultipointinvoker.py
new file mode 100644
index 0000000..a0b7ffd
--- /dev/null
+++ b/xos/synchronizer/invokers/networkedgetomultipointinvoker.py
@@ -0,0 +1,45 @@
+import json
+from synchronizers.metronetwork.invokers.invoker import Invoker
+from services.metronetwork.models import NetworkEdgeToMultipointConnection, NetworkEdgePort
+
+class NetworkEdgeToMultipointInvoker(Invoker):
+
+    def __init__(self, **args):
+        pass
+
+    # Method for handline pre save semantics
+    #      content here would be model specific but could include handling Many-to-Many relationship
+    #      creation - which must occur post save
+    #
+    # obj     - Whatever obj was just saved
+    # returns - None - this is a pure invoke() call, return type is None
+    #
+    def presave(self, obj):
+        # Now that the Ports are created - get a proper reference to them and update the
+        # root field
+        rootEdgePort = NetworkEdgePort.objects.get(pid=obj.root_createbuffer)
+        obj.root = rootEdgePort
+
+
+    # Method for handline post save semantics
+    #      content here would be model specific but could include handling Many-to-Many relationship
+    #      creation - which must occur post save
+    #
+    # obj     - Whatever obj was just saved
+    # returns - N/A - this is a pure invoke() call
+    #
+    def postsave(self, obj):
+        #
+        # Ok - we need to handle the multipoint many-to-many relationships in here
+        #
+        # By design convnetion we will look for them in the 'backend_register' object field
+        # this is a json field that is general purpose - we will expect to find a JSON array
+        # called 'eps' that just containts a reference to a bunch of NetworkEdgePorts
+        #
+        #
+        scratchpad = json.loads(obj.eps_createbuffer)
+        eps = scratchpad['eps']
+
+        for ep in eps:
+            port = NetworkEdgePort.objects.get(pid=ep)
+            obj.eps.add(port)
diff --git a/xos/synchronizer/invokers/networkmultipointtomultipointinvoker.py b/xos/synchronizer/invokers/networkmultipointtomultipointinvoker.py
new file mode 100644
index 0000000..78b617c
--- /dev/null
+++ b/xos/synchronizer/invokers/networkmultipointtomultipointinvoker.py
@@ -0,0 +1,42 @@
+import json
+from synchronizers.metronetwork.invokers.invoker import Invoker
+from services.metronetwork.models import NetworkMultipointToMultipointConnection, NetworkEdgePort
+
+class NetworkMultipointToMultipointInvoker(Invoker):
+
+    def __init__(self, **args):
+        pass
+
+    # Method for handline pre save semantics
+    #      content here would be model specific but could include handling Many-to-Many relationship
+    #      creation - which must occur post save
+    #
+    # obj     - Whatever obj was just saved
+    # returns - None - this is a pure invoke() call, return type is None
+    #
+    def presave(self, obj):
+        pass
+
+
+    # Method for handline post save semantics
+    #      content here would be model specific but could include handling Many-to-Many relationship
+    #      creation - which must occur post save
+    #
+    # obj     - Whatever obj was just saved
+    # returns - N/A - this is a pure invoke() call
+    #
+    def postsave(self, obj):
+        #
+        # Ok - we need to handle the multipoint many-to-many relationships in here
+        #
+        # By design convnetion we will look for them in the 'backend_register' object field
+        # this is a json field that is general purpose - we will expect to find a JSON array
+        # called 'eps' that just containts a reference to a bunch of NetworkEdgePorts
+        #
+        #
+        scratchpad = json.loads(obj.eps_createbuffer)
+        eps = scratchpad['eps']
+
+        for ep in eps:
+            port = NetworkEdgePort.objects.get(pid=ep)
+            obj.eps.add(port)
