Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision 87a3df7f006e090aff8b245de3e4b00a641112db)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision b5111c46021cac567ff85e5ffa9f39811311f805)
@@ -193,5 +193,5 @@
 	instance->rh.address = 1;
 	rc = usb_device_manager_request_address(
-	    &instance->generic.dev_manager, &instance->rh.address, false,
+	    &instance->generic->dev_manager, &instance->rh.address, false,
 	    USB_SPEED_FULL);
 	if (rc != EOK) {
@@ -204,5 +204,5 @@
 
 	rc = usb_endpoint_manager_add_ep(
-	    &instance->generic.ep_manager, instance->rh.address, 0,
+	    &instance->generic->ep_manager, instance->rh.address, 0,
 	    USB_DIRECTION_BOTH, USB_TRANSFER_CONTROL, USB_SPEED_FULL, 64,
 	    0, NULL, NULL);
@@ -231,5 +231,5 @@
 	fun_bound = true;
 
-	rc = usb_device_manager_bind_address(&instance->generic.dev_manager,
+	rc = usb_device_manager_bind_address(&instance->generic->dev_manager,
 	    instance->rh.address, ddf_fun_get_handle(hub_fun));
 	if (rc != EOK) {
@@ -244,10 +244,10 @@
 	if (ep_added) {
 		usb_endpoint_manager_remove_ep(
-		    &instance->generic.ep_manager, instance->rh.address, 0,
+		    &instance->generic->ep_manager, instance->rh.address, 0,
 		    USB_DIRECTION_BOTH, NULL, NULL);
 	}
 	if (addr_reqd) {
 		usb_device_manager_release_address(
-		    &instance->generic.dev_manager, instance->rh.address);
+		    &instance->generic->dev_manager, instance->rh.address);
 	}
 	return rc;
@@ -257,9 +257,10 @@
  *
  * @param[in] instance Memory place for the structure.
+ * @param[in] HC function node
  * @param[in] regs Device's I/O registers range.
  * @param[in] interrupts True if w interrupts should be used
  * @return Error code
  */
-int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts)
+int hc_init(hc_t *instance, ddf_fun_t *fun, addr_range_t *regs, bool interrupts)
 {
 	assert(instance);
@@ -274,10 +275,16 @@
 	list_initialize(&instance->pending_batches);
 
-	hcd_init(&instance->generic, USB_SPEED_FULL,
+	instance->generic = ddf_fun_data_alloc(fun, sizeof(hcd_t));
+	if (instance->generic == NULL) {
+		usb_log_error("Out of memory.\n");
+		return ENOMEM;
+	}
+
+	hcd_init(instance->generic, USB_SPEED_FULL,
 	    BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11);
-	instance->generic.private_data = instance;
-	instance->generic.schedule = hc_schedule;
-	instance->generic.ep_add_hook = ohci_endpoint_init;
-	instance->generic.ep_remove_hook = ohci_endpoint_fini;
+	instance->generic->private_data = instance;
+	instance->generic->schedule = hc_schedule;
+	instance->generic->ep_add_hook = ohci_endpoint_init;
+	instance->generic->ep_remove_hook = ohci_endpoint_fini;
 
 	rc = hc_init_memory(instance);
Index: uspace/drv/bus/usb/ohci/hc.h
===================================================================
--- uspace/drv/bus/usb/ohci/hc.h	(revision 87a3df7f006e090aff8b245de3e4b00a641112db)
+++ uspace/drv/bus/usb/ohci/hc.h	(revision b5111c46021cac567ff85e5ffa9f39811311f805)
@@ -35,4 +35,5 @@
 #define DRV_OHCI_HC_H
 
+#include <ddf/driver.h>
 #include <ddf/interrupt.h>
 #include <fibril.h>
@@ -53,5 +54,5 @@
 typedef struct hc {
 	/** Generic USB hc driver */
-	hcd_t generic;
+	hcd_t *generic;
 
 	/** Memory mapped I/O registers area */
@@ -79,6 +80,6 @@
 int hc_register_irq_handler(ddf_dev_t *, addr_range_t *, int,
     interrupt_handler_t);
-int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun);
-int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts);
+int hc_register_hub(hc_t *, ddf_fun_t *);
+int hc_init(hc_t *, ddf_fun_t *, addr_range_t *, bool);
 
 /** Safely dispose host controller internal structures
Index: uspace/drv/bus/usb/ohci/ohci.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci.c	(revision 87a3df7f006e090aff8b245de3e4b00a641112db)
+++ uspace/drv/bus/usb/ohci/ohci.c	(revision b5111c46021cac567ff85e5ffa9f39811311f805)
@@ -34,7 +34,4 @@
  */
 
-/* XXX Fix this */
-#define _DDF_DATA_IMPLANT
-
 #include <errno.h>
 #include <str_error.h>
@@ -165,5 +162,4 @@
 
 	ddf_fun_set_ops(instance->hc_fun, &hc_ops);
-	ddf_fun_data_implant(instance->hc_fun, &instance->hc);
 
 	instance->rh_fun = ddf_fun_create(device, fun_inner, "ohci_rh");
@@ -214,5 +210,5 @@
 	}
 
-	rc = hc_init(&instance->hc, &regs, interrupts);
+	rc = hc_init(&instance->hc, instance->hc_fun, &regs, interrupts);
 	if (rc != EOK) {
 		usb_log_error("Failed to init ohci_hcd: %s.\n", str_error(rc));
Index: uspace/drv/bus/usb/uhci/hc.c
===================================================================
--- uspace/drv/bus/usb/uhci/hc.c	(revision 87a3df7f006e090aff8b245de3e4b00a641112db)
+++ uspace/drv/bus/usb/uhci/hc.c	(revision b5111c46021cac567ff85e5ffa9f39811311f805)
@@ -230,4 +230,5 @@
  *
  * @param[in] instance Memory place to initialize.
+ * @param[in] HC function node
  * @param[in] regs Range of device's I/O control registers.
  * @param[in] interrupts True if hw interrupts should be used.
@@ -238,5 +239,5 @@
  * interrupt fibrils.
  */
-int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts)
+int hc_init(hc_t *instance, ddf_fun_t *fun, addr_range_t *regs, bool interrupts)
 {
 	assert(regs->size >= sizeof(uhci_regs_t));
@@ -266,10 +267,16 @@
 	}
 
-	hcd_init(&instance->generic, USB_SPEED_FULL,
+	instance->generic = ddf_fun_data_alloc(fun, sizeof(hcd_t));
+	if (instance->generic == NULL) {
+		usb_log_error("Out of memory.\n");
+		return ENOMEM;
+	}
+
+	hcd_init(instance->generic, USB_SPEED_FULL,
 	    BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11);
 
-	instance->generic.private_data = instance;
-	instance->generic.schedule = hc_schedule;
-	instance->generic.ep_add_hook = NULL;
+	instance->generic->private_data = instance;
+	instance->generic->schedule = hc_schedule;
+	instance->generic->ep_add_hook = NULL;
 
 	hc_init_hw(instance);
Index: uspace/drv/bus/usb/uhci/hc.h
===================================================================
--- uspace/drv/bus/usb/uhci/hc.h	(revision 87a3df7f006e090aff8b245de3e4b00a641112db)
+++ uspace/drv/bus/usb/uhci/hc.h	(revision b5111c46021cac567ff85e5ffa9f39811311f805)
@@ -36,4 +36,5 @@
 #define DRV_UHCI_HC_H
 
+#include <ddf/driver.h>
 #include <ddf/interrupt.h>
 #include <device/hw_res_parsed.h>
@@ -93,5 +94,5 @@
 typedef struct hc {
 	/** Generic HCD driver structure */
-	hcd_t generic;
+	hcd_t *generic;
 
 	/** Addresses of I/O registers */
@@ -126,5 +127,5 @@
     addr_range_t *);
 void hc_interrupt(hc_t *instance, uint16_t status);
-int hc_init(hc_t *instance, addr_range_t *regs, bool interupts);
+int hc_init(hc_t *, ddf_fun_t *, addr_range_t *, bool);
 
 /** Safely dispose host controller internal structures
Index: uspace/drv/bus/usb/uhci/uhci.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci.c	(revision 87a3df7f006e090aff8b245de3e4b00a641112db)
+++ uspace/drv/bus/usb/uhci/uhci.c	(revision b5111c46021cac567ff85e5ffa9f39811311f805)
@@ -34,7 +34,4 @@
  */
 
-/* XXX Fix this */
-#define _DDF_DATA_IMPLANT
-
 #include <errno.h>
 #include <stdbool.h>
@@ -62,5 +59,5 @@
 	hc_t hc;
 	/** Internal driver's representation of UHCI root hub */
-	rh_t rh;
+	rh_t *rh;
 } uhci_t;
 
@@ -186,5 +183,4 @@
 
 	ddf_fun_set_ops(instance->hc_fun, &hc_ops);
-	ddf_fun_data_implant(instance->hc_fun, &instance->hc.generic);
 
 	instance->rh_fun = ddf_fun_create(device, fun_inner, "uhci_rh");
@@ -196,5 +192,5 @@
 
 	ddf_fun_set_ops(instance->rh_fun, &rh_ops);
-	ddf_fun_data_implant(instance->rh_fun, &instance->rh);
+	instance->rh = ddf_fun_data_alloc(instance->rh_fun, sizeof(rh_t));
 
 	addr_range_t regs;
@@ -236,5 +232,5 @@
 	}
 
-	rc = hc_init(&instance->hc, &regs, interrupts);
+	rc = hc_init(&instance->hc, instance->hc_fun, &regs, interrupts);
 	if (rc != EOK) {
 		usb_log_error("Failed to init uhci_hcd: %s.\n", str_error(rc));
@@ -260,5 +256,5 @@
 	}
 
-	rc = rh_init(&instance->rh, instance->rh_fun, &regs, 0x10, 4);
+	rc = rh_init(instance->rh, instance->rh_fun, &regs, 0x10, 4);
 	if (rc != EOK) {
 		usb_log_error("Failed to setup UHCI root hub: %s.\n",
