diff --git a/src/ap/beacon.c b/src/ap/beacon.c
index d6c96a3..b36beca 100644
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -580,6 +580,19 @@ static enum ssid_match_result ssid_match(struct hostapd_data *hapd,
 }
 
 
+void sta_track_del(struct hostapd_sta_info *info)
+{
+#ifdef CONFIG_TAXONOMY
+	if (info->probe_ie_taxonomy) {
+		os_free((void *)info->probe_ie_taxonomy);
+		info->probe_ie_taxonomy = NULL;
+	}
+#endif /* CONFIG_TAXONOMY */
+
+	os_free(info);
+}
+
+
 void sta_track_expire(struct hostapd_iface *iface, int force)
 {
 	struct os_reltime now;
@@ -602,7 +615,7 @@ void sta_track_expire(struct hostapd_iface *iface, int force)
 			   MAC2STR(info->addr));
 		dl_list_del(&info->list);
 		iface->num_sta_seen--;
-		os_free(info);
+		sta_track_del(info);
 	}
 }
 
@@ -675,6 +688,23 @@ sta_track_seen_on(struct hostapd_iface *iface, const u8 *addr,
 	return NULL;
 }
 
+#ifdef CONFIG_TAXONOMY
+void sta_track_claim_taxonomy_info(struct hostapd_iface *iface, const u8 *addr,
+	const u8 **probe_ie_taxonomy, size_t *probe_ie_taxonomy_len)
+{
+	struct hostapd_sta_info *info = sta_track_get(iface, addr);
+	if (!info) {
+		*probe_ie_taxonomy = NULL;
+		*probe_ie_taxonomy_len = 0;
+		return;
+	}
+
+	*probe_ie_taxonomy = info->probe_ie_taxonomy;
+	info->probe_ie_taxonomy = NULL;
+	*probe_ie_taxonomy_len = info->probe_ie_taxonomy_len;
+	info->probe_ie_taxonomy_len = 0;
+}
+#endif /* CONFIG_TAXONOMY */
 
 void handle_probe_req(struct hostapd_data *hapd,
 		      const struct ieee80211_mgmt *mgmt, size_t len,
@@ -787,9 +817,15 @@ void handle_probe_req(struct hostapd_data *hapd,
 
 #ifdef CONFIG_TAXONOMY
 	{
-		struct sta_info *sta = ap_get_sta(hapd, mgmt->sa);
-		if (sta) {
-			hostapd_taxonomy_probe_req(hapd, sta, ie, ie_len);
+		struct sta_info *sta;
+		struct hostapd_sta_info *info;
+
+		if ((sta = ap_get_sta(hapd, mgmt->sa)) != NULL) {
+			taxonomy_sta_info_probe_req(hapd, sta, ie, ie_len);
+		} else if ((info = sta_track_get(hapd->iface,
+						 mgmt->sa)) != NULL) {
+			taxonomy_hostapd_sta_info_probe_req(hapd, info,
+							    ie, ie_len);
 		}
 	}
 #endif /* CONFIG_TAXONOMY */
diff --git a/src/ap/beacon.h b/src/ap/beacon.h
index d98f42e..6d3eb4f 100644
--- a/src/ap/beacon.h
+++ b/src/ap/beacon.h
@@ -22,9 +22,14 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
 			       struct wpa_driver_ap_params *params);
 void ieee802_11_free_ap_params(struct wpa_driver_ap_params *params);
 void sta_track_add(struct hostapd_iface *iface, const u8 *addr);
+void sta_track_del(struct hostapd_sta_info *info);
 void sta_track_expire(struct hostapd_iface *iface, int force);
 struct hostapd_data *
 sta_track_seen_on(struct hostapd_iface *iface, const u8 *addr,
 		  const char *ifname);
+#ifdef CONFIG_TAXONOMY
+void sta_track_claim_taxonomy_info(struct hostapd_iface *iface, const u8 *addr,
+	const u8 **probe_ie_taxonomy, size_t *probe_ie_taxonomy_len);
+#endif /* CONFIG_TAXONOMY */
 
 #endif /* BEACON_H */
diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c
index 65f513d..e5ed0b1 100644
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -374,7 +374,7 @@ static void sta_track_deinit(struct hostapd_iface *iface)
 				     list))) {
 		dl_list_del(&info->list);
 		iface->num_sta_seen--;
-		os_free(info);
+		sta_track_del(info);
 	}
 }
 
diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
index 195679e..8d03bf3 100644
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -311,6 +311,10 @@ struct hostapd_sta_info {
 	struct dl_list list;
 	u8 addr[ETH_ALEN];
 	struct os_reltime last_seen;
+#ifdef CONFIG_TAXONOMY
+	const u8 *probe_ie_taxonomy;
+	size_t probe_ie_taxonomy_len;
+#endif /* CONFIG_TAXONOMY */
 };
 
 /**
diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c
index 355b3c0..52b2bad 100644
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
@@ -2254,7 +2254,7 @@ static void handle_assoc(struct hostapd_data *hapd,
 	sta->timeout_next = STA_NULLFUNC;
 
 #ifdef CONFIG_TAXONOMY
-	hostapd_taxonomy_assoc_req(hapd, sta, pos, left);
+	taxonomy_sta_info_assoc_req(hapd, sta, pos, left);
 #endif /* CONFIG_TAXONOMY */
 
  fail:
diff --git a/src/ap/sta_info.c b/src/ap/sta_info.c
index c9f4858..3607411 100644
--- a/src/ap/sta_info.c
+++ b/src/ap/sta_info.c
@@ -673,6 +673,11 @@ struct sta_info * ap_sta_add(struct hostapd_data *hapd, const u8 *addr)
 	sta->last_seq_ctrl = WLAN_INVALID_MGMT_SEQ;
 	dl_list_init(&sta->ip6addr);
 
+#ifdef CONFIG_TAXONOMY
+	sta_track_claim_taxonomy_info(hapd->iface, addr,
+		&sta->probe_ie_taxonomy, &sta->probe_ie_taxonomy_len);
+#endif /* CONFIG_TAXONOMY */
+
 	return sta;
 }
 
diff --git a/src/ap/taxonomy.c b/src/ap/taxonomy.c
index d0deb05..f57d79e 100644
--- a/src/ap/taxonomy.c
+++ b/src/ap/taxonomy.c
@@ -271,7 +271,7 @@ int retrieve_sta_taxonomy(const struct hostapd_data *hapd,
 	return 0;
 }
 
-void hostapd_taxonomy_probe_req(const struct hostapd_data *hapd,
+void taxonomy_sta_info_probe_req(const struct hostapd_data *hapd,
 	struct sta_info *sta, const u8 *ie, size_t ie_len)
 {
 	if (sta->probe_ie_taxonomy) {
@@ -284,7 +284,20 @@ void hostapd_taxonomy_probe_req(const struct hostapd_data *hapd,
 	sta->probe_ie_taxonomy_len = ie_len;
 }
 
-void hostapd_taxonomy_assoc_req(const struct hostapd_data *hapd,
+void taxonomy_hostapd_sta_info_probe_req(const struct hostapd_data *hapd,
+	struct hostapd_sta_info *info, const u8 *ie, size_t ie_len)
+{
+	if (info->probe_ie_taxonomy) {
+		os_free(info->probe_ie_taxonomy);
+		info->probe_ie_taxonomy = NULL;
+		info->probe_ie_taxonomy_len = 0;
+	}
+	info->probe_ie_taxonomy = os_malloc(ie_len);
+	os_memcpy(info->probe_ie_taxonomy, ie, ie_len);
+	info->probe_ie_taxonomy_len = ie_len;
+}
+
+void taxonomy_sta_info_assoc_req(const struct hostapd_data *hapd,
 	struct sta_info *sta, const u8 *ie, size_t ie_len)
 {
 	if (sta->assoc_ie_taxonomy) {
diff --git a/src/ap/taxonomy.h b/src/ap/taxonomy.h
index 6d2ec39..3b88a4d 100644
--- a/src/ap/taxonomy.h
+++ b/src/ap/taxonomy.h
@@ -9,9 +9,11 @@
 #ifndef TAXONOMY_H
 #define TAXONOMY_H
 
-void hostapd_taxonomy_probe_req(const struct hostapd_data *hapd,
+void taxonomy_sta_info_probe_req(const struct hostapd_data *hapd,
 	struct sta_info *sta, const u8 *ie, size_t ie_len);
-void hostapd_taxonomy_assoc_req(const struct hostapd_data *hapd,
+void taxonomy_hostapd_sta_info_probe_req(const struct hostapd_data *hapd,
+	struct hostapd_sta_info *sta, const u8 *ie, size_t ie_len);
+void taxonomy_sta_info_assoc_req(const struct hostapd_data *hapd,
 	struct sta_info *sta, const u8 *ie, size_t ie_len);
 int retrieve_sta_taxonomy(const struct hostapd_data *hapd,
 	struct sta_info *sta, char *buf, size_t buflen);
