Index: kernel/generic/src/console/cmd.c
===================================================================
--- kernel/generic/src/console/cmd.c	(revision 927cd9ce784b0e6c27b4862e22e7019f1b721585)
+++ kernel/generic/src/console/cmd.c	(revision fd07e57b67ceab8f6bff8103a832fe90c48a7715)
@@ -45,4 +45,5 @@
 #include <console/kconsole.h>
 #include <print.h>
+#include <log.h>
 #include <panic.h>
 #include <typedefs.h>
@@ -639,5 +640,6 @@
 	for (i = 0; basic_commands[i]; i++) {
 		if (!cmd_register(basic_commands[i])) {
-			printf("Cannot register command %s\n",
+			log(LF_OTHER, LVL_ERROR,
+			    "Cannot register command %s",
 			    basic_commands[i]->name);
 		}
@@ -665,5 +667,5 @@
 	unsigned int _len = (unsigned int) len;
 	if ((_len != len) || (((int) _len) < 0)) {
-		printf("Command length overflow\n");
+		log(LF_OTHER, LVL_ERROR, "Command length overflow");
 		return 1;
 	}
Index: kernel/generic/src/lib/func.c
===================================================================
--- kernel/generic/src/lib/func.c	(revision 927cd9ce784b0e6c27b4862e22e7019f1b721585)
+++ kernel/generic/src/lib/func.c	(revision fd07e57b67ceab8f6bff8103a832fe90c48a7715)
@@ -37,5 +37,5 @@
 
 #include <func.h>
-#include <print.h>
+#include <log.h>
 #include <cpu.h>
 #include <arch/asm.h>
@@ -72,7 +72,7 @@
 	
 	if (CPU)
-		printf("cpu%u: halted\n", CPU->id);
+		log(LF_OTHER, LVL_NOTE, "cpu%u: halted", CPU->id);
 	else
-		printf("cpu: halted\n");
+		log(LF_OTHER, LVL_NOTE, "cpu: halted");
 	
 	cpu_halt();
Index: kernel/generic/src/lib/rd.c
===================================================================
--- kernel/generic/src/lib/rd.c	(revision 927cd9ce784b0e6c27b4862e22e7019f1b721585)
+++ kernel/generic/src/lib/rd.c	(revision fd07e57b67ceab8f6bff8103a832fe90c48a7715)
@@ -38,5 +38,5 @@
  */
 
-#include <print.h>
+#include <log.h>
 #include <lib/rd.h>
 #include <mm/frame.h>
@@ -68,5 +68,6 @@
 	sysinfo_set_item_val("rd.address.physical", NULL, (sysarg_t) base);
 	
-	printf("RAM disk at %p (size %zu bytes)\n", (void *) base, size);
+	log(LF_OTHER, LVL_NOTE, "RAM disk at %p (size %zu bytes)", (void *) base,
+	    size);
 }
 
Index: kernel/generic/src/main/kinit.c
===================================================================
--- kernel/generic/src/main/kinit.c	(revision 927cd9ce784b0e6c27b4862e22e7019f1b721585)
+++ kernel/generic/src/main/kinit.c	(revision fd07e57b67ceab8f6bff8103a832fe90c48a7715)
@@ -59,4 +59,5 @@
 #include <mm/km.h>
 #include <print.h>
+#include <log.h>
 #include <memstr.h>
 #include <console/console.h>
@@ -140,5 +141,6 @@
 				thread_ready(thread);
 			} else
-				printf("Unable to create kcpulb thread for cpu%u\n", i);
+				log(LF_OTHER, LVL_ERROR,
+				    "Unable to create kcpulb thread for cpu%u", i);
 		}
 	}
@@ -156,5 +158,5 @@
 		thread_ready(thread);
 	else
-		printf("Unable to create kload thread\n");
+		log(LF_OTHER, LVL_ERROR, "Unable to create kload thread");
 	
 #ifdef CONFIG_KCONSOLE
@@ -168,5 +170,6 @@
 			thread_ready(thread);
 		else
