diff --git a/xos/synchronizer/model_policies/model_policy_rcordsubscriber.py b/xos/synchronizer/model_policies/model_policy_rcordsubscriber.py
new file mode 100644
index 0000000..af9dba9
--- /dev/null
+++ b/xos/synchronizer/model_policies/model_policy_rcordsubscriber.py
@@ -0,0 +1,60 @@
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+from synchronizers.new_base.modelaccessor import VOLTTenant, ServiceInstanceLink
+from synchronizers.new_base.policy import Policy
+
+class RCORDSubscriberPolicy(Policy):
+    model_name = "CordSubscriberRoot"
+
+    def handle_create(self, si):
+        return self.handle_update(si)
+
+    def handle_update(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: Subscriber %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:
+            ps = link.provider_service.leaf_model
+
+            # FIXME we should use get_service_instance_class here to support the general case.
+            # we don't know what the next service in the chain will be
+
+            if ps.model_name is "VOLTService":
+                volt = VOLTTenant(name="volt-for-subscriber-%s" % si.id)
+                volt.save()
+
+                si_link = ServiceInstanceLink(
+                    provider_service_instance=volt,
+                    subscriber_service_instance=si
+                )
+                si_link.save()
+
+        print links
+
+
+    def handle_delete(self, si):
+        pass
diff --git a/xos/synchronizer/model_policies/test_config.yaml b/xos/synchronizer/model_policies/test_config.yaml
new file mode 100644
index 0000000..270d0a9
--- /dev/null
+++ b/xos/synchronizer/model_policies/test_config.yaml
@@ -0,0 +1,30 @@
+
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+name: test-model-policies
+accessor:
+  username: xosadmin@opencord.org
+  password: "sample"
+  kind: "testframework"
+logging:
+  version: 1
+  handlers:
+    console:
+      class: logging.StreamHandler
+  loggers:
+    'multistructlog':
+      handlers:
+          - console
diff --git a/xos/synchronizer/model_policies/test_model_policy_rcordsubscriber.py b/xos/synchronizer/model_policies/test_model_policy_rcordsubscriber.py
new file mode 100644
index 0000000..ea88667
--- /dev/null
+++ b/xos/synchronizer/model_policies/test_model_policy_rcordsubscriber.py
@@ -0,0 +1,119 @@
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import unittest
+from mock import patch, MagicMock
+import mock
+from xosconfig import Config
+
+import os, sys
+
+cwd=os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
+xos_dir=os.path.abspath(os.path.join(cwd, "../../../../../../orchestration/xos/xos"))
+# services_dir=os.path.join(xos_dir, "../../xos_services")
+config_file = os.path.join(cwd, "test_config.yaml")
+
+# NOTE this have to start for xos_services
+# RCORD_XPROTO = "../profiles/rcord/xos/synchronizer/models/rcord.xproto"
+# OLT_XPROTO = "olt-service/xos/synchronizer/models/volt.xproto"
+
+Config.clear()
+Config.init(config_file, 'synchronizer-config-schema.yaml')
+
+# FIXME move the synchronizer framework into a library
+sys.path.append(xos_dir)
+# from synchronizers.new_base.mock_modelaccessor_build import build_mock_modelaccessor
+from synchronizers.new_base.modelaccessor import model_accessor
+
+from model_policy_rcordsubscriber import RCORDSubscriberPolicy
+
+class MockSubscriber:
+
+    def __init__(self, *args, **kwargs):
+        self.name = kwargs['name']
+        self.is_new = True
+        self.id = 1
+
+    def subscribed_links(self):
+        pass
+
+class MockAll:
+    @staticmethod
+    def all():
+        pass
+
+class MockService:
+
+    def __init__(self):
+        self.subscribed_dependencies = MockAll
+
+
+class MockModel:
+    def __init__(self):
+        self.model_name = "VOLTService"
+
+class MockLeaf:
+    def __init__(self):
+        self.leaf_model = MockModel()
+
+class MockLink:
+    def __init__(self):
+        self.provider_service = MockLeaf()
+
+class TestModelPolicyRCORDSubscriber(unittest.TestCase):
+    def setUp(self):
+        self.original_sys_path = sys.path
+
+        # Generate a fake model accessor (emulate the client library)
+        # build_mock_modelaccessor(xos_dir, services_dir, [RCORD_XPROTO, OLT_XPROTO])
+
+        # import all class names to globals
+        for (k, v) in model_accessor.all_model_classes.items():
+            globals()[k] = v
+
+        # model_accessor.reset_all_object_stores()
+
+        # create base objects for testing
+        self.policy = RCORDSubscriberPolicy()
+
+    def tearDown(self):
+        sys.path = self.original_sys_path
+
+    @patch.object(MockSubscriber, 'subscribed_links', MockAll)
+    @patch.object(MockAll, 'all', MagicMock(return_value=['foo']))
+    def test_update_and_do_nothing(self):
+        si = MockSubscriber(name="myTestSubscriber")
+        si.is_new = False
+        self.policy.handle_create(si)
+        # NOTE assert that no models are created
+
+    @patch.object(MockSubscriber, 'subscribed_links', MockAll)
+    @patch.object(MockAll, 'all', MagicMock(return_value=[MockLink]))
+    def test_create(self):
+        si = MockSubscriber(name="myTestSubscriber")
+        owner = MockService()
+
+        si.owner = owner
+
+        with patch.object(owner.subscribed_dependencies, 'all', MagicMock(return_value=[MockLink()])), \
+             patch.object(VOLTTenant, "save", autospec=True) as save_volt, \
+             patch.object(ServiceInstanceLink, "save", autospec=True) as save_link:
+            self.policy.handle_create(si)
+            self.assertEqual(save_link.call_count, 1)
+            self.assertEqual(save_volt.call_count, 1)
+
+
+if __name__ == '__main__':
+    unittest.main()
\ No newline at end of file
