Index: uspace/drv/uhci/Makefile
===================================================================
--- uspace/drv/uhci/Makefile	(revision 7977fa1fb2de983b0f7a559b69c727b7ec6169b5)
+++ uspace/drv/uhci/Makefile	(revision 89a0485a2613a49e871bd2a427cf26e4588d5856)
@@ -33,4 +33,5 @@
 
 SOURCES = \
+	callback.c \
 	iface.c \
 	main.c \
@@ -38,4 +39,5 @@
 	root_hub/port_status.c \
 	root_hub/root_hub.c \
+	transfer_list.c \
 	uhci.c 
 
Index: uspace/drv/uhci/callback.c
===================================================================
--- uspace/drv/uhci/callback.c	(revision 89a0485a2613a49e871bd2a427cf26e4588d5856)
+++ uspace/drv/uhci/callback.c	(revision 89a0485a2613a49e871bd2a427cf26e4588d5856)
@@ -0,0 +1,27 @@
+#include <errno.h>
+
+#include "callback.h"
+
+
+int callback_init(callback_t *instance, device_t *dev,
+  void *buffer, size_t size, usbhc_iface_transfer_in_callback_t func_in,
+  usbhc_iface_transfer_out_callback_t func_out, void *arg)
+{
+	assert(instance);
+	assert(func_in == NULL || func_out == NULL);
+	instance->new_buffer = trans_malloc(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);
+
+	instance->callback_out = func_out;
+	instance->callback_in = func_in;
+	instance->old_buffer = buffer;
+	instance->buffer_size = size;
+	instance->dev = dev;
+	return EOK;
+}
Index: uspace/drv/uhci/callback.h
===================================================================
--- uspace/drv/uhci/callback.h	(revision 7977fa1fb2de983b0f7a559b69c727b7ec6169b5)
+++ uspace/drv/uhci/callback.h	(revision 89a0485a2613a49e871bd2a427cf26e4588d5856)
@@ -53,26 +53,8 @@
 
 
-static inline int callback_init(callback_t *instance, device_t *dev,
+int callback_init(callback_t *instance, device_t *dev,
   void *buffer, size_t size, usbhc_iface_transfer_in_callback_t func_in,
-  usbhc_iface_transfer_out_callback_t func_out, void *arg)
-{
-	assert(instance);
-	assert(func_in == NULL || func_out == NULL);
-	instance->new_buffer = trans_malloc(size);
-	if (!instance->new_buffer) {
-		uhci_print_error("Failed to allocate device acessible buffer.\n");
-		return ENOMEM;
-	}
+  usbhc_iface_transfer_out_callback_t func_out, void *arg);
 
-	if (func_out)
-		memcpy(instance->new_buffer, buffer, size);
-
-	instance->callback_out = func_out;
-	instance->callback_in = func_in;
-	instance->old_buffer = buffer;
-	instance->buffer_size = size;
-	instance->dev = dev;
-	return EOK;
-}
 #define callback_in_init(instance, dev, buffer, size, func, arg) \
 	callback_init(instance, dev, buffer, size, func, NULL, arg)
Index: uspace/drv/uhci/transfer_list.c
===================================================================
--- uspace/drv/uhci/transfer_list.c	(revision 89a0485a2613a49e871bd2a427cf26e4588d5856)
+++ uspace/drv/uhci/transfer_list.c	(revision 89a0485a2613a49e871bd2a427cf26e4588d5856)
@@ -0,0 +1,26 @@
+#include <errno.h>
+
+#include "transfer_list.h"
+
+int transfer_list_init(transfer_list_t *instance, transfer_list_t *next)
+{
+	assert(instance);
+	instance->first = NULL;
+	instance->last = NULL;
+	instance->queue_head = trans_malloc(sizeof(queue_head_t));
+	if (!instance->queue_head) {
+		uhci_print_error("Failed to allocate queue head.\n");
+		return ENOMEM;
+	}
+	instance->queue_head_pa = (uintptr_t)addr_to_phys(instance->queue_head);
+
+	uint32_t next_pa = next ? next->queue_head_pa : 0;
+	queue_head_init(instance->queue_head, next_pa);
+	return EOK;
+}
+/*----------------------------------------------------------------------------*/
+int transfer_list_append(
+  transfer_list_t *instance, transfer_descriptor_t *transfer)
+{
+	return EOK;
+}
Index: uspace/drv/uhci/transfer_list.h
===================================================================
--- uspace/drv/uhci/transfer_list.h	(revision 7977fa1fb2de983b0f7a559b69c727b7ec6169b5)
+++ uspace/drv/uhci/transfer_list.h	(revision 89a0485a2613a49e871bd2a427cf26e4588d5856)
@@ -48,21 +48,5 @@
 } transfer_list_t;
 
