Index: uspace/drv/uhci/callback.c
===================================================================
--- uspace/drv/uhci/callback.c	(revision b3258ad4b0b986a4255151023509fd72b2892a84)
+++ uspace/drv/uhci/callback.c	(revision 4046c1ea8e1b824b9c8a3db101bb6d415365119f)
@@ -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/root_hub/port.c
===================================================================
--- uspace/drv/uhci/root_hub/port.c	(revision b3258ad4b0b986a4255151023509fd72b2892a84)
+++ uspace/drv/uhci/root_hub/port.c	(revision 4046c1ea8e1b824b9c8a3db101bb6d415365119f)
@@ -44,11 +44,4 @@
 			if (port_status & STATUS_CONNECTED) {
 				/* new device */
-				port_status |= STATUS_IN_RESET;
-				port_status_write(port_instance->address, port_status);
-				async_usleep(1000);
-				port_status =
-					port_status_read(port_instance->address);
-				port_status &= ~STATUS_IN_RESET;
-				port_status_write(port_instance->address, port_status);
 				uhci_port_new_device(port_instance);
 			} else {
@@ -79,7 +72,25 @@
 		return usb_address;
 	}
+	/*
+	 * the host then waits for at least 100 ms to allow completion of
+	 * an insertion process and for power at the device to become stable.
+	 */
+	async_usleep(100000);
 
 	/* enable port */
 	uhci_port_set_enabled(port, true);
+
+	/* The hub maintains the reset signal to that port for 10 ms
+	 * (See Section 11.5.1.5)
+	 */
+	port_status_t port_status =
+		port_status_read(port->address);
+	port_status |= STATUS_IN_RESET;
+	port_status_write(port->address, port_status);
+	async_usleep(10000);
+	port_status =
+		port_status_read(port->address);
+	port_status &= ~STATUS_IN_RESET;
+	port_status_write(port->address, port_status);
 
 	/* assign address to device */
Index: uspace/drv/uhci/uhci.c
===================================================================
--- uspace/drv/uhci/uhci.c	(revision b3258ad4b0b986a4255151023509fd72b2892a84)
+++ uspace/drv/uhci/uhci.c	(revision 4046c1ea8e1b824b9c8a3db101bb6d415365119f)
@@ -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");
@@ -227,8 +228,8 @@
 		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 (%s,%s,%s,%s,%s,%s)\n",
+		uhci_print_info("Status register: %X (%s,%s,%s,%s,%s,%s)\n",
 		    reg,
 		    UHCI_GET_STR_FLAG(reg, UHCI_STATUS_HALTED, "halted", "-"),
Index: uspace/drv/uhci/uhci_struct/transfer_descriptor.c
===================================================================
--- uspace/drv/uhci/uhci_struct/transfer_descriptor.c	(revision b3258ad4b0b986a4255151023509fd72b2892a84)
+++ uspace/drv/uhci/uhci_struct/transfer_descriptor.c	(revision 4046c1ea8e1b824b9c8a3db101bb6d415365119f)
@@ -52,15 +52,21 @@
 	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 buffer_dump[BUFFER_LEN];
 	buffer_to_str(buffer_dump, BUFFER_LEN, buffer, size);
 	uhci_print_verbose("Buffer dump (%zuB): %s.\n", size, buffer_dump);
 
+	if (size) {
+		instance->buffer_ptr = (uintptr_t)addr_to_phys(buffer);
+
+		uhci_print_verbose("Creating buffer field: %p(%p).\n",
+			buffer, instance->buffer_ptr);
+	} else {
+		instance->buffer_ptr = 0;
+	}
+
+
 	instance->next_va = NULL;
 	instance->callback = NULL;
+	uhci_print_info("Created a new TD.\n");
 }
 
@@ -98,5 +104,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
 	);
 }
