Index: uspace/drv/bus/usb/uhcirh/port.c
===================================================================
--- uspace/drv/bus/usb/uhcirh/port.c	(revision 1a4ea01d71d0d86b8d03725c943968a22fac7006)
+++ uspace/drv/bus/usb/uhcirh/port.c	(revision aa1922c9def555d208dc11181d2a48a7b676d816)
@@ -37,7 +37,7 @@
 #include <str_error.h>
 #include <async.h>
+#include <devman.h>
 
 #include <usb/usb.h>    /* usb_address_t */
-#include <usb/dev/hub.h>    /* usb_hc_new_device_wrapper */
 #include <usb/debug.h>
 
@@ -100,5 +100,6 @@
 	port->number = number;
 	port->wait_period_usec = usec;
-	port->attached_device = 0;
+	port->attached_device.handle = 0;
+	port->attached_device.address = -1;
 	port->rh = rh;
 
@@ -168,5 +169,5 @@
 
 		/* Remove any old device */
-		if (instance->attached_device) {
+		if (instance->attached_device.handle) {
 			usb_log_debug2("%s: Removing device.\n",
 			    instance->id_string);
@@ -257,9 +258,9 @@
 
 	int ret, count = 0;
-	usb_address_t dev_addr;
 	do {
 		ret = usb_hc_new_device_wrapper(port->rh, &port->hc_connection,
 		    speed, uhci_port_reset_enable, port->number, port,
-		    &dev_addr, &port->attached_device, NULL, NULL, NULL);
+		    &port->attached_device.address,
+		    &port->attached_device.handle, NULL, NULL, NULL);
 	} while (ret != EOK && ++count < 4);
 
@@ -272,5 +273,6 @@
 
 	usb_log_info("New device at port %u, address %d (handle %" PRIun ").\n",
-	    port->number, dev_addr, port->attached_device);
+	    port->number, port->attached_device.address,
+	    port->attached_device.handle);
 	return EOK;
 }
@@ -278,17 +280,32 @@
 /** Remove device.
  *
- * @param[in] port Memory structure to use.
- * @return Error code.
- *
- * Does not work, DDF does not support device removal.
- * Does not even free used USB address (it would be dangerous if tis driver
- * is still running).
+ * @param[in] port Port instance to use.
+ * @return Error code.
  */
 int uhci_port_remove_device(uhci_port_t *port)
 {
-	usb_log_error("%s: Don't know how to remove device %" PRIun ".\n",
-	    port->id_string, port->attached_device);
-	port->attached_device = 0;
-	return ENOTSUP;
+	usb_log_debug("Removing device on port %zu.\n", port->number);
+
+	/* Stop driver first */
+	int ret = devman_remove_function(port->attached_device.handle);
+	if (ret != EOK) {
+		usb_log_error("Failed to remove child function on port"
+		   " %zu: %s.\n", port->number, str_error(ret));
+		return ret;
+	}
+	port->attached_device.handle = 0;
+
+	/* Driver stopped, free used address */
+	ret = usb_hc_unregister_device(&port->hc_connection,
+	    port->attached_device.address);
+	if (ret != EOK) {
+		usb_log_error("Failed to unregister address of removed device: "
+		    "%s.\n", str_error(ret));
+		return ret;
+	}
+
+	port->attached_device.address = -1;
+	usb_log_info("Removed device on port %zu.\n", port->number);
+	return EOK;
 }
 /*----------------------------------------------------------------------------*/
Index: uspace/drv/bus/usb/uhcirh/port.h
===================================================================
--- uspace/drv/bus/usb/uhcirh/port.h	(revision 1a4ea01d71d0d86b8d03725c943968a22fac7006)
+++ uspace/drv/bus/usb/uhcirh/port.h	(revision aa1922c9def555d208dc11181d2a48a7b676d816)
@@ -39,4 +39,5 @@
 #include <ddf/driver.h>
 #include <usb/hc.h> /* usb_hc_connection_t */
+#include <usb/dev/hub.h>
 
 typedef uint16_t port_status_t;
@@ -62,5 +63,5 @@
 	usb_hc_connection_t hc_connection;
 	ddf_dev_t *rh;
-	devman_handle_t attached_device;
+	usb_hc_attached_device_t attached_device;
 	fid_t checker;
 } uhci_port_t;
