diff --git a/Dockerfile.synchronizer b/Dockerfile.synchronizer
index c38cd40..9ff5ae9 100644
--- a/Dockerfile.synchronizer
+++ b/Dockerfile.synchronizer
@@ -16,7 +16,7 @@
 
 # xosproject/fabric-crossconnect-synchronizer
 
-FROM xosproject/xos-synchronizer-base:2.1.32
+FROM xosproject/xos-synchronizer-base:2.1.38
 
 COPY xos/synchronizer /opt/xos/synchronizers/fabric-crossconnect
 COPY VERSION /opt/xos/synchronizers/fabric-crossconnect/
diff --git a/VERSION b/VERSION
index 18efdb9..512a1fa 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.1.8
+1.1.9
diff --git a/xos/synchronizer/event_steps/kubernetes_event.py b/xos/synchronizer/event_steps/kubernetes_event.py
index 5ff561e..b3aae1a 100644
--- a/xos/synchronizer/event_steps/kubernetes_event.py
+++ b/xos/synchronizer/event_steps/kubernetes_event.py
@@ -17,8 +17,8 @@
 import json
 import os
 import sys
-from synchronizers.new_base.eventstep import EventStep
-from synchronizers.new_base.modelaccessor import FabricCrossconnectService, FabricCrossconnectServiceInstance, Service
+from xossynchronizer.event_steps.eventstep import EventStep
+from xossynchronizer.modelaccessor import FabricCrossconnectService, FabricCrossconnectServiceInstance, Service
 from xosconfig import Config
 from multistructlog import create_logger
 
diff --git a/xos/synchronizer/event_steps/test_kubernetes_event.py b/xos/synchronizer/event_steps/test_kubernetes_event.py
index 5627b5d..1d45ce5 100644
--- a/xos/synchronizer/event_steps/test_kubernetes_event.py
+++ b/xos/synchronizer/event_steps/test_kubernetes_event.py
@@ -20,27 +20,7 @@
 
 import os, sys
 
-# Hack to load synchronizer framework
 test_path=os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
-xos_dir=os.path.join(test_path, "../../..")
-if not os.path.exists(os.path.join(test_path, "new_base")):
-    xos_dir=os.path.join(test_path, "../../../../../../orchestration/xos/xos")
-    services_dir = os.path.join(xos_dir, "../../xos_services")
-sys.path.append(xos_dir)
-sys.path.append(os.path.join(xos_dir, 'synchronizers', 'new_base'))
-# END Hack to load synchronizer framework
-
-# generate model from xproto
-def get_models_fn(service_name, xproto_name):
-    name = os.path.join(service_name, "xos", xproto_name)
-    if os.path.exists(os.path.join(services_dir, name)):
-        return name
-    else:
-        name = os.path.join(service_name, "xos", "synchronizer", "models", xproto_name)
-        if os.path.exists(os.path.join(services_dir, name)):
-            return name
-    raise Exception("Unable to find service=%s xproto=%s" % (service_name, xproto_name))
-# END generate model from xproto
 
 class TestKubernetesEvent(unittest.TestCase):
 
@@ -48,8 +28,6 @@
         global DeferredException
 
         self.sys_path_save = sys.path
-        sys.path.append(xos_dir)
-        sys.path.append(os.path.join(xos_dir, 'synchronizers', 'new_base'))
 
         # Setting up the config module
         from xosconfig import Config
@@ -58,16 +36,18 @@
         Config.init(config, "synchronizer-config-schema.yaml")
         # END Setting up the config module
 
