Index: uspace/drv/ohci/hc.c
===================================================================
--- uspace/drv/ohci/hc.c	(revision b0beee8234f973c71ea5675425ade580ec0e65a2)
+++ uspace/drv/ohci/hc.c	(revision a6d1bc10e6f4e06523af1a4676a4d4c4c791e696)
@@ -39,10 +39,12 @@
 #include <usb/debug.h>
 #include <usb/usb.h>
+#include <usb/hub.h>
+#include <usb/usbdevice.h>
 #include <usb/ddfiface.h>
-#include <usb_iface.h>
 
 #include "hc.h"
 
-int hc_init(hc_t *instance, ddf_fun_t *fun,
+/*----------------------------------------------------------------------------*/
+int hc_init(hc_t *instance, ddf_fun_t *fun, ddf_dev_t *dev,
     uintptr_t regs, size_t reg_size, bool interrupts)
 {
@@ -56,8 +58,14 @@
 
 
-	rh_init(&instance->rh, instance->registers);
+	rh_init(&instance->rh, dev, instance->registers);
 	/* TODO: implement */
 	/* TODO: register root hub */
 	return EOK;
+}
+/*----------------------------------------------------------------------------*/
+int hc_register_hub(hc_t *instance, ddf_dev_t *dev)
+{
+	assert(instance);
+	return rh_register(&instance->rh, dev);
 }
 /*----------------------------------------------------------------------------*/
@@ -71,5 +79,5 @@
 	}
 	/* TODO: implement */
-	return EOK;
+	return ENOTSUP;
 }
 /*----------------------------------------------------------------------------*/
Index: uspace/drv/ohci/hc.h
===================================================================
--- uspace/drv/ohci/hc.h	(revision b0beee8234f973c71ea5675425ade580ec0e65a2)
+++ uspace/drv/ohci/hc.h	(revision a6d1bc10e6f4e06523af1a4676a4d4c4c791e696)
@@ -51,11 +51,13 @@
 	ohci_regs_t *registers;
 	usb_address_t rh_address;
-	ohci_rh_t rh;
+	rh_t rh;
 	ddf_fun_t *ddf_instance;
 	device_keeper_t manager;
 } hc_t;
 
-int hc_init(hc_t *instance, ddf_fun_t *fun,
+int hc_init(hc_t *instance, ddf_fun_t *fun, ddf_dev_t *dev,
      uintptr_t regs, size_t reg_size, bool interrupts);
+
+int hc_register_hub(hc_t *instance, ddf_dev_t *dev);
 
 int hc_schedule(hc_t *instance, batch_t *batch);
Index: uspace/drv/ohci/main.c
===================================================================
--- uspace/drv/ohci/main.c	(revision b0beee8234f973c71ea5675425ade580ec0e65a2)
+++ uspace/drv/ohci/main.c	(revision a6d1bc10e6f4e06523af1a4676a4d4c4c791e696)
@@ -129,5 +129,5 @@
 	}
 
-	ret = hc_init(hcd, hc_fun, mem_reg_base, mem_reg_size, interrupts);
+	ret = hc_init(hcd, hc_fun, device, mem_reg_base, mem_reg_size, interrupts);
 	if (ret != EOK) {
 		usb_log_error("Failed to initialize OHCI driver.\n");
@@ -148,5 +148,5 @@
 	hc_fun->driver_data = hcd;
 
-	/* TODO: register interrupt handler */
+	hc_register_hub(hcd, device);
 
 	usb_log_info("Controlling new OHCI device `%s' (handle %llu).\n",
Index: uspace/drv/ohci/root_hub.c
===================================================================
--- uspace/drv/ohci/root_hub.c	(revision b0beee8234f973c71ea5675425ade580ec0e65a2)
+++ uspace/drv/ohci/root_hub.c	(revision a6d1bc10e6f4e06523af1a4676a4d4c4c791e696)
@@ -43,9 +43,10 @@
  * @return Error code.
  */
-int rh_init(ohci_rh_t *instance, ohci_regs_t *regs)
+int rh_init(rh_t *instance, ddf_dev_t *dev, ohci_regs_t *regs)
 {
 	assert(instance);
 	instance->address = 0;
 	instance->registers = regs;
+	instance->device = dev;
 
 	usb_log_info("OHCI root hub with %d ports.\n", regs->rh_desc_a & 0xff);
@@ -55,13 +56,19 @@
 }
 /*----------------------------------------------------------------------------*/
-void rh_request(ohci_rh_t *instance, batch_t *request)
+void rh_request(rh_t *instance, batch_t *request)
 {
+	usb_log_error("Request processing not implemented.\n");
 	/* TODO: implement */
 }
 /*----------------------------------------------------------------------------*/
-void rh_interrupt(ohci_rh_t *instance)
+void rh_interrupt(rh_t *instance)
 {
-	usb_log_info("Interrupt!!.\n");
+	usb_log_error("Root hub interrupt not implemented.\n");
 	/* TODO: implement */
+}
+/*----------------------------------------------------------------------------*/
+int rh_register(rh_t *instance, ddf_dev_t *dev)
+{
+	return EOK;
 }
 /**
Index: uspace/drv/ohci/root_hub.h
===================================================================
--- uspace/drv/ohci/root_hub.h	(revision b0beee8234f973c71ea5675425ade580ec0e65a2)
+++ uspace/drv/ohci/root_hub.h	(revision a6d1bc10e6f4e06523af1a4676a4d4c4c791e696)
@@ -41,14 +41,17 @@
 #include "batch.h"
 
-typedef struct ohci_rh {
+typedef struct rh {
 	ohci_regs_t *registers;
 	usb_address_t address;
-} ohci_rh_t;
+	ddf_dev_t *device;
+} rh_t;
 
-int rh_init(ohci_rh_t *instance, ohci_regs_t *regs);
+int rh_init(rh_t *instance, ddf_dev_t *dev, ohci_regs_t *regs);
 
-void rh_request(ohci_rh_t *instance, batch_t *request);
+void rh_request(rh_t *instance, batch_t *request);
 
-void rh_interrupt(ohci_rh_t *instance);
+void rh_interrupt(rh_t *instance);
+
+int rh_register(rh_t *instance, ddf_dev_t *dev);
 #endif
 /**
