Index: uspace/drv/usbmid/main.c
===================================================================
--- uspace/drv/usbmid/main.c	(revision 51f0e4104dd642ae32f20f7a79a4955cf28f9c92)
+++ uspace/drv/usbmid/main.c	(revision eb1a2f485e907e821965b3aafca2d8a5355f3518)
@@ -44,5 +44,5 @@
 #include "usbmid.h"
 
-static int usbmid_add_device(device_t *gen_dev)
+static int usbmid_add_device(ddf_dev_t *gen_dev)
 {
 	usbmid_device_t *dev = usbmid_device_create(gen_dev);
@@ -99,6 +99,6 @@
 	printf(NAME ": USB multi interface device driver.\n");
 
-	usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);
-	return driver_main(&mid_driver);
+	usb_log_enable(USB_LOG_LEVEL_INFO, NAME);
+	return ddf_driver_main(&mid_driver);
 }
 
Index: uspace/drv/usbmid/usbmid.c
===================================================================
--- uspace/drv/usbmid/usbmid.c	(revision 51f0e4104dd642ae32f20f7a79a4955cf28f9c92)
+++ uspace/drv/usbmid/usbmid.c	(revision eb1a2f485e907e821965b3aafca2d8a5355f3518)
@@ -45,34 +45,17 @@
 
 /** Callback for DDF USB interface. */
-static int usb_iface_get_address_impl(device_t *device, devman_handle_t handle,
+static int usb_iface_get_address_impl(ddf_fun_t *fun, devman_handle_t handle,
     usb_address_t *address)
 {
-	assert(device);
-	device_t *parent = device->parent;
-
-	/* Default error, device does not support this operation. */
-	int rc = ENOTSUP;
-
-	if (parent && parent->ops && parent->ops->interfaces[USB_DEV_IFACE]) {
-		usb_iface_t *usb_iface
-		    = (usb_iface_t *) parent->ops->interfaces[USB_DEV_IFACE];
-		assert(usb_iface != NULL);
-
-		if (usb_iface->get_address) {
-			rc = usb_iface->get_address(parent, parent->handle,
-			    address);
-		}
-	}
-
-	return rc;
+	return usb_iface_get_address_hub_impl(fun, handle, address);
 }
 
 /** Callback for DDF USB interface. */
-static int usb_iface_get_interface_impl(device_t *device, devman_handle_t handle,
+static int usb_iface_get_interface_impl(ddf_fun_t *fun, devman_handle_t handle,
     int *iface_no)
 {
-	assert(device);
-
-	usbmid_interface_t *iface = device->driver_data;
+	assert(fun);
+
+	usbmid_interface_t *iface = fun->driver_data;
 	assert(iface);
 
@@ -91,9 +74,9 @@
 
 
-static device_ops_t child_device_ops = {
+static ddf_dev_ops_t child_device_ops = {
 	.interfaces[USB_DEV_IFACE] = &child_usb_iface
 };
 
-static device_ops_t mid_device_ops = {
+static ddf_dev_ops_t mid_device_ops = {
 	.interfaces[USB_DEV_IFACE] = &usb_iface_hub_impl
 };
@@ -105,5 +88,5 @@
  * @retval NULL Error occured.
  */
-usbmid_device_t *usbmid_device_create(device_t *dev)
+usbmid_device_t *usbmid_device_create(ddf_dev_t *dev)
 {
 	usbmid_device_t *mid = malloc(sizeof(usbmid_device_t));
@@ -133,5 +116,5 @@
 
 	mid->dev = dev;
-	dev->ops = &mid_device_ops;
+	(void) &mid_device_ops;
 
 	return mid;
@@ -145,5 +128,5 @@
  * @retval NULL Error occured.
  */
-usbmid_interface_t *usbmid_interface_create(device_t *dev, int iface_no)
+usbmid_interface_t *usbmid_interface_create(ddf_fun_t *fun, int iface_no)
 {
 	usbmid_interface_t *iface = malloc(sizeof(usbmid_interface_t));
@@ -154,5 +137,5 @@
 	}
 
-	iface->dev = dev;
+	iface->fun = fun;
 	iface->interface_no = iface_no;
 
@@ -172,15 +155,8 @@
     const usb_standard_interface_descriptor_t *interface_descriptor)
 {
-	device_t *child = NULL;
+	ddf_fun_t *child = NULL;
 	char *child_name = NULL;
 	usbmid_interface_t *child_as_interface = NULL;
 	int rc;
-
-	/* Create the device. */
-	child = create_device();
-	if (child == NULL) {
-		rc = ENOMEM;
-		goto error_leave;
-	}
 
 	/*
@@ -196,4 +172,13 @@
 	}
 
+	/* Create the device. */
+	child = ddf_fun_create(parent->dev, fun_inner, child_name);
+	if (child == NULL) {
+		rc = ENOMEM;
+		goto error_leave;
+	}
+
+
+
 	child_as_interface = usbmid_interface_create(child,
 	    (int) interface_descriptor->interface_number);
@@ -204,6 +189,4 @@
 
 	child->driver_data = child_as_interface;
-	child->parent = parent->dev;
-	child->name = child_name;
 	child->ops = &child_device_ops;
 
@@ -215,5 +198,5 @@
 	}
 
-	rc = child_device_register(child, parent->dev);
+	rc = ddf_fun_bind(child);
 	if (rc != EOK) {
 		goto error_leave;
@@ -226,5 +209,5 @@
 		child->name = NULL;
 		/* This takes care of match_id deallocation as well. */
-		delete_device(child);
+		ddf_fun_destroy(child);
 	}
 	if (child_name != NULL) {
Index: uspace/drv/usbmid/usbmid.h
===================================================================
--- uspace/drv/usbmid/usbmid.h	(revision 51f0e4104dd642ae32f20f7a79a4955cf28f9c92)
+++ uspace/drv/usbmid/usbmid.h	(revision eb1a2f485e907e821965b3aafca2d8a5355f3518)
@@ -37,5 +37,5 @@
 #define USBMID_H_
 
-#include <driver.h>
+#include <ddf/driver.h>
 #include <usb/usb.h>
 #include <usb/pipes.h>
@@ -46,5 +46,5 @@
 typedef struct {
 	/** Device container. */
-	device_t *dev;
+	ddf_dev_t *dev;
 
 	/** Representation of USB wire. */
@@ -55,6 +55,6 @@
 
 typedef struct {
-	/** Device container. */
-	device_t *dev;
+	/** Function container. */
+	ddf_fun_t *fun;
 
 	/** Interface number. */
@@ -62,6 +62,6 @@
 } usbmid_interface_t;
 
-usbmid_device_t *usbmid_device_create(device_t *);
-usbmid_interface_t *usbmid_interface_create(device_t *, int);
+usbmid_device_t *usbmid_device_create(ddf_dev_t *);
+usbmid_interface_t *usbmid_interface_create(ddf_fun_t *, int);
 bool usbmid_explore_device(usbmid_device_t *);
 int usbmid_spawn_interface_child(usbmid_device_t *,
