Index: uspace/drv/bus/usb/xhci/endpoint.c
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.c	(revision c0ec9e7ecf09518008a89692d415e1359e64e604)
+++ uspace/drv/bus/usb/xhci/endpoint.c	(revision 176a70af1790e0dc046aa8dcd2f33e7e9508573f)
@@ -40,13 +40,33 @@
 int endpoint_init(hcd_t *hcd, endpoint_t *ep)
 {
-	// TODO: Implement me!
-	usb_log_debug("Endpoint initialized.");
-	return ENAK;
+	assert(ep);
+	xhci_endpoint_t *xhci_ep = malloc(sizeof(xhci_endpoint_t));
+	if (xhci_ep == NULL)
+		return ENOMEM;
+
+	/* FIXME: Set xhci_ep->slot_id */
+
+	fibril_mutex_lock(&ep->guard);
+	ep->hc_data.data = xhci_ep;
+	/* FIXME: The two handlers below should be implemented. */
+	ep->hc_data.toggle_get = NULL;
+	ep->hc_data.toggle_set = NULL;
+	fibril_mutex_unlock(&ep->guard);
+
+	usb_log_debug("Endpoint %d:%d initialized.", ep->address, ep->endpoint);
+	return EOK;
 }
 
 void endpoint_fini(hcd_t *hcd, endpoint_t *ep)
 {
-	// TODO: Implement me!
-	usb_log_debug("Endpoint destroyed.");
+	assert(hcd);
+	assert(ep);
+	xhci_endpoint_t *xhci_ep = endpoint_get(ep);
+	/* FIXME: Tear down TR's? */
+	if (xhci_ep) {
+		free(xhci_ep);
+	}
+
+	usb_log_debug("Endpoint %d:%d destroyed.", ep->address, ep->endpoint);
 }
 
Index: uspace/drv/bus/usb/xhci/endpoint.h
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.h	(revision c0ec9e7ecf09518008a89692d415e1359e64e604)
+++ uspace/drv/bus/usb/xhci/endpoint.h	(revision 176a70af1790e0dc046aa8dcd2f33e7e9508573f)
@@ -43,6 +43,17 @@
 #include <usb/host/hcd.h>
 
+/** Connector structure linking endpoint context to the endpoint. */
+typedef struct xhci_endpoint {
+  uint32_t slot_id;
+} xhci_endpoint_t;
+
 int endpoint_init(hcd_t *hcd, endpoint_t *ep);
 void endpoint_fini(hcd_t *hcd, endpoint_t *ep);
+
+static inline xhci_endpoint_t * endpoint_get(const endpoint_t *ep)
+{
+  assert(ep);
+	return ep->hc_data.data;
+}
 
 #endif
