Index: uspace/app/mkbd/main.c
===================================================================
--- uspace/app/mkbd/main.c	(revision 9dddb3dfa6c4ae26ceff0ac4e871f83e29b386e2)
+++ uspace/app/mkbd/main.c	(revision fa8d346ef5665261176259869ebcc53b8ab53d26)
@@ -60,14 +60,16 @@
 static int dev_phone = -1;
 
-static int initialize_report_parser(int dev_phone, usb_hid_report_t *report)
-{
-	report = (usb_hid_report_t *)malloc(sizeof(usb_hid_report_t));
-	if (report == NULL) {
-		return ENOMEM;
-	}
-	
-	int rc = usb_hid_report_init(report);
-	if (rc != EOK) {
-		usb_hid_free_report(report);
+static int initialize_report_parser(int dev_phone, usb_hid_report_t **report)
+{
+	*report = (usb_hid_report_t *)malloc(sizeof(usb_hid_report_t));
+	if (*report == NULL) {
+		return ENOMEM;
+	}
+	
+	int rc = usb_hid_report_init(*report);
+	if (rc != EOK) {
+		usb_hid_free_report(*report);
+		*report = NULL;
+		printf("usb_hid_report_init() failed.\n");
 		return rc;
 	}
@@ -78,10 +80,14 @@
 	    dev_phone, &report_desc_size);
 	if (rc != EOK) {
-		usb_hid_free_report(report);
+		usb_hid_free_report(*report);
+		*report = NULL;
+		printf("usbhid_dev_get_report_descriptor_length() failed.\n");
 		return rc;
 	}
 	
 	if (report_desc_size == 0) {
-		usb_hid_free_report(report);
+		usb_hid_free_report(*report);
+		*report = NULL;
+		printf("usbhid_dev_get_report_descriptor_length() returned 0.\n");
 		return EINVAL;	// TODO: other error code?
 	}
@@ -89,5 +95,6 @@
 	uint8_t *desc = (uint8_t *)malloc(report_desc_size);
 	if (desc == NULL) {
-		usb_hid_free_report(report);
+		usb_hid_free_report(*report);
+		*report = NULL;
 		return ENOMEM;
 	}
@@ -98,12 +105,17 @@
 	    &actual_size);
 	if (rc != EOK) {
-		usb_hid_free_report(report);
+		usb_hid_free_report(*report);
+		*report = NULL;
 		free(desc);
+		printf("usbhid_dev_get_report_descriptor() failed.\n");
 		return rc;
 	}
 	
 	if (actual_size != report_desc_size) {
-		usb_hid_free_report(report);
+		usb_hid_free_report(*report);
+		*report = NULL;
 		free(desc);
+		printf("usbhid_dev_get_report_descriptor() returned wrong size:"
+		    " %zu, expected: %zu.\n", actual_size, report_desc_size);
 		return EINVAL;	// TODO: other error code?
 	}
@@ -111,9 +123,10 @@
 	// initialize the report parser
 	
-	rc = usb_hid_parse_report_descriptor(report, desc, report_desc_size);
+	rc = usb_hid_parse_report_descriptor(*report, desc, report_desc_size);
 	free(desc);
 	
 	if (rc != EOK) {
 		free(desc);
+		printf("usb_hid_parse_report_descriptor() failed.\n");
 		return rc;
 	}
@@ -215,5 +228,5 @@
 	
 	usb_hid_report_t *report = NULL;
-	rc = initialize_report_parser(dev_phone, report);
+	rc = initialize_report_parser(dev_phone, &report);
 	if (rc != EOK) {
 		printf("Failed to initialize report parser: %s\n",
Index: uspace/drv/usbhid/generic/hiddev.c
===================================================================
--- uspace/drv/usbhid/generic/hiddev.c	(revision 9dddb3dfa6c4ae26ceff0ac4e871f83e29b386e2)
+++ uspace/drv/usbhid/generic/hiddev.c	(revision fa8d346ef5665261176259869ebcc53b8ab53d26)
@@ -153,4 +153,6 @@
 	usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;
 	
+	printf("hid_dev->report_desc_size = %zu\n", hid_dev->report_desc_size);
+	
 	return hid_dev->report_desc_size;
 }
Index: uspace/drv/usbhid/usbhid.c
===================================================================
--- uspace/drv/usbhid/usbhid.c	(revision 9dddb3dfa6c4ae26ceff0ac4e871f83e29b386e2)
+++ uspace/drv/usbhid/usbhid.c	(revision fa8d346ef5665261176259869ebcc53b8ab53d26)
@@ -443,5 +443,5 @@
 	/* Get the report descriptor and parse it. */
 	rc = usb_hid_process_report_descriptor(hid_dev->usb_dev, 
-	    hid_dev->report);
+	    hid_dev->report, &hid_dev->report_desc, &hid_dev->report_desc_size);
 	
 	bool fallback = false;
Index: uspace/lib/usbhid/include/usb/hid/hidreport.h
===================================================================
--- uspace/lib/usbhid/include/usb/hid/hidreport.h	(revision 9dddb3dfa6c4ae26ceff0ac4e871f83e29b386e2)
+++ uspace/lib/usbhid/include/usb/hid/hidreport.h	(revision fa8d346ef5665261176259869ebcc53b8ab53d26)
@@ -44,6 +44,8 @@
  * report parser.
  *
- * \param dev USB device representing a HID device.
- * \param parser HID Report parser.
+ * \param[in] dev USB device representing a HID device.
+ * \param[in/out] parser HID Report parser.
+ * \param[out] report_desc Place to save report descriptor into.
+ * \param[out] report_size
  *
  * \retval EOK if successful.
@@ -57,5 +59,5 @@
  */
 int usb_hid_process_report_descriptor(usb_device_t *dev, 
-    usb_hid_report_t *report);
+    usb_hid_report_t *report, uint8_t **report_desc, size_t *report_size);
 
 #endif /* LIBUSB_HIDREPORT_H_ */
