Index: uspace/drv/pciintel/pci.c
===================================================================
--- uspace/drv/pciintel/pci.c	(revision 17ceb7293c4b3e05a924f81338db1e3c118dea83)
+++ uspace/drv/pciintel/pci.c	(revision 6298d806bfbee483788e8fa047dce6116a5deda6)
@@ -92,25 +92,27 @@
 	pci_fun_t *dev_data = (pci_fun_t *) fnode->driver_data;
 
-  sysarg_t apic;
-  sysarg_t i8259;
+	sysarg_t apic;
+	sysarg_t i8259;
 
 	int irc_phone = -1;
-	int irc_service = 0;
-
-  if ((sysinfo_get_value("apic", &apic) == EOK) && (apic)) {
-    irc_service = SERVICE_APIC;
+	int irc_service = -1;
+
+	if ((sysinfo_get_value("apic", &apic) == EOK) && (apic)) {
+		irc_service = SERVICE_APIC;
 	} else if ((sysinfo_get_value("i8259", &i8259) == EOK) && (i8259)) {
-    irc_service = SERVICE_I8259;
-	}
-
-  if (irc_service == 0)
+		irc_service = SERVICE_I8259;
+	}
+
+	if (irc_service == -1) {
 		return false;
+	}
 
 	irc_phone = service_connect_blocking(irc_service, 0, 0);
-	if (irc_phone < 0)
+	if (irc_phone < 0) {
 		return false;
+	}
 
 	size_t i;
