Index: uspace/drv/bus/usb/ehci/endpoint_list.c
===================================================================
--- uspace/drv/bus/usb/ehci/endpoint_list.c	(revision dc44023a126c400bd80646b282a56f72d8170292)
+++ uspace/drv/bus/usb/ehci/endpoint_list.c	(revision 5f5321eee7f6f64bb0d3ae16e416c1cf8e54d183)
@@ -82,5 +82,5 @@
 	assert(ep);
 	assert(ep->qh);
-	usb_log_debug2("Queue %s: Adding endpoint(%p).\n", instance->name, ep);
+	usb_log_debug2("Queue %s: Append endpoint(%p).\n", instance->name, ep);
 
 	fibril_mutex_lock(&instance->guard);
@@ -103,7 +103,7 @@
 	write_barrier();
 
-	/* Add ed to the hw queue */
+	/* Add QH to the hw queue */
 	qh_append_qh(last_qh, ep->qh);
-	/* Make sure ED is updated */
+	/* Make sure QH is updated */
 	write_barrier();
 	/* Add to the sw list */
@@ -122,4 +122,29 @@
 }
 
+/** Add endpoint to the beginning of the list and queue.
+ *
+ * @param[in] instance List to use.
+ * @param[in] endpoint Endpoint to add.
+ *
+ * The endpoint is added to the end of the list and queue.
+ */
+void endpoint_list_prepend_ep(endpoint_list_t *instance, ehci_endpoint_t *ep)
+{
+	assert(instance);
+	assert(ep);
+	assert(ep->qh);
+	usb_log_debug2("Queue %s: Prepend endpoint(%p).\n", instance->name, ep);
+
+	fibril_mutex_lock(&instance->guard);
+	ep->qh->horizontal = instance->list_head->horizontal;
+	/* Make sure QH is updated */
+	write_barrier();
+	/* Add QH to the hw queue */
+	qh_append_qh(instance->list_head, ep->qh);
+	/* Add to the sw list */
+	list_prepend(&ep->link, &instance->endpoint_list);
+	fibril_mutex_unlock(&instance->guard);
+
+}
 /** Remove endpoint from the list and queue.
  *
Index: uspace/drv/bus/usb/ehci/endpoint_list.h
===================================================================
--- uspace/drv/bus/usb/ehci/endpoint_list.h	(revision dc44023a126c400bd80646b282a56f72d8170292)
+++ uspace/drv/bus/usb/ehci/endpoint_list.h	(revision 5f5321eee7f6f64bb0d3ae16e416c1cf8e54d183)
@@ -74,4 +74,5 @@
 int endpoint_list_init(endpoint_list_t *instance, const char *name);
 void endpoint_list_append_ep(endpoint_list_t *instance, ehci_endpoint_t *ep);
+void endpoint_list_prepend_ep(endpoint_list_t *instance, ehci_endpoint_t *ep);
 void endpoint_list_remove_ep(endpoint_list_t *instance, ehci_endpoint_t *ep);
 #endif
Index: uspace/drv/bus/usb/ehci/hc.c
===================================================================
--- uspace/drv/bus/usb/ehci/hc.c	(revision dc44023a126c400bd80646b282a56f72d8170292)
+++ uspace/drv/bus/usb/ehci/hc.c	(revision 5f5321eee7f6f64bb0d3ae16e416c1cf8e54d183)
@@ -198,9 +198,32 @@
 {
 	assert(instance);
-	/* TODO: implement*/
+	//TODO: stop the hw
+#if 0
+	endpoint_list_fini(&instance->async_list);
+	endpoint_list_fini(&instance->int_list);
+	return_page(instance->periodic_list_base);
+#endif
 };
 
 void hc_enqueue_endpoint(hc_t *instance, const endpoint_t *ep)
 {
+	assert(instance);
+	assert(ep);
+	ehci_endpoint_t *ehci_ep = ehci_endpoint_get(ep);
+	switch (ep->transfer_type)
+	{
+	case USB_TRANSFER_CONTROL:
+		endpoint_list_prepend_ep(&instance->async_list, ehci_ep);
+		break;
+	case USB_TRANSFER_BULK:
+		endpoint_list_append_ep(&instance->async_list, ehci_ep);
+		break;
+	case USB_TRANSFER_INTERRUPT:
+		endpoint_list_append_ep(&instance->int_list, ehci_ep);
+		break;
+	case USB_TRANSFER_ISOCHRONOUS:
+		/* NOT SUPPORTED */
+		break;
+	}
 }
 
@@ -343,14 +366,31 @@
 {
 	assert(instance);
+	int ret = endpoint_list_init(&instance->async_list, "ASYNC");
+	if (ret != EOK) {
+		usb_log_error("Failed to setup ASYNC list: %s", str_error(ret));
+		return ret;
+	}
+
+	ret = endpoint_list_init(&instance->int_list, "INT");
+	if (ret != EOK) {
+		usb_log_error("Failed to setup INT list: %s", str_error(ret));
+		endpoint_list_fini(&instance->async_list);
+		return ret;
+	}
 
 	/* Take 1024 periodic list heads, we ignore low mem options */
 	instance->periodic_list_base = get_page();
-	if (!instance->periodic_list_base)
+	if (!instance->periodic_list_base) {
+		usb_log_error("Failed to get ISO schedule page.");
+		endpoint_list_fini(&instance->async_list);
+		endpoint_list_fini(&instance->int_list);
 		return ENOMEM;
+	}
 	for (unsigned i = 0;
 	    i < PAGE_SIZE/sizeof(instance->periodic_list_base[0]); ++i)
 	{
 		/* Disable everything for now */
-		instance->periodic_list_base[i] = LINK_POINTER_TERM;
+		instance->periodic_list_base[i] =
+		    LINK_POINTER_QH(instance->int_list.list_head_pa);
 	}
 	return EOK;
Index: uspace/drv/bus/usb/ehci/hc.h
===================================================================
--- uspace/drv/bus/usb/ehci/hc.h	(revision dc44023a126c400bd80646b282a56f72d8170292)
+++ uspace/drv/bus/usb/ehci/hc.h	(revision 5f5321eee7f6f64bb0d3ae16e416c1cf8e54d183)
@@ -51,5 +51,5 @@
 #include "ehci_rh.h"
 #include "hw_struct/link_pointer.h"
-//#include "endpoint_list.h"
+#include "endpoint_list.h"
 
 /** Main EHCI driver structure */
@@ -63,6 +63,10 @@
 	link_pointer_t *periodic_list_base;
 
-	/** Transfer schedules */
-//	endpoint_list_t lists[4];
+	/** CONTROL and BULK schedules */
+	endpoint_list_t async_list;
+
+	/** INT schedule */
+	endpoint_list_t int_list;
+
 	/** List of active transfers */
 	list_t pending_batches;
