diff --git a/src/agent.c b/src/agent.c
index 3d3dd075280bbe9568e502d94705cd221ffafb30..405261399e8739ebd33c28f52bb85d961d758575 100644
--- a/src/agent.c
+++ b/src/agent.c
@@ -1689,9 +1689,12 @@ static int report_assoc_sta_metrics(struct agent *a, struct sta *s, bool notify_
 		snprintf(ev_data, sizeof(ev_data),
 			"{\"macaddr\":\""MACFMT"\""
 			",\"report_rcpi_threshold\":%d"
+			",\"rcpi_hysteresis_margin\":%d"
 			",\"rcpi\":%d}",
 			MAC2STR(s->macaddr),
-			rcfg->report_rcpi_threshold, curr_rcpi);
+			rcfg->report_rcpi_threshold,
+			rcfg->rcpi_hysteresis_margin,
+			curr_rcpi);
 
 		if (curr_rcpi < rcfg->report_rcpi_threshold)
 			agent_notify_iface_event(a, ap->ifname,
@@ -1796,18 +1799,6 @@ static void wifi_sta_periodic_run(atimer_t *t)
 		return;
 	}
 
-	if (s->rssi_avg[0] && s->rssi_avg[1]) {
-		struct agent_config_radio *rcfg =
-			get_agent_config_radio(&a->cfg, ap->cfg->device);
-		uint8_t curr_rcpi = rssi_to_rcpi(s->rssi_avg[0]);
-		uint8_t prev_rcpi = rssi_to_rcpi(s->rssi_avg[1]);
-		uint8_t trigger = rcfg->report_rcpi_threshold;
-
-		if ((prev_rcpi <= trigger && curr_rcpi > trigger) ||
-		    (prev_rcpi >= trigger && curr_rcpi < trigger))
-			report_assoc_sta_metrics(a, s, true);
-	}
-
 	if (sta_steer_allowed(s->steer_policy)
 			&& !list_empty(&s->pref_nbrlist)
 			&& maybe_steer_sta(s, &reason, &pref_nbr)) {
@@ -1818,6 +1809,38 @@ static void wifi_sta_periodic_run(atimer_t *t)
 	if (!list_empty(&ap->nbrlist) && list_empty(&s->pref_nbrlist))
 		recalc_desired_neighbors(s);
 
+	if (s->rssi_avg[0] && s->rssi_avg[1]) {
+		struct agent_config_radio *rcfg;
+		uint8_t trig_l, trig_h;
+		uint8_t curr_rcpi, prev_rcpi;
+
+		rcfg = get_agent_config_radio(&a->cfg, ap->cfg->device);
+		if (!rcfg)
+			goto rearm_periodic;
+
+		if (!rcfg->report_rcpi_threshold)
+			goto rearm_periodic;
+
+		trig_l = rcfg->report_rcpi_threshold - rcfg->rcpi_hysteresis_margin;
+		trig_h = rcfg->report_rcpi_threshold + rcfg->rcpi_hysteresis_margin;
+		curr_rcpi = rssi_to_rcpi(s->rssi_avg[0]);
+		prev_rcpi = rssi_to_rcpi(s->rssi_avg[1]);
+
+		if (curr_rcpi > trig_l && curr_rcpi < trig_h)
+			s->num_rssi_rep = 0;
+		else if ((prev_rcpi < trig_h && curr_rcpi >= trig_h) ||
+		    (prev_rcpi > trig_l && curr_rcpi <= trig_l))
+			s->num_rssi_rep = 1;
+		else {
+			/* rcpi outside range for consecutive sample */
+			if (s->num_rssi_rep == MAX_RSSI_MEAS) {
+				/* interpret collected samples */
+				report_assoc_sta_metrics(a, s, true);
+			} else
+				s->num_rssi_rep++;
+		}
+	}
+
 rearm_periodic:
 	timer_set(&s->sta_timer, STA_PERIODIC_RUN_INTERVAL);
 }
diff --git a/src/agent.h b/src/agent.h
index 3c70685d4cb00c28edf477c6fe7fa14549e01af2..a55f786487028d4eba5a3d3117e6292778162139 100644
--- a/src/agent.h
+++ b/src/agent.h
@@ -456,9 +456,10 @@ struct sta {
 #endif
 	uint32_t caps;                  /** capability bitmap */
 	int rssi[WIFI_NUM_ANTENNA];     /** rssi of last received pkt */
-#define MAX_RSSI_MEAS 2
+#define MAX_RSSI_MEAS 3
 	int8_t rssi_avg[MAX_RSSI_MEAS]; /** average rssi history FIFO buffer */
-	uint8_t num_rssi;               /** number of RSSI samples */
+	uint8_t num_rssi;               /** total number of RSSI samples aggregated */
+	uint8_t num_rssi_rep;           /** number of RSSI samples collected for report */
 	uint64_t connected_ms;          /** number of msecs connected */
 	struct timespec last_update;
 	uint32_t tx_rate;		/** tx-rate in kbps */
diff --git a/src/config.c b/src/config.c
index 77e8466a7c760bf98c6997c151431aa27d271a99..3696b35d67e5a27308ad2135f0dc6dc658fc7daa 100644
--- a/src/config.c
+++ b/src/config.c
@@ -2556,7 +2556,8 @@ static int agent_config_get_wifi_radio(struct agent_config *a,
 	}
 
 	if (ifname && band) {
-		uint8_t rcpi_threshold = 0, report_rcpi_threshold = 0;
+		uint8_t rcpi_threshold = 0;
+		uint8_t report_rcpi_threshold = 0;
 
 		n = get_agent_config_radio(a, ifname);
 		if (!n) {
@@ -2645,6 +2646,8 @@ static int agent_config_get_wifi_radio(struct agent_config *a,
 		if (tb[WIFI_RADIO_RCPI_HYSTERESIS_MARGIN])
 			n->rcpi_hysteresis_margin =
 				atoi(tb[WIFI_RADIO_RCPI_HYSTERESIS_MARGIN]->v.string);
+		else
+			n->rcpi_hysteresis_margin = 0;
 
 		if (tb[WIFI_RADIO_REPORT_UTIL_THRESHOLD])
 			n->report_util_threshold =