Index: uspace/drv/ohci/hc.c
===================================================================
--- uspace/drv/ohci/hc.c	(revision f324635ca604347ad2c8fd1f6731c6cf446dae00)
+++ uspace/drv/ohci/hc.c	(revision 8148ee3ab563a9e7f7419a2b70db63e2cb64c6fc)
@@ -55,24 +55,32 @@
 	assert(hub_fun);
 
+	int ret;
+
 	usb_address_t hub_address =
 	    device_keeper_get_free_address(&instance->manager, USB_SPEED_FULL);
+	if (hub_address <= 0) {
+		usb_log_error("Failed to get OHCI root hub address.\n");
+		return hub_address;
+	}
 	instance->rh.address = hub_address;
 	usb_device_keeper_bind(
 	    &instance->manager, hub_address, hub_fun->handle);
 
-	endpoint_t *ep = malloc(sizeof(endpoint_t));
-	assert(ep);
-	int ret = endpoint_init(ep, hub_address, 0, USB_DIRECTION_BOTH,
-	    USB_TRANSFER_CONTROL, USB_SPEED_FULL, 64);
-	assert(ret == EOK);
-	ret = usb_endpoint_manager_register_ep(&instance->ep_manager, ep, 0);
-	assert(ret == EOK);
+	ret = usb_endpoint_manager_add_ep(&instance->ep_manager,
+	    hub_address, 0, USB_DIRECTION_BOTH, USB_TRANSFER_CONTROL,
+	    USB_SPEED_FULL, 64, 0);
+	if (ret != EOK) {
+		usb_log_error("Failed to add OHCI rh endpoint 0.\n");
+		usb_device_keeper_release(&instance->manager, hub_address);
+		return ret;
+	}
 
 	char *match_str = NULL;
+	/* DDF needs heap allocated string */
 	ret = asprintf(&match_str, "usb&class=hub");
-//	ret = (match_str == NULL) ? ret : EOK;
 	if (ret < 0) {
 		usb_log_error(
 		    "Failed(%d) to create root hub match-id string.\n", ret);
+		usb_device_keeper_release(&instance->manager, hub_address);
 		return ret;
 	}
@@ -80,5 +88,5 @@
 	ret = ddf_fun_add_match_id(hub_fun, match_str, 100);
 	if (ret != EOK) {
-		usb_log_error("Failed add create root hub match-id.\n");
+		usb_log_error("Failed add root hub match-id.\n");
 	}
 	return ret;
@@ -115,5 +123,5 @@
 	fibril_mutex_initialize(&instance->guard);
 
-	rh_init(&instance->rh, dev, instance->registers);
+	rh_init(&instance->rh, instance->registers);
 
 	if (!interrupts) {
Index: uspace/drv/ohci/root_hub.c
===================================================================
--- uspace/drv/ohci/root_hub.c	(revision f324635ca604347ad2c8fd1f6731c6cf446dae00)
+++ uspace/drv/ohci/root_hub.c	(revision 8148ee3ab563a9e7f7419a2b70db63e2cb64c6fc)
@@ -205,21 +205,14 @@
  * @return Error code.
  */
-int rh_init(rh_t *instance, ddf_dev_t *dev, ohci_regs_t *regs) {
+int rh_init(rh_t *instance, ohci_regs_t *regs) {
 	assert(instance);
-	//instance->address = -1;
 	instance->registers = regs;
-	instance->device = dev;
 	instance->port_count =
 	    (instance->registers->rh_desc_a >> RHDA_NDS_SHIFT) & RHDA_NDS_MASK;
 	rh_init_descriptors(instance);
 	// set port power mode to no-power-switching
-	instance->registers->rh_desc_a =
-		instance->registers->rh_desc_a | (1<<9);
+	instance->registers->rh_desc_a |= RHDA_NPS_FLAG;
 
 	usb_log_info("OHCI root hub with %d ports.\n", instance->port_count);
-
-	//start generic usb hub driver
-
-	/* TODO: implement */
 	return EOK;
 }
Index: uspace/drv/ohci/root_hub.h
===================================================================
--- uspace/drv/ohci/root_hub.h	(revision f324635ca604347ad2c8fd1f6731c6cf446dae00)
+++ uspace/drv/ohci/root_hub.h	(revision 8148ee3ab563a9e7f7419a2b70db63e2cb64c6fc)
@@ -50,6 +50,4 @@
 	/** usb address of the root hub */
 	usb_address_t address;
-	/** ddf device information */
-	ddf_dev_t *device;
 	/** hub port count */
 	int port_count;
@@ -58,5 +56,5 @@
 } rh_t;
 
-int rh_init(rh_t *instance, ddf_dev_t *dev, ohci_regs_t *regs);
+int rh_init(rh_t *instance, ohci_regs_t *regs);
 
 int rh_request(rh_t *instance, usb_transfer_batch_t *request);
