diff --git a/xos/synchronizer/steps/sync_vroutertenant.py b/xos/synchronizer/steps/sync_vroutertenant.py
index 3fa95a4..c20795a 100644
--- a/xos/synchronizer/steps/sync_vroutertenant.py
+++ b/xos/synchronizer/steps/sync_vroutertenant.py
@@ -1,16 +1,10 @@
 import os
 import base64
 from collections import defaultdict
-from django.db.models import F, Q
 from xos.config import Config
-from synchronizers.base.syncstep import *
-from core.models import Controller
-from core.models import Image, ControllerImages
+from synchronizers.new_base.syncstep import SyncStep, DeferredException
+from synchronizers.new_base.modelaccessor import *
 from xos.logger import observer_logger as logger
-from synchronizers.base.ansible_helper import *
-from services.vrouter.models import VRouterTenant
-from services.onos.models import ONOSService
-from services.fabric.models import FabricService
 import json
 
 class SyncVRouterTenant(SyncStep):
@@ -21,27 +15,32 @@
 
     def get_fabric_onos_service(self):
         fos = None
-        fs = FabricService.get_service_objects().all()[0]
+        fs = FabricService.objects.first()
         if fs.subscribed_tenants.exists():
-            app = fs.subscribed_tenants.all()[0]
+            app = fs.subscribed_tenants.first()
             if app.provider_service:
                 ps = app.provider_service
-                fos = ONOSService.get_service_objects().filter(id=ps.id)[0]
+                fos = ONOSService.objects.filter(id=ps.id)[0]
         return fos
 
     def get_node_tag(self, node, tagname):
         tags = Tag.select_by_content_object(node).filter(name=tagname)
-        return tags[0].value
-
-    def fetch_pending(self, deleted):
-        fs = FabricService.get_service_objects().all()[0]
-        if not fs.autoconfig:
+        if tags:
+            return tags[0].value
+        else:
             return None
 
+    def fetch_pending(self, deleted):
+        fs = FabricService.objects.first()
+        if (not fs) or (not fs.autoconfig):
+            return None
+
+        # TODO: Why is this a nonstandard synchronizer query?
+
         if (not deleted):
-            objs = VRouterTenant.get_tenant_objects().filter(Q(lazy_blocked=False))
+            objs = VRouterTenant.objects.all()
         else:
-            objs = VRouterTenant.get_deleted_tenant_objects()
+            objs = VRouterTenant.deleted_objects.all()
 
         objs = list(objs)
 
@@ -50,10 +49,16 @@
             # Do we have a vCPE subscriber_tenant?
             if vroutertenant.subscriber_tenant:
                 sub = vroutertenant.subscriber_tenant
-                if sub.kind != 'vCPE' or not sub.get_attribute("instance_id"):
+                if sub.kind != 'vCPE':
                     objs.remove(vroutertenant)
+                else:
+                    # coerce the subscriber tenant over to the VSGTenant
+                    vsg = VSGTenant.objects.filter(id=sub.id).first()
+                    if not vsg.instance:
+                        objs.remove(vroutertenant)
             else:
                 # Maybe the VRouterTenant is for an instance
+                # TODO: tenant_for_instance_id needs to be a real database field
                 instance_id = vroutertenant.get_attribute("tenant_for_instance_id")
                 if not instance_id:
                     objs.remove(vroutertenant)
@@ -77,8 +82,9 @@
         # * Get the "location" tag, push to the fabric
         if vroutertenant.subscriber_tenant:
             sub = vroutertenant.subscriber_tenant
-            instance_id = sub.get_attribute("instance_id")
-            instance = Instance.objects.filter(id=instance_id)[0]
+            assert(sub.kind == 'vCPE')
+            vsg = VSGTenant.objects.filter(id=sub.id).first()
+            instance = vsg.instance
             name = str(sub)
         else:
             instance_id = vroutertenant.get_attribute("tenant_for_instance_id")
@@ -88,6 +94,9 @@
         node = instance.node
         location = self.get_node_tag(node, "location")
 
+        if not location:
+            raise DeferredException("No location tag for node %s tenant %s -- skipping" % (str(node), str(vroutertenant)))
+
         # Create JSON
         data = {
             "%s/-1" % vroutertenant.public_mac : {