-        from synchronizers.new_base.mock_modelaccessor_build import build_mock_modelaccessor
-        build_mock_modelaccessor(xos_dir, services_dir, [
-            get_models_fn("fabric-crossconnect", "fabric-crossconnect.xproto"),
-            get_models_fn("onos-service", "onos.xproto"),
-        ])
-        import synchronizers.new_base.mock_modelaccessor
-        reload(synchronizers.new_base.mock_modelaccessor) # in case nose2 loaded it in a previous test
-        import synchronizers.new_base.modelaccessor
-        reload(synchronizers.new_base.modelaccessor)      # in case nose2 loaded it in a previous test
-        from synchronizers.new_base.modelaccessor import model_accessor
+        from xossynchronizer.mock_modelaccessor_build import mock_modelaccessor_config
+        mock_modelaccessor_config(test_path, [("fabric-crossconnect", "fabric-crossconnect.xproto"),
+                                              ("onos-service", "onos.xproto")])
+
+        import xossynchronizer.modelaccessor
+        import mock_modelaccessor
+        reload(mock_modelaccessor) # in case nose2 loaded it in a previous test
+        reload(xossynchronizer.modelaccessor)      # in case nose2 loaded it in a previous test
+
+        from xossynchronizer.modelaccessor import model_accessor
+        self.model_accessor = model_accessor
+
         from mock_modelaccessor import MockObjectList
 
         from kubernetes_event import KubernetesPodDetailsEventStep
@@ -122,7 +102,7 @@
             event = Mock()
             event.value = json.dumps(event_dict)
 
-            step = self.event_step(log=self.log)
+            step = self.event_step(model_accessor=self.model_accessor, log=self.log)
             step.process_event(event)
 
             self.assertEqual(self.fcsi1.backend_code, 0)
@@ -148,7 +128,7 @@
             event = Mock()
             event.value = json.dumps(event_dict)
 
-            step = self.event_step(log=self.log)
+            step = self.event_step(model_accessor=self.model_accessor, log=self.log)
             step.process_event(event)
 
             self.assertEqual(self.fcsi1.backend_code, 1)
@@ -171,7 +151,7 @@
             event = Mock()
             event.value = json.dumps(event_dict)
 
-            step = self.event_step(log=self.log)
+            step = self.event_step(model_accessor=self.model_accessor, log=self.log)
             step.process_event(event)
 
             self.assertEqual(self.fcsi1.backend_code, 1)
@@ -193,7 +173,7 @@
             event = Mock()
             event.value = json.dumps(event_dict)
 
-            step = self.event_step(log=self.log)
+            step = self.event_step(model_accessor=self.model_accessor, log=self.log)
             step.process_event(event)
 
             self.assertEqual(self.fcsi1.backend_code, 1)
diff --git a/xos/synchronizer/fabric-crossconnect-synchronizer.py b/xos/synchronizer/fabric-crossconnect-synchronizer.py
index 337472d..5f82ca5 100755
--- a/xos/synchronizer/fabric-crossconnect-synchronizer.py
+++ b/xos/synchronizer/fabric-crossconnect-synchronizer.py
@@ -16,9 +16,8 @@
 
 # This imports and runs ../../xos-observer.py
 
-import importlib
 import os
-import sys
+from xossynchronizer import Synchronizer
 from xosconfig import Config
 
 base_config_file = os.path.abspath(os.path.dirname(os.path.realpath(__file__)) + '/config.yaml')
@@ -29,7 +28,4 @@
 else:
     Config.init(base_config_file, 'synchronizer-config-schema.yaml')
 
-observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../../synchronizers/new_base")
-sys.path.append(observer_path)
-mod = importlib.import_module("xos-synchronizer")
-mod.main()
+Synchronizer().run()
diff --git a/xos/synchronizer/model_policies/model_policy_fabriccrossconnectserviceinstance.py b/xos/synchronizer/model_policies/model_policy_fabriccrossconnectserviceinstance.py
index 5a61506..caa34bd 100644
--- a/xos/synchronizer/model_policies/model_policy_fabriccrossconnectserviceinstance.py
+++ b/xos/synchronizer/model_policies/model_policy_fabriccrossconnectserviceinstance.py
@@ -14,9 +14,9 @@
 # limitations under the License.
 
 
-from synchronizers.new_base.modelaccessor import FabricCrossconnectServiceInstance, ServiceInstance, model_accessor
-from synchronizers.new_base.policy import Policy
-from synchronizers.new_base.exceptions import *
+from xossynchronizer.modelaccessor import FabricCrossconnectServiceInstance, ServiceInstance, model_accessor
+from xossynchronizer.model_policies.policy import Policy
+from xossynchronizer.exceptions import *
 
 from xosconfig import Config
 from multistructlog import create_logger
