Index: uspace/drv/hid/usbhid/main.c
===================================================================
--- uspace/drv/hid/usbhid/main.c	(revision b233821094426bc1c07a4eb170426c511fa3bdd1)
+++ uspace/drv/hid/usbhid/main.c	(revision fcdab1e7f2666339b07146358eb663d5e441b470)
@@ -137,17 +137,9 @@
 }
 
-/**
- * Callback for when a device has just been from the driver.
- *
- * @param dev Structure representing the device.
- * @return Error code.
- */
-static int usb_hid_device_removed(usb_device_t *dev)
-{
-	assert(dev);
-	usb_hid_dev_t *hid_dev = usb_device_data_get(dev);
-	assert(hid_dev);
-
-	usb_log_info("%s endpoints unregistered, joining polling fibril.\n", usb_device_get_name(dev));
+static int join_and_clean(usb_device_t *dev)
+{
+	assert(dev);
+	usb_hid_dev_t *hid_dev = usb_device_data_get(dev);
+	assert(hid_dev);
 
 	/* Join polling fibril. */
@@ -165,4 +157,20 @@
 
 /**
+ * Callback for when a device has just been from the driver.
+ *
+ * @param dev Structure representing the device.
+ * @return Error code.
+ */
+static int usb_hid_device_removed(usb_device_t *dev)
+{
+	assert(dev);
+	usb_hid_dev_t *hid_dev = usb_device_data_get(dev);
+	assert(hid_dev);
+
+	usb_log_info("%s endpoints unregistered, joining polling fibril.\n", usb_device_get_name(dev));
+	return join_and_clean(dev);
+}
+
+/**
  * Callback for removing a device from the driver.
  *
@@ -178,19 +186,5 @@
 	usb_log_info("Device %s gone, joining the polling fibril.\n", usb_device_get_name(dev));
 	usb_hid_prepare_deinit(hid_dev);
-
-	unsigned tries = 100;
-	/* Wait for fail. */
-	while (hid_dev->running && tries--) {
-		async_usleep(100000);
-	}
-	if (hid_dev->running) {
-		usb_log_error("Can't remove hid, still running.\n");
-		return EBUSY;
-	}
-
-	usb_hid_deinit(hid_dev);
-	usb_log_info("%s destruction complete.\n", usb_device_get_name(dev));
-
-	return EOK;
+	return join_and_clean(dev);
 }
 
