Index: uspace/lib/usbvirt/device.h
===================================================================
--- uspace/lib/usbvirt/device.h	(revision 2193471bb508a644a6f841ae46f1bc725c2913b7)
+++ uspace/lib/usbvirt/device.h	(revision 7da32198a80306383f14638c1e03fe834986397a)
@@ -46,10 +46,49 @@
 	uint8_t *data);
 
+/** Device operations. */
 typedef struct {
+	/** Callback for standard USB request.
+	 * Called only when the request could not be handled by this
+	 * framework.
+	 */
 	usbvirt_on_device_request_t on_devreq_std;
+	/** Callback for class-specific USB request. */
 	usbvirt_on_device_request_t on_devreq_class;
+	/** Callback for all other incoming data. */
 	int (*on_data)(struct usbvirt_device *dev,
 	    usb_endpoint_t endpoint, void *buffer, size_t size);
 } usbvirt_device_ops_t;
+
+/** Extra configuration data for GET_CONFIGURATION request. */
+typedef struct {
+	/** Actual data. */
+	uint8_t *data;
+	/** Data length. */
+	size_t length;
+} usbvirt_device_configuration_extras_t;
+
+/** Single device configuration. */
+typedef struct {
+	/** Standard configuration descriptor. */
+	usb_standard_configuration_descriptor_t *descriptor;
+	/** Array of extra data. */
+	usbvirt_device_configuration_extras_t *extra;
+	/** Length of @c extra array. */
+	size_t extra_count;
+} usbvirt_device_configuration_t;
+
+/** Standard USB descriptors. */
+typedef struct {
+	/** Standard device descriptor.
+	 * There is always only one such descriptor for the device.
+	 */
+	usb_standard_device_descriptor_t *device;
+	
+	/** Configurations. */
+	usbvirt_device_configuration_t *configuration;
+	/** Number of configurations. */
+	size_t configuration_count;
+} usbvirt_descriptors_t;
+
 
 typedef struct usbvirt_device {
@@ -69,9 +108,6 @@
 	/* Device attributes. */
 	
-	/** Standard device descriptor.
-	 * If this descriptor is set (i.e. not NULL), the framework
-	 * automatically handles call for its retrieval.
-	 */
-	usb_standard_device_descriptor_t *standard_descriptor;
+	/** Standard descriptors. */
+	usbvirt_descriptors_t *descriptors;
 	
 	
Index: uspace/lib/usbvirt/stdreq.c
===================================================================
--- uspace/lib/usbvirt/stdreq.c	(revision 2193471bb508a644a6f841ae46f1bc725c2913b7)
+++ uspace/lib/usbvirt/stdreq.c	(revision 7da32198a80306383f14638c1e03fe834986397a)
@@ -34,7 +34,11 @@
  */
 #include <errno.h>
+#include <stdlib.h>
+#include <mem.h>
 #include <usb/devreq.h>
 
 #include "private.h"
+
+
 
 /*
@@ -52,11 +56,49 @@
 	 */
 	if ((type == USB_DESCTYPE_DEVICE) && (index == 0)) {
-		if (device->standard_descriptor) {
+		if (device->descriptors && device->descriptors->device) {
 			return device->send_data(device, 0,
-			    device->standard_descriptor,
-			    device->standard_descriptor->length);
+			    device->descriptors->device,
+			    device->descriptors->device->length);
 		} else {
 			return EFORWARD;
 		}
+	}
+	
+	/*
+	 * Configuration descriptor together with interface, endpoint and
+	 * class-specific descriptors.
+	 */
+	if (type == USB_DESCTYPE_CONFIGURATION) {
+		if (!device->descriptors) {
+			return EFORWARD;
+		}
+		if (index >= device->descriptors->configuration_count) {
+			return EFORWARD;
+		}
+		/* Copy the data. */
+		usbvirt_device_configuration_t *config = &device->descriptors
+		    ->configuration[index];
+		uint8_t *all_data = malloc(config->descriptor->total_length);
+		if (all_data == NULL) {
+			return ENOMEM;
+		}
+		
+		uint8_t *ptr = all_data;
+		memcpy(ptr, config->descriptor, config->descriptor->length);
+		ptr += config->descriptor->length;
+		size_t i;
+		for (i = 0; i < config->extra_count; i++) {
+			usbvirt_device_configuration_extras_t *extra
+			    = &config->extra[i];
+			memcpy(ptr, extra->data, extra->length);
+			ptr += extra->length;
+		}
+		
+		int rc = device->send_data(device, 0, all_data,
+		    config->descriptor->total_length);
+		
+		free(all_data);
+		
+		return rc;
 	}
 	
