Index: uspace/drv/hid/usbhid/generic/hiddev.c
===================================================================
--- uspace/drv/hid/usbhid/generic/hiddev.c	(revision 71f211f6909eb71f441da24a2ff90c3ecefd18fd)
+++ uspace/drv/hid/usbhid/generic/hiddev.c	(revision 91173333ffad8030d872b4bac54acc3311e9e3c1)
@@ -220,5 +220,5 @@
 {
 	/* Continue polling until the device is about to be removed. */
-	return !hid_dev->poll_stop;
+	return true;
 }
 
Index: uspace/drv/hid/usbhid/kbd/kbddev.c
===================================================================
--- uspace/drv/hid/usbhid/kbd/kbddev.c	(revision 71f211f6909eb71f441da24a2ff90c3ecefd18fd)
+++ uspace/drv/hid/usbhid/kbd/kbddev.c	(revision 91173333ffad8030d872b4bac54acc3311e9e3c1)
@@ -710,5 +710,5 @@
 
 	/* Continue polling until the device is about to be removed. */
-	return !hid_dev->poll_stop;
+	return true;
 }
 
Index: uspace/drv/hid/usbhid/main.c
===================================================================
--- uspace/drv/hid/usbhid/main.c	(revision 71f211f6909eb71f441da24a2ff90c3ecefd18fd)
+++ uspace/drv/hid/usbhid/main.c	(revision 91173333ffad8030d872b4bac54acc3311e9e3c1)
@@ -40,5 +40,4 @@
 #include <errno.h>
 #include <str_error.h>
-#include <fibril_synch.h>
 
 #include <usb/dev/driver.h>
@@ -117,4 +116,20 @@
 }
 
+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. */
+	usb_device_poll_join(hid_dev->polling);
+
+	/* Clean up. */
+	usb_hid_deinit(hid_dev);
+	usb_log_info("%s destruction complete.\n", usb_device_get_name(dev));
+
+	return EOK;
+}
+
 /**
  * Callback for a device about to be removed from the driver.
@@ -129,42 +144,5 @@
 	assert(hid_dev);
 
-	usb_log_info("%s will be removed, setting remove flag.\n", usb_device_get_name(dev));
-	usb_hid_prepare_deinit(hid_dev);
-
-	return EOK;
-}
-
-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. */
-	fibril_mutex_lock(&hid_dev->poll_guard);
-	while (hid_dev->running)
-		fibril_condvar_wait(&hid_dev->poll_cv, &hid_dev->poll_guard);
-	fibril_mutex_unlock(&hid_dev->poll_guard);
-
-	/* Clean up. */
-	usb_hid_deinit(hid_dev);
-	usb_log_info("%s destruction complete.\n", usb_device_get_name(dev));
-
-	return EOK;
-}
-
-/**
- * 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));
+	usb_log_info("Device %s removed.\n", usb_device_get_name(dev));
 	return join_and_clean(dev);
 }
@@ -182,6 +160,5 @@
 	assert(hid_dev);
 
-	usb_log_info("Device %s gone, joining the polling fibril.\n", usb_device_get_name(dev));
-	usb_hid_prepare_deinit(hid_dev);
+	usb_log_info("Device %s gone.\n", usb_device_get_name(dev));
 	return join_and_clean(dev);
 }
@@ -191,5 +168,4 @@
 	.device_add = usb_hid_device_add,
 	.device_remove = usb_hid_device_remove,
-	.device_removed = usb_hid_device_removed,
 	.device_gone = usb_hid_device_gone,
 };
Index: uspace/drv/hid/usbhid/mouse/mousedev.c
===================================================================
--- uspace/drv/hid/usbhid/mouse/mousedev.c	(revision 71f211f6909eb71f441da24a2ff90c3ecefd18fd)
+++ uspace/drv/hid/usbhid/mouse/mousedev.c	(revision 91173333ffad8030d872b4bac54acc3311e9e3c1)
@@ -415,5 +415,5 @@
 
 	/* Continue polling until the device is about to be removed. */
