Index: uspace/drv/bus/usb/ehci/ehci_bus.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_bus.c	(revision 3ac86a42de2e8948db2e3047654b63338c68e55f)
+++ uspace/drv/bus/usb/ehci/ehci_bus.c	(revision 7278cbc90a2d93600a02b53f8b6fdbeeba7ca711)
@@ -70,6 +70,4 @@
 	endpoint_init(&ehci_ep->base, dev, desc);
 
-	// TODO: extract USB2 information from desc
-	
 	if (dma_buffer_alloc(&ehci_ep->dma_buffer, sizeof(qh_t)))
 		return NULL;
Index: uspace/drv/bus/usb/ehci/endpoint_list.c
===================================================================
--- uspace/drv/bus/usb/ehci/endpoint_list.c	(revision 3ac86a42de2e8948db2e3047654b63338c68e55f)
+++ uspace/drv/bus/usb/ehci/endpoint_list.c	(revision 7278cbc90a2d93600a02b53f8b6fdbeeba7ca711)
@@ -95,4 +95,5 @@
 {
 	assert(instance);
+	assert(instance->list_head);
 	assert(ep);
 	assert(ep->qh);
Index: uspace/drv/bus/usb/ehci/hc.c
===================================================================
--- uspace/drv/bus/usb/ehci/hc.c	(revision 3ac86a42de2e8948db2e3047654b63338c68e55f)
+++ uspace/drv/bus/usb/ehci/hc.c	(revision 7278cbc90a2d93600a02b53f8b6fdbeeba7ca711)
@@ -236,6 +236,6 @@
 	assert(ep);
 	ehci_endpoint_t *ehci_ep = ehci_endpoint_get(ep);
-	usb_log_debug("HC(%p) dequeue EP(?:%d:%s:%s)", instance,
-	    ep->endpoint,
+	usb_log_debug("HC(%p) dequeue EP(%d:%d:%s:%s)", instance,
+	    ep->device->address, ep->endpoint,
 	    usb_str_transfer_type_short(ep->transfer_type),
 	    usb_str_direction(ep->direction));
@@ -360,7 +360,4 @@
 
 	if (status & (USB_STS_IRQ_FLAG | USB_STS_ERR_IRQ_FLAG)) {
-
-		LIST_INITIALIZE(completed);
-
 		fibril_mutex_lock(&hc->guard);
 
Index: uspace/lib/usbhost/src/bus.c
===================================================================
--- uspace/lib/usbhost/src/bus.c	(revision 3ac86a42de2e8948db2e3047654b63338c68e55f)
+++ uspace/lib/usbhost/src/bus.c	(revision 7278cbc90a2d93600a02b53f8b6fdbeeba7ca711)
@@ -208,4 +208,5 @@
 
 	const bus_ops_t *ops = BUS_OPS_LOOKUP(dev->bus->ops, device_gone);
+	const bus_ops_t *ep_ops = BUS_OPS_LOOKUP(dev->bus->ops, endpoint_unregister);
 	assert(ops);
 
@@ -240,8 +241,14 @@
 
 	/* Tell the HC to release its resources. */
-	ops->device_gone(dev);
-
-	/* Release the EP0 bus reference */
-	endpoint_del_ref(dev->endpoints[0]);
+	if (ops)
+		ops->device_gone(dev);
+
+	/* Check whether the driver didn't forgot EP0 */
+	if (dev->endpoints[0]) {
+		if (ep_ops)
+			ep_ops->endpoint_unregister(dev->endpoints[0]);
+		/* Release the EP0 bus reference */
+		endpoint_del_ref(dev->endpoints[0]);
+	}
 
 	/* Destroy the function, freeing also the device, unlocking mutex. */
Index: uspace/lib/usbhost/src/usb2_bus.c
===================================================================
--- uspace/lib/usbhost/src/usb2_bus.c	(revision 3ac86a42de2e8948db2e3047654b63338c68e55f)
+++ uspace/lib/usbhost/src/usb2_bus.c	(revision 7278cbc90a2d93600a02b53f8b6fdbeeba7ca711)
@@ -209,9 +209,4 @@
 }
 
-static void usb2_bus_device_gone(device_t *dev)
-{
-	// TODO: Implement me!
-}
-
 /**
  * Register an endpoint to the bus. Reserves bandwidth.
@@ -245,5 +240,4 @@
 const bus_ops_t usb2_bus_ops = {
 	.device_enumerate = usb2_bus_device_enumerate,
-	.device_gone = usb2_bus_device_gone,
 	.endpoint_register = usb2_bus_register_ep,
 	.endpoint_unregister = usb2_bus_unregister_ep,
