Index: uspace/app/vuhid/Makefile
===================================================================
--- uspace/app/vuhid/Makefile	(revision 26e7d6da331e8d35b5e83880a9740de5e9e4bd99)
+++ uspace/app/vuhid/Makefile	(revision a347a110d7ea83c8d45c6874cb10eb949d5d595c)
@@ -53,4 +53,5 @@
 	device.c \
 	ifaces.c \
+	life.c \
 	stdreq.c \
 	$(SOURCES_INTERFACES)
Index: uspace/app/vuhid/life.c
===================================================================
--- uspace/app/vuhid/life.c	(revision a347a110d7ea83c8d45c6874cb10eb949d5d595c)
+++ uspace/app/vuhid/life.c	(revision a347a110d7ea83c8d45c6874cb10eb949d5d595c)
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2011 Vojtech Horky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup usbvirthid
+ * @{
+ */
+/**
+ * @file
+ *
+ */
+#include <errno.h>
+#include <usb/debug.h>
+#include "virthid.h"
+
+
+void interface_life_live(vuhid_interface_t *iface)
+{
+	vuhid_interface_life_t *data = iface->interface_data;
+	data->data_in_pos = 0;
+	data->data_in_last_pos = (size_t) -1;
+	async_usleep(1000 * 1000 * 5);
+	usb_log_debug("%s\n", data->msg_born);
+	while (data->data_in_pos < data->data_in_count) {
+		async_usleep(1000 * data->data_in_pos_change_delay);
+		// FIXME: proper locking
+		data->data_in_pos++;
+	}
+	usb_log_debug("%s\n", data->msg_die);
+}
+
+
+
+int interface_live_on_data_in(vuhid_interface_t *iface,
+    void *buffer, size_t buffer_size, size_t *act_buffer_size)
+{
+	vuhid_interface_life_t *life = iface->interface_data;
+	size_t pos = life->data_in_pos;
+	if (pos >= life->data_in_count) {
+		return EBADCHECKSUM;
+	}
+
+	if (pos == life->data_in_last_pos) {
+		return ENAK;
+	}
+
+	if (buffer_size > iface->in_data_size) {
+		buffer_size = iface->in_data_size;
+	}
+
+	if (act_buffer_size != NULL) {
+		*act_buffer_size = buffer_size;
+	}
+
+	memcpy(buffer, life->data_in + pos * iface->in_data_size, buffer_size);
+	life->data_in_last_pos = pos;
+
+	return EOK;
+}
+
+/** @}
+ */
Index: uspace/app/vuhid/virthid.h
===================================================================
--- uspace/app/vuhid/virthid.h	(revision 26e7d6da331e8d35b5e83880a9740de5e9e4bd99)
+++ uspace/app/vuhid/virthid.h	(revision a347a110d7ea83c8d45c6874cb10eb949d5d595c)
@@ -82,4 +82,27 @@
 
 typedef struct {
+	/** Buffer with data from device to the host. */
+	uint8_t *data_in;
+	/** Number of items in @c data_in.
+	 * The total size of @c data_in buffer shall be
+	 * <code>data_in_count * vuhid_interface_t.in_data_size</code>.
+	 */
+	size_t data_in_count;
+
+	/** Current position in the data buffer. */
+	size_t data_in_pos;
+	/** Previous position. */
+	size_t data_in_last_pos;
+
+	/** Delay between transition to "next" input buffer (in ms). */
+	size_t data_in_pos_change_delay;
+
+	/** Message to print when interface becomes alive. */
+	const char *msg_born;
+	/** Message to print when interface dies. */
+	const char *msg_die;
+} vuhid_interface_life_t;
+
+typedef struct {
 	uint8_t length;
 	uint8_t type;
@@ -94,4 +117,8 @@
 void wait_for_interfaces_death(usbvirt_device_t *);
 
+void interface_life_live(vuhid_interface_t *);
+int interface_live_on_data_in(vuhid_interface_t *, void *, size_t, size_t *);
+
+
 #endif
 /**
