Index: uspace/lib/usbdev/src/devdrv.c
===================================================================
--- uspace/lib/usbdev/src/devdrv.c	(revision 8d2dd7f2d52fbc7693f94b66e451eeff3756d061)
+++ uspace/lib/usbdev/src/devdrv.c	(revision dbf32b10e7146a1f953c4eda94c63b8ac246f0ba)
@@ -56,11 +56,11 @@
 	/** Connection to device on USB bus */
 	usb_dev_session_t *bus_session;
-	
+
 	/** devman handle */
 	devman_handle_t handle;
-	
+
 	/** The default control pipe. */
 	usb_pipe_t ctrl_pipe;
-	
+
 	/** Other endpoint pipes.
 	 *
@@ -69,8 +69,8 @@
 	 */
 	usb_endpoint_mapping_t *pipes;
-	
+
 	/** Number of other endpoint pipes. */
 	size_t pipes_count;
-	
+
 	/** Current interface.
 	 *
@@ -79,14 +79,14 @@
 	 */
 	int interface_no;
-	
+
 	/** Alternative interfaces. */
 	usb_alternate_interfaces_t alternate_interfaces;
-	
+
 	/** Some useful descriptors for USB device. */
 	usb_device_descriptors_t descriptors;
-	
+
 	/** Generic DDF device backing this one. DO NOT TOUCH! */
 	ddf_dev_t *ddf_dev;
-	
+
 	/** Custom driver data.
 	 *
@@ -146,5 +146,5 @@
 		return rc;
 	}
-	
+
 	/* Change current alternative */
 	usb_dev->alternate_interfaces.current = alternate_setting;
@@ -296,5 +296,5 @@
 	assert(usb_dev);
 	assert(usb_dev->pipes || usb_dev->pipes_count == 0);
-	
+
 	/* Destroy the pipes. */
 	for (size_t i = 0; i < usb_dev->pipes_count; ++i) {
@@ -304,5 +304,5 @@
 			usb_pipe_unregister(&usb_dev->pipes[i].pipe);
 	}
-	
+
 	free(usb_dev->pipes);
 	usb_dev->pipes = NULL;
@@ -332,5 +332,5 @@
 	assert(usb_dev);
 	for (unsigned i = 0; i < usb_dev->pipes_count; ++i) {
-		if (usb_dev->pipes[i].pipe.endpoint_no == ep)
+		if (usb_dev->pipes[i].pipe.desc.endpoint_no == ep)
 			return &usb_dev->pipes[i];
 	}
@@ -462,9 +462,9 @@
 	assert(handle);
 	assert(iface_no);
-	
+
 	async_exch_t *exch = async_exchange_begin(sess);
 	if (!exch)
 		return EPARTY;
-	
+
 	int ret = usb_get_my_device_handle(exch, handle);
 	if (ret == EOK) {
@@ -475,5 +475,5 @@
 		}
 	}
-	
+
 	async_exchange_end(exch);
 	return ret;
@@ -504,5 +504,5 @@
 		return ENOMEM;
 	}
-	
+
 	return usb_device_init(usb_dev, ddf_dev, desc, err, h, iface_no);
 }
Index: uspace/lib/usbdev/src/devpoll.c
===================================================================
--- uspace/lib/usbdev/src/devpoll.c	(revision 8d2dd7f2d52fbc7693f94b66e451eeff3756d061)
+++ uspace/lib/usbdev/src/devpoll.c	(revision dbf32b10e7146a1f953c4eda94c63b8ac246f0ba)
@@ -96,5 +96,5 @@
 		    (int) mapping->interface->interface_subclass,
 		    (int) mapping->interface->interface_protocol,
-		    data->request_size, pipe->max_packet_size);
+		    data->request_size, pipe->desc.max_packet_size);
 	}
 
@@ -128,5 +128,5 @@
 			usb_request_clear_endpoint_halt(
 			    usb_device_get_default_pipe(data->dev),
-			    pipe->endpoint_no);
+			    pipe->desc.endpoint_no);
 		}
 
@@ -156,5 +156,5 @@
 
 		/* Take a rest before next request. */
-		
+
 		// FIXME TODO: This is broken, the time is in ms not us.
 		// but first we need to fix drivers to actually stop using this,
@@ -216,9 +216,9 @@
 	if (request_size == 0)
 		return EINVAL;
-	
-	if (!epm || (epm->pipe.transfer_type != USB_TRANSFER_INTERRUPT) ||
-	    (epm->pipe.direction != USB_DIRECTION_IN))
+
+	if (!epm || (epm->pipe.desc.transfer_type != USB_TRANSFER_INTERRUPT) ||
+	    (epm->pipe.desc.direction != USB_DIRECTION_IN))
 		return EINVAL;
