diff --git a/src/cntlr_cmdu.c b/src/cntlr_cmdu.c
index 087cc5b6ac6ef5fcf8ead78335dadba4f8e959cb..bfb4bf03723e20719299e676ca11bdb667bcb14d 100644
--- a/src/cntlr_cmdu.c
+++ b/src/cntlr_cmdu.c
@@ -468,7 +468,6 @@ struct cmdu_buff *cntlr_gen_ap_autoconfig_search(struct controller *c,
 	int ret = 0;
 	uint16_t mid = 0;
 	uint8_t origin[6] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x13};
-	uint8_t role;
 
 	frm = cmdu_alloc_simple(CMDU_TYPE_AP_AUTOCONFIGURATION_SEARCH, &mid);
 	if (!frm) {
@@ -490,9 +489,7 @@ struct cmdu_buff *cntlr_gen_ap_autoconfig_search(struct controller *c,
 	if (ret)
 		goto out;
 
-	role = (c->state == CNTLR_INIT ? SUPPORTED_SERVICE_MULTIAP_AGENT :
-			SUPPORTED_SERVICE_MULTIAP_CONTROLLER);
-	ret = cntlr_gen_supp_service(c, frm, role);
+	ret = cntlr_gen_supp_service(c, frm);
 	if (ret)
 		goto out;
 
@@ -543,7 +540,7 @@ struct cmdu_buff *cntlr_gen_ap_autoconfig_response(struct controller *c,
 	if (ret)
 		goto out;
 
-	ret = cntlr_gen_supp_service(c, resp, SUPPORTED_SERVICE_MULTIAP_CONTROLLER);
+	ret = cntlr_gen_supp_service(c, resp);
 	if (ret)
 		goto out;
 
diff --git a/src/cntlr_map.c b/src/cntlr_map.c
index 88d0d4ccce21fde6c1ae31cedaf9cac550d06e80..832376a5d80719ce4c182ac19462e3de56aee3f3 100644
--- a/src/cntlr_map.c
+++ b/src/cntlr_map.c
@@ -957,6 +957,13 @@ int handle_ap_autoconfig_search(void *cntlr, struct cmdu_buff *rx_cmdu,
 	int ret = 0;
 	char freq_band[8] = {0};
 
+	if (cmdu_get_mid(rx_cmdu) == c->mid_5g ||
+	    cmdu_get_mid(rx_cmdu) == c->mid_2g) {
+		dbg("|%s:%d| Drop search from self!\n", __func__,
+		    __LINE__);
+		return -1;
+	}
+
 	t = map_cmdu_get_tlv(rx_cmdu, TLV_TYPE_AL_MAC_ADDRESS_TYPE);
 	if (!t) {
 		dbg("|%s:%d| Malformed topology notification!\n", __func__,
diff --git a/src/cntlr_tlv.c b/src/cntlr_tlv.c
index edc773196ba70f8c4a9ee856d208f712e42445be..6f2122acee5cd3f304c3b5b18977106c175c43b7 100644
--- a/src/cntlr_tlv.c
+++ b/src/cntlr_tlv.c
@@ -358,20 +358,30 @@ int cntlr_gen_supp_role(struct controller *c, struct cmdu_buff *frm,
 	return 0;
 }
 
-int cntlr_gen_supp_service(struct controller *c, struct cmdu_buff *frm,
-		uint8_t service)
+int cntlr_gen_supp_service(struct controller *c, struct cmdu_buff *frm)
 {
 	struct tlv *t;
 	int ret;
+	int num = 0;
+	struct tlv_supported_service *t_supp_serv;
 
 	t = cmdu_reserve_tlv(frm, 256);
 	if (!t)
 		return -1;
 
 	t->type = MAP_TLV_SUPPORTED_SERVICE;
-	t->len = 2;
-	t->data[0] = 0x1;
-	t->data[1] = service;
+	t_supp_serv = (struct tlv_supported_service *) t->data;
+
+	if (c->state != CNTLR_INIT) {
+		t_supp_serv->services[num++] = SUPPORTED_SERVICE_MULTIAP_CONTROLLER;
+
+		if (cntlr_find_node(c, c->almac))
+			t_supp_serv->services[num++] = SUPPORTED_SERVICE_MULTIAP_AGENT;
+	} else
+		t_supp_serv->services[num++] = SUPPORTED_SERVICE_MULTIAP_AGENT;
+
+	t_supp_serv->num_services = num;
+	t->len = num + 1;
 
 	ret = cmdu_put_tlv(frm, t);
 	if (ret) {
diff --git a/src/cntlr_tlv.h b/src/cntlr_tlv.h
index 672ce35c6ea2dcc293856b70550c98265906918b..a04286ef27564f7cae0ee11ca8b77f4a85def0e1 100644
--- a/src/cntlr_tlv.h
+++ b/src/cntlr_tlv.h
@@ -34,8 +34,7 @@ int cntlr_gen_ap_radio_identifier(struct controller *c, struct cmdu_buff *frm,
 		uint8_t *hwaddr);
 int cntlr_gen_supp_role(struct controller *c, struct cmdu_buff *frm,
 		uint8_t role);
-int cntlr_gen_supp_service(struct controller *c, struct cmdu_buff *cmdu,
-		uint8_t service);
+int cntlr_gen_supp_service(struct controller *c, struct cmdu_buff *cmdu);
 int cntlr_gen_map_profile(struct controller *c, struct cmdu_buff *frm,
 		uint8_t profile);
 int cntlr_gen_steering_policy(struct controller *c,