Index: uspace/drv/usbhid/hiddev.c
===================================================================
--- uspace/drv/usbhid/hiddev.c	(revision 021351c49ad9b282c9fd4387a343e613e66462f4)
+++ uspace/drv/usbhid/hiddev.c	(revision 5050d9e5f8c674169834b04f9e7b1c96454e09ea)
@@ -135,4 +135,6 @@
 	}
 	
+	hid_dev->report_desc_size = length;
+	
 	usb_log_debug("Done.\n");
 	
@@ -219,5 +221,13 @@
 	
 	if (rc != EOK) {
-		usb_log_warning("Problem with parsing Report descriptor: %s.\n",
+		usb_log_warning("Problem with getting Report descriptor: %s.\n",
+		    str_error(rc));
+		return rc;
+	}
+	
+	rc = usb_hid_parse_report_descriptor(hid_dev->parser, 
+	    hid_dev->report_desc, hid_dev->report_desc_size);
+	if (rc != EOK) {
+		usb_log_warning("Problem parsing Report descriptor: %s.\n",
 		    str_error(rc));
 		return rc;
@@ -243,4 +253,12 @@
 	memset(dev, 0, sizeof(usbhid_dev_t));
 	
+	dev->parser = (usb_hid_report_parser_t *)(malloc(sizeof(
+	    usb_hid_report_parser_t)));
+	if (dev->parser == NULL) {
+		usb_log_fatal("No memory!\n");
+		free(dev);
+		return NULL;
+	}
+	
 	dev->initialized = 0;
 	
@@ -319,4 +337,13 @@
 		return rc;
 	}
+	
+	/*
+	 * Initialize the report parser.
+	 */
+	rc = usb_hid_parser_init(hid_dev->parser);
+	if (rc != EOK) {
+		usb_log_error("Failed to initialize report parser.\n");
+		return rc;
+	}
 
 	/*
Index: uspace/drv/usbhid/hiddev.h
===================================================================
--- uspace/drv/usbhid/hiddev.h	(revision 021351c49ad9b282c9fd4387a343e613e66462f4)
+++ uspace/drv/usbhid/hiddev.h	(revision 5050d9e5f8c674169834b04f9e7b1c96454e09ea)
@@ -62,4 +62,5 @@
 	
 	uint8_t *report_desc;
+	size_t report_desc_size;
 	usb_hid_report_parser_t *parser;
 	
Index: uspace/drv/usbhid/kbddev.c
===================================================================
--- uspace/drv/usbhid/kbddev.c	(revision 021351c49ad9b282c9fd4387a343e613e66462f4)
+++ uspace/drv/usbhid/kbddev.c	(revision 5050d9e5f8c674169834b04f9e7b1c96454e09ea)
@@ -496,4 +496,6 @@
 	}
 	
+	usb_hid_free_report_parser((*kbd_dev)->parser);
+	
 	free(*kbd_dev);
 	*kbd_dev = NULL;
Index: uspace/drv/usbhid/kbddev.h
===================================================================
--- uspace/drv/usbhid/kbddev.h	(revision 021351c49ad9b282c9fd4387a343e613e66462f4)
+++ uspace/drv/usbhid/kbddev.h	(revision 5050d9e5f8c674169834b04f9e7b1c96454e09ea)
@@ -40,4 +40,5 @@
 
 #include <usb/classes/hid.h>
+#include <usb/classes/hidparser.h>
 #include <ddf/driver.h>
 #include <usb/pipes.h>
@@ -62,4 +63,6 @@
 	int console_phone;
 	
+	usb_hid_report_parser_t *parser;
+	
 	int initialized;
 } usbhid_kbd_t;
