diff --git a/xos/synchronizer/steps/sync_onos_netcfg.py b/xos/synchronizer/steps/sync_onos_netcfg.py
index b084a66..67dc878 100644
--- a/xos/synchronizer/steps/sync_onos_netcfg.py
+++ b/xos/synchronizer/steps/sync_onos_netcfg.py
@@ -48,18 +48,18 @@
                                   name=tagname)
         return tags[0].value
 
-    def get_tenants_who_want_config(self):
-        tenants = []
+    def get_service_instances_who_want_config(self):
+        service_instances = []
         # attribute is comma-separated list
         for ta in ServiceInstanceAttribute.objects.filter(name="autogenerate"):
             if ta.value:
                 for config in ta.value.split(','):
                     if config == "vtn-network-cfg":
-                        tenants.append(ta.service_instance)
-        return tenants
+                        service_instances.append(ta.service_instance)
+        return service_instances
 
-    def save_tenant_attribute(self, tenant, name, value):
-        tas = ServiceInstanceAttribute.objects.filter(service_instance_id=tenant.id, name=name)
+    def save_service_instance_attribute(self, service_instance, name, value):
+        tas = ServiceInstanceAttribute.objects.filter(service_instance_id=service_instance.id, name=name)
         if tas:
             ta = tas[0]
             if ta.value != value:
@@ -68,7 +68,7 @@
                 ta.save()
         else:
             logger.info("saving autogenerated config %s" % name)
-            ta = model_accessor.create_obj(ServiceInstanceAttribute, service_instance=tenant, name=name, value=value)
+            ta = model_accessor.create_obj(ServiceInstanceAttribute, service_instance=service_instance, name=name, value=value)
             ta.save()
 
     # This function currently assumes a single Deployment and Site
@@ -167,23 +167,26 @@
             data["apps"]["org.opencord.vtn"]["cordvtn"]["nodes"].append(node_dict)
 
         # Generate apps->org.onosproject.cordvtn->cordvtn->publicGateways
-        # Pull the gateway information from vRouter
-        if model_accessor.has_model_class("VRouterService"):
-            vrouters = VRouterService.objects.all()
-            if vrouters:
-                for gateway in vrouters[0].get_gateways():
-                    gatewayIp = gateway['gateway_ip'].split('/',1)[0]
-                    gatewayMac = gateway['gateway_mac']
-                    gateway_dict = {
-                        "gatewayIp": gatewayIp,
-                        "gatewayMac": gatewayMac
-                    }
-                    data["apps"]["org.opencord.vtn"]["cordvtn"]["publicGateways"].append(gateway_dict)
-        else:
-            logger.info("No VRouter service present, not adding publicGateways to config")
+        # Pull the gateway information from Address Pool objects
+        for ap in AddressPool.objects.all():
+            if (not ap.gateway_ip) or (not ap.gateway_mac):
+                logger.info("Gateway_ip or gateway_mac is blank for addresspool %s. Skipping." % ap)
+                continue
+
+            gateway_dict = {
+                "gatewayIp": ap.gateway_ip,
+                "gatewayMac": ap.gateway_mac
+            }
+            data["apps"]["org.opencord.vtn"]["cordvtn"]["publicGateways"].append(gateway_dict)
+
+        if not AddressPool.objects.all().exists():
+            logger.info("No Address Pools present, not adding publicGateways to config")
 
         return json.dumps(data, indent=4, sort_keys=True)
 
+    # TODO: Does this step execute every 5 seconds regardless of whether objects have changed?
+    #       If so, what purpose does using watchers serve?
+
     def call(self, **args):
         vtn_service = VTNService.objects.all()
         if not vtn_service:
@@ -194,6 +197,6 @@
         # Check for autogenerate attribute
         netcfg = self.get_onos_netcfg(vtn_service)
 
-        tenants = self.get_tenants_who_want_config()
-        for tenant in tenants:
-            self.save_tenant_attribute(tenant, "rest_onos/v1/network/configuration/", netcfg)
+        service_instances = self.get_service_instances_who_want_config()
+        for service_instance in service_instances:
+            self.save_service_instance_attribute(service_instance, "rest_onos/v1/network/configuration/", netcfg)
