diff --git a/xos/synchronizer/model_policies/model_policy_voltserviceinstance.py b/xos/synchronizer/model_policies/model_policy_voltserviceinstance.py
index 227efa9..1321955 100644
--- a/xos/synchronizer/model_policies/model_policy_voltserviceinstance.py
+++ b/xos/synchronizer/model_policies/model_policy_voltserviceinstance.py
@@ -39,34 +39,17 @@
         pass
 
     def create_eastbound_instance(self, si):
-
-        chain = si.subscribed_links.all()
-
-        # Already has a chain
-        if len(chain) > 0 and not si.is_new:
-            self.logger.debug("MODEL_POLICY: VOLTServiceInstance %s is already part of a chain" % si.id)
-            return
-
-        # if it does not have a chain,
-        # Find links to the next element in the service chain
-        # and create one
-
         links = si.owner.subscribed_dependencies.all()
-
         for link in links:
             # SEBA-216 prevent any attempt to create an ONOSServiceInstance
             if "onos" in link.provider_service.name.lower():
                 continue
 
-            si_class = link.provider_service.get_service_instance_class_name()
-            self.logger.info("MODEL_POLICY: VOLTServiceInstance %s creating %s" % (si, si_class))
+            provider_service = link.provider_service.leaf_model
 
-            eastbound_si_class = model_accessor.get_model_class(si_class)
-            eastbound_si = eastbound_si_class()
-            eastbound_si.owner_id = link.provider_service_id
-            eastbound_si.save()
-            link = ServiceInstanceLink(provider_service_instance=eastbound_si, subscriber_service_instance=si)
-            link.save()
+            valid_provider_service_instance = provider_service.validate_links(si)
+            if not valid_provider_service_instance:
+                provider_service.acquire_service_instance(si)
 
     def associate_onu_device(self, si):
 
diff --git a/xos/synchronizer/model_policies/test_model_policy_voltserviceinstance.py b/xos/synchronizer/model_policies/test_model_policy_voltserviceinstance.py
index e6fb171..f129de5 100644
--- a/xos/synchronizer/model_policies/test_model_policy_voltserviceinstance.py
+++ b/xos/synchronizer/model_policies/test_model_policy_voltserviceinstance.py
@@ -88,9 +88,14 @@
         with patch.object(ServiceInstanceLink, "save", autospec=True) as save_link, \
             patch.object(VSGServiceInstance, "save", autospec=True) as save_vsg:
 
+            subscriber_si = Mock()
+
             link = Mock()
             link.provider_service.get_service_instance_class_name.return_value = "VSGServiceInstance"
             link.provider_service.name = "FabricCrossconnect"
+            link.provider_service.validate_links = Mock(return_value=[])
+            link.provider_service.acquire_service_instance = Mock(return_value=subscriber_si)
+            link.provider_service.leaf_model = link.provider_service
 
             si = Mock()
             si.subscribed_links.all.return_value = []
@@ -98,17 +103,30 @@
 
             self.policy.create_eastbound_instance(si)
 
-            # Should have created a vsg
+            link.provider_service.validate_links.assert_called_with(si)
+            link.provider_service.acquire_service_instance.assert_called_with(si)
 
-            self.assertEqual(save_vsg.call_count, 1)
-            vsg = save_vsg.call_args[0][0]
+    def test_create_vsg_already_exists(self):
+        with patch.object(ServiceInstanceLink, "save", autospec=True) as save_link, \
+            patch.object(VSGServiceInstance, "save", autospec=True) as save_vsg:
 
-            # Should have created a link from OLT to vsg
+            subscriber_si = Mock()
 
-            self.assertEqual(save_link.call_count, 1)
-            link = save_link.call_args[0][0]
-            self.assertEqual(link.provider_service_instance, vsg)
-            self.assertEqual(link.subscriber_service_instance, si)
+            link = Mock()
+            link.provider_service.get_service_instance_class_name.return_value = "VSGServiceInstance"
+            link.provider_service.name = "FabricCrossconnect"
+            link.provider_service.validate_links = Mock(return_value=subscriber_si)
+            link.provider_service.acquire_service_instance = Mock()
+            link.provider_service.leaf_model = link.provider_service
+
+            si = Mock()
+            si.subscribed_links.all.return_value = []
+            si.owner.subscribed_dependencies.all.return_value = [link]
+
+            self.policy.create_eastbound_instance(si)
+
+            link.provider_service.validate_links.assert_called_with(si)
+            link.provider_service.acquire_service_instance.assert_not_called()
 
     def test_associate_onu(self):
         with patch.object(ServiceInstance.objects, "get") as get_si, \
