Index: uspace/drv/usbkbd/descdump.c
===================================================================
--- uspace/drv/usbkbd/descdump.c	(revision f40131243ad1635ce6cd59eaf5a91902710c0306)
+++ uspace/drv/usbkbd/descdump.c	(revision 450198656434e7e94937231839fa4d58efe9da6b)
@@ -125,4 +125,6 @@
 	printf(INDENT "bCountryCode = %d\n", d->country_code);
 	printf(INDENT "bNumDescriptors = %d\n", d->class_desc_count);
+	printf(INDENT "bDescriptorType = %d\n", d->report_desc_info.type);
+	printf(INDENT "wDescriptorLength = %d\n", d->report_desc_info.length);
 }
 
Index: uspace/drv/usbkbd/descparser.c
===================================================================
--- uspace/drv/usbkbd/descparser.c	(revision f40131243ad1635ce6cd59eaf5a91902710c0306)
+++ uspace/drv/usbkbd/descparser.c	(revision 450198656434e7e94937231839fa4d58efe9da6b)
@@ -52,5 +52,5 @@
 			free(config->interfaces[i].endpoints);
 		}
-		if (iface->class_desc_info != NULL) {
+		/*if (iface->class_desc_info != NULL) {
 			free(iface->class_desc_info);
 		}
@@ -64,5 +64,5 @@
 				}
 			}
-		}
+		}*/
 	}
 	
@@ -152,4 +152,6 @@
 			}
 			ep_i = 0;
+
+			printf("Remaining size: %d\n", size - (size_t)(pos - data));
 			
 			break;
@@ -184,6 +186,7 @@
 			break;
 		case USB_DESCTYPE_HID:
-			if (desc_size < sizeof(usb_standard_hid_descriptor_t)
-			   + sizeof(usb_standard_hid_class_descriptor_info_t)) {
+			if (desc_size < sizeof(usb_standard_hid_descriptor_t)) {
+				printf("Wrong size of descriptor: %d (should be %d)\n",
+				    desc_size, sizeof(usb_standard_hid_descriptor_t));
 				ret = EINVAL;
 				goto end;
@@ -195,5 +198,5 @@
 			pos += sizeof(usb_standard_hid_descriptor_t);
 			
-			if (actual_iface->hid_desc.class_desc_count
+			/*if (actual_iface->hid_desc.class_desc_count
 			    * sizeof(usb_standard_hid_class_descriptor_info_t)
 			    != desc_size 
@@ -203,5 +206,5 @@
 				ret = EINVAL;
 				goto end;
-			}
+			}*/
 
 			printf("Parsed HID descriptor header: \n");
@@ -209,5 +212,5 @@
 			
 			// allocate space for all class-specific descriptor info
-			actual_iface->class_desc_info = 
+			/*actual_iface->class_desc_info = 
 			    (usb_standard_hid_class_descriptor_info_t *)malloc(
 			    actual_iface->hid_desc.class_desc_count
@@ -216,5 +219,5 @@
 				ret = ENOMEM;
 				goto end;
-			}
+			}*/
 			
 			// allocate space for all class-specific descriptors
@@ -317,7 +320,10 @@
 		dump_standard_hid_descriptor_header(&iface_d->hid_desc);
 		printf("\n");
+		dump_hid_class_descriptor(0, USB_DESCTYPE_HID_REPORT, 
+		    iface_d->report_desc, iface_d->hid_desc.report_desc_info.length);
+		printf("\n");
 //		printf("%d class-specific descriptors\n", 
 //		    iface_d->hid_desc.class_desc_count);
-		for (j = 0; j < iface_d->hid_desc.class_desc_count; ++j) {
+		/*for (j = 0; j < iface_d->hid_desc.class_desc_count; ++j) {
 			dump_standard_hid_class_descriptor_info(
 			    &iface_d->class_desc_info[j]);
@@ -329,5 +335,5 @@
 			    iface_d->class_descs[j],
 			    iface_d->class_desc_info[j].length);
-		}
+		}*/
 	}
 }
Index: uspace/drv/usbkbd/main.c
===================================================================
--- uspace/drv/usbkbd/main.c	(revision f40131243ad1635ce6cd59eaf5a91902710c0306)
+++ uspace/drv/usbkbd/main.c	(revision 450198656434e7e94937231839fa4d58efe9da6b)
@@ -39,4 +39,5 @@
 #include <usb/descriptor.h>
 #include "descparser.h"
+#include "descdump.h"
 
 #define BUFFER_SIZE 32
@@ -109,15 +110,29 @@
 	unsigned i;
 	for (i = 0; i < kbd_dev->conf->config_descriptor.interface_count; ++i) {
-		uint8_t type = 
-		    kbd_dev->conf->interfaces[i].hid_desc.report_desc_info.type;
 		// TODO: endianness
 		uint16_t length = 
 		    kbd_dev->conf->interfaces[i].hid_desc.report_desc_info.length;
+		size_t actual_size = 0;
 
 		// allocate space for the report descriptor
 		kbd_dev->conf->interfaces[i].report_desc = (uint8_t *)malloc(length);
+		
 		// get the descriptor from the device
-		
-	}
+		int rc = usb_drv_req_get_descriptor(kbd_dev->device->parent_phone,
+		    kbd_dev->address, USB_REQUEST_TYPE_CLASS, USB_DESCTYPE_HID_REPORT, 
+		    0, i, kbd_dev->conf->interfaces[i].report_desc, length, 
+		    &actual_size);
+
+		if (rc != EOK) {
+			return rc;
+		}
+
+		assert(actual_size == length);
+
+		dump_hid_class_descriptor(0, USB_DESCTYPE_HID_REPORT, 
+		    kbd_dev->conf->interfaces[i].report_desc, length);
+	}
+
+	return EOK;
 }
 
@@ -162,11 +177,19 @@
 	rc = usbkbd_parse_descriptors(descriptors, transferred, kbd_dev->conf);
 	free(descriptors);
+	if (rc != EOK) {
+		printf("Problem with parsing standard descriptors.\n");
+		return rc;
+	}
 
 	// get and report descriptors
 	rc = usbkbd_get_report_descriptor(kbd_dev);
+	if (rc != EOK) {
+		printf("Problem with parsing HID REPORT descriptor.\n");
+		return rc;
+	}
 	
 	usbkbd_print_config(kbd_dev->conf);
 	
-	return rc;
+	return EOK;
 }
 
Index: uspace/lib/usb/include/usb/classes/hid.h
===================================================================
--- uspace/lib/usb/include/usb/classes/hid.h	(revision f40131243ad1635ce6cd59eaf5a91902710c0306)
+++ uspace/lib/usb/include/usb/classes/hid.h	(revision 450198656434e7e94937231839fa4d58efe9da6b)
@@ -98,5 +98,5 @@
 	uint8_t class_desc_count;
 	/** First mandatory class descriptor (Report) info. */
-	usb_standard_hid_descriptor_class_item_t report_desc_info;
+	usb_standard_hid_class_descriptor_info_t report_desc_info;
 } __attribute__ ((packed)) usb_standard_hid_descriptor_t;
 
