Index: uspace/app/mkbd/main.c
===================================================================
--- uspace/app/mkbd/main.c	(revision a044f71edaa5af02881a5f002ebce9c2107d9d03)
+++ uspace/app/mkbd/main.c	(revision a8c4e8718c69460bac5d564eb0410ba82262b1ec)
@@ -69,5 +69,5 @@
 	int rc = usb_hid_report_init(*report);
 	if (rc != EOK) {
-		usb_hid_free_report(*report);
+		usb_hid_report_deinit(*report);
 		*report = NULL;
 		return rc;
@@ -79,5 +79,5 @@
 	    &report_desc_size);
 	if (rc != EOK) {
-		usb_hid_free_report(*report);
+		usb_hid_report_deinit(*report);
 		*report = NULL;
 		return rc;
@@ -85,5 +85,5 @@
 	
 	if (report_desc_size == 0) {
-		usb_hid_free_report(*report);
+		usb_hid_report_deinit(*report);
 		*report = NULL;
 		// TODO: other error code?
@@ -93,5 +93,5 @@
 	uint8_t *desc = (uint8_t *) malloc(report_desc_size);
 	if (desc == NULL) {
-		usb_hid_free_report(*report);
+		usb_hid_report_deinit(*report);
 		*report = NULL;
 		return ENOMEM;
@@ -103,5 +103,5 @@
 	    &actual_size);
 	if (rc != EOK) {
-		usb_hid_free_report(*report);
+		usb_hid_report_deinit(*report);
 		*report = NULL;
 		free(desc);
@@ -110,5 +110,5 @@
 	
 	if (actual_size != report_desc_size) {
-		usb_hid_free_report(*report);
+		usb_hid_report_deinit(*report);
 		*report = NULL;
 		free(desc);
Index: uspace/app/usbinfo/hid.c
===================================================================
--- uspace/app/usbinfo/hid.c	(revision a044f71edaa5af02881a5f002ebce9c2107d9d03)
+++ uspace/app/usbinfo/hid.c	(revision a8c4e8718c69460bac5d564eb0410ba82262b1ec)
@@ -167,5 +167,5 @@
 
 	free(raw_report);
-	usb_hid_free_report(&report);
+	usb_hid_report_deinit(&report);
 }
 
Index: uspace/drv/bus/usb/usbhid/kbd/kbddev.c
===================================================================
--- uspace/drv/bus/usb/usbhid/kbd/kbddev.c	(revision a044f71edaa5af02881a5f002ebce9c2107d9d03)
+++ uspace/drv/bus/usb/usbhid/kbd/kbddev.c	(revision a8c4e8718c69460bac5d564eb0410ba82262b1ec)
@@ -237,33 +237,33 @@
 
 	usb_hid_report_field_t *field = usb_hid_report_get_sibling(
-	    hid_dev->report, NULL, kbd_dev->led_path, 
+	    &hid_dev->report, NULL, kbd_dev->led_path,
 	    USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,
 	    USB_HID_REPORT_TYPE_OUTPUT);
 
 	while (field != NULL) {
-		
-		if ((field->usage == USB_HID_LED_NUM_LOCK) 
+
+		if ((field->usage == USB_HID_LED_NUM_LOCK)
 		    && (kbd_dev->mods & KM_NUM_LOCK)){
 			field->value = 1;
 		}
 
-		if ((field->usage == USB_HID_LED_CAPS_LOCK) 
+		if ((field->usage == USB_HID_LED_CAPS_LOCK)
 		    && (kbd_dev->mods & KM_CAPS_LOCK)){
 			field->value = 1;
 		}
 
-		if ((field->usage == USB_HID_LED_SCROLL_LOCK) 
+		if ((field->usage == USB_HID_LED_SCROLL_LOCK)
 		    && (kbd_dev->mods & KM_SCROLL_LOCK)){
 			field->value = 1;
 		}
-		
-		field = usb_hid_report_get_sibling(hid_dev->report, field,
-		    kbd_dev->led_path,  
-	    	USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,
-			USB_HID_REPORT_TYPE_OUTPUT);
+
+		field = usb_hid_report_get_sibling(
+		    &hid_dev->report, field, kbd_dev->led_path,
+		USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,
+		    USB_HID_REPORT_TYPE_OUTPUT);
 	}
 
 	// TODO: what about the Report ID?
-	int rc = usb_hid_report_output_translate(hid_dev->report, 0,
+	int rc = usb_hid_report_output_translate(&hid_dev->report, 0,
 	    kbd_dev->output_buffer, kbd_dev->output_size);
 
@@ -432,5 +432,4 @@
 static void usb_kbd_process_data(usb_hid_dev_t *hid_dev, usb_kbd_t *kbd_dev)
 {
-	assert(hid_dev->report != NULL);
 	assert(hid_dev != NULL);
 	assert(kbd_dev != NULL);
@@ -444,6 +443,6 @@
 
 	usb_hid_report_field_t *field = usb_hid_report_get_sibling(
-	    hid_dev->report, NULL, path, 
-	    USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 
+	    &hid_dev->report, NULL, path,
+	    USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,
 	    USB_HID_REPORT_TYPE_INPUT);
 	unsigned i = 0;
@@ -454,5 +453,5 @@
 		
 		assert(i < kbd_dev->key_count);
-		
+
 		// save the key usage
 		if (field->value != 0) {
@@ -463,9 +462,9 @@
 		}
 		usb_log_debug2("Saved %u. key usage %d\n", i, kbd_dev->keys[i]);
-		
+
 		++i;
-		field = usb_hid_report_get_sibling(hid_dev->report, field, path, 
-		    USB_HID_PATH_COMPARE_END 
-		    | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 
+		field = usb_hid_report_get_sibling(
+		    &hid_dev->report, field, path, USB_HID_PATH_COMPARE_END
+		        | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,
 		    USB_HID_REPORT_TYPE_INPUT);
 	}
@@ -616,10 +615,10 @@
 
 	kbd_dev->key_count = usb_hid_report_size(
-	    hid_dev->report, 0, USB_HID_REPORT_TYPE_INPUT); 
+	    &hid_dev->report, 0, USB_HID_REPORT_TYPE_INPUT);
 	usb_hid_report_path_free(path);
 
 	usb_log_debug("Size of the input report: %zu\n", kbd_dev->key_count);
 
-	kbd_dev->keys = (int32_t *)calloc(kbd_dev->key_count, sizeof(int32_t));
+	kbd_dev->keys = calloc(kbd_dev->key_count, sizeof(int32_t));
 
 	if (kbd_dev->keys == NULL) {
@@ -643,5 +642,5 @@
 	 */
 	kbd_dev->output_size = 0;
-	kbd_dev->output_buffer = usb_hid_report_output(hid_dev->report, 
+	kbd_dev->output_buffer = usb_hid_report_output(&hid_dev->report,
 	    &kbd_dev->output_size, 0);
 	if (kbd_dev->output_buffer == NULL) {
@@ -657,6 +656,6 @@
 	    kbd_dev->led_path, USB_HIDUT_PAGE_LED, 0);
 
-	kbd_dev->led_output_size = usb_hid_report_size(hid_dev->report, 
-	    0, USB_HID_REPORT_TYPE_OUTPUT);
+	kbd_dev->led_output_size = usb_hid_report_size(
+	    &hid_dev->report, 0, USB_HID_REPORT_TYPE_OUTPUT);
 
 	usb_log_debug("Output report size (in items): %zu\n", 
@@ -826,6 +825,6 @@
 int usb_kbd_set_boot_protocol(usb_hid_dev_t *hid_dev)
 {
-	int rc = usb_hid_parse_report_descriptor(hid_dev->report, 
-	    USB_KBD_BOOT_REPORT_DESCRIPTOR, 
+	int rc = usb_hid_parse_report_descriptor(
+	    &hid_dev->report, USB_KBD_BOOT_REPORT_DESCRIPTOR,
 	    USB_KBD_BOOT_REPORT_DESCRIPTOR_SIZE);
 
@@ -836,5 +835,5 @@
 	}
 
-	rc = usbhid_req_set_protocol(&hid_dev->usb_dev->ctrl_pipe, 
+	rc = usbhid_req_set_protocol(&hid_dev->usb_dev->ctrl_pipe,
 	    hid_dev->usb_dev->interface_no, USB_HID_PROTOCOL_BOOT);
 
Index: uspace/drv/bus/usb/usbhid/main.c
===================================================================
--- uspace/drv/bus/usb/usbhid/main.c	(revision a044f71edaa5af02881a5f002ebce9c2107d9d03)
+++ uspace/drv/bus/usb/usbhid/main.c	(revision a8c4e8718c69460bac5d564eb0410ba82262b1ec)
@@ -92,5 +92,5 @@
 	if (rc != EOK) {
 		usb_log_error("Failed to initialize USB/HID device.\n");
-		usb_hid_destroy(hid_dev);
+		usb_hid_deinit(hid_dev);
 		return rc;
 	}
@@ -128,9 +128,8 @@
 		usb_log_error("Failed to start polling fibril for `%s'.\n",
 		    dev->ddf_dev->name);
-		usb_hid_destroy(hid_dev);
+		usb_hid_deinit(hid_dev);
 		return rc;
 	}
 	hid_dev->running = true;
-	dev->driver_data = hid_dev;
 
 	/*
@@ -204,5 +203,5 @@
 
 	assert(!hid_dev->running);
-	usb_hid_destroy(hid_dev);
+	usb_hid_deinit(hid_dev);
 	usb_log_debug2("%s destruction complete.\n", dev->ddf_dev->name);
 	return EOK;
Index: uspace/drv/bus/usb/usbhid/mouse/mousedev.c
===================================================================
--- uspace/drv/bus/usb/usbhid/mouse/mousedev.c	(revision a044f71edaa5af02881a5f002ebce9c2107d9d03)
+++ uspace/drv/bus/usb/usbhid/mouse/mousedev.c	(revision a8c4e8718c69460bac5d564eb0410ba82262b1ec)
@@ -268,12 +268,13 @@
 
 	int shift_x = get_mouse_axis_move_value(hid_dev->report_id,
-	    hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_X);
+	    &hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_X);
 	int shift_y = get_mouse_axis_move_value(hid_dev->report_id,
-	    hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_Y);
+	    &hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_Y);
 	int wheel = get_mouse_axis_move_value(hid_dev->report_id,
-	    hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_WHEEL);
+	    &hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_WHEEL);
 
 	if ((shift_x != 0) || (shift_y != 0)) {
-		async_exch_t *exch = async_exchange_begin(mouse_dev->mouse_sess);
+		async_exch_t *exch =
+		    async_exchange_begin(mouse_dev->mouse_sess);
 		async_req_2_0(exch, MOUSEEV_MOVE_EVENT, shift_x, shift_y);
 		async_exchange_end(exch);
@@ -291,7 +292,6 @@
 
 	usb_hid_report_field_t *field = usb_hid_report_get_sibling(
-	    hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END
-	    | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 
-	    USB_HID_REPORT_TYPE_INPUT);
+	    &hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END
+	    | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, USB_HID_REPORT_TYPE_INPUT);
 
 	while (field != NULL) {
@@ -314,12 +314,12 @@
 			async_req_2_0(exch, MOUSEEV_BUTTON_EVENT, field->usage, 0);
 			async_exchange_end(exch);
-			
+
 			mouse_dev->buttons[field->usage - field->usage_minimum] =
 			   field->value;
 		}
-		
+
 		field = usb_hid_report_get_sibling(
-		    hid_dev->report, field, path, USB_HID_PATH_COMPARE_END
-		    | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 
+		    &hid_dev->report, field, path, USB_HID_PATH_COMPARE_END
+		    | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,
 		    USB_HID_REPORT_TYPE_INPUT);
 	}
@@ -474,6 +474,6 @@
 	// that the current solution is good enough.
 	/* Adding 1 because we will be accessing buttons[highest]. */
-	mouse_dev->buttons_count = usb_mouse_get_highest_button(hid_dev->report,
-	    hid_dev->report_id) + 1;
+	mouse_dev->buttons_count = 1 + usb_mouse_get_highest_button(
+	    &hid_dev->report, hid_dev->report_id);
 	mouse_dev->buttons = calloc(mouse_dev->buttons_count, sizeof(int32_t));
 
@@ -532,6 +532,6 @@
 int usb_mouse_set_boot_protocol(usb_hid_dev_t *hid_dev)
 {
-	int rc = usb_hid_parse_report_descriptor(hid_dev->report, 
-	    USB_MOUSE_BOOT_REPORT_DESCRIPTOR, 
+	int rc = usb_hid_parse_report_descriptor(
+	    &hid_dev->report, USB_MOUSE_BOOT_REPORT_DESCRIPTOR,
 	    USB_MOUSE_BOOT_REPORT_DESCRIPTOR_SIZE);
 
@@ -542,5 +542,5 @@
 	}
 
-	rc = usbhid_req_set_protocol(&hid_dev->usb_dev->ctrl_pipe, 
+	rc = usbhid_req_set_protocol(&hid_dev->usb_dev->ctrl_pipe,
 	    hid_dev->usb_dev->interface_no, USB_HID_PROTOCOL_BOOT);
 
Index: uspace/drv/bus/usb/usbhid/multimedia/multimedia.c
===================================================================
--- uspace/drv/bus/usb/usbhid/multimedia/multimedia.c	(revision a044f71edaa5af02881a5f002ebce9c2107d9d03)
+++ uspace/drv/bus/usb/usbhid/multimedia/multimedia.c	(revision a8c4e8718c69460bac5d564eb0410ba82262b1ec)
@@ -272,6 +272,6 @@
 
 	usb_hid_report_field_t *field = usb_hid_report_get_sibling(
-	    hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END 
-	    | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 
+	    &hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END
+	    | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,
 	    USB_HID_REPORT_TYPE_INPUT);
 
@@ -293,5 +293,5 @@
 
 		field = usb_hid_report_get_sibling(
-		    hid_dev->report, field, path, USB_HID_PATH_COMPARE_END
+		    &hid_dev->report, field, path, USB_HID_PATH_COMPARE_END
 		    | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 
 		    USB_HID_REPORT_TYPE_INPUT);
Index: uspace/drv/bus/usb/usbhid/usbhid.c
===================================================================
--- uspace/drv/bus/usb/usbhid/usbhid.c	(revision a044f71edaa5af02881a5f002ebce9c2107d9d03)
+++ uspace/drv/bus/usb/usbhid/usbhid.c	(revision a8c4e8718c69460bac5d564eb0410ba82262b1ec)
@@ -204,6 +204,4 @@
 	}
 
-	assert(hid_dev->report != NULL);
-
 	usb_log_debug("Compare flags: %d\n", mapping->compare);
 
@@ -213,5 +211,5 @@
 	do {
 		usb_log_debug("Trying report id %u\n", report_id);
-		
+
 		if (report_id != 0) {
 			usb_hid_report_path_set_report_id(usage_path,
@@ -220,8 +218,7 @@
 
 		usb_hid_report_field_t *field = usb_hid_report_get_sibling(
-		    hid_dev->report,
-		    NULL, usage_path, mapping->compare, 
+		    &hid_dev->report, NULL, usage_path, mapping->compare,
 		    USB_HID_REPORT_TYPE_INPUT);
-		
+
 		usb_log_debug("Field: %p\n", field);
 
@@ -230,8 +227,7 @@
 			break;
 		}
-		
+
 		report_id = usb_hid_get_next_report_id(
-		    hid_dev->report, report_id,
-		    USB_HID_REPORT_TYPE_INPUT);
+		    &hid_dev->report, report_id, USB_HID_REPORT_TYPE_INPUT);
 	} while (!matches && report_id != 0);
 
@@ -378,19 +374,18 @@
 static int usb_hid_init_report(usb_hid_dev_t *hid_dev)
 {
-	assert(hid_dev != NULL && hid_dev->report != NULL);
+	assert(hid_dev != NULL);
 
 	uint8_t report_id = 0;
-	size_t size;
-
 	size_t max_size = 0;
 
 	do {
 		usb_log_debug("Getting size of the report.\n");
-		size = usb_hid_report_byte_size(hid_dev->report, report_id, 
-		    USB_HID_REPORT_TYPE_INPUT);
+		const size_t size =
+		    usb_hid_report_byte_size(&hid_dev->report, report_id,
+		        USB_HID_REPORT_TYPE_INPUT);
 		usb_log_debug("Report ID: %u, size: %zu\n", report_id, size);
 		max_size = (size > max_size) ? size : max_size;
 		usb_log_debug("Getting next report ID\n");
-		report_id = usb_hid_get_next_report_id(hid_dev->report, 
+		report_id = usb_hid_get_next_report_id(&hid_dev->report,
 		    report_id, USB_HID_REPORT_TYPE_INPUT);
 	} while (report_id != 0);
@@ -430,11 +425,5 @@
 	}
 
-	hid_dev->report = (usb_hid_report_t *)(malloc(sizeof(
-	    usb_hid_report_t)));
-	if (hid_dev->report == NULL) {
-		usb_log_error("No memory!\n");
-		return ENOMEM;
-	}
-	usb_hid_report_init(hid_dev->report);
+	usb_hid_report_init(&hid_dev->report);
 
 	/* The USB device should already be initialized, save it in structure */
@@ -446,8 +435,8 @@
 		return rc;
 	}
-		
+
 	/* Get the report descriptor and parse it. */
-	rc = usb_hid_process_report_descriptor(hid_dev->usb_dev, 
-	    hid_dev->report, &hid_dev->report_desc, &hid_dev->report_desc_size);
+	rc = usb_hid_process_report_descriptor(hid_dev->usb_dev,
+	    &hid_dev->report, &hid_dev->report_desc, &hid_dev->report_desc_size);
 
 	bool fallback = false;
@@ -524,5 +513,5 @@
 			}
 		}
-		
+
 		rc = (ok) ? EOK : -1;	// what error to report
 	}
@@ -570,5 +559,5 @@
 	// parse the input report
 
-	int rc = usb_hid_parse_report(hid_dev->report, buffer, buffer_size, 
+	int rc = usb_hid_parse_report(&hid_dev->report, buffer, buffer_size,
 	    &hid_dev->report_id);
 
@@ -576,5 +565,5 @@
 		usb_log_warning("Error in usb_hid_parse_report():"
 		    "%s\n", str_error(rc));
-	}	
+	}
 
 	bool cont = false;
@@ -631,5 +620,5 @@
 /*----------------------------------------------------------------------------*/
 
-void usb_hid_destroy(usb_hid_dev_t *hid_dev)
+void usb_hid_deinit(usb_hid_dev_t *hid_dev)
 {
 	int i;
@@ -657,7 +646,5 @@
 
 	/* Destroy the parser */
-	if (hid_dev->report != NULL) {
-		usb_hid_free_report(hid_dev->report);
-	}
+	usb_hid_report_deinit(&hid_dev->report);
 
 }
Index: uspace/drv/bus/usb/usbhid/usbhid.h
===================================================================
--- uspace/drv/bus/usb/usbhid/usbhid.h	(revision a044f71edaa5af02881a5f002ebce9c2107d9d03)
+++ uspace/drv/bus/usb/usbhid/usbhid.h	(revision a8c4e8718c69460bac5d564eb0410ba82262b1ec)
@@ -119,5 +119,5 @@
 
 	/** HID Report parser. */
-	usb_hid_report_t *report;
+	usb_hid_report_t report;
 
 	uint8_t report_id;
@@ -146,16 +146,14 @@
 
 int usb_hid_init(usb_hid_dev_t *hid_dev, usb_device_t *dev);
+void usb_hid_deinit(usb_hid_dev_t *hid_dev);
 
-bool usb_hid_polling_callback(usb_device_t *dev, uint8_t *buffer, 
-    size_t buffer_size, void *arg);
+bool usb_hid_polling_callback(usb_device_t *dev,
+    uint8_t *buffer, size_t buffer_size, void *arg);
 
-void usb_hid_polling_ended_callback(usb_device_t *dev, bool reason, 
-     void *arg);
+void usb_hid_polling_ended_callback(usb_device_t *dev, bool reason, void *arg);
 
 void usb_hid_new_report(usb_hid_dev_t *hid_dev);
 
 int usb_hid_report_number(usb_hid_dev_t *hid_dev);
-
-void usb_hid_destroy(usb_hid_dev_t *hid_dev);
 
 #endif /* USB_HID_USBHID_H_ */
Index: uspace/lib/usbhid/include/usb/hid/hiddescriptor.h
===================================================================
--- uspace/lib/usbhid/include/usb/hid/hiddescriptor.h	(revision a044f71edaa5af02881a5f002ebce9c2107d9d03)
+++ uspace/lib/usbhid/include/usb/hid/hiddescriptor.h	(revision a8c4e8718c69460bac5d564eb0410ba82262b1ec)
@@ -42,12 +42,12 @@
 #include <usb/hid/hidtypes.h>
 
-int usb_hid_parse_report_descriptor(usb_hid_report_t *report, 
+int usb_hid_parse_report_descriptor(usb_hid_report_t *report,
 		const uint8_t *data, size_t size);
-
-void usb_hid_free_report(usb_hid_report_t *report);
 
 void usb_hid_descriptor_print(usb_hid_report_t *report);
 
 int usb_hid_report_init(usb_hid_report_t *report);
+
+void usb_hid_report_deinit(usb_hid_report_t *report);
 
 int usb_hid_report_append_fields(usb_hid_report_t *report,
Index: uspace/lib/usbhid/src/hiddescriptor.c
===================================================================
--- uspace/lib/usbhid/src/hiddescriptor.c	(revision a044f71edaa5af02881a5f002ebce9c2107d9d03)
+++ uspace/lib/usbhid/src/hiddescriptor.c	(revision a8c4e8718c69460bac5d564eb0410ba82262b1ec)
@@ -1016,5 +1016,5 @@
  * @return void
  */
-void usb_hid_free_report(usb_hid_report_t *report)
+void usb_hid_report_deinit(usb_hid_report_t *report)
 {
 	if(report == NULL){
