Index: uspace/drv/ohci/root_hub.c
===================================================================
--- uspace/drv/ohci/root_hub.c	(revision df29f24d4abcaa1e1685723e6f90f6acdccb7941)
+++ uspace/drv/ohci/root_hub.c	(revision 65c3794fd7e56a1dd208b3e458ed818eeafbf8e0)
@@ -251,9 +251,9 @@
 	int opResult;
 	if (request->ep->transfer_type == USB_TRANSFER_CONTROL) {
-		usb_log_info("Root hub got CONTROL packet\n");
+		usb_log_debug("Root hub got CONTROL packet\n");
 		opResult = process_ctrl_request(instance, request);
 		usb_transfer_batch_finish_error(request, opResult);
 	} else if (request->ep->transfer_type == USB_TRANSFER_INTERRUPT) {
-		usb_log_info("Root hub got INTERRUPT packet\n");
+		usb_log_debug("Root hub got INTERRUPT packet\n");
 		create_interrupt_mask_in_instance(instance);
 		if (is_zeros(instance->interrupt_buffer,
Index: uspace/drv/usbhid/generic/hiddev.c
===================================================================
--- uspace/drv/usbhid/generic/hiddev.c	(revision df29f24d4abcaa1e1685723e6f90f6acdccb7941)
+++ uspace/drv/usbhid/generic/hiddev.c	(revision 65c3794fd7e56a1dd208b3e458ed818eeafbf8e0)
@@ -231,10 +231,10 @@
 /*----------------------------------------------------------------------------*/
 
-bool usb_generic_hid_polling_callback(usb_hid_dev_t *hid_dev, void *data, 
-    uint8_t *buffer, size_t buffer_size)
-{
-	usb_log_debug2("usb_hid_polling_callback(%p, %p, %zu)\n",
-	    hid_dev, buffer, buffer_size);
-	usb_debug_str_buffer(buffer, buffer_size, 0);
+bool usb_generic_hid_polling_callback(usb_hid_dev_t *hid_dev, void *data/*, 
+    uint8_t *buffer, size_t buffer_size*/)
+{
+//	usb_log_debug2("usb_hid_polling_callback(%p, %p, %zu)\n",
+//	    hid_dev, buffer, buffer_size);
+//	usb_debug_str_buffer(buffer, buffer_size, 0);
 	return true;
 }
Index: uspace/drv/usbhid/generic/hiddev.h
===================================================================
--- uspace/drv/usbhid/generic/hiddev.h	(revision df29f24d4abcaa1e1685723e6f90f6acdccb7941)
+++ uspace/drv/usbhid/generic/hiddev.h	(revision 65c3794fd7e56a1dd208b3e458ed818eeafbf8e0)
@@ -50,6 +50,6 @@
 int usb_generic_hid_init(struct usb_hid_dev *hid_dev, void **data);
 
-bool usb_generic_hid_polling_callback(struct usb_hid_dev *hid_dev, void *data,
-    uint8_t *buffer, size_t buffer_size);
+bool usb_generic_hid_polling_callback(struct usb_hid_dev *hid_dev, void *data/*,
+    uint8_t *buffer, size_t buffer_size*/);
 
 #endif // USB_HID_HIDDDEV_H_
Index: uspace/drv/usbhid/kbd/kbddev.c
===================================================================
--- uspace/drv/usbhid/kbd/kbddev.c	(revision df29f24d4abcaa1e1685723e6f90f6acdccb7941)
+++ uspace/drv/usbhid/kbd/kbddev.c	(revision 65c3794fd7e56a1dd208b3e458ed818eeafbf8e0)
@@ -529,6 +529,6 @@
  *     usb_hid_parse_report().
  */
-static void usb_kbd_process_data(usb_hid_dev_t *hid_dev, usb_kbd_t *kbd_dev,
-                                 uint8_t *buffer, size_t actual_size)
+static void usb_kbd_process_data(usb_hid_dev_t *hid_dev, usb_kbd_t *kbd_dev/*,
+                                 uint8_t *buffer, size_t actual_size*/)
 {
 	assert(hid_dev->report != NULL);
@@ -536,20 +536,20 @@
 	assert(kbd_dev != NULL);
 
-	usb_log_debug("Calling usb_hid_parse_report() with "
-	    "buffer %s\n", usb_debug_str_buffer(buffer, actual_size, 0));
+//	usb_log_debug("Calling usb_hid_parse_report() with "
+//	    "buffer %s\n", usb_debug_str_buffer(buffer, actual_size, 0));
 	
 	usb_hid_report_path_t *path = usb_hid_report_path();
 	usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_KEYBOARD, 0);
 
-	uint8_t report_id;
-	int rc = usb_hid_parse_report(hid_dev->report, buffer, actual_size, 
-	    &report_id);
-	
-	if (rc != EOK) {
-		usb_log_warning("Error in usb_hid_parse_report():"
-		    "%s\n", str_error(rc));
-	}
-	
-	usb_hid_report_path_set_report_id (path, report_id);
+//	uint8_t report_id;
+//	int rc = usb_hid_parse_report(hid_dev->report, buffer, actual_size, 
+//	    &report_id);
+	
+//	if (rc != EOK) {
+//		usb_log_warning("Error in usb_hid_parse_report():"
+//		    "%s\n", str_error(rc));
+//	}
+	
+	usb_hid_report_path_set_report_id (path, hid_dev->report_id);
 	
 	// fill in the currently pressed keys
@@ -848,8 +848,8 @@
 /*----------------------------------------------------------------------------*/
 
-bool usb_kbd_polling_callback(usb_hid_dev_t *hid_dev, void *data, 
-     uint8_t *buffer, size_t buffer_size)
-{
-	if (hid_dev == NULL || buffer == NULL || data == NULL) {
+bool usb_kbd_polling_callback(usb_hid_dev_t *hid_dev, void *data/*, 
+     uint8_t *buffer, size_t buffer_size*/)
+{
+	if (hid_dev == NULL/* || buffer == NULL*/ || data == NULL) {
 		// do not continue polling (???)
 		return false;
@@ -860,5 +860,5 @@
 	
 	// TODO: add return value from this function
-	usb_kbd_process_data(hid_dev, kbd_dev, buffer, buffer_size);
+	usb_kbd_process_data(hid_dev, kbd_dev/*, buffer, buffer_size*/);
 	
 	return true;
Index: uspace/drv/usbhid/kbd/kbddev.h
===================================================================
--- uspace/drv/usbhid/kbd/kbddev.h	(revision df29f24d4abcaa1e1685723e6f90f6acdccb7941)
+++ uspace/drv/usbhid/kbd/kbddev.h	(revision 65c3794fd7e56a1dd208b3e458ed818eeafbf8e0)
@@ -122,6 +122,6 @@
 int usb_kbd_init(struct usb_hid_dev *hid_dev, void **data);
 
-bool usb_kbd_polling_callback(struct usb_hid_dev *hid_dev, void *data, 
-                              uint8_t *buffer, size_t buffer_size);
+bool usb_kbd_polling_callback(struct usb_hid_dev *hid_dev, void *data/*, 
+                              uint8_t *buffer, size_t buffer_size*/);
 
 int usb_kbd_is_initialized(const usb_kbd_t *kbd_dev);
Index: uspace/drv/usbhid/mouse/mousedev.c
===================================================================
--- uspace/drv/usbhid/mouse/mousedev.c	(revision df29f24d4abcaa1e1685723e6f90f6acdccb7941)
+++ uspace/drv/usbhid/mouse/mousedev.c	(revision 65c3794fd7e56a1dd208b3e458ed818eeafbf8e0)
@@ -225,11 +225,11 @@
 
 static bool usb_mouse_process_report(usb_hid_dev_t *hid_dev, 
-                                     usb_mouse_t *mouse_dev, uint8_t *buffer,
-                                     size_t buffer_size)
+                                     usb_mouse_t *mouse_dev/*, uint8_t *buffer,
+                                     size_t buffer_size*/)
 {
 	assert(mouse_dev != NULL);
 	
-	usb_log_debug2("got buffer: %s.\n",
-	    usb_debug_str_buffer(buffer, buffer_size, 0));
+//	usb_log_debug2("got buffer: %s.\n",
+//	    usb_debug_str_buffer(buffer, buffer_size, 0));
 	
 	if (mouse_dev->mouse_phone < 0) {
@@ -242,17 +242,17 @@
 	 */
 	
-	usb_log_debug(NAME " Calling usb_hid_parse_report() with "
-	    "buffer %s\n", usb_debug_str_buffer(buffer, buffer_size, 0));
-	
-	uint8_t report_id;
-	
-	int rc = usb_hid_parse_report(hid_dev->report, buffer, buffer_size, 
-	    &report_id);
-	
-	if (rc != EOK) {
-		usb_log_warning(NAME "Error in usb_hid_parse_report(): %s\n", 
-		    str_error(rc));
-		return true;
-	}
+//	usb_log_debug(NAME " Calling usb_hid_parse_report() with "
+//	    "buffer %s\n", usb_debug_str_buffer(buffer, buffer_size, 0));
+	
+//	uint8_t report_id;
+	
+//	int rc = usb_hid_parse_report(hid_dev->report, buffer, buffer_size, 
+//	    &report_id);
+	
+//	if (rc != EOK) {
+//		usb_log_warning(NAME "Error in usb_hid_parse_report(): %s\n", 
+//		    str_error(rc));
+//		return true;
+//	}
 	
 	/*
@@ -265,5 +265,5 @@
 	    USB_HIDUT_USAGE_GENERIC_DESKTOP_X);
 
-	usb_hid_report_path_set_report_id(path, report_id);
+	usb_hid_report_path_set_report_id(path, hid_dev->report_id);
 
 	usb_hid_report_field_t *field = usb_hid_report_get_sibling(
@@ -288,5 +288,5 @@
 	    USB_HIDUT_USAGE_GENERIC_DESKTOP_Y);
 
-	usb_hid_report_path_set_report_id(path, report_id);
+	usb_hid_report_path_set_report_id(path, hid_dev->report_id);
 
 	field = usb_hid_report_get_sibling(
@@ -316,5 +316,5 @@
 	    USB_HIDUT_USAGE_GENERIC_DESKTOP_WHEEL);
 
-	usb_hid_report_path_set_report_id(path, report_id);
+	usb_hid_report_path_set_report_id(path, hid_dev->report_id);
 	
 	field = usb_hid_report_get_sibling(
@@ -340,5 +340,5 @@
 	path = usb_hid_report_path();
 	usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_BUTTON, 0);
-	usb_hid_report_path_set_report_id(path, report_id);
+	usb_hid_report_path_set_report_id(path, hid_dev->report_id);
 	
 	field = usb_hid_report_get_sibling(
@@ -505,9 +505,9 @@
 /*----------------------------------------------------------------------------*/
 
-bool usb_mouse_polling_callback(usb_hid_dev_t *hid_dev, void *data, 
-     uint8_t *buffer, size_t buffer_size)
+bool usb_mouse_polling_callback(usb_hid_dev_t *hid_dev, void *data/*, 
+     uint8_t *buffer, size_t buffer_size*/)
 {
 	usb_log_debug("usb_mouse_polling_callback()\n");
-	usb_debug_str_buffer(buffer, buffer_size, 0);
+//	usb_debug_str_buffer(buffer, buffer_size, 0);
 	
 	if (hid_dev == NULL || data == NULL) {
@@ -519,6 +519,6 @@
 	usb_mouse_t *mouse_dev = (usb_mouse_t *)data;
 		
-	return usb_mouse_process_report(hid_dev, mouse_dev, buffer, 
-	                                buffer_size);
+	return usb_mouse_process_report(hid_dev, mouse_dev/*, buffer, 
+	                                buffer_size*/);
 }
 
Index: uspace/drv/usbhid/mouse/mousedev.h
===================================================================
--- uspace/drv/usbhid/mouse/mousedev.h	(revision df29f24d4abcaa1e1685723e6f90f6acdccb7941)
+++ uspace/drv/usbhid/mouse/mousedev.h	(revision 65c3794fd7e56a1dd208b3e458ed818eeafbf8e0)
@@ -65,6 +65,6 @@
 int usb_mouse_init(struct usb_hid_dev *hid_dev, void **data);
 
-bool usb_mouse_polling_callback(struct usb_hid_dev *hid_dev, void *data, 
-    uint8_t *buffer, size_t buffer_size);
+bool usb_mouse_polling_callback(struct usb_hid_dev *hid_dev, void *data/*, 
+    uint8_t *buffer, size_t buffer_size*/);
 
 void usb_mouse_deinit(struct usb_hid_dev *hid_dev, void *data);
Index: uspace/drv/usbhid/multimedia/multimedia.c
===================================================================
--- uspace/drv/usbhid/multimedia/multimedia.c	(revision df29f24d4abcaa1e1685723e6f90f6acdccb7941)
+++ uspace/drv/usbhid/multimedia/multimedia.c	(revision 65c3794fd7e56a1dd208b3e458ed818eeafbf8e0)
@@ -269,35 +269,35 @@
 /*----------------------------------------------------------------------------*/
 
-bool usb_multimedia_polling_callback(struct usb_hid_dev *hid_dev, void *data, 
-    uint8_t *buffer, size_t buffer_size)
+bool usb_multimedia_polling_callback(struct usb_hid_dev *hid_dev, void *data/*, 
+    uint8_t *buffer, size_t buffer_size*/)
 {
 	// TODO: checks
-	if (hid_dev == NULL || data == NULL || buffer == NULL) {
+	if (hid_dev == NULL || data == NULL/* || buffer == NULL*/) {
 		return false;
 	}
 	
-	usb_log_debug(NAME " usb_lgtch_polling_callback(%p, %p, %zu)\n",
-	    hid_dev, buffer, buffer_size);
+//	usb_log_debug(NAME " usb_lgtch_polling_callback(%p, %p, %zu)\n",
+//	    hid_dev, buffer, buffer_size);
 	
 	usb_multimedia_t *multim_dev = (usb_multimedia_t *)data;
 
-	usb_log_debug(NAME " Calling usb_hid_parse_report() with "
-	    "buffer %s\n", usb_debug_str_buffer(buffer, buffer_size, 0));
+//	usb_log_debug(NAME " Calling usb_hid_parse_report() with "
+//	    "buffer %s\n", usb_debug_str_buffer(buffer, buffer_size, 0));
 	
 	usb_hid_report_path_t *path = usb_hid_report_path();
 	usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_CONSUMER, 0);
 
-	uint8_t report_id;
-	
-	int rc = usb_hid_parse_report(hid_dev->report, buffer, buffer_size, 
-	    &report_id);
-	
-	if (rc != EOK) {
-		usb_log_warning(NAME "Error in usb_hid_parse_report(): %s\n", 
-		    str_error(rc));
-		return true;
-	}
-	
-	usb_hid_report_path_set_report_id(path, report_id);
+//	uint8_t report_id;
+	
+//	int rc = usb_hid_parse_report(hid_dev->report, buffer, buffer_size, 
+//	    &report_id);
+	
+//	if (rc != EOK) {
+//		usb_log_warning(NAME "Error in usb_hid_parse_report(): %s\n", 
+//		    str_error(rc));
+//		return true;
+//	}
+	
+	usb_hid_report_path_set_report_id(path, hid_dev->report_id);
 
 	usb_hid_report_field_t *field = usb_hid_report_get_sibling(
Index: uspace/drv/usbhid/multimedia/multimedia.h
===================================================================
--- uspace/drv/usbhid/multimedia/multimedia.h	(revision df29f24d4abcaa1e1685723e6f90f6acdccb7941)
+++ uspace/drv/usbhid/multimedia/multimedia.h	(revision 65c3794fd7e56a1dd208b3e458ed818eeafbf8e0)
@@ -47,6 +47,6 @@
 void usb_multimedia_deinit(struct usb_hid_dev *hid_dev, void *data);
 
-bool usb_multimedia_polling_callback(struct usb_hid_dev *hid_dev, void *data,
-    uint8_t *buffer, size_t buffer_size);
+bool usb_multimedia_polling_callback(struct usb_hid_dev *hid_dev, void *data/*,
+    uint8_t *buffer, size_t buffer_size*/);
 
 /*----------------------------------------------------------------------------*/
Index: uspace/drv/usbhid/subdrivers.h
===================================================================
--- uspace/drv/usbhid/subdrivers.h	(revision df29f24d4abcaa1e1685723e6f90f6acdccb7941)
+++ uspace/drv/usbhid/subdrivers.h	(revision 65c3794fd7e56a1dd208b3e458ed818eeafbf8e0)
@@ -49,13 +49,33 @@
 /*----------------------------------------------------------------------------*/
 
-/* TODO: This mapping must contain some other information to get the proper
- *       interface.
+/** Structure representing the mapping between device requirements and the 
+ *  subdriver supposed to handle this device.
+ *
+ * By filling in this structure and adding it to the usb_hid_subdrivers array,
+ * a new subdriver mapping will be created and used by the HID driver when it
+ * searches for appropriate subdrivers for a device.
  */
 typedef struct usb_hid_subdriver_mapping {
+	/** Usage path that the device's Input reports must contain. 
+	 *
+	 * It is an array of pairs <usage_page, usage>, terminated by a <0, 0>
+	 * pair. If you do not wish to specify the device in this way, set this
+	 * to NULL.
+	 */
 	const usb_hid_subdriver_usage_t *usage_path;
+	
+	/** Report ID for which the path should apply. */
 	int report_id;
+	
+	/** Compare type for the Usage path. */
 	int compare;
+	
+	/** Vendor ID (set to -1 if not specified). */
 	int vendor_id;
+	
+	/** Product ID (set to -1 if not specified). */
 	int product_id;
+	
+	/** Subdriver for controlling this device. */
 	usb_hid_subdriver_t subdriver;
 } usb_hid_subdriver_mapping_t;
Index: uspace/drv/usbhid/usbhid.c
===================================================================
--- uspace/drv/usbhid/usbhid.c	(revision df29f24d4abcaa1e1685723e6f90f6acdccb7941)
+++ uspace/drv/usbhid/usbhid.c	(revision 65c3794fd7e56a1dd208b3e458ed818eeafbf8e0)
@@ -582,4 +582,14 @@
 	}
 	
+	// parse the input report
+	
+	int rc = usb_hid_parse_report(hid_dev->report, buffer, buffer_size, 
+	    &hid_dev->report_id);
+	
+	if (rc != EOK) {
+		usb_log_warning("Error in usb_hid_parse_report():"
+		    "%s\n", str_error(rc));
+	}	
+	
 	bool cont = false;
 	
@@ -588,5 +598,5 @@
 		if (hid_dev->subdrivers[i].poll != NULL
 		    && hid_dev->subdrivers[i].poll(hid_dev, 
-		        hid_dev->subdrivers[i].data, buffer, buffer_size)) {
+		        hid_dev->subdrivers[i].data/*, buffer, buffer_size*/)) {
 			cont = true;
 		}
Index: uspace/drv/usbhid/usbhid.h
===================================================================
--- uspace/drv/usbhid/usbhid.h	(revision df29f24d4abcaa1e1685723e6f90f6acdccb7941)
+++ uspace/drv/usbhid/usbhid.h	(revision 65c3794fd7e56a1dd208b3e458ed818eeafbf8e0)
@@ -50,7 +50,6 @@
 typedef int (*usb_hid_driver_init_t)(struct usb_hid_dev *, void **data);
 typedef void (*usb_hid_driver_deinit_t)(struct usb_hid_dev *, void *data);
-typedef bool (*usb_hid_driver_poll)(struct usb_hid_dev *, void *data, uint8_t *,
-                                    size_t);
-typedef int (*usb_hid_driver_poll_ended)(struct usb_hid_dev *, void *data, 
+typedef bool (*usb_hid_driver_poll_t)(struct usb_hid_dev *, void *data);
+typedef int (*usb_hid_driver_poll_ended_t)(struct usb_hid_dev *, void *data, 
                                          bool reason);
 
@@ -61,7 +60,7 @@
 	usb_hid_driver_deinit_t deinit;
 	/** Function to be called when data arrives from the device. */
-	usb_hid_driver_poll poll;
+	usb_hid_driver_poll_t poll;
 	/** Function to be called when polling ends. */
-	usb_hid_driver_poll_ended poll_end;
+	usb_hid_driver_poll_ended_t poll_end;
 	/** Arbitrary data needed by the subdriver. */
 	void *data;
@@ -93,4 +92,6 @@
 	/** HID Report parser. */
 	usb_hid_report_t *report;
+	
+	uint8_t report_id;
 	
 	uint8_t *input_report;
