Index: uspace/drv/bus/usb/uhci/uhci_batch.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_batch.c	(revision ff6dd7317e8503b9c4de186441ff56be21415bca)
+++ uspace/drv/bus/usb/uhci/uhci_batch.c	(revision 70fb8229850edcd3f6f47d4e82abe94c0a27f851)
@@ -76,5 +76,4 @@
 	if (uhci_batch->usb_batch->callback_in)
 		usb_transfer_batch_call_in(uhci_batch->usb_batch);
-	usb_transfer_batch_finish(uhci_batch->usb_batch);
 	uhci_transfer_batch_dispose(uhci_batch);
 }
Index: uspace/lib/usbhost/include/usb/host/batch.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/batch.h	(revision ff6dd7317e8503b9c4de186441ff56be21415bca)
+++ uspace/lib/usbhost/include/usb/host/batch.h	(revision 70fb8229850edcd3f6f47d4e82abe94c0a27f851)
@@ -75,6 +75,5 @@
 
 
-void usb_transfer_batch_init(
-    usb_transfer_batch_t *instance,
+usb_transfer_batch_t * usb_transfer_batch_get(
     endpoint_t *ep,
     char *buffer,
Index: uspace/lib/usbhost/src/batch.c
===================================================================
--- uspace/lib/usbhost/src/batch.c	(revision ff6dd7317e8503b9c4de186441ff56be21415bca)
+++ uspace/lib/usbhost/src/batch.c	(revision 70fb8229850edcd3f6f47d4e82abe94c0a27f851)
@@ -40,6 +40,5 @@
 #include <usb/host/hcd.h>
 
-void usb_transfer_batch_init(
-    usb_transfer_batch_t *instance,
+usb_transfer_batch_t * usb_transfer_batch_get(
     endpoint_t *ep,
     char *buffer,
@@ -53,26 +52,29 @@
     ddf_fun_t *fun,
     void *private_data,
-    void (*private_data_dtor)(void *p_data)
+    void (*private_data_dtor)(void *)
     )
 {
-	assert(instance);
-	link_initialize(&instance->link);
-	instance->ep = ep;
-	instance->callback_in = func_in;
-	instance->callback_out = func_out;
-	instance->arg = arg;
-	instance->buffer = buffer;
-	instance->data_buffer = data_buffer;
-	instance->buffer_size = buffer_size;
-	instance->setup_buffer = setup_buffer;
-	instance->setup_size = setup_size;
-	instance->fun = fun;
-	instance->private_data = private_data;
-	instance->private_data_dtor = private_data_dtor;
-	instance->transfered_size = 0;
-	instance->next_step = NULL;
-	instance->error = EOK;
-	if (instance->ep)
-		endpoint_use(instance->ep);
+	usb_transfer_batch_t *instance = malloc(sizeof(usb_transfer_batch_t));
+	if (instance) {
+		link_initialize(&instance->link);
+		instance->ep = ep;
+		instance->callback_in = func_in;
+		instance->callback_out = func_out;
+		instance->arg = arg;
+		instance->buffer = buffer;
+		instance->data_buffer = data_buffer;
+		instance->buffer_size = buffer_size;
+		instance->setup_buffer = setup_buffer;
+		instance->setup_size = setup_size;
+		instance->fun = fun;
+		instance->private_data = private_data;
+		instance->private_data_dtor = private_data_dtor;
+		instance->transfered_size = 0;
+		instance->next_step = NULL;
+		instance->error = EOK;
+		if (instance->ep)
+			endpoint_use(instance->ep);
+	}
+	return instance;
 }
 /*----------------------------------------------------------------------------*/
@@ -85,6 +87,4 @@
 {
 	assert(instance);
-	if (instance->ep)
-		endpoint_release(instance->ep);
 	if (instance->next_step)
 		instance->next_step(instance);
@@ -150,4 +150,7 @@
 	usb_log_debug2("Batch %p " USB_TRANSFER_BATCH_FMT " disposing.\n",
 	    instance, USB_TRANSFER_BATCH_ARGS(*instance));
+	if (instance->ep) {
+		endpoint_release(instance->ep);
+	}
 	if (instance->private_data) {
 		assert(instance->private_data_dtor);
Index: uspace/lib/usbhost/src/iface.c
===================================================================
--- uspace/lib/usbhost/src/iface.c	(revision ff6dd7317e8503b9c4de186441ff56be21415bca)
+++ uspace/lib/usbhost/src/iface.c	(revision 70fb8229850edcd3f6f47d4e82abe94c0a27f851)
@@ -71,22 +71,18 @@
 		return ENOSPC;
 	}
-	usb_transfer_batch_t *batch = malloc(sizeof(usb_transfer_batch_t));
+	if (!hcd->schedule) {
+		usb_log_error("HCD does not implement scheduler.\n");
+		return ENOTSUP;
+	}
+
+	/* No private data and no private data dtor */
+	usb_transfer_batch_t *batch =
+	    usb_transfer_batch_get(ep, data, NULL, size, setup_data,
+		setup_size, in, out, arg, fun, NULL, NULL);
 	if (!batch) {
-		ret = ENOMEM;
-		goto out;
-
-	}
-
-	/* No private data and no private data dtor, these will be set later */
-	usb_transfer_batch_init(batch, ep, data, NULL, size, setup_data,
-	    setup_size, in, out, arg, fun, NULL, NULL);
-
-	if (hcd->schedule) {
-		ret = hcd->schedule(hcd, batch);
-	} else {
-		usb_log_error("HCD does not implement scheduler.\n");
-		ret = ENOTSUP;
-	}
-out:
+		return ENOMEM;
+	}
+
+	ret = hcd->schedule(hcd, batch);
 	if (ret != EOK)
 		usb_transfer_batch_dispose(batch);