-  for (i = 0; i < dev_data->hw_resources.count; i++) {
+	for (i = 0; i < dev_data->hw_resources.count; i++) {
 		if (dev_data->hw_resources.resources[i].type == INTERRUPT) {
 			int irq = dev_data->hw_resources.resources[i].res.interrupt.irq;
Index: uspace/drv/usbmouse/init.c
===================================================================
--- uspace/drv/usbmouse/init.c	(revision 17ceb7293c4b3e05a924f81338db1e3c118dea83)
+++ uspace/drv/usbmouse/init.c	(revision 6298d806bfbee483788e8fa047dce6116a5deda6)
@@ -42,5 +42,5 @@
 
 /** Mouse polling endpoint description for boot protocol subclass. */
-static usb_endpoint_description_t poll_endpoint_description = {
+usb_endpoint_description_t poll_endpoint_description = {
 	.transfer_type = USB_TRANSFER_INTERRUPT,
 	.direction = USB_DIRECTION_IN,
@@ -50,53 +50,4 @@
 	.flags = 0
 };
-
-/** Initialize poll pipe.
- *
- * Expects that session is already started on control pipe zero.
- *
- * @param mouse Mouse device.
- * @param my_interface Interface number.
- * @return Error code.
- */
-static int intialize_poll_pipe(usb_mouse_t *mouse, int my_interface)
-{
-	assert(usb_endpoint_pipe_is_session_started(&mouse->ctrl_pipe));
-
-	int rc;
-
-	void *config_descriptor;
-	size_t config_descriptor_size;
-
-	rc = usb_request_get_full_configuration_descriptor_alloc(
-	    &mouse->ctrl_pipe, 0, &config_descriptor, &config_descriptor_size);
-	if (rc != EOK) {
-		return rc;
-	}
-
-	usb_endpoint_mapping_t endpoint_mapping[1] = {
-		{
-			.pipe = &mouse->poll_pipe,
-			.description = &poll_endpoint_description,
-			.interface_no = my_interface
-		}
-	};
-
-	rc = usb_endpoint_pipe_initialize_from_configuration(endpoint_mapping,
-	    1, config_descriptor, config_descriptor_size, &mouse->wire);
-	if (rc != EOK) {
-		return rc;
-	}
-
-	if (!endpoint_mapping[0].present) {
-		return ENOENT;
-	}
-
-	mouse->poll_interval_us = 1000 * endpoint_mapping[0].descriptor->poll_interval;
-
-	usb_log_debug("prepared polling endpoint %d (interval %zu).\n",
-	    mouse->poll_pipe.endpoint_no, mouse->poll_interval_us);
-
-	return EOK;
-}
 
 static void default_connection_handler(ddf_fun_t *, ipc_callid_t, ipc_call_t *);
@@ -143,5 +94,5 @@
  * @return Error code.
  */
-int usb_mouse_create(ddf_dev_t *dev)
+int usb_mouse_create(usb_device_t *dev)
 {
 	usb_mouse_t *mouse = malloc(sizeof(usb_mouse_t));
@@ -149,38 +100,11 @@
 		return ENOMEM;
 	}
-	mouse->device = dev;
+	mouse->dev = dev;
 	mouse->console_phone = -1;
 
 	int rc;
 
-	/* Initialize the backing connection. */
-	rc = usb_device_connection_initialize_from_device(&mouse->wire, dev);
-	if (rc != EOK) {
-		goto leave;
-	}
-
-	/* Initialize the default control pipe. */
-	rc = usb_endpoint_pipe_initialize_default_control(&mouse->ctrl_pipe,
-	    &mouse->wire);
-	if (rc != EOK) {
-		goto leave;
-	}
-
-	rc = usb_endpoint_pipe_start_session(&mouse->ctrl_pipe);
-	if (rc != EOK) {
-		goto leave;
-	}
-
-	rc = intialize_poll_pipe(mouse, usb_device_get_assigned_interface(dev));
-
-	/* We can ignore error here. */
-	usb_endpoint_pipe_end_session(&mouse->ctrl_pipe);
-
-	if (rc != EOK) {
-		goto leave;
-	}
-
 	/* Create DDF function. */
-	mouse->mouse_fun = ddf_fun_create(dev, fun_exposed, "mouse");
+	mouse->mouse_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "mouse");
 	if (mouse->mouse_fun == NULL) {
 		rc = ENOMEM;
Index: uspace/drv/usbmouse/main.c
===================================================================
--- uspace/drv/usbmouse/main.c	(revision 17ceb7293c4b3e05a924f81338db1e3c118dea83)
+++ uspace/drv/usbmouse/main.c	(revision 6298d806bfbee483788e8fa047dce6116a5deda6)
@@ -44,5 +44,5 @@
  * @return Error code.
  */
-static int usbmouse_add_device(ddf_dev_t *dev)
+static int usbmouse_add_device(usb_device_t *dev)
 {
 	int rc = usb_mouse_create(dev);
@@ -53,15 +53,18 @@
 	}
 
-	fid_t poll_fibril = fibril_create(usb_mouse_polling_fibril, dev);
-	if (poll_fibril == 0) {
-		usb_log_error("Failed to initialize polling fibril.\n");
-		/* FIXME: free allocated resources. */
-		return ENOMEM;
+	usb_log_debug("Polling pipe at endpoint %d.\n", dev->pipes[0].pipe->endpoint_no);
+
+	rc = usb_device_auto_poll(dev, 0,
+	    usb_mouse_polling_callback, dev->pipes[0].pipe->max_packet_size,
+	    usb_mouse_polling_ended_callback, dev->driver_data);
+
+	if (rc != EOK) {
+		usb_log_error("Failed to start polling fibril: %s.\n",
+		    str_error(rc));
+		return rc;
 	}
 
-	fibril_add_ready(poll_fibril);
-
 	usb_log_info("controlling new mouse (handle %llu).\n",
-	    dev->handle);
+	    dev->ddf_dev->handle);
 
 	return EOK;
@@ -69,12 +72,18 @@
 
 /** USB mouse driver ops. */
-static driver_ops_t mouse_driver_ops = {
+static usb_driver_ops_t mouse_driver_ops = {
 	.add_device = usbmouse_add_device,
 };
 
+static usb_endpoint_description_t *endpoints[] = {
+	&poll_endpoint_description,
+	NULL
+};
+
 /** USB mouse driver. */
-static driver_t mouse_driver = {
+static usb_driver_t mouse_driver = {
 	.name = NAME,
-	.driver_ops = &mouse_driver_ops
+	.ops = &mouse_driver_ops,
+	.endpoints = endpoints
 };
 
@@ -83,5 +92,5 @@
 	usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);
 
-	return ddf_driver_main(&mouse_driver);
+	return usb_driver_main(&mouse_driver);
 }
 
Index: uspace/drv/usbmouse/mouse.c
===================================================================
--- uspace/drv/usbmouse/mouse.c	(revision 17ceb7293c4b3e05a924f81338db1e3c118dea83)
+++ uspace/drv/usbmouse/mouse.c	(revision 6298d806bfbee483788e8fa047dce6116a5deda6)
@@ -40,124 +40,82 @@
 #include <ipc/mouse.h>
 
-/** Fibril function for polling the mouse device.
+/** Mouse polling callback.
  *
- * This function shall not terminate unless the device breaks and fails
- * to send data (e.g. stalls on data request).
- *
- * @param arg ddf_dev_t type representing the mouse device.
- * @return EOK Always.
+ * @param dev Device that is being polled.
+ * @param buffer Data buffer.
+ * @param buffer_size Buffer size in bytes.
+ * @param arg Custom argument - points to usb_mouse_t.
+ * @return Always true.
  */
-int usb_mouse_polling_fibril(void *arg)
+bool usb_mouse_polling_callback(usb_device_t *dev,
+    uint8_t *buffer, size_t buffer_size, void *arg)
 {
-	assert(arg != NULL);
-	ddf_dev_t *dev = (ddf_dev_t *) arg;
-	usb_mouse_t *mouse = (usb_mouse_t *) dev->driver_data;
+	usb_mouse_t *mouse = (usb_mouse_t *) arg;
 
-	assert(mouse);
+	usb_log_debug2("got buffer: %s.\n",
+	    usb_debug_str_buffer(buffer, buffer_size, 0));
 
-	size_t buffer_size = mouse->poll_pipe.max_packet_size;
+	uint8_t butt = buffer[0];
+	char str_buttons[4] = {
+		butt & 1 ? '#' : '.',
+		butt & 2 ? '#' : '.',
+		butt & 4 ? '#' : '.',
+		0
+	};
 
-	if (buffer_size < 4) {
-		usb_log_error("Weird mouse, results will be skewed.\n");
-		buffer_size = 4;
+	int shift_x = ((int) buffer[1]) - 127;
+	int shift_y = ((int) buffer[2]) - 127;
+	int wheel = ((int) buffer[3]) - 127;
+
+	if (buffer[1] == 0) {
+		shift_x = 0;
+	}
+	if (buffer[2] == 0) {
+		shift_y = 0;
+	}
+	if (buffer[3] == 0) {
+		wheel = 0;
 	}
 
-	uint8_t *buffer = malloc(buffer_size);
-	if (buffer == NULL) {
-		usb_log_error("Out of memory, poll fibril aborted.\n");
-		return ENOMEM;
+	if (mouse->console_phone >= 0) {
+		if ((shift_x != 0) || (shift_y != 0)) {
+			/* FIXME: guessed for QEMU */
+			async_req_2_0(mouse->console_phone,
+			    MEVENT_MOVE,
+			    - shift_x / 10,  - shift_y / 10);
+		}
+		if (butt) {
+			/* FIXME: proper button clicking. */
+			async_req_2_0(mouse->console_phone,
+			    MEVENT_BUTTON, 1, 1);
+			async_req_2_0(mouse->console_phone,
+			    MEVENT_BUTTON, 1, 0);
+		}
 	}
 
-	while (true) {
-		async_usleep(mouse->poll_interval_us);
+	usb_log_debug("buttons=%s  dX=%+3d  dY=%+3d  wheel=%+3d\n",
+	    str_buttons, shift_x, shift_y, wheel);
 
-		size_t actual_size;
-		int rc;
+	/* Guess. */
+	async_usleep(1000);
 
-		/*
-		 * Error checking note:
-		 * - failure when starting a session is considered
-		 *   temporary (e.g. out of phones, next try might succeed)
-		 * - failure of transfer considered fatal (probably the
-		 *   device was unplugged)
-		 * - session closing not checked (shall not fail anyway)
-		 */
+	return true;
+}
 
-		rc = usb_endpoint_pipe_start_session(&mouse->poll_pipe);
-		if (rc != EOK) {
-			usb_log_warning("Failed to start session, will try again: %s.\n",
-			    str_error(rc));
-			continue;
-		}
+/** Callback when polling is terminated.
+ *
+ * @param dev Device where the polling terminated.
+ * @param recurring_errors Whether the polling was terminated due to
+ *	recurring errors.
+ * @param arg Custom argument - points to usb_mouse_t.
+ */
+void usb_mouse_polling_ended_callback(usb_device_t *dev,
+    bool recurring_errors, void *arg)
+{
+	usb_mouse_t *mouse = (usb_mouse_t *) arg;
 
-		rc = usb_endpoint_pipe_read(&mouse->poll_pipe,
-		    buffer, buffer_size, &actual_size);
-
-		usb_endpoint_pipe_end_session(&mouse->poll_pipe);
-
-		if (rc != EOK) {
-			usb_log_error("Failed reading mouse input: %s.\n",
-			    str_error(rc));
-			break;
-		}
-
-		usb_log_debug2("got buffer: %s.\n",
-		    usb_debug_str_buffer(buffer, buffer_size, 0));
-
-		uint8_t butt = buffer[0];
-		char str_buttons[4] = {
-			butt & 1 ? '#' : '.',
-			butt & 2 ? '#' : '.',
-			butt & 4 ? '#' : '.',
-			0
-		};
-
-		int shift_x = ((int) buffer[1]) - 127;
-		int shift_y = ((int) buffer[2]) - 127;
-		int wheel = ((int) buffer[3]) - 127;
-
-		if (buffer[1] == 0) {
-			shift_x = 0;
-		}
-		if (buffer[2] == 0) {
-			shift_y = 0;
-		}
-		if (buffer[3] == 0) {
-			wheel = 0;
-		}
-
-		if (mouse->console_phone >= 0) {
-			if ((shift_x != 0) || (shift_y != 0)) {
-				/* FIXME: guessed for QEMU */
-				async_req_2_0(mouse->console_phone,
-				    MEVENT_MOVE,
-				    - shift_x / 10,  - shift_y / 10);
-			}
-			if (butt) {
-				/* FIXME: proper button clicking. */
-				async_req_2_0(mouse->console_phone,
-				    MEVENT_BUTTON, 1, 1);
-				async_req_2_0(mouse->console_phone,
-				    MEVENT_BUTTON, 1, 0);
-			}
-		}
-
-		usb_log_debug("buttons=%s  dX=%+3d  dY=%+3d  wheel=%+3d\n",
-		   str_buttons, shift_x, shift_y, wheel);
-	}
-
-	/*
-	 * Device was probably unplugged.
-	 * Hang-up the phone to the console.
-	 * FIXME: release allocated memory.
-	 */
 	async_hangup(mouse->console_phone);
 	mouse->console_phone = -1;
-
-	usb_log_error("Mouse polling fibril terminated.\n");
-
-	return EOK;
 }
-
 
 /**
Index: uspace/drv/usbmouse/mouse.h
===================================================================
--- uspace/drv/usbmouse/mouse.h	(revision 17ceb7293c4b3e05a924f81338db1e3c118dea83)
+++ uspace/drv/usbmouse/mouse.h	(revision 6298d806bfbee483788e8fa047dce6116a5deda6)
@@ -37,5 +37,5 @@
 #define USBMOUSE_MOUSE_H_
 
-#include <ddf/driver.h>
+#include <usb/devdrv.h>
 #include <usb/pipes.h>
 #include <time.h>
@@ -46,13 +46,7 @@
 typedef struct {
 	/** Generic device container. */
-	ddf_dev_t *device;
+	usb_device_t *dev;
 	/** Function representing the device. */
 	ddf_fun_t *mouse_fun;
-	/** Representation of connection to the device. */
-	usb_device_connection_t wire;
-	/** Default (zero) control pipe. */
-	usb_endpoint_pipe_t ctrl_pipe;
-	/** Polling (in) pipe. */
-	usb_endpoint_pipe_t poll_pipe;
 	/** Polling interval in microseconds. */
 	suseconds_t poll_interval_us;
@@ -61,7 +55,12 @@
 } usb_mouse_t;
 
-int usb_mouse_create(ddf_dev_t *);
+#define POLL_PIPE(dev) ((dev)->pipes[0].pipe)
 
-int usb_mouse_polling_fibril(void *);
+extern usb_endpoint_description_t poll_endpoint_description;
+
+int usb_mouse_create(usb_device_t *);
+
+bool usb_mouse_polling_callback(usb_device_t *, uint8_t *, size_t, void *);
+void usb_mouse_polling_ended_callback(usb_device_t *, bool, void *);
 
 #endif
