Index: uspace/drv/usbhid/mouse/mousedev.c
===================================================================
--- uspace/drv/usbhid/mouse/mousedev.c	(revision f90c0d6c1710d4e0841deffb9389c9f882f27afd)
+++ 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 f90c0d6c1710d4e0841deffb9389c9f882f27afd)
+++ 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);
