Index: uspace/lib/drv/generic/remote_usbhc.c
===================================================================
--- uspace/lib/drv/generic/remote_usbhc.c	(revision 56e9fb08d7114e89f0168c642fc39ee8b60016af)
+++ uspace/lib/drv/generic/remote_usbhc.c	(revision 365e29e2bf360b7a6db5a954e90836d5f9a109d5)
@@ -238,9 +238,6 @@
 	}
 
-	usb_target_t target = {
-		{.address = DEV_IPC_GET_ARG1(*call),
-		.endpoint = DEV_IPC_GET_ARG2(*call) }
-	};
-	size_t data_buffer_len = DEV_IPC_GET_ARG3(*call);
+	const usb_target_t target = { .packed = DEV_IPC_GET_ARG1(*call) };
+	size_t data_buffer_len = DEV_IPC_GET_ARG2(*call);
 
 	int rc;
@@ -302,8 +299,5 @@
 	}
 
-	usb_target_t target = {{
-		.address = DEV_IPC_GET_ARG1(*call),
-		.endpoint = DEV_IPC_GET_ARG2(*call)
-	}};
+	const usb_target_t target = { .packed = DEV_IPC_GET_ARG1(*call) };
 
 	int rc;
@@ -379,6 +373,5 @@
 	type var = (type) DEV_IPC_GET_ARG##arg_no(*call) % (1 << 8)
 
-	_INIT_FROM_HIGH_DATA2(usb_address_t, address, 1);
-	_INIT_FROM_LOW_DATA2(usb_endpoint_t, endpoint, 1);
+	const usb_target_t target = { .packed = DEV_IPC_GET_ARG1(*call) };
 
 	_INIT_FROM_HIGH_DATA3(usb_speed_t, speed, 2);
@@ -395,5 +388,6 @@
 #undef _INIT_FROM_LOW_DATA3
 
-	int rc = usb_iface->register_endpoint(fun, address, speed, endpoint,
+	int rc = usb_iface->register_endpoint(fun, target.address,
+	    speed, target.endpoint,
 	    transfer_type, direction, max_packet_size, interval);
 
@@ -436,9 +430,5 @@
 	}
 
-	const usb_target_t target = {{
-		.address = DEV_IPC_GET_ARG1(*call),
-		.endpoint = DEV_IPC_GET_ARG2(*call)
-	}};
-
+	const usb_target_t target = { .packed = DEV_IPC_GET_ARG1(*call) };
 
 	async_transaction_t *trans = async_transaction_create(callid);
@@ -484,9 +474,5 @@
 	}
 
-	const usb_target_t target = {{
-		.address = DEV_IPC_GET_ARG1(*call),
-		.endpoint = DEV_IPC_GET_ARG2(*call)
-	}};
-
+	const usb_target_t target = { .packed = DEV_IPC_GET_ARG1(*call) };
 
 	async_transaction_t *trans = async_transaction_create(callid);
Index: uspace/lib/usbdev/src/pipesinit.c
===================================================================
--- uspace/lib/usbdev/src/pipesinit.c	(revision 56e9fb08d7114e89f0168c642fc39ee8b60016af)
+++ uspace/lib/usbdev/src/pipesinit.c	(revision 365e29e2bf360b7a6db5a954e90836d5f9a109d5)
@@ -486,4 +486,6 @@
 		return EBADF;
 	
+	const usb_target_t target =
+	    {{ .address = pipe->wire->address, .endpoint = pipe->endpoint_no }};
 #define _PACK2(high, low) (((high) << 16) + (low))
 #define _PACK3(high, middle, low) (((((high) << 8) + (middle)) << 8) + (low))
@@ -491,6 +493,5 @@
 	async_exch_t *exch = async_exchange_begin(hc_connection->hc_sess);
 	int rc = async_req_4_0(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
-	    IPC_M_USBHC_REGISTER_ENDPOINT,
-	    _PACK2(pipe->wire->address, pipe->endpoint_no),
+	    IPC_M_USBHC_REGISTER_ENDPOINT, target.packed,
 	    _PACK3(speed, pipe->transfer_type, pipe->direction),
 	    _PACK2(pipe->max_packet_size, interval));
