Index: uspace/app/vuhid/main.c
===================================================================
--- uspace/app/vuhid/main.c	(revision d197496661fecf853a30e11375ef0530df933cff)
+++ uspace/app/vuhid/main.c	(revision c9399c0cc88b72bd8ee0f28b1d6c211f0ed4a6d5)
@@ -57,7 +57,5 @@
 static usbvirt_control_request_handler_t endpoint_zero_handlers[] = {
 	{
-		.req_direction = USB_DIRECTION_IN,
-		.req_type = USB_REQUEST_TYPE_STANDARD,
-		.req_recipient = USB_REQUEST_RECIPIENT_INTERFACE,
+		.request_type = SETUP_REQUEST_TO_HOST(USB_REQUEST_TYPE_STANDARD,  USB_REQUEST_RECIPIENT_INTERFACE),
 		.request = USB_DEVREQ_GET_DESCRIPTOR,
 		.name = "Get_Descriptor",
@@ -65,7 +63,5 @@
 	},
 	{
-		.req_direction = USB_DIRECTION_OUT,
-		.req_recipient = USB_REQUEST_RECIPIENT_INTERFACE,
-		.req_type = USB_REQUEST_TYPE_CLASS,
+		.request_type = SETUP_REQUEST_TO_DEVICE(USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE),
 		.request = USB_HIDREQ_SET_PROTOCOL,
 		.name = "Set_Protocol",
@@ -73,7 +69,5 @@
 	},
 	{
-		.req_direction = USB_DIRECTION_OUT,
-		.req_recipient = USB_REQUEST_RECIPIENT_INTERFACE,
-		.req_type = USB_REQUEST_TYPE_CLASS,
+		.request_type = SETUP_REQUEST_TO_DEVICE(USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE),
 		.request = USB_HIDREQ_SET_REPORT,
 		.name = "Set_Report",
Index: uspace/drv/bus/usb/vhc/hub/virthubops.c
===================================================================
--- uspace/drv/bus/usb/vhc/hub/virthubops.c	(revision d197496661fecf853a30e11375ef0530df933cff)
+++ uspace/drv/bus/usb/vhc/hub/virthubops.c	(revision c9399c0cc88b72bd8ee0f28b1d6c211f0ed4a6d5)
@@ -340,12 +340,4 @@
 
 
-/** IN class request. */
-#define CLASS_REQ_IN(recipient) \
-	USBVIRT_MAKE_CONTROL_REQUEST_TYPE(USB_DIRECTION_IN, \
-	USBVIRT_REQUEST_TYPE_CLASS, recipient)
-/** OUT class request. */
-#define CLASS_REQ_OUT(recipient) \
-	USBVIRT_MAKE_CONTROL_REQUEST_TYPE(USB_DIRECTION_OUT, \
-	USBVIRT_REQUEST_TYPE_CLASS, recipient)
 
 /** Recipient: other. */
@@ -353,32 +345,22 @@
 /** Recipient: device. */
 #define REC_DEVICE USB_REQUEST_RECIPIENT_DEVICE
-/** Direction: in. */
-#define DIR_IN USB_DIRECTION_IN
-/** Direction: out. */
-#define DIR_OUT USB_DIRECTION_OUT
-
-
-/** Create a class request.
- *
- * @param direction Request direction.
- * @param recipient Request recipient.
+
+
+/** Create a class request to get data from device
+ *
+ * @param rec Request recipient.
  * @param req Request code.
  */
-#define CLASS_REQ(direction, recipient, req) \
-	.req_direction = direction, \
-	.req_recipient = recipient, \
-	.req_type = USB_REQUEST_TYPE_CLASS, \
+#define CLASS_REQ_IN(rec, req) \
+	.request_type = SETUP_REQUEST_TO_HOST(USB_REQUEST_TYPE_CLASS, rec), \
 	.request = req
 
-/** Create a standard request.
- *
- * @param direction Request direction.
- * @param recipient Request recipient.
+/** Create a class request to send data to device
+ *
+ * @param rec Request recipient.
  * @param req Request code.
  */
-#define STD_REQ(direction, recipient, req) \
-	.req_direction = direction, \
-	.req_recipient = recipient, \
-	.req_type = USB_REQUEST_TYPE_STANDARD, \
+#define CLASS_REQ_OUT(rec, req) \
+	.request_type = SETUP_REQUEST_TO_DEVICE(USB_REQUEST_TYPE_CLASS, rec), \
 	.request = req
 
@@ -386,55 +368,56 @@
 static usbvirt_control_request_handler_t endpoint_zero_handlers[] = {
 	{
-		STD_REQ(DIR_IN, REC_DEVICE, USB_DEVREQ_GET_DESCRIPTOR),
+		.request_type = SETUP_REQUEST_TO_HOST(USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE),
+		.request = USB_DEVREQ_GET_DESCRIPTOR,
 		.name = "GetDescriptor",
 		.callback = req_get_descriptor
 	},
 	{
-		CLASS_REQ(DIR_IN, REC_DEVICE, USB_DEVREQ_GET_DESCRIPTOR),
+		CLASS_REQ_IN(REC_DEVICE, USB_DEVREQ_GET_DESCRIPTOR),
 		.name = "GetDescriptor",
 		.callback = req_get_descriptor
 	},
 	{
-		CLASS_REQ(DIR_IN, REC_OTHER, USB_HUB_REQUEST_GET_STATUS),
+		CLASS_REQ_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),
+		CLASS_REQ_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),
+		CLASS_REQ_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),
+		CLASS_REQ_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),
+		CLASS_REQ_IN(REC_DEVICE, USB_HUB_REQUEST_GET_DESCRIPTOR),
 		.name = "GetHubDescriptor",
 		.callback = req_get_descriptor
 	},
 	{
-		CLASS_REQ(DIR_IN, REC_DEVICE, USB_HUB_REQUEST_GET_STATUS),
+		CLASS_REQ_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),
+		CLASS_REQ_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),
+		CLASS_REQ_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),
+		CLASS_REQ_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 d197496661fecf853a30e11375ef0530df933cff)
+++ uspace/lib/usbvirt/include/usbvirt/device.h	(revision c9399c0cc88b72bd8ee0f28b1d6c211f0ed4a6d5)
@@ -94,10 +94,6 @@
  */
 typedef struct {
-	/** Request direction (in or out). */
-	usb_direction_t req_direction;
-	/** Request recipient (device, interface or endpoint). */
-	usb_request_recipient_t req_recipient;
-	/** Request type (standard, class or vendor). */
-	usb_request_type_t req_type;
+	/* Request type. See usb/request.h */
+	uint8_t request_type;
 	/** Actual request code. */
 	uint8_t request;
Index: uspace/lib/usbvirt/src/ctrltransfer.c
===================================================================
--- uspace/lib/usbvirt/src/ctrltransfer.c	(revision d197496661fecf853a30e11375ef0530df933cff)
+++ uspace/lib/usbvirt/src/ctrltransfer.c	(revision c9399c0cc88b72bd8ee0f28b1d6c211f0ed4a6d5)
@@ -60,23 +60,9 @@
 		return EFORWARD;
 	}
