Index: uspace/drv/uhci-rhd/main.c
===================================================================
--- uspace/drv/uhci-rhd/main.c	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
+++ uspace/drv/uhci-rhd/main.c	(revision 1f5c1e619f8747f44de5cff299dbf0494f35ae84)
@@ -102,5 +102,5 @@
 int main(int argc, char *argv[])
 {
-	usb_log_enable(USB_LOG_LEVEL_INFO, NAME);
+	usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);
 	return driver_main(&uhci_rh_driver);
 }
Index: uspace/drv/uhci-rhd/port.c
===================================================================
--- uspace/drv/uhci-rhd/port.c	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
+++ uspace/drv/uhci-rhd/port.c	(revision 1f5c1e619f8747f44de5cff299dbf0494f35ae84)
@@ -48,5 +48,5 @@
 int uhci_port_init(
   uhci_port_t *port, port_status_t *address, unsigned number,
-  unsigned usec, device_t *rh)
+  unsigned usec, device_t *rh, int parent_phone)
 {
 	assert(port);
@@ -56,5 +56,5 @@
 	port->attached_device = 0;
 	port->rh = rh;
-	port->hc_phone = rh->parent_phone;
+	port->hc_phone = parent_phone;
 
 	port->checker = fibril_create(uhci_port_check, port);
@@ -71,4 +71,6 @@
 void uhci_port_fini(uhci_port_t *port)
 {
+// TODO: destroy fibril
+// TODO: hangup phone
 //	fibril_teardown(port->checker);
 	return;
@@ -77,5 +79,4 @@
 int uhci_port_check(void *port)
 {
-	async_usleep( 1000000 );
 	uhci_port_t *port_instance = port;
 	assert(port_instance);
@@ -114,18 +115,33 @@
 	usb_log_info("Adding new device on port %d.\n", port->number);
 
+	/* get address of the future device */
+	const usb_address_t usb_address = usb_drv_request_address(port->hc_phone);
+
+	if (usb_address <= 0) {
+		usb_log_error("Recieved invalid address(%d).\n", usb_address);
+		return usb_address;
+	}
+	usb_log_debug("Sucessfully obtained address %d for port %d.\n",
+	    usb_address, port->number);
 
 	/* get default address */
 	int ret = usb_drv_reserve_default_address(port->hc_phone);
 	if (ret != EOK) {
-		usb_log_error("Failed to reserve default address.\n");
+		usb_log_error("Failed to reserve default address on port %d.\n",
+		    port->number);
+		int ret2 =
+		  usb_drv_release_address(port->hc_phone, usb_address);
+		if (ret2 != EOK) {
+			usb_log_fatal("Failed to return requested address on port %d.\n",
+			   port->number);
+			return ret2;
+		}
+		usb_log_debug("Successfully returned reserved address on port %d.\n",
+			port->number);
 		return ret;
 	}
-
-	const usb_address_t usb_address = usb_drv_request_address(port->hc_phone);
-
-	if (usb_address <= 0) {
-		usb_log_error("Recieved invalid address(%d).\n", usb_address);
-		return usb_address;
-	}
+	usb_log_debug("Sucessfully obtained default address for port %d.\n",
+	    port->number);
+
 	/*
 	 * the host then waits for at least 100 ms to allow completion of
@@ -140,17 +156,22 @@
 	 * (See Section 11.5.1.5)
 	 */
-	port_status_t port_status =
-		port_status_read(port->address);
-	port_status |= STATUS_IN_RESET;
-	port_status_write(port->address, port_status);
-	async_usleep(10000);
-	port_status =
-		port_status_read(port->address);
-	port_status &= ~STATUS_IN_RESET;
-	port_status_write(port->address, port_status);
+	{
+		usb_log_debug("Reset Signal start on port %d.\n",
+		    port->number);
+		port_status_t port_status =
+			port_status_read(port->address);
+		port_status |= STATUS_IN_RESET;
+		port_status_write(port->address, port_status);
+		async_usleep(10000);
+		port_status =
+			port_status_read(port->address);
+		port_status &= ~STATUS_IN_RESET;
+		port_status_write(port->address, port_status);
+		usb_log_debug("Reset Signal stop on port %d.\n",
+		    port->number);
+	}
 
 	/* assign address to device */
 	ret = usb_drv_req_set_address(port->hc_phone, 0, usb_address);
-
 
 	if (ret != EOK) { /* address assigning went wrong */
@@ -159,16 +180,24 @@
 		int release = usb_drv_release_default_address(port->hc_phone);
 		if (release != EOK) {
-			usb_log_error("Failed to release default address.\n");
+			usb_log_error("Failed to release default address on port %d.\n",
+			    port->number);
 			return release;
 		}
+		usb_log_debug("Sucessfully released default address on port %d.\n",
+		    port->number);
 		return ret;
 	}
+	usb_log_debug("Sucessfully assigned address %d for port %d.\n",
+	    usb_address, port->number);
 
 	/* release default address */
 	ret = usb_drv_release_default_address(port->hc_phone);
 	if (ret != EOK) {
-		usb_log_error("Failed to release default address.\n");
+		usb_log_error("Failed to release default address on port %d.\n",
+		    port->number);
 		return ret;
 	}
+	usb_log_debug("Sucessfully released default address on port %d.\n",
+	    port->number);
 
 	/* communicate and possibly report to devman */
@@ -195,5 +224,5 @@
 	usb_log_error("Don't know how to remove device %#x.\n",
 		(unsigned int)port->attached_device);
-	uhci_port_set_enabled(port, false);
+//	uhci_port_set_enabled(port, false);
 	return EOK;
 }
Index: uspace/drv/uhci-rhd/port.h
===================================================================
--- uspace/drv/uhci-rhd/port.h	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
+++ uspace/drv/uhci-rhd/port.h	(revision 1f5c1e619f8747f44de5cff299dbf0494f35ae84)
@@ -54,5 +54,5 @@
 int uhci_port_init(
   uhci_port_t *port, port_status_t *address, unsigned number,
-  unsigned usec, device_t *rh);
+  unsigned usec, device_t *rh, int parent_phone);
 
 void uhci_port_fini(uhci_port_t *port);
Index: uspace/drv/uhci-rhd/port_status.c
===================================================================
--- uspace/drv/uhci-rhd/port_status.c	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
+++ uspace/drv/uhci-rhd/port_status.c	(revision 1f5c1e619f8747f44de5cff299dbf0494f35ae84)
@@ -64,5 +64,5 @@
 	unsigned i = 0;
 	for (;i < sizeof(flags)/sizeof(struct flag_name); ++i) {
-		usb_log_debug("\t%s status: %s.\n", flags[i].name,
+		usb_log_debug2("\t%s status: %s.\n", flags[i].name,
 		  value & flags[i].flag ? "YES" : "NO");
 	}
Index: uspace/drv/uhci-rhd/root_hub.c
===================================================================
--- uspace/drv/uhci-rhd/root_hub.c	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
+++ uspace/drv/uhci-rhd/root_hub.c	(revision 1f5c1e619f8747f44de5cff299dbf0494f35ae84)
@@ -53,12 +53,4 @@
 	}
 
-	/* connect to the parent device (HC) */
-	rh->parent_phone = devman_device_connect(8, 0);
-	//usb_drv_hc_connect(rh, instance->hc_handle, 0);
-	if (rh->parent_phone < 0) {
-		usb_log_error("Failed to connect to the HC device.\n");
-		return rh->parent_phone;
-	}
-
 	/* allow access to root hub registers */
 	assert(sizeof(port_status_t) * UHCI_ROOT_HUB_PORT_COUNT == size);
@@ -75,7 +67,14 @@
 	unsigned i = 0;
 	for (; i < UHCI_ROOT_HUB_PORT_COUNT; ++i) {
+		/* connect to the parent device (HC) */
+		int parent_phone = devman_device_connect(instance->hc_handle, 0);
+		//usb_drv_hc_connect(rh, instance->hc_handle, 0);
+		if (parent_phone < 0) {
+			usb_log_error("Failed to connect to the HC device port %d.\n", i);
+			return parent_phone;
+		}
 		/* mind pointer arithmetics */
 		int ret = uhci_port_init(
-		  &instance->ports[i], regs + i, i, ROOT_HUB_WAIT_USEC, rh);
+		  &instance->ports[i], regs + i, i, ROOT_HUB_WAIT_USEC, rh, parent_phone);
 		if (ret != EOK) {
 			unsigned j = 0;
