Index: uspace/drv/bus/usb/usbhid/generic/hiddev.c
===================================================================
--- uspace/drv/bus/usb/usbhid/generic/hiddev.c	(revision 7c95d6f581cca56abbce43deed7b2c4c3e46e2b2)
+++ uspace/drv/bus/usb/usbhid/generic/hiddev.c	(revision 065064e6a50bbc4c53be7985e161ce57985dd86b)
@@ -201,4 +201,7 @@
 	}
 	usb_log_debug2("%s unbound.\n", fun->name);
+	/* We did not allocate this, so leave this alone
+	 * the device would take care of it */
+	fun->driver_data = NULL;
 	ddf_fun_destroy(fun);
 }
@@ -223,5 +226,4 @@
 
 	fun->ops = &usb_generic_hid_ops;
-	fun->driver_data = hid_dev;
 
 	int rc = ddf_fun_bind(fun);
@@ -232,4 +234,7 @@
 		return rc;
 	}
+	/* This is nasty both device and this function have the same
+	 * driver data, thus destruction would lead to double free */
+	fun->driver_data = hid_dev;
 
 	usb_log_debug("HID function created. Handle: %" PRIun "\n", fun->handle);
Index: uspace/drv/bus/usb/usbhid/main.c
===================================================================
--- uspace/drv/bus/usb/usbhid/main.c	(revision 7c95d6f581cca56abbce43deed7b2c4c3e46e2b2)
+++ uspace/drv/bus/usb/usbhid/main.c	(revision 065064e6a50bbc4c53be7985e161ce57985dd86b)
@@ -77,10 +77,9 @@
 	assert(dev != NULL);
 
-	/* 
-	 * Initialize device (get and process descriptors, get address, etc.)
-	 */
+	/* Initialize device (get and process descriptors, get address, etc.) */
 	usb_log_debug("Initializing USB/HID device...\n");
 
