Index: uspace/lib/usb/include/usb/classes/hid.h
===================================================================
--- uspace/lib/usb/include/usb/classes/hid.h	(revision a66225f339a670fa920a5602817f6be2c91161db)
+++ uspace/lib/usb/include/usb/classes/hid.h	(revision 39c3d95d4e176ba6534698cbda1809c2c71dc3ed)
@@ -36,4 +36,8 @@
 #define LIBUSB_HID_H_
 
+#include <usb/usb.h>
+#include <driver.h>
+#include <usb/classes/hidparser.h>
+
 /** USB/HID device requests. */
 typedef enum {
@@ -54,4 +58,50 @@
 } usb_hid_protocol_t;
 
+/** Part of standard USB HID descriptor specifying one class descriptor.
+ *
+ * (See HID Specification, p.22)
+ */
+typedef struct {
+	/** Type of class descriptor (Report or Physical). */
+	uint8_t class_descriptor_type;
+	/** Length of class descriptor. */
+	uint16_t class_descriptor_length;
+} __attribute__ ((packed)) usb_standard_hid_descriptor_class_item_t;
+
+/** Standard USB HID descriptor.
+ *
+ * (See HID Specification, p.22)
+ * 
+ * It is actually only the "header" of the descriptor, as it may have arbitrary
+ * length if more than one class descritor is provided.
+ */
+typedef struct {
+	/** Size of this descriptor in bytes. */
+	uint8_t length;
+	/** Descriptor type (USB_DESCTYPE_HID). */
+	uint8_t descriptor_type;
+	/** HID Class Specification release. */
+	uint16_t spec_release;
+	/** Country code of localized hardware. */
+	uint8_t country_code;
+	/** Total number of class (i.e. Report and Physical) descriptors. */
+	uint8_t class_count;
+	/** First mandatory class descriptor info. */
+	usb_standard_hid_descriptor_class_item_t class_descriptor;
+} __attribute__ ((packed)) usb_standard_hid_descriptor_t;
+
+
+/**
+ * @brief USB/HID keyboard device type.
+ *
+ * Quite dummy right now.
+ */
+typedef struct {
+	device_t *device;
+	usb_address_t address;
+	usb_endpoint_t default_ep;
+	usb_hid_report_parser_t *parser;
+} usb_hid_dev_kbd_t;
+
 #endif
 /**
Index: uspace/lib/usb/include/usb/classes/hidparser.h
===================================================================
--- uspace/lib/usb/include/usb/classes/hidparser.h	(revision a66225f339a670fa920a5602817f6be2c91161db)
+++ uspace/lib/usb/include/usb/classes/hidparser.h	(revision 39c3d95d4e176ba6534698cbda1809c2c71dc3ed)
@@ -50,12 +50,12 @@
 	 * @param arg Custom argument.
 	 */
-	void (*keyboard)(const uint32_t *key_codes, size_t count, void *arg);
+	void (*keyboard)(const uint16_t *key_codes, size_t count, void *arg);
 } usb_hid_report_in_callbacks_t;
 
 int usb_hid_parse_report_descriptor(usb_hid_report_parser_t *parser, 
-    const uint8_t *data);
+    const uint8_t *data, size_t size);
 
 int usb_hid_parse_report(const usb_hid_report_parser_t *parser,  
-    const uint8_t *data,
+    const uint8_t *data, size_t size,
     const usb_hid_report_in_callbacks_t *callbacks, void *arg);
 
Index: uspace/lib/usb/src/hidparser.c
===================================================================
--- uspace/lib/usb/src/hidparser.c	(revision a66225f339a670fa920a5602817f6be2c91161db)
+++ uspace/lib/usb/src/hidparser.c	(revision 39c3d95d4e176ba6534698cbda1809c2c71dc3ed)
@@ -40,8 +40,9 @@
  * @param parser Opaque HID report parser structure.
  * @param data Data describing the report.
+ * @param size Size of the descriptor in bytes.
  * @return Error code.
  */
 int usb_hid_parse_report_descriptor(usb_hid_report_parser_t *parser, 
-    const uint8_t *data)
+    const uint8_t *data, size_t size)
 {
 	return ENOTSUP;
@@ -54,4 +55,5 @@
  * @param parser Opaque HID report parser structure.
  * @param data Data for the report.
+ * @param size Size of the data in bytes.
  * @param callbacks Callbacks for report actions.
  * @param arg Custom argument (passed through to the callbacks).
@@ -59,8 +61,20 @@
  */
 int usb_hid_parse_report(const usb_hid_report_parser_t *parser,  
-    const uint8_t *data,
+    const uint8_t *data, size_t size,
     const usb_hid_report_in_callbacks_t *callbacks, void *arg)
 {
-	return ENOTSUP;
+	int i;
+	
+	// TODO: parse report
+	
+	uint16_t keys[6];
+	
+	for (i = 0; i < 6; ++i) {
+		keys[i] = data[i];
+	}
+	
+	callbacks->keyboard(keys, 6, arg);
+	
+	return EOK;
 }
 
Index: uspace/lib/usb/src/usbdrvreq.c
===================================================================
--- uspace/lib/usb/src/usbdrvreq.c	(revision a66225f339a670fa920a5602817f6be2c91161db)
+++ uspace/lib/usb/src/usbdrvreq.c	(revision 39c3d95d4e176ba6534698cbda1809c2c71dc3ed)
@@ -162,5 +162,5 @@
 		.request = USB_DEVREQ_GET_DESCRIPTOR,
 		.index = 0,
-		.length = sizeof(usb_standard_device_descriptor_t)
+		.length = sizeof(usb_standard_configuration_descriptor_t)
 	};
 	setup_packet.value_high = USB_DESCTYPE_CONFIGURATION;
@@ -225,5 +225,5 @@
 		.request = USB_DEVREQ_GET_DESCRIPTOR,
 		.index = 0,
-		.length = sizeof(usb_standard_device_descriptor_t)
+		.length = buffer_size
 	};
 	setup_packet.value_high = USB_DESCTYPE_CONFIGURATION;