diff --git a/xos/synchronizer/model_policies/test_model_policy_fabriccrossconnectserviceinstance.py b/xos/synchronizer/model_policies/test_model_policy_fabriccrossconnectserviceinstance.py
index bccdfdc..9fe1418 100644
--- a/xos/synchronizer/model_policies/test_model_policy_fabriccrossconnectserviceinstance.py
+++ b/xos/synchronizer/model_policies/test_model_policy_fabriccrossconnectserviceinstance.py
@@ -22,27 +22,7 @@
 
 import os, sys
 
-# Hack to load synchronizer framework
 test_path=os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
-xos_dir=os.path.join(test_path, "../../..")
-if not os.path.exists(os.path.join(test_path, "new_base")):
-    xos_dir=os.path.join(test_path, "../../../../../../orchestration/xos/xos")
-    services_dir = os.path.join(xos_dir, "../../xos_services")
-sys.path.append(xos_dir)
-sys.path.append(os.path.join(xos_dir, 'synchronizers', 'new_base'))
-# END Hack to load synchronizer framework
-
-# generate model from xproto
-def get_models_fn(service_name, xproto_name):
-    name = os.path.join(service_name, "xos", xproto_name)
-    if os.path.exists(os.path.join(services_dir, name)):
-        return name
-    else:
-        name = os.path.join(service_name, "xos", "synchronizer", "models", xproto_name)
-        if os.path.exists(os.path.join(services_dir, name)):
-            return name
-    raise Exception("Unable to find service=%s xproto=%s" % (service_name, xproto_name))
-# END generate model from xproto
 
 def mock_get_westbound_service_instance_properties(props, prop):
     return props[prop]
@@ -59,8 +39,6 @@
         global DeferredException
 
         self.sys_path_save = sys.path
-        sys.path.append(xos_dir)
-        sys.path.append(os.path.join(xos_dir, 'synchronizers', 'new_base'))
 
         # Setting up the config module
         from xosconfig import Config
@@ -69,16 +47,19 @@
         Config.init(config, "synchronizer-config-schema.yaml")
         # END Setting up the config module
 
-        from synchronizers.new_base.mock_modelaccessor_build import build_mock_modelaccessor
-        build_mock_modelaccessor(xos_dir, services_dir, [get_models_fn("fabric-crossconnect", "fabric-crossconnect.xproto")])
-        import synchronizers.new_base.modelaccessor
+        from xossynchronizer.mock_modelaccessor_build import mock_modelaccessor_config
+        mock_modelaccessor_config(test_path, [("fabric-crossconnect", "fabric-crossconnect.xproto"),])
 
-        from mock_modelaccessor import MockObjectList
-        self.MockObjectList = MockObjectList
+        import xossynchronizer.modelaccessor
+        import mock_modelaccessor
+        reload(mock_modelaccessor) # in case nose2 loaded it in a previous test
+        reload(xossynchronizer.modelaccessor)      # in case nose2 loaded it in a previous test
 
         from model_policy_fabriccrossconnectserviceinstance import FabricCrossconnectServiceInstancePolicy, \
             model_accessor
 
+        self.model_accessor = model_accessor
+
         # import all class names to globals
         for (k, v) in model_accessor.all_model_classes.items():
             globals()[k] = v
@@ -121,7 +102,7 @@
             si = self.mock_westbound(fsi, s_tag=111, switch_datapath_id = "of:0000000000000201", switch_port = 3)
             serviceinstance_objects.return_value = [si]
 
-            self.policy_step().handle_update(fsi)
+            self.policy_step(model_accessor=self.model_accessor).handle_update(fsi)
 
     def tearDown(self):
         self.o = None
diff --git a/xos/synchronizer/models/test_models.py b/xos/synchronizer/models/test_models.py
index 3d42609..47b1bb2 100755
--- a/xos/synchronizer/models/test_models.py
+++ b/xos/synchronizer/models/test_models.py
@@ -17,11 +17,6 @@
 from mock import patch, Mock, MagicMock
 
 test_path=os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