-static inline int transfer_list_init(
-  transfer_list_t *instance, transfer_list_t *next)
-{
-	assert(instance);
-	instance->first = NULL;
-	instance->last = NULL;
-	instance->queue_head = trans_malloc(sizeof(queue_head_t));
-	if (!instance->queue_head) {
-		uhci_print_error("Failed to allocate queue head.\n");
-		return ENOMEM;
-	}
-	instance->queue_head_pa = (uintptr_t)addr_to_phys(instance->queue_head);
-
-	uint32_t next_pa = next ? next->queue_head_pa : 0;
-	queue_head_init(instance->queue_head, next_pa);
-	return EOK;
-}
+int transfer_list_init(transfer_list_t *instance, transfer_list_t *next);
 
 static inline void transfer_list_fini(transfer_list_t *instance)
@@ -73,4 +57,7 @@
 }
 
+int transfer_list_append(
+  transfer_list_t *instance, transfer_descriptor_t *transfer);
+
 #endif
 /**
Index: uspace/drv/uhci/uhci.c
===================================================================
--- uspace/drv/uhci/uhci.c	(revision 7977fa1fb2de983b0f7a559b69c727b7ec6169b5)
+++ uspace/drv/uhci/uhci.c	(revision 89a0485a2613a49e871bd2a427cf26e4588d5856)
@@ -22,5 +22,5 @@
 	if (!instance)
 		{ return ENOMEM; }
-	memset( instance, 0, sizeof(uhci_t) );
+	bzero( instance, sizeof(uhci_t) );
 
 	/* init address keeper(libusb) */
@@ -86,37 +86,42 @@
 		return ENOTSUP;
 
-	callback_t *job = malloc(sizeof(callback_t));
-	if (job == NULL) {
-		uhci_print_error("Failed to allocate callback structure.\n");
-		return ENOMEM;
-	}
+	transfer_descriptor_t *td = NULL;
+	callback_t *job = NULL;
+	int ret = EOK;
 
-#define CHECK_RET_FREE_JOB(r, message) \
-	if (r != EOK) { \
+#define CHECK_RET_TRANS_FREE_JOB_TD(message) \
+	if (ret != EOK) { \
 		uhci_print_error(message); \
-		callback_fini(job); \
-		trans_free(job); \
-		return r; \
+		if (job) { \
+			callback_fini(job); \
+			trans_free(job); \
+		} \
+		if (td) { trans_free(td); } \
+		return ret; \
 	} else (void) 0
 
-	int ret = callback_in_init(job, dev, buffer, size, callback, arg);
-	CHECK_RET_FREE_JOB(ret, "Failed to initialize callback structure.\n");
 
-	transfer_descriptor_t *td = trans_malloc(sizeof(transfer_descriptor_t));
-	ret = (td == NULL) ? ENOMEM : EOK;
-	CHECK_RET_FREE_JOB(ret, "Failed to allocate tranfer descriptor.\n");
+	job = malloc(sizeof(callback_t));
+	ret= job ? EOK : ENOMEM;
+	CHECK_RET_TRANS_FREE_JOB_TD("Failed to allocate callback structure.\n");
+
+	ret = callback_in_init(job, dev, buffer, size, callback, arg);
+	CHECK_RET_TRANS_FREE_JOB_TD("Failed to initialize callback structure.\n");
+
+	td = trans_malloc(sizeof(transfer_descriptor_t));
+	ret = td ? ENOMEM : EOK;
+	CHECK_RET_TRANS_FREE_JOB_TD("Failed to allocate tranfer descriptor.\n");
 
 	ret = transfer_descriptor_init(td, 3, size, false, target, USB_PID_IN);
-	if (ret != EOK) {
-		uhci_print_error("Failed to initialize transfer descriptor.\n");
-		trans_free(td);
-		trans_free(job);
-		return ret;
-	}
+	CHECK_RET_TRANS_FREE_JOB_TD("Failed to initialize transfer descriptor.\n");
+
 	td->callback = job;
 
+	assert(dev);
+	uhci_t *instance = (uhci_t*)dev->driver_data;
+	assert(instance);
 
-	// TODO: add to list
-//	callback(dev, USB_OUTCOME_OK, size, arg);
+	ret = transfer_list_append(&instance->transfers[transfer_type], td);
+	CHECK_RET_TRANS_FREE_JOB_TD("Failed to append transfer descriptor.\n");
 
 	return EOK;
