Index: uspace/lib/usbhost/src/usb2_bus.c
===================================================================
--- uspace/lib/usbhost/src/usb2_bus.c	(revision deb2e558ccc886ffade58c2d64c4943b78c3e855)
+++ uspace/lib/usbhost/src/usb2_bus.c	(revision 415c5116c12fd6d1b99d9cb3a5f9ddf5c125b5ea)
@@ -367,7 +367,28 @@
 	assert(bus);
 
-	// FIXME: Implement me!
-
-	return ENOTSUP;
+	int err;
+	/* Tear down all drivers working with the device. */
+	if ((err = ddf_fun_offline(device->fun))) {
+		return err;
+	}
+
+	/* Block creation of new endpoints and transfers. */
+	usb_log_info("Device(%d): Going offline.", device->address);
+	fibril_mutex_lock(&device->guard);
+	device->online = false;
+	fibril_mutex_unlock(&device->guard);
+
+	/* FIXME: This implementation leaves sleeping parts of drivers around.
+	 * With XHCI bus, the HID driver disengages and completely deactivates
+	 * when the DDF function is offlined. In USB2 bus, the driver receives
+	 * dev_remove and disengages "on paper" but later when interrupt message arrives,
+	 * some sleeping code is woken up and crashes the driver.
+	 *
+	 * The XHCI does 2 extra things that might prevent this behavior:
+	 *   (1) deconfigure the device,
+	 *   (2) deallocate all transfer TRB rings
+	 */
+
+	return EOK;
 }
 