-service_dir=os.path.join(test_path, "../../../..")
-xos_dir=os.path.join(test_path, "../../..")
-if not os.path.exists(os.path.join(test_path, "new_base")):
-    xos_dir=os.path.join(test_path, "../../../../../../orchestration/xos/xos")
-    services_dir=os.path.join(xos_dir, "../../xos_services")
 
 # mocking XOS exception, as they're based in Django
 class Exceptions:
@@ -36,7 +31,6 @@
     def setUp(self):
 
         self.sys_path_save = sys.path
-        sys.path.append(xos_dir)
 
         self.xos = XOS
 
@@ -48,6 +42,7 @@
 
 
         modules = {
+            'xos': MagicMock(),
             'xos.exceptions': self.xos.exceptions,
             'models_decl': self.models_decl
         }
diff --git a/xos/synchronizer/steps/sync_fabric_crossconnect_service_instance.py b/xos/synchronizer/steps/sync_fabric_crossconnect_service_instance.py
index 5299fc1..0880988 100644
--- a/xos/synchronizer/steps/sync_fabric_crossconnect_service_instance.py
+++ b/xos/synchronizer/steps/sync_fabric_crossconnect_service_instance.py
@@ -12,8 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from synchronizers.new_base.syncstep import SyncStep, DeferredException
-from synchronizers.new_base.modelaccessor import model_accessor, FabricCrossconnectServiceInstance, ServiceInstance, BNGPortMapping
+from xossynchronizer.steps.syncstep import SyncStep, DeferredException
+from xossynchronizer.modelaccessor import model_accessor, FabricCrossconnectServiceInstance, ServiceInstance, BNGPortMapping
 
 from xosconfig import Config
 from multistructlog import create_logger
diff --git a/xos/synchronizer/steps/test_sync_fabric_crossconnect_service_instance.py b/xos/synchronizer/steps/test_sync_fabric_crossconnect_service_instance.py
index 9f07687..62c8d5b 100644
--- a/xos/synchronizer/steps/test_sync_fabric_crossconnect_service_instance.py
+++ b/xos/synchronizer/steps/test_sync_fabric_crossconnect_service_instance.py
@@ -22,27 +22,7 @@
 
 import os, sys
 
-# Hack to load synchronizer framework
 test_path=os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
-xos_dir=os.path.join(test_path, "../../..")
-if not os.path.exists(os.path.join(test_path, "new_base")):
-    xos_dir=os.path.join(test_path, "../../../../../../orchestration/xos/xos")
-    services_dir = os.path.join(xos_dir, "../../xos_services")
-sys.path.append(xos_dir)
-sys.path.append(os.path.join(xos_dir, 'synchronizers', 'new_base'))
-# END Hack to load synchronizer framework
-
-# generate model from xproto
-def get_models_fn(service_name, xproto_name):
-    name = os.path.join(service_name, "xos", xproto_name)
-    if os.path.exists(os.path.join(services_dir, name)):
-        return name
-    else:
-        name = os.path.join(service_name, "xos", "synchronizer", "models", xproto_name)
-        if os.path.exists(os.path.join(services_dir, name)):
-            return name
-    raise Exception("Unable to find service=%s xproto=%s" % (service_name, xproto_name))
-# END generate model from xproto
 
 def mock_get_westbound_service_instance_properties(props, prop):
     return props[prop]
@@ -59,8 +39,6 @@
         global DeferredException
 
         self.sys_path_save = sys.path
-        sys.path.append(xos_dir)
-        sys.path.append(os.path.join(xos_dir, 'synchronizers', 'new_base'))
 
         # Setting up the config module
         from xosconfig import Config
@@ -69,11 +47,19 @@
         Config.init(config, "synchronizer-config-schema.yaml")
         # END Setting up the config module
 
