Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision d51ba3594ad3b5361b07dae7b42a43e5f7ebaa56)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision 9e9d018ef6ffcd0f04a413a1bd2062d929fa55e7)
@@ -690,4 +690,5 @@
 }
 
+//TODO: Move this to generic ddf?
 int hcd_ddf_get_registers(ddf_dev_t *device, hw_res_list_parsed_t *hw_res)
 {
@@ -779,10 +780,10 @@
 	assert(dev);
 	hcd_t *hcd = dev_to_hcd(dev);
-	if (!hcd || !hcd->driver.irq_hook) {
+	if (!hcd || !hcd->ops.irq_hook) {
 		usb_log_error("Interrupt on not yet initialized device.\n");
 		return;
 	}
 	const uint32_t status = IPC_GET_ARG1(*call);
-	hcd->driver.irq_hook(hcd, status);
+	hcd->ops.irq_hook(hcd, status);
 }
 
@@ -791,9 +792,9 @@
 	hcd_t *hcd = arg;
 	assert(hcd);
-	if (!hcd->driver.status_hook || !hcd->driver.irq_hook)
+	if (!hcd->ops.status_hook || !hcd->ops.irq_hook)
 		return ENOTSUP;
 	uint32_t status = 0;
-	while (hcd->driver.status_hook(hcd, &status) == EOK) {
-		hcd->driver.irq_hook(hcd, status);
+	while (hcd->ops.status_hook(hcd, &status) == EOK) {
+		hcd->ops.irq_hook(hcd, status);
 		status = 0;
 		/* We should wait 1 frame - 1ms here, but this polling is a
@@ -885,5 +886,5 @@
 
 	/* Need working irq replacement to setup root hub */
-	if ((irq < 0) && hcd->driver.status_hook) {
+	if ((irq < 0) && hcd->ops.status_hook) {
 		hcd->polling_fibril = fibril_create(interrupt_polling, hcd);
 		if (hcd->polling_fibril == 0) {
Index: uspace/lib/usbhost/src/hcd.c
===================================================================
--- uspace/lib/usbhost/src/hcd.c	(revision d51ba3594ad3b5361b07dae7b42a43e5f7ebaa56)
+++ uspace/lib/usbhost/src/hcd.c	(revision 9e9d018ef6ffcd0f04a413a1bd2062d929fa55e7)
@@ -54,6 +54,6 @@
 	assert(ep);
 	assert(hcd);
-	if (hcd->driver.ep_add_hook)
-		return hcd->driver.ep_add_hook(hcd, ep);
+	if (hcd->ops.ep_add_hook)
+		return hcd->ops.ep_add_hook(hcd, ep);
 	return EOK;
 }
@@ -68,6 +68,6 @@
 	assert(ep);
 	assert(hcd);
-	if (hcd->driver.ep_remove_hook)
-		hcd->driver.ep_remove_hook(hcd, ep);
+	if (hcd->ops.ep_remove_hook)
+		hcd->ops.ep_remove_hook(hcd, ep);
 }
 
@@ -99,8 +99,5 @@
 	usb_bus_init(&hcd->bus, bandwidth, bw_count, max_speed);
 
-	hcd->driver.data = NULL;
-	hcd->driver.schedule = NULL;
-	hcd->driver.ep_add_hook = NULL;
-	hcd->driver.ep_remove_hook = NULL;
+	hcd_set_implementation(hcd, NULL, NULL);
 }
 
@@ -127,6 +124,5 @@
 	assert(hcd);
 	usb_address_t address = 0;
-	return usb_bus_request_address(
-	    &hcd->bus, &address, true, speed);
+	return usb_bus_request_address(&hcd->bus, &address, true, speed);
 }
 
@@ -209,5 +205,5 @@
 		return ENOSPC;
 	}
-	if (!hcd->driver.schedule) {
+	if (!hcd->ops.schedule) {
 		usb_log_error("HCD does not implement scheduler.\n");
 		return ENOTSUP;
@@ -241,5 +237,5 @@
 	}
 
-	const int ret = hcd->driver.schedule(hcd, batch);
+	const int ret = hcd->ops.schedule(hcd, batch);
 	if (ret != EOK)
 		usb_transfer_batch_destroy(batch);