Index: uspace/lib/usbhid/src/hidreport.c
===================================================================
--- uspace/lib/usbhid/src/hidreport.c	(revision 9dddb3dfa6c4ae26ceff0ac4e871f83e29b386e2)
+++ uspace/lib/usbhid/src/hidreport.c	(revision fa8d346ef5665261176259869ebcc53b8ab53d26)
@@ -164,5 +164,5 @@
 
 int usb_hid_process_report_descriptor(usb_device_t *dev, 
-    usb_hid_report_t *report)
+    usb_hid_report_t *report, uint8_t **report_desc, size_t *report_size)
 {
 	if (dev == NULL || report == NULL) {
@@ -172,31 +172,31 @@
 	}
 	
-	uint8_t *report_desc = NULL;
-	size_t report_size;
-	
-	int rc = usb_hid_get_report_descriptor(dev, &report_desc, 
-	    &report_size);
+//	uint8_t *report_desc = NULL;
+//	size_t report_size;
+	
+	int rc = usb_hid_get_report_descriptor(dev, report_desc, report_size);
 	
 	if (rc != EOK) {
 		usb_log_error("Problem with getting Report descriptor: %s.\n",
 		    str_error(rc));
-		if (report_desc != NULL) {
-			free(report_desc);
+		if (*report_desc != NULL) {
+			free(*report_desc);
+			*report_desc = NULL;
 		}
 		return rc;
 	}
 	
-	assert(report_desc != NULL);
-	
-	rc = usb_hid_parse_report_descriptor(report, report_desc, report_size);
+	assert(*report_desc != NULL);
+	
+	rc = usb_hid_parse_report_descriptor(report, *report_desc, *report_size);
 	if (rc != EOK) {
 		usb_log_error("Problem parsing Report descriptor: %s.\n",
 		    str_error(rc));
-		free(report_desc);
+		free(*report_desc);
+		*report_desc = NULL;
 		return rc;
 	}
 	
 	usb_hid_descriptor_print(report);
-	free(report_desc);
 	
 	return EOK;
