Index: uspace/lib/usb/hcd.c
===================================================================
--- uspace/lib/usb/hcd.c	(revision 6c741e1df12ae6b7434212a5281ceaf8e0a87d19)
+++ uspace/lib/usb/hcd.c	(revision 34586183a2d535f280f5801720405357ee9da806)
@@ -211,4 +211,156 @@
 }
 
+
+static int send_buffer(int phone, ipcarg_t method, usb_target_t target,
+    void *buffer, size_t size, usb_transaction_handle_t * transaction_handle)
+{
+	if (phone < 0) {
+		return EINVAL;
+	}
+	
+	if ((buffer == NULL) && (size > 0)) {
+		return EINVAL;
+	}
+
+	ipc_call_t answer_data;
+	ipcarg_t answer_rc;
+	aid_t req;
+	int rc;
+	
+	req = async_send_3(phone,
+	    method,
+	    target.address, target.endpoint,
+	    size,
+	    &answer_data);
+	
+	if (size > 0) {
+		rc = async_data_write_start(phone, buffer, size);
+		if (rc != EOK) {
+			async_wait_for(req, NULL);
+			return rc;
+		}
+	}
+	
+	async_wait_for(req, &answer_rc);
+	rc = (int)answer_rc;
+	if (rc != EOK) {
+		return rc;
+	}
+	
+	if (transaction_handle != NULL) {
+		*transaction_handle = IPC_GET_ARG1(answer_data);
+	}
+	
+	return EOK;
+}
+
+
+static int prep_receive_data(int phone, ipcarg_t method, usb_target_t target,
+    size_t size, usb_transaction_handle_t * transaction_handle)
+{
+	if (phone < 0) {
+		return EINVAL;
+	}
+	
+	usb_transaction_handle_t handle;
+	
+	int rc = ipc_call_sync_3_1(phone,
+	    method,
+	    target.address, target.endpoint,
+	    size,
+	    &handle);
+	
+	if (rc != EOK) {
+		return rc;
+	}
+	
+	if (transaction_handle != NULL) {
+		*transaction_handle = handle;
+	}
+	
+	return EOK;
+}
+
+
+int usb_hcd_transfer_interrupt_out(int hcd_phone, usb_target_t target,
+    void *buffer, size_t size, usb_transaction_handle_t *handle)
+{
+	return send_buffer(hcd_phone, IPC_M_USB_HCD_INTERRUPT_OUT,
+	    target, buffer, size, handle);
+}
+
+int usb_hcd_transfer_interrupt_in(int hcd_phone, usb_target_t target,
+    size_t size, usb_transaction_handle_t *handle)
+{
+	return prep_receive_data(hcd_phone, IPC_M_USB_HCD_INTERRUPT_IN,
+	    target, size, handle);
+}
+
+int usb_hcd_transfer_control_write_setup(int hcd_phone, usb_target_t target,
+    void *buffer, size_t size, usb_transaction_handle_t *handle)
+{
+	return send_buffer(hcd_phone, IPC_M_USB_HCD_CONTROL_WRITE_SETUP,
+	    target, buffer, size, handle);
+}
+
+int usb_hcd_transfer_control_write_data(int hcd_phone, usb_target_t target,
+    void *buffer, size_t size, usb_transaction_handle_t *handle)
+{
+	return send_buffer(hcd_phone, IPC_M_USB_HCD_CONTROL_WRITE_DATA,
+	    target, buffer, size, handle);
+	
+}
+int usb_hcd_transfer_control_write_status(int hcd_phone, usb_target_t target,
+    usb_transaction_handle_t *handle)
+{
+	usb_transaction_handle_t h;
+	int rc = ipc_call_sync_2_1(hcd_phone,
+	    IPC_M_USB_HCD_CONTROL_WRITE_STATUS,
+	    target.address, target.endpoint,
+	    &h);
+	if (rc != EOK) {
+		return rc;
+	}
+	
+	if (handle != NULL) {
+		*handle = h;
+	}
+	
+	return rc;
+}
+
+int usb_hcd_transfer_control_read_setup(int hcd_phone, usb_target_t target,
+    void *buffer, size_t size, usb_transaction_handle_t *handle)
+{
+	return send_buffer(hcd_phone, IPC_M_USB_HCD_CONTROL_READ_SETUP,
+	    target, buffer, size, handle);
+}
+int usb_hcd_transfer_control_read_data(int hcd_phone, usb_target_t target,
+    size_t size, usb_transaction_handle_t *handle)
+{
+	return prep_receive_data(hcd_phone, IPC_M_USB_HCD_CONTROL_READ_DATA,
+	   target, size, handle);
+}
+int usb_hcd_transfer_control_read_status(int hcd_phone, usb_target_t target,
+    usb_transaction_handle_t *handle)
+{
+	usb_transaction_handle_t h;
+	int rc = ipc_call_sync_2_1(hcd_phone,
+	    IPC_M_USB_HCD_CONTROL_READ_STATUS,
+	    target.address, target.endpoint,
+	    &h);
+	if (rc != EOK) {
+		return rc;
+	}
+	
+	if (handle != NULL) {
+		*handle = h;
+	}
+	
+	return rc;
+}
+
+
+
 /**
  * @}
Index: uspace/lib/usb/hcd.h
===================================================================
--- uspace/lib/usb/hcd.h	(revision 6c741e1df12ae6b7434212a5281ceaf8e0a87d19)
+++ uspace/lib/usb/hcd.h	(revision 34586183a2d535f280f5801720405357ee9da806)
@@ -56,4 +56,31 @@
 } usb_transaction_outcome_t;
 
+/** USB packet identifier. */
+typedef enum {
+#define _MAKE_PID_NIBBLE(tag, type) \
+	((uint8_t)(((tag) << 2) | (type)))
+#define _MAKE_PID(tag, type) \
+	( \
+	    _MAKE_PID_NIBBLE(tag, type) \
+	    | ((~_MAKE_PID_NIBBLE(tag, type)) << 4) \
+	)
+	USB_PID_OUT = _MAKE_PID(0, 1),
+	USB_PID_IN = _MAKE_PID(2, 1),
+	USB_PID_SOF = _MAKE_PID(1, 1),
+	USB_PID_SETUP = _MAKE_PID(3, 1),
+	
+	USB_PID_DATA0 = _MAKE_PID(0 ,3),
+	USB_PID_DATA1 = _MAKE_PID(2 ,3),
+	
+	USB_PID_ACK = _MAKE_PID(0 ,2),
+	USB_PID_NAK = _MAKE_PID(2 ,2),
+	USB_PID_STALL = _MAKE_PID(3 ,2),
+	
+	USB_PID_PRE = _MAKE_PID(3 ,0),
+	/* USB_PID_ = _MAKE_PID( ,), */
+#undef _MAKE_PID
+#undef _MAKE_PID_NIBBLE
+} usb_packet_id;
+
 const char * usb_str_transaction_outcome(usb_transaction_outcome_t o);
 
