diff --git a/src/cntlr.c b/src/cntlr.c
index 4cac2c13402b97b8e87af677076ae718653863b6..d7599429d920fb5b377d0f714836f3225bb7222f 100644
--- a/src/cntlr.c
+++ b/src/cntlr.c
@@ -1310,16 +1310,27 @@ struct node *cntlr_alloc_node(struct controller *c, uint8_t *almac)
 	return n;
 }
 
+static void cntlr_remove_sta(struct controller *c, struct sta *s)
+{
+	uint8_t macaddr[6];
+
+	memcpy(macaddr, s->de_sta->macaddr, 6);
+	free_bcn_metrics(c, s);
+	cntlr_clean_bcnreqlist_sta(c, s);
+	free(s->de_sta);
+	list_del(&s->list);
+	free(s);
+
+	/* remove BSTA MAC addr from hash table if present */
+	allmac_clean_entry(&c->mac_table, macaddr, MAC_ENTRY_BSTA);
+}
+
 void cntlr_clean_stalist(struct controller *c)
 {
 	struct sta *s = NULL, *tmp;
 
 	list_for_each_entry_safe(s, tmp, &c->stalist, list) {
-		/* FIXME: del s->de_sta->list */
-		free_bcn_metrics(c, s);
-		free(s->de_sta);
-		list_del(&s->list);
-		free(s);
+		cntlr_remove_sta(c, s);
 	}
 }
 
@@ -1332,6 +1343,22 @@ void cntlr_clean_bcnreqlist(struct controller *c)
 		free(b);
 	}
 }
+
+void cntlr_clean_bcnreqlist_sta(struct controller *c, struct sta *s)
+{
+    dbg("%s: --->\n", __func__);
+    struct bcnreq *b = NULL, *tmp;
+
+    list_for_each_entry_safe(b, tmp, &c->bcnreqlist, list) {
+        if (!memcmp(b->sta_mac, s->de_sta->macaddr, 6)) {
+            dbg("%s found bcnreq for sta:" MACFMT ", remove it\n",
+                __func__, MAC2STR(b->sta_mac));
+            list_del(&b->list);
+            free(b);
+        }
+    }
+}
+
 void node_clean_linklist(struct controller *c)
 {
         struct netif_link *l = NULL, *tmp;
diff --git a/src/cntlr.h b/src/cntlr.h
index 97adc8706f9bcd3219cae3bce891abfa03b2a4aa..a1bff5e93e249f6c2c105fb0458e19e8949b3ca4 100644
--- a/src/cntlr.h
+++ b/src/cntlr.h
@@ -402,6 +402,7 @@ struct bcnreq *cntlr_find_bcnreq(struct controller *c, uint8_t *sta, uint8_t *al
 bool cntlr_resync_config(struct controller *c, bool reload);
 
 int cntlr_radio_clean_scanlist_el(struct wifi_scanres_element *el);
+void cntlr_clean_bcnreqlist_sta(struct controller *c, struct sta *s);
 void free_bcn_metrics(struct controller *c, struct sta *s);
 void free_usta_metrics(struct controller *c, struct sta *s);
 
diff --git a/src/cntlr_map.c b/src/cntlr_map.c
index 4d2d3f3810f41516bd5c989a9497a46b56cf0f04..9db60e5a1573b04ad76af9126f613c5be16cddbb 100644
--- a/src/cntlr_map.c
+++ b/src/cntlr_map.c
@@ -3411,7 +3411,12 @@ int handle_sta_disassoc_stats(void *cntlr, struct cmdu_buff *cmdu,
 				free(br);
 			}
 		}
-		free_bcn_metrics(c, s);
+
+        /* Remove all measurements */
+        free_bcn_metrics(c, s);
+
+        /* Clean measurement request list */
+        cntlr_clean_bcnreqlist_sta(c, s);
 	}
 
 	return 0;
diff --git a/src/wifi_dataelements.h b/src/wifi_dataelements.h
index ba1a73f86d0ae1bee7df19888c582c20dd8dd117..720876bf9dcbdd12936882ba249725834c677eef 100644
--- a/src/wifi_dataelements.h
+++ b/src/wifi_dataelements.h
@@ -256,7 +256,6 @@ struct wifi_multiap_sta {
 };
 
 struct wifi_sta_element {
-	struct list_head list;
 	int invalidate;
 	time_t tsp;
 	uint8_t macaddr[6];