diff --git a/src/plugins/steer/rcpi/Makefile b/src/plugins/steer/rcpi/Makefile
index 3f2714e6167d451c8a20a1afce5b1c3dcaa900bf..eb34ed1f1bb363972624112b7c80aa6f87ea2376 100644
--- a/src/plugins/steer/rcpi/Makefile
+++ b/src/plugins/steer/rcpi/Makefile
@@ -7,7 +7,7 @@ all: rcpi.so
 	$(CC) $(CFLAGS) -fPIC -I. -I../../.. -I../../../utils -c $< -o $@
 
 rcpi.so: rcpi.o
-	$(CC) $(CFLAGS) $(LDFLAGS) -shared -Wl,-soname,$@ -o $@ $^
+	$(CC) $(CFLAGS) $(LDFLAGS) -shared -Wl,-soname,$@ -o $@ $^ -lcntlr-apis
 
 clean:
 	rm -f *.o *.so*
diff --git a/src/plugins/steer/rcpi/rcpi.c b/src/plugins/steer/rcpi/rcpi.c
index be5df94bad2e6382acb624e07f39c24472ee0713..9a3756d114ba01b4edb9da481b35f357bda0d6d4 100644
--- a/src/plugins/steer/rcpi/rcpi.c
+++ b/src/plugins/steer/rcpi/rcpi.c
@@ -22,15 +22,15 @@
 #include <1905_tlvs.h>
 #include <easymesh.h>
 
-#include "cntlr_commands_impl.h"
+#include "wifi_dataelements.h"
+#include "wifi_opclass.h"
+#include "cntlr_commands.h"
+#include "cntlr_apis.h"
 #include "steer_module.h"
-#include "sta.h"
 #include "timer.h"
 #include "timer_impl.h"
-#include "utils/utils.h"
 #include "utils/debug.h"
-#include "wifi_dataelements.h"
-#include "wifi_opclass.h"
+#include "utils/utils.h"
 
 #ifndef MAC_ADDR_HASH
 #define MAC_ADDR_HASH(a)	(a[0] ^ a[1] ^ a[2] ^ a[3] ^ a[4] ^ a[5])
@@ -552,7 +552,7 @@ int rcpi_query_sta_metrics(struct rcpi_steer_control *sc, struct steer_sta *s)
 	hwaddr_ntoa(s->bss.agent, agent);
 	blobmsg_add_string(&bi, "agent", agent);
 
-	hwaddr_ntoa(s->sta->macaddr, stamac);
+	hwaddr_ntoa(s->macaddr, stamac);
 	blobmsg_add_string(&bi, "sta", stamac);
 
 	ret = COMMAND(query_sta_metrics)(cntlr, bi.head, &bo);
