Index: uspace/drv/usbhid/hiddev.c
===================================================================
--- uspace/drv/usbhid/hiddev.c	(revision 47234447bd680eafc14461f1409453f549e908ae)
+++ uspace/drv/usbhid/hiddev.c	(revision d70e0a3c4086971fa7bff2c800db92306f06ce65)
@@ -149,41 +149,14 @@
 	usb_log_info("Processing descriptors...\n");
 	
-	// get the first configuration descriptor
-	usb_standard_configuration_descriptor_t config_desc;
-	
 	int rc;
-	rc = usb_request_get_bare_configuration_descriptor(&hid_dev->ctrl_pipe,
-	    0, &config_desc);
-	
-	if (rc != EOK) {
-		usb_log_error("Failed to get bare config descriptor: %s.\n",
+
+	uint8_t *descriptors = NULL;
+	size_t descriptors_size;
+	rc = usb_request_get_full_configuration_descriptor_alloc(
+	    &hid_dev->ctrl_pipe, 0, (void **) &descriptors, &descriptors_size);
+	if (rc != EOK) {
+		usb_log_error("Failed to retrieve config descriptor: %s.\n",
 		    str_error(rc));
 		return rc;
-	}
-	
-	// prepare space for all underlying descriptors
-	uint8_t *descriptors = (uint8_t *)malloc(config_desc.total_length);
-	if (descriptors == NULL) {
-		usb_log_error("No memory!.\n");
-		return ENOMEM;
-	}
-	
-	size_t transferred = 0;
-	// get full configuration descriptor
-	rc = usb_request_get_full_configuration_descriptor(&hid_dev->ctrl_pipe,
-	    0, descriptors, config_desc.total_length, &transferred);
-	
-	if (rc != EOK) {
-		usb_log_error("Failed to get full config descriptor: %s.\n",
-		    str_error(rc));
-		free(descriptors);
-		return rc;
-	}
-	
-	if (transferred != config_desc.total_length) {
-		usb_log_error("Configuration descriptor has wrong size (%u, "
-		    "expected %u).\n", transferred, config_desc.total_length);
-		free(descriptors);
-		return ELIMIT;
 	}
 	
@@ -201,5 +174,5 @@
 	
 	rc = usb_endpoint_pipe_initialize_from_configuration(
-	    endpoint_mapping, 1, descriptors, config_desc.total_length,
+	    endpoint_mapping, 1, descriptors, descriptors_size,
 	    &hid_dev->wire);
 	
@@ -233,5 +206,6 @@
 	assert(endpoint_mapping[0].interface != NULL);
 	
-	rc = usbhid_dev_get_report_descriptor(hid_dev, descriptors, transferred,
+	rc = usbhid_dev_get_report_descriptor(hid_dev,
+	    descriptors, descriptors_size,
 	    (uint8_t *)endpoint_mapping[0].interface);
 	
Index: uspace/drv/usbhub/usbhub.c
===================================================================
--- uspace/drv/usbhub/usbhub.c	(revision 47234447bd680eafc14461f1409453f549e908ae)
+++ uspace/drv/usbhub/usbhub.c	(revision d70e0a3c4086971fa7bff2c800db92306f06ce65)
@@ -149,48 +149,29 @@
 	}
 
-	//configuration descriptor
-	/// \TODO check other configurations?
-	usb_standard_configuration_descriptor_t config_descriptor;
-	opResult = usb_request_get_bare_configuration_descriptor(
+	/* Retrieve full configuration descriptor. */
+	uint8_t *descriptors = NULL;
+	size_t descriptors_size = 0;
+	opResult = usb_request_get_full_configuration_descriptor_alloc(
 	    &hub->endpoints.control, 0,
-        &config_descriptor);
-	if(opResult!=EOK){
-		dprintf(USB_LOG_LEVEL_ERROR, "could not get configuration descriptor, %d",opResult);
+	    (void **) &descriptors, &descriptors_size);
+	if (opResult != EOK) {
+		usb_log_error("Could not get configuration descriptor: %s.\n",
+		    str_error(opResult));
 		return opResult;
 	}
-	//set configuration
+	usb_standard_configuration_descriptor_t *config_descriptor
+	    = (usb_standard_configuration_descriptor_t *) descriptors;
+
+	/* Set configuration. */
 	opResult = usb_request_set_configuration(&hub->endpoints.control,
-		config_descriptor.configuration_number);
-
-	if (opResult != EOK) {
-		dprintf(USB_LOG_LEVEL_ERROR,
-				"something went wrong when setting hub`s configuration, %d",
-				opResult);
+	    config_descriptor->configuration_number);
+
+	if (opResult != EOK) {
+		usb_log_error("Failed to set hub configuration: %s.\n",
+		    str_error(opResult));
 		return opResult;
 	}
 	dprintf(USB_LOG_LEVEL_DEBUG, "\tused configuration %d",
-			config_descriptor.configuration_number);
-
-	//full configuration descriptor
-	size_t transferred = 0;
-	uint8_t * descriptors = (uint8_t *)malloc(config_descriptor.total_length);
-	if (descriptors == NULL) {
-		dprintf(USB_LOG_LEVEL_ERROR, "insufficient memory");
-		return ENOMEM;
-	}
-	opResult = usb_request_get_full_configuration_descriptor(&hub->endpoints.control,
-	    0, descriptors,
-	    config_descriptor.total_length, &transferred);
-	if(opResult!=EOK){
-		free(descriptors);
-		dprintf(USB_LOG_LEVEL_ERROR,
-				"could not get full configuration descriptor, %d",opResult);
-		return opResult;
-	}
-	if (transferred != config_descriptor.total_length) {
-		dprintf(USB_LOG_LEVEL_ERROR,
-				"received incorrect full configuration descriptor");
-		return ELIMIT;
-	}
+			config_descriptor->configuration_number);
 
 	usb_endpoint_mapping_t endpoint_mapping[1] = {
@@ -204,5 +185,5 @@
 	opResult = usb_endpoint_pipe_initialize_from_configuration(
 	    endpoint_mapping, 1,
-	    descriptors, config_descriptor.total_length,
+	    descriptors, descriptors_size,
 	    &hub->device_connection);
 	if (opResult != EOK) {
Index: uspace/drv/usbmid/explore.c
===================================================================
--- uspace/drv/usbmid/explore.c	(revision 47234447bd680eafc14461f1409453f549e908ae)
+++ uspace/drv/usbmid/explore.c	(revision d70e0a3c4086971fa7bff2c800db92306f06ce65)
@@ -42,56 +42,4 @@
 #include "usbmid.h"
 
-/** Allocate and retrieve full configuration descriptor.
- *
- * @param[in] dev USB device.
- * @param[in] config_index Configuration index.
- * @param[out] size Pointer where to store size of the allocated buffer.
- * @return Allocated full configuration descriptor.
- * @retval NULL Error occured.
- */
-static void *get_configuration_descriptor(usbmid_device_t *dev,
-    size_t config_index, size_t *size)
-{
-	usb_standard_configuration_descriptor_t config_descriptor;
-	int rc = usb_request_get_bare_configuration_descriptor(&dev->ctrl_pipe,
-	    config_index, &config_descriptor);
-	if (rc != EOK) {
-		usb_log_error("Failed getting configuration descriptor: %s.\n",
-		    str_error(rc));
-		return NULL;
-	}
-
-	void *full_config_descriptor = malloc(config_descriptor.total_length);
-	if (full_config_descriptor == NULL) {
-		usb_log_fatal("Out of memory (wanted: %zuB).\n",
-		    (size_t) config_descriptor.total_length);
-		return NULL;
-	}
-
-	size_t full_config_descriptor_size;
-	rc = usb_request_get_full_configuration_descriptor(&dev->ctrl_pipe,
-	    config_index,
-	    full_config_descriptor, config_descriptor.total_length,
-	    &full_config_descriptor_size);
-	if (rc != EOK) {
-		usb_log_error("Failed getting configuration descriptor: %s.\n",
-		    str_error(rc));
-		free(full_config_descriptor);
-		return NULL;
-	}
-
-	if (full_config_descriptor_size != config_descriptor.total_length) {
-		usb_log_error("Failed getting full configuration descriptor.\n");
-		free(full_config_descriptor);
-		return NULL;
-	}
-
-	if (size != NULL) {
-		*size = full_config_descriptor_size;
-	}
-
-	return full_config_descriptor;
-}
-
 /** Find starting indexes of all interface descriptors in a configuration.
  *
@@ -178,7 +126,11 @@
 
 	size_t config_descriptor_size;
-	uint8_t *config_descriptor_raw = get_configuration_descriptor(dev, 0,
-	    &config_descriptor_size);
-	if (config_descriptor_raw == NULL) {
+	uint8_t *config_descriptor_raw = NULL;
+	rc = usb_request_get_full_configuration_descriptor_alloc(
+	    &dev->ctrl_pipe, 0,
+	    (void **) &config_descriptor_raw, &config_descriptor_size);
+	if (rc != EOK) {
+		usb_log_error("Failed getting full config descriptor: %s.\n",
+		    str_error(rc));
 		return false;
 	}
