diff --git a/ieee802_11_radio.h b/ieee802_11_radio.h
index 8caeaa2..a8f9037 100644
--- a/ieee802_11_radio.h
+++ b/ieee802_11_radio.h
@@ -163,6 +163,11 @@ struct ieee80211_radiotap_header {
  *					u_int8_t	channel number
  *					u_int8_t	.5 dBm
  *
+ * IEEE80211_RADIOTAP_RATE_MCS       2 x u8          data, bitmap
+ *
+ *     First byte is the MCS index of the rate,
+ *     second one has flags about channel width and guard interval
+ *
  *	Extended channel specification: flags (see below) followed by
  *	frequency in MHz, the corresponding IEEE channel number, and
  *	finally the maximum regulatory transmit power cap in .5 dBm
@@ -185,7 +190,10 @@ enum ieee80211_radiotap_type {
 	IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12,
 	IEEE80211_RADIOTAP_DB_ANTNOISE = 13,
 	/* NB: gap for netbsd definitions */
+	IEEE80211_RADIOTAP_RTS_RETRIES = 16,
+	IEEE80211_RADIOTAP_DATA_RETRIES = 17,
 	IEEE80211_RADIOTAP_XCHANNEL = 18,
+	IEEE80211_RADIOTAP_RATE_MCS = 19,
 	IEEE80211_RADIOTAP_EXT = 31
 };
 
@@ -228,4 +236,8 @@ enum ieee80211_radiotap_type {
 #define	IEEE80211_RADIOTAP_F_BADFCS	0x40	/* does not pass FCS check */
 #define	IEEE80211_RADIOTAP_F_SHORTGI	0x80	/* HT short GI */
 
+/* For IEEE80211_RADIOTAP_RATE_MCS */
+#define IEEE80211_RADIOTAP_RATE_MCS_40MHZ      0x01 /* 40 MHz channel width */
+#define IEEE80211_RADIOTAP_RATE_MCS_SHORT_GI   0x02 /* short guard interval */
+
 #endif /* _NET_IF_IEEE80211RADIOTAP_H_ */
diff --git a/print-802_11.c b/print-802_11.c
index 9b1ba12..2a48d96 100644
--- a/print-802_11.c
+++ b/print-802_11.c
@@ -74,26 +74,16 @@ static const char rcsid[] _U_ =
 	printf("%s", \
 	    CAPABILITY_PRIVACY(p.capability_info) ? ", PRIVACY" : "" );
 
-static const int ieee80211_htrates[16] = {
-	13,		/* IFM_IEEE80211_MCS0 */
-	26,		/* IFM_IEEE80211_MCS1 */
-	39,		/* IFM_IEEE80211_MCS2 */
-	52,		/* IFM_IEEE80211_MCS3 */
-	78,		/* IFM_IEEE80211_MCS4 */
-	104,		/* IFM_IEEE80211_MCS5 */
-	117,		/* IFM_IEEE80211_MCS6 */
-	130,		/* IFM_IEEE80211_MCS7 */
-	26,		/* IFM_IEEE80211_MCS8 */
-	52,		/* IFM_IEEE80211_MCS9 */
-	78,		/* IFM_IEEE80211_MCS10 */
-	104,		/* IFM_IEEE80211_MCS11 */
-	156,		/* IFM_IEEE80211_MCS12 */
-	208,		/* IFM_IEEE80211_MCS13 */
-	234,		/* IFM_IEEE80211_MCS14 */
-	260,		/* IFM_IEEE80211_MCS15 */
+static const float ieee80211_htrates[][4] = {
+	{ 6.5,	13.5,	 7.2,	15.0},
+	{13.0,	27.0,	14.4,	30.0},
+	{19.5,	40.5,	21.7,	45.0},
+	{26.0,	54.0,	28.9,	60.0},
+	{39.0,	81.0,	43.3,	90.0},
+	{52.0,	108.0,	57.8,	120.0},
+	{58.5,	121.5,	65.0,	135.0},
+	{65.0,	135.0,	72.2,	150.0}
 };
-#define PRINT_HT_RATE(_sep, _r, _suf) \
-	printf("%s%.1f%s", _sep, (.5 * ieee80211_htrates[(_r) & 0xf]), _suf)
 
 static const char *auth_alg_text[]={"Open System","Shared Key","EAP"};
 #define NUM_AUTH_ALGS	(sizeof auth_alg_text / sizeof auth_alg_text[0])
@@ -1482,6 +1472,8 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags)
 	case IEEE80211_RADIOTAP_DB_ANTSIGNAL:
 	case IEEE80211_RADIOTAP_DB_ANTNOISE:
 	case IEEE80211_RADIOTAP_ANTENNA:
+	case IEEE80211_RADIOTAP_DATA_RETRIES:
+	case IEEE80211_RADIOTAP_RTS_RETRIES:
 		rc = cpack_uint8(s, &u.u8);
 		break;
 	case IEEE80211_RADIOTAP_DBM_ANTSIGNAL:
@@ -1520,6 +1512,12 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags)
 			break;
 		rc = cpack_uint8(s, &u4.u8);
 		break;
+	case IEEE80211_RADIOTAP_RATE_MCS:
+		rc = cpack_uint8(s, &u.u8);
+		if (rc != 0)
+			break;
+		rc = cpack_uint8(s, &u2.u8);
+		break;
 	default:
 		/* this bit indicates a field whose
 		 * size we do not know, so we cannot
@@ -1542,9 +1540,7 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags)
 		printf("fhset %d fhpat %d ", u.u16 & 0xff, (u.u16 >> 8) & 0xff);
 		break;
 	case IEEE80211_RADIOTAP_RATE:
-		if (u.u8 & 0x80)
-			PRINT_HT_RATE("", u.u8, " Mb/s ");
-		else
+		if (u.u8)
 			PRINT_RATE("", u.u8, " Mb/s ");
 		break;
 	case IEEE80211_RADIOTAP_DBM_ANTSIGNAL:
@@ -1592,6 +1588,14 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags)
 	case IEEE80211_RADIOTAP_XCHANNEL:
 		print_chaninfo(u2.u16, u.u32);
 		break;
+	case IEEE80211_RADIOTAP_RATE_MCS: {
+		char *flags[][3] = { {"20", "40"}, {"Long", 0, "Short"} };
+		printf("%.1f Mb/s (MCS %d, %s MHz, %s GI) ",
+			ieee80211_htrates[u.u8 & 7][u2.u8 & 3] * ((u.u8 >> 3) + 1), u.u8,
+			flags[0][u2.u8 & IEEE80211_RADIOTAP_RATE_MCS_40MHZ],
+			flags[1][u2.u8 & IEEE80211_RADIOTAP_RATE_MCS_SHORT_GI]);
+		break;
+		}
 	}
 	return 0;
 }

