Index: uspace/drv/ohci/root_hub.c
===================================================================
--- uspace/drv/ohci/root_hub.c	(revision 1b9c0e2c917259e643c58faaf9a7be28901dae7f)
+++ uspace/drv/ohci/root_hub.c	(revision 8e7d724e2db8b57d2c79ffdc0e5467e61abcae0b)
@@ -40,4 +40,5 @@
 #include "root_hub.h"
 #include "usb/classes/classes.h"
+#include "usb/devdrv.h"
 #include <usb/request.h>
 #include <usb/classes/hub.h>
@@ -61,5 +62,5 @@
 		/// \TODO these values migt be different
 		.str_serial_number = 0,
-		.usb_spec_version = 0,
+		.usb_spec_version = 0x110,
 };
 
@@ -110,67 +111,7 @@
 };
 
-/** Root hub initialization
- * @return Error code.
- */
-int rh_init(rh_t *instance, ddf_dev_t *dev, ohci_regs_t *regs)
-{
-	assert(instance);
-	instance->address = -1;
-	instance->registers = regs;
-	instance->device = dev;
-
-
-	usb_log_info("OHCI root hub with %d ports.\n", regs->rh_desc_a & 0xff);
-
-	//start generic usb hub driver
-	
-	/* TODO: implement */
-	return EOK;
-}
-/*----------------------------------------------------------------------------*/
-
-/**
- * create answer to port status_request
- *
- * Copy content of corresponding port status register to answer buffer.
- *
- * @param instance root hub instance
- * @param port port number, counted from 1
- * @param request structure containing both request and response information
- * @return error code
- */
-static int process_get_port_status_request(rh_t *instance, uint16_t port,
-		usb_transfer_batch_t * request){
-	if(port<1 || port>instance->port_count)
-		return EINVAL;
-	uint32_t * uint32_buffer = (uint32_t*)request->buffer;
-	request->transfered_size = 4;
-	uint32_buffer[0] = instance->registers->rh_port_status[port -1];
-	return EOK;
-}
-
-/**
- * create answer to port status_request
- *
- * Copy content of hub status register to answer buffer.
- *
- * @param instance root hub instance
- * @param request structure containing both request and response information
- * @return error code
- */
-static int process_get_hub_status_request(rh_t *instance,
-		usb_transfer_batch_t * request){
-	uint32_t * uint32_buffer = (uint32_t*)request->buffer;
-	//bits, 0,1,16,17
-	request->transfered_size = 4;
-	uint32_t mask = 1 & (1<<1) & (1<<16) & (1<<17);
-	uint32_buffer[0] = mask & instance->registers->rh_status;
-	return EOK;
-
-}
-
 /**
  * Create hub descriptor used in hub-driver <-> hub communication
- * 
+ *
  * This means creating byt array from data in root hub registers. For more
  * info see usb hub specification.
@@ -197,5 +138,5 @@
 	result[2] = instance->port_count;
 	uint32_t hub_desc_reg = instance->registers->rh_desc_a;
-	result[3] = 
+	result[3] =
 			((hub_desc_reg >> 8) %2) +
 			(((hub_desc_reg >> 9) %2) << 1) +
@@ -219,4 +160,108 @@
 	(*out_size) = size;
 }
+
+
+/** initialize hub descriptors
+ *
+ * Initialized are device and full configuration descriptor. These need to
+ * be initialized only once per hub.
+ * @instance root hub instance
+ */
+static void rh_init_descriptors(rh_t *instance){
+	memcpy(&instance->descriptors.device, &ohci_rh_device_descriptor,
+		sizeof(ohci_rh_device_descriptor)
+	);
+	usb_standard_configuration_descriptor_t descriptor;
+	memcpy(&descriptor,&ohci_rh_conf_descriptor,
+			sizeof(ohci_rh_conf_descriptor));
+	uint8_t * hub_descriptor;
+	size_t hub_desc_size;
+	usb_create_serialized_hub_descriptor(instance, &hub_descriptor,
+			&hub_desc_size);
+
+	descriptor.total_length =
+			sizeof(usb_standard_configuration_descriptor_t)+
+			sizeof(usb_standard_endpoint_descriptor_t)+
+			sizeof(usb_standard_interface_descriptor_t)+
+			hub_desc_size;
+	
+	uint8_t * full_config_descriptor =
+			(uint8_t*) malloc(descriptor.total_length);
+	memcpy(full_config_descriptor, &descriptor, sizeof(descriptor));
+	memcpy(full_config_descriptor + sizeof(descriptor),
+			&ohci_rh_iface_descriptor, sizeof(ohci_rh_iface_descriptor));
+	memcpy(full_config_descriptor + sizeof(descriptor) +
+				sizeof(ohci_rh_iface_descriptor),
+			&ohci_rh_ep_descriptor, sizeof(ohci_rh_ep_descriptor));
+	memcpy(full_config_descriptor + sizeof(descriptor) +
+				sizeof(ohci_rh_iface_descriptor) +
+				sizeof(ohci_rh_ep_descriptor),
+			hub_descriptor, hub_desc_size);
+	
+	instance->descriptors.configuration = full_config_descriptor;
+	instance->descriptors.configuration_size = descriptor.total_length;
+}
+
+/** Root hub initialization
+ * @return Error code.
+ */
+int rh_init(rh_t *instance, ddf_dev_t *dev, ohci_regs_t *regs)
+{
+	assert(instance);
+	instance->address = -1;
+	instance->registers = regs;
+	instance->device = dev;
+	rh_init_descriptors(instance);
+
+
+	usb_log_info("OHCI root hub with %d ports.\n", regs->rh_desc_a & 0xff);
+
+	//start generic usb hub driver
+	
+	/* TODO: implement */
+	return EOK;
+}
+/*----------------------------------------------------------------------------*/
+
+/**
+ * create answer to port status_request
+ *
+ * Copy content of corresponding port status register to answer buffer.
+ *
+ * @param instance root hub instance
+ * @param port port number, counted from 1
+ * @param request structure containing both request and response information
+ * @return error code
+ */
+static int process_get_port_status_request(rh_t *instance, uint16_t port,
+		usb_transfer_batch_t * request){
+	if(port<1 || port>instance->port_count)
+		return EINVAL;
+	uint32_t * uint32_buffer = (uint32_t*)request->buffer;
+	request->transfered_size = 4;
+	uint32_buffer[0] = instance->registers->rh_port_status[port -1];
+	return EOK;
+}
+
+/**
+ * create answer to port status_request
+ *
+ * Copy content of hub status register to answer buffer.
+ *
+ * @param instance root hub instance
+ * @param request structure containing both request and response information
+ * @return error code
+ */
+static int process_get_hub_status_request(rh_t *instance,
+		usb_transfer_batch_t * request){
+	uint32_t * uint32_buffer = (uint32_t*)request->buffer;
+	//bits, 0,1,16,17
+	request->transfered_size = 4;
+	uint32_t mask = 1 & (1<<1) & (1<<16) & (1<<17);
+	uint32_buffer[0] = mask & instance->registers->rh_status;
+	return EOK;
+
+}
+
 
 
@@ -284,28 +329,5 @@
 	}
 }
