Index: uspace/lib/drv/generic/remote_usbhc.c
===================================================================
--- uspace/lib/drv/generic/remote_usbhc.c	(revision b12d3cc3ff8f0ff3656ec8964938909a8bb0ad7a)
+++ uspace/lib/drv/generic/remote_usbhc.c	(revision 8e423a2ded91473d6ca9d0ac5834bfcd9c00294a)
@@ -42,4 +42,5 @@
 #define USB_MAX_PAYLOAD_SIZE 1020
 
+static void remote_usbhc_get_address(device_t *, void *, ipc_callid_t, ipc_call_t *);
 static void remote_usbhc_get_buffer(device_t *, void *, ipc_callid_t, ipc_call_t *);
 static void remote_usbhc_interrupt_out(device_t *, void *, ipc_callid_t, ipc_call_t *);
@@ -49,7 +50,8 @@
 /** Remote USB interface operations. */
 static remote_iface_func_ptr_t remote_usbhc_iface_ops [] = {
-	&remote_usbhc_get_buffer,
-	&remote_usbhc_interrupt_out,
-	&remote_usbhc_interrupt_in
+	remote_usbhc_get_address,
+	remote_usbhc_get_buffer,
+	remote_usbhc_interrupt_out,
+	remote_usbhc_interrupt_in
 };
 
@@ -68,4 +70,24 @@
 } async_transaction_t;
 
+void remote_usbhc_get_address(device_t *device, void *iface,
+    ipc_callid_t callid, ipc_call_t *call)
+{
+	usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;
+
+	if (!usb_iface->tell_address) {
+		ipc_answer_0(callid, ENOTSUP);
+		return;
+	}
+
+	devman_handle_t handle = IPC_GET_ARG1(*call);
+
+	usb_address_t address;
+	int rc = usb_iface->tell_address(device, handle, &address);
+	if (rc != EOK) {
+		ipc_answer_0(callid, rc);
+	} else {
+		ipc_answer_1(callid, EOK, address);
+	}
+}
 
 void remote_usbhc_get_buffer(device_t *device, void *iface,
