Index: uspace/app/virtusbkbd/stdreq.c
===================================================================
--- uspace/app/virtusbkbd/stdreq.c	(revision b8a3cda7a0bb2e2ea3eeb8a5d2368d8d10f4963b)
+++ uspace/app/virtusbkbd/stdreq.c	(revision 7a7bfeb30fdd348b34bb92383e98a63c4fff1346)
@@ -65,5 +65,5 @@
 		 * report descriptor.
 		 */
-		int rc = dev->send_data(dev, 0,
+		int rc = dev->control_transfer_reply(dev, 0,
 		    report_descriptor, report_descriptor_size);
 		
Index: uspace/app/virtusbkbd/virtusbkbd.c
===================================================================
--- uspace/app/virtusbkbd/virtusbkbd.c	(revision b8a3cda7a0bb2e2ea3eeb8a5d2368d8d10f4963b)
+++ uspace/app/virtusbkbd/virtusbkbd.c	(revision 7a7bfeb30fdd348b34bb92383e98a63c4fff1346)
@@ -67,4 +67,6 @@
 	(printf("%s: %s" fmt "\n", NAME, _QUOTEME(cmd), __VA_ARGS__), cmd(__VA_ARGS__))
 
+kb_status_t status;
+
 static int on_incoming_data(struct usbvirt_device *dev,
     usb_endpoint_t endpoint, void *buffer, size_t size)
@@ -83,4 +85,28 @@
 }
 
+static int on_request_for_data(struct usbvirt_device *dev,
+    usb_endpoint_t endpoint, void *buffer, size_t size, size_t *actual_size)
+{
+	if (size < 2 + KB_MAX_KEYS_AT_ONCE) {
+		return EINVAL;
+	}
+	
+	*actual_size = 2 + KB_MAX_KEYS_AT_ONCE;
+	
+	uint8_t data[2 + KB_MAX_KEYS_AT_ONCE];
+	data[0] = status.modifiers;
+	data[1] = 0;
+	
+	size_t i;
+	for (i = 0; i < KB_MAX_KEYS_AT_ONCE; i++) {
+		data[2 + i] = status.pressed_keys[i];
+	}
+	
+	memcpy(buffer, &data, *actual_size);
+	
+	return EOK;
+}
+
+
 /** Keyboard callbacks.
  * We abuse the fact that static variables are zero-filled.
@@ -89,5 +115,6 @@
 	.standard_request_ops = &standard_request_ops,
 	.on_class_device_request = on_class_request,
-	.on_data = on_incoming_data
+	.on_data = on_incoming_data,
+	.on_data_request = on_request_for_data
 };
 
@@ -151,15 +178,4 @@
 	}
 	printf("\n");
-	
-	uint8_t data[3 + KB_MAX_KEYS_AT_ONCE];
-	data[0] = status->modifiers;
-	data[1] = 0;
-	data[2] = 0;
-	for (i = 0; i < KB_MAX_KEYS_AT_ONCE; i++) {
-		data[3 + i] = status->pressed_keys[i];
-	}
-	
-	int rc = keyboard_dev.send_data(&keyboard_dev, 0, data, sizeof(data));
-	printf("%s:   Sent to VHCD (%s).\n", NAME, str_error(rc));
 	
 	fibril_sleep(1);
@@ -198,4 +214,6 @@
 	}
 	
+	kb_init(&status);
+	
 	
 	int rc = usbvirt_connect(&keyboard_dev, DEV_HCD_NAME);
@@ -206,7 +224,4 @@
 	}
 	
-	kb_status_t status;
-	kb_init(&status);
-	
 	printf("%s: Simulating keyboard events...\n", NAME);
 	kb_process_events(&status, keyboard_events, keyboard_events_count,