-			printf("Unable to create kconsole thread\n");
+			log(LF_OTHER, LVL_ERROR,
+			    "Unable to create kconsole thread");
 	}
 #endif /* CONFIG_KCONSOLE */
@@ -210,5 +213,6 @@
 	for (i = 0; i < init.cnt; i++) {
 		if (init.tasks[i].paddr % FRAME_SIZE) {
-			printf("init[%zu]: Address is not frame aligned\n", i);
+			log(LF_OTHER, LVL_ERROR,
+			    "init[%zu]: Address is not frame aligned", i);
 			programs[i].task = NULL;
 			continue;
@@ -273,6 +277,7 @@
 			init_rd((void *) init.tasks[i].paddr, init.tasks[i].size);
 		} else
-			printf("init[%zu]: Init binary load failed "
-			    "(error %d, loader status %u)\n", i, rc,
+			log(LF_OTHER, LVL_ERROR,
+			    "init[%zu]: Init binary load failed "
+			    "(error %d, loader status %u)", i, rc,
 			    programs[i].loader_status);
 	}
Index: kernel/generic/src/main/shutdown.c
===================================================================
--- kernel/generic/src/main/shutdown.c	(revision 927cd9ce784b0e6c27b4862e22e7019f1b721585)
+++ kernel/generic/src/main/shutdown.c	(revision fd07e57b67ceab8f6bff8103a832fe90c48a7715)
@@ -39,4 +39,5 @@
 #include <func.h>
 #include <print.h>
+#include <log.h>
 
 void reboot(void)
@@ -45,5 +46,5 @@
 	
 #ifdef CONFIG_DEBUG
-	printf("Rebooting the system\n");
+	log(LF_OTHER, LVL_DEBUG, "Rebooting the system");
 #endif
 	
Index: kernel/generic/src/mm/frame.c
===================================================================
--- kernel/generic/src/mm/frame.c	(revision 927cd9ce784b0e6c27b4862e22e7019f1b721585)
+++ kernel/generic/src/mm/frame.c	(revision fd07e57b67ceab8f6bff8103a832fe90c48a7715)
@@ -54,4 +54,5 @@
 #include <arch.h>
 #include <print.h>
+#include <log.h>
 #include <align.h>
 #include <mm/slab.h>
@@ -121,5 +122,6 @@
 {
 	if (zones.count + 1 == ZONES_MAX) {
-		printf("Maximum zone count %u exceeded!\n", ZONES_MAX);
+		log(LF_OTHER, LVL_ERROR, "Maximum zone count %u exceeded!",
+		    ZONES_MAX);
 		return (size_t) -1;
 	}
@@ -141,6 +143,7 @@
 			    (!iswithin(zones.info[i].base, zones.info[i].count,
 			    base, count))) {
-				printf("Zone (%p, %p) overlaps "
-				    "with previous zone (%p %p)!\n",
+				log(LF_OTHER, LVL_WARN,
+				    "Zone (%p, %p) overlaps "
+				    "with previous zone (%p %p)!",
 				    (void *) PFN2ADDR(base), (void *) PFN2ADDR(count),
 				    (void *) PFN2ADDR(zones.info[i].base),
@@ -913,6 +916,7 @@
 		
 #ifdef CONFIG_DEBUG
-		printf("Thread %" PRIu64 " waiting for %zu frames "
-		    "(%zu available).\n", THREAD->tid, count, avail);
+		log(LF_OTHER, LVL_DEBUG,
+		    "Thread %" PRIu64 " waiting for %zu frames "
+		    "%zu available.", THREAD->tid, count, avail);
 #endif
 		
@@ -938,5 +942,6 @@
 		
 #ifdef CONFIG_DEBUG
-		printf("Thread %" PRIu64 " woken up.\n", THREAD->tid);
+		log(LF_OTHER, LVL_DEBUG, "Thread %" PRIu64 " woken up.",
+		    THREAD->tid);
 #endif
 		
Index: kernel/generic/src/proc/program.c
===================================================================
--- kernel/generic/src/proc/program.c	(revision 927cd9ce784b0e6c27b4862e22e7019f1b721585)
+++ kernel/generic/src/proc/program.c	(revision fd07e57b67ceab8f6bff8103a832fe90c48a7715)
@@ -49,5 +49,5 @@
 #include <lib/elf_load.h>
 #include <errno.h>
-#include <print.h>
+#include <log.h>
 #include <syscall/copy.h>
 #include <proc/program.h>
@@ -155,5 +155,5 @@
 		
 		program_loader = image_addr;
-		printf("Program loader at %p\n", (void *) image_addr);
+		log(LF_OTHER, LVL_NOTE, "Program loader at %p", (void *) image_addr);
 		
 		return EOK;
@@ -181,5 +181,6 @@
 	if (!loader) {
 		as_destroy(as);
-		printf("Cannot spawn loader as none was registered\n");
+		log(LF_OTHER, LVL_ERROR,
+		    "Cannot spawn loader as none was registered");
 		return ENOENT;
 	}
@@ -189,5 +190,5 @@
 	if (prg->loader_status != EE_OK) {
 		as_destroy(as);
-		printf("Cannot spawn loader (%s)\n",
+		log(LF_OTHER, LVL_ERROR, "Cannot spawn loader (%s)",
 		    elf_error(prg->loader_status));
 		return ENOENT;
Index: kernel/generic/src/proc/scheduler.c
===================================================================
--- kernel/generic/src/proc/scheduler.c	(revision 927cd9ce784b0e6c27b4862e22e7019f1b721585)
+++ kernel/generic/src/proc/scheduler.c	(revision fd07e57b67ceab8f6bff8103a832fe90c48a7715)
@@ -61,4 +61,5 @@
 #include <cpu.h>
 #include <print.h>
+#include <log.h>
 #include <debug.h>
 #include <stacktrace.h>
@@ -517,6 +518,7 @@
 	
 #ifdef SCHEDULER_VERBOSE
-	printf("cpu%u: tid %" PRIu64 " (priority=%d, ticks=%" PRIu64
-	    ", nrdy=%" PRIua ")\n", CPU->id, THREAD->tid, THREAD->priority,
+	log(LF_OTHER, LVL_DEBUG,
+	    "cpu%u: tid %" PRIu64 " (priority=%d, ticks=%" PRIu64
+	    ", nrdy=%" PRIua ")", CPU->id, THREAD->tid, THREAD->priority,
 	    THREAD->ticks, atomic_get(&CPU->nrdy));
 #endif
@@ -663,6 +665,7 @@
 				
 #ifdef KCPULB_VERBOSE
-				printf("kcpulb%u: TID %" PRIu64 " -> cpu%u, "
-				    "nrdy=%ld, avg=%ld\n", CPU->id, t->tid,
+				log(LF_OTHER, LVL_DEBUG,
+				    "kcpulb%u: TID %" PRIu64 " -> cpu%u, "
+				    "nrdy=%ld, avg=%ld", CPU->id, t->tid,
 				    CPU->id, atomic_get(&CPU->nrdy),
 				    atomic_get(&nrdy) / config.cpu_active);
Index: kernel/generic/src/syscall/syscall.c
===================================================================
--- kernel/generic/src/syscall/syscall.c	(revision 927cd9ce784b0e6c27b4862e22e7019f1b721585)
+++ kernel/generic/src/syscall/syscall.c	(revision fd07e57b67ceab8f6bff8103a832fe90c48a7715)
@@ -87,5 +87,6 @@
 		rc = syscall_table[id](a1, a2, a3, a4, a5, a6);
 	} else {
-		printf("Task %" PRIu64": Unknown syscall %#" PRIxn, TASK->taskid, id);
+		log(LF_OTHER, LVL_ERROR,
+		    "Task %" PRIu64": Unknown syscall %#" PRIxn, TASK->taskid, id);
 		task_kill_self(true);
 	}
