Index: uspace/drv/bus/usb/ohci/ohci.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci.c	(revision f9ab5620884e9f2437e4ff904764b61f1b9c6389)
+++ uspace/drv/bus/usb/ohci/ohci.c	(revision 2f87aa63a0c77d7621450b8fbf46571c5f6bb4db)
@@ -34,7 +34,4 @@
  */
 
-/* XXX Fix this */
-#define _DDF_DATA_IMPLANT
-
 #include <errno.h>
 #include <str_error.h>
@@ -52,6 +49,4 @@
 	ddf_fun_t *hc_fun;
 	ddf_fun_t *rh_fun;
-
-	hc_t hc;
 } ohci_t;
 
@@ -60,4 +55,5 @@
 	return ddf_dev_data_get(dev);
 }
+
 /** IRQ handling callback, identifies device
  *
@@ -75,6 +71,9 @@
 		return;
 	}
+	hc_t *hc = ddf_fun_data_get(ohci->hc_fun);
+	assert(hc);
+
 	const uint16_t status = IPC_GET_ARG1(*call);
-	hc_interrupt(&ohci->hc, status);
+	hc_interrupt(hc, status);
 }
 
@@ -90,5 +89,8 @@
 
 	if (address != NULL) {
-		*address = dev_to_ohci(ddf_fun_get_dev(fun))->hc.rh.address;
+		hc_t *hc =
+		    ddf_fun_data_get(dev_to_ohci(ddf_fun_get_dev(fun))->hc_fun);
+		assert(hc);
+		*address = hc->rh.address;
 	}
 
@@ -102,13 +104,13 @@
  * @return Error code.
  */
-static int rh_get_hc_handle(
-    ddf_fun_t *fun, devman_handle_t *handle)
+static int rh_get_hc_handle(ddf_fun_t *fun, devman_handle_t *handle)
 {
 	assert(fun);
-	ddf_fun_t *hc_fun = dev_to_ohci(ddf_fun_get_dev(fun))->hc_fun;
-	assert(hc_fun);
-
-	if (handle != NULL)
+
+	if (handle != NULL) {
+		ddf_fun_t *hc_fun = dev_to_ohci(ddf_fun_get_dev(fun))->hc_fun;
+		assert(hc_fun);
 		*handle = ddf_fun_get_handle(hc_fun);
+	}
 	return EOK;
 }
@@ -146,5 +148,5 @@
 		return EBADMEM;
 
-	ohci_t *instance = ddf_dev_data_alloc(device,sizeof(ohci_t));
+	ohci_t *instance = ddf_dev_data_alloc(device, sizeof(ohci_t));
 	if (instance == NULL) {
 		usb_log_error("Failed to allocate OHCI driver.\n");
@@ -169,5 +171,8 @@
 	    "Failed to create OHCI HC function: %s.\n", str_error(ret));
 	ddf_fun_set_ops(instance->hc_fun, &hc_ops);
-	ddf_fun_data_implant(instance->hc_fun, &instance->hc);
+	hc_t *hc = ddf_fun_data_alloc(instance->hc_fun, sizeof(hc_t));
+	ret = hc ? EOK : ENOMEM;
+	CHECK_RET_DEST_FREE_RETURN(ret,
+	    "Failed to allocate HCD structure: %s.\n", str_error(ret));
 
 	instance->rh_fun = ddf_fun_create(device, fun_inner, "ohci_rh");
@@ -223,5 +228,5 @@
 	}
 
-	ret = hc_init(&instance->hc, reg_base, reg_size, interrupts);
+	ret = hc_init(hc, reg_base, reg_size, interrupts);
 	CHECK_RET_DEST_FREE_RETURN(ret,
 	    "Failed to init ohci_hcd: %s.\n", str_error(ret));
@@ -229,5 +234,5 @@
 #define CHECK_RET_FINI_RETURN(ret, message...) \
 if (ret != EOK) { \
-	hc_fini(&instance->hc); \
+	hc_fini(hc); \
 	unregister_interrupt_handler(device, irq); \
 	CHECK_RET_DEST_FREE_RETURN(ret, message); \
@@ -243,5 +248,5 @@
 	    "Failed to add OHCI to HC class: %s.\n", str_error(ret));
 
-	ret = hc_register_hub(&instance->hc, instance->rh_fun);
+	ret = hc_register_hub(hc, instance->rh_fun);
 	CHECK_RET_FINI_RETURN(ret,
 	    "Failed to register OHCI root hub: %s.\n", str_error(ret));
Index: uspace/drv/bus/usb/ohci/ohci.h
===================================================================
--- uspace/drv/bus/usb/ohci/ohci.h	(revision f9ab5620884e9f2437e4ff904764b61f1b9c6389)
+++ uspace/drv/bus/usb/ohci/ohci.h	(revision 2f87aa63a0c77d7621450b8fbf46571c5f6bb4db)
@@ -34,5 +34,4 @@
 #ifndef DRV_OHCI_OHCI_H
 #define DRV_OHCI_OHCI_H
-#include <ddi.h>
 #include <ddf/driver.h>
 
