Index: uspace/drv/ehci-hcd/hc_iface.c
===================================================================
--- uspace/drv/ehci-hcd/hc_iface.c	(revision 6ab7f3e94742316cc6a565a1bcb864ad3709c914)
+++ uspace/drv/ehci-hcd/hc_iface.c	(revision 98e15b16551f9af572ae85c17fe2f6c9362390aa)
@@ -48,32 +48,4 @@
 	    methodname, __FILE__, __LINE__)
 
-/** Reserve default address.
- *
- * This function may block the caller.
- *
- * @param[in] fun Device function the action was invoked on.
- * @param[in] speed Speed of the device for which the default address is
- *	reserved.
- * @return Error code.
- */
-static int reserve_default_address(ddf_fun_t *fun, usb_speed_t speed)
-{
-	UNSUPPORTED("reserve_default_address");
-
-	return ENOTSUP;
-}
-
-/** Release default address.
- *
- * @param[in] fun Device function the action was invoked on.
- * @return Error code.
- */
-static int release_default_address(ddf_fun_t *fun)
-{
-	UNSUPPORTED("release_default_address");
-
-	return ENOTSUP;
-}
-
 /** Found free USB address.
  *
@@ -332,6 +304,4 @@
 /** Host controller interface implementation for EHCI. */
 usbhc_iface_t ehci_hc_iface = {
-	.reserve_default_address = reserve_default_address,
-	.release_default_address = release_default_address,
 	.request_address = request_address,
 	.bind_address = bind_address,
Index: uspace/drv/usbhub/usbhub.c
===================================================================
--- uspace/drv/usbhub/usbhub.c	(revision 6ab7f3e94742316cc6a565a1bcb864ad3709c914)
+++ uspace/drv/usbhub/usbhub.c	(revision 98e15b16551f9af572ae85c17fe2f6c9362390aa)
@@ -515,4 +515,6 @@
 	fibril_mutex_unlock(&hub->pending_ops_mutex);
 
+	usb_device_destroy(hub->usb_device);
+
 	free(hub->ports);
 	free(hub);
Index: uspace/drv/usbmouse/init.c
===================================================================
--- uspace/drv/usbmouse/init.c	(revision 6ab7f3e94742316cc6a565a1bcb864ad3709c914)
+++ uspace/drv/usbmouse/init.c	(revision 98e15b16551f9af572ae85c17fe2f6c9362390aa)
@@ -39,4 +39,5 @@
 #include <usb/hid/hid.h>
 #include <usb/dev/request.h>
+#include <usb/hid/request.h>
 #include <errno.h>
 
@@ -126,8 +127,6 @@
 	
 	/* Set the boot protocol. */
-	rc = usb_control_request_set(&dev->ctrl_pipe,
-	    USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE,
-	    USB_HIDREQ_SET_PROTOCOL, USB_HID_PROTOCOL_BOOT, dev->interface_no,
-	    NULL, 0);
+	rc = usbhid_req_set_protocol(&dev->ctrl_pipe, dev->interface_no,
+	    USB_HID_PROTOCOL_BOOT);
 	if (rc != EOK) {
 		goto leave;
Index: uspace/drv/usbmouse/mouse.c
===================================================================
--- uspace/drv/usbmouse/mouse.c	(revision 6ab7f3e94742316cc6a565a1bcb864ad3709c914)
+++ uspace/drv/usbmouse/mouse.c	(revision 98e15b16551f9af572ae85c17fe2f6c9362390aa)
@@ -117,4 +117,6 @@
 	async_hangup(mouse->console_phone);
 	mouse->console_phone = -1;
+
+	usb_device_destroy(dev);
 }
 
Index: uspace/lib/drv/include/usbhc_iface.h
===================================================================
--- uspace/lib/drv/include/usbhc_iface.h	(revision 6ab7f3e94742316cc6a565a1bcb864ad3709c914)
+++ uspace/lib/drv/include/usbhc_iface.h	(revision 98e15b16551f9af572ae85c17fe2f6c9362390aa)
@@ -212,6 +212,4 @@
 /** USB host controller communication interface. */
 typedef struct {
-	int (*reserve_default_address)(ddf_fun_t *, usb_speed_t);
-	int (*release_default_address)(ddf_fun_t *);
 	int (*request_address)(ddf_fun_t *, usb_speed_t, usb_address_t *);
 	int (*bind_address)(ddf_fun_t *, usb_address_t, devman_handle_t);
Index: uspace/lib/usbdev/include/usb/dev/driver.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/driver.h	(revision 6ab7f3e94742316cc6a565a1bcb864ad3709c914)
+++ uspace/lib/usbdev/include/usb/dev/driver.h	(revision 98e15b16551f9af572ae85c17fe2f6c9362390aa)
@@ -168,4 +168,5 @@
 int usb_device_destroy_pipes(ddf_dev_t *, usb_endpoint_mapping_t *, size_t);
 int usb_device_create(ddf_dev_t *, usb_endpoint_description_t **, usb_device_t **, const char **);
+void usb_device_destroy(usb_device_t *);
 
 size_t usb_interface_count_alternates(uint8_t *, size_t, uint8_t);
Index: uspace/lib/usbdev/src/devdrv.c
===================================================================
--- uspace/lib/usbdev/src/devdrv.c	(revision 6ab7f3e94742316cc6a565a1bcb864ad3709c914)
+++ uspace/lib/usbdev/src/devdrv.c	(revision 98e15b16551f9af572ae85c17fe2f6c9362390aa)
@@ -533,4 +533,30 @@
 }
 
+/** Destroy instance of a USB device.
+ *
+ * @param dev Device to be destroyed.
+ */
+void usb_device_destroy(usb_device_t *dev)
+{
+	if (dev == NULL) {
+		return;
+	}
+
+	/* Ignore errors and hope for the best. */
+	usb_device_destroy_pipes(dev->ddf_dev, dev->pipes, dev->pipes_count);
+	if (dev->descriptors.configuration != NULL) {
+		free(dev->descriptors.configuration);
+	}
+
+	if (dev->alternate_interfaces != NULL) {
+		if (dev->alternate_interfaces->alternatives != NULL) {
+			free(dev->alternate_interfaces->alternatives);
+		}
+		free(dev->alternate_interfaces);
+	}
+
+	free(dev);
+}
+
 /**
  * @}
Index: uspace/srv/hid/console/console.c
===================================================================
--- uspace/srv/hid/console/console.c	(revision 6ab7f3e94742316cc6a565a1bcb864ad3709c914)
+++ uspace/srv/hid/console/console.c	(revision 98e15b16551f9af572ae85c17fe2f6c9362390aa)
@@ -57,4 +57,5 @@
 #include <io/style.h>
 #include <io/screenbuffer.h>
+#include <inttypes.h>
 
 #include "console.h"
@@ -67,4 +68,9 @@
 /** Interval for checking for new keyboard (1/4s). */
 #define HOTPLUG_WATCH_INTERVAL (1000 * 250)
+
+/* Kernel defines 32 but does not export it. */
+#define MAX_IPC_OUTGOING_PHONES 128
+/** To allow proper phone closing. */
+static ipc_callid_t driver_phones[MAX_IPC_OUTGOING_PHONES] = { 0 };
 
 /** Phone to the keyboard driver. */
@@ -90,4 +96,6 @@
 	                               contents and related settings. */
 } console_t;
