Index: uspace/drv/vhc/devices.c
===================================================================
--- uspace/drv/vhc/devices.c	(revision ff8ed0664753d1c7238ca60e6fc612287d9bc8b7)
+++ uspace/drv/vhc/devices.c	(revision 13101d063e0cda890c6ce0721ab8d93a3a7ebc69)
@@ -138,4 +138,5 @@
 		} else {
 			async_wait_for(req, &answer_rc);
+			transaction->actual_len = IPC_GET_ARG1(answer_data);
 			rc = (int)answer_rc;
 		}
Index: uspace/drv/vhc/hc.c
===================================================================
--- uspace/drv/vhc/hc.c	(revision ff8ed0664753d1c7238ca60e6fc612287d9bc8b7)
+++ uspace/drv/vhc/hc.c	(revision 13101d063e0cda890c6ce0721ab8d93a3a7ebc69)
@@ -96,6 +96,6 @@
 	    usb_str_transaction_outcome(outcome));
 	
-	transaction->callback(transaction->buffer, transaction->len, outcome,
-	    transaction->callback_arg);
+	transaction->callback(transaction->buffer, transaction->actual_len,
+	    outcome, transaction->callback_arg);
 }
 
@@ -169,4 +169,5 @@
 	transaction->buffer = buffer;
 	transaction->len = len;
+	transaction->actual_len = len;
 	transaction->callback = callback;
 	transaction->callback_arg = arg;
Index: uspace/drv/vhc/hc.h
===================================================================
--- uspace/drv/vhc/hc.h	(revision ff8ed0664753d1c7238ca60e6fc612287d9bc8b7)
+++ uspace/drv/vhc/hc.h	(revision 13101d063e0cda890c6ce0721ab8d93a3a7ebc69)
@@ -65,4 +65,6 @@
 	/** Transaction data length. */
 	size_t len;
+	/** Data length actually transfered. */
+	size_t actual_len;
 	/** Callback after transaction is done. */
 	hc_transaction_done_callback_t callback;
Index: uspace/lib/usbvirt/src/callback.c
===================================================================
--- uspace/lib/usbvirt/src/callback.c	(revision ff8ed0664753d1c7238ca60e6fc612287d9bc8b7)
+++ uspace/lib/usbvirt/src/callback.c	(revision 13101d063e0cda890c6ce0721ab8d93a3a7ebc69)
@@ -160,8 +160,11 @@
 			return;
 		}
-		async_data_read_finalize(callid, buffer, receive_len);
-	}
-	
-	ipc_answer_0(iid, rc);
+		if (len > receive_len) {
+			len = receive_len;
+		}
+		async_data_read_finalize(callid, buffer, len);
+	}
+	
+	ipc_answer_1(iid, rc, len);
 }
 
