Index: uspace/lib/usbvirt/ctrlpipe.c
===================================================================
--- uspace/lib/usbvirt/ctrlpipe.c	(revision 2c38125098827bdd626f5ecd8606e6b1b133dd24)
+++ uspace/lib/usbvirt/ctrlpipe.c	(revision 73301a04b2f378b64dab507cd0acf088ce3fc9c3)
@@ -68,6 +68,6 @@
 			break;
 		case REQUEST_TYPE_CLASS:
-			if (DEVICE_HAS_OP(device, on_devreq_class)) {
-				return device->ops->on_devreq_class(device,
+			if (DEVICE_HAS_OP(device, on_class_device_request)) {
+				return device->ops->on_class_device_request(device,
 				    request, remaining_data);
 			}
Index: uspace/lib/usbvirt/device.h
===================================================================
--- uspace/lib/usbvirt/device.h	(revision 2c38125098827bdd626f5ecd8606e6b1b133dd24)
+++ uspace/lib/usbvirt/device.h	(revision 73301a04b2f378b64dab507cd0acf088ce3fc9c3)
@@ -46,13 +46,28 @@
 	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 {
-	/** 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;
+	/** Callbacks for standard deivce requests. */
+	usbvirt_standard_device_request_ops_t *standard_request_ops;
 	/** Callback for class-specific USB request. */
-	usbvirt_on_device_request_t on_devreq_class;
+	usbvirt_on_device_request_t on_class_device_request;
 	/** Callback for all other incoming data. */
 	int (*on_data)(struct usbvirt_device *dev,
Index: uspace/lib/usbvirt/stdreq.c
===================================================================
--- uspace/lib/usbvirt/stdreq.c	(revision 2c38125098827bdd626f5ecd8606e6b1b133dd24)
+++ uspace/lib/usbvirt/stdreq.c	(revision 73301a04b2f378b64dab507cd0acf088ce3fc9c3)
@@ -123,37 +123,34 @@
 }
 
+#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)
+
+
 int handle_std_request(usb_device_request_setup_packet_t *request, uint8_t *data)
 {
-	int rc;
+	HANDLE_REQUEST(request, data, USB_DEVREQ_GET_DESCRIPTOR,
+	    device, on_get_descriptor,
+	    handle_get_descriptor(request->value_low, request->value_high,
+	        request->index, request->length));
 	
-	switch (request->request) {
-		case USB_DEVREQ_GET_DESCRIPTOR:
-			rc = handle_get_descriptor(
-			    request->value_low, request->value_high,
-			    request->index, request->length);
-			break;
-		
-		case USB_DEVREQ_SET_ADDRESS:
-			rc = handle_set_address(request->value,
-			    request->index, request->length);
-			break;
-		
-		default:
-			rc = EFORWARD;
-			break;
-	}
+	HANDLE_REQUEST(request, data, USB_DEVREQ_SET_ADDRESS,
+	    device, on_set_address,
+	    handle_set_address(request->value,
+	        request->index, request->length));
 	
-	/*
-	 * We preprocessed all we could.
-	 * If it was not enough, pass the request to the actual driver.
-	 */
-	if (rc == EFORWARD) {
-		if (DEVICE_HAS_OP(device, on_devreq_std)) {
-			return device->ops->on_devreq_std(device,
-			    request, data);
-		}
-	}
-	
-	return EOK;
+	return ENOTSUP;
 }
 