-	
+
 
 	polling_data_t *polling_data = malloc(sizeof(polling_data_t));
Index: uspace/lib/usbdev/src/pipes.c
===================================================================
--- uspace/lib/usbdev/src/pipes.c	(revision 8d2dd7f2d52fbc7693f94b66e451eeff3756d061)
+++ uspace/lib/usbdev/src/pipes.c	(revision dbf32b10e7146a1f953c4eda94c63b8ac246f0ba)
@@ -51,5 +51,5 @@
 	assert(pipe != NULL);
 
-	if (!pipe->auto_reset_halt || (pipe->endpoint_no != 0)) {
+	if (!pipe->auto_reset_halt || (pipe->desc.endpoint_no != 0)) {
 		return;
 	}
@@ -88,6 +88,6 @@
 	}
 
-	if ((pipe->direction != USB_DIRECTION_BOTH)
-	    || (pipe->transfer_type != USB_TRANSFER_CONTROL)) {
+	if ((pipe->desc.direction != USB_DIRECTION_BOTH)
+	    || (pipe->desc.transfer_type != USB_TRANSFER_CONTROL)) {
 		return EBADF;
 	}
@@ -98,5 +98,5 @@
 	async_exch_t *exch = async_exchange_begin(pipe->bus_session);
 	size_t act_size = 0;
-	const int rc = usb_read(exch, pipe->endpoint_no, setup_packet, buffer,
+	const int rc = usb_read(exch, pipe->desc.endpoint_no, setup_packet, buffer,
 	    buffer_size, &act_size);
 	async_exchange_end(exch);
@@ -142,6 +142,6 @@
 	}
 
-	if ((pipe->direction != USB_DIRECTION_BOTH)
-	    || (pipe->transfer_type != USB_TRANSFER_CONTROL)) {
+	if ((pipe->desc.direction != USB_DIRECTION_BOTH)
+	    || (pipe->desc.transfer_type != USB_TRANSFER_CONTROL)) {
 		return EBADF;
 	}
@@ -152,5 +152,5 @@
 	async_exch_t *exch = async_exchange_begin(pipe->bus_session);
 	const int rc = usb_write(exch,
-	    pipe->endpoint_no, setup_packet, buffer, buffer_size);
+	    pipe->desc.endpoint_no, setup_packet, buffer, buffer_size);
 	async_exchange_end(exch);
 
@@ -183,15 +183,15 @@
 	}
 
-	if (pipe->direction != USB_DIRECTION_IN) {
-		return EBADF;
-	}
-
-	if (pipe->transfer_type == USB_TRANSFER_CONTROL) {
+	if (pipe->desc.direction != USB_DIRECTION_IN) {
+		return EBADF;
+	}
+
+	if (pipe->desc.transfer_type == USB_TRANSFER_CONTROL) {
 		return EBADF;
 	}
 
 	/* Isochronous transfer are not supported (yet) */
-	if (pipe->transfer_type != USB_TRANSFER_INTERRUPT &&
-	    pipe->transfer_type != USB_TRANSFER_BULK)
+	if (pipe->desc.transfer_type != USB_TRANSFER_INTERRUPT &&
+	    pipe->desc.transfer_type != USB_TRANSFER_BULK)
 	    return ENOTSUP;
 
@@ -199,5 +199,5 @@
 	size_t act_size = 0;
 	const int rc =
-	    usb_read(exch, pipe->endpoint_no, 0, buffer, size, &act_size);
+	    usb_read(exch, pipe->desc.endpoint_no, 0, buffer, size, &act_size);
 	async_exchange_end(exch);
 
@@ -224,19 +224,19 @@
 	}
 