@@ -570,7 +570,7 @@ int rcpi_query_sta_metrics(struct rcpi_steer_control *sc, struct steer_sta *s)
 
 			cntlr_dbg(LOG_STEER,
 				  "%s: STA " MACFMT ": Request STA-Metrics cmdu mid = %hu\n",
-				  __func__, MAC2STR(s->sta->macaddr), req_mid);
+				  __func__, MAC2STR(s->macaddr), req_mid);
 		}
 	} else {
 		cntlr_dbg(LOG_STEER, "%s: failed to Request STA-Metrics\n", __func__);
@@ -619,7 +619,7 @@ int rcpi_query_unassoc_sta_metrics(struct rcpi_steer_control *sc, struct rcpi_st
 		blobmsg_add_u32(&bi, "opclass", s->bss.opclass);
 		blobmsg_add_u32(&bi, "channel", s->bss.channel);
 		arr = blobmsg_open_array(&bi, "stalist");
-		blobmsg_add_macaddr(&bi, "", s->sta->macaddr);
+		blobmsg_add_macaddr(&bi, "", s->macaddr);
 		blobmsg_close_array(&bi, arr);
 
 		ret = COMMAND(query_unassoc_sta_metrics)(cntlr, bi.head, &bo);
@@ -637,7 +637,7 @@ int rcpi_query_unassoc_sta_metrics(struct rcpi_steer_control *sc, struct rcpi_st
 
 				cntlr_dbg(LOG_STEER,
 					  "%s: STA " MACFMT ": Request Unassoc-STA metrics from " MACFMT " cmdu mid = %hu\n",
-					  __func__, MAC2STR(s->sta->macaddr),
+					  __func__, MAC2STR(s->macaddr),
 					  MAC2STR(nbr->agent), req_mid);
 
 				time(&st->usta_query_time);
@@ -687,7 +687,7 @@ int rcpi_query_beacon_metrics(struct rcpi_steer_control *sc, struct rcpi_steer_s
 		blob_buf_init(&bo, 0);
 
 		blobmsg_add_macaddr(&bi, "agent", s->bss.agent);
-		blobmsg_add_macaddr(&bi, "sta", s->sta->macaddr);
+		blobmsg_add_macaddr(&bi, "sta", s->macaddr);
 		blobmsg_add_string(&bi, "ssid", (char *)s->bss.ssid);
 
 		blobmsg_add_macaddr(&bi, "bssid", nbr->bssid);
@@ -935,7 +935,7 @@ int rcpi_steer_ok(struct rcpi_steer_sta_data *st)
 
 	cntlr_dbg(LOG_STEER,
 		  "rcpi_steer: decision is steer STA " MACFMT " to new AP " MACFMT " with %s-RCPI %u\n",
-		  MAC2STR(s->sta->macaddr),
+		  MAC2STR(s->macaddr),
 		  MAC2STR(s->target.bssid),
 		  s->target.ul_rcpi ? "UL" : "DL",
 		  s->target.ul_rcpi ? s->target.ul_rcpi : s->target.dl_rcpi);
@@ -946,25 +946,40 @@ int rcpi_steer_ok(struct rcpi_steer_sta_data *st)
 int rcpi_steer(void *priv, struct steer_sta *s, uint16_t rxcmdu_type)
 {
 	struct rcpi_steer_control *sc = (struct rcpi_steer_control *)priv;
-	struct rcpi_steer_sta_data *st = rcpi_lookup_sta(sc, s->sta->macaddr);
-
-	uint8_t best_channel = s->bss.channel;
-	uint8_t *best_agent = s->bss.agent;
-	uint8_t *best_bssid = s->bss.bssid;
-	uint8_t best_rcpi = s->sta->rcpi;
+	struct rcpi_steer_sta_data *st = NULL;
+	int rcpi_trigger = RCPI_TRIGGER_NONE;
+	struct wifi_sta_element *sta;
 	bool best_found = false;
-	int rcpi_trigger = 0;
 	time_t now = time(NULL);
+	uint8_t best_channel;
+	uint8_t *best_agent;
+	uint8_t *best_bssid;
+	uint8_t best_rcpi;
+	void *cntlr;
+
+
+	if (!sc || !s)
+		return 0;
 
+	cntlr = ((struct steer_control *)(sc->self))->controller;
+	sta = cntlr_get_sta_element(cntlr, s->macaddr);
+	if (!sta)
+		return 0;
 
 	cntlr_dbg(LOG_STEER, "%s: STA " MACFMT ", rcpi = %u --------->\n",
-		  __func__, MAC2STR(s->sta->macaddr), s->sta->rcpi);
+		  __func__, MAC2STR(s->macaddr), sta->rcpi);
+
+	best_rcpi = sta->rcpi;
+	best_channel = s->bss.channel;
+	best_agent = s->bss.agent;
+	best_bssid = s->bss.bssid;
 
 	s->verdict = STEER_VERDICT_UNDECIDED;
 	s->reason = STEER_REASON_UNDEFINED;
 
+	st = rcpi_lookup_sta(sc, sta->macaddr);
 	if (!st) {
-		int idx = sta_table_hash(s->sta->macaddr);
+		int idx = sta_table_hash(sta->macaddr);
 
 		/* initialize steer state data for the STA */
 		st = calloc(1, sizeof(*st));
@@ -975,7 +990,7 @@ int rcpi_steer(void *priv, struct steer_sta *s, uint16_t rxcmdu_type)
 
 		st->priv = sc;
 		st->sta = s;
-		memcpy(st->macaddr, s->sta->macaddr, 6);
+		memcpy(st->macaddr, sta->macaddr, 6);
 		st->t = 0;
 		time(&st->t0);
 		st->diffsnr = sc->diffsnr;
@@ -1000,7 +1015,7 @@ int rcpi_steer(void *priv, struct steer_sta *s, uint16_t rxcmdu_type)
 		if (s->bss.connected != st->connected) {
 			cntlr_dbg(LOG_STEER,
 				  "%s: STA " MACFMT " %s " MACFMT "\n", __func__,
-				  MAC2STR(s->sta->macaddr),
+				  MAC2STR(sta->macaddr),
 				  s->bss.connected == 0 ? "disconnected from" : "connected to",
 				  MAC2STR(s->bss.bssid));
 
@@ -1013,12 +1028,12 @@ int rcpi_steer(void *priv, struct steer_sta *s, uint16_t rxcmdu_type)
 	/* update STA's rcpi samples */
 	if (rxcmdu_type == CMDU_ASSOC_STA_LINK_METRICS_RESPONSE ||
 	    rxcmdu_type == CMDU_AP_METRICS_RESPONSE) {
-		st->rcpi[st->t % NUM_RCPI_SAMPLES].sample = s->sta->rcpi;
+		st->rcpi[st->t % NUM_RCPI_SAMPLES].sample = sta->rcpi;
 		st->rcpi[st->t % NUM_RCPI_SAMPLES].dt = st->tprev ? difftime(now, st->tprev) : 0;
 		st->t++;
 		st->tprev = now;
 
-		rcpi_dump_sta_table(sc, s->sta->macaddr);
+		rcpi_dump_sta_table(sc, sta->macaddr);
 
 		rcpi_trigger = rcpi_sta_trigger_check(st);
 		cntlr_dbg(LOG_STEER, "%s: rcpi-trigger = %s\n", __func__,
@@ -1035,8 +1050,8 @@ int rcpi_steer(void *priv, struct steer_sta *s, uint16_t rxcmdu_type)
 
 	cntlr_dbg(LOG_STEER,
 		  "%s: STA " MACFMT " connected to " MACFMT " on channel %d has RCPI = %u\n",
-		  __func__, MAC2STR(s->sta->macaddr), MAC2STR(s->bss.bssid),
-		  s->bss.channel, s->sta->rcpi);
+		  __func__, MAC2STR(sta->macaddr), MAC2STR(s->bss.bssid),
+		  s->bss.channel, sta->rcpi);
 
 
 	if (sc->max_btm_attempt != DEFAULT_MAX_STEER_ATTEMPT &&
@@ -1044,7 +1059,7 @@ int rcpi_steer(void *priv, struct steer_sta *s, uint16_t rxcmdu_type)
 		cntlr_dbg(LOG_STEER,
 			  "%s: Skip STA " MACFMT " steer check. "
 			  "Num-attempts (%d) > max-attempts (%d)\n",
-			  __func__, MAC2STR(s->sta->macaddr),
+			  __func__, MAC2STR(sta->macaddr),
 			  st->num_steer_attempt, sc->max_btm_attempt);
 		return 0;
 	}
@@ -1086,7 +1101,7 @@ int rcpi_steer(void *priv, struct steer_sta *s, uint16_t rxcmdu_type)
 
 		if (best_found) {
 			/* better AP found using unassoc-sta metrics */
-			if (s->sta->rcpi <= s->bss.rcpi_threshold) {
+			if (sta->rcpi <= s->bss.rcpi_threshold) {
 				memcpy(s->target.bssid, best_bssid, 6);
 				memcpy(s->target.agent, best_agent, 6);
 				s->target.channel = best_channel;
@@ -1108,7 +1123,7 @@ int rcpi_steer(void *priv, struct steer_sta *s, uint16_t rxcmdu_type)
 				/* most recent report(s) are at list-head */
 				cntlr_dbg(LOG_STEER,
 					  "%s: STA " MACFMT " BCN-Rpt: bss = " MACFMT", rcpi = %u, ch = %d, opclass = %d\n",
-					  __func__, MAC2STR(s->sta->macaddr),
+					  __func__, MAC2STR(sta->macaddr),
 					  MAC2STR(b->bssid), b->rcpi, b->channel, b->opclass);
 
 				if (!is_bcnreport_usable(st, b)) {
@@ -1166,7 +1181,7 @@ int rcpi_steer(void *priv, struct steer_sta *s, uint16_t rxcmdu_type)
 
 		if (best_found) {
 			/* better AP found using beacon-report */
-			if (s->sta->rcpi <= s->bss.rcpi_threshold) {
+			if (sta->rcpi <= s->bss.rcpi_threshold) {
 				memcpy(s->target.bssid, best_bssid, 6);
 				memcpy(s->target.agent, best_agent, 6);
 				s->target.channel = best_channel;