Index: uspace/drv/uhci/callback.c
===================================================================
--- uspace/drv/uhci/callback.c	(revision e68de307689270140bf40dc1c2e2f9b934f9e550)
+++ uspace/drv/uhci/callback.c	(revision 44d8853ddcf3e669f294bc785f5a9915ff61c547)
@@ -9,12 +9,16 @@
 	assert(instance);
 	assert(func_in == NULL || func_out == NULL);
-	instance->new_buffer = malloc32(size);
-	if (!instance->new_buffer) {
-		uhci_print_error("Failed to allocate device acessible buffer.\n");
-		return ENOMEM;
+	if (size > 0) {
+		instance->new_buffer = malloc32(size);
+		if (!instance->new_buffer) {
+			uhci_print_error("Failed to allocate device acessible buffer.\n");
+			return ENOMEM;
+		}
+		if (func_out)
+			memcpy(instance->new_buffer, buffer, size);
+	} else {
+		instance->new_buffer = NULL;
 	}
 
-	if (func_out)
-		memcpy(instance->new_buffer, buffer, size);
 
 	instance->callback_out = func_out;
Index: uspace/drv/uhci/uhci.c
===================================================================
--- uspace/drv/uhci/uhci.c	(revision e68de307689270140bf40dc1c2e2f9b934f9e550)
+++ uspace/drv/uhci/uhci.c	(revision 44d8853ddcf3e669f294bc785f5a9915ff61c547)
@@ -175,4 +175,5 @@
 	assert(instance);
 
+	uhci_print_verbose("Appending a new transfer to queue.\n");
 	ret = transfer_list_append(&instance->transfers[transfer_type], td);
 	CHECK_RET_TRANS_FREE_JOB_TD("Failed to append transfer descriptor.\n");
@@ -226,7 +227,7 @@
 		uint16_t reg;
 		reg = pio_read_16(&instance->registers->usbcmd);
-		uhci_print_verbose("Command register: %X\n", reg);
+		uhci_print_info("Command register: %X\n", reg);
 		reg = pio_read_16(&instance->registers->usbsts);
-		uhci_print_verbose("Status register: %X\n", reg);
+		uhci_print_info("Status register: %X\n", reg);
 /*
 		uintptr_t frame_list = pio_read_32(&instance->registers->flbaseadd);
Index: uspace/drv/uhci/uhci_struct/transfer_descriptor.c
===================================================================
--- uspace/drv/uhci/uhci_struct/transfer_descriptor.c	(revision e68de307689270140bf40dc1c2e2f9b934f9e550)
+++ uspace/drv/uhci/uhci_struct/transfer_descriptor.c	(revision 44d8853ddcf3e669f294bc785f5a9915ff61c547)
@@ -27,16 +27,23 @@
 	uhci_print_verbose("Creating device field: %x.\n", instance->device);
 
-	instance->buffer_ptr = (uintptr_t)addr_to_phys(buffer);
+	if (size) {
+		instance->buffer_ptr = (uintptr_t)addr_to_phys(buffer);
 
-	uhci_print_verbose("Creating buffer field: %p(%p).\n",
-	  buffer, instance->buffer_ptr);
+		uhci_print_verbose("Creating buffer field: %p(%p).\n",
+			buffer, instance->buffer_ptr);
 
-	char * buff = buffer;
+		if (size >= 8) {
+			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]);
+			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]);
+		}
+	} else {
+		instance->buffer_ptr = 0;
+	}
 
 	instance->next_va = NULL;
 	instance->callback = NULL;
+	uhci_print_info("Created a new TD.\n");
 }
 
@@ -74,5 +81,5 @@
 	callback_run(instance->callback,
 		convert_outcome(instance->status),
-		instance->status >> TD_STATUS_ACTLEN_POS & TD_STATUS_ACTLEN_MASK
+		((instance->status >> TD_STATUS_ACTLEN_POS) + 1) & TD_STATUS_ACTLEN_MASK
 	);
 }