@@ -116,5 +143,18 @@
 	 * - buffer size (in bytes):
 	 */
-	IPC_M_USB_HCD_TRANSACTION_SIZE
+	IPC_M_USB_HCD_TRANSACTION_SIZE,
+	
+	
+	IPC_M_USB_HCD_INTERRUPT_OUT,
+	IPC_M_USB_HCD_INTERRUPT_IN,
+	
+	IPC_M_USB_HCD_CONTROL_WRITE_SETUP,
+	IPC_M_USB_HCD_CONTROL_WRITE_DATA,
+	IPC_M_USB_HCD_CONTROL_WRITE_STATUS,
+	
+	IPC_M_USB_HCD_CONTROL_READ_SETUP,
+	IPC_M_USB_HCD_CONTROL_READ_DATA,
+	IPC_M_USB_HCD_CONTROL_READ_STATUS,
+	/* IPC_M_USB_HCD_ */
 } usb_hcd_method_t;
 
@@ -143,5 +183,19 @@
 	/** Notification about a serious trouble with HC.
 	 */
-	IPC_M_USB_HCD_CONTROLLER_FAILURE
+	IPC_M_USB_HCD_CONTROLLER_FAILURE,
+	
+	
+	IPC_M_USB_HCD_INTERRUPT_OUT_DONE,
+	IPC_M_USB_HCD_INTERRUPT_IN_DONE,
+	
+	IPC_M_USB_HCD_CONTROL_WRITE_SETUP_DONE,
+	IPC_M_USB_HCD_CONTROL_WRITE_DATA_DONE,
+	IPC_M_USB_HCD_CONTROL_WRITE_STATUS_DONE,
+	
+	IPC_M_USB_HCD_CONTROL_READ_SETUP_DONE,
+	IPC_M_USB_HCD_CONTROL_READ_DATA_DONE,
+	IPC_M_USB_HCD_CONTROL_READ_STATUS_DONE,
+	
+	/* IPC_M_USB_HCD_ */
 } usb_hcd_callback_method_t;
 
@@ -152,4 +206,24 @@
 int usb_hcd_prepare_data_reception(int, usb_target_t, usb_transfer_type_t,
     size_t, usb_transaction_handle_t *);
+
+
+int usb_hcd_transfer_interrupt_out(int, usb_target_t,
+    void *, size_t, usb_transaction_handle_t *);
+int usb_hcd_transfer_interrupt_in(int, usb_target_t,
+    size_t, usb_transaction_handle_t *);
+
+int usb_hcd_transfer_control_write_setup(int, usb_target_t,
+    void *, size_t, usb_transaction_handle_t *);
+int usb_hcd_transfer_control_write_data(int, usb_target_t,
+    void *, size_t, usb_transaction_handle_t *);
+int usb_hcd_transfer_control_write_status(int, usb_target_t,
+    usb_transaction_handle_t *);
+
+int usb_hcd_transfer_control_read_setup(int, usb_target_t,
+    void *, size_t, usb_transaction_handle_t *);
+int usb_hcd_transfer_control_read_data(int, usb_target_t,
+    size_t, usb_transaction_handle_t *);
+int usb_hcd_transfer_control_read_status(int, usb_target_t,
+    usb_transaction_handle_t *);
 
 #endif
