Index: Makefile
===================================================================
--- Makefile	(revision d1e70c755f9e8c5512407a39d683665bc410104e)
+++ Makefile	(revision 51c1b0039931265549e60f534ca4d810808ad82b)
@@ -38,5 +38,6 @@
 	init \
 	ns \
-	fb
+	fb \
+	console
 
 ifeq ($(ARCH), amd64)
Index: console/Makefile
===================================================================
--- console/Makefile	(revision 51c1b0039931265549e60f534ca4d810808ad82b)
+++ console/Makefile	(revision 51c1b0039931265549e60f534ca4d810808ad82b)
@@ -0,0 +1,77 @@
+#
+# Copyright (C) 2005 Martin Decky
+# 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.
+#
+
+## Setup toolchain
+#
+
+LIBC_PREFIX = ../libc
+SOFTINT_PREFIX = ../softint
+include $(LIBC_PREFIX)/Makefile.toolchain 
+
+CFLAGS += -Iinclude -I../kbd/include ../fb
+
+LIBS = $(LIBC_PREFIX)/libc.a
+
+## Sources
+#
+
+OUTPUT = console
+GENERIC_SOURCES = \
+	console.c 
+
+ARCH_SOURCES = 
+
+GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES)))
+ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES)))
+
+.PHONY: all clean depend disasm
+
+all: $(OUTPUT) disasm
+
+-include Makefile.depend
+
+clean:
+	-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend
+
+depend:
+	$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend
+
+$(OUTPUT): $(ARCH_OBJECTS) $(GENERIC_OBJECTS) $(LIBS)
+	$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(GENERIC_OBJECTS) $(ARCH_OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
+
+disasm:
+	$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm
+
+%.o: %.S
+	$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@
+
+%.o: %.s
+	$(AS) $(AFLAGS) $< -o $@
+
+%.o: %.c
+	$(CC) $(DEFS) $(CFLAGS) -c $< -o $@
Index: console/console.c
===================================================================
--- console/console.c	(revision 51c1b0039931265549e60f534ca4d810808ad82b)
+++ console/console.c	(revision 51c1b0039931265549e60f534ca4d810808ad82b)
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2006 Josef Cejka
+ * 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.
+ */
+
+
+#include <kbd.h>
+#include <ipc/ipc.h>
+#include <ipc/services.h>
+#include <stdio.h>
+#include <errno.h>
+
+#define NAME "CONSOLE"
+
+int main(int argc, char *argv[])
+{
+	ipcarg_t phonead;
+	ipc_call_t call;
+	ipc_callid_t callid;
+	int phone_kbd, phone_fb;
+	ipcarg_t retval, arg1 = 0xdead, arg2 = 0xbeef;
+	
+	printf("Uspace console service started.\n");
+	
+	
+	/* Connect to keyboard driver */
+
+	while ((phone_kbd = ipc_connect_me_to(PHONE_NS, SERVICE_KEYBOARD, 0)) < 0) {
+	};
+	
+	if (ipc_connect_to_me(phone_kbd, SERVICE_CONSOLE, 0, &phonead) != 0) {
+		printf("%s: Error: Registering at naming service failed.\n", NAME);
+		return -1;
+	};
+
+	/* Connect to framebuffer driver */
+	
+	while ((phone_fb = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0)) < 0) {
+	};
+	
+	
+	/* Register service at nameserver */
+	printf("%s: Registering at naming service.\n", NAME);
+
+	if (ipc_connect_to_me(PHONE_NS, SERVICE_CONSOLE, 0, &phonead) != 0) {
+		printf("%s: Error: Registering at naming service failed.\n", NAME);
+		return -1;
+	};
+	
+	while (1) {
+		callid = ipc_wait_for_call(&call);
+		switch (IPC_GET_METHOD(call)) {
+			case IPC_M_PHONE_HUNGUP:
+				printf("%s: Phone hung up.\n", NAME);
+				retval = 0;
+				break;
+			case IPC_M_CONNECT_ME_TO:
+				printf("%s: Connect me (%P) to: %zd\n",NAME, IPC_GET_ARG3(call), IPC_GET_ARG1(call));
+				retval = 0;
+				break;
+			case KBD_PUSHCHAR:
+				printf("%s: Push char '%c'.\n", NAME, IPC_GET_ARG1(call));
+				retval = 0;
+				break;
+			default:
+				printf("%s: Unknown method: %zd\n", NAME, IPC_GET_METHOD(call));
+				retval = ENOENT;
+				break;
+		}
+
+		if (! (callid & IPC_CALLID_NOTIFICATION)) {
+			ipc_answer_fast(callid, retval, arg1, arg2);
+		}
+	}
+
+	return 0;	
+}
Index: fb/fb.c
===================================================================
--- fb/fb.c	(revision d1e70c755f9e8c5512407a39d683665bc410104e)
+++ fb/fb.c	(revision 51c1b0039931265549e60f534ca4d810808ad82b)
@@ -161,11 +161,16 @@
 	ipcarg_t retval, arg1, arg2;
 