-
-	usb_direction_t direction = setup->request_type & 128 ?
-	    USB_DIRECTION_IN : USB_DIRECTION_OUT;
-	usb_request_recipient_t req_recipient = setup->request_type & 31;
-	usb_request_type_t req_type = (setup->request_type >> 5) & 3;
-
 	usbvirt_control_request_handler_t *handler = control_handlers;
-	while (handler->callback != NULL) {
-		if (handler->req_direction != direction) {
-			goto next;
-		}
-		if (handler->req_recipient != req_recipient) {
-			goto next;
-		}
-		if (handler->req_type != req_type) {
-			goto next;
-		}
-		if (handler->request != setup->request) {
-			goto next;
+	for (;handler->callback != NULL; ++handler) {
+		if (handler->request != setup->request ||
+		    handler->request_type != setup->request_type) {
+			continue;
 		}
 
@@ -84,12 +70,8 @@
 		    usb_debug_str_buffer((uint8_t*) setup, sizeof(*setup), 0));
 		int rc = handler->callback(dev, setup, data, data_sent_size);
-		if (rc == EFORWARD) {
-			goto next;
+		if (rc != EFORWARD) {
+			return rc;
 		}
 
-		return rc;
-
-next:
-		handler++;
 	}
 
Index: uspace/lib/usbvirt/src/stdreq.c
===================================================================
--- uspace/lib/usbvirt/src/stdreq.c	(revision d197496661fecf853a30e11375ef0530df933cff)
+++ uspace/lib/usbvirt/src/stdreq.c	(revision c9399c0cc88b72bd8ee0f28b1d6c211f0ed4a6d5)
@@ -192,7 +192,5 @@
 usbvirt_control_request_handler_t library_handlers[] = {
 	{
-		.req_direction = USB_DIRECTION_OUT,
-		.req_recipient = USB_REQUEST_RECIPIENT_DEVICE,
-		.req_type = USB_REQUEST_TYPE_STANDARD,
+		.request_type = SETUP_REQUEST_TO_DEVICE(USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE),
 		.request = USB_DEVREQ_SET_ADDRESS,
 		.name = "SetAddress",
@@ -200,7 +198,5 @@
 	},
 	{
-		.req_direction = USB_DIRECTION_IN,
-		.req_recipient = USB_REQUEST_RECIPIENT_DEVICE,
-		.req_type = USB_REQUEST_TYPE_STANDARD,
+		.request_type = SETUP_REQUEST_TO_HOST(USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE),
 		.request = USB_DEVREQ_GET_DESCRIPTOR,
 		.name = "GetDescriptor",
@@ -208,12 +204,9 @@
 	},
 	{
-		.req_direction = USB_DIRECTION_OUT,
-		.req_recipient = USB_REQUEST_RECIPIENT_DEVICE,
-		.req_type = USB_REQUEST_TYPE_STANDARD,
+		.request_type = SETUP_REQUEST_TO_DEVICE(USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE),
 		.request = USB_DEVREQ_SET_CONFIGURATION,
 		.name = "SetConfiguration",
 		.callback = req_set_configuration
 	},
-
 	{ .callback = NULL }
 };
