diff --git a/net80211/ieee80211_node.c b/net80211/ieee80211_node.c
index b702c08..05c0a76 100644
--- a/net80211/ieee80211_node.c
+++ b/net80211/ieee80211_node.c
@@ -630,11 +630,25 @@ ieee80211_sta_join1(struct ieee80211_node *selbs)
 	 */
 	canreassoc = ((obss != NULL) &&
 		(vap->iv_state == IEEE80211_S_RUN) && ssid_equal(obss, selbs));
-	vap->iv_bss = selbs;
-	IEEE80211_ADDR_COPY(vap->iv_bssid, selbs->ni_bssid);
-	if (obss != NULL)
-		ieee80211_unref_node(&obss);
+	/*
+	 * In Ad-Hoc mode, copy all the data from selbs to
+	 * vap->iv_bss, in other modes set vap->iv_bss = selbs
+	 */
+	if (vap->iv_opmode == IEEE80211_M_IBSS && vap->iv_bss != NULL) {
+		copy_bss_state(vap->iv_bss, selbs);
+		IEEE80211_ADDR_COPY(vap->iv_bss->ni_bssid, selbs->ni_bssid);
+		IEEE80211_ADDR_COPY(vap->iv_bssid, selbs->ni_bssid);
+		vap->iv_bss->ni_intval = selbs->ni_intval;
+		vap->iv_bss->ni_tstamp.tsf = selbs->ni_tstamp.tsf;
+		/* We got a reference to selbs, so need to unref() */
+		ieee80211_unref_node(&selbs);
+	} else {
+		vap->iv_bss = selbs;
+		IEEE80211_ADDR_COPY(vap->iv_bssid, selbs->ni_bssid);
+		if (obss != NULL)
+			ieee80211_unref_node(&obss);
+	}
-	ic->ic_bsschan = selbs->ni_chan;
+	ic->ic_bsschan = vap->iv_bss->ni_chan;
 	ic->ic_curchan = ic->ic_bsschan;
 	ic->ic_curmode = ieee80211_chan2mode(ic->ic_curchan);
 	ic->ic_set_channel(ic);
