diff --git a/src/cntlr.c b/src/cntlr.c
index 40929873b79bcc16363302d8e2149e3ee1e08cf0..7b110a127a9a3fab22aa1a4dcc7069f5489622b1 100644
--- a/src/cntlr.c
+++ b/src/cntlr.c
@@ -1492,17 +1492,28 @@ struct node *alloc_node_init(struct controller *c, uint8_t *hwaddr)
 	return n;
 }
 
-void node_clean_stalist(struct controller *c)
+void cntlr_clean_stalist(struct controller *c)
 {
 	struct sta *s = NULL, *tmp;
 
 	list_for_each_entry_safe(s, tmp, &c->stalist, list) {
+		free_bcn_metrics(c, s);
 		list_del(&s->list);
 		free(s);
 	}
 }
 
-void node_clean_linklist(struct controller *c)
+void cntlr_clean_bcnreqlist(struct controller *c)
+{
+	struct bcnreq *b = NULL, *tmp;
+
+	list_for_each_entry_safe(b, tmp, &c->bcnreqlist, list) {
+		list_del(&b->list);
+		free(b);
+	}
+}
+
+void cntlr_clean_linklist(struct controller *c)
 {
         struct netif_link *l = NULL, *tmp;
 
@@ -1540,8 +1551,6 @@ static void cntlr_clean_nodelist(struct controller *c)
 	struct node *n = NULL, *tmp;
 
 	list_for_each_entry_safe(n, tmp, &c->nodelist, list) {
-		node_clean_stalist(c);
-		node_clean_linklist(c);
 		node_clean_radiolist(n);
 		list_del(&n->list);
 		free(n);
@@ -2707,6 +2716,9 @@ void run_controller(void)
 
 out_exit:
 	map_unsubscribe(ctx, c->subscriber);
+	cntlr_clean_stalist(c);
+	cntlr_clean_bcnreqlist(c);
+	cntlr_clean_linklist(c);
 	cntlr_clean_nodelist(c);
 	ubus_unregister_event_handler(ctx, &c->evh);
 	cntlr_remove_object(c);