Index: uspace/drv/uhci/uhci.c
===================================================================
--- uspace/drv/uhci/uhci.c	(revision d03ade7c9f858b52fbdb309ff653cb20256dae7b)
+++ uspace/drv/uhci/uhci.c	(revision 9ee87f6fbd36d5ead24934f61d4297ce0becdb30)
@@ -9,6 +9,6 @@
 #include "uhci.h"
 
-static int uhci_init_tranfer_lists(transfer_list_t list[]);
-
+static int uhci_init_transfer_lists(transfer_list_t list[]);
+static int uhci_clean_finished(void *arg);
 static inline int uhci_add_transfer(
   device_t *dev,
@@ -23,36 +23,43 @@
 int uhci_init(device_t *device, void *regs)
 {
-	assert( device );
-	uhci_print_info( "Initializing device at address %p\n", device);
+	assert(device);
+	uhci_print_info("Initializing device at address %p.\n", device);
+
+#define CHECK_RET_FREE_INSTANCE(message...) \
+	if (ret != EOK) { \
+		uhci_print_error(message); \
+		if (instance) { \
+			free(instance); \
+		} \
+		return ret; \
+	} else (void) 0
 
 	/* create instance */
 	uhci_t *instance = malloc( sizeof(uhci_t) );
-	if (!instance)
-		{ return ENOMEM; }
-	bzero( instance, sizeof(uhci_t) );
+	int ret = instance ? EOK : ENOMEM;
+	CHECK_RET_FREE_INSTANCE("Failed to allocate uhci driver instance.\n");
+
+	bzero(instance, sizeof(uhci_t));
 
 	/* init address keeper(libusb) */
-	usb_address_keeping_init( &instance->address_manager, USB11_ADDRESS_MAX );
+	usb_address_keeping_init(&instance->address_manager, USB11_ADDRESS_MAX);
 
 	/* allow access to hc control registers */
 	regs_t *io;
-	int ret = pio_enable( regs, sizeof(regs_t), (void**)&io);
-	if (ret < 0) {
-		free( instance );
-		uhci_print_error("Failed to gain access to registers at %p\n", io);
-		return ret;
-	}
+	ret = pio_enable(regs, sizeof(regs_t), (void**)&io);
+	CHECK_RET_FREE_INSTANCE("Failed to gain access to registers at %p.\n", io);
 	instance->registers = io;
+
+	/* init transfer lists */
+	ret = uhci_init_transfer_lists(instance->transfers);
+	CHECK_RET_FREE_INSTANCE("Failed to initialize transfer lists.\n");
 
 	/* init root hub */
 	ret = uhci_root_hub_init(&instance->root_hub, device,
 	  (char*)regs + UHCI_ROOT_HUB_PORT_REGISTERS_OFFSET);
-	if (ret < 0) {
-		free(instance);
-		uhci_print_error("Failed to initialize root hub driver.\n");
-		return ret;
-	}
-
-	instance->frame_list = trans_malloc(sizeof(frame_list_t));
+	CHECK_RET_FREE_INSTANCE("Failed to initialize root hub driver.\n");
+
+	instance->frame_list =
+	  trans_malloc(sizeof(link_pointer_t) * UHCI_FRAME_LIST_COUNT);
 	if (instance->frame_list == NULL) {
 		uhci_print_error("Failed to allocate frame list pointer.\n");
@@ -62,15 +69,19 @@
 	}
 
+	/* initialize all frames to point to the first queue head */
+	unsigned i = 0;
+	const uint32_t queue =
+	  instance->transfers[USB_TRANSFER_INTERRUPT].queue_head_pa
+	  | LINK_POINTER_QUEUE_HEAD_FLAG;
+	for(; i < UHCI_FRAME_LIST_COUNT; ++i) {
+		instance->frame_list[i] = queue;
+	}
+
 	const uintptr_t pa = (uintptr_t)addr_to_phys(instance->frame_list);
 
 	pio_write_32(&instance->registers->flbaseadd, (uint32_t)pa);
 
-	ret = uhci_init_tranfer_lists(instance->transfers);
-	if (ret != EOK) {
-		uhci_print_error("Transfer list initialization failed.\n");
-		uhci_root_hub_fini(&instance->root_hub);
-		free(instance);
-		return ret;
-	}
+	instance->cleaner = fibril_create(uhci_clean_finished, instance);
+	fibril_add_ready(instance->cleaner);
 
 	device->driver_data = instance;
@@ -129,5 +140,5 @@
 }
 /*----------------------------------------------------------------------------*/
-int uhci_init_tranfer_lists(transfer_list_t transfers[])
+int uhci_init_transfer_lists(transfer_list_t transfers[])
 {
 	//TODO:refactor
@@ -220,2 +231,15 @@
 	return EOK;
 }
+/*----------------------------------------------------------------------------*/
+int uhci_clean_finished(void* arg)
+{
+	uhci_print_verbose("Started cleaning fibril.\n");
+	uhci_t *instance = (uhci_t*)arg;
+	assert(instance);
+	while(1) {
+		uhci_print_verbose("Running cleaning fibril on %p.\n", instance);
+
+		async_usleep(1000000);
+	}
+	return EOK;
+}
Index: uspace/drv/uhci/uhci.h
===================================================================
--- uspace/drv/uhci/uhci.h	(revision d03ade7c9f858b52fbdb309ff653cb20256dae7b)
+++ uspace/drv/uhci/uhci.h	(revision 9ee87f6fbd36d5ead24934f61d4297ce0becdb30)
@@ -42,7 +42,5 @@
 
 #include "root_hub/root_hub.h"
-#include "uhci_struct/frame_list.h"
 #include "transfer_list.h"
-
 
 typedef struct uhci_regs {
@@ -56,4 +54,5 @@
 
 #define TRANSFER_QUEUES 4
+#define UHCI_FRAME_LIST_COUNT 1024
 
 typedef struct uhci {
@@ -62,7 +61,8 @@
 	volatile regs_t *registers;
 
-	frame_list_t *frame_list;
+	link_pointer_t *frame_list;
 
 	transfer_list_t transfers[TRANSFER_QUEUES];
+	fid_t cleaner;
 } uhci_t;
 
Index: uspace/drv/uhci/uhci_struct/frame_list.h
===================================================================
--- uspace/drv/uhci/uhci_struct/frame_list.h	(revision d03ade7c9f858b52fbdb309ff653cb20256dae7b)
+++ 	(revision )
@@ -1,45 +1,0 @@
-/*
- * Copyright (c) 2010 Jan Vesely
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/** @addtogroup usb
- * @{
- */
-/** @file
- * @brief UHCI driver
- */
-#ifndef DRV_UHCI_FRAME_LIST_H
-#define DRV_UHCI_FRAME_LIST_H
-
-#include "link_pointer.h"
-
-#define UHCI_FRAME_LIST_COUNT 1024
-
-typedef link_pointer_t frame_list_t[UHCI_FRAME_LIST_COUNT];
-#endif
-/**
- * @}
- */