-
-/**
- * create standart configuration descriptor for the root hub instance
- * @param instance root hub instance
- * @return newly allocated descriptor
- */
-static usb_standard_configuration_descriptor_t *
-usb_ohci_rh_create_standart_configuration_descriptor(rh_t *instance){
-	usb_standard_configuration_descriptor_t * descriptor =
-			malloc(sizeof(usb_standard_configuration_descriptor_t));
-	memcpy(descriptor, &ohci_rh_conf_descriptor,
-		sizeof(usb_standard_configuration_descriptor_t));
-	/// \TODO should this include device descriptor?
-	const size_t hub_descriptor_size = 7 +
-			2* (instance->port_count / 8 +
-			((instance->port_count % 8 > 0) ? 1 : 0));
-	descriptor->total_length =
-			sizeof(usb_standard_configuration_descriptor_t)+
-			sizeof(usb_standard_endpoint_descriptor_t)+
-			sizeof(usb_standard_interface_descriptor_t)+
-			hub_descriptor_size;
-	return descriptor;
-}
-
+ 
 /**
  * create answer to a descriptor request
@@ -344,10 +366,6 @@
 		case USB_DESCTYPE_CONFIGURATION: {
 			usb_log_debug("USB_DESCTYPE_CONFIGURATION\n");
-			usb_standard_configuration_descriptor_t * descriptor =
-					usb_ohci_rh_create_standart_configuration_descriptor(
-						instance);
-			result_descriptor = descriptor;
-			size = sizeof(usb_standard_configuration_descriptor_t);
-			del = true;
+			result_descriptor = instance->descriptors.configuration;
+			size = instance->descriptors.configuration_size;
 			break;
 		}
@@ -380,5 +398,7 @@
 	}
 	request->transfered_size = size;
-	memcpy(request->buffer,result_descriptor,size);
+	memcpy(request->transport_buffer,result_descriptor,size);
+	usb_log_debug("sent desctiptor: %s\n",
+			usb_debug_str_buffer((uint8_t*)request->transport_buffer,size,size));
 	if (del)
 		free(result_descriptor);
Index: uspace/drv/ohci/root_hub.h
===================================================================
--- uspace/drv/ohci/root_hub.h	(revision 1b9c0e2c917259e643c58faaf9a7be28901dae7f)
+++ uspace/drv/ohci/root_hub.h	(revision 8e7d724e2db8b57d2c79ffdc0e5467e61abcae0b)
@@ -37,4 +37,5 @@
 
 #include <usb/usb.h>
+#include <usb/devdrv.h>
 
 #include "ohci_regs.h"
@@ -53,4 +54,6 @@
 	/** hub port count */
 	int port_count;