-        from synchronizers.new_base.mock_modelaccessor_build import build_mock_modelaccessor
-        build_mock_modelaccessor(xos_dir, services_dir, [get_models_fn("fabric-crossconnect", "fabric-crossconnect.xproto")])
-        import synchronizers.new_base.modelaccessor
+        from xossynchronizer.mock_modelaccessor_build import mock_modelaccessor_config
+        mock_modelaccessor_config(test_path, [("fabric-crossconnect", "fabric-crossconnect.xproto"),])
 
-        from sync_fabric_crossconnect_service_instance import SyncFabricCrossconnectServiceInstance, model_accessor, DeferredException
+        import xossynchronizer.modelaccessor
+        import mock_modelaccessor
+        reload(mock_modelaccessor) # in case nose2 loaded it in a previous test
+        reload(xossynchronizer.modelaccessor)      # in case nose2 loaded it in a previous test
+
+        from xossynchronizer.modelaccessor import model_accessor
+        self.model_accessor = model_accessor
+
+        from sync_fabric_crossconnect_service_instance import SyncFabricCrossconnectServiceInstance, model_accessor, \
+            DeferredException
 
         # import all class names to globals
         for (k, v) in model_accessor.all_model_classes.items():
@@ -103,15 +89,15 @@
         return si
 
     def test_format_url(self):
-        url = self.sync_step().format_url("foo.com/bar")
+        url = self.sync_step(model_accessor=self.model_accessor).format_url("foo.com/bar")
         self.assertEqual(url, "http://foo.com/bar")
 
-        url = self.sync_step().format_url("http://foo.com/bar")
+        url = self.sync_step(model_accessor=self.model_accessor).format_url("http://foo.com/bar")
         self.assertEqual(url, "http://foo.com/bar")
 
     def test_make_handle_extract_handle(self):
-        h = self.sync_step().make_handle(222, "of:0000000000000201")
-        (s_tag, switch_datapath_id) = self.sync_step().extract_handle(h)
+        h = self.sync_step(model_accessor=self.model_accessor).make_handle(222, "of:0000000000000201")
+        (s_tag, switch_datapath_id) = self.sync_step(model_accessor=self.model_accessor).extract_handle(h)
 
         self.assertEqual(s_tag, 222)
         self.assertEqual(switch_datapath_id, "of:0000000000000201")
@@ -119,27 +105,27 @@
     def test_get_fabric_onos_init(self):
         fsi = FabricCrossconnectServiceInstance(id=7777, owner=self.service)
 
-        d = self.sync_step().get_fabric_onos_info(fsi)
+        d = self.sync_step(model_accessor=self.model_accessor).get_fabric_onos_info(fsi)
 
         self.assertEqual(d["url"], "http://onos-fabric:8181")
         self.assertEqual(d["user"], "onos")
         self.assertEqual(d["pass"], "rocks")
 
     def test_range_matches_single(self):
-        self.assertTrue(self.sync_step().range_matches(123, "123"))
+        self.assertTrue(self.sync_step(model_accessor=self.model_accessor).range_matches(123, "123"))
 
     def test_range_matches_single_incorrect(self):
-        self.assertFalse(self.sync_step().range_matches(123, "456"))
+        self.assertFalse(self.sync_step(model_accessor=self.model_accessor).range_matches(123, "456"))
 
     def test_range_matches_range(self):
-        self.assertTrue(self.sync_step().range_matches(123, "122-124"))
+        self.assertTrue(self.sync_step(model_accessor=self.model_accessor).range_matches(123, "122-124"))
 
     def test_range_matches_range_incorrect(self):
-        self.assertFalse(self.sync_step().range_matches(123, "110-113"))
+        self.assertFalse(self.sync_step(model_accessor=self.model_accessor).range_matches(123, "110-113"))
 
     def test_range_matches_any(self):
-        self.assertTrue(self.sync_step().range_matches(123, "ANY"))
-        self.assertTrue(self.sync_step().range_matches(123, "any"))
+        self.assertTrue(self.sync_step(model_accessor=self.model_accessor).range_matches(123, "ANY"))
+        self.assertTrue(self.sync_step(model_accessor=self.model_accessor).range_matches(123, "any"))
 
     def test_find_bng_single(self):
         with patch.object(BNGPortMapping.objects, "get_items") as bng_objects, \
