Index: uspace/drv/vhc/addrmgm.c
===================================================================
--- uspace/drv/vhc/addrmgm.c	(revision 4689d4070d81166aa739ee444c90dffc369897ca)
+++ uspace/drv/vhc/addrmgm.c	(revision ce687bbe8bd15e602d59d8fa7a3af3ee1abc3fb6)
@@ -49,4 +49,5 @@
 typedef struct {
 	usb_address_t address;
+	devman_handle_t devman_handle;
 	bool available;
 } address_info_t;
@@ -69,4 +70,5 @@
 		dev_address[i].address = i + 1;
 		dev_address[i].available = true;
+		dev_address[i].devman_handle = 0;
 	}
 
@@ -120,4 +122,49 @@
 }
 
+int bind_address(device_t *dev, usb_address_t address, devman_handle_t handle)
+{
+	if (address == DEFAULT_ADDRESS) {
+		return EPERM;
+	}
+
+	int rc = EPERM;
+
+	fibril_mutex_lock(&address_guard);
+	usb_address_t i;
+	for (i = 0; i < ADDRESS_COUNT; i++) {
+		if (dev_address[i].address == address) {
+			if (dev_address[i].available) {
+				rc = ENOENT;
+				break;
+			}
+
+			dev_address[i].devman_handle = handle;
+			rc = EOK;
+			break;
+		}
+	}
+	fibril_mutex_unlock(&address_guard);
+
+	return rc;
+}
+
+int tell_address(device_t *dev, devman_handle_t handle, usb_address_t *address)
+{
+	int rc = ENOENT;
+
+	fibril_mutex_lock(&address_guard);
+	usb_address_t i;
+	for (i = 0; i < ADDRESS_COUNT; i++) {
+		if (dev_address[i].devman_handle == handle) {
+			*address = dev_address[i].address;
+			rc = EOK;
+			break;
+		}
+	}
+	fibril_mutex_unlock(&address_guard);
+
+	return rc;
+}
+
 int release_address(device_t *dev, usb_address_t address)
 {
@@ -138,4 +185,5 @@
 
 			dev_address[i].available = true;
+			dev_address[i].devman_handle = 0;
 			rc = EOK;
 			break;
Index: uspace/drv/vhc/conn.h
===================================================================
--- uspace/drv/vhc/conn.h	(revision 4689d4070d81166aa739ee444c90dffc369897ca)
+++ uspace/drv/vhc/conn.h	(revision ce687bbe8bd15e602d59d8fa7a3af3ee1abc3fb6)
@@ -52,5 +52,7 @@
 int request_address(device_t *, usb_address_t *);
 int release_address(device_t *, usb_address_t);
+int bind_address(device_t *, usb_address_t, devman_handle_t);
 
+int tell_address(device_t *, devman_handle_t, usb_address_t *);
 
 void default_connection_handler(device_t *, ipc_callid_t, ipc_call_t *);
Index: uspace/drv/vhc/connhost.c
===================================================================
--- uspace/drv/vhc/connhost.c	(revision 4689d4070d81166aa739ee444c90dffc369897ca)
+++ uspace/drv/vhc/connhost.c	(revision ce687bbe8bd15e602d59d8fa7a3af3ee1abc3fb6)
@@ -148,10 +148,4 @@
 
 
-static int get_address(device_t *dev, devman_handle_t handle,
-    usb_address_t *address)
-{
-	return ENOTSUP;
-}
-
 static int interrupt_out(device_t *dev, usb_target_t target,
     void *data, size_t size,
@@ -226,9 +220,10 @@
 
 usbhc_iface_t vhc_iface = {
-	.tell_address = get_address,
+	.tell_address = tell_address,
 
 	.reserve_default_address = reserve_default_address,
 	.release_default_address = release_default_address,
 	.request_address = request_address,
+	.bind_address = bind_address,
 	.release_address = release_address,
 
