Index: uspace/drv/usbhub/main.c
===================================================================
--- uspace/drv/usbhub/main.c	(revision b666608e2a8e30364304b3bc1171c7baa7727130)
+++ uspace/drv/usbhub/main.c	(revision 4c74ac39e6e9e5218bfae7015043736e4d9a17b7)
@@ -26,7 +26,10 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-#include <usb/usbdrv.h>
+
 #include <driver.h>
 #include <errno.h>
+#include <async.h>
+
+#include <usb/usbdrv.h>
 #include "usbhub.h"
 #include "usbhub_private.h"
@@ -44,7 +47,23 @@
 };
 
+int usb_hub_control_loop(void * noparam){
+	while(true){
+		usb_hub_check_hub_changes();
+		async_usleep(10000);
+	}
+	return 0;
+}
+
+
 int main(int argc, char *argv[])
 {
 	usb_lst_init(&usb_hub_list);
+	fid_t fid = fibril_create(usb_hub_control_loop, NULL);
+	if (fid == 0) {
+		printf("%s: failed to start fibril for HUB devices\n", NAME);
+		return ENOMEM;
+	}
+	fibril_add_ready(fid);
+
 	return driver_main(&hub_driver);
 }
Index: uspace/drv/usbhub/usbhub.h
===================================================================
--- uspace/drv/usbhub/usbhub.h	(revision b666608e2a8e30364304b3bc1171c7baa7727130)
+++ uspace/drv/usbhub/usbhub.h	(revision 4c74ac39e6e9e5218bfae7015043736e4d9a17b7)
@@ -53,5 +53,26 @@
 } usb_hub_info_t;
 
-int usb_add_hub_device(device_t *);
+/**
+ * function running the hub-controlling loop.
+ * @param noparam fundtion does not need any parameters
+ */
+int usb_hub_control_loop(void * noparam);
+
+/** Callback when new hub device is detected.
+ *
+ * @param dev New device.
+ * @return Error code.
+ */
+int usb_add_hub_device(device_t *dev);
+
+/**
+ * check changes on all registered hubs
+ */
+void usb_hub_check_hub_changes(void);
+
+
+//int usb_add_hub_device(device_t *);
+
+
 
 #endif
Index: uspace/drv/usbhub/utils.c
===================================================================
--- uspace/drv/usbhub/utils.c	(revision b666608e2a8e30364304b3bc1171c7baa7727130)
+++ uspace/drv/usbhub/utils.c	(revision 4c74ac39e6e9e5218bfae7015043736e4d9a17b7)
@@ -48,6 +48,4 @@
 
 
-static void check_hub_changes(void);
-
 size_t USB_HUB_MAX_DESCRIPTOR_SIZE = 71;
 
@@ -365,9 +363,4 @@
 }
 
-/** Callback when new hub device is detected.
- *
- * @param dev New device.
- * @return Error code.
- */
 int usb_add_hub_device(device_t *dev) {
 	printf(NAME ": add_hub_device(handle=%d)\n", (int) dev->handle);
@@ -407,5 +400,5 @@
 	printf("[usb_hub] hub info added to list\n");
 	//(void)hub_info;
-	check_hub_changes();
+	usb_hub_check_hub_changes();
 
 	/// \TODO start the check loop, if not already started...
@@ -415,4 +408,7 @@
 
 	printf("[usb_hub] hub dev added\n");
+	printf("\taddress %d, has %d ports \n",
+			hub_info->usb_device->address,
+			hub_info->port_count);
 
 	return EOK;
@@ -461,5 +457,5 @@
  * @param target
  */
-static void usb_hub_finalize_add_device(
+static void usb_hub_finalize_add_device( usb_hub_info_t * hub,
 		int hc, uint16_t port, usb_target_t target) {
 
@@ -484,19 +480,14 @@
 
 	usb_drv_release_default_address(hc);
-	/*
-	 devman_handle_t dev_handle;
-	rc = child_device_register_wrapper(hub_dev, "dev",
-	 *	match_id, match_score, &dev_handle);
-	if (rc != EOK) {
-		free(id);
-	}
-	 *
-	 */
-
-
-	/// \TODO driver work
-	//add_child_device.....
-	//opResult = usb_drv_bind_address(hc, new_device_address,
-    //devman_handle_t handle);...
+
+	devman_handle_t child_handle;
+	opResult = usb_drv_register_child_in_devman(hc, hub->device,
+        new_device_address, &child_handle);
+	if (opResult != EOK) {
+		printf("[usb_hub] could not start driver for new device \n");
+		return;
+	}
+	usb_drv_bind_address(hc, new_device_address, child_handle);
+	
 }
 
@@ -534,5 +525,5 @@
  * @param target
  */
-static void usb_hub_process_interrupt(int hc, uint16_t port, usb_target_t target) {
+static void usb_hub_process_interrupt(usb_hub_info_t * hub, int hc, uint16_t port, usb_target_t target) {
 	printf("[usb_hub] interrupt at port %d\n", port);
 	//determine type of change
@@ -569,5 +560,5 @@
 		printf("[usb_hub] finalizing add device\n");
 		if (usb_port_enabled(&status)) {
-			usb_hub_finalize_add_device(hc, port, target);
+			usb_hub_finalize_add_device(hub, hc, port, target);
 		} else {
 			printf("[usb_hub] ERROR: port reset, but port still not enabled\n");
@@ -600,5 +591,5 @@
 /** Check changes on all known hubs.
  */
-static void check_hub_changes(void) {
+void usb_hub_check_hub_changes(void) {
 	/*
 	 * Iterate through all hubs.
@@ -652,5 +643,5 @@
 			bool interrupt = (((uint8_t*) change_bitmap)[port / 8] >> (port % 8)) % 2;
 			if (interrupt) {
-				usb_hub_process_interrupt(hc, port, target);
+				usb_hub_process_interrupt(hub_info, hc, port, target);
 			}
 		}
