Index: uspace/lib/usb/include/usb/usbdrv.h
===================================================================
--- uspace/lib/usb/include/usb/usbdrv.h	(revision 97532207cccbbd72946d811fe8224a29ebdbdb70)
+++ uspace/lib/usb/include/usb/usbdrv.h	(revision fe4dd14b607dfc4f86f5c66da2dc991b70531dd3)
@@ -70,4 +70,7 @@
     usb_handle_t *);
 
+int usb_drv_async_control_write(int, usb_target_t,
+    void *, size_t, void *, size_t, usb_handle_t *);
+
 int usb_drv_psync_control_write_setup(int, usb_target_t, void *, size_t);
 int usb_drv_psync_control_write_data(int, usb_target_t, void *, size_t);
@@ -77,5 +80,4 @@
     void *, size_t, void *, size_t);
 
-
 int usb_drv_async_control_read_setup(int, usb_target_t,
     void *, size_t, usb_handle_t *);
@@ -84,4 +86,7 @@
 int usb_drv_async_control_read_status(int, usb_target_t,
     usb_handle_t *);
+
+int usb_drv_async_control_read(int, usb_target_t,
+    void *, size_t, void *, size_t, size_t *, usb_handle_t *);
 
 int usb_drv_psync_control_read_setup(int, usb_target_t, void *, size_t);
Index: uspace/lib/usb/src/usbdrv.c
===================================================================
--- uspace/lib/usb/src/usbdrv.c	(revision 97532207cccbbd72946d811fe8224a29ebdbdb70)
+++ uspace/lib/usb/src/usbdrv.c	(revision fe4dd14b607dfc4f86f5c66da2dc991b70531dd3)
@@ -495,4 +495,54 @@
 }
 
+/** Issue whole control write transfer. */
+int usb_drv_async_control_write(int phone, usb_target_t target,
+    void *setup_packet, size_t setup_packet_size,
+    void *buffer, size_t buffer_size,
+    usb_handle_t *handle)
+{
+	// FIXME - check input parameters instead of asserting them
+	assert(phone > 0);
+	assert(setup_packet != NULL);
+	assert(setup_packet_size > 0);
+	assert(buffer != NULL);
+	assert(buffer_size > 0);
+	assert(handle != NULL);
+
+	transfer_info_t *transfer
+	    = (transfer_info_t *) malloc(sizeof(transfer_info_t));
+	if (transfer == NULL) {
+		return ENOMEM;
+	}
+
+	transfer->size_transferred = NULL;
+	transfer->buffer = NULL;
+	transfer->size = 0;
+	transfer->phone = phone;
+
+	int rc;
+
+	transfer->request = async_send_3(phone,
+	    DEV_IFACE_ID(USBHC_DEV_IFACE),
+	    IPC_M_USBHC_CONTROL_WRITE,
+	    target.address, target.endpoint,
+	    &transfer->reply);
+
+	rc = async_data_write_start(phone, setup_packet, setup_packet_size);
+	if (rc != EOK) {
+		async_wait_for(transfer->request, NULL);
+		return rc;
+	}
+
+	rc = async_data_write_start(phone, buffer, buffer_size);
+	if (rc != EOK) {
+		async_wait_for(transfer->request, NULL);
+		return rc;
+	}
+
+	*handle = (usb_handle_t) transfer;
+
+	return EOK;
+}
+
 /** Start control read transfer. */
 int usb_drv_async_control_read_setup(int phone, usb_target_t target,
@@ -530,4 +580,49 @@
 }
 
+/** Issue whole control read transfer. */
+int usb_drv_async_control_read(int phone, usb_target_t target,
+    void *setup_packet, size_t setup_packet_size,
+    void *buffer, size_t buffer_size, size_t *actual_size,
+    usb_handle_t *handle)
+{
+	// FIXME - check input parameters instead of asserting them
+	assert(phone > 0);
+	assert(setup_packet != NULL);
+	assert(setup_packet_size > 0);
+	assert(buffer != NULL);
+	assert(buffer_size > 0);
+	assert(handle != NULL);
+
+	transfer_info_t *transfer
+	    = (transfer_info_t *) malloc(sizeof(transfer_info_t));
+	if (transfer == NULL) {
+		return ENOMEM;
+	}
+
+	transfer->size_transferred = actual_size;
+	transfer->buffer = buffer;
+	transfer->size = buffer_size;
+	transfer->phone = phone;
+
+	int rc;
+
+	transfer->request = async_send_4(phone,
+	    DEV_IFACE_ID(USBHC_DEV_IFACE),
+	    IPC_M_USBHC_CONTROL_READ,
+	    target.address, target.endpoint,
+	    buffer_size,
+	    &transfer->reply);
+
+	rc = async_data_write_start(phone, setup_packet, setup_packet_size);
+	if (rc != EOK) {
+		async_wait_for(transfer->request, NULL);
+		return rc;
+	}
+
+	*handle = (usb_handle_t) transfer;
+
+	return EOK;
+}
+
 /**
  * @}
