Index: uspace/drv/uhci-hcd/tracker.c
===================================================================
--- uspace/drv/uhci-hcd/tracker.c	(revision 9e809049359908fb13cd4bb5e3a515e55043a2d1)
+++ uspace/drv/uhci-hcd/tracker.c	(revision c8dd5b1c2568196acee4569bb1110c4ebaed6053)
@@ -163,4 +163,5 @@
 	    instance->buffer_size - instance->buffer_offset);
 
+	//TODO: add toggle here
 	transfer_descriptor_init(instance->td, DEFAULT_ERROR_COUNT,
 	    instance->packet_size, false, instance->target, USB_PID_IN,
@@ -171,5 +172,5 @@
 	/* set next step */
 	if ((instance->buffer_offset + instance->packet_size)
-	    < instance->buffer_size) {
+	    >= instance->buffer_size) {
 		/* that's all, end coomunication */
 		instance->next_step = tracker_control_read_status;
@@ -196,4 +197,6 @@
 	memcpy(instance->packet, instance->buffer + instance->buffer_offset,
 	    instance->packet_size);
+
+	// TODO: add toggle here
 	transfer_descriptor_init(instance->td, DEFAULT_ERROR_COUNT,
 	    instance->packet_size, false, instance->target, USB_PID_OUT,
@@ -204,5 +207,5 @@
 	/* set next step */
 	if ((instance->buffer_offset + instance->packet_size)
-	    < instance->buffer_size) {
+	    >= instance->buffer_size) {
 		/* that's all, end coomunication */
 		instance->next_step = tracker_control_write_status;
@@ -268,8 +271,72 @@
 void tracker_interrupt_in(tracker_t *instance)
 {
+	assert(instance);
+
+	/* check for errors */
+	int err = transfer_descriptor_status(instance->td);
+	if (err != EOK) {
+		tracker_call_in_and_dispose(instance);
+		return;
+	}
+
+	if (instance->packet_size) {
+		/* we are data in, we want data from our device. if there is data */
+		memcpy(instance->buffer + instance->buffer_offset, instance->packet,
+				instance->packet_size);
+		instance->buffer_offset += instance->packet_size;
+	}
+
+	/* prepare next packet, no copy, we are receiving data */
+	instance->packet_size =	MIN(instance->max_packet_size,
+			instance->buffer_size - instance->buffer_offset);
+
+	//TODO: add toggle here
+	transfer_descriptor_init(instance->td, DEFAULT_ERROR_COUNT,
+	    instance->packet_size, false, instance->target, USB_PID_IN,
+	    instance->packet);
+
+	tracker_schedule(instance);
+
+	/* set next step */
+	if ((instance->buffer_offset + instance->packet_size)
+	    >= instance->buffer_size) {
+		/* that's all, end coomunication */
+		instance->next_step = tracker_call_in_and_dispose;
+	}
 }
 /*----------------------------------------------------------------------------*/
 void tracker_interrupt_out(tracker_t *instance)
 {
+	assert(instance);
+
+	/* check for errors */
+	int err = transfer_descriptor_status(instance->td);
+	if (err != EOK) {
+		tracker_call_out_and_dispose(instance);
+		return;
+	}
+
+	/* we are data out, we down't want data from our device */
+	instance->buffer_offset += instance->packet_size;
+
+	/* prepare next packet, copy data to packet */
+	instance->packet_size =	MIN(instance->max_packet_size,
+	    instance->buffer_size - instance->buffer_offset);
+	memcpy(instance->packet, instance->buffer + instance->buffer_offset,
+	    instance->packet_size);
+
+	// TODO: add toggle here
+	transfer_descriptor_init(instance->td, DEFAULT_ERROR_COUNT,
+	    instance->packet_size, false, instance->target, USB_PID_OUT,
+	    instance->packet);
+
+	tracker_schedule(instance);
+
+	/* set next step */
+	if ((instance->buffer_offset + instance->packet_size)
+	    >= instance->buffer_size) {
+		/* that's all, end coomunication */
+		instance->next_step = tracker_call_out_and_dispose;
+	}
 }
 /*----------------------------------------------------------------------------*/
