Index: uspace/lib/usbvirt/device.h
===================================================================
--- uspace/lib/usbvirt/device.h	(revision 47e3a8e044a8e6b9decaf6c981da8d4cc6ece6c6)
+++ uspace/lib/usbvirt/device.h	(revision 186d6309f60214f9ea2c6efdc24bb8fbd961832d)
@@ -128,6 +128,4 @@
 	    usb_endpoint_t endpoint, void *buffer, size_t size);
 	
-	
-	
 	/* Device attributes. */
 	
@@ -152,4 +150,13 @@
 	 */
 	int device_id_;
+	
+	/** Main routine called when data is received from HC.
+	 * @warning Do not change after initializing with
+	 * usbvirt_device_init().
+	 * This function is here merely to make the interface more OOP.
+	 */
+	int (*receive_data)(struct usbvirt_device *dev,
+	    usb_endpoint_t endpoint, void *buffer, size_t size);
+	
 } usbvirt_device_t;
 
Index: uspace/lib/usbvirt/hub.h
===================================================================
--- uspace/lib/usbvirt/hub.h	(revision 47e3a8e044a8e6b9decaf6c981da8d4cc6ece6c6)
+++ uspace/lib/usbvirt/hub.h	(revision 186d6309f60214f9ea2c6efdc24bb8fbd961832d)
@@ -46,4 +46,5 @@
 int usbvirt_connect(usbvirt_device_t *, const char *);
 int usbvirt_disconnect(void);
+int usbvirt_connect_local(usbvirt_device_t *);
 
 #endif
Index: uspace/lib/usbvirt/incoming.c
===================================================================
--- uspace/lib/usbvirt/incoming.c	(revision 47e3a8e044a8e6b9decaf6c981da8d4cc6ece6c6)
+++ uspace/lib/usbvirt/incoming.c	(revision 186d6309f60214f9ea2c6efdc24bb8fbd961832d)
@@ -38,5 +38,6 @@
 #include "private.h"
 
-int handle_incoming_data(usb_endpoint_t endpoint, void *buffer, size_t size)
+int handle_incoming_data(struct usbvirt_device *dev,
+    usb_endpoint_t endpoint, void *buffer, size_t size)
 {
 	/*
Index: uspace/lib/usbvirt/main.c
===================================================================
--- uspace/lib/usbvirt/main.c	(revision 47e3a8e044a8e6b9decaf6c981da8d4cc6ece6c6)
+++ uspace/lib/usbvirt/main.c	(revision 186d6309f60214f9ea2c6efdc24bb8fbd961832d)
@@ -69,5 +69,5 @@
 	}
 	
-	handle_incoming_data(endpoint, buffer, len);
+	device->receive_data(device, endpoint, buffer, len);
 	
 	free(buffer);
@@ -104,4 +104,5 @@
 {
 	dev->send_data = usbvirt_data_to_host;
+	dev->receive_data = handle_incoming_data;
 	dev->state = USBVIRT_STATE_DEFAULT;
 	dev->address = 0;
@@ -160,6 +161,5 @@
  * @param hcd_path HCD identification under devfs
  *     (without <code>/dev/usb/</code>).
- * @param device_id Internal device identification (used by HCD).
- * @param callback Handler for callbacks from HCD.
+ * @param dev Device to connect.
  * @return EOK on success or error code from errno.h.
  */
@@ -197,5 +197,23 @@
 }
 
-
+/** Prepares device as local.
+ * This is useful if you want to have a virtual device in the same task
+ * as HCD.
+ *
+ * @param dev Device to connect.
+ * @return Always EOK.
+ */
+int usbvirt_connect_local(usbvirt_device_t *dev)
+{
+	dev->vhcd_phone_ = -1;
+	device_init(dev);
+	
+	return EOK;
+}
+
+/** Disconnects device from HCD.
+ *
+ * @return Always EOK.
+ */
 int usbvirt_disconnect(void)
 {
Index: uspace/lib/usbvirt/private.h
===================================================================
--- uspace/lib/usbvirt/private.h	(revision 47e3a8e044a8e6b9decaf6c981da8d4cc6ece6c6)
+++ uspace/lib/usbvirt/private.h	(revision 186d6309f60214f9ea2c6efdc24bb8fbd961832d)
@@ -51,5 +51,6 @@
     usb_endpoint_t endpoint, void *buffer, size_t size);
 
-int handle_incoming_data(usb_endpoint_t endpoint, void *buffer, size_t size);
+int handle_incoming_data(struct usbvirt_device *dev,
+    usb_endpoint_t endpoint, void *buffer, size_t size);
 
 int control_pipe(void *buffer, size_t size);
