Index: uspace/app/init/init.c
===================================================================
--- uspace/app/init/init.c	(revision b7b675307e0a41ee1e8b50270215df7dabd37b8a)
+++ uspace/app/init/init.c	(revision 1c03c17200abbb4be0af6280a56da5df849938f2)
@@ -131,5 +131,5 @@
 	spawn("/sbin/tetris");
 	// FIXME: spawn("/sbin/tester");
-	// FIXME: spawn("/sbin/klog");
+	spawn("/sbin/klog");
 	
 	free(buf);
Index: uspace/app/klog/klog.c
===================================================================
--- uspace/app/klog/klog.c	(revision b7b675307e0a41ee1e8b50270215df7dabd37b8a)
+++ uspace/app/klog/klog.c	(revision 1c03c17200abbb4be0af6280a56da5df849938f2)
@@ -41,4 +41,10 @@
 #include <as.h>
 #include <sysinfo.h>
+#include <io/stream.h>
+#include <errno.h>
+
+#define NAME "klog"
+
+#define KLOG_SIZE PAGE_SIZE
 
 /* Pointer to klog area */
@@ -47,10 +53,13 @@
 static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
 {
-	int i;
+	async_serialize_start();
 	
-	async_serialize_start();
-	for (i=0; klog[i + IPC_GET_ARG1(*call)] && i < IPC_GET_ARG2(*call); i++)
-		putchar(klog[i + IPC_GET_ARG1(*call)]);
-	putchar('\n');
+	size_t klog_start = (size_t) IPC_GET_ARG1(*call);
+	size_t klog_len = (size_t) IPC_GET_ARG2(*call);
+	size_t klog_stored = (size_t) IPC_GET_ARG3(*call);
+	size_t i;
+	for (i = klog_len - klog_stored; i < klog_len; i++)
+		putchar(klog[(klog_start + i) % KLOG_SIZE]);
+	
 	async_serialize_end();
 }
@@ -58,27 +67,26 @@
 int main(int argc, char *argv[])
 {
-	int res;
-	void *mapping;
-
-	printf("Kernel console output.\n");
+	klog = (char *) as_get_mappable_page(KLOG_SIZE);
+	if (klog == NULL) {
+		printf(NAME ": Error allocating memory area\n");
+		return -1;
+	}
 	
-	mapping = as_get_mappable_page(PAGE_SIZE);
-	res = ipc_share_in_start_1_0(PHONE_NS, mapping, PAGE_SIZE,
+	int res = ipc_share_in_start_1_0(PHONE_NS, (void *) klog, KLOG_SIZE,
 	    SERVICE_MEM_KLOG);
-	if (res) {
-		printf("Failed to initialize klog memarea\n");
-		_exit(1);
+	if (res != EOK) {
+		printf(NAME ": Error initializing memory area\n");
+		return -1;
 	}
-	klog = mapping;
 
 	int inr = sysinfo_value("klog.inr");
 	int devno = sysinfo_value("klog.devno");
-	if (ipc_register_irq(inr, devno, 0, NULL)) {
-		printf("Error registering for klog service.\n");
-		return 0;
+	if (ipc_register_irq(inr, devno, 0, NULL) != EOK) {
+		printf(NAME ": Error registering klog notifications\n");
+		return -1;
 	}
-
+	
 	async_set_interrupt_received(interrupt_received);
-
+	klog_update();
 	async_manager();
 
Index: uspace/lib/libc/generic/io/stream.c
===================================================================
--- uspace/lib/libc/generic/io/stream.c	(revision b7b675307e0a41ee1e8b50270215df7dabd37b8a)
+++ uspace/lib/libc/generic/io/stream.c	(revision 1c03c17200abbb4be0af6280a56da5df849938f2)
@@ -83,5 +83,5 @@
 		return count;
 	} else
-		return __SYSCALL3(SYS_IO, 1, (sysarg_t) buf, count);
+		return __SYSCALL3(SYS_KLOG, 1, (sysarg_t) buf, count);
 }
 
@@ -95,4 +95,9 @@
 }
 
+void klog_update(void)
+{
+	(void) __SYSCALL3(SYS_KLOG, 1, NULL, 0);
+}
+
 int get_cons_phone(void)
 {
Index: uspace/lib/libc/include/io/stream.h
===================================================================
--- uspace/lib/libc/include/io/stream.h	(revision b7b675307e0a41ee1e8b50270215df7dabd37b8a)
+++ uspace/lib/libc/include/io/stream.h	(revision 1c03c17200abbb4be0af6280a56da5df849938f2)
@@ -41,4 +41,5 @@
 
 extern void open_console(void);
+extern void klog_update(void);
 
 extern ssize_t read_stdin(void *, size_t);
Index: uspace/lib/libc/include/stdio.h
===================================================================
--- uspace/lib/libc/include/stdio.h	(revision b7b675307e0a41ee1e8b50270215df7dabd37b8a)
+++ uspace/lib/libc/include/stdio.h	(revision 1c03c17200abbb4be0af6280a56da5df849938f2)
@@ -50,5 +50,5 @@
 	n = snprintf(buf, sizeof(buf), fmt, ##__VA_ARGS__); \
 	if (n > 0) \
-		(void) __SYSCALL3(SYS_IO, 1, (sysarg_t) buf, strlen(buf)); \
+		(void) __SYSCALL3(SYS_KLOG, 1, (sysarg_t) buf, strlen(buf)); \
 }
 