Index: uspace/lib/usbdev/src/pipesio.c
===================================================================
--- uspace/lib/usbdev/src/pipesio.c	(revision 56e9fb08d7114e89f0168c642fc39ee8b60016af)
+++ uspace/lib/usbdev/src/pipesio.c	(revision 365e29e2bf360b7a6db5a954e90836d5f9a109d5)
@@ -65,18 +65,11 @@
     void *buffer, size_t size, size_t *size_transfered)
 {
-	/*
-	 * Get corresponding IPC method.
-	 * In future, replace with static array of mappings
-	 * transfer type -> method.
-	 */
-	usbhc_iface_funcs_t ipc_method;
-	switch (pipe->transfer_type) {
-		case USB_TRANSFER_INTERRUPT:
-		case USB_TRANSFER_BULK:
-			ipc_method = IPC_M_USBHC_DATA_READ;
-			break;
-		default:
-			return ENOTSUP;
-	}
+	/* Only interrupt and bulk transfers are supported */
+	if (pipe->transfer_type != USB_TRANSFER_INTERRUPT &&
+	    pipe->transfer_type != USB_TRANSFER_BULK)
+	    return ENOTSUP;
+
+	const usb_target_t target =
+	    {{ .address = pipe->wire->address, .endpoint = pipe->endpoint_no }};
 	
 	/* Ensure serialization over the phone. */
@@ -87,6 +80,6 @@
 	 * Make call identifying target USB device and type of transfer.
 	 */
-	aid_t opening_request = async_send_3(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
-	    ipc_method, pipe->wire->address, pipe->endpoint_no, NULL);
+	aid_t opening_request = async_send_2(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
+	    IPC_M_USBHC_DATA_READ, target.packed, NULL);
 	
 	if (opening_request == 0) {
@@ -211,18 +204,11 @@
     void *buffer, size_t size)
 {
-	/*
-	 * Get corresponding IPC method.
-	 * In future, replace with static array of mappings
-	 * transfer type -> method.
-	 */
-	usbhc_iface_funcs_t ipc_method;
-	switch (pipe->transfer_type) {
-		case USB_TRANSFER_INTERRUPT:
-		case USB_TRANSFER_BULK:
-			ipc_method = IPC_M_USBHC_DATA_WRITE;
-			break;
-		default:
-			return ENOTSUP;
-	}
+	/* Only interrupt and bulk transfers are supported */
+	if (pipe->transfer_type != USB_TRANSFER_INTERRUPT &&
+	    pipe->transfer_type != USB_TRANSFER_BULK)
+	    return ENOTSUP;
+
+	const usb_target_t target =
+	    {{ .address = pipe->wire->address, .endpoint = pipe->endpoint_no }};
 
 	/* Ensure serialization over the phone. */
@@ -233,6 +219,6 @@
 	 * Make call identifying target USB device and type of transfer.
 	 */
-	aid_t opening_request = async_send_3(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
-	    ipc_method, pipe->wire->address, pipe->endpoint_no, NULL);
+	aid_t opening_request = async_send_2(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
+	    IPC_M_USBHC_DATA_WRITE, target.packed, NULL);
 	
 	if (opening_request == 0) {
@@ -348,11 +334,13 @@
 	pipe_start_transaction(pipe);
 
+	const usb_target_t target =
+	    {{ .address = pipe->wire->address, .endpoint = pipe->endpoint_no }};
+
 	/*
 	 * Make call identifying target USB device and control transfer type.
 	 */
 	async_exch_t *exch = async_exchange_begin(pipe->hc_sess);
-	aid_t opening_request = async_send_3(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
-	    IPC_M_USBHC_CONTROL_READ, pipe->wire->address, pipe->endpoint_no,
-	    NULL);
+	aid_t opening_request = async_send_2(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
+	    IPC_M_USBHC_CONTROL_READ, target.packed, NULL);
 	
 	if (opening_request == 0) {
@@ -494,10 +482,13 @@
 	pipe_start_transaction(pipe);
 
+	const usb_target_t target =
+	    {{ .address = pipe->wire->address, .endpoint = pipe->endpoint_no }};
+
 	/*
 	 * Make call identifying target USB device and control transfer type.
 	 */
 	async_exch_t *exch = async_exchange_begin(pipe->hc_sess);
-	aid_t opening_request = async_send_4(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
-	    IPC_M_USBHC_CONTROL_WRITE, pipe->wire->address, pipe->endpoint_no,
+	aid_t opening_request = async_send_3(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
+	    IPC_M_USBHC_CONTROL_WRITE, target.packed,
 	    data_buffer_size, NULL);
 	
