Index: uspace/app/virtusbkbd/virtusbkbd.c
===================================================================
--- uspace/app/virtusbkbd/virtusbkbd.c	(revision 76daaf9fa4ac9b444281b5878f05f76c18815231)
+++ uspace/app/virtusbkbd/virtusbkbd.c	(revision d5e76686497cace0d5ab653dee609bfc1fc6974b)
@@ -138,4 +138,5 @@
 		    USBVIRT_REQUEST_RECIPIENT_DEVICE),
 		.request = USB_DEVREQ_GET_DESCRIPTOR,
+		.name = "GetDescriptor",
 		.callback = stdreq_on_get_descriptor
 	},
@@ -146,4 +147,5 @@
 		    USBVIRT_REQUEST_RECIPIENT_DEVICE),
 		.request = USB_DEVREQ_GET_DESCRIPTOR,
+		.name = "GetDescriptor",
 		.callback = stdreq_on_get_descriptor
 	},
@@ -268,4 +270,5 @@
 	
 	printf("%s: Simulating keyboard events...\n", NAME);
+	fibril_sleep(10);
 	while (1) {
 		kb_process_events(&status, keyboard_events, keyboard_events_count,
Index: uspace/drv/vhc/hubops.c
===================================================================
--- uspace/drv/vhc/hubops.c	(revision 76daaf9fa4ac9b444281b5878f05f76c18815231)
+++ uspace/drv/vhc/hubops.c	(revision d5e76686497cace0d5ab653dee609bfc1fc6974b)
@@ -519,48 +519,60 @@
 	{
 		STD_REQ(DIR_OUT, REC_DEVICE, USB_DEVREQ_SET_CONFIGURATION),
+		.name = "SetConfiguration",
 		.callback = on_set_configuration
 	},
 	{
 		STD_REQ(DIR_IN, REC_DEVICE, USB_DEVREQ_GET_DESCRIPTOR),
+		.name = "GetDescriptor",
 		.callback = on_get_descriptor
 	},
 	{
 		CLASS_REQ(DIR_IN, REC_DEVICE, USB_DEVREQ_GET_DESCRIPTOR),
+		.name = "GetDescriptor",
 		.callback = on_get_descriptor
 	},
 	{
 		CLASS_REQ(DIR_IN, REC_OTHER, USB_HUB_REQUEST_GET_STATUS),
+		.name = "GetPortStatus",
 		.callback = req_get_port_status
 	},
 	{
 		CLASS_REQ(DIR_OUT, REC_DEVICE, USB_HUB_REQUEST_CLEAR_FEATURE),
+		.name = "ClearHubFeature",
 		.callback = req_clear_hub_feature
 	},
 	{
 		CLASS_REQ(DIR_OUT, REC_OTHER, USB_HUB_REQUEST_CLEAR_FEATURE),
+		.name = "ClearPortFeature",
 		.callback = req_clear_port_feature
 	},
 	{
 		CLASS_REQ(DIR_IN, REC_OTHER, USB_HUB_REQUEST_GET_STATE),
+		.name = "GetBusState",
 		.callback = req_get_bus_state
 	},
 	{
 		CLASS_REQ(DIR_IN, REC_DEVICE, USB_HUB_REQUEST_GET_DESCRIPTOR),
+		.name = "GetHubDescriptor",
 		.callback = req_get_hub_descriptor
 	},
 	{
 		CLASS_REQ(DIR_IN, REC_DEVICE, USB_HUB_REQUEST_GET_STATUS),
+		.name = "GetHubStatus",
 		.callback = req_get_hub_status
 	},
 	{
 		CLASS_REQ(DIR_IN, REC_OTHER, USB_HUB_REQUEST_GET_STATUS),
+		.name = "GetPortStatus",
 		.callback = req_get_port_status
 	},
 	{
 		CLASS_REQ(DIR_OUT, REC_DEVICE, USB_HUB_REQUEST_SET_FEATURE),
+		.name = "SetHubFeature",
 		.callback = req_set_hub_feature
 	},
 	{
 		CLASS_REQ(DIR_OUT, REC_OTHER, USB_HUB_REQUEST_SET_FEATURE),
+		.name = "SetPortFeature",
 		.callback = req_set_port_feature
 	},
Index: uspace/lib/usbvirt/include/usbvirt/device.h
===================================================================
--- uspace/lib/usbvirt/include/usbvirt/device.h	(revision 76daaf9fa4ac9b444281b5878f05f76c18815231)
+++ uspace/lib/usbvirt/include/usbvirt/device.h	(revision d5e76686497cace0d5ab653dee609bfc1fc6974b)
@@ -66,4 +66,5 @@
 	uint8_t request_type;
 	uint8_t request;
+	const char *name;
 	usbvirt_control_request_callback_t callback;
 } usbvirt_control_transfer_handler_t;
@@ -74,5 +75,5 @@
 	| (((recipient) & 31))
 
-#define USBVIRT_CONTROL_TRANSFER_HANDLER_LAST { 0, 0, NULL }
+#define USBVIRT_CONTROL_TRANSFER_HANDLER_LAST { 0, 0, NULL, NULL }
 
 /** Device operations. */
Index: uspace/lib/usbvirt/src/ctrlpipe.c
===================================================================
--- uspace/lib/usbvirt/src/ctrlpipe.c	(revision 76daaf9fa4ac9b444281b5878f05f76c18815231)
+++ uspace/lib/usbvirt/src/ctrlpipe.c	(revision d5e76686497cace0d5ab653dee609bfc1fc6974b)
@@ -76,4 +76,38 @@
 }
 
