Index: uspace/drv/bus/usb/usbhid/usbhid.c
===================================================================
--- uspace/drv/bus/usb/usbhid/usbhid.c	(revision c39e9fb50acec8a18fc943618d6162e4b8629395)
+++ uspace/drv/bus/usb/usbhid/usbhid.c	(revision 945d66cf8dee14cc5321c053cc3ed3c7d7f918bf)
@@ -114,11 +114,12 @@
     const usb_hid_subdriver_mapping_t *mapping)
 {
-	assert(hid_dev != NULL);
-	assert(hid_dev->usb_dev != NULL);
-
-	return (hid_dev->usb_dev->descriptors.device.vendor_id
-	    == mapping->vendor_id
-	    && hid_dev->usb_dev->descriptors.device.product_id
-	    == mapping->product_id);
+	assert(hid_dev);
+	assert(hid_dev->usb_dev);
+	assert(mapping);
+	const usb_standard_device_descriptor_t *d =
+	    usb_device_get_device_descriptor(hid_dev->usb_dev);
+
+	return (d->vendor_id == mapping->vendor_id)
+	    && (d->product_id == mapping->product_id);
 }
 
Index: uspace/drv/bus/usb/usbmid/explore.c
===================================================================
--- uspace/drv/bus/usb/usbmid/explore.c	(revision c39e9fb50acec8a18fc943618d6162e4b8629395)
+++ uspace/drv/bus/usb/usbmid/explore.c	(revision 945d66cf8dee14cc5321c053cc3ed3c7d7f918bf)
@@ -118,5 +118,5 @@
 		usbmid_interface_t *iface = NULL;
 		const int rc = usbmid_spawn_interface_child(usb_dev, &iface,
-		    &usb_dev->descriptors.device, interface);
+			usb_device_get_device_descriptor(usb_dev), interface);
 		if (rc != EOK) {
 			//TODO: Do something about that failure.
@@ -142,5 +142,6 @@
 int usbmid_explore_device(usb_device_t *dev)
 {
-	const unsigned dev_class = dev->descriptors.device.device_class;
+	const unsigned dev_class =
+	    usb_device_get_device_descriptor(dev)->device_class;
 	if (dev_class != USB_CLASS_USE_INTERFACE) {
 		usb_log_warning(
@@ -152,7 +153,9 @@
 	}
 
-	/* Shortcuts to save on typing ;-). */
-	const void *config_descriptor_raw = dev->descriptors.configuration;
-	size_t config_descriptor_size = dev->descriptors.configuration_size;
+	/* Get coonfiguration descriptor. */
+	size_t config_descriptor_size = 0;
+	const void *config_descriptor_raw =
+	    usb_device_get_configuration_descriptor(dev,
+	    &config_descriptor_size);
 	const usb_standard_configuration_descriptor_t *config_descriptor =
 	    config_descriptor_raw;
Index: uspace/lib/usbdev/include/usb/dev/driver.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/driver.h	(revision c39e9fb50acec8a18fc943618d6162e4b8629395)
+++ uspace/lib/usbdev/include/usb/dev/driver.h	(revision 945d66cf8dee14cc5321c053cc3ed3c7d7f918bf)
@@ -42,12 +42,4 @@
 #include <usb_iface.h>
 
-/** Descriptors for USB device. */
-typedef struct {
-	/** Standard device descriptor. */
-	usb_standard_device_descriptor_t device;
-	/** Full configuration descriptor of current configuration. */
-	const uint8_t *configuration;
-	size_t configuration_size;
-} usb_device_descriptors_t;
 
 /** Wrapper for data related to alternate interface setting.
@@ -84,4 +76,5 @@
 	/** The default control pipe. */
 	usb_pipe_t ctrl_pipe;
+
 	/** Other endpoint pipes.
 	 * This is an array of other endpoint pipes in the same order as
@@ -100,6 +93,12 @@
 	usb_alternate_interfaces_t alternate_interfaces;
 
-	/** Some useful descriptors. */
-	usb_device_descriptors_t descriptors;
+	/** Some useful descriptors for USB device. */
+	struct {
+		/** Standard device descriptor. */
+		usb_standard_device_descriptor_t device;
+		/** Full configuration descriptor of current configuration. */
+		const uint8_t *configuration;
+		size_t configuration_size;
+	} descriptors;
 
 	/** Generic DDF device backing this one. DO NOT TOUCH! */
@@ -179,7 +178,4 @@
     const usb_endpoint_description_t **);
 
-int usb_device_retrieve_descriptors(usb_pipe_t *, usb_device_descriptors_t *);
-void usb_device_release_descriptors(usb_device_descriptors_t *);
-
 int usb_device_create_pipes(usb_device_connection_t *,
     const usb_endpoint_description_t **, const uint8_t *, size_t, int, int,
@@ -188,4 +184,9 @@
 usb_pipe_t *usb_device_get_default_pipe(usb_device_t *);
 usb_pipe_t *usb_device_get_pipe(usb_device_t *, usb_endpoint_t, usb_direction_t);
+
+const usb_standard_device_descriptor_t *
+usb_device_get_device_descriptor(usb_device_t *);
+const void * usb_device_get_configuration_descriptor(usb_device_t *, size_t *);
+
 
 void * usb_device_data_alloc(usb_device_t *, size_t);
Index: uspace/lib/usbdev/src/devdrv.c
===================================================================
--- uspace/lib/usbdev/src/devdrv.c	(revision c39e9fb50acec8a18fc943618d6162e4b8629395)
+++ uspace/lib/usbdev/src/devdrv.c	(revision 945d66cf8dee14cc5321c053cc3ed3c7d7f918bf)
@@ -233,18 +233,15 @@
  * @return Error code.
  */
-int usb_device_retrieve_descriptors(usb_pipe_t *ctrl_pipe,
-    usb_device_descriptors_t *descriptors)
-{
-	assert(descriptors != NULL);
-
-	descriptors->configuration = NULL;
-
-	int rc;
+static int usb_device_retrieve_descriptors(usb_device_t *usb_dev)
+{
+	assert(usb_dev);
+	assert(usb_dev->descriptors.configuration == NULL);
 
 	/* It is worth to start a long transfer. */
-	usb_pipe_start_long_transfer(ctrl_pipe);
+	usb_pipe_start_long_transfer(&usb_dev->ctrl_pipe);
 
 	/* Get the device descriptor. */
-	rc = usb_request_get_device_descriptor(ctrl_pipe, &descriptors->device);
+	int rc = usb_request_get_device_descriptor(&usb_dev->ctrl_pipe,
+	    &usb_dev->descriptors.device);
 	if (rc != EOK) {
 		goto leave;
@@ -253,9 +250,10 @@
 	/* Get the full configuration descriptor. */
 	rc = usb_request_get_full_configuration_descriptor_alloc(
-	    ctrl_pipe, 0, (void **) &descriptors->configuration,
-	    &descriptors->configuration_size);
+	    &usb_dev->ctrl_pipe, 0,
+	    (void **) &usb_dev->descriptors.configuration,
+	    &usb_dev->descriptors.configuration_size);
 
 leave:
-	usb_pipe_end_long_transfer(ctrl_pipe);
+	usb_pipe_end_long_transfer(&usb_dev->ctrl_pipe);
 
 	return rc;
@@ -266,9 +264,10 @@
  * @param[in] descriptors Where to store the descriptors.
  */
-void usb_device_release_descriptors(usb_device_descriptors_t *descriptors)
-{
-	assert(descriptors);
-	free(descriptors->configuration);
-	descriptors->configuration = NULL;
+static void usb_device_release_descriptors(usb_device_t *usb_dev)
+{
+	assert(usb_dev);
+	free(usb_dev->descriptors.configuration);
+	usb_dev->descriptors.configuration = NULL;
+	usb_dev->descriptors.configuration_size = 0;
 }
 
@@ -394,4 +393,20 @@
 }
 
+const usb_standard_device_descriptor_t *
+usb_device_get_device_descriptor(usb_device_t *usb_dev)
+{
+	assert(usb_dev);
+	return &usb_dev->descriptors.device;
+}
+
+const void * usb_device_get_configuration_descriptor(
+    usb_device_t *usb_dev, size_t *size)
+{
+	assert(usb_dev);
+	if (size)
+		*size = usb_dev->descriptors.configuration_size;
+	return usb_dev->descriptors.configuration;
+}
+
 /** Initialize new instance of USB device.
  *
@@ -462,6 +477,5 @@
 
 	/* Retrieve standard descriptors. */
-	rc = usb_device_retrieve_descriptors(
-	    &usb_dev->ctrl_pipe, &usb_dev->descriptors);
+	rc = usb_device_retrieve_descriptors(usb_dev);
 	if (rc != EOK) {
 		*errstr_ptr = "descriptor retrieval";
@@ -489,5 +503,5 @@
 		usb_hc_connection_close(&usb_dev->hc_conn);
 		/* Full configuration descriptor is allocated. */
-		usb_device_release_descriptors(&usb_dev->descriptors);
+		usb_device_release_descriptors(usb_dev);
 		/* Alternate interfaces may be allocated */
 		usb_alternate_interfaces_deinit(&usb_dev->alternate_interfaces);
@@ -515,5 +529,5 @@
 		usb_hc_connection_deinitialize(&dev->hc_conn);
 		usb_alternate_interfaces_deinit(&dev->alternate_interfaces);
-		usb_device_release_descriptors(&dev->descriptors);
+		usb_device_release_descriptors(dev);
 		free(dev->driver_data);
 		dev->driver_data = NULL;
