Index: uspace/drv/ohci/batch.c
===================================================================
--- uspace/drv/ohci/batch.c	(revision be7950e872211bfaca7d6762e27f7b87dec4ec02)
+++ uspace/drv/ohci/batch.c	(revision 2bf8f8cc6fdeecb4df0a8b3d10633221f2ae058e)
@@ -39,4 +39,5 @@
 
 #include "batch.h"
+#include "utils/malloc32.h"
 
 #define DEFAULT_ERROR_COUNT 3
@@ -48,5 +49,5 @@
     usb_speed_t speed,
 		char *buffer,
-		size_t size,
+		size_t buffer_size,
 		char *setup_buffer,
 		size_t setup_size,
@@ -57,33 +58,70 @@
 		)
 {
-	return NULL;
+#define CHECK_NULL_DISPOSE_RETURN(ptr, message...) \
+        if (ptr == NULL) { \
+                usb_log_error(message); \
+                if (instance) { \
+                        batch_dispose(instance); \
+                } \
+                return NULL; \
+        } else (void)0
+
+	batch_t *instance = malloc(sizeof(batch_t));
+	CHECK_NULL_DISPOSE_RETURN(instance,
+	    "Failed to allocate batch instance.\n");
+	batch_init(instance, target, transfer_type, speed, max_packet_size,
+	    buffer, NULL, buffer_size, NULL, setup_size, func_in,
+	    func_out, arg, fun, NULL);
+
+        if (buffer_size > 0) {
+                instance->transport_buffer = malloc32(buffer_size);
+                CHECK_NULL_DISPOSE_RETURN(instance->transport_buffer,
+                    "Failed to allocate device accessible buffer.\n");
+        }
+
+        if (setup_size > 0) {
+                instance->setup_buffer = malloc32(setup_size);
+                CHECK_NULL_DISPOSE_RETURN(instance->setup_buffer,
+                    "Failed to allocate device accessible setup buffer.\n");
+                memcpy(instance->setup_buffer, setup_buffer, setup_size);
+        }
+
+
+	return instance;
 }
 /*----------------------------------------------------------------------------*/
 void batch_dispose(batch_t *instance)
 {
+	assert(instance);
 }
 /*----------------------------------------------------------------------------*/
 void batch_control_write(batch_t *instance)
 {
+	assert(instance);
 }
 /*----------------------------------------------------------------------------*/
 void batch_control_read(batch_t *instance)
 {
+	assert(instance);
 }
 /*----------------------------------------------------------------------------*/
 void batch_interrupt_in(batch_t *instance)
 {
+	assert(instance);
 }
 /*----------------------------------------------------------------------------*/
 void batch_interrupt_out(batch_t *instance)
 {
+	assert(instance);
 }
 /*----------------------------------------------------------------------------*/
 void batch_bulk_in(batch_t *instance)
 {
+	assert(instance);
 }
 /*----------------------------------------------------------------------------*/
 void batch_bulk_out(batch_t *instance)
 {
+	assert(instance);
 }
 /**
Index: uspace/drv/ohci/hc.c
===================================================================
--- uspace/drv/ohci/hc.c	(revision be7950e872211bfaca7d6762e27f7b87dec4ec02)
+++ uspace/drv/ohci/hc.c	(revision 2bf8f8cc6fdeecb4df0a8b3d10633221f2ae058e)
@@ -108,6 +108,5 @@
 	assert(batch);
 	if (batch->target.address == instance->rh.address) {
-		rh_request(&instance->rh, batch);
-		return EOK;
+		return rh_request(&instance->rh, batch);
 	}
 	/* TODO: implement */
Index: uspace/drv/ohci/root_hub.c
===================================================================
--- uspace/drv/ohci/root_hub.c	(revision be7950e872211bfaca7d6762e27f7b87dec4ec02)
+++ uspace/drv/ohci/root_hub.c	(revision 2bf8f8cc6fdeecb4df0a8b3d10633221f2ae058e)
@@ -56,8 +56,9 @@
 }
 /*----------------------------------------------------------------------------*/
-void rh_request(rh_t *instance, batch_t *request)
+int rh_request(rh_t *instance, batch_t *request)
 {
-	usb_log_error("Request processing not implemented.\n");
 	/* TODO: implement */
+	usb_log_error("Root hub request processing not implemented.\n");
+	return ENOTSUP;
 }
 /*----------------------------------------------------------------------------*/
Index: uspace/drv/ohci/root_hub.h
===================================================================
--- uspace/drv/ohci/root_hub.h	(revision be7950e872211bfaca7d6762e27f7b87dec4ec02)
+++ uspace/drv/ohci/root_hub.h	(revision 2bf8f8cc6fdeecb4df0a8b3d10633221f2ae058e)
@@ -49,5 +49,5 @@
 int rh_init(rh_t *instance, ddf_dev_t *dev, ohci_regs_t *regs);
 
-void rh_request(rh_t *instance, batch_t *request);
+int rh_request(rh_t *instance, batch_t *request);
 
 void rh_interrupt(rh_t *instance);
