Index: uspace/drv/bus/usb/usbhub/port.c
===================================================================
--- uspace/drv/bus/usb/usbhub/port.c	(revision 27572478bbfb68a5fe352b71315dfcd899880838)
+++ uspace/drv/bus/usb/usbhub/port.c	(revision 0918382f0dd2d21d3af74f39f202b3e0a296bcc8)
@@ -64,5 +64,5 @@
 {
 	assert(port);
-	if (port->attached_handle != USB_DEVICE_HANDLE_INVALID)
+	if (port->device_attached)
 		return usb_hub_port_device_gone(port, hub);
 	return EOK;
@@ -139,10 +139,10 @@
 	assert(port);
 	assert(hub);
-	usb_log_debug("Interrupt at port %zu\n", port->port_number);
+	usb_log_debug("Interrupt at port %u\n", port->port_number);
 
 	usb_port_status_t status = 0;
 	const int opResult = get_port_status(port, &status);
 	if (opResult != EOK) {
-		usb_log_error("Failed to get port %zu status: %s.\n",
+		usb_log_error("Failed to get port %u status: %s.\n",
 		    port->port_number, str_error(opResult));
 		return;
@@ -153,5 +153,5 @@
 		const bool connected =
 		    (status & USB_HUB_PORT_STATUS_CONNECTION) != 0;
-		usb_log_debug("Connection change on port %zu: device %s.\n",
+		usb_log_debug("Connection change on port %u: device %s.\n",
 		    port->port_number, connected ? "attached" : "removed");
 
@@ -169,5 +169,5 @@
 			if (opResult != EOK) {
 				usb_log_error(
-				    "Cannot handle change on port %zu: %s.\n",
+				    "Cannot handle change on port %u: %s.\n",
 				    port->port_number, str_error(opResult));
 			}
@@ -183,5 +183,5 @@
 	/* Enable change, ports are automatically disabled on errors. */
 	if (status & USB_HUB_PORT_C_STATUS_ENABLED) {
-		usb_log_info("Port %zu, disabled because of errors.\n",
+		usb_log_info("Port %u, disabled because of errors.\n",
 		   port->port_number);
 		usb_hub_port_device_gone(port, hub);
@@ -190,5 +190,5 @@
 		if (rc != EOK) {
 			usb_log_error(
-			    "Failed to clear port %zu enable change feature: "
+			    "Failed to clear port %u enable change feature: "
 			    "%s.\n", port->port_number, str_error(rc));
 		}
@@ -198,5 +198,5 @@
 	/* Suspend change */
 	if (status & USB_HUB_PORT_C_STATUS_SUSPEND) {
-		usb_log_error("Port %zu went to suspend state, this should"
+		usb_log_error("Port %u went to suspend state, this should"
 		    "NOT happen as we do not support suspend state!",
 		    port->port_number);
@@ -205,5 +205,5 @@
 		if (rc != EOK) {
 			usb_log_error(
-			    "Failed to clear port %zu suspend change feature: "
+			    "Failed to clear port %u suspend change feature: "
 			    "%s.\n", port->port_number, str_error(rc));
 		}
@@ -221,5 +221,5 @@
 		if (rc != EOK) {
 			usb_log_error(
-			    "Failed to clear port %zu OC change feature: %s.\n",
+			    "Failed to clear port %u OC change feature: %s.\n",
 			    port->port_number, str_error(rc));
 		}
@@ -229,5 +229,5 @@
 			if (rc != EOK) {
 				usb_log_error(
-				    "Failed to set port %zu power after OC:"
+				    "Failed to set port %u power after OC:"
 				    " %s.\n", port->port_number, str_error(rc));
 			}
@@ -240,5 +240,5 @@
 	}
 
-	usb_log_debug("Port %zu status 0x%08" PRIx32 "\n",
+	usb_log_debug("Port %u status %#08" PRIx32 "\n",
 	    port->port_number, status);
 }
@@ -260,8 +260,8 @@
 	if (!exch)
 		return ENOMEM;
-	const int rc = usb_device_remove(exch, port->attached_handle);
+	const int rc = usb_device_remove(exch, port->port_number);
 	usb_device_bus_exchange_end(exch);
 	if (rc == EOK)
-		port->attached_handle = -1;
+		port->device_attached = false;
 	return rc;
 
@@ -286,8 +286,8 @@
 
 	if (port->reset_okay) {
-		usb_log_debug("Port %zu reset complete.\n", port->port_number);
+		usb_log_debug("Port %u reset complete.\n", port->port_number);
 	} else {
 		usb_log_warning(
-		    "Port %zu reset complete but port not enabled.\n",
+		    "Port %u reset complete but port not enabled.\n",
 		    port->port_number);
 	}
@@ -299,5 +299,5 @@
 	if (rc != EOK) {
 		usb_log_error(
-		    "Failed to clear port %zu reset change feature: %s.\n",
+		    "Failed to clear port %u reset change feature: %s.\n",
 		    port->port_number, str_error(rc));
 	}
@@ -407,5 +407,5 @@
 	port_enable(port, true);
 	if (!port->reset_completed || !port->reset_okay) {
-		usb_log_error("Failed to reset port %zu\n", port->port_number);
+		usb_log_error("Failed to reset port %u\n", port->port_number);
 		if (usb_release_default_address(exch) != EOK)
 			usb_log_warning("Failed to release default address\n");
@@ -414,9 +414,10 @@
 	}
 
-	ret = usb_device_enumerate(exch, &port->attached_handle);
+	ret = usb_device_enumerate(exch, port->port_number);
 	if (ret != EOK) {
-		usb_log_error("Failed to reset port %zu\n", port->port_number);
+		usb_log_error("Failed to enumerate device on port %u\n",
+		    port->port_number);
 		if (port_enable(port, false) != EOK) {
-			usb_log_warning("Failed to disable port %zu, NOT "
+			usb_log_warning("Failed to disable port %u, NOT "
 			    "releasing default address.\n", port->port_number);
 		} else {
@@ -426,4 +427,5 @@
 		}
 	} else {
+		port->device_attached = true;
 		if (usb_release_default_address(exch) != EOK)
 			usb_log_warning("Failed to release default address\n");
Index: uspace/drv/bus/usb/usbhub/port.h
===================================================================
--- uspace/drv/bus/usb/usbhub/port.h	(revision 27572478bbfb68a5fe352b71315dfcd899880838)
+++ uspace/drv/bus/usb/usbhub/port.h	(revision 0918382f0dd2d21d3af74f39f202b3e0a296bcc8)
@@ -44,6 +44,6 @@
 /** Information about single port on a hub. */
 typedef struct {
-	/* Port number as reported in descriptors. */
-	size_t port_number;
+	/** Port number as reported in descriptors. */
+	unsigned port_number;
 	/** Device communication pipe. */
 	usb_pipe_t *control_pipe;
@@ -58,7 +58,6 @@
 	/** Whether to announce the port reset as successful. */
 	bool reset_okay;
-
-	usb_device_handle_t attached_handle;
-
+	/** Device reported to USB bus driver */
+	bool device_attached;
 } usb_hub_port_t;
 
@@ -67,5 +66,5 @@
  * @param port Port to be initialized.
  */
-static inline void usb_hub_port_init(usb_hub_port_t *port, size_t port_number,
+static inline void usb_hub_port_init(usb_hub_port_t *port, unsigned port_number,
     usb_pipe_t *control_pipe)
 {
@@ -73,5 +72,7 @@
 	port->port_number = port_number;
 	port->control_pipe = control_pipe;
-	port->attached_handle = USB_DEVICE_HANDLE_INVALID;
+	port->reset_completed = false;
+	port->reset_okay = false;
+	port->device_attached = false;
 	fibril_mutex_initialize(&port->mutex);
 	fibril_condvar_initialize(&port->reset_cv);
Index: uspace/drv/bus/usb/usbhub/usbhub.c
===================================================================
--- uspace/drv/bus/usb/usbhub/usbhub.c	(revision 27572478bbfb68a5fe352b71315dfcd899880838)
+++ uspace/drv/bus/usb/usbhub/usbhub.c	(revision 0918382f0dd2d21d3af74f39f202b3e0a296bcc8)
@@ -317,5 +317,5 @@
 
 		if (ret != EOK) {
-			usb_log_error("Cannot power on port %zu: %s.\n",
+			usb_log_error("Cannot power on port %u: %s.\n",
 			    hub_dev->ports[port].port_number, str_error(ret));
 		} else {
@@ -406,5 +406,5 @@
 		if (ret != EOK) {
 			usb_log_warning("HUB OVER-CURRENT GONE: Cannot power on"
-			    " port %zu: %s\n", hub_dev->ports[port].port_number,
+			    " port %u: %s\n", hub_dev->ports[port].port_number,
 			    str_error(ret));
 		} else {
Index: uspace/lib/drv/generic/remote_usb.c
===================================================================
--- uspace/lib/drv/generic/remote_usb.c	(revision 27572478bbfb68a5fe352b71315dfcd899880838)
+++ uspace/lib/drv/generic/remote_usb.c	(revision 0918382f0dd2d21d3af74f39f202b3e0a296bcc8)
@@ -139,13 +139,10 @@
  * @return Error code.
  */
-int usb_device_enumerate(async_exch_t *exch, usb_device_handle_t *handle)
-{
-	if (!exch || !handle)
-		return EBADMEM;
-	sysarg_t h;
-	const int ret = async_req_1_1(exch, DEV_IFACE_ID(USB_DEV_IFACE),
-	    IPC_M_USB_DEVICE_ENUMERATE, &h);
-	if (ret == EOK)
-		*handle = (usb_device_handle_t)h;
+int usb_device_enumerate(async_exch_t *exch, unsigned port)
+{
+	if (!exch)
+		return EBADMEM;
+	const int ret = async_req_2_0(exch, DEV_IFACE_ID(USB_DEV_IFACE),
+	    IPC_M_USB_DEVICE_ENUMERATE, port);
 	return ret;
 }
@@ -156,10 +153,10 @@
  * @return Error code.
  */
-int usb_device_remove(async_exch_t *exch, usb_device_handle_t handle)
+int usb_device_remove(async_exch_t *exch, unsigned port)
 {
 	if (!exch)
 		return EBADMEM;
 	return async_req_2_0(exch, DEV_IFACE_ID(USB_DEV_IFACE),
-	    IPC_M_USB_DEVICE_REMOVE, handle);
+	    IPC_M_USB_DEVICE_REMOVE, port);
 }
 
@@ -381,11 +378,7 @@
 	}
 
-	usb_device_handle_t handle = 0;
-	const int ret = usb_iface->device_enumerate(fun, &handle);
-	if (ret != EOK) {
-		async_answer_0(callid, ret);
-	}
-
-	async_answer_1(callid, EOK, (sysarg_t) handle);
+	const unsigned port = DEV_IPC_GET_ARG1(*call);
+	const int ret = usb_iface->device_enumerate(fun, port);
+	async_answer_0(callid, ret);
 }
 
@@ -400,6 +393,6 @@
 	}
 
-	usb_device_handle_t handle = DEV_IPC_GET_ARG1(*call);
-	const int ret = usb_iface->device_remove(fun, handle);
+	const unsigned port = DEV_IPC_GET_ARG1(*call);
+	const int ret = usb_iface->device_remove(fun, port);
 	async_answer_0(callid, ret);
 }
Index: uspace/lib/drv/include/usb_iface.h
===================================================================
--- uspace/lib/drv/include/usb_iface.h	(revision 27572478bbfb68a5fe352b71315dfcd899880838)
+++ uspace/lib/drv/include/usb_iface.h	(revision 0918382f0dd2d21d3af74f39f202b3e0a296bcc8)
@@ -42,8 +42,4 @@
 #include <usb/usb.h>
 
-typedef intptr_t usb_device_handle_t;
-enum {
-	USB_DEVICE_HANDLE_INVALID = -1
-};
 typedef async_sess_t usb_dev_session_t;
 
@@ -58,6 +54,6 @@
 int usb_release_default_address(async_exch_t *);
 
-int usb_device_enumerate(async_exch_t *, usb_device_handle_t *);
-int usb_device_remove(async_exch_t *, usb_device_handle_t);
+int usb_device_enumerate(async_exch_t *, unsigned port);
+int usb_device_remove(async_exch_t *, unsigned port);
 
 int usb_register_endpoint(async_exch_t *, usb_endpoint_t, usb_transfer_type_t,
@@ -81,6 +77,6 @@
 	int (*release_default_address)(ddf_fun_t *);
 
-	int (*device_enumerate)(ddf_fun_t *, usb_device_handle_t *);
-	int (*device_remove)(ddf_fun_t *, usb_device_handle_t);
+	int (*device_enumerate)(ddf_fun_t *, unsigned);
+	int (*device_remove)(ddf_fun_t *, unsigned);
 
 	int (*register_endpoint)(ddf_fun_t *, usb_endpoint_t,
Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision 27572478bbfb68a5fe352b71315dfcd899880838)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision 0918382f0dd2d21d3af74f39f202b3e0a296bcc8)
@@ -77,8 +77,6 @@
 } usb_dev_t;
 
-static int hcd_ddf_new_device(ddf_dev_t *device, usb_dev_t *hub, unsigned port,
-    usb_address_t *id);
-static int hcd_ddf_remove_device(ddf_dev_t *device, usb_dev_t *hub,
-    usb_address_t id);
+static int hcd_ddf_new_device(ddf_dev_t *device, usb_dev_t *hub, unsigned port);
+static int hcd_ddf_remove_device(ddf_dev_t *device, usb_dev_t *hub, unsigned port);
 
 
@@ -164,5 +162,5 @@
 }
 
-static int device_enumerate(ddf_fun_t *fun, usb_device_handle_t *handle)
+static int device_enumerate(ddf_fun_t *fun, unsigned port)
 {
 	assert(fun);
@@ -171,14 +169,10 @@
 	assert(ddf_dev);
 	assert(dev);
-	usb_address_t address = 0;
-	unsigned port = 0; //TODO provide real value here
-	usb_log_debug("Device %d reported a new USB device\n", dev->address);
-	const int ret = hcd_ddf_new_device(ddf_dev, dev, port, &address);
-	if (ret == EOK && handle)
-		*handle = address;
-	return ret;
-}
-
-static int device_remove(ddf_fun_t *fun, usb_device_handle_t handle)
+	usb_log_debug("Hub %d reported a new USB device on port: %u\n",
+	    dev->address, port);
+	return hcd_ddf_new_device(ddf_dev, dev, port);
+}
+
+static int device_remove(ddf_fun_t *fun, unsigned port)
 {
 	assert(fun);
@@ -187,7 +181,7 @@
 	assert(ddf_dev);
 	assert(dev);
-	usb_log_debug("Hub `%s' reported removal of device %d\n",
-	    ddf_fun_get_name(fun), (int)handle);
-	return hcd_ddf_remove_device(ddf_dev, dev, (usb_address_t)handle);
+	usb_log_debug("Hub `%s' reported removal of device on port %u\n",
+	    ddf_fun_get_name(fun), port);
+	return hcd_ddf_remove_device(ddf_dev, dev, port);
 }
 
@@ -405,5 +399,5 @@
 
 static int hcd_ddf_remove_device(ddf_dev_t *device, usb_dev_t *hub,
-    usb_address_t id)
+    unsigned port)
 {
 	assert(device);
@@ -421,8 +415,8 @@
 	list_foreach(hub->devices, it) {
 		victim = list_get_instance(it, usb_dev_t, link);
-		if (victim->address == id)
+		if (victim->port == port)
 			break;
 	}
-	if (victim && victim->address == id) {
+	if (victim && victim->port == port) {
 		list_remove(&victim->link);
 		fibril_mutex_unlock(&hc_dev->guard);
@@ -432,6 +426,6 @@
 			hcd_release_address(hcd, victim->address);
 		} else {
-			usb_log_warning("Failed to unbind device %d: %s\n",
-			    id, str_error(ret));
+			usb_log_warning("Failed to unbind device `%s': %s\n",
+			    ddf_fun_get_name(victim->fun), str_error(ret));
 		}
 		return EOK;
@@ -440,6 +434,5 @@
 }
 
-static int hcd_ddf_new_device(ddf_dev_t *device, usb_dev_t *hub, unsigned port,
-    usb_address_t *id)
+static int hcd_ddf_new_device(ddf_dev_t *device, usb_dev_t *hub, unsigned port)
 {
 	assert(device);
@@ -552,8 +545,5 @@
 		hcd_remove_ep(hcd, target, USB_DIRECTION_BOTH);
 		hcd_release_address(hcd, target.address);
-		return ret;
-	}
-	if (ret == EOK && id)
-		*id = target.address;
+	}
 
 	return ret;
@@ -574,5 +564,5 @@
 
 	hcd_reserve_default_address(hcd, speed);
-	const int ret = hcd_ddf_new_device(device, NULL, 0, NULL);
+	const int ret = hcd_ddf_new_device(device, NULL, 0);
 	hcd_release_default_address(hcd);
 	return ret;