+#define _GET_BIT(byte, bit) \
+	(((byte) & (1 << (bit))) ? '1' : '0')
+#define _GET_BITS(byte) \
+	_GET_BIT(byte, 7), _GET_BIT(byte, 6), _GET_BIT(byte, 5), \
+	_GET_BIT(byte, 4), _GET_BIT(byte, 3), _GET_BIT(byte, 2), \
+	_GET_BIT(byte, 1), _GET_BIT(byte, 0)
+
+static int find_and_run_handler(usbvirt_device_t *device,
+    usbvirt_control_transfer_handler_t *handlers,
+    usb_device_request_setup_packet_t *setup_packet,
+    uint8_t *data)
+{
+	int rc = EFORWARD;
+	usbvirt_control_transfer_handler_t *suitable_handler
+	    = find_handler(handlers, setup_packet);
+	if (suitable_handler != NULL) {
+		const char *callback_name = "user handler";
+		if (suitable_handler->name != NULL) {
+			callback_name = suitable_handler->name;
+		}
+		device->lib_debug(device, 1, USBVIRT_DEBUGTAG_CONTROL_PIPE_ZERO,
+		    "pipe #0 - calling %s " \
+		        "[%c.%c%c.%c%c%c%c%c, R%d, V%d, I%d, L%d]",
+		    callback_name,
+		    _GET_BITS(setup_packet->request_type),
+		    setup_packet->request, setup_packet->value,
+		    setup_packet->index, setup_packet->length);
+		rc = suitable_handler->callback(device, setup_packet, data);
+	}
+
+	return rc;
+}
+#undef _GET_BITS
+#undef _GET_BIT
 
 
@@ -82,5 +116,5 @@
 int control_pipe(usbvirt_device_t *device, usbvirt_control_transfer_t *transfer)
 {
-	device->lib_debug(device, 1, USBVIRT_DEBUGTAG_CONTROL_PIPE_ZERO,
+	device->lib_debug(device, 2, USBVIRT_DEBUGTAG_CONTROL_PIPE_ZERO,
 	    "op on control pipe zero (request_size=%u)", transfer->request_size);
 	
@@ -91,6 +125,5 @@
 	usb_device_request_setup_packet_t *request
 	    = (usb_device_request_setup_packet_t *) transfer->request;
-	printf("Request: %d,%d\n", request->request_type, request->request);
-	
+
 	/*
 	 * First, see whether user provided its own callback.
@@ -98,11 +131,7 @@
 	int rc = EFORWARD;
 	if (device->ops) {
-		usbvirt_control_transfer_handler_t *user_handler
-		    = find_handler(device->ops->control_transfer_handlers,
-		    request);
-		if (user_handler != NULL) {
-			rc = user_handler->callback(device, request,
-			    transfer->data);
-		}
+		rc = find_and_run_handler(device,
+		    device->ops->control_transfer_handlers,
+		    request, transfer->data);
 	}
 
@@ -112,11 +141,7 @@
 	 */
 	if (rc == EFORWARD) {
-		usbvirt_control_transfer_handler_t *lib_handler
-		    = find_handler(control_pipe_zero_local_handlers,
-		    request);
-		if (lib_handler != NULL) {
-			rc = lib_handler->callback(device, request,
-			    transfer->data);
-		}
+		rc = find_and_run_handler(device,
+		    control_pipe_zero_local_handlers,
+		    request, transfer->data);
 	}
 	
Index: uspace/lib/usbvirt/src/stdreq.c
===================================================================
--- uspace/lib/usbvirt/src/stdreq.c	(revision 76daaf9fa4ac9b444281b5878f05f76c18815231)
+++ uspace/lib/usbvirt/src/stdreq.c	(revision d5e76686497cace0d5ab653dee609bfc1fc6974b)
@@ -184,4 +184,5 @@
 		.request_type = MAKE_BM_REQUEST_DEV(USB_DIRECTION_IN),
 		.request = USB_DEVREQ_GET_DESCRIPTOR,
+		.name = "GetDescriptor()",
 		.callback = handle_get_descriptor
 	},
@@ -189,4 +190,5 @@
 		.request_type = MAKE_BM_REQUEST_DEV(USB_DIRECTION_OUT),
 		.request = USB_DEVREQ_SET_ADDRESS,
+		.name = "SetAddress()",
 		.callback = handle_set_address
 	},
@@ -194,4 +196,5 @@
 		.request_type = MAKE_BM_REQUEST_DEV(USB_DIRECTION_OUT),
 		.request = USB_DEVREQ_SET_CONFIGURATION,
+		.name = "SetConfiguration()",
 		.callback = handle_set_configuration
 	},
