diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ee40bb3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+.idea/
+*.pyc
\ No newline at end of file
diff --git a/xos/synchronizer/model_policies/model_policy_volttenant.py b/xos/synchronizer/model_policies/model_policy_volttenant.py
index 32bc036..a7da0bd 100644
--- a/xos/synchronizer/model_policies/model_policy_volttenant.py
+++ b/xos/synchronizer/model_policies/model_policy_volttenant.py
@@ -24,8 +24,15 @@
         return self.handle_update(tenant)
 
     def handle_update(self, tenant):
+
+        if (tenant.link_deleted_count > 0) and (not tenant.provided_links.exists()):
+            # If this instance has no links pointing to it, delete
+            self.handle_delete(tenant)
+            if VOLTTenant.objects.filter(id=tenant.id).exists():
+                tenant.delete()
+            return
+
         self.manage_vsg(tenant)
-        self.manage_subscriber(tenant)
         self.cleanup_orphans(tenant)
 
     def handle_delete(self, tenant):
@@ -76,27 +83,6 @@
         if cur_vsg is None:
             self.create_vsg(tenant)
 
-    def manage_subscriber(self, tenant):
-        # check for existing link to a root
-        links = tenant.provided_links.all()
-        for link in links:
-            roots = CordSubscriberRoot.objects.filter(id = link.subscriber_service_instance.id)
-            if roots:
-                return
-
-        subs = CordSubscriberRoot.objects.filter(service_specific_id = tenant.service_specific_id)
-        if subs:
-            self.logger.info("MODEL_POLICY: volttenant %s using existing subscriber root" % tenant)
-            sub = subs[0]
-        else:
-            self.logger.info("MODEL_POLICY: volttenant %s creating new subscriber root" % tenant)
-            sub = CordSubscriberRoot(service_specific_id = tenant.service_specific_id,
-                                     name = "autogenerated-for-vOLT-%s" % tenant.id)
-            sub.save()
-
-        link = ServiceInstanceLink(provider_service_instance = tenant, subscriber_service_instance = sub)
-        link.save()
-
     def cleanup_orphans(self, tenant):
         # ensure vOLT only has one vCPE
         cur_vsg = self.get_current_vsg(tenant)
diff --git a/xos/synchronizer/model_policies/test_model_policy_volttenant.py b/xos/synchronizer/model_policies/test_model_policy_volttenant.py
index b3edf3f..3e27dee 100644
--- a/xos/synchronizer/model_policies/test_model_policy_volttenant.py
+++ b/xos/synchronizer/model_policies/test_model_policy_volttenant.py
@@ -81,10 +81,8 @@
 
     def test_handle_create(self):
         with patch.object(VOLTTenantPolicy, "manage_vsg") as manage_vsg, \
-                patch.object(VOLTTenantPolicy, "manage_subscriber") as manage_subscriber, \
                 patch.object(VOLTTenantPolicy, "cleanup_orphans") as cleanup_orphans:
             self.policy.handle_create(self.tenant)
-            manage_subscriber.assert_called_with(self.tenant)
             manage_vsg.assert_called_with(self.tenant)
             cleanup_orphans.assert_called_with(self.tenant)
 
@@ -136,63 +134,6 @@
             self.assertEqual(link.provider_service_instance, vsg)
             self.assertEqual(link.subscriber_service_instance, self.tenant)
 
-    def test_manage_subscriber(self):
-        with patch.object(ServiceInstanceLink, "save", autospec=True) as save_link, \
-                patch.object(CordSubscriberRoot, "save", autospec=True) as save_csr:
-
-            self.tenant.provided_links = MockObjectList()
-
-            self.policy.manage_subscriber(self.tenant)
-
-            self.assertEqual(save_csr.call_count, 1)
-            csr = save_csr.call_args[0][0]
-
-            self.assertEqual(save_link.call_count, 1)
-            link = save_link.call_args[0][0]
-            self.assertEqual(link.provider_service_instance, self.tenant)
-            self.assertEqual(link.subscriber_service_instance, csr)
-
-    def test_manage_subscriber_exists(self):
-        with patch.object(ServiceInstanceLink, "save", autospec=True) as save_link, \
-                patch.object(CordSubscriberRoot, "save", autospec=True) as save_csr, \
-                patch.object(CordSubscriberRoot.objects, "get_items") as csr_items, \
-                patch.object(ServiceInstanceLink.objects, "get_items") as link_items:
-            self.tenant.provided_links = MockObjectList()
-
-            subscriber = CordSubscriberRoot(service_specific_id=1234)
-            csr_items.return_value = [subscriber]
-
-            link = ServiceInstanceLink(provider_service_instance= self.tenant, subscriber_service_instance = subscriber)
-            link_items.return_value = [link]
-
-            self.tenant.provided_links = MockObjectList(initial=[link])
-
-            self.policy.manage_subscriber(self.tenant)
-
-            self.assertEqual(save_csr.call_count, 0)
-            self.assertEqual(save_link.call_count, 0)
-
-    def test_manage_subscriber_exists_nolink(self):
-        with patch.object(ServiceInstanceLink, "save", autospec=True) as save_link, \
-                patch.object(CordSubscriberRoot, "save", autospec=True) as save_csr, \
-                patch.object(CordSubscriberRoot.objects, "get_items") as csr_items, \
-                patch.object(ServiceInstanceLink.objects, "get_items") as link_items:
-            self.tenant.provided_links = MockObjectList()
-
-            subscriber = CordSubscriberRoot(service_specific_id=1234)
-            csr_items.return_value = [subscriber]
-
-            self.tenant.provided_links = MockObjectList()
-
-            self.policy.manage_subscriber(self.tenant)
-
-            self.assertEqual(save_csr.call_count, 0)
-
-            self.assertEqual(save_link.call_count, 1)
-            link = save_link.call_args[0][0]
-            self.assertEqual(link.provider_service_instance, self.tenant)
-            self.assertEqual(link.subscriber_service_instance, subscriber)
-
     def test_handle_delete(self):
         self.policy.handle_delete(self.tenant)
         # handle delete does nothing, and should trivially succeed