+	/** hubs descriptors */
+	usb_device_descriptors_t descriptors;
 } rh_t;
 
Index: uspace/drv/usbhub/usbhub.c
===================================================================
--- uspace/drv/usbhub/usbhub.c	(revision 1b9c0e2c917259e643c58faaf9a7be28901dae7f)
+++ uspace/drv/usbhub/usbhub.c	(revision 8e7d724e2db8b57d2c79ffdc0e5467e61abcae0b)
@@ -74,6 +74,6 @@
 
 	while(errorCode == EOK){
+		async_usleep(1000 * 1000 * 10 );/// \TODO proper number once
 		errorCode = usb_hub_check_hub_changes(hub_info);
-		async_usleep(1000 * 1000 );/// \TODO proper number once
 	}
 	usb_log_error("something in ctrl loop went wrong, errno %d\n",errorCode);
Index: uspace/lib/usb/src/devdrv.c
===================================================================
--- uspace/lib/usb/src/devdrv.c	(revision 1b9c0e2c917259e643c58faaf9a7be28901dae7f)
+++ uspace/lib/usb/src/devdrv.c	(revision 8e7d724e2db8b57d2c79ffdc0e5467e61abcae0b)
@@ -251,5 +251,5 @@
 	    &dev->descriptors.configuration_size);
 	if (rc != EOK) {
-		usb_log_error("Failed retrieving configuration descriptor: %s.\n",
+		usb_log_error("Failed retrieving configuration descriptor: %s. %s\n",
 		    dev->ddf_dev->name, str_error(rc));
 		return rc;
Index: uspace/lib/usb/src/request.c
===================================================================
--- uspace/lib/usb/src/request.c	(revision 1b9c0e2c917259e643c58faaf9a7be28901dae7f)
+++ uspace/lib/usb/src/request.c	(revision 8e7d724e2db8b57d2c79ffdc0e5467e61abcae0b)
@@ -529,5 +529,4 @@
 		return rc;
 	}
-
 	if (bare_config.descriptor_type != USB_DESCTYPE_CONFIGURATION) {
 		return ENOENT;