+
+
 
 /** Array of data for virtual consoles */
@@ -401,4 +409,17 @@
 }
 
+static void close_driver_phone(ipc_callid_t hash)
+{
+	int i;
+	for (i = 0; i < MAX_IPC_OUTGOING_PHONES; i++) {
+		if (driver_phones[i] == hash) {
+			printf("Device %" PRIxn " gone.\n", hash);
+			driver_phones[i] = 0;
+			async_hangup(i);
+			return;
+		}
+	}
+}
+
 /** Handler for keyboard */
 static void keyboard_events(ipc_callid_t iid, ipc_call_t *icall)
@@ -415,4 +436,5 @@
 		case IPC_M_PHONE_HUNGUP:
 			/* TODO: Handle hangup */
+			close_driver_phone(iid);
 			return;
 		case KBD_EVENT:
@@ -458,4 +480,5 @@
 		case IPC_M_PHONE_HUNGUP:
 			/* TODO: Handle hangup */
+			close_driver_phone(iid);
 			return;
 		case MEVENT_BUTTON:
@@ -715,4 +738,25 @@
 }
 
+static int async_connect_to_me_hack(int phone, sysarg_t arg1, sysarg_t arg2,
+sysarg_t arg3, async_client_conn_t client_receiver, ipc_callid_t *hash)
+{
+	sysarg_t task_hash;
+	sysarg_t phone_hash;
+	int rc = async_req_3_5(phone, IPC_M_CONNECT_TO_ME, arg1, arg2, arg3,
+	    NULL, NULL, NULL, &task_hash, &phone_hash);
+	if (rc != EOK)
+		return rc;
+
+	if (client_receiver != NULL)
+		async_new_connection(task_hash, phone_hash, phone_hash, NULL,
+		    client_receiver);
+
+	if (hash != NULL) {
+		*hash = phone_hash;
+	}
+
+	return EOK;
+}
+
 static int connect_keyboard_or_mouse(const char *devname,
     async_client_conn_t handler, const char *path)
@@ -729,5 +773,7 @@
 	}
 	
-	int rc = async_connect_to_me(phone, SERVICE_CONSOLE, 0, 0, handler);
+	ipc_callid_t hash;
+	int rc = async_connect_to_me_hack(phone, SERVICE_CONSOLE, 0, phone,
+	    handler, &hash);
 	if (rc != EOK) {
 		printf(NAME ": " \
@@ -737,5 +783,7 @@
 	}
 	
-	printf(NAME ": found %s \"%s\".\n", devname, path);
+	driver_phones[phone] = hash;
+
+	printf(NAME ": found %s \"%s\" (%" PRIxn ").\n", devname, path, hash);
 
 	return phone;
