Index: uspace/drv/vhc/transfer.c
===================================================================
--- uspace/drv/vhc/transfer.c	(revision 00b6c73d50d183200842b74eb44b288aed5b643f)
+++ uspace/drv/vhc/transfer.c	(revision e913cc9c6e7552261395e73e6ab3a2d0931f4c82)
@@ -161,4 +161,36 @@
 }
 
+static vhc_transfer_t *dequeue_first_transfer(vhc_virtdev_t *dev)
+{
+	assert(fibril_mutex_is_locked(&dev->guard));
+	assert(!list_empty(&dev->transfer_queue));
+
+	vhc_transfer_t *transfer = list_get_instance(dev->transfer_queue.next,
+	    vhc_transfer_t, link);
+	list_remove(&transfer->link);
+
+	return transfer;
+}
+
+
+static void execute_transfer_callback_and_free(vhc_transfer_t *transfer,
+    size_t data_transfer_size, int outcome)
+{
+	assert(outcome != ENAK);
+
+	usb_log_debug2("Transfer %p ended: %s.\n",
+	    transfer, str_error(outcome));
+
+	if (transfer->direction == USB_DIRECTION_IN) {
+		transfer->callback_in(transfer->ddf_fun, outcome,
+		    data_transfer_size, transfer->callback_arg);
+	} else {
+		assert(transfer->direction == USB_DIRECTION_OUT);
+		transfer->callback_out(transfer->ddf_fun, outcome,
+		    transfer->callback_arg);
+	}
+
+	free(transfer);
+}
 
 int vhc_transfer_queue_processor(void *arg)
@@ -174,7 +206,5 @@
 		}
 
-		vhc_transfer_t *transfer = list_get_instance(dev->transfer_queue.next,
-		    vhc_transfer_t, link);
-		list_remove(&transfer->link);
+		vhc_transfer_t *transfer = dequeue_first_transfer(dev);
 		fibril_mutex_unlock(&dev->guard);
 
@@ -214,15 +244,6 @@
 
 		if (rc != ENAK) {
-			usb_log_debug2("Transfer %p ended: %s.\n",
-			    transfer, str_error(rc));
-			if (transfer->direction == USB_DIRECTION_IN) {
-				transfer->callback_in(transfer->ddf_fun, rc,
-				    data_transfer_size, transfer->callback_arg);
-			} else {
-				assert(transfer->direction == USB_DIRECTION_OUT);
-				transfer->callback_out(transfer->ddf_fun, rc,
-				    transfer->callback_arg);
-			}
-			free(transfer);
+			execute_transfer_callback_and_free(transfer,
+			    data_transfer_size, rc);
 		}
 
@@ -231,8 +252,12 @@
 	}
 
+	/* Immediately fail all remaining transfers. */
+	while (!list_empty(&dev->transfer_queue)) {
+		vhc_transfer_t *transfer = dequeue_first_transfer(dev);
+		execute_transfer_callback_and_free(transfer, 0, EBADCHECKSUM);
+	}
+
 	fibril_mutex_unlock(&dev->guard);
 
-	// TODO - destroy pending transfers
-
 	return EOK;
 }
