Index: uspace/drv/bus/usb/ohci/batch.c
===================================================================
--- uspace/drv/bus/usb/ohci/batch.c	(revision 4f0e510eee06ade0b9c832000adba0eb5d928c9b)
+++ uspace/drv/bus/usb/ohci/batch.c	(revision 90dd59dcdd7810ff0b649b59ab64cc30c6b3d0de)
@@ -43,4 +43,31 @@
 #include "hw_struct/endpoint_descriptor.h"
 #include "hw_struct/transfer_descriptor.h"
+/*
+static void batch_control_write(usb_transfer_batch_t *instance);
+static void batch_control_read(usb_transfer_batch_t *instance);
+
+static void batch_interrupt_in(usb_transfer_batch_t *instance);
+static void batch_interrupt_out(usb_transfer_batch_t *instance);
+
+static void batch_bulk_in(usb_transfer_batch_t *instance);
+static void batch_bulk_out(usb_transfer_batch_t *instance);
+*/
+static void batch_setup_control(usb_transfer_batch_t *batch)
+{
+        // TODO Find a better way to do this
+        if (batch->setup_buffer[0] & (1 << 7))
+                batch_control_read(batch);
+        else
+                batch_control_write(batch);
+}
+
+void (*batch_setup[4][3])(usb_transfer_batch_t*) =
+{
+        { NULL, NULL, batch_setup_control },
+        { NULL, NULL, NULL },
+        { batch_bulk_in, batch_bulk_out, NULL },
+        { batch_interrupt_in, batch_interrupt_out, NULL },
+};
+
 
 /** OHCI specific data required for USB transfer */
@@ -140,4 +167,7 @@
 		batch->data_buffer = data->device_buffer + batch->setup_size;
         }
+
+        assert(batch_setup[batch->ep->transfer_type][batch->ep->direction]);
+        batch_setup[batch->ep->transfer_type][batch->ep->direction](batch);
 
 	return EOK;
Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision 4f0e510eee06ade0b9c832000adba0eb5d928c9b)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision 90dd59dcdd7810ff0b649b59ab64cc30c6b3d0de)
@@ -163,4 +163,10 @@
 }
 /*----------------------------------------------------------------------------*/
+static int schedule(hcd_t *hcd, usb_transfer_batch_t *batch)
+{
+	assert(hcd);
+	return hc_schedule(hcd->private_data, batch);
+}
+/*----------------------------------------------------------------------------*/
 /** Initialize OHCI hc driver structure
  *
@@ -195,5 +201,6 @@
 
 	ret = hcd_init(&instance->generic, BANDWIDTH_AVAILABLE_USB11);
-	instance->generic.schedule = NULL;
+	instance->generic.private_data = instance;
+	instance->generic.schedule = schedule;
 	instance->generic.batch_init_hook = batch_init_ohci;
 	instance->generic.ep_add_hook = NULL;
