Index: uspace/drv/bus/usb/xhci/bus.c
===================================================================
--- uspace/drv/bus/usb/xhci/bus.c	(revision 53a9d022bcb8935f7625df033977ef9871d0244e)
+++ uspace/drv/bus/usb/xhci/bus.c	(revision 351113f27ed8ddcf47c423a4d80d12f1be2c4469)
@@ -323,4 +323,40 @@
 
 /**
+ * Abort a transfer on an endpoint.
+ */
+static int endpoint_abort(endpoint_t *ep)
+{
+	xhci_bus_t *bus = bus_to_xhci_bus(endpoint_get_bus(ep));
+	xhci_device_t *dev = xhci_device_get(ep->device);
+
+	usb_transfer_batch_t *batch = NULL;
+	fibril_mutex_lock(&ep->guard);
+	if (ep->active_batch) {
+		if (dev->slot_id) {
+			const int err = hc_stop_endpoint(bus->hc, dev->slot_id, xhci_endpoint_dci(xhci_endpoint_get(ep)));
+			if (err) {
+				usb_log_warning("Failed to stop endpoint %u of device " XHCI_DEV_FMT ": %s",
+				    ep->endpoint, XHCI_DEV_ARGS(*dev), str_error(err));
+			}
+
+			endpoint_wait_timeout_locked(ep, 2000);
+		}
+
+		batch = ep->active_batch;
+		if (batch) {
+			endpoint_deactivate_locked(ep);
+		}
+	}
+	fibril_mutex_unlock(&ep->guard);
+
+	if (batch) {
+		batch->error = EINTR;
+		batch->transfered_size = 0;
+		usb_transfer_batch_finish(batch);
+	}
+	return EOK;
+}
+
+/**
  * Unregister an endpoint. If the device is still available, inform the xHC
  * about it.
@@ -335,6 +371,9 @@
 	xhci_device_t *dev = xhci_device_get(ep_base->device);
 
+	endpoint_abort(ep_base);
+
 	/* If device slot is still available, drop the endpoint. */
 	if (dev->slot_id) {
+
 		if ((err = hc_drop_endpoint(bus->hc, dev->slot_id, xhci_endpoint_index(ep)))) {
 			usb_log_error("Failed to drop endpoint " XHCI_EP_FMT ": %s", XHCI_EP_ARGS(*ep), str_error(err));
Index: uspace/drv/bus/usb/xhci/commands.c
===================================================================
--- uspace/drv/bus/usb/xhci/commands.c	(revision 53a9d022bcb8935f7625df033977ef9871d0244e)
+++ uspace/drv/bus/usb/xhci/commands.c	(revision 351113f27ed8ddcf47c423a4d80d12f1be2c4469)
@@ -353,10 +353,5 @@
 	case XHCI_TRB_TYPE_EVALUATE_CONTEXT_CMD:
 	case XHCI_TRB_TYPE_RESET_ENDPOINT_CMD:
-		break;
 	case XHCI_TRB_TYPE_STOP_ENDPOINT_CMD:
-		// Note: If the endpoint was in the middle of a transfer, then the xHC
-		//       will add a Transfer TRB before the Event TRB, research that and
-		//       handle it appropriately!
-		break;
 	case XHCI_TRB_TYPE_RESET_DEVICE_CMD:
 		break;
Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision 53a9d022bcb8935f7625df033977ef9871d0244e)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision 351113f27ed8ddcf47c423a4d80d12f1be2c4469)
@@ -852,4 +852,16 @@
 
 /**
+ * Instruct xHC to stop running a transfer ring on an endpoint.
+ *
+ * @param slot_id Slot ID assigned to the device.
+ * @param ep_idx Endpoint index (number + direction) in question
+ */
+int hc_stop_endpoint(xhci_hc_t *hc, uint32_t slot_id, uint8_t ep_idx)
+{
+
+	return xhci_cmd_sync_inline(hc, STOP_ENDPOINT, .slot_id = slot_id, .endpoint_id = ep_idx);
+}
+
+/**
  * @}
  */
Index: uspace/drv/bus/usb/xhci/hc.h
===================================================================
--- uspace/drv/bus/usb/xhci/hc.h	(revision 53a9d022bcb8935f7625df033977ef9871d0244e)
+++ uspace/drv/bus/usb/xhci/hc.h	(revision 351113f27ed8ddcf47c423a4d80d12f1be2c4469)
@@ -115,4 +115,5 @@
 int hc_drop_endpoint(xhci_hc_t *, uint32_t, uint8_t);
 int hc_update_endpoint(xhci_hc_t *, uint32_t, uint8_t, xhci_ep_ctx_t *);
+int hc_stop_endpoint(xhci_hc_t *, uint32_t , uint8_t);
 
 int hc_status(bus_t *, uint32_t *);
