diff --git a/src/core/cntlr_cmdu_generator.c b/src/core/cntlr_cmdu_generator.c
index 4f4d5a6f1a13c13020ce8d7a3f8b9f988fc24183..a3c608425b7ba4ce0848e25cbaa02b81b8b40a70 100644
--- a/src/core/cntlr_cmdu_generator.c
+++ b/src/core/cntlr_cmdu_generator.c
@@ -616,7 +616,7 @@ struct cmdu_buff *cntlr_gen_ap_autoconfig_wsc(struct controller *c,
 	if (ret)
 		goto out;
 
-	ret = cntlr_gen_traffic_sep_policy(c, resp);
+	ret = cntlr_gen_traffic_sep_policy(c, resp, e_band);
 	if (ret)
 		goto out;
 
diff --git a/src/core/cntlr_map.c b/src/core/cntlr_map.c
index 07475bf176df1b9e1c88dd14ed09335380754c0d..42943f66395f71e72298f2fc249594dcf4e214ae 100644
--- a/src/core/cntlr_map.c
+++ b/src/core/cntlr_map.c
@@ -49,6 +49,7 @@
 #include "cntlr_ubus.h"
 
 #include "cntlr_map_debug.h"
+#include "cntlr_cmdu_generator.h"
 #include "cntlr_tlv_generator.h"
 
 int verbose;
@@ -240,8 +241,8 @@ int handle_ap_autoconfig_search(void *cntlr, struct cmdu_buff *rec_cmdu)
 		if (!hwaddr_ntoa(aladdr_origin, mac_str))
 			return -1;
 
-		for (i = 0; i < tv[3][0]->data[0]; i++) {
-			if (tv[3][0]->data[(i+1)] != SUPPORTED_SERVICE_MULTIAP_AGENT)
+		for (i = 1; i <= tv[3][0]->data[0]; i++) {
+			if (tv[3][0]->data[i] != SUPPORTED_SERVICE_MULTIAP_AGENT)
 				continue;
 
 			ret = cntlr_config_add_agent(&c->cfg, mac_str);
diff --git a/src/core/cntlr_tlv_generator.c b/src/core/cntlr_tlv_generator.c
index 984ce596767190bf3f3611d764f3e6d83647960c..c3e184a676e313e70bd48b9d6fc5ff9aa41cb3ff 100644
--- a/src/core/cntlr_tlv_generator.c
+++ b/src/core/cntlr_tlv_generator.c
@@ -137,14 +137,16 @@ int cntlr_gen_8021q_settings(struct controller *c, struct cmdu_buff *frm,
 //	return p;
 }
 
-int cntlr_gen_traffic_sep_policy(struct controller *c, struct cmdu_buff *frm)
+int cntlr_gen_traffic_sep_policy(struct controller *c, struct cmdu_buff *frm,
+		uint8_t *band)
 {
 	struct tlv *t;
 	struct tlv_traffic_sep_policy *data;
 	int ret, i = 0;
 	struct iface_credential *cred;
+	uint8_t *ptr;
 
-	t = cmdu_reserve_tlv(frm, 256);
+	t = cmdu_reserve_tlv(frm, 512);
 	if (!t)
 		return -1;
 
@@ -152,35 +154,53 @@ int cntlr_gen_traffic_sep_policy(struct controller *c, struct cmdu_buff *frm)
 	t->len = 1;
 
 	data = (struct tlv_traffic_sep_policy *) t->data;
-	data->num_ssid = c->cfg.num_fh + c->cfg.num_bk;
+	data->num_ssid = 0;
+
+	ptr = data + 1;
 
 	list_for_each_entry(cred, &c->cfg.fhlist, list) {
-		int len;
+		uint8_t len;
 
-		t->len++; /* vlanid */
-		data->ssid[i].vid = cred->vlanid;
+		if (cred->band != band)
+			continue;
 
 		t->len++; /* len */
 		len = strlen((char *)cred->ssid);
-		data->ssid[i].info.len = len;
+		*ptr = len;
+		ptr++;
 
 		t->len += len; /* ssid */
-		memcpy(data->ssid[i].info.ssid, cred->ssid, len);
+		memcpy(ptr, cred->ssid, len);
+		ptr += len;
+
+		t->len += 2; /* vid */
+		buf_put_be16(ptr, cred->vlanid);
+		ptr += 2;
+
+		data->num_ssid++;
 		i++;
 	}
 
 	list_for_each_entry(cred, &c->cfg.bklist, list) {
-		int len;
+		uint8_t len;
 
-		t->len++; /* vlanid */
-		data->ssid[i].vid = cred->vlanid;
+		if (cred->band != band)
+			continue;
 
 		t->len++; /* len */
 		len = strlen((char *)cred->ssid);
-		data->ssid[i].info.len = len;
+		*ptr = len;
+		ptr++;
 
 		t->len += len; /* ssid */
-		memcpy(data->ssid[i].info.ssid, cred->ssid, len);
+		memcpy(ptr, cred->ssid, len);
+		ptr += len;
+
+		t->len += 2; /* vid */
+		buf_put_be16(ptr, cred->vlanid);
+		ptr += 2;
+
+		data->num_ssid++;
 		i++;
 	}
 
@@ -190,41 +210,7 @@ int cntlr_gen_traffic_sep_policy(struct controller *c, struct cmdu_buff *frm)
 		return -1;
 	}
 
-	dbg("%s %d\n", __func__, __LINE__);
-
 	return 0;
-//	struct tlv_traffic_sep_policy *p;
-//	struct iface_credential *cred;
-//	int i = 0;
-//
-//	p = (struct tlv_traffic_sep_policy *) calloc(1, sizeof(*p));
-//	if (!p)
-//		return NULL;
-//
-//	p->tlv_type = MAP_TLV_TRAFFIC_SEPARATION_POLICY;
-//	p->nbr_ssid = c->cfg.num_fh;
-//	p->data = calloc(p->nbr_ssid, sizeof(*(p->data)));
-//	if (!p->data) {
-//		map_free_tlv_cstruct((uint8_t *) p);
-//		return NULL;
-//	}
-//
-//	list_for_each_entry(cred, &c->cfg.fhlist, list) {
-//		int len;
-//
-//		len = strlen((char *)cred->ssid);
-//
-//		p->data[i].ssid_len = len;
-//		p->data[i].vid = cred->vlanid;
-//		p->data[i].ssid = calloc(1, len + 1);
-//		if (!p->data[i].ssid)
-//			continue;
-//
-//		strncpy(p->data[i].ssid, (char *)cred->ssid, len);
-//		i++;
-//	}
-//
-//	return p;
 }
 
 int cntlr_gen_wsc(struct controller *c, struct cmdu_buff *frm,
@@ -254,8 +240,6 @@ int cntlr_gen_wsc(struct controller *c, struct cmdu_buff *frm,
 	memcpy(cred.key, (char *)iface_cred->key, strlen((char *)iface_cred->key));
 	cred.keylen = strlen((char *)iface_cred->key);
 
-	cred.iop_ext = true;
-
 	cred.mapie |= (iface_cred->multi_ap & 0x01) << 6;
 	cred.mapie |= (iface_cred->mode == AP_WIFI_BBSS ? (1 << 6) : 0);
 	/* fronthaul BSS */
@@ -266,24 +250,10 @@ int cntlr_gen_wsc(struct controller *c, struct cmdu_buff *frm,
 	/* teardown bit */
 	//cred.mapie |= 1 << 4;
 
-	if (!iface_cred->br) {
-		memcpy(cred.bridge, c->cfg.al_bridge, sizeof(c->cfg.al_bridge));
-	} else {
-		cred.vid = iface_cred->br->id;
-		memcpy(cred.bridge, iface_cred->br->network,
-				strlen(iface_cred->br->network));
-		memcpy(cred.proto, iface_cred->br->proto,
-				strlen(iface_cred->br->proto));
-
-		if (!strcmp(cred.proto, "static"))
-			cred.br_ip = iface_cred->br->ipaddr.addr.ip4.s_addr;
-	}
-	memcpy(cred.bk_ssid, iface_cred->bk_ssid, sizeof(iface_cred->bk_ssid));
-	memcpy(cred.bk_key, iface_cred->bk_key, sizeof(iface_cred->bk_key));
-
 	wsc_build_vendor_extension(out, &olen, oui,
 		ATTR_BRIDGE, strlen(iface_cred->br->network), iface_cred->br->network,
 		ATTR_PROTO, strlen(iface_cred->br->proto), iface_cred->br->proto,
+		ATTR_BR_IP, 4, &iface_cred->br->ipaddr.addr.ip4.s_addr,
 		ATTR_VID, 2, &(iface_cred->br->id),
 		ATTR_BK_KEY, strlen(iface_cred->bk_key), iface_cred->bk_key,
 		ATTR_BK_SSID, strlen(iface_cred->bk_ssid), iface_cred->bk_ssid,
diff --git a/src/core/cntlr_tlv_generator.h b/src/core/cntlr_tlv_generator.h
index 3b11b5240f382f4cb2cae08b9584f5a1c74e628f..1ea1919e5cadafd6b72e42a9ffc21fe8899f669b 100644
--- a/src/core/cntlr_tlv_generator.h
+++ b/src/core/cntlr_tlv_generator.h
@@ -13,7 +13,8 @@
 uint8_t *extract_tlv_by_type(struct cmdu_buff *cmdu, uint8_t tlv_type);
 int cntlr_gen_8021q_settings(struct controller *c, struct cmdu_buff *frm,
 		struct agent_policy *a);
-int cntlr_gen_traffic_sep_policy(struct controller *c, struct cmdu_buff *frm);
+int cntlr_gen_traffic_sep_policy(struct controller *c, struct cmdu_buff *frm,
+		uint8_t *band);
 int cntlr_gen_wsc(struct controller *c, struct cmdu_buff *frm,
 		struct iface_credential *iface_cred, uint8_t *msg, uint16_t msglen,
 		uint8_t band);
diff --git a/src/core/config.c b/src/core/config.c
index 74574a7512495bc71d4bc8509fbfaab238fe120e..5f64225c0daa39243194e24436d39862559588c2 100644
--- a/src/core/config.c
+++ b/src/core/config.c
@@ -523,7 +523,7 @@ static int cntlr_config_get_credentials(struct controller_config *c,
 		strncpy((char *) cred->key, tb[CRED_KEY]->v.string, 64);
 
 	if (tb[CRED_VLAN])
-		cred->vlanid = atoi(tb[CRED_VLAN]->v.string);
+		cred->vlanid = (uint16_t) atoi(tb[CRED_VLAN]->v.string);
 
 	if (tb[CRED_MAP])
 		cred->multi_ap = atoi(tb[CRED_MAP]->v.string);