diff --git a/xos/core/xoslib/methods/cordsubscriber.py b/xos/core/xoslib/methods/cordsubscriber.py
index 5992a2e..79a1442 100644
--- a/xos/core/xoslib/methods/cordsubscriber.py
+++ b/xos/core/xoslib/methods/cordsubscriber.py
@@ -367,7 +367,7 @@
         mappings = []
         for vbng in object_list:
             if vbng.mapped_ip and vbng.routeable_subnet:
-                mappings.append( {"private_ip": vbng.mapped_ip, "routeable_subnet": vbng.routeable_subnet} )
+                mappings.append( {"private_ip": vbng.mapped_ip, "routeable_subnet": vbng.routeable_subnet, "mac": vbng.mapped_mac, "hostname": vbng.mapped_hostname} )
 
         return Response( {"vbng_mapping": mappings} )
 
diff --git a/xos/observers/vbng/steps/sync_vbngtenant.py b/xos/observers/vbng/steps/sync_vbngtenant.py
index b0dd345..9dec0de 100644
--- a/xos/observers/vbng/steps/sync_vbngtenant.py
+++ b/xos/observers/vbng/steps/sync_vbngtenant.py
@@ -40,7 +40,7 @@
         logger.info("defer object %s due to %s" % (str(o), reason))
         raise Exception("defer object %s due to %s" % (str(o), reason))
 
-    def get_private_ip(self, o):
+    def get_private_interface(self, o):
         vcpes = VCPETenant.get_tenant_objects().all()
         vcpes = [x for x in vcpes if (x.vbng is not None) and (x.vbng.id == o.id)]
         if not vcpes:
@@ -54,30 +54,31 @@
         if not sliver:
             raise Exception("No sliver associated with vBNG %s" % str(o.id))
 
-        external_ns = None
-        for ns in sliver.networkslivers.all():
-            if (ns.ip) and ("WAN" in ns.network.template.name):
-                external_ns = ns
+        if not vcpe.wan_ip:
+            self.defer_sync(o, "does not have a WAN IP yet")
 
-        if not external_ns:
-            self.defer_sync(o, "WAN network is not filled in yet")
-            return
+        if not vcpe.wan_mac:
+            # this should never happen; WAN MAC is computed from WAN IP
+            self.defer_sync(o, "does not have a WAN MAC yet")
 
-        return external_ns.ip
+        return (vcpe.wan_ip, vcpe.wan_mac, vcpe.sliver.node.name)
 
     def sync_record(self, o):
         logger.info("sync'ing VBNGTenant %s" % str(o))
 
         if not o.routeable_subnet:
-            private_ip = self.get_private_ip(o)
-            logger.info("contacting vBNG service to request mapping for private ip %s" % private_ip)
+            (private_ip, private_mac, private_hostname) = self.get_private_interface(o)
+            logger.info("contacting vBNG service to request mapping for private ip %s mac %s host %s" % (private_ip, private_mac, private_hostname) )
 
-            r = requests.post(VBNG_API + "%s" % private_ip, )
+            r = requests.post(VBNG_API + "%s" % (private_ip,) )
+            #r = requests.post(VBNG_API + "%s/%s/%s" % (private_ip, private_mac, private_hostname) )
             if (r.status_code != 200):
                 raise Exception("Received error from bng service (%d)" % r.status_code)
             logger.info("received public IP %s from private IP %s" % (r.text, private_ip))
             o.routeable_subnet = r.text
             o.mapped_ip = private_ip
+            c.mapped_mac = private_mac
+            c.mapped_hostname = private_hostname
 
         o.save()
 
