Index: uspace/drv/usbhub/usbhub.h
===================================================================
--- uspace/drv/usbhub/usbhub.h	(revision c01255c302725d9e6c4d4a0ce55eceac0b4077d0)
+++ uspace/drv/usbhub/usbhub.h	(revision 100962316f11f4d28cc4be7eaf39ac3705dc69ca)
@@ -50,5 +50,4 @@
 } usb_hub_info_t;
 
-
 int usb_add_hub_device(device_t *);
 
Index: uspace/drv/usbhub/usbhub_private.h
===================================================================
--- uspace/drv/usbhub/usbhub_private.h	(revision c01255c302725d9e6c4d4a0ce55eceac0b4077d0)
+++ uspace/drv/usbhub/usbhub_private.h	(revision 100962316f11f4d28cc4be7eaf39ac3705dc69ca)
@@ -42,4 +42,5 @@
 #include <driver.h>
 #include <usb/usb.h>
+#include <usb/classes/hub.h>
 #include <usb/devreq.h>
 
@@ -152,4 +153,5 @@
  * @param request
  * @param addr
+ * \TODO this will be obsolete see usb/dev_req.h
  */
 static inline void usb_hub_set_set_address_request(
@@ -169,5 +171,5 @@
  * @param addr
  */
-static inline void usb_hub_get_descriptor_request(
+static inline void usb_hub_set_descriptor_request(
 usb_device_request_setup_packet_t * request
 ){
@@ -175,5 +177,6 @@
 	request->request_type = USB_HUB_REQ_TYPE_GET_DESCRIPTOR;
 	request->request = USB_HUB_REQUEST_GET_DESCRIPTOR;
-	request->value = USB_DESCTYPE_HUB;
+	request->value_high = USB_DESCTYPE_HUB;
+	request->value_low = 0;
 	request->length = USB_HUB_MAX_DESCRIPTOR_SIZE;
 }
Index: uspace/drv/usbhub/utils.c
===================================================================
--- uspace/drv/usbhub/utils.c	(revision c01255c302725d9e6c4d4a0ce55eceac0b4077d0)
+++ uspace/drv/usbhub/utils.c	(revision 100962316f11f4d28cc4be7eaf39ac3705dc69ca)
@@ -89,7 +89,13 @@
 usb_hub_descriptor_t * usb_deserialize_hub_desriptor(void * serialized_descriptor) {
 	uint8_t * sdescriptor = (uint8_t*) serialized_descriptor;
-	if (sdescriptor[1] != USB_DESCTYPE_HUB) return NULL;
+
+	if (sdescriptor[1] != USB_DESCTYPE_HUB) {
+		printf("[usb_hub] wrong descriptor %x\n",sdescriptor[1]);
+		return NULL;
+	}
+
 	usb_hub_descriptor_t * result = usb_new(usb_hub_descriptor_t);
-	//uint8_t size = sdescriptor[0];
+	
+
 	result->ports_count = sdescriptor[2];
 	/// @fixme handling of endianness??
@@ -99,5 +105,5 @@
 	size_t var_size = result->ports_count / 8 + ((result->ports_count % 8 > 0) ? 1 : 0);
 	result->devices_removable = (uint8_t*) malloc(var_size);
-
+	//printf("[usb_hub] getting removable devices data \n");
 	size_t i;
 	for (i = 0; i < var_size; ++i) {
@@ -298,10 +304,9 @@
 
 
-	printf("[usb_hub] phone to hc = %d\n", hc);
+	//printf("[usb_hub] phone to hc = %d\n", hc);
 	if (hc < 0) {
 		return result;
 	}
 	//get some hub info
-	/// \TODO get correct params
 	usb_address_t addr = usb_drv_get_my_address(hc, device);
 	addr = 7;
@@ -320,19 +325,33 @@
 	target.endpoint = 0;
 	usb_device_request_setup_packet_t request;
-	usb_hub_get_descriptor_request(&request);
+	//printf("[usb_hub] creating descriptor request\n");
+	usb_hub_set_descriptor_request(&request);
+
+	//printf("[usb_hub] creating serialized descriptor\n");
 	void * serialized_descriptor = malloc(USB_HUB_MAX_DESCRIPTOR_SIZE);
 	usb_hub_descriptor_t * descriptor;
 	size_t received_size;
 	int opResult;
-
+	//printf("[usb_hub] starting control transaction\n");
 	opResult = usb_drv_sync_control_read(
 			hc, target, &request, serialized_descriptor,
 			USB_HUB_MAX_DESCRIPTOR_SIZE, &received_size);
 	if (opResult != EOK) {
-		printf("[usb_hub] failed when receiving hub descriptor \n");
-	}
+		printf("[usb_hub] failed when receiving hub descriptor, badcode = %d\n",opResult);
+		///\TODO memory leak will occur here!
+		return result;
+	}
+	//printf("[usb_hub] deserializing descriptor\n");
 	descriptor = usb_deserialize_hub_desriptor(serialized_descriptor);
+	if(descriptor==NULL){
+		printf("[usb_hub] could not deserialize descriptor \n");
+		result->port_count = 1;///\TODO this code is only for debug!!!
+		return result;
+	}
+	//printf("[usb_hub] setting port count to %d\n",descriptor->ports_count);
 	result->port_count = descriptor->ports_count;
+	//printf("[usb_hub] freeing data\n");
 	free(serialized_descriptor);
+	free(descriptor->devices_removable);
 	free(descriptor);
 
@@ -362,5 +381,5 @@
 	//get hc connection
 	/// \TODO correct params
-	int hc = usb_drv_hc_connect(NULL, 0);
+	int hc = usb_drv_hc_connect(dev, 0);
 
 	usb_hub_info_t * hub_info = usb_create_hub_info(dev, hc);
@@ -416,7 +435,9 @@
 	int opResult;
 	printf("[usb_hub] some connection changed\n");
+
 	opResult = usb_drv_reserve_default_address(hc);
 	if (opResult != EOK) {
 		printf("[usb_hub] cannot assign default address, it is probably used\n");
+		return;
 	}
 	//reset port
@@ -456,4 +477,6 @@
 	if (opResult != EOK) {
 		printf("[usb_hub] could not set address for new device\n");
+		//will retry later...
+		return;
 	}
 	usb_drv_release_default_address(hc);
@@ -461,4 +484,5 @@
 
 	/// \TODO driver work
+	//add_child_device.....
 }
 
Index: uspace/drv/vhc/hubops.c
===================================================================
--- uspace/drv/vhc/hubops.c	(revision c01255c302725d9e6c4d4a0ce55eceac0b4077d0)
+++ uspace/drv/vhc/hubops.c	(revision 100962316f11f4d28cc4be7eaf39ac3705dc69ca)
@@ -195,7 +195,16 @@
 }
 
-static int get_hub_descriptor(uint8_t descriptor_type,
-    uint8_t descriptor_index, uint16_t length)
-{
+static int get_hub_descriptor(struct usbvirt_device *dev,
+    uint8_t descriptor_index,
+    uint8_t descriptor_type, uint16_t length)
+{
+	if (descriptor_type == USB_DESCTYPE_HUB) {
+		int rc = dev->control_transfer_reply(dev, 0,
+		    &hub_descriptor, hub_descriptor.length);
+
+		return rc;
+
+	}
+
 	return ENOTSUP;
 }
@@ -313,5 +322,5 @@
 			
 		case USB_HUB_REQUEST_GET_DESCRIPTOR:
-			return get_hub_descriptor(request->value_low,
+			return get_hub_descriptor(dev, request->value_low,
 			    request->value_high, request->length);
 			
Index: uspace/lib/usb/include/usb/classes/hub.h
===================================================================
--- uspace/lib/usb/include/usb/classes/hub.h	(revision c01255c302725d9e6c4d4a0ce55eceac0b4077d0)
+++ uspace/lib/usb/include/usb/classes/hub.h	(revision 100962316f11f4d28cc4be7eaf39ac3705dc69ca)
@@ -177,4 +177,5 @@
 
 /** @brief hub class request codes*/
+/// \TODO these are duplicit to standart descriptors
 typedef enum {
     /**  */
Index: uspace/lib/usbvirt/transaction.c
===================================================================
--- uspace/lib/usbvirt/transaction.c	(revision c01255c302725d9e6c4d4a0ce55eceac0b4077d0)
+++ uspace/lib/usbvirt/transaction.c	(revision 100962316f11f4d28cc4be7eaf39ac3705dc69ca)
@@ -184,4 +184,6 @@
 				actual_size = size;
 			}
+			device->lib_debug(device, 1, USBVIRT_DEBUGTAG_TRANSACTION,
+			    "in transaction: will copy %zu bytes", actual_size);
 			if (actual_size > 0) {
 				memcpy(buffer, transfer->data, actual_size);