-	return !hid_dev->poll_stop;
+	return true;
 }
 
Index: uspace/drv/hid/usbhid/multimedia/multimedia.c
===================================================================
--- uspace/drv/hid/usbhid/multimedia/multimedia.c	(revision 71f211f6909eb71f441da24a2ff90c3ecefd18fd)
+++ uspace/drv/hid/usbhid/multimedia/multimedia.c	(revision 91173333ffad8030d872b4bac54acc3311e9e3c1)
@@ -246,5 +246,5 @@
 	usb_hid_report_path_t *path = usb_hid_report_path();
 	if (path == NULL)
-		return !hid_dev->poll_stop; /* This might be a temporary failure. */
+		return true; /* This might be a temporary failure. */
 
 	int ret =
@@ -252,5 +252,5 @@
 	if (ret != EOK) {
 		usb_hid_report_path_free(path);
-		return !hid_dev->poll_stop; /* This might be a temporary failure. */
+		return true; /* This might be a temporary failure. */
 	}
 
@@ -284,5 +284,5 @@
 	usb_hid_report_path_free(path);
 
-	return !hid_dev->poll_stop;
+	return true;
 }
 /**
Index: uspace/drv/hid/usbhid/usbhid.c
===================================================================
--- uspace/drv/hid/usbhid/usbhid.c	(revision 71f211f6909eb71f441da24a2ff90c3ecefd18fd)
+++ uspace/drv/hid/usbhid/usbhid.c	(revision 91173333ffad8030d872b4bac54acc3311e9e3c1)
@@ -355,8 +355,4 @@
 	hid_dev->poll_pipe_mapping = NULL;
 
-	hid_dev->poll_stop = false;
-	fibril_mutex_initialize(&hid_dev->poll_guard);
-	fibril_condvar_initialize(&hid_dev->poll_cv);
-
 	int rc = usb_hid_check_pipes(hid_dev, dev);
 	if (rc != EOK) {
@@ -506,5 +502,5 @@
 
 	/* Continue polling until the device is about to be removed. */
-	return hid_dev->running && !hid_dev->poll_stop;
+	return hid_dev->running;
 }
 
@@ -524,9 +520,4 @@
 
 	hid_dev->running = false;
-
-	/* Signal polling end to joining thread. */
-	fibril_mutex_lock(&hid_dev->poll_guard);
-	fibril_condvar_signal(&hid_dev->poll_cv);
-	fibril_mutex_unlock(&hid_dev->poll_guard);
 }
 
@@ -539,10 +530,4 @@
 {
 	return hid_dev->report_nr;
-}
-
-void usb_hid_prepare_deinit(usb_hid_dev_t *hid_dev)
-{
-	assert(hid_dev);
-	hid_dev->poll_stop = true;
 }
 
Index: uspace/drv/hid/usbhid/usbhid.h
===================================================================
--- uspace/drv/hid/usbhid/usbhid.h	(revision 71f211f6909eb71f441da24a2ff90c3ecefd18fd)
+++ uspace/drv/hid/usbhid/usbhid.h	(revision 91173333ffad8030d872b4bac54acc3311e9e3c1)
@@ -46,5 +46,4 @@
 #include <usb/hid/hid.h>
 #include <stdbool.h>
-#include <fibril_synch.h>
 
 typedef struct usb_hid_dev usb_hid_dev_t;
@@ -135,11 +134,4 @@
 	int report_nr;
 	volatile bool running;
-
-	/** True if polling should stop as soon as possible */
-	volatile bool poll_stop;
-
-	/** Synchronization primitives for joining polling end. */
-	fibril_mutex_t poll_guard;
-	fibril_condvar_t poll_cv;
 };
 
@@ -147,6 +139,4 @@
 
 int usb_hid_init(usb_hid_dev_t *hid_dev, usb_device_t *dev);
-
-void usb_hid_prepare_deinit(usb_hid_dev_t *hid_dev);
 
 void usb_hid_deinit(usb_hid_dev_t *hid_dev);
