Index: uspace/drv/vhc/Makefile
===================================================================
--- uspace/drv/vhc/Makefile	(revision 36c410e0479cfedf76affb9d3299a08fb1692755)
+++ uspace/drv/vhc/Makefile	(revision 54b141a17a6b51229fb2b53aa7649071a50e21a0)
@@ -39,4 +39,5 @@
 
 SOURCES = \
+	addrmgm.c \
 	conndev.c \
 	connhost.c \
Index: uspace/drv/vhc/addrmgm.c
===================================================================
--- uspace/drv/vhc/addrmgm.c	(revision 54b141a17a6b51229fb2b53aa7649071a50e21a0)
+++ uspace/drv/vhc/addrmgm.c	(revision 54b141a17a6b51229fb2b53aa7649071a50e21a0)
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2010 Vojtech Horky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup usb
+ * @{
+ */
+/** @file
+ * @brief Address management.
+ */
+
+#include <usb/usb.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <str_error.h>
+#include <fibril_synch.h>
+
+#include "vhcd.h"
+#include "conn.h"
+
+#define ADDRESS_COUNT 100
+#define DEFAULT_ADDRESS 0
+
+typedef struct {
+	usb_address_t address;
+	bool available;
+} address_info_t;
+
+static address_info_t dev_address[ADDRESS_COUNT];
+fibril_mutex_t address_guard;
+
+typedef struct {
+	fibril_mutex_t condvar_guard;
+	fibril_condvar_t condvar;
+	bool available;
+} reservable_address_info_t;
+
+static reservable_address_info_t default_address;
+
+void address_init(void)
+{
+	usb_address_t i;
+	for (i = 0; i < ADDRESS_COUNT; i++) {
+		dev_address[i].address = i + 1;
+		dev_address[i].available = true;
+	}
+
+	fibril_mutex_initialize(&address_guard);
+	fibril_mutex_initialize(&default_address.condvar_guard);
+	fibril_condvar_initialize(&default_address.condvar);
+}
+
+int reserve_default_address(device_t *dev)
+{
+	fibril_mutex_lock(&default_address.condvar_guard);
+	while (!default_address.available) {
+		fibril_condvar_wait(&default_address.condvar,
+		    &default_address.condvar_guard);
+	}
+	fibril_mutex_unlock(&default_address.condvar_guard);
+
+	return EOK;
+}
+
+int release_default_address(device_t *dev)
+{
+	fibril_mutex_lock(&default_address.condvar_guard);
+	default_address.available = true;
+	fibril_condvar_signal(&default_address.condvar);
+	fibril_mutex_unlock(&default_address.condvar_guard);
+
+	return EOK;
+}
+
+int request_address(device_t *dev, usb_address_t *address)
+{
+	fibril_mutex_lock(&address_guard);
+	usb_address_t i;
+	bool found = false;
+	for (i = 0; i < ADDRESS_COUNT; i++) {
+		if (dev_address[i].available) {
+			dev_address[i].available = false;
+			*address = dev_address[i].address;
+			found = true;
+			break;
+		}
+	}
+	fibril_mutex_unlock(&address_guard);
+
+	if (!found) {
+		return ELIMIT;
+	} else {
+		return EOK;
+	}
+}
+
+int release_address(device_t *dev, usb_address_t address)
+{
+	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].available = true;
+			rc = EOK;
+			break;
+		}
+	}
+	fibril_mutex_unlock(&address_guard);
+
+	return rc;
+}
+
+/**
+ * @}
+ */
Index: uspace/drv/vhc/conn.h
===================================================================
--- uspace/drv/vhc/conn.h	(revision 36c410e0479cfedf76affb9d3299a08fb1692755)
+++ uspace/drv/vhc/conn.h	(revision 54b141a17a6b51229fb2b53aa7649071a50e21a0)
@@ -47,4 +47,11 @@
 usbhc_iface_t vhc_iface;
 
+void address_init(void);
+int reserve_default_address(device_t *);
+int release_default_address(device_t *);
+int request_address(device_t *, usb_address_t *);
+int release_address(device_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 36c410e0479cfedf76affb9d3299a08fb1692755)
+++ uspace/drv/vhc/connhost.c	(revision 54b141a17a6b51229fb2b53aa7649071a50e21a0)
@@ -227,9 +227,17 @@
 usbhc_iface_t vhc_iface = {
 	.tell_address = get_address,
+
+	.reserve_default_address = reserve_default_address,
+	.release_default_address = release_default_address,
+	.request_address = request_address,
+	.release_address = release_address,
+
 	.interrupt_out = interrupt_out,
 	.interrupt_in = interrupt_in,
+
 	.control_write_setup = control_write_setup,
 	.control_write_data = control_write_data,
 	.control_write_status = control_write_status,
+
 	.control_read_setup = control_read_setup,
 	.control_read_data = control_read_data,
Index: uspace/drv/vhc/hcd.c
===================================================================
--- uspace/drv/vhc/hcd.c	(revision 36c410e0479cfedf76affb9d3299a08fb1692755)
+++ uspace/drv/vhc/hcd.c	(revision 54b141a17a6b51229fb2b53aa7649071a50e21a0)
@@ -72,4 +72,9 @@
 
 	/*
+	 * Initialize address management.
+	 */
+	address_init();
+
+	/*
 	 * Initialize our hub and announce its presence.
 	 */
