Index: uspace/lib/usbdev/src/devdrv.c
===================================================================
--- uspace/lib/usbdev/src/devdrv.c	(revision 35bc430f632555e3c97a31892fd2ec0ceb60a89a)
+++ uspace/lib/usbdev/src/devdrv.c	(revision fd9b3a67d971bf91778227fddbe37bbf536f7257)
@@ -40,4 +40,50 @@
 #include <str_error.h>
 #include <assert.h>
+
+/** USB device structure. */
+typedef struct usb_device {
+	/** Connection to USB hc, used by wire and arbitrary requests. */
+	usb_hc_connection_t hc_conn;
+	/** Connection backing the pipes.
+	 * Typically, you will not need to use this attribute at all.
+	 */
+	usb_device_connection_t wire;
+	/** The default control pipe. */
+	usb_pipe_t ctrl_pipe;
+
+	/** Other endpoint pipes.
+	 * This is an array of other endpoint pipes in the same order as
+	 * in usb_driver_t.
+	 */
+	usb_endpoint_mapping_t *pipes;
+	/** Number of other endpoint pipes. */
+	size_t pipes_count;
+	/** Current interface.
+	 * Usually, drivers operate on single interface only.
+	 * This item contains the value of the interface or -1 for any.
+	 */
+	int interface_no;
+	/** Alternative interfaces. */
+	usb_alternate_interfaces_t alternate_interfaces;
+
+	/** Some useful descriptors for USB device. */
+	struct {
+		/** Standard device descriptor. */
+		usb_standard_device_descriptor_t device;
+		/** Full configuration descriptor of current configuration. */
+		const uint8_t *configuration;
+		size_t configuration_size;
+	} descriptors;
+
+	/** Generic DDF device backing this one. DO NOT TOUCH! */
+	ddf_dev_t *ddf_dev;
+	/** Custom driver data.
+	 * Do not use the entry in generic device, that is already used
+	 * by the framework.
+	 */
+	void *driver_data;
+
+	usb_dev_session_t *bus_session;
+} usb_device_t;
 
 /** Count number of pipes the driver expects.
@@ -350,5 +396,5 @@
  * @return Error code.
  */
-int usb_device_init(usb_device_t *usb_dev, ddf_dev_t *ddf_dev,
+static int usb_device_init(usb_device_t *usb_dev, ddf_dev_t *ddf_dev,
     const usb_endpoint_description_t **endpoints, const char **errstr_ptr)
 {
@@ -446,5 +492,5 @@
  * Does not free/destroy supplied pointer.
  */
-void usb_device_deinit(usb_device_t *dev)
+static void usb_device_fini(usb_device_t *dev)
 {
 	if (dev) {
@@ -461,4 +507,26 @@
 }
 
+int usb_device_create_ddf(ddf_dev_t *ddf_dev,
+    const usb_endpoint_description_t **desc, const char **err)
+{
+	assert(ddf_dev);
+	assert(err);
+	usb_device_t *dev = ddf_dev_data_alloc(ddf_dev, sizeof(usb_device_t));
+	if (dev == NULL) {
+		*err = "DDF data alloc";
+		return ENOMEM;
+	}
+	return usb_device_init(dev, ddf_dev, desc, err);
+}
+
+void usb_device_destroy_ddf(ddf_dev_t *ddf_dev)
+{
+	assert(ddf_dev);
+	usb_device_t *dev = ddf_dev_data_get(ddf_dev);
+	assert(dev);
+	usb_device_fini(dev);
+	return;
+}
+
 const char *usb_device_get_name(usb_device_t *usb_dev)
 {
Index: uspace/lib/usbdev/src/driver.c
===================================================================
--- uspace/lib/usbdev/src/driver.c	(revision 35bc430f632555e3c97a31892fd2ec0ceb60a89a)
+++ uspace/lib/usbdev/src/driver.c	(revision fd9b3a67d971bf91778227fddbe37bbf536f7257)
@@ -54,15 +54,7 @@
 	assert(driver->ops->device_add);
 
-	/* Get place for driver data. */
-	usb_device_t *dev = ddf_dev_data_alloc(gen_dev, sizeof(usb_device_t));
-	if (dev == NULL) {
-		usb_log_error("USB device `%s' structure allocation failed.\n",
-		    ddf_dev_get_name(gen_dev));
-		return ENOMEM;
-	}
-
 	/* Initialize generic USB driver data. */
 	const char *err_msg = NULL;
-	int rc = usb_device_init(dev, gen_dev, driver->endpoints, &err_msg);
+	int rc = usb_device_create_ddf(gen_dev, driver->endpoints, &err_msg);
 	if (rc != EOK) {
 		usb_log_error("USB device `%s' init failed (%s): %s.\n",
@@ -72,7 +64,7 @@
 
 	/* Start USB driver specific initialization. */
-	rc = driver->ops->device_add(dev);
+	rc = driver->ops->device_add(ddf_dev_data_get(gen_dev));
 	if (rc != EOK)
-		usb_device_deinit(dev);
+		usb_device_destroy_ddf(gen_dev);
 	return rc;
 }
@@ -96,5 +88,5 @@
 	if (ret != EOK)
 		return ret;
-	usb_device_deinit(usb_dev);
+	usb_device_destroy_ddf(gen_dev);
 	return EOK;
 }
@@ -116,5 +108,5 @@
 	const int ret = driver->ops->device_gone(usb_dev);
 	if (ret == EOK)
-		usb_device_deinit(usb_dev);
+		usb_device_destroy_ddf(gen_dev);
 
 	return ret;
