Index: uspace/drv/usbkbd/main.c
===================================================================
--- uspace/drv/usbkbd/main.c	(revision e27595b02d72a0481e9c16c944a072b87ac5190a)
+++ uspace/drv/usbkbd/main.c	(revision 0e126be78770a2c37ac932b2e25dd35bdc34e12e)
@@ -41,5 +41,16 @@
 	usb_endpoint_t poll_endpoint = 1;
 
-	rc = usb_drv_async_interrupt_in(dev->parent_phone, poll_endpoint,
+	usb_address_t my_address = usb_drv_get_my_address(dev->parent_phone,
+	    dev);
+	if (my_address < 0) {
+		return;
+	}
+
+	usb_target_t poll_target = {
+		.address = my_address,
+		.endpoint = poll_endpoint
+	};
+
+	rc = usb_drv_async_interrupt_in(dev->parent_phone, poll_target,
 	    buffer, BUFFER_SIZE, &actual_size, &handle);
 	if (rc != EOK) {
Index: uspace/lib/usb/usbdrv.c
===================================================================
--- uspace/lib/usb/usbdrv.c	(revision e27595b02d72a0481e9c16c944a072b87ac5190a)
+++ uspace/lib/usb/usbdrv.c	(revision 0e126be78770a2c37ac932b2e25dd35bdc34e12e)
@@ -67,9 +67,20 @@
 }
 
+/** Tell USB address assigned to given device.
+ *
+ * @param phone Phone to my HC.
+ * @param dev Device in question.
+ * @return USB address or error code.
+ */
+usb_address_t usb_drv_get_my_address(int phone, device_t *dev)
+{
+	return ENOTSUP;
+}
+
 /** Send data to HCD.
  *
  * @param phone Phone to HC.
  * @param method Method used for calling.
- * @param endpoint Device endpoint.
+ * @param target Targeted device.
  * @param buffer Data buffer (NULL to skip data transfer phase).
  * @param size Buffer size (must be zero when @p buffer is NULL).
@@ -80,5 +91,5 @@
  */
 static int async_send_buffer(int phone, int method,
-    usb_endpoint_t endpoint,
+    usb_target_t target,
     void *buffer, size_t size,
     usb_handle_t *handle)
@@ -109,8 +120,8 @@
 	int rc;
 
-	transfer->request = async_send_3(phone,
+	transfer->request = async_send_4(phone,
 	    DEV_IFACE_ID(USB_DEV_IFACE),
 	    method,
-	    endpoint,
+	    target.address, target.endpoint,
 	    size,
 	    &transfer->reply);
@@ -133,5 +144,5 @@
  * @param phone Opened phone to HCD.
  * @param method Method used for calling.
- * @param endpoint Device endpoint.
+ * @param target Targeted device.
  * @param buffer Buffer where to store retrieved data
  * 	(NULL to skip data transfer phase).
@@ -145,5 +156,5 @@
  */
 static int async_recv_buffer(int phone, int method,
-    usb_endpoint_t endpoint,
+    usb_target_t target,
     void *buffer, size_t size, size_t *actual_size,
     usb_handle_t *handle)
@@ -172,8 +183,8 @@
 	transfer->phone = phone;
 
-	transfer->request = async_send_3(phone,
+	transfer->request = async_send_4(phone,
 	    DEV_IFACE_ID(USB_DEV_IFACE),
 	    method,
-	    endpoint,
+	    target.address, target.endpoint,
 	    size,
 	    &transfer->reply);
@@ -289,5 +300,5 @@
 
 /** Send interrupt data to device. */
-int usb_drv_async_interrupt_out(int phone, usb_endpoint_t endpoint,
+int usb_drv_async_interrupt_out(int phone, usb_target_t target,
     void *buffer, size_t size,
     usb_handle_t *handle)
@@ -295,5 +306,5 @@
 	return async_send_buffer(phone,
 	    IPC_M_USB_INTERRUPT_OUT,
-	    endpoint,
+	    target,
 	    buffer, size,
 	    handle);
@@ -301,5 +312,5 @@
 
 /** Request interrupt data from device. */
-int usb_drv_async_interrupt_in(int phone, usb_endpoint_t endpoint,
+int usb_drv_async_interrupt_in(int phone, usb_target_t target,
     void *buffer, size_t size, size_t *actual_size,
     usb_handle_t *handle)
@@ -307,5 +318,5 @@
 	return async_recv_buffer(phone,
 	    IPC_M_USB_INTERRUPT_IN,
-	    endpoint,
+	    target,
 	    buffer, size, actual_size,
 	    handle);
Index: uspace/lib/usb/usbdrv.h
===================================================================
--- uspace/lib/usb/usbdrv.h	(revision e27595b02d72a0481e9c16c944a072b87ac5190a)
+++ uspace/lib/usb/usbdrv.h	(revision 0e126be78770a2c37ac932b2e25dd35bdc34e12e)
@@ -41,7 +41,9 @@
 int usb_drv_hc_connect(device_t *, unsigned int);
 
-int usb_drv_async_interrupt_out(int, usb_endpoint_t,
+usb_address_t usb_drv_get_my_address(int, device_t *);
+
+int usb_drv_async_interrupt_out(int, usb_target_t,
     void *, size_t, usb_handle_t *);
-int usb_drv_async_interrupt_in(int, usb_endpoint_t,
+int usb_drv_async_interrupt_in(int, usb_target_t,
     void *, size_t, size_t *, usb_handle_t *);
 
