diff --git a/xos/cord/models.py b/xos/cord/models.py
index 44ced17..483b76b 100644
--- a/xos/cord/models.py
+++ b/xos/cord/models.py
@@ -197,9 +197,6 @@
         proxy = True
 
     def allocate_bbs_account(self):
-        # XXX fixme XXX
-        return "bbs01@onlab.us"
-
         vcpes = VCPETenant.get_tenant_objects().all()
         bbs_accounts = [vcpe.bbs_account for vcpe in vcpes]
 
@@ -643,7 +640,9 @@
     KIND = "vBNG"
 
     default_attributes = {"routeable_subnet": "",
-                          "mapped_ip": ""}
+                          "mapped_ip": "",
+                          "mapped_mac": "",
+                          "mapped_hostname": ""}
 
     @property
     def routeable_subnet(self):
@@ -660,3 +659,19 @@
     @mapped_ip.setter
     def mapped_ip(self, value):
         self.set_attribute("mapped_ip", value)
+
+    @property
+    def mapped_mac(self):
+        return self.get_attribute("mapped_mac", self.default_attributes["mapped_mac"])
+
+    @mapped_mac.setter
+    def mapped_mac(self, value):
+        self.set_attribute("mapped_mac", value)
+
+    @property
+    def mapped_hostname(self):
+        return self.get_attribute("mapped_hostname", self.default_attributes["mapped_hostname"])
+
+    @mapped_hostname.setter
+    def mapped_hostname(self, value):
+        self.set_attribute("mapped_hostname", value)
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()
 
diff --git a/xos/observers/vcpe/steps/sync_vcpetenant.py b/xos/observers/vcpe/steps/sync_vcpetenant.py
index a29ba09..d2afed5 100644
--- a/xos/observers/vcpe/steps/sync_vcpetenant.py
+++ b/xos/observers/vcpe/steps/sync_vcpetenant.py
@@ -113,8 +113,13 @@
         run_template_ssh(self.template_name, fields)
 
         if o.url_filter_enable:
-            bbs = BBS(o.bbs_account, "123")
-            bbs.sync(o.url_filter_level, o.users)
+            if (str(o.service_specific_id) != "SYNCME"):
+                # XXX FIXME
+                # Also fix the spot in cord/models.py
+                logger.info("skipping sync of URL filter for SSID %s" % str(o.service_specific_id))
+            else:
+                bbs = BBS(o.bbs_account, "123")
+                bbs.sync(o.url_filter_level, o.users)
 
         o.save()
 
diff --git a/xos/observers/vcpe/templates/start-vcpe.sh.j2 b/xos/observers/vcpe/templates/start-vcpe.sh.j2
index 07004a1..c199bb3 100755
--- a/xos/observers/vcpe/templates/start-vcpe.sh.j2
+++ b/xos/observers/vcpe/templates/start-vcpe.sh.j2
@@ -15,7 +15,7 @@
 # Set up networking via pipework
 docker exec vcpe ifconfig eth0 >> /dev/null || pipework eth4 -i eth0 vcpe {{ wan_ip }}/17@192.168.128.1 {{ wan_mac }}
 docker exec vcpe ifconfig eth1 >> /dev/null || pipework eth3 -i eth1 vcpe 192.168.0.1/24 @{{ vlan_ids[0] }}
-docker exec vcpe ifconfig eth2 >> /dev/null || pipework eth0 -i eth2 vcpe {{ hpc_client_ip }}/16
+docker exec vcpe ifconfig eth2 >> /dev/null || pipework eth0 -i eth2 vcpe {{ hpc_client_ip }}/24
 
 # Now can start up dnsmasq
 docker exec vcpe service dnsmasq start
