Index: uspace/drv/usbhid/generic/hiddev.c
===================================================================
--- uspace/drv/usbhid/generic/hiddev.c	(revision 97cb542a816e279c729573b8be887e53ece14c95)
+++ uspace/drv/usbhid/generic/hiddev.c	(revision 65b458c4e29cccc7161601b794cb6db07efb5c3d)
@@ -162,5 +162,5 @@
 /*----------------------------------------------------------------------------*/
 
-int usb_generic_hid_init(usb_hid_dev_t *hid_dev)
+int usb_generic_hid_init(usb_hid_dev_t *hid_dev, void **data)
 {
 	if (hid_dev == NULL) {
@@ -173,5 +173,5 @@
 /*----------------------------------------------------------------------------*/
 
-bool usb_generic_hid_polling_callback(usb_hid_dev_t *hid_dev, 
+bool usb_generic_hid_polling_callback(usb_hid_dev_t *hid_dev, void *data, 
     uint8_t *buffer, size_t buffer_size)
 {
Index: uspace/drv/usbhid/generic/hiddev.h
===================================================================
--- uspace/drv/usbhid/generic/hiddev.h	(revision 97cb542a816e279c729573b8be887e53ece14c95)
+++ uspace/drv/usbhid/generic/hiddev.h	(revision 65b458c4e29cccc7161601b794cb6db07efb5c3d)
@@ -48,7 +48,7 @@
 /*----------------------------------------------------------------------------*/
 
-int usb_generic_hid_init(struct usb_hid_dev *hid_dev);
+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,
+bool usb_generic_hid_polling_callback(struct usb_hid_dev *hid_dev, void *data,
     uint8_t *buffer, size_t buffer_size);
 
Index: uspace/drv/usbhid/kbd/kbddev.c
===================================================================
--- uspace/drv/usbhid/kbd/kbddev.c	(revision 97cb542a816e279c729573b8be887e53ece14c95)
+++ uspace/drv/usbhid/kbd/kbddev.c	(revision 65b458c4e29cccc7161601b794cb6db07efb5c3d)
@@ -252,7 +252,6 @@
 	sysarg_t method = IPC_GET_IMETHOD(*icall);
 	
-	usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;
-	
-	if (hid_dev == NULL || hid_dev->data == NULL) {
+	usb_kbd_t *kbd_dev = (usb_kbd_t *)fun->driver_data;
+	if (kbd_dev == NULL) {
 		usb_log_debug("default_connection_handler: "
 		    "Missing parameter.\n");
@@ -260,8 +259,4 @@
 		return;
 	}
-	
-	assert(hid_dev != NULL);
-	assert(hid_dev->data != NULL);
-	usb_kbd_t *kbd_dev = (usb_kbd_t *)hid_dev->data;
 
 	if (method == IPC_M_CONNECT_TO_ME) {
@@ -663,12 +658,10 @@
  *     usb_hid_parse_report().
  */
-static void usb_kbd_process_data(usb_hid_dev_t *hid_dev,
+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);
 	assert(hid_dev != NULL);
-	assert(hid_dev->data != NULL);
-	
-	usb_kbd_t *kbd_dev = (usb_kbd_t *)hid_dev->data;
+	assert(kbd_dev != NULL);
 
 	usb_log_debug("Calling usb_hid_parse_report() with "
@@ -775,8 +768,9 @@
 /*----------------------------------------------------------------------------*/
 
-static int usb_kbd_create_function(usb_hid_dev_t *hid_dev)
+static int usb_kbd_create_function(usb_hid_dev_t *hid_dev, usb_kbd_t *kbd_dev)
 {
 	assert(hid_dev != NULL);
 	assert(hid_dev->usb_dev != NULL);
+	assert(kbd_dev != NULL);
 	
 	/* Create the function exposed under /dev/devices. */
@@ -793,6 +787,6 @@
 	 * to the DDF function.
 	 */
-	fun->ops = &hid_dev->ops;
-	fun->driver_data = hid_dev;   // TODO: maybe change to hid_dev->data
+	fun->ops = &kbd_dev->ops;
+	fun->driver_data = kbd_dev;
 
 	int rc = ddf_fun_bind(fun);
@@ -841,5 +835,5 @@
  * @return Other value inherited from function usbhid_dev_init().
  */
-int usb_kbd_init(usb_hid_dev_t *hid_dev)
+int usb_kbd_init(usb_hid_dev_t *hid_dev, void **data)
 {
 	usb_log_debug("Initializing HID/KBD structure...\n");
@@ -954,8 +948,9 @@
 	
 	// save the KBD device structure into the HID device structure
-	hid_dev->data = kbd_dev;
+	//hid_dev->data = kbd_dev;
+	*data = kbd_dev;
 	
 	// set handler for incoming calls
-	hid_dev->ops.default_handler = default_connection_handler;
+	kbd_dev->ops.default_handler = default_connection_handler;
 	
 	/*
@@ -982,5 +977,5 @@
 	
 	usb_log_debug("Creating KBD function...\n");
-	int rc = usb_kbd_create_function(hid_dev);
+	int rc = usb_kbd_create_function(hid_dev, kbd_dev);
 	if (rc != EOK) {
 		usb_kbd_free(&kbd_dev);
@@ -993,14 +988,17 @@
 /*----------------------------------------------------------------------------*/
 
-bool usb_kbd_polling_callback(usb_hid_dev_t *hid_dev, uint8_t *buffer,
-     size_t buffer_size)
-{
-	if (hid_dev == NULL || buffer == 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;
 	}
 	
+	usb_kbd_t *kbd_dev = (usb_kbd_t *)data;
+	assert(kbd_dev != NULL);
+	
 	// TODO: add return value from this function
-	usb_kbd_process_data(hid_dev, buffer, buffer_size);
+	usb_kbd_process_data(hid_dev, kbd_dev, buffer, buffer_size);
 	
 	return true;
@@ -1065,5 +1063,5 @@
 /*----------------------------------------------------------------------------*/
 
-void usb_kbd_deinit(usb_hid_dev_t *hid_dev)
+void usb_kbd_deinit(usb_hid_dev_t *hid_dev, void *data)
 {
 	if (hid_dev == NULL) {
@@ -1071,11 +1069,10 @@
 	}
 	
-	if (hid_dev->data != NULL) {
-		usb_kbd_t *kbd_dev = (usb_kbd_t *)hid_dev->data;
+	if (data != NULL) {
+		usb_kbd_t *kbd_dev = (usb_kbd_t *)data;
 		if (usb_kbd_is_initialized(kbd_dev)) {
 			usb_kbd_mark_unusable(kbd_dev);
 		} else {
 			usb_kbd_free(&kbd_dev);
-			hid_dev->data = NULL;
 		}
 	}
Index: uspace/drv/usbhid/kbd/kbddev.h
===================================================================
--- uspace/drv/usbhid/kbd/kbddev.h	(revision 97cb542a816e279c729573b8be887e53ece14c95)
+++ uspace/drv/usbhid/kbd/kbddev.h	(revision 65b458c4e29cccc7161601b794cb6db07efb5c3d)
@@ -83,4 +83,7 @@
 	int console_phone;
 	
+	/** @todo What is this actually? */
+	ddf_dev_ops_t ops;
+	
 	/** Information for auto-repeat of keys. */
 	usb_kbd_repeat_t repeat;
@@ -117,8 +120,8 @@
 /*----------------------------------------------------------------------------*/
 
-int usb_kbd_init(struct usb_hid_dev *hid_dev);
+int usb_kbd_init(struct usb_hid_dev *hid_dev, void **data);
 
-bool usb_kbd_polling_callback(struct usb_hid_dev *hid_dev, 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);
@@ -131,5 +134,5 @@
     int type, unsigned int key);
 
-void usb_kbd_deinit(struct usb_hid_dev *hid_dev);
+void usb_kbd_deinit(struct usb_hid_dev *hid_dev, void *data);
 
 int usb_kbd_set_boot_protocol(struct usb_hid_dev *hid_dev);
Index: uspace/drv/usbhid/mouse/mousedev.c
===================================================================
--- uspace/drv/usbhid/mouse/mousedev.c	(revision 97cb542a816e279c729573b8be887e53ece14c95)
+++ uspace/drv/usbhid/mouse/mousedev.c	(revision 65b458c4e29cccc7161601b794cb6db07efb5c3d)
@@ -122,7 +122,7 @@
 	sysarg_t method = IPC_GET_IMETHOD(*icall);
 	
-	usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;
-	
-	if (hid_dev == NULL || hid_dev->data == NULL) {
+	usb_mouse_t *mouse_dev = (usb_mouse_t *)fun->driver_data;
+	
+	if (mouse_dev == NULL) {
 		usb_log_debug("default_connection_handler: Missing "
 		    "parameters.\n");
@@ -131,8 +131,4 @@
 	}
 	
-	assert(hid_dev != NULL);
-	assert(hid_dev->data != NULL);
-	usb_mouse_t *mouse_dev = (usb_mouse_t *)hid_dev->data;
-	
 	int *phone = (str_cmp(fun->name, HID_MOUSE_FUN_NAME) == 0) 
 		     ? &mouse_dev->mouse_phone : &mouse_dev->wheel_phone;
@@ -145,5 +141,4 @@
 			    "phone to mouse already set.\n");
 			async_answer_0(icallid, ELIMIT);
-			//async_answer_0(icallid, EOK);
 			return;
 		}
@@ -224,8 +219,9 @@
 /*----------------------------------------------------------------------------*/
 
-static bool usb_mouse_process_report(usb_hid_dev_t *hid_dev, uint8_t *buffer,
-    size_t buffer_size)
-{
-	usb_mouse_t *mouse_dev = (usb_mouse_t *)hid_dev->data;
+static bool usb_mouse_process_report(usb_hid_dev_t *hid_dev, 
+                                     usb_mouse_t *mouse_dev, uint8_t *buffer,
+                                     size_t buffer_size)
+{
+	assert(mouse_dev != NULL);
 	
 	usb_log_debug2("got buffer: %s.\n",
@@ -378,6 +374,9 @@
 /*----------------------------------------------------------------------------*/
 
-static int usb_mouse_create_function(usb_hid_dev_t *hid_dev)
-{
+static int usb_mouse_create_function(usb_hid_dev_t *hid_dev, usb_mouse_t *mouse)
+{
+	assert(hid_dev != NULL);
+	assert(mouse != NULL);
+	
 	/* Create the function exposed under /dev/devices. */
 	usb_log_debug("Creating DDF function %s...\n", HID_MOUSE_FUN_NAME);
@@ -389,10 +388,6 @@
 	}
 	
-	/*
-	 * Store the initialized HID device and HID ops
-	 * to the DDF function.
-	 */
-	fun->ops = &hid_dev->ops;
-	fun->driver_data = hid_dev;   // TODO: maybe change to hid_dev->data
+	fun->ops = &mouse->ops;
+	fun->driver_data = mouse;   // TODO: maybe change to hid_dev->data
 
 	int rc = ddf_fun_bind(fun);
@@ -431,5 +426,5 @@
 	 * to the DDF function.
 	 */
-	fun->ops = &hid_dev->ops;
+	fun->ops = &mouse->ops;
 	fun->driver_data = hid_dev;   // TODO: maybe change to hid_dev->data
 
@@ -458,5 +453,5 @@
 /*----------------------------------------------------------------------------*/
 
-int usb_mouse_init(usb_hid_dev_t *hid_dev)
+int usb_mouse_init(usb_hid_dev_t *hid_dev, void **data)
 {
 	usb_log_debug("Initializing HID/Mouse structure...\n");
@@ -485,8 +480,9 @@
 	
 	// save the Mouse device structure into the HID device structure
-	hid_dev->data = mouse_dev;
+	*data = mouse_dev;
 	
 	// set handler for incoming calls
-	hid_dev->ops.default_handler = default_connection_handler;
+	// TODO: must be one for each subdriver!!
+	mouse_dev->ops.default_handler = default_connection_handler;
 	
 	// TODO: how to know if the device supports the request???
@@ -494,5 +490,5 @@
 //	    hid_dev->usb_dev->interface_no, IDLE_RATE);
 	
-	int rc = usb_mouse_create_function(hid_dev);
+	int rc = usb_mouse_create_function(hid_dev, mouse_dev);
 	if (rc != EOK) {
 		usb_mouse_free(&mouse_dev);
@@ -505,11 +501,11 @@
 /*----------------------------------------------------------------------------*/
 
-bool usb_mouse_polling_callback(usb_hid_dev_t *hid_dev, 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);
 	
-	if (hid_dev == NULL) {
+	if (hid_dev == NULL || data == NULL) {
 		usb_log_error("Missing argument to the mouse polling callback."
 		    "\n");
@@ -517,18 +513,17 @@
 	}
 	
-	if (hid_dev->data == NULL) {
-		usb_log_error("Wrong argument to the mouse polling callback."
-		    "\n");
-		return false;
-	}
-	
-	return usb_mouse_process_report(hid_dev, buffer, buffer_size);
-}
-
-/*----------------------------------------------------------------------------*/
-
-void usb_mouse_deinit(usb_hid_dev_t *hid_dev)
-{
-	usb_mouse_free((usb_mouse_t **)&hid_dev->data);
+	usb_mouse_t *mouse_dev = (usb_mouse_t *)data;
+		
+	return usb_mouse_process_report(hid_dev, mouse_dev, buffer, 
+	                                buffer_size);
+}
+
+/*----------------------------------------------------------------------------*/
+
+void usb_mouse_deinit(usb_hid_dev_t *hid_dev, void *data)
+{
+	if (data != NULL) {
+		usb_mouse_free((usb_mouse_t **)&data);
+	}
 }
 
Index: uspace/drv/usbhid/mouse/mousedev.h
===================================================================
--- uspace/drv/usbhid/mouse/mousedev.h	(revision 97cb542a816e279c729573b8be887e53ece14c95)
+++ uspace/drv/usbhid/mouse/mousedev.h	(revision 65b458c4e29cccc7161601b794cb6db07efb5c3d)
@@ -52,4 +52,6 @@
 	
 	int32_t *buttons;
+	
+	ddf_dev_ops_t ops;
 } usb_mouse_t;
 
@@ -63,10 +65,10 @@
 /*----------------------------------------------------------------------------*/
 
-int usb_mouse_init(struct usb_hid_dev *hid_dev);
+int usb_mouse_init(struct usb_hid_dev *hid_dev, void **data);
 
-bool usb_mouse_polling_callback(struct usb_hid_dev *hid_dev, 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 usb_mouse_deinit(struct usb_hid_dev *hid_dev, void *data);
 
 int usb_mouse_set_boot_protocol(struct usb_hid_dev *hid_dev);
Index: uspace/drv/usbhid/multimedia/multimedia.c
===================================================================
--- uspace/drv/usbhid/multimedia/multimedia.c	(revision 97cb542a816e279c729573b8be887e53ece14c95)
+++ uspace/drv/usbhid/multimedia/multimedia.c	(revision 65b458c4e29cccc7161601b794cb6db07efb5c3d)
@@ -87,14 +87,11 @@
 	sysarg_t method = IPC_GET_IMETHOD(*icall);
 	
-	usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;
-	
-	if (hid_dev == NULL || hid_dev->data == NULL) {
+	usb_multimedia_t *multim_dev = (usb_multimedia_t *)fun->driver_data;
+	//usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;
+	
+	if (multim_dev == NULL) {
 		async_answer_0(icallid, EINVAL);
 		return;
 	}
-	
-	assert(hid_dev != NULL);
-	assert(hid_dev->data != NULL);
-	usb_multimedia_t *multim_dev = (usb_multimedia_t *)hid_dev->data;
 
 	if (method == IPC_M_CONNECT_TO_ME) {
@@ -139,11 +136,11 @@
  * @param key Key code of the key according to HID Usage Tables.
  */
-static void usb_multimedia_push_ev(usb_hid_dev_t *hid_dev, int type, 
-    unsigned int key)
+static void usb_multimedia_push_ev(usb_hid_dev_t *hid_dev, 
+    usb_multimedia_t *multim_dev, int type, unsigned int key)
 {
 	assert(hid_dev != NULL);
-	assert(hid_dev->data != NULL);
-	
-	usb_multimedia_t *multim_dev = (usb_multimedia_t *)hid_dev->data;
+	assert(multim_dev != NULL);
+	
+//	usb_multimedia_t *multim_dev = (usb_multimedia_t *)hid_dev->data;
 	
 	console_event_t ev;
@@ -190,5 +187,6 @@
 /*----------------------------------------------------------------------------*/
 
-static int usb_multimedia_create_function(usb_hid_dev_t *hid_dev)
+static int usb_multimedia_create_function(usb_hid_dev_t *hid_dev, 
+    usb_multimedia_t *multim_dev)
 {
 	/* Create the function exposed under /dev/devices. */
@@ -200,10 +198,6 @@
 	}
 	
-	/*
-	 * Store the initialized HID device and HID ops
-	 * to the DDF function.
-	 */
 	fun->ops = &multimedia_ops;
-	fun->driver_data = hid_dev;   // TODO: maybe change to hid_dev->data
+	fun->driver_data = multim_dev;   // TODO: maybe change to hid_dev->data
 	
 	int rc = ddf_fun_bind(fun);
@@ -231,5 +225,5 @@
 /*----------------------------------------------------------------------------*/
 
-int usb_multimedia_init(struct usb_hid_dev *hid_dev)
+int usb_multimedia_init(struct usb_hid_dev *hid_dev, void **data)
 {
 	if (hid_dev == NULL || hid_dev->usb_dev == NULL) {
@@ -282,9 +276,9 @@
 	
 	// save the KBD device structure into the HID device structure
-	hid_dev->data = multim_dev;
+	*data = multim_dev;
 	
 	usb_log_debug(NAME " HID/multimedia device structure initialized.\n");
 	
-	int rc = usb_multimedia_create_function(hid_dev);
+	int rc = usb_multimedia_create_function(hid_dev, multim_dev);
 	if (rc != EOK) {
 		usb_multimedia_free(&multim_dev);
@@ -299,5 +293,5 @@
 /*----------------------------------------------------------------------------*/
 
-void usb_multimedia_deinit(struct usb_hid_dev *hid_dev)
+void usb_multimedia_deinit(struct usb_hid_dev *hid_dev, void *data)
 {
 	if (hid_dev == NULL) {
@@ -305,15 +299,13 @@
 	}
 	
-	if (hid_dev->data != NULL) {
-		usb_multimedia_t *multim_dev = 
-		    (usb_multimedia_t *)hid_dev->data;
+	if (data != NULL) {
+		usb_multimedia_t *multim_dev = (usb_multimedia_t *)data;
 		usb_multimedia_free(&multim_dev);
-		hid_dev->data = NULL;
-	}
-}
-
-/*----------------------------------------------------------------------------*/
-
-bool usb_multimedia_polling_callback(struct usb_hid_dev *hid_dev, 
+	}
+}
+
+/*----------------------------------------------------------------------------*/
+
+bool usb_multimedia_polling_callback(struct usb_hid_dev *hid_dev, void *data, 
     uint8_t *buffer, size_t buffer_size)
 {
@@ -322,4 +314,10 @@
 	usb_log_debug(NAME " usb_lgtch_polling_callback(%p, %p, %zu)\n",
 	    hid_dev, buffer, buffer_size);
+	
+	if (data == NULL) {
+		return EINVAL;	// TODO: other error code?
+	}
+	
+	usb_multimedia_t *multim_dev = (usb_multimedia_t *)data;
 
 	usb_log_debug(NAME " Calling usb_hid_parse_report() with "
@@ -361,5 +359,6 @@
 			    usb_multimedia_usage_to_str(field->usage);
 			usb_log_info("Pressed key: %s\n", key_str);
-			usb_multimedia_push_ev(hid_dev, KEY_PRESS, key);
+			usb_multimedia_push_ev(hid_dev, multim_dev, KEY_PRESS, 
+			                       key);
 		}
 		
Index: uspace/drv/usbhid/multimedia/multimedia.h
===================================================================
--- uspace/drv/usbhid/multimedia/multimedia.h	(revision 97cb542a816e279c729573b8be887e53ece14c95)
+++ uspace/drv/usbhid/multimedia/multimedia.h	(revision 65b458c4e29cccc7161601b794cb6db07efb5c3d)
@@ -43,9 +43,9 @@
 /*----------------------------------------------------------------------------*/
 
-int usb_multimedia_init(struct usb_hid_dev *hid_dev);
+int usb_multimedia_init(struct usb_hid_dev *hid_dev, void **data);
 
-void usb_multimedia_deinit(struct usb_hid_dev *hid_dev);
+void usb_multimedia_deinit(struct usb_hid_dev *hid_dev, void *data);
 
-bool usb_multimedia_polling_callback(struct usb_hid_dev *hid_dev, 
+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.c
===================================================================
--- uspace/drv/usbhid/subdrivers.c	(revision 97cb542a816e279c729573b8be887e53ece14c95)
+++ uspace/drv/usbhid/subdrivers.c	(revision 65b458c4e29cccc7161601b794cb6db07efb5c3d)
@@ -99,5 +99,5 @@
 		}
 	},
-	{NULL, -1, 0, -1, -1, {NULL, NULL, NULL, NULL}}
+	{NULL, -1, 0, -1, -1, {NULL, NULL, NULL, NULL, NULL}}
 };
 
Index: uspace/drv/usbhid/usbhid.c
===================================================================
--- uspace/drv/usbhid/usbhid.c	(revision 97cb542a816e279c729573b8be887e53ece14c95)
+++ uspace/drv/usbhid/usbhid.c	(revision 65b458c4e29cccc7161601b794cb6db07efb5c3d)
@@ -466,5 +466,6 @@
 			if (hid_dev->subdrivers[i].init != NULL) {
 				usb_log_debug("Initializing subdriver %d.\n",i);
-				rc = hid_dev->subdrivers[i].init(hid_dev);
+				rc = hid_dev->subdrivers[i].init(hid_dev,
+				    &hid_dev->subdrivers[i].data);
 				if (rc != EOK) {
 					usb_log_warning("Failed to initialize"
@@ -531,6 +532,6 @@
 	for (i = 0; i < hid_dev->subdriver_count; ++i) {
 		if (hid_dev->subdrivers[i].poll != NULL
-		    && hid_dev->subdrivers[i].poll(hid_dev, buffer, 
-		    buffer_size)) {
+		    && hid_dev->subdrivers[i].poll(hid_dev, 
+		        hid_dev->subdrivers[i].data, buffer, buffer_size)) {
 			cont = true;
 		}
@@ -555,5 +556,6 @@
 	for (i = 0; i < hid_dev->subdriver_count; ++i) {
 		if (hid_dev->subdrivers[i].poll_end != NULL) {
-			hid_dev->subdrivers[i].poll_end(hid_dev, reason);
+			hid_dev->subdrivers[i].poll_end(hid_dev,
+			    hid_dev->subdrivers[i].data, reason);
 		}
 	}
@@ -636,5 +638,6 @@
 	for (i = 0; i < (*hid_dev)->subdriver_count; ++i) {
 		if ((*hid_dev)->subdrivers[i].deinit != NULL) {
-			(*hid_dev)->subdrivers[i].deinit(*hid_dev);
+			(*hid_dev)->subdrivers[i].deinit(*hid_dev,
+			    (*hid_dev)->subdrivers[i].data);
 		}
 	}
Index: uspace/drv/usbhid/usbhid.h
===================================================================
--- uspace/drv/usbhid/usbhid.h	(revision 97cb542a816e279c729573b8be887e53ece14c95)
+++ uspace/drv/usbhid/usbhid.h	(revision 65b458c4e29cccc7161601b794cb6db07efb5c3d)
@@ -48,8 +48,10 @@
 struct usb_hid_dev;
 
-typedef int (*usb_hid_driver_init_t)(struct usb_hid_dev *);
-typedef void (*usb_hid_driver_deinit_t)(struct usb_hid_dev *);
-typedef bool (*usb_hid_driver_poll)(struct usb_hid_dev *, uint8_t *, size_t);
-typedef int (*usb_hid_driver_poll_ended)(struct usb_hid_dev *, bool reason);
+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, 
+                                         bool reason);
 
 // TODO: add function and class name??
@@ -63,4 +65,6 @@
 	/** Function to be called when polling ends. */
 	usb_hid_driver_poll_ended poll_end;
+	/** Arbitrary data needed by the subdriver. */
+	void *data;
 } usb_hid_subdriver_t;
 
@@ -72,7 +76,4 @@
 	/** Structure holding generic USB device information. */
 	usb_device_t *usb_dev;
-	
-	/** @todo What is this actually? */
-	ddf_dev_ops_t ops;
 	
 	/** Index of the polling pipe in usb_hid_endpoints array. */
@@ -97,7 +98,4 @@
 	
 	size_t input_report_size;
-	
-	/** Arbitrary data (e.g. a special structure for handling keyboard). */
-	void *data;
 } usb_hid_dev_t;
 
