Index: uspace/drv/vhc/hub/hub.c
===================================================================
--- uspace/drv/vhc/hub/hub.c	(revision 875e7227836fe62c1550735e1e0be10ed9e5f60b)
+++ uspace/drv/vhc/hub/hub.c	(revision e0ba26baffd607ec49b265ed69bf2ca065e113c0)
@@ -155,4 +155,26 @@
 }
 
+/** Disconnects a device from a hub.
+ *
+ * @param hub Hub the device was connected to.
+ * @param device Device to be disconnected.
+ * @return Error code.
+ */
+int hub_disconnect_device(hub_t *hub, void *device)
+{
+	size_t index = hub_find_device(hub, device);
+	if (index == (size_t) -1) {
+		return ENOENT;
+	}
+
+	hub_port_t *port = &hub->ports[index];
+
+	port->connected_device = NULL;
+	port->state = HUB_PORT_STATE_DISCONNECTED;
+	set_port_status_change(port, HUB_STATUS_C_PORT_CONNECTION);
+
+	return EOK;
+}
+
 /** Find port device is connected to.
  *
Index: uspace/drv/vhc/hub/hub.h
===================================================================
--- uspace/drv/vhc/hub/hub.h	(revision 875e7227836fe62c1550735e1e0be10ed9e5f60b)
+++ uspace/drv/vhc/hub/hub.h	(revision e0ba26baffd607ec49b265ed69bf2ca065e113c0)
@@ -94,4 +94,5 @@
 void hub_init(hub_t *);
 size_t hub_connect_device(hub_t *, void *);
+int hub_disconnect_device(hub_t *, void *);
 size_t hub_find_device(hub_t *, void *);
 void hub_acquire(hub_t *);
Index: uspace/drv/vhc/hub/virthub.c
===================================================================
--- uspace/drv/vhc/hub/virthub.c	(revision 875e7227836fe62c1550735e1e0be10ed9e5f60b)
+++ uspace/drv/vhc/hub/virthub.c	(revision e0ba26baffd607ec49b265ed69bf2ca065e113c0)
@@ -203,5 +203,5 @@
 
 	hub_acquire(hub);
-	/* TODO: implement. */
+	hub_disconnect_device(hub, conn);
 	hub_release(hub);
 
