Index: uspace/lib/usbdev/include/usb/dev/driver.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/driver.h	(revision 7c95d6f581cca56abbce43deed7b2c4c3e46e2b2)
+++ uspace/lib/usbdev/include/usb/dev/driver.h	(revision d5abaf4b55ff0acd80899bb825da600c8de24c59)
@@ -173,4 +173,5 @@
 int usb_device_create(ddf_dev_t *, usb_endpoint_description_t **, usb_device_t **, const char **);
 void usb_device_destroy(usb_device_t *);
+void * usb_device_data_alloc(usb_device_t *, size_t);
 
 size_t usb_interface_count_alternates(const uint8_t *, size_t, uint8_t);
Index: uspace/lib/usbdev/src/devdrv.c
===================================================================
--- uspace/lib/usbdev/src/devdrv.c	(revision 7c95d6f581cca56abbce43deed7b2c4c3e46e2b2)
+++ uspace/lib/usbdev/src/devdrv.c	(revision d5abaf4b55ff0acd80899bb825da600c8de24c59)
@@ -152,5 +152,8 @@
 	gen_dev->driver_data = dev;
 
-	return driver->ops->device_add(dev);
+	rc = driver->ops->device_add(dev);
+	if (rc != EOK)
+		usb_device_destroy(dev);
+	return rc;
 }
 /*----------------------------------------------------------------------------*/
@@ -185,7 +188,8 @@
 	if (driver->ops->device_gone == NULL)
 		return ENOTSUP;
-	const int ret = driver->ops->device_gone(gen_dev->driver_data);
+	usb_device_t *usb_dev = gen_dev->driver_data;
+	const int ret = driver->ops->device_gone(usb_dev);
 	if (ret == EOK)
-		usb_device_destroy(gen_dev->driver_data);
+		usb_device_destroy(usb_dev);
 
 	return ret;
@@ -595,6 +599,5 @@
 
 	/* Ignore errors and hope for the best. */
-	usb_device_destroy_pipes(dev->ddf_dev, dev->pipes, dev->pipes_count);
-	free(dev->descriptors.configuration);
+	destroy_current_pipes(dev);
 
 	if (dev->alternate_interfaces != NULL) {
@@ -602,6 +605,14 @@
 	}
 	free(dev->alternate_interfaces);
-
-	free(dev);
+	free(dev->descriptors.configuration);
+	free(dev->driver_data);
+}
+
+void * usb_device_data_alloc(usb_device_t *usb_dev, size_t size)
+{
+	assert(usb_dev);
+	assert(usb_dev->driver_data == NULL);
+	return usb_dev->driver_data = calloc(1, size);
+
 }
 