-	if (pipe->direction != USB_DIRECTION_OUT) {
-		return EBADF;
-	}
-
-	if (pipe->transfer_type == USB_TRANSFER_CONTROL) {
+	if (pipe->desc.direction != USB_DIRECTION_OUT) {
+		return EBADF;
+	}
+
+	if (pipe->desc.transfer_type == USB_TRANSFER_CONTROL) {
 		return EBADF;
 	}
 
 	/* Isochronous transfer are not supported (yet) */
-	if (pipe->transfer_type != USB_TRANSFER_INTERRUPT &&
-	    pipe->transfer_type != USB_TRANSFER_BULK)
+	if (pipe->desc.transfer_type != USB_TRANSFER_INTERRUPT &&
+	    pipe->desc.transfer_type != USB_TRANSFER_BULK)
 	    return ENOTSUP;
 
 	async_exch_t *exch = async_exchange_begin(pipe->bus_session);
-	const int rc = usb_write(exch, pipe->endpoint_no, 0, buffer, size);
+	const int rc = usb_write(exch, pipe->desc.endpoint_no, 0, buffer, size);
 	async_exchange_end(exch);
 	return rc;
@@ -258,9 +258,9 @@
 	assert(pipe);
 
-	pipe->endpoint_no = endpoint_no;
-	pipe->transfer_type = transfer_type;
-	pipe->packets = packets;
-	pipe->max_packet_size = max_packet_size;
-	pipe->direction = direction;
+	pipe->desc.endpoint_no = endpoint_no;
+	pipe->desc.transfer_type = transfer_type;
+	pipe->desc.packets = packets;
+	pipe->desc.max_packet_size = max_packet_size;
+	pipe->desc.direction = direction;
 	pipe->auto_reset_halt = false;
 	pipe->bus_session = bus_session;
@@ -297,10 +297,12 @@
 	assert(pipe);
 	assert(pipe->bus_session);
+
+	pipe->desc.usb2.polling_interval = interval;
 	async_exch_t *exch = async_exchange_begin(pipe->bus_session);
 	if (!exch)
 		return ENOMEM;
-	const int ret = usb_register_endpoint(exch, pipe->endpoint_no,
-	    pipe->transfer_type, pipe->direction, pipe->max_packet_size,
-	    pipe->packets, interval);
+
+	const int ret = usb_register_endpoint(exch, &pipe->desc);
+
 	async_exchange_end(exch);
 	return ret;
@@ -319,6 +321,7 @@
 	if (!exch)
 		return ENOMEM;
-	const int ret = usb_unregister_endpoint(exch, pipe->endpoint_no,
-	    pipe->direction);
+
+	const int ret = usb_unregister_endpoint(exch, &pipe->desc);
+
 	async_exchange_end(exch);
 	return ret;
Index: uspace/lib/usbdev/src/pipesinit.c
===================================================================
--- uspace/lib/usbdev/src/pipesinit.c	(revision 8d2dd7f2d52fbc7693f94b66e451eeff3756d061)
+++ uspace/lib/usbdev/src/pipesinit.c	(revision dbf32b10e7146a1f953c4eda94c63b8ac246f0ba)
@@ -288,5 +288,5 @@
 	if (config_descriptor == NULL)
 		return EBADMEM;
-	
+
 	if (config_descriptor_size <
 	    sizeof(usb_standard_configuration_descriptor_t)) {
@@ -343,7 +343,7 @@
 	static_assert(DEV_DESCR_MAX_PACKET_SIZE_OFFSET < CTRL_PIPE_MIN_PACKET_SIZE);
 
-	if ((pipe->direction != USB_DIRECTION_BOTH) ||
-	    (pipe->transfer_type != USB_TRANSFER_CONTROL) ||
-	    (pipe->endpoint_no != 0)) {
+	if ((pipe->desc.direction != USB_DIRECTION_BOTH) ||
+	    (pipe->desc.transfer_type != USB_TRANSFER_CONTROL) ||
+	    (pipe->desc.endpoint_no != 0)) {
 		return EINVAL;
 	}
@@ -369,5 +369,5 @@
 	}
 
-	pipe->max_packet_size
+	pipe->desc.max_packet_size
 	    = dev_descr_start[DEV_DESCR_MAX_PACKET_SIZE_OFFSET];
 
Index: uspace/lib/usbdev/src/request.c
===================================================================
--- uspace/lib/usbdev/src/request.c	(revision 8d2dd7f2d52fbc7693f94b66e451eeff3756d061)
+++ uspace/lib/usbdev/src/request.c	(revision dbf32b10e7146a1f953c4eda94c63b8ac246f0ba)
@@ -844,5 +844,5 @@
 	}
 	return usb_request_clear_endpoint_halt(ctrl_pipe,
-	    target_pipe->endpoint_no);
+	    target_pipe->desc.endpoint_no);
 }
 
@@ -858,5 +858,5 @@
 {
 	uint16_t status_tmp;
-	uint16_t pipe_index = (uint16_t) pipe->endpoint_no;
+	uint16_t pipe_index = (uint16_t) pipe->desc.endpoint_no;
 	int rc = usb_request_get_status(ctrl_pipe,
 	    USB_REQUEST_RECIPIENT_ENDPOINT, uint16_host2usb(pipe_index),
