Index: uspace/lib/libc/generic/io/stream.c
===================================================================
--- uspace/lib/libc/generic/io/stream.c	(revision bfd1546e49e40fb980d45ced0b409578ba8ab3ef)
+++ uspace/lib/libc/generic/io/stream.c	(revision edd7aa6d2706f6923818608ee4bd2df91876ad58)
@@ -44,4 +44,5 @@
 #include <ipc/services.h>
 #include <ipc/console.h>
+#include <kbd/kbd.h>
 #include <unistd.h>
 #include <async.h>
@@ -59,11 +60,15 @@
 	open_console();
 	if (console_phone >= 0) {
-		ipcarg_t r0, r1;
+		kbd_event_t ev;
+		int rc;
 		size_t i = 0;
 	
 		while (i < count) {
-			if (async_req_0_2(console_phone, CONSOLE_GETCHAR, &r0, &r1) < 0)
-				return -1;
-			((char *) buf)[i++] = r0;
+			do {
+				rc = kbd_get_event(&ev);
+				if (rc < 0) return -1;
+			} while (ev.c == 0);
+
+			((char *) buf)[i++] = ev.c;
 		}
 		return i;
Index: uspace/lib/libc/generic/kbd.c
===================================================================
--- uspace/lib/libc/generic/kbd.c	(revision edd7aa6d2706f6923818608ee4bd2df91876ad58)
+++ uspace/lib/libc/generic/kbd.c	(revision edd7aa6d2706f6923818608ee4bd2df91876ad58)
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2009 Jiri Svoboda
+ * 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 libc
+ * @{
+ */
+/** @file
+ */ 
+
+#include <stdio.h>
+#include <io/stream.h>
+#include <kbd/kbd.h>
+#include <ipc/ipc.h>
+#include <ipc/console.h>
+#include <async.h>
+
+int kbd_get_event(kbd_event_t *ev)
+{
+	int console_phone = get_cons_phone();
+	ipcarg_t r0, r1, r2, r3;
+	int rc;
+
+	rc = async_req_0_4(console_phone, CONSOLE_GETKEY, &r0, &r1, &r2, &r3);
+	if (rc < 0)
+		return -1;
+
+	ev->type = r0;
+	ev->c = r1;
+	ev->key = r2;
+	ev->mods = r3;
+
+	return 0;
+}
+
+/** @}
+ */
