Index: uspace/drv/uhci/uhci.c
===================================================================
--- uspace/drv/uhci/uhci.c	(revision 01656f24a16374d611f35d2583af670c9dd92a58)
+++ uspace/drv/uhci/uhci.c	(revision 3da5eb925934ac9d5b7a9d2911bc9df3fdd8b7c8)
@@ -85,8 +85,10 @@
 
 	uhci_print_verbose("Starting UHCI HC.\n");
+	pio_write_16(&instance->registers->usbcmd, UHCI_CMD_RUN_STOP);
+/*
 	uint16_t cmd = pio_read_16(&instance->registers->usbcmd);
-	cmd |= UHCI_CMD_RUN_STOP | UHCI_CMD_CONFIGURE;
+	cmd |= UHCI_CMD_DEBUG;
 	pio_write_16(&instance->registers->usbcmd, cmd);
-
+*/
 	device->driver_data = instance;
 	return EOK;
@@ -163,5 +165,5 @@
 	CHECK_RET_TRANS_FREE_JOB_TD("Failed to allocate callback structure.\n");
 
-	td = transfer_descriptor_get(3, size, false, target, pid);
+	td = transfer_descriptor_get(3, size, false, target, pid, job->new_buffer);
 	ret = td ? EOK : ENOMEM;
 	CHECK_RET_TRANS_FREE_JOB_TD("Failed to setup transfer descriptor.\n");
@@ -178,5 +180,5 @@
 	return EOK;
 }
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
 int uhci_clean_finished(void* arg)
 {
@@ -196,8 +198,14 @@
 			uhci_print_verbose("Running cleaning fibril on queue: %p (%s).\n",
 				&instance->transfers[i], it ? "SOMETHING" : "EMPTY");
+
+		if (it)
+			uhci_print_verbose("First in queue: %p (%x).\n",
+				it, it->status);
+
 			while (instance->transfers[i].first &&
 			 !(instance->transfers[i].first->status & TD_STATUS_ERROR_ACTIVE)) {
 				transfer_descriptor_t *transfer = instance->transfers[i].first;
-				uhci_print_info("Inactive transfer calling callback.\n");
+				uhci_print_info("Inactive transfer calling callback with status %x.\n",
+				  transfer->status);
 				instance->transfers[i].first = transfer->next_va;
 				transfer_descriptor_dispose(transfer);
@@ -213,5 +221,4 @@
 int uhci_debug_checker(void *arg)
 {
-	return 0;
 	uhci_t *instance = (uhci_t*)arg;
 	assert(instance);
@@ -222,4 +229,5 @@
 		reg = pio_read_16(&instance->registers->usbsts);
 		uhci_print_verbose("Status register: %X\n", reg);
+/*
 		uintptr_t frame_list = pio_read_32(&instance->registers->flbaseadd);
 		uhci_print_verbose("Framelist address: %p vs. %p.\n",
@@ -238,4 +246,8 @@
 		uhci_print_verbose("Bulk QH: %p vs. %p.\n", qh->next_queue,
 			addr_to_phys(instance->transfers[USB_TRANSFER_BULK].queue_head));
+	uint16_t cmd = pio_read_16(&instance->registers->usbcmd);
+	cmd |= UHCI_CMD_RUN_STOP;
+	pio_write_16(&instance->registers->usbcmd, cmd);
+*/
 
 		async_usleep(UHCI_DEBUGER_TIMEOUT);
Index: uspace/drv/uhci/uhci.h
===================================================================
--- uspace/drv/uhci/uhci.h	(revision 01656f24a16374d611f35d2583af670c9dd92a58)
+++ uspace/drv/uhci/uhci.h	(revision 3da5eb925934ac9d5b7a9d2911bc9df3fdd8b7c8)
@@ -65,5 +65,5 @@
 #define UHCI_FRAME_LIST_COUNT 1024
 #define UHCI_CLEANER_TIMEOUT 5000000
-#define UHCI_DEBUGER_TIMEOUT 3000000
+#define UHCI_DEBUGER_TIMEOUT 2500000
 
 typedef struct uhci {
Index: uspace/drv/uhci/uhci_struct/transfer_descriptor.c
===================================================================
--- uspace/drv/uhci/uhci_struct/transfer_descriptor.c	(revision 01656f24a16374d611f35d2583af670c9dd92a58)
+++ uspace/drv/uhci/uhci_struct/transfer_descriptor.c	(revision 3da5eb925934ac9d5b7a9d2911bc9df3fdd8b7c8)
@@ -3,10 +3,12 @@
 void transfer_descriptor_init(transfer_descriptor_t *instance,
   int error_count, size_t size, bool isochronous, usb_target_t target,
-	int pid)
+	int pid, void *buffer)
 {
 	assert(instance);
 
 	instance->next =
-	  0 | LINK_POINTER_VERTICAL_FLAG | LINK_POINTER_TERMINATE_FLAG;
+	  0 | LINK_POINTER_TERMINATE_FLAG;
+
+	uhci_print_verbose("Creating link field: %x.\n", instance->next);
 
 	assert(size < 1024);
@@ -18,8 +20,20 @@
 
 	instance->device = 0
-		| ((size & TD_DEVICE_MAXLEN_MASK) << TD_DEVICE_MAXLEN_POS)
+		| (((size - 1) & TD_DEVICE_MAXLEN_MASK) << TD_DEVICE_MAXLEN_POS)
 		| ((target.address & TD_DEVICE_ADDRESS_MASK) << TD_DEVICE_ADDRESS_POS)
 		| ((target.endpoint & TD_DEVICE_ENDPOINT_MASK) << TD_DEVICE_ENDPOINT_POS)
 		| ((pid & TD_DEVICE_PID_MASK) << TD_DEVICE_PID_POS);
+
+	uhci_print_verbose("Creating device field: %x.\n", instance->device);
+
+	instance->buffer_ptr = (uintptr_t)addr_to_phys(buffer);
+
+	uhci_print_verbose("Creating buffer field: %p(%p).\n",
+	  buffer, instance->buffer_ptr);
+
+	char * buff = buffer;
+
+	uhci_print_verbose("Buffer dump(8B): %x %x %x %x %x %x %x %x.\n",
+	  buff[0], buff[1], buff[2], buff[3], buff[4], buff[5], buff[6], buff[7]);
 
 	instance->next_va = NULL;
Index: uspace/drv/uhci/uhci_struct/transfer_descriptor.h
===================================================================
--- uspace/drv/uhci/uhci_struct/transfer_descriptor.h	(revision 01656f24a16374d611f35d2583af670c9dd92a58)
+++ uspace/drv/uhci/uhci_struct/transfer_descriptor.h	(revision 3da5eb925934ac9d5b7a9d2911bc9df3fdd8b7c8)
@@ -98,8 +98,9 @@
 void transfer_descriptor_init(transfer_descriptor_t *instance,
   int error_count, size_t size, bool isochronous, usb_target_t target,
-	int pid);
+	int pid, void *buffer);
 
 static inline transfer_descriptor_t * transfer_descriptor_get(
-  int error_count, size_t size, bool isochronous, usb_target_t target, int pid)
+  int error_count, size_t size, bool isochronous, usb_target_t target,
+  int pid, void *buffer)
 {
 	transfer_descriptor_t * instance =
@@ -108,5 +109,5 @@
 	if (instance)
 		transfer_descriptor_init(
-		  instance, error_count, size, isochronous, target, pid);
+		  instance, error_count, size, isochronous, target, pid, buffer);
 	return instance;
 }