-	usb_hid_dev_t *hid_dev = usb_hid_new();
+	usb_hid_dev_t *hid_dev =
+	    usb_device_data_alloc(dev, sizeof(usb_hid_dev_t));
 	if (hid_dev == NULL) {
 		usb_log_error("Error while creating USB/HID device "
Index: uspace/drv/bus/usb/usbhid/usbhid.c
===================================================================
--- uspace/drv/bus/usb/usbhid/usbhid.c	(revision 7c95d6f581cca56abbce43deed7b2c4c3e46e2b2)
+++ uspace/drv/bus/usb/usbhid/usbhid.c	(revision 065064e6a50bbc4c53be7985e161ce57985dd86b)
@@ -412,12 +412,20 @@
 /*----------------------------------------------------------------------------*/
 
-usb_hid_dev_t *usb_hid_new(void)
-{
-	usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)calloc(1,
-	    sizeof(usb_hid_dev_t));
+int usb_hid_init(usb_hid_dev_t *hid_dev, usb_device_t *dev)
+{
+	int rc, i;
+
+	usb_log_debug("Initializing HID structure...\n");
 
 	if (hid_dev == NULL) {
-		usb_log_error("No memory!\n");
-		return NULL;
+		usb_log_error("Failed to init HID structure: no structure given"
+		    ".\n");
+		return EINVAL;
+	}
+
+	if (dev == NULL) {
+		usb_log_error("Failed to init HID structure: no USB device"
+		    " given.\n");
+		return EINVAL;
 	}
 
@@ -426,37 +434,11 @@
 	if (hid_dev->report == NULL) {
 		usb_log_error("No memory!\n");
-		free(hid_dev);
-		return NULL;
-	}
-
-	hid_dev->poll_pipe_index = -1;
-
-	return hid_dev;
-}
-
-/*----------------------------------------------------------------------------*/
-
-int usb_hid_init(usb_hid_dev_t *hid_dev, usb_device_t *dev)
-{
-	int rc, i;
-
-	usb_log_debug("Initializing HID structure...\n");
-
-	if (hid_dev == NULL) {
-		usb_log_error("Failed to init HID structure: no structure given"
-		    ".\n");
-		return EINVAL;
-	}
-
-	if (dev == NULL) {
-		usb_log_error("Failed to init HID structure: no USB device"
-		    " given.\n");
-		return EINVAL;
-	}
-
+		return ENOMEM;
+	}
 	usb_hid_report_init(hid_dev->report);
 
 	/* The USB device should already be initialized, save it in structure */
 	hid_dev->usb_dev = dev;
+	hid_dev->poll_pipe_index = -1;
 
 	rc = usb_hid_check_pipes(hid_dev, dev);
Index: uspace/drv/bus/usb/usbhid/usbhid.h
===================================================================
--- uspace/drv/bus/usb/usbhid/usbhid.h	(revision 7c95d6f581cca56abbce43deed7b2c4c3e46e2b2)
+++ uspace/drv/bus/usb/usbhid/usbhid.h	(revision 065064e6a50bbc4c53be7985e161ce57985dd86b)
@@ -145,6 +145,4 @@
 /*----------------------------------------------------------------------------*/
 
-usb_hid_dev_t *usb_hid_new(void);
-
 int usb_hid_init(usb_hid_dev_t *hid_dev, usb_device_t *dev);
 
Index: uspace/drv/bus/usb/usbhub/usbhub.c
===================================================================
--- uspace/drv/bus/usb/usbhub/usbhub.c	(revision 7c95d6f581cca56abbce43deed7b2c4c3e46e2b2)
+++ uspace/drv/bus/usb/usbhub/usbhub.c	(revision 065064e6a50bbc4c53be7985e161ce57985dd86b)
@@ -117,6 +117,4 @@
 	ddf_fun_destroy(hub->hub_fun);
 
-	free(hub);
-	usb_dev->driver_data = NULL;
 	usb_log_info("USB hub driver, stopped and cleaned.\n");
 	return EOK;
@@ -254,10 +252,10 @@
 {
 	assert(usb_dev);
-	usb_hub_dev_t *hub_dev = malloc(sizeof(usb_hub_dev_t));
+	usb_hub_dev_t *hub_dev =
+	    usb_device_data_alloc(usb_dev, sizeof(usb_hub_dev_t));
 	if (!hub_dev)
 	    return NULL;
 
 	hub_dev->usb_device = usb_dev;
-
 	hub_dev->ports = NULL;
 	hub_dev->port_count = 0;
@@ -266,5 +264,4 @@
 	fibril_mutex_initialize(&hub_dev->pending_ops_mutex);
 	fibril_condvar_initialize(&hub_dev->pending_ops_cv);
-	usb_dev->driver_data = hub_dev;
 
 	return hub_dev;
Index: uspace/drv/bus/usb/usbmast/main.c
===================================================================
--- uspace/drv/bus/usb/usbmast/main.c	(revision 7c95d6f581cca56abbce43deed7b2c4c3e46e2b2)
+++ uspace/drv/bus/usb/usbmast/main.c	(revision 065064e6a50bbc4c53be7985e161ce57985dd86b)
@@ -103,5 +103,4 @@
 	}
 	free(mdev->luns);
-	free(mdev);
 	return EOK;
 }
@@ -119,5 +118,5 @@
 
 	/* Allocate softstate */
-	dev->driver_data = mdev = malloc(sizeof(usbmast_dev_t));
+	mdev = usb_device_data_alloc(dev, sizeof(usbmast_dev_t));
 	if (mdev == NULL) {
 		usb_log_error("Failed allocating softstate.\n");
Index: uspace/drv/bus/usb/usbmid/explore.c
===================================================================
--- uspace/drv/bus/usb/usbmid/explore.c	(revision 7c95d6f581cca56abbce43deed7b2c4c3e46e2b2)
+++ uspace/drv/bus/usb/usbmid/explore.c	(revision 065064e6a50bbc4c53be7985e161ce57985dd86b)
@@ -163,5 +163,5 @@
 	}
 
-	usb_mid_t *usb_mid = malloc(sizeof(usb_mid_t));
+	usb_mid_t *usb_mid = usb_device_data_alloc(dev, sizeof(usb_mid_t));
 	if (!usb_mid) {
 		usb_log_error("Failed to create USB MID structure.\n");
@@ -173,5 +173,4 @@
 	if (usb_mid->ctl_fun == NULL) {
 		usb_log_error("Failed to create control function.\n");
-		free(usb_mid);
 		return false;
 	}
@@ -184,5 +183,4 @@
 		    str_error(rc));
 		ddf_fun_destroy(usb_mid->ctl_fun);
-		free(usb_mid);
 		return false;
 	}
@@ -209,5 +207,4 @@
 		}
 	}
-	dev->driver_data = usb_mid;
 
 	return true;
Index: uspace/drv/bus/usb/usbmid/main.c
===================================================================
--- uspace/drv/bus/usb/usbmid/main.c	(revision 7c95d6f581cca56abbce43deed7b2c4c3e46e2b2)
+++ uspace/drv/bus/usb/usbmid/main.c	(revision 065064e6a50bbc4c53be7985e161ce57985dd86b)
@@ -103,5 +103,4 @@
 		}
 	}
-	free(usb_mid);
 	return ret;
 }
