Index: uspace/app/virtusbkbd/stdreq.c
===================================================================
--- uspace/app/virtusbkbd/stdreq.c	(revision 0eddb76bcbabe8f448e8a6f610dcc98ec480bed4)
+++ uspace/app/virtusbkbd/stdreq.c	(revision 56b962db22105d9fdefea4a4878cca2e421da45a)
@@ -39,23 +39,5 @@
 #include "kbdconfig.h"
 
-static int on_get_descriptor(struct usbvirt_device *dev,
-    usb_device_request_setup_packet_t *request, uint8_t *data);
-
-usbvirt_standard_device_request_ops_t standard_request_ops = {
-	.on_get_status = NULL,
-	.on_clear_feature = NULL,
-	.on_set_feature = NULL,
-	.on_set_address = NULL,
-	.on_get_descriptor = on_get_descriptor,
-	.on_set_descriptor = NULL,
-	.on_get_configuration = NULL,
-	.on_set_configuration = NULL,
-	.on_get_interface = NULL,
-	.on_set_interface = NULL,
-	.on_synch_frame = NULL
-};
-
-
-static int on_get_descriptor(struct usbvirt_device *dev,
+int stdreq_on_get_descriptor(struct usbvirt_device *dev,
     usb_device_request_setup_packet_t *request, uint8_t *data)
 {
Index: uspace/app/virtusbkbd/stdreq.h
===================================================================
--- uspace/app/virtusbkbd/stdreq.h	(revision 0eddb76bcbabe8f448e8a6f610dcc98ec480bed4)
+++ uspace/app/virtusbkbd/stdreq.h	(revision 56b962db22105d9fdefea4a4878cca2e421da45a)
@@ -38,5 +38,6 @@
 #include <usbvirt/device.h>
 
-extern usbvirt_standard_device_request_ops_t standard_request_ops;
+int stdreq_on_get_descriptor(usbvirt_device_t *,
+    usb_device_request_setup_packet_t *, uint8_t *);
 
 #endif
Index: uspace/app/virtusbkbd/virtusbkbd.c
===================================================================
--- uspace/app/virtusbkbd/virtusbkbd.c	(revision 0eddb76bcbabe8f448e8a6f610dcc98ec480bed4)
+++ uspace/app/virtusbkbd/virtusbkbd.c	(revision 56b962db22105d9fdefea4a4878cca2e421da45a)
@@ -111,5 +111,6 @@
  */
 static usbvirt_device_ops_t keyboard_ops = {
-	.standard_request_ops = &standard_request_ops,
+	.on_standard_request[USB_DEVREQ_GET_DESCRIPTOR]
+	    = stdreq_on_get_descriptor,
 	.on_class_device_request = on_class_request,
 	.on_data = on_incoming_data,
Index: uspace/drv/vhc/hubops.c
===================================================================
--- uspace/drv/vhc/hubops.c	(revision 0eddb76bcbabe8f448e8a6f610dcc98ec480bed4)
+++ uspace/drv/vhc/hubops.c	(revision 56b962db22105d9fdefea4a4878cca2e421da45a)
@@ -65,22 +65,7 @@
     void *buffer, size_t size, size_t *actual_size);
 
-/** Standard USB requests. */
-static usbvirt_standard_device_request_ops_t standard_request_ops = {
-	.on_get_status = NULL,
-	.on_clear_feature = NULL,
-	.on_set_feature = NULL,
-	.on_set_address = NULL,
-	.on_get_descriptor = on_get_descriptor,
-	.on_set_descriptor = NULL,
-	.on_get_configuration = NULL,
-	.on_set_configuration = NULL,
-	.on_get_interface = NULL,
-	.on_set_interface = NULL,
-	.on_synch_frame = NULL
-};
-
 /** Hub operations. */
 usbvirt_device_ops_t hub_ops = {
-	.standard_request_ops = &standard_request_ops,
+	.on_standard_request[USB_DEVREQ_GET_DESCRIPTOR] = on_get_descriptor,
 	.on_class_device_request = on_class_request,
 	.on_data = NULL,
Index: uspace/lib/usbvirt/include/usbvirt/device.h
===================================================================
--- uspace/lib/usbvirt/include/usbvirt/device.h	(revision 0eddb76bcbabe8f448e8a6f610dcc98ec480bed4)
+++ uspace/lib/usbvirt/include/usbvirt/device.h	(revision 56b962db22105d9fdefea4a4878cca2e421da45a)
@@ -47,26 +47,10 @@
 	uint8_t *data);
 
-/** Callbacks for standard device requests.
- * When these functions are NULL or return EFORWARD, this
- * framework will try to satisfy the request by itself.
- */
-typedef struct {
-	usbvirt_on_device_request_t on_get_status;
-	usbvirt_on_device_request_t on_clear_feature;
-	usbvirt_on_device_request_t on_set_feature;
-	usbvirt_on_device_request_t on_set_address;
-	usbvirt_on_device_request_t on_get_descriptor;
-	usbvirt_on_device_request_t on_set_descriptor;
-	usbvirt_on_device_request_t on_get_configuration;
-	usbvirt_on_device_request_t on_set_configuration;
-	usbvirt_on_device_request_t on_get_interface;
-	usbvirt_on_device_request_t on_set_interface;
-	usbvirt_on_device_request_t on_synch_frame;
-} usbvirt_standard_device_request_ops_t;
-
 /** Device operations. */
 typedef struct {
-	/** Callbacks for standard deivce requests. */
-	usbvirt_standard_device_request_ops_t *standard_request_ops;
+	/** Callbacks for standard device requests.
+	 * The callbacks are indexed by usb_stddevreq_t enum.
+	 */
+	usbvirt_on_device_request_t on_standard_request[USB_DEVREQ_LAST_STD];
 	/** Callback for class-specific USB request. */
 	usbvirt_on_device_request_t on_class_device_request;
Index: uspace/lib/usbvirt/src/private.h
===================================================================
--- uspace/lib/usbvirt/src/private.h	(revision 0eddb76bcbabe8f448e8a6f610dcc98ec480bed4)
+++ uspace/lib/usbvirt/src/private.h	(revision 56b962db22105d9fdefea4a4878cca2e421da45a)
@@ -38,4 +38,5 @@
 #include <usbvirt/device.h>
 #include <usbvirt/hub.h>
+#include <assert.h>
 
 
Index: uspace/lib/usbvirt/src/stdreq.c
===================================================================
--- uspace/lib/usbvirt/src/stdreq.c	(revision 0eddb76bcbabe8f448e8a6f610dcc98ec480bed4)
+++ uspace/lib/usbvirt/src/stdreq.c	(revision 56b962db22105d9fdefea4a4878cca2e421da45a)
@@ -41,4 +41,6 @@
 
 
+typedef int (*usbvirt_stdreq_handler_t)(usbvirt_device_t *,
+usb_device_request_setup_packet_t *, uint8_t *);
 
 /*
@@ -51,7 +53,9 @@
 /** GET_DESCRIPTOR handler. */
 static int handle_get_descriptor(usbvirt_device_t *device,
-    uint8_t type, uint8_t index, uint16_t language,
-    uint16_t length)
-{
+    usb_device_request_setup_packet_t *setup_packet, uint8_t *extra_data)
+{
+	uint8_t type = setup_packet->value_high;
+	uint8_t index = setup_packet->value_low;
+
 	/* 
 	 * Standard device descriptor.
@@ -110,7 +114,10 @@
 /** SET_ADDRESS handler. */
 static int handle_set_address(usbvirt_device_t *device,
-    uint16_t new_address,
-    uint16_t zero1, uint16_t zero2)
-{
+    usb_device_request_setup_packet_t *setup_packet, uint8_t *extra_data)
+{
+	uint16_t new_address = setup_packet->value;
+	uint16_t zero1 = setup_packet->index;
+	uint16_t zero2 = setup_packet->length;
+
 	if ((zero1 != 0) || (zero2 != 0)) {
 		return EINVAL;
@@ -128,7 +135,10 @@
 /** SET_CONFIGURATION handler. */
 static int handle_set_configuration(usbvirt_device_t *device,
-    uint16_t configuration_value,
-    uint16_t zero1, uint16_t zero2)
-{
+    usb_device_request_setup_packet_t *setup_packet, uint8_t *extra_data)
+{
+	uint16_t configuration_value = setup_packet->value;
+	uint16_t zero1 = setup_packet->index;
+	uint16_t zero2 = setup_packet->length;
+
 	if ((zero1 != 0) || (zero2 != 0)) {
 		return EINVAL;
@@ -167,43 +177,41 @@
 }
 
-#define HANDLE_REQUEST(request, data, type, dev, user_callback, default_handler) \
-	do { \
-		if ((request)->request == (type)) { \
-			int _rc = EFORWARD; \
-			if (((dev)->ops) && ((dev)->ops->standard_request_ops) \
-			    && ((dev)->ops->standard_request_ops->user_callback)) { \
-				_rc = (dev)->ops->standard_request_ops->\
-				    user_callback(dev, request, data); \
-			} \
-			if (_rc == EFORWARD) { \
-				default_handler; \
-			} \
-			return _rc; \
-		} \
-	} while (false)
+static usbvirt_stdreq_handler_t local_handlers[USB_DEVREQ_LAST_STD] = {
+	[USB_DEVREQ_GET_DESCRIPTOR] = handle_get_descriptor,
+	[USB_DEVREQ_SET_ADDRESS] = handle_set_address,
+	[USB_DEVREQ_SET_CONFIGURATION] = handle_set_configuration
+};
 
 /** Handle standard device request. */
 int handle_std_request(usbvirt_device_t *device,
-    usb_device_request_setup_packet_t *request, uint8_t *data)
-{
+    usb_device_request_setup_packet_t *request_packet, uint8_t *data)
+{
+	int request = request_packet->request;
+
 	device->lib_debug(device, 3, USBVIRT_DEBUGTAG_CONTROL_PIPE_ZERO,
-	    "handling standard request %d", request->request);
-	
-	HANDLE_REQUEST(request, data, USB_DEVREQ_GET_DESCRIPTOR,
-	    device, on_get_descriptor,
-	    handle_get_descriptor(device, request->value_high, request->value_low,
-	        request->index, request->length));
-	
-	HANDLE_REQUEST(request, data, USB_DEVREQ_SET_ADDRESS,
-	    device, on_set_address,
-	    handle_set_address(device, request->value,
-	        request->index, request->length));
-	
-	HANDLE_REQUEST(request, data, USB_DEVREQ_SET_CONFIGURATION,
-	    device, on_set_configuration,
-	    handle_set_configuration(device, request->value,
-	        request->index, request->length));
-	
-	return ENOTSUP;
+	    "handling standard request %d", request);
+
+	if (request >= USB_DEVREQ_LAST_STD) {
+		return ENOTSUP;
+	}
+	
+	int rc = EFORWARD;
+	if ((device->ops)
+	    && (device->ops->on_standard_request[request])) {
+		rc = device->ops->on_standard_request[request](device,
+		    request_packet, data);
+	}
+
+	if (rc == EFORWARD) {
+		if (local_handlers[request]) {
+			rc = local_handlers[request](device,
+			    request_packet, data);
+		} else {
+			rc = ENOTSUP;
+		}
+	}
+
+	assert(rc != EFORWARD);
+	return rc;
 }
 
