Index: uspace/drv/nic/ar9271/ar9271.c
===================================================================
--- uspace/drv/nic/ar9271/ar9271.c	(revision cc575ef99163b3a869a65477f280acca17c5bdd5)
+++ uspace/drv/nic/ar9271/ar9271.c	(revision 09044cb23535bd9cffcad94397a217746432ba44)
@@ -463,12 +463,10 @@
 		}
 		
-		if(key_conf->flags & IEEE80211_KEY_FLAG_TYPE_PAIRWISE) {
-			reg_ptr = AR9271_KEY_TABLE_STA;
-			mic_reg_ptr = AR9271_KEY_TABLE_MIC_STA;
-		} else {
-			reg_ptr = AR9271_KEY_TABLE_GRP;
-			mic_reg_ptr = AR9271_KEY_TABLE_MIC_GRP;
-		}
-		
+		uint8_t key_id = 
+			(key_conf->flags & IEEE80211_KEY_FLAG_TYPE_PAIRWISE) ?
+				AR9271_STA_KEY_INDEX : key_conf->id;
+		
+		reg_ptr = AR9271_KEY_TABLE(key_id);
+		mic_reg_ptr = AR9271_KEY_TABLE(key_id + 64);
 		data_start = (void *) key_conf->data;
 		
@@ -558,5 +556,5 @@
 			ieee80211_setup_key_confirm(ieee80211_dev, true);
 	} else {
-		// TODO: Delete keys from device
+		/* TODO: Delete keys from device */
 		ieee80211_setup_key_confirm(ieee80211_dev, false);
 	}
@@ -591,9 +589,7 @@
 			(htc_tx_data_header_t *) 
 			(complete_buffer + sizeof(htc_frame_header_t));
-		/* TODO: Distinguish data type. */
 		data_header->data_type = HTC_DATA_NORMAL;
 		data_header->node_idx = 1;
 		data_header->vif_idx = 0;
-		/* TODO: There I should probably handle slot number. */
 		data_header->cookie = 0;
 		
@@ -639,5 +635,4 @@
 		mgmt_header->node_idx = 0;
 		mgmt_header->vif_idx = 0;
-		/* TODO: There I should probably handle slot number. */
 		mgmt_header->cookie = 0;
 		mgmt_header->keyix = 0xFF;
Index: uspace/drv/nic/ar9271/ar9271.h
===================================================================
--- uspace/drv/nic/ar9271/ar9271.h	(revision cc575ef99163b3a869a65477f280acca17c5bdd5)
+++ uspace/drv/nic/ar9271/ar9271.h	(revision 09044cb23535bd9cffcad94397a217746432ba44)
@@ -136,8 +136,5 @@
 		
 	/* Key related registers */
-	AR9271_KEY_TABLE_GRP = 0x8820,
-	AR9271_KEY_TABLE_STA = 0x8880,
-	AR9271_KEY_TABLE_MIC_GRP = 0x9020,
-	AR9271_KEY_TABLE_MIC_STA = 0x9080,
+	AR9271_KEY_TABLE_BASE = 0x8800,
 	AR9271_KEY_TABLE_TYPE_WEP40 = 0x0,
 	AR9271_KEY_TABLE_TYPE_WEP104 = 0x1,
@@ -186,4 +183,7 @@
 	AR9271_FW_OFFSET = 0x903000,
 } ar9271_registers_t;
+
+/** Compute key table base position for key by its id. */
+#define AR9271_KEY_TABLE(id) (AR9271_KEY_TABLE_BASE + (id)*32)
 
 /** AR9271 Requests */
Index: uspace/lib/ieee80211/include/ieee80211_private.h
===================================================================
--- uspace/lib/ieee80211/include/ieee80211_private.h	(revision cc575ef99163b3a869a65477f280acca17c5bdd5)
+++ uspace/lib/ieee80211/include/ieee80211_private.h	(revision 09044cb23535bd9cffcad94397a217746432ba44)
@@ -174,4 +174,5 @@
 typedef enum {
 	IEEE80211_EAPOL_KEY_KEYINFO_KEYTYPE = 0x0008,
+	IEEE80211_EAPOL_KEY_KEYINFO_KEYID = 0x0010,
 	IEEE80211_EAPOL_KEY_KEYINFO_INSTALL = 0x0040,
 	IEEE80211_EAPOL_KEY_KEYINFO_ACK = 0x0080,
Index: uspace/lib/ieee80211/src/ieee80211.c
===================================================================
--- uspace/lib/ieee80211/src/ieee80211.c	(revision cc575ef99163b3a869a65477f280acca17c5bdd5)
+++ uspace/lib/ieee80211/src/ieee80211.c	(revision 09044cb23535bd9cffcad94397a217746432ba44)
@@ -1181,6 +1181,9 @@
 			(ieee80211_ie_header_t *) it;
 		uint8_t *channel;
+		uint32_t oui;
 		switch(ie_header->element_id) {
 			case IEEE80211_CHANNEL_IE:
+				if(!ap_data)
+					break;
 				channel = (uint8_t *) 
 					(it + sizeof(ieee80211_ie_header_t));
@@ -1197,7 +1200,9 @@
 				break;
 			case IEEE80211_VENDOR_IE:
-				if(uint32be_from_seq(it + 
-					sizeof(ieee80211_ie_header_t)) ==
-					WPA_OUI) {
+				oui = uint32be_from_seq(it + 
+					sizeof(ieee80211_ie_header_t));
+				if(oui == WPA_OUI) {
+					if(!ap_data)
+						break;
 					/* Prefering WPA2. */
 					if(ap_data->scan_result.security.type ==
@@ -1212,10 +1217,8 @@
 						sizeof(uint32_t));
 					copy_auth_ie(ie_header, ap_data, it);
-				} else if(uint32be_from_seq(it + 
-					sizeof(ieee80211_ie_header_t)) ==
-					GTK_OUI) {
+				} else if(oui == GTK_OUI) {
 					return it + 
 						sizeof(ieee80211_ie_header_t) +
-						sizeof(uint32_t) + 2;
+						sizeof(uint32_t);
 				}
 		}
@@ -1390,4 +1393,5 @@
 	uint8_t *ptk = ieee80211_dev->bssid_info.ptk;
 	uint8_t *gtk = ieee80211_dev->bssid_info.gtk;
+	uint8_t gtk_id = 1;
 
 	bool handshake_done = false;
@@ -1503,9 +1507,17 @@
 			
 			if(rc == EOK) {
-				uint8_t *key_ptr = old_wpa ? key_data :
+				uint8_t *key_data_ptr = old_wpa ? key_data :
 					ieee80211_process_ies(ieee80211_dev,
 					NULL, key_data, key_data_length);
 
-				if(key_ptr) {
+				if(key_data_ptr) {
+					uint8_t *key_ptr;
+					if(old_wpa) {
+						key_ptr = key_data_ptr;
+					} else {
+						gtk_id = *key_data_ptr & 0x3;
+						key_ptr = key_data_ptr + 2;
+					}
+						
 					memcpy(gtk, key_ptr, gtk_key_length);
 					handshake_done = true;
@@ -1588,4 +1600,5 @@
 	/* Insert Group key. */
 	if(final_phase) {
+		key_config.id = gtk_id;
 		key_config.suite = auth_data->security.group_alg;
 		key_config.flags =