-	if(!sysinfo_value("fb")) return -1;
-
+	if(!sysinfo_value("fb")) {
+		printf("Framebuffer initialization failed.\n");
+		return -1;
+	}
 
 	if ((res = ipc_connect_to_me(PHONE_NS, SERVICE_VIDEO, 0, &phonead)) != 0) 
 		return -1;
 	
-	init_fb();
+	if (init_fb() != 0) {
+		printf("Framebuffer initialization failed.\n");
+		return -1;
+	}
 
 	async_manager();
Index: init/init.c
===================================================================
--- init/init.c	(revision d1e70c755f9e8c5512407a39d683665bc410104e)
+++ init/init.c	(revision 51c1b0039931265549e60f534ca4d810808ad82b)
@@ -306,15 +306,16 @@
 
 	printf("Test: Starting connect...\n");
-	while ((phoneid = ipc_connect_me_to(PHONE_NS, SERVICE_KEYBOARD, 0)) < 0) {
+	while ((phoneid = ipc_connect_me_to(PHONE_NS, SERVICE_CONSOLE, 0)) < 0) {
 	};
 	
 	printf("Test: Connected: %d\n", res);
 	printf("Test: pinging.\n");
-	while (1) {
+/*	while (1) {
+		
 		res = ipc_call_sync(phoneid, KBD_GETCHAR, 0xbeef,&result);
 //		printf("Test: Retval: %d - received: %c\n", res, result);
 		printf("%c", result);
 	}
-	
+*/	
 	printf("Test: Hangin up\n");
 	ipc_hangup(phoneid);
@@ -336,12 +337,6 @@
 	printf("Test: pinging.\n");
 
-	aid = async_send_2(phoneid, KBD_GETCHAR, 0, 0, &kbddata);
+
 	while (1) {
-		if (async_wait_timeout(aid, NULL, 1000000)) {
-			printf("^");
-			continue;
-		}
-		printf("%c", IPC_GET_ARG1(kbddata));
-		aid = async_send_2(phoneid, KBD_GETCHAR, 0, 0, &kbddata);
 	}
 	
Index: kbd/generic/kbd.c
===================================================================
--- kbd/generic/kbd.c	(revision d1e70c755f9e8c5512407a39d683665bc410104e)
+++ kbd/generic/kbd.c	(revision 51c1b0039931265549e60f534ca4d810808ad82b)
@@ -36,26 +36,21 @@
 #include <arch/kbd.h>
 #include <kbd.h>
+#include <libadt/fifo.h>
 #include <key_buffer.h>
-#include <libadt/fifo.h>
 
 #define NAME "KBD"
-
-#define KBD_REQUEST_MAX 32 /**< Maximum requests buffered until keypress */
-
+void hello(void *private, int retval, ipc_call_t *data) {
+	printf("%s: got answer from console with retval %d.\n", NAME, retval);
+}
 int main(int argc, char **argv)
 {
 	ipc_call_t call;
 	ipc_callid_t callid;
+	int res;
+	ipcarg_t phonead;
+	int phoneid;
 	char connected = 0;
-	int res;
-	int c;
-	ipcarg_t phonead;
 	
 	ipcarg_t retval, arg1, arg2;
-
-	/* Counter of unsatisfied calls */
-	fifo_count_t callers_counter = 0;
-	/* Fifo with callid's of unsatisfied calls requred for answer */
-	FIFO_INITIALIZE_STATIC(callers_buffer, ipc_callid_t, KBD_REQUEST_MAX);
 
 	printf("Uspace kbd service started.\n");
@@ -83,17 +78,6 @@
 		switch (IPC_GET_METHOD(call)) {
 			case IPC_M_PHONE_HUNGUP:
-				if (connected) {
-					/* If nobody's connected, clear keybuffer and dont store new keys */
-					if (--connected == 0) {
-						callers_counter = 0;
-						callers_buffer.head = callers_buffer.tail = 0;
-						key_buffer_free();	
-					}
-					
-					printf("%s: Phone hung up.\n", NAME);
-				} else {
-					printf("%s: Oops, got phone hung up, but nobody connected.\n", NAME);
-				}
-				
+				printf("%s: Phone hung up.\n", NAME);
+				connected = 0;
 				retval = 0;
 				break;
@@ -108,40 +92,32 @@
 				}
 				break;
+			case IPC_M_CONNECT_TO_ME:
+				phoneid = IPC_GET_ARG3(call);
+				retval = 0;
+				break;
+
 			case IPC_M_INTERRUPT:
 				if (connected) {
-					/* recode scancode and store it into key buffer */
+					/* recode to ASCII - one interrupt can produce more than one code so result is stored in fifo */
 					kbd_arch_process(IPC_GET_ARG2(call));
-					//printf("%s: GOT INTERRUPT: %c\n", NAME, IPC_GET_ARG2(call));
+
+					//printf("%s: GOT INTERRUPT: %c\n", NAME, key);
 
 					/* Some callers could awaiting keypress - if its true, we have to send keys to them.
 					 * One interrupt can store more than one key into buffer. */
+					
 					retval = 0;
-					arg2 = 0xbeef;
-					while ((callers_counter) && (!key_buffer_empty())) {
-						callers_counter--;
+
+					while (!key_buffer_empty()) {
 						if (!key_buffer_pop((char *)&arg1)) {
-							printf("%s: KeyBuffer empty but it should not be.\n");
+							printf("%s: KeyBuffer is empty but it should not be.\n");
 							break;
 						}
-						ipc_answer_fast(fifo_pop(callers_buffer), retval, arg1, arg2);
+						/*FIXME: detection of closed connection */
+						ipc_call_async(phoneid, KBD_PUSHCHAR, arg1, 0, &hello);
 					}
+
 				}
-				break;
-			case KBD_GETCHAR:
-	//			printf("%s: Getchar: ", NAME);
-				retval = 0;
-				arg1 = 0;	
-				if (!key_buffer_pop((char *)&arg1)) {
-					if (callers_counter < KBD_REQUEST_MAX) {
-						callers_counter++;
-						fifo_push(callers_buffer, callid);
-					} else {
-						retval = ELIMIT;
-					}
-					continue;
-				};
-				arg2 = 0xbeef;
-			//	printf("GetChar return %c\n", arg1);
-				
+				printf("%s: Interrupt processed.\n", NAME);
 				break;
 			default:
Index: kbd/include/kbd.h
===================================================================
--- kbd/include/kbd.h	(revision d1e70c755f9e8c5512407a39d683665bc410104e)
+++ kbd/include/kbd.h	(revision 51c1b0039931265549e60f534ca4d810808ad82b)
@@ -30,5 +30,5 @@
 #define __KBD_H__
 
-#define KBD_GETCHAR 1024
+#define KBD_PUSHCHAR 1024
 
 #endif
Index: libc/include/ipc/services.h
===================================================================
--- libc/include/ipc/services.h	(revision d1e70c755f9e8c5512407a39d683665bc410104e)
+++ libc/include/ipc/services.h	(revision 51c1b0039931265549e60f534ca4d810808ad82b)
@@ -38,5 +38,6 @@
 #define SERVICE_FRAME_BUFFER	2
 #define SERVICE_KEYBOARD	3
-#define SERVICE_VIDEO	        4
+#define SERVICE_VIDEO		4
+#define SERVICE_CONSOLE		5
 
 /* Memory area to be received from NS */