@@ -150,7 +136,7 @@
             # this should not be called
             range_matches.return_value = False
 
-            found_bng = self.sync_step().find_bng(111)
+            found_bng = self.sync_step(model_accessor=self.model_accessor).find_bng(111)
             self.assertTrue(found_bng)
             self.assertEqual(found_bng.switch_port, 4)
 
@@ -161,7 +147,7 @@
             bngmapping = BNGPortMapping(s_tag="ANY", switch_port=4)
             bng_objects.return_value = [bngmapping]
 
-            found_bng = self.sync_step().find_bng(111)
+            found_bng = self.sync_step(model_accessor=self.model_accessor).find_bng(111)
             self.assertTrue(found_bng)
             self.assertEqual(found_bng.switch_port, 4)
 
@@ -170,7 +156,7 @@
             bngmapping = BNGPortMapping(s_tag="100-200", switch_port=4)
             bng_objects.return_value = [bngmapping]
 
-            found_bng = self.sync_step().find_bng(111)
+            found_bng = self.sync_step(model_accessor=self.model_accessor).find_bng(111)
             self.assertTrue(found_bng)
             self.assertEqual(found_bng.switch_port, 4)
 
@@ -196,7 +182,7 @@
                    status_code=200,
                    additional_matcher=functools.partial(match_json, desired_data))
 
-            self.sync_step().sync_record(fsi)
+            self.sync_step(model_accessor=self.model_accessor).sync_record(fsi)
             self.assertTrue(m.called)
 
             self.assertEqual(fsi.backend_handle, "111/of:0000000000000201")
@@ -212,7 +198,7 @@
             serviceinstance_objects.return_value = [fsi]
 
             with self.assertRaises(Exception) as e:
-                self.sync_step().sync_record(fsi)
+                self.sync_step(model_accessor=self.model_accessor).sync_record(fsi)
 
             self.assertEqual(e.exception.message, "Unable to determine BNG port for s_tag 111")
 
@@ -226,7 +212,7 @@
             serviceinstance_objects.return_value = [fsi]
 
             with self.assertRaises(Exception) as e:
-                self.sync_step().sync_record(fsi)
+                self.sync_step(model_accessor=self.model_accessor).sync_record(fsi)
 
             self.assertEqual(e.exception.message, "Waiting for model_policy to run on fcsi 7777")
 
@@ -240,7 +226,7 @@
             serviceinstance_objects.return_value = [fsi]
 
             with self.assertRaises(Exception) as e:
-                self.sync_step().sync_record(fsi)
+                self.sync_step(model_accessor=self.model_accessor).sync_record(fsi)
 
             self.assertEqual(e.exception.message, "Cannot sync FabricCrossconnectServiceInstance if s_tag is None on fcsi 7777")
 
@@ -254,7 +240,7 @@
             serviceinstance_objects.return_value = [fsi]
 
             with self.assertRaises(Exception) as e:
-                self.sync_step().sync_record(fsi)
+                self.sync_step(model_accessor=self.model_accessor).sync_record(fsi)
 
             self.assertEqual(e.exception.message, "Cannot sync FabricCrossconnectServiceInstance if switch_datapath_id is unset on fcsi 7777")
 
@@ -268,7 +254,7 @@
             serviceinstance_objects.return_value = [fsi]
 
             with self.assertRaises(Exception) as e:
-                self.sync_step().sync_record(fsi)
+                self.sync_step(model_accessor=self.model_accessor).sync_record(fsi)
 
             self.assertEqual(e.exception.message, "Cannot sync FabricCrossconnectServiceInstance if source_port is None on fcsi 7777")
 
@@ -289,7 +275,7 @@
                    status_code=204,
                    additional_matcher=functools.partial(match_json, desired_data))
 
-            self.sync_step().delete_record(fsi)
+            self.sync_step(model_accessor=self.model_accessor).delete_record(fsi)
             self.assertTrue(m.called)
 
     def tearDown(self):
