Index: uspace/app/vuhid/device.c
===================================================================
--- uspace/app/vuhid/device.c	(revision 30f9f8ff4cecfdccf943ce636962916281434ae6)
+++ uspace/app/vuhid/device.c	(revision 9a884ed2702826b3b497efb5d6981060e0b515a8)
@@ -77,8 +77,14 @@
 {
 	vuhid_interface_t *iface = arg;
+	vuhid_data_t *hid_data = iface->vuhid_data;
 
 	if (iface->live != NULL) {
 		iface->live(iface);
 	}
+
+	fibril_mutex_lock(&hid_data->iface_count_mutex);
+	hid_data->iface_died_count++;
+	fibril_condvar_broadcast(&hid_data->iface_count_cv);
+	fibril_mutex_unlock(&hid_data->iface_count_mutex);
 
 	return EOK;
@@ -110,4 +116,11 @@
 	if ((iface->in_data_size == 0) && (iface->out_data_size == 0)) {
 		return EEMPTY;
+	}
+
+	// FIXME - we shall set vuhid_data to NULL in the main() rather
+	// than to depend on individual interfaces
+	/* Already used interface. */
+	if (iface->vuhid_data != NULL) {
+		return EEXISTS;
 	}
 
@@ -252,4 +265,5 @@
 
 	/* Launch the "life" fibril. */
+	iface->vuhid_data = hid_data;
 	fid_t life_fibril = fibril_create(interface_life_fibril, iface);
 	if (life_fibril == 0) {
@@ -310,4 +324,5 @@
 	    += total_descr_size;
 
+	hid_data->iface_count++;
 	fibril_add_ready(life_fibril);
 
@@ -331,4 +346,15 @@
 }
 
+void wait_for_interfaces_death(usbvirt_device_t *dev)
+{
+	vuhid_data_t *hid_data = dev->device_data;
+
+	fibril_mutex_lock(&hid_data->iface_count_mutex);
+	while (hid_data->iface_died_count < hid_data->iface_count) {
+		fibril_condvar_wait(&hid_data->iface_count_cv,
+		    &hid_data->iface_count_mutex);
+	}
+	fibril_mutex_unlock(&hid_data->iface_count_mutex);
+}
 
 /** @}
Index: uspace/app/vuhid/hids/bootkbd.c
===================================================================
--- uspace/app/vuhid/hids/bootkbd.c	(revision 30f9f8ff4cecfdccf943ce636962916281434ae6)
+++ uspace/app/vuhid/hids/bootkbd.c	(revision 9a884ed2702826b3b497efb5d6981060e0b515a8)
@@ -169,5 +169,7 @@
 	.on_data_out = on_data_out,
 
-	.live = live
+	.live = live,
+
+	.vuhid_data = NULL
 };
 
Index: uspace/app/vuhid/main.c
===================================================================
--- uspace/app/vuhid/main.c	(revision 30f9f8ff4cecfdccf943ce636962916281434ae6)
+++ uspace/app/vuhid/main.c	(revision 9a884ed2702826b3b497efb5d6981060e0b515a8)
@@ -132,6 +132,11 @@
 	.in_endpoint_first_free = 1,
 	.out_endpoints_mapping = { NULL },
-	.out_endpoint_first_free = 1
-};
+	.out_endpoint_first_free = 1,
+
+	.iface_count = 0,
+	.iface_died_count = 0
+	// mutex and CV must be initialized elsewhere
+};
+
 
 /** Keyboard device.
@@ -151,4 +156,7 @@
 
 	usb_log_enable(USB_LOG_LEVEL_DEBUG2, "vusbhid");
+
+	fibril_mutex_initialize(&vuhid_data.iface_count_mutex);
+	fibril_condvar_initialize(&vuhid_data.iface_count_cv);
 
 	/* Determine which interfaces to initialize. */
@@ -182,7 +190,5 @@
 	printf("Connected to VHCD...\n");
 
-	while (true) {
-		async_usleep(10 * 1000 * 1000);
-	}
+	wait_for_interfaces_death(&hid_dev);
 	
 	printf("Terminating...\n");
Index: uspace/app/vuhid/virthid.h
===================================================================
--- uspace/app/vuhid/virthid.h	(revision 30f9f8ff4cecfdccf943ce636962916281434ae6)
+++ uspace/app/vuhid/virthid.h	(revision 9a884ed2702826b3b497efb5d6981060e0b515a8)
@@ -38,4 +38,5 @@
 #include <usb/usb.h>
 #include <usbvirt/device.h>
+#include <fibril_synch.h>
 
 #define VUHID_ENDPOINT_MAX USB11_ENDPOINT_MAX
@@ -43,4 +44,17 @@
 
 typedef struct vuhid_interface vuhid_interface_t;
+
+typedef struct {
+	vuhid_interface_t *in_endpoints_mapping[VUHID_ENDPOINT_MAX];
+	size_t in_endpoint_first_free;
+	vuhid_interface_t *out_endpoints_mapping[VUHID_ENDPOINT_MAX];
+	size_t out_endpoint_first_free;
+	vuhid_interface_t *interface_mapping[VUHID_INTERFACE_MAX];
+
+	fibril_mutex_t iface_count_mutex;
+	fibril_condvar_t iface_count_cv;
+	size_t iface_count;
+	size_t iface_died_count;
+} vuhid_data_t;
 
 struct vuhid_interface {
@@ -63,13 +77,7 @@
 
 	void *interface_data;
+
+	vuhid_data_t *vuhid_data;
 };
-
-typedef struct {
-	vuhid_interface_t *in_endpoints_mapping[VUHID_ENDPOINT_MAX];
-	size_t in_endpoint_first_free;
-	vuhid_interface_t *out_endpoints_mapping[VUHID_ENDPOINT_MAX];
-	size_t out_endpoint_first_free;
-	vuhid_interface_t *interface_mapping[VUHID_INTERFACE_MAX];
-} vuhid_data_t;
 
 typedef struct {
@@ -84,4 +92,5 @@
 
 int add_interface_by_id(vuhid_interface_t **, const char *, usbvirt_device_t *);
+void wait_for_interfaces_death(usbvirt_device_t *);
 
 #endif
