Index: uspace/drv/bus/usb/ehci/ehci_rh.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_rh.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/ehci/ehci_rh.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -144,6 +144,5 @@
 	assert(instance);
 	assert(batch);
-	const usb_target_t target = batch->ep->target;
-	batch->error = virthub_base_request(&instance->base, target,
+	batch->error = virthub_base_request(&instance->base, batch->target,
 	    batch->dir, (void*) batch->setup.buffer,
 	    batch->buffer, batch->buffer_size, &batch->transfered_size);
@@ -179,6 +178,5 @@
 	    instance, batch);
 	if (batch) {
-		const usb_target_t target = batch->ep->target;
-		batch->error = virthub_base_request(&instance->base, target,
+		batch->error = virthub_base_request(&instance->base, batch->target,
 		    batch->dir, (void*) batch->setup.buffer,
 		    batch->buffer, batch->buffer_size, &batch->transfered_size);
Index: uspace/drv/bus/usb/ehci/hc.c
===================================================================
--- uspace/drv/bus/usb/ehci/hc.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/ehci/hc.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -215,5 +215,5 @@
 	ehci_endpoint_t *ehci_ep = ehci_endpoint_get(ep);
 	usb_log_debug("HC(%p) enqueue EP(%d:%d:%s:%s)\n", instance,
-	    ep->target.address, ep->target.endpoint,
+	    ep->device->address, ep->endpoint,
 	    usb_str_transfer_type_short(ep->transfer_type),
 	    usb_str_direction(ep->direction));
@@ -239,5 +239,5 @@
 	ehci_endpoint_t *ehci_ep = ehci_endpoint_get(ep);
 	usb_log_debug("HC(%p) dequeue EP(%d:%d:%s:%s)\n", instance,
-	    ep->target.address, ep->target.endpoint,
+	    ep->device->address, ep->endpoint,
 	    usb_str_transfer_type_short(ep->transfer_type),
 	    usb_str_direction(ep->direction));
@@ -291,5 +291,5 @@
 
 	/* Check for root hub communication */
-	if (batch->ep->target.address == ehci_rh_get_address(&instance->rh)) {
+	if (batch->target.address == ehci_rh_get_address(&instance->rh)) {
 		usb_log_debug("HC(%p): Scheduling BATCH(%p) for RH(%p)",
 		    instance, batch, &instance->rh);
Index: uspace/drv/bus/usb/ehci/hw_struct/queue_head.c
===================================================================
--- uspace/drv/bus/usb/ehci/hw_struct/queue_head.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/ehci/hw_struct/queue_head.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -66,6 +66,6 @@
 	assert(ep->speed < ARRAY_SIZE(speed));
 	EHCI_MEM32_WR(instance->ep_char,
-	    QH_EP_CHAR_ADDR_SET(ep->target.address) |
-	    QH_EP_CHAR_EP_SET(ep->target.endpoint) |
+	    QH_EP_CHAR_ADDR_SET(ep->device->address) |
+	    QH_EP_CHAR_EP_SET(ep->endpoint) |
 	    speed[ep->speed] |
 	    QH_EP_CHAR_MAX_LENGTH_SET(ep->max_packet_size)
Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -287,5 +287,5 @@
 
 	/* Check for root hub communication */
-	if (batch->ep->target.address == ohci_rh_get_address(&instance->rh)) {
+	if (batch->target.address == ohci_rh_get_address(&instance->rh)) {
 		usb_log_debug("OHCI root hub request.\n");
 		return ohci_rh_schedule(&instance->rh, batch);
Index: uspace/drv/bus/usb/ohci/hw_struct/endpoint_descriptor.c
===================================================================
--- uspace/drv/bus/usb/ohci/hw_struct/endpoint_descriptor.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/ohci/hw_struct/endpoint_descriptor.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -40,4 +40,6 @@
 #include <usb/usb.h>
 #include <usb/host/utils/malloc32.h>
+#include <usb/host/endpoint.h>
+#include <usb/host/bus.h>
 
 #include "mem_access.h"
@@ -79,6 +81,6 @@
 	/* Status: address, endpoint nr, direction mask and max packet size. */
 	OHCI_MEM32_WR(instance->status,
-	    ((ep->target.address & ED_STATUS_FA_MASK) << ED_STATUS_FA_SHIFT)
-	    | ((ep->target.endpoint & ED_STATUS_EN_MASK) << ED_STATUS_EN_SHIFT)
+	    ((ep->device->address & ED_STATUS_FA_MASK) << ED_STATUS_FA_SHIFT)
+	    | ((ep->endpoint & ED_STATUS_EN_MASK) << ED_STATUS_EN_SHIFT)
 	    | ((dir[ep->direction] & ED_STATUS_D_MASK) << ED_STATUS_D_SHIFT)
 	    | ((ep->max_packet_size & ED_STATUS_MPS_MASK)
Index: uspace/drv/bus/usb/ohci/ohci_rh.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci_rh.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/ohci/ohci_rh.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -178,6 +178,5 @@
 	assert(instance);
 	assert(batch);
-	const usb_target_t target = batch->ep->target;
-	batch->error = virthub_base_request(&instance->base, target,
+	batch->error = virthub_base_request(&instance->base, batch->target,
 	    batch->dir, &batch->setup.packet,
 	    batch->buffer, batch->buffer_size, &batch->transfered_size);
@@ -207,6 +206,5 @@
 	instance->unfinished_interrupt_transfer = NULL;
 	if (batch) {
-		const usb_target_t target = batch->ep->target;
-		batch->error = virthub_base_request(&instance->base, target,
+		batch->error = virthub_base_request(&instance->base, batch->target,
 		    batch->dir, &batch->setup.packet,
 		    batch->buffer, batch->buffer_size, &batch->transfered_size);
Index: uspace/drv/bus/usb/uhci/hc.c
===================================================================
--- uspace/drv/bus/usb/uhci/hc.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/uhci/hc.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -461,5 +461,5 @@
 	assert(batch);
 
-	if (batch->ep->target.address == uhci_rh_get_address(&instance->rh))
+	if (batch->target.address == uhci_rh_get_address(&instance->rh))
 		return uhci_rh_schedule(&instance->rh, batch);
 
Index: uspace/drv/bus/usb/uhci/uhci_batch.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_batch.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/uhci/uhci_batch.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -222,5 +222,4 @@
 	    uhci_batch->base.ep->speed == USB_SPEED_LOW;
 	const size_t mps = uhci_batch->base.ep->max_packet_size;
-	const usb_target_t target = uhci_batch->base.ep->target;
 
 	int toggle = endpoint_toggle_get(uhci_batch->base.ep);
@@ -240,5 +239,5 @@
 		td_init(
 		    &uhci_batch->tds[td], DEFAULT_ERROR_COUNT, packet_size,
-		    toggle, false, low_speed, target, pid, buffer, next_td);
+		    toggle, false, low_speed, uhci_batch->base.target, pid, buffer, next_td);
 
 		++td;
@@ -285,5 +284,5 @@
 	    uhci_batch->base.ep->speed == USB_SPEED_LOW;
 	const size_t mps = uhci_batch->base.ep->max_packet_size;
-	const usb_target_t target = uhci_batch->base.ep->target;
+	const usb_target_t target = uhci_batch->base.target;
 
 	/* setup stage */
Index: uspace/drv/bus/usb/uhci/uhci_rh.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_rh.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/uhci/uhci_rh.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -104,7 +104,6 @@
 	assert(batch);
 
-	const usb_target_t target = batch->ep->target;
 	do {
-		batch->error = virthub_base_request(&instance->base, target,
+		batch->error = virthub_base_request(&instance->base, batch->target,
 		    batch->dir, (void*) batch->setup.buffer,
 		    batch->buffer, batch->buffer_size, &batch->transfered_size);
Index: uspace/drv/bus/usb/vhc/transfer.c
===================================================================
--- uspace/drv/bus/usb/vhc/transfer.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/vhc/transfer.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -38,5 +38,5 @@
 static bool is_set_address_transfer(vhc_transfer_t *transfer)
 {
-	if (transfer->batch->ep->target.endpoint != 0) {
+	if (transfer->batch->target.endpoint != 0) {
 		return false;
 	}
@@ -81,5 +81,5 @@
 		if (dir == USB_DIRECTION_IN) {
 			rc = usbvirt_data_in(dev, batch->ep->transfer_type,
-			    batch->ep->target.endpoint,
+			    batch->ep->endpoint,
 			    batch->buffer, batch->buffer_size,
 			    actual_data_size);
@@ -87,5 +87,5 @@
 			assert(dir == USB_DIRECTION_OUT);
 			rc = usbvirt_data_out(dev, batch->ep->transfer_type,
-			    batch->ep->target.endpoint,
+			    batch->ep->endpoint,
 			    batch->buffer, batch->buffer_size);
 		}
@@ -116,5 +116,5 @@
 	} else {
 		if (dir == USB_DIRECTION_IN) {
-			rc = usbvirt_ipc_send_data_in(sess, batch->ep->target.endpoint,
+			rc = usbvirt_ipc_send_data_in(sess, batch->ep->endpoint,
 			    batch->ep->transfer_type,
 			    batch->buffer, batch->buffer_size,
@@ -122,5 +122,5 @@
 		} else {
 			assert(dir == USB_DIRECTION_OUT);
-			rc = usbvirt_ipc_send_data_out(sess, batch->ep->target.endpoint,
+			rc = usbvirt_ipc_send_data_out(sess, batch->ep->endpoint,
 			    batch->ep->transfer_type,
 			    batch->buffer, batch->buffer_size);
@@ -184,5 +184,5 @@
 	list_foreach(vhc->devices, link, vhc_virtdev_t, dev) {
 		fibril_mutex_lock(&dev->guard);
-		if (dev->address == transfer->batch->ep->target.address) {
+		if (dev->address == transfer->batch->target.address) {
 			if (!targets) {
 				list_append(&transfer->link, &dev->transfer_queue);
Index: uspace/drv/bus/usb/xhci/bus.c
===================================================================
--- uspace/drv/bus/usb/xhci/bus.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/xhci/bus.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -63,8 +63,5 @@
 {
 	/* Extract information from endpoint_desc */
-	ep->base.target = (usb_target_t) {{
-		.address = ep->base.device->address,
-		.endpoint = desc->endpoint_no,
-	}};
+	ep->base.endpoint = desc->endpoint_no;
 	ep->base.direction = desc->direction;
 	ep->base.transfer_type = desc->transfer_type;
@@ -109,5 +106,4 @@
 
 	/* Register EP0, passing Temporary reference */
-	ep0->base.target.address = dev->base.address;
 	dev->endpoints[0] = ep0;
 
@@ -254,5 +250,5 @@
 		return err;
 
-	usb_log_info("Endpoint(%d:%d) registered to XHCI bus.", ep->target.address, ep->target.endpoint);
+	usb_log_info("Endpoint(%d:%d) registered to XHCI bus.", ep->device->address, ep->endpoint);
 	return xhci_device_add_endpoint(xhci_dev, xhci_ep);
 }
@@ -263,5 +259,5 @@
 	assert(bus);
 
-	usb_log_info("Endpoint(%d:%d) unregistered from XHCI bus.", ep->target.address, ep->target.endpoint);
+	usb_log_info("Endpoint(%d:%d) unregistered from XHCI bus.", ep->device->address, ep->endpoint);
 
 	xhci_device_t *xhci_dev = xhci_device_get(ep->device);
Index: uspace/drv/bus/usb/xhci/endpoint.c
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/xhci/endpoint.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -94,6 +94,6 @@
 		/* Set up primary stream context array if needed. */
 		const size_t size = primary_stream_ctx_array_size(xhci_ep);
-		usb_log_debug2("Allocating primary stream context array of size %lu for endpoint %d:%d.",
-		    size, xhci_ep->base.target.address, xhci_ep->base.target.endpoint);
+		usb_log_debug2("Allocating primary stream context array of size %lu for endpoint " XHCI_EP_FMT,
+		    size, XHCI_EP_ARGS(*xhci_ep));
 
 		xhci_ep->primary_stream_ctx_array = malloc32(size * sizeof(xhci_stream_ctx_t));
@@ -104,6 +104,5 @@
 		memset(xhci_ep->primary_stream_ctx_array, 0, size * sizeof(xhci_stream_ctx_t));
 	} else {
-		usb_log_debug2("Allocating main transfer ring for endpoint %d:%d.",
-		    xhci_ep->base.target.address, xhci_ep->base.target.endpoint);
+		usb_log_debug2("Allocating main transfer ring for endpoint " XHCI_EP_FMT, XHCI_EP_ARGS(*xhci_ep));
 
 		xhci_ep->primary_stream_ctx_array = NULL;
@@ -121,6 +120,5 @@
 {
 	if (endpoint_uses_streams(xhci_ep)) {
-		usb_log_debug2("Freeing primary stream context array for endpoint %d:%d.",
-		    xhci_ep->base.target.address, xhci_ep->base.target.endpoint);
+		usb_log_debug2("Freeing primary stream context array for endpoint " XHCI_EP_FMT, XHCI_EP_ARGS(*xhci_ep));
 
 		// maybe check if LSA, then skip?
@@ -135,6 +133,5 @@
 		free32(xhci_ep->primary_stream_ctx_array);
 	} else {
-		usb_log_debug2("Freeing main transfer ring for endpoint %d:%d.",
-		    xhci_ep->base.target.address, xhci_ep->base.target.endpoint);
+		usb_log_debug2("Freeing main transfer ring for endpoint " XHCI_EP_FMT, XHCI_EP_ARGS(*xhci_ep));
 
 		int err;
@@ -151,5 +148,5 @@
 uint8_t xhci_endpoint_dci(xhci_endpoint_t *ep)
 {
-	return (2 * ep->base.target.endpoint) +
+	return (2 * ep->base.endpoint) +
 		(ep->base.transfer_type == USB_TRANSFER_CONTROL
 		 || ep->base.direction == USB_DIRECTION_IN);
@@ -280,8 +277,7 @@
 	}
 
-	const usb_endpoint_t ep_num = ep->base.target.endpoint;
+	const usb_endpoint_t ep_num = ep->base.endpoint;
 
 	assert(&dev->base == ep->base.device);
-	assert(dev->base.address == ep->base.target.address);
 
 	// TODO Do not fail hard on runtime conditions
@@ -307,11 +303,10 @@
 {
 	assert(&dev->base == ep->base.device);
-	assert(dev->base.address == ep->base.target.address);
-	assert(dev->endpoints[ep->base.target.endpoint]);
+	assert(dev->endpoints[ep->base.endpoint]);
 
 	int err = ENOMEM;
-	const usb_endpoint_t ep_num = ep->base.target.endpoint;
-
-	dev->endpoints[ep->base.target.endpoint] = NULL;
+	const usb_endpoint_t ep_num = ep->base.endpoint;
+
+	dev->endpoints[ep->base.endpoint] = NULL;
 	--dev->active_endpoint_count;
 
Index: uspace/drv/bus/usb/xhci/endpoint.h
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.h	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/xhci/endpoint.h	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -86,4 +86,10 @@
 } xhci_endpoint_t;
 
+#define XHCI_EP_FMT  "(%d:%d %s)"
+#define XHCI_EP_ARGS(ep)		\
+	((ep).base.device->address),	\
+	((ep).base.endpoint),		\
+	(usb_str_transfer_type((ep).base.transfer_type))
+
 typedef struct xhci_device {
 	device_t base;		/**< Inheritance. Keep this first. */
Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -453,10 +453,5 @@
 	assert(batch->ep);
 
-	usb_log_debug2("Endpoint(%d:%d) started %s transfer of size %lu.",
-		batch->ep->target.address, batch->ep->target.endpoint,
-		usb_str_transfer_type(batch->ep->transfer_type),
-		batch->buffer_size);
-
-	if (!batch->ep->target.address) {
+	if (!batch->target.address) {
 		usb_log_error("Attempted to schedule transfer to address 0.");
 		return EINVAL;
Index: uspace/drv/bus/usb/xhci/rh.c
===================================================================
--- uspace/drv/bus/usb/xhci/rh.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/xhci/rh.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -216,5 +216,5 @@
 			    " endpoint %d of detached device '%s': %s",
 			    usb_str_transfer_type(ep->base.transfer_type),
-			    ep->base.target.endpoint, ddf_fun_get_name(dev->base.fun),
+			    ep->base.endpoint, ddf_fun_get_name(dev->base.fun),
 			    str_error(err));
 		}
Index: uspace/drv/bus/usb/xhci/transfers.c
===================================================================
--- uspace/drv/bus/usb/xhci/transfers.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
+++ uspace/drv/bus/usb/xhci/transfers.c	(revision a5b3de686cf45ac7977c1c28f81da0a17ff37df8)
@@ -316,5 +316,5 @@
 
 	/* Offline devices don't schedule transfers other than on EP0. */
-	if (!xhci_dev->online && xhci_ep->base.target.endpoint) {
+	if (!xhci_dev->online && xhci_ep->base.endpoint) {
 		return EAGAIN;
 	}
