Index: uspace/drv/bus/usb/usbhub/usbhub.c
===================================================================
--- uspace/drv/bus/usb/usbhub/usbhub.c	(revision 91173333ffad8030d872b4bac54acc3311e9e3c1)
+++ uspace/drv/bus/usb/usbhub/usbhub.c	(revision 8b71f3e7d8255e3651a3c9506da74aec01714454)
@@ -161,23 +161,28 @@
 
 	/* Start hub operation. */
-	const usb_device_polling_config_t config = {
-		.debug = 1,
-		.auto_clear_halt = true,
-		.delay = -1,
-		.max_failures = 3,
-		.on_data = hub_port_changes_callback,
-		.on_polling_end = usb_hub_polling_terminated_callback,
-		.on_error = usb_hub_polling_error_callback,
-		.arg = hub_dev,
-	};
-
-	usb_endpoint_mapping_t *epm =
-	    usb_device_get_mapped_ep_desc(hub_dev->usb_device,
+	usb_polling_t *polling = &hub_dev->polling;
+	opResult = usb_polling_init(polling);
+	if (opResult != EOK) {
+		ddf_fun_unbind(hub_dev->hub_fun);
+		ddf_fun_destroy(hub_dev->hub_fun);
+		usb_log_error("Failed to initialize polling fibril: %s.\n",
+		    str_error(opResult));
+		return opResult;
+	}
+
+	polling->device = hub_dev->usb_device;
+	polling->ep_mapping = usb_device_get_mapped_ep_desc(hub_dev->usb_device,
 	    &hub_status_change_endpoint_description);
-	opResult = usb_device_poll(hub_dev->usb_device, epm, &config,
-	    ((hub_dev->port_count + 1 + 7) / 8), &hub_dev->polling);
-	
+	polling->request_size = ((hub_dev->port_count + 1 + 7) / 8);
+	polling->buffer = malloc(polling->request_size);
+	polling->on_data = hub_port_changes_callback;
+	polling->on_polling_end = usb_hub_polling_terminated_callback;
+	polling->on_error = usb_hub_polling_error_callback;
+	polling->arg = hub_dev;
+
+	opResult = usb_polling_start(polling);
 	if (opResult != EOK) {
 		/* Function is already bound */
+		free(polling->buffer);
 		ddf_fun_unbind(hub_dev->hub_fun);
 		ddf_fun_destroy(hub_dev->hub_fun);
@@ -186,4 +191,5 @@
 		return opResult;
 	}
+
 	hub_dev->running = true;
 	usb_log_info("Controlling hub '%s' (%p: %zu ports).\n",
@@ -197,4 +203,7 @@
 {
 	assert(!hub->running);
+
+	free(hub->polling.buffer);
+	usb_polling_fini(&hub->polling);
 
 	for (size_t port = 0; port < hub->port_count; ++port) {
@@ -233,6 +242,6 @@
 	usb_log_info("(%p) USB hub removed, joining polling fibril.", hub);
 
-	/* Join polling fibril. */
-	usb_device_poll_join(hub->polling);
+	/* Join polling fibril (ignoring error code). */
+	usb_polling_join(&hub->polling);
 	usb_log_info("(%p) USB hub polling stopped, freeing memory.", hub);
 
@@ -254,6 +263,6 @@
 	usb_log_info("(%p) USB hub gone, joining polling fibril.", hub);
 
-	/* Join polling fibril. */
-	usb_device_poll_join(hub->polling);
+	/* Join polling fibril (ignoring error code). */
+	usb_polling_join(&hub->polling);
 	usb_log_info("(%p) USB hub polling stopped, freeing memory.", hub);
 
Index: uspace/drv/bus/usb/usbhub/usbhub.h
===================================================================
--- uspace/drv/bus/usb/usbhub/usbhub.h	(revision 91173333ffad8030d872b4bac54acc3311e9e3c1)
+++ uspace/drv/bus/usb/usbhub/usbhub.h	(revision 8b71f3e7d8255e3651a3c9506da74aec01714454)
@@ -60,5 +60,5 @@
 	usb_device_t *usb_device;
 	/** Data polling handle. */
-	usb_device_polling_t *polling;
+	usb_polling_t polling;
 	/** Number of pending operations on the mutex to prevent shooting
 	 * ourselves in the foot.
Index: uspace/drv/hid/usbhid/main.c
===================================================================
--- uspace/drv/hid/usbhid/main.c	(revision 91173333ffad8030d872b4bac54acc3311e9e3c1)
+++ uspace/drv/hid/usbhid/main.c	(revision 8b71f3e7d8255e3651a3c9506da74aec01714454)
@@ -89,17 +89,5 @@
 	 * This will create a separate fibril that will query the device
 	 * for the data continuously. */
-	const usb_device_polling_config_t config = {
-		.debug = 1,
-		.auto_clear_halt = true,
-		.delay = -1,
-		.max_failures = 3,
-		.on_data = usb_hid_polling_callback,
-		.on_polling_end = usb_hid_polling_ended_callback,
-		.on_error = usb_hid_polling_error_callback,
-		.arg = hid_dev,
-	};
-
-	rc = usb_device_poll(dev, hid_dev->poll_pipe_mapping, &config,
-	    hid_dev->poll_pipe_mapping->pipe.desc.max_transfer_size, &hid_dev->polling);
+	rc = usb_polling_start(&hid_dev->polling);
 
 	if (rc != EOK) {
@@ -122,6 +110,6 @@
 	assert(hid_dev);
 
-	/* Join polling fibril. */
-	usb_device_poll_join(hid_dev->polling);
+	/* Join polling fibril (ignoring error code). */
+	usb_polling_join(&hid_dev->polling);
 
 	/* Clean up. */
Index: uspace/drv/hid/usbhid/usbhid.c
===================================================================
--- uspace/drv/hid/usbhid/usbhid.c	(revision 91173333ffad8030d872b4bac54acc3311e9e3c1)
+++ uspace/drv/hid/usbhid/usbhid.c	(revision 8b71f3e7d8255e3651a3c9506da74aec01714454)
@@ -445,4 +445,18 @@
 			    ".\n");
 		}
+
+		usb_polling_t *polling = &hid_dev->polling;
+		if ((rc = usb_polling_init(polling))) {
+			// FIXME
+		}
+
+		polling->device = hid_dev->usb_dev;
+		polling->ep_mapping = hid_dev->poll_pipe_mapping;
+		polling->request_size = hid_dev->poll_pipe_mapping->pipe.desc.max_transfer_size;
+		polling->buffer = malloc(polling->request_size);
+		polling->on_data = usb_hid_polling_callback,
+		polling->on_polling_end = usb_hid_polling_ended_callback,
+		polling->on_error = usb_hid_polling_error_callback,
+		polling->arg = hid_dev;
 	}
 
@@ -537,4 +551,7 @@
 	assert(hid_dev->subdrivers != NULL || hid_dev->subdriver_count == 0);
 
+	free(hid_dev->polling.buffer);
+	usb_polling_fini(&hid_dev->polling);
+
 	usb_log_debug("Subdrivers: %p, subdriver count: %d\n",
 	    hid_dev->subdrivers, hid_dev->subdriver_count);
Index: uspace/drv/hid/usbhid/usbhid.h
===================================================================
--- uspace/drv/hid/usbhid/usbhid.h	(revision 91173333ffad8030d872b4bac54acc3311e9e3c1)
+++ uspace/drv/hid/usbhid/usbhid.h	(revision 8b71f3e7d8255e3651a3c9506da74aec01714454)
@@ -107,6 +107,6 @@
 	usb_endpoint_mapping_t *poll_pipe_mapping;
 
-	/** Device polling handle. */
-	usb_device_polling_t *polling;
+	/** Device polling structure. */
+	usb_polling_t polling;
 
 	/** Subdrivers. */
