Index: uspace/drv/bus/usb/xhci/endpoint.c
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.c	(revision 61e27e809067e0eca53b82b0a0af384b7c62a2e0)
+++ uspace/drv/bus/usb/xhci/endpoint.c	(revision 1af4c002fefa9e2efe75a0780dd018c77b2f7ae9)
@@ -47,5 +47,4 @@
 
 static int alloc_transfer_ds(xhci_endpoint_t *);
-static void free_transfer_ds(xhci_endpoint_t *);
 
 /**
@@ -121,5 +120,5 @@
 	assert(xhci_ep);
 
-	free_transfer_ds(xhci_ep);
+	xhci_endpoint_free_transfer_ds(xhci_ep);
 
 	// TODO: Something missed?
@@ -156,5 +155,5 @@
 }
 
-/** Allocate transfer data structures for XHCI endpoint.
+/** Allocate transfer data structures for XHCI endpoint not using streams.
  * @param[in] xhci_ep XHCI endpoint to allocate data structures for.
  *
@@ -166,5 +165,6 @@
 	usb_log_debug2("Allocating main transfer ring for endpoint " XHCI_EP_FMT, XHCI_EP_ARGS(*xhci_ep));
 
-	xhci_ep->primary_stream_ctx_array = NULL;
+	xhci_ep->primary_stream_data_array = NULL;
+	xhci_ep->primary_stream_data_size = 0;
 
 	int err;
@@ -186,5 +186,5 @@
  * @param[in] xhci_ep XHCI endpoint to free data structures for.
  */
-static void free_transfer_ds(xhci_endpoint_t *xhci_ep)
+void xhci_endpoint_free_transfer_ds(xhci_endpoint_t *xhci_ep)
 {
 	if (xhci_ep->primary_stream_data_size) {
Index: uspace/drv/bus/usb/xhci/endpoint.h
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.h	(revision 61e27e809067e0eca53b82b0a0af384b7c62a2e0)
+++ uspace/drv/bus/usb/xhci/endpoint.h	(revision 1af4c002fefa9e2efe75a0780dd018c77b2f7ae9)
@@ -135,4 +135,6 @@
 void xhci_endpoint_fini(xhci_endpoint_t *);
 
+void xhci_endpoint_free_transfer_ds(xhci_endpoint_t *xhci_ep);
+
 uint8_t xhci_endpoint_dci(xhci_endpoint_t *);
 uint8_t xhci_endpoint_index(xhci_endpoint_t *);
Index: uspace/drv/bus/usb/xhci/streams.c
===================================================================
--- uspace/drv/bus/usb/xhci/streams.c	(revision 61e27e809067e0eca53b82b0a0af384b7c62a2e0)
+++ uspace/drv/bus/usb/xhci/streams.c	(revision 1af4c002fefa9e2efe75a0780dd018c77b2f7ae9)
@@ -110,4 +110,7 @@
 	dma_buffer_free(&xhci_ep->primary_stream_ctx_dma);
 	free(xhci_ep->primary_stream_data_array);
+
+	xhci_ep->primary_stream_data_array = NULL;
+	xhci_ep->primary_stream_data_size = 0;
 }
 
@@ -312,4 +315,32 @@
 }
 
+/** Cancels streams and reconfigures endpoint back to single ring no stream endpoint.
+ * @param[in] hc Host controller of the endpoint.
+ * @param[in] dev Used device.
+ * @param[in] xhci_ep Associated XHCI bulk endpoint.
+ */
+int xhci_endpoint_remove_streams(xhci_hc_t *hc, xhci_device_t *dev, xhci_endpoint_t *xhci_ep)
+{
+	if (!xhci_ep->primary_stream_data_size) {
+		usb_log_warning("There are no streams enabled on the endpoint, doing nothing.");
+		return EOK;
+	}
+
+	hc_stop_endpoint(hc, dev->slot_id, xhci_endpoint_index(xhci_ep));
+	xhci_endpoint_free_transfer_ds(xhci_ep);
+
+	/* Streams are now removed, proceed with reconfiguring endpoint. */
+	int err;
+	if ((err = xhci_trb_ring_init(&xhci_ep->ring))) {
+		usb_log_error("Failed to initialize a transfer ring.");
+		return err;
+	}
+
+	xhci_ep_ctx_t ep_ctx;
+	memset(&ep_ctx, 0, sizeof(ep_ctx));
+	xhci_setup_endpoint_context(xhci_ep, &ep_ctx);
+	return hc_update_endpoint(hc, dev->slot_id, xhci_endpoint_index(xhci_ep), &ep_ctx);
+}
+
 /** Initialize, setup and register primary streams.
  * @param[in] hc Host controller of the endpoint.
@@ -325,4 +356,11 @@
 		return err;
 	}
+
+	/*
+	 * We have passed the checks.
+	 * Stop the endpoint, destroy the ring, and transition to streams.
+	 */
+	hc_stop_endpoint(hc, dev->slot_id, xhci_endpoint_index(xhci_ep));
+	xhci_endpoint_free_transfer_ds(xhci_ep);
 
 	err = initialize_primary_structures(xhci_ep, count);
@@ -343,6 +381,5 @@
 	setup_stream_context(xhci_ep, &ep_ctx, pstreams, 1);
 
-	// FIXME: do we add endpoint? do we need to destroy previous configuration?
-	return hc_add_endpoint(hc, dev->slot_id, xhci_endpoint_index(xhci_ep), &ep_ctx);
+	return hc_update_endpoint(hc, dev->slot_id, xhci_endpoint_index(xhci_ep), &ep_ctx);
 }
 
@@ -393,4 +430,11 @@
 	}
 
+	/*
+	 * We have passed all checks.
+	 * Stop the endpoint, destroy the ring, and transition to streams.
+	 */
+	hc_stop_endpoint(hc, dev->slot_id, xhci_endpoint_index(xhci_ep));
+	xhci_endpoint_free_transfer_ds(xhci_ep);
+
 	err = initialize_primary_structures(xhci_ep, count);
 	if (err) {
@@ -411,6 +455,5 @@
 	setup_stream_context(xhci_ep, &ep_ctx, pstreams, 0);
 
-	// FIXME: do we add endpoint? do we need to destroy previous configuration?
-	return hc_add_endpoint(hc, dev->slot_id, xhci_endpoint_index(xhci_ep), &ep_ctx);
+	return hc_update_endpoint(hc, dev->slot_id, xhci_endpoint_index(xhci_ep), &ep_ctx);
 
 err_init:
Index: uspace/drv/bus/usb/xhci/streams.h
===================================================================
--- uspace/drv/bus/usb/xhci/streams.h	(revision 61e27e809067e0eca53b82b0a0af384b7c62a2e0)
+++ uspace/drv/bus/usb/xhci/streams.h	(revision 1af4c002fefa9e2efe75a0780dd018c77b2f7ae9)
@@ -64,4 +64,5 @@
 void xhci_stream_free_ds(xhci_endpoint_t *xhci_ep);
 
+int xhci_endpoint_remove_streams(xhci_hc_t *hc, xhci_device_t *dev, xhci_endpoint_t *xhci_ep);
 int xhci_endpoint_request_primary_streams(xhci_hc_t *hc, xhci_device_t *dev,
 	xhci_endpoint_t *xhci_ep, unsigned count);
