Index: uspace/app/virtusbkbd/kbdconfig.c
===================================================================
--- uspace/app/virtusbkbd/kbdconfig.c	(revision 2193471bb508a644a6f841ae46f1bc725c2913b7)
+++ uspace/app/virtusbkbd/kbdconfig.c	(revision 2c38125098827bdd626f5ecd8606e6b1b133dd24)
@@ -35,13 +35,15 @@
  */
 #include "kbdconfig.h"
+#include <usb/hcd.h>
+#include <usb/hid.h>
 #include <usb/hidut.h>
 #include <usb/classes.h>
 
 /** Standard device descriptor. */
-usb_standard_device_descriptor_t std_descriptor = {
+usb_standard_device_descriptor_t std_device_descriptor = {
 	.length = sizeof(usb_standard_device_descriptor_t),
-	.descriptor_type = 1,
+	.descriptor_type = USB_DESCTYPE_DEVICE,
 	.usb_spec_version = 0x110,
-	.device_class = USB_CLASS_HID,
+	.device_class = USB_CLASS_USE_INTERFACE,
 	.device_subclass = 0,
 	.device_protocol = 0,
@@ -49,5 +51,17 @@
 	.configuration_count = 1
 };
-size_t std_descriptor_size = sizeof(std_descriptor);
+
+/** Standard interface descriptor. */
+usb_standard_interface_descriptor_t std_interface_descriptor = {
+	.length = sizeof(usb_standard_interface_descriptor_t),
+	.descriptor_type = USB_DESCTYPE_INTERFACE,
+	.interface_number = 0,
+	.alternate_setting = 0,
+	.endpoint_count = 1,
+	.interface_class = USB_CLASS_HID,
+	.interface_subclass = 0,
+	.interface_protocol = USB_HID_PROTOCOL_KEYBOARD,
+	.str_interface = 0
+};
 
 /** USB keyboard report descriptor.
@@ -105,5 +119,33 @@
 	.descriptor1_length = sizeof(report_descriptor)
 };
-size_t hid_descriptor_size = sizeof(hid_descriptor);
+
+/** Endpoint descriptor. */
+usb_standard_endpoint_descriptor_t endpoint_descriptor = {
+	.length = sizeof(usb_standard_endpoint_descriptor_t),
+	.descriptor_type = USB_DESCTYPE_ENDPOINT,
+	.endpoint_address = 1 | 128,
+	.attributes = USB_TRANSFER_INTERRUPT,
+	.max_packet_size = 8,
+	.poll_interval = 10
+};
+
+/** Standard configuration descriptor. */
+usb_standard_configuration_descriptor_t std_configuration_descriptor = {
+	.length = sizeof(usb_standard_configuration_descriptor_t),
+	.descriptor_type = USB_DESCTYPE_CONFIGURATION,
+	.total_length = 
+		sizeof(usb_standard_configuration_descriptor_t)
+		+ sizeof(std_interface_descriptor)
+		+ sizeof(hid_descriptor)
+		+ sizeof(endpoint_descriptor)
+		,
+	.interface_count = 1,
+	.configuration_number = 1,
+	.str_configuration = 0,
+	.attributes = 128, /* denotes bus-powered device */
+	.max_power = 50
+};
+
+
 
 
Index: uspace/app/virtusbkbd/kbdconfig.h
===================================================================
--- uspace/app/virtusbkbd/kbdconfig.h	(revision 2193471bb508a644a6f841ae46f1bc725c2913b7)
+++ uspace/app/virtusbkbd/kbdconfig.h	(revision 2c38125098827bdd626f5ecd8606e6b1b133dd24)
@@ -40,8 +40,15 @@
 #include "descriptor.h"
 
-extern usb_standard_device_descriptor_t std_descriptor;
-extern size_t std_descriptor_size;
+extern usb_standard_device_descriptor_t std_device_descriptor;
+
+extern usb_standard_configuration_descriptor_t std_configuration_descriptor;
+
+extern usb_standard_interface_descriptor_t std_interface_descriptor;
+
+extern usb_standard_endpoint_descriptor_t endpoint_descriptor;
+
+
 extern hid_descriptor_t hid_descriptor;
-extern size_t hid_descriptor_size;
+
 extern report_descriptor_data_t report_descriptor;
 extern size_t report_descriptor_size;
Index: uspace/app/virtusbkbd/virtusbkbd.c
===================================================================
--- uspace/app/virtusbkbd/virtusbkbd.c	(revision 2193471bb508a644a6f841ae46f1bc725c2913b7)
+++ uspace/app/virtusbkbd/virtusbkbd.c	(revision 2c38125098827bdd626f5ecd8606e6b1b133dd24)
@@ -89,4 +89,33 @@
 };
 
+usbvirt_device_configuration_extras_t extra_descriptors[] = {
+	{
+		.data = (uint8_t *) &std_interface_descriptor,
+		.length = sizeof(std_interface_descriptor)
+	},
+	{
+		.data = (uint8_t *) &hid_descriptor,
+		.length = sizeof(hid_descriptor)
+	},
+	{
+		.data = (uint8_t *) &endpoint_descriptor,
+		.length = sizeof(endpoint_descriptor)
+	}
+};
+
+/** Keyboard configuration. */
+usbvirt_device_configuration_t configuration = {
+	.descriptor = &std_configuration_descriptor,
+	.extra = extra_descriptors,
+	.extra_count = sizeof(extra_descriptors)/sizeof(extra_descriptors[0])
+};
+
+/** Keyboard standard descriptors. */
+usbvirt_descriptors_t descriptors = {
+	.device = &std_device_descriptor,
+	.configuration = &configuration,
+	.configuration_count = 1,
+};
+
 /** Keyboard device.
  * Rest of the items will be initialized later.
@@ -94,5 +123,5 @@
 static usbvirt_device_t keyboard_dev = {
 	.ops = &keyboard_ops,
-	.standard_descriptor = &std_descriptor,
+	.descriptors = &descriptors,
 	.device_id_ = USBVIRT_DEV_KEYBOARD_ID
 };
