Index: kernel/generic/include/lib/elf.h
===================================================================
--- kernel/generic/include/lib/elf.h	(revision 498b20153808a4296ace87eaa357438dc95949e5)
+++ kernel/generic/include/lib/elf.h	(revision 5e8ddf5690a75f99176a2b7d8083393b9361e06b)
@@ -115,5 +115,6 @@
 #define EE_INCOMPATIBLE		3	/* ELF image is not compatible with current architecture */
 #define EE_UNSUPPORTED		4	/* Non-supported ELF (e.g. dynamic ELFs) */
-#define EE_IRRECOVERABLE	5
+#define EE_LOADER		5	/* The image is actually a program loader */
+#define EE_IRRECOVERABLE	6
 
 /**
@@ -339,4 +340,8 @@
 extern char *elf_error(unsigned int rc);
 
+/* Interpreter string used to recognize the program loader */
+#define ELF_INTERP_ZSTR "kernel"
+#define ELF_INTERP_ZLEN  sizeof(ELF_INTERP_ZSTR)
+
 #endif
 
Index: kernel/generic/include/mm/as.h
===================================================================
--- kernel/generic/include/mm/as.h	(revision 498b20153808a4296ace87eaa357438dc95949e5)
+++ kernel/generic/include/mm/as.h	(revision 5e8ddf5690a75f99176a2b7d8083393b9361e06b)
@@ -270,4 +270,5 @@
 int as_area_share(as_t *src_as, uintptr_t src_base, size_t acc_size,
     as_t *dst_as, uintptr_t dst_base, int dst_flags_mask);
+extern int as_area_change_flags(as_t *as, int flags, uintptr_t address);
 
 extern int as_area_get_flags(as_area_t *area);
@@ -300,9 +301,17 @@
 extern mem_backend_t phys_backend;
 
-extern unsigned int elf_load(elf_header_t *header, as_t *as);
+/** 
+ * This flags is passed when running the loader, otherwise elf_load()
+ * would return with a EE_LOADER error code.
+ */
+#define ELD_F_NONE	0
+#define ELD_F_LOADER	1
+
+extern unsigned int elf_load(elf_header_t *header, as_t *as, int flags);
 
 /* Address space area related syscalls. */
 extern unative_t sys_as_area_create(uintptr_t address, size_t size, int flags);
 extern unative_t sys_as_area_resize(uintptr_t address, size_t size, int flags);
+extern unative_t sys_as_area_change_flags(uintptr_t address, int flags);
 extern unative_t sys_as_area_destroy(uintptr_t address);
 
Index: kernel/generic/include/proc/program.h
===================================================================
--- kernel/generic/include/proc/program.h	(revision 5e8ddf5690a75f99176a2b7d8083393b9361e06b)
+++ kernel/generic/include/proc/program.h	(revision 5e8ddf5690a75f99176a2b7d8083393b9361e06b)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2008 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 genericproc
+ * @{
+ */
+/** @file
+ */
+
+#ifndef KERN_PROGRAM_H_
+#define KERN_PROGRAM_H_
+
+#include <arch/types.h>
+
+struct task;
+struct thread;
+
+/** Program info structure.
+ *
+ * A program is an abstraction of a freshly created (not yet running)
+ * userspace task containing a main thread along with its userspace stack.
+ */
+typedef struct program {
+	struct task *task;		/**< Program task */
+	struct thread *main_thread;	/**< Program main thread */
+} program_t;
+
+extern void *program_loader;
+
+extern void program_create(as_t *as, uintptr_t entry_addr, program_t *p);
+extern int program_create_from_image(void *image_addr, program_t *p);
+extern int program_create_loader(program_t *p);
+extern void program_ready(program_t *p);
+
+extern unative_t sys_program_spawn_loader(int *uspace_phone_id);
+
+#endif
+
+/** @}
+ */
Index: kernel/generic/include/proc/task.h
===================================================================
--- kernel/generic/include/proc/task.h	(revision 498b20153808a4296ace87eaa357438dc95949e5)
+++ kernel/generic/include/proc/task.h	(revision 5e8ddf5690a75f99176a2b7d8083393b9361e06b)
@@ -133,5 +133,4 @@
 
 extern unative_t sys_task_get_id(task_id_t *uspace_task_id);
-extern unative_t sys_task_spawn(void *image, size_t size);
 
 #endif
Index: kernel/generic/include/proc/thread.h
===================================================================
--- kernel/generic/include/proc/thread.h	(revision 498b20153808a4296ace87eaa357438dc95949e5)
+++ kernel/generic/include/proc/thread.h	(revision 5e8ddf5690a75f99176a2b7d8083393b9361e06b)
@@ -249,6 +249,4 @@
 extern bool thread_exists(thread_t *t);
 
-extern thread_t *thread_create_program(void *program_addr, char *name);
-
 /** Fpu context slab cache. */
 extern slab_cache_t *fpu_context_slab;
Index: kernel/generic/include/synch/smc.h
===================================================================
--- kernel/generic/include/synch/smc.h	(revision 5e8ddf5690a75f99176a2b7d8083393b9361e06b)
+++ kernel/generic/include/synch/smc.h	(revision 5e8ddf5690a75f99176a2b7d8083393b9361e06b)
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2008 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 sync
+ * @{
+ */
+/** @file
+ */
+
+#ifndef KERN_SMC_H_
+#define KERN_SMC_H_
+
+extern unative_t sys_smc_coherence(uintptr_t va, size_t size);
+
+#endif
+
+/** @}
+ */
Index: kernel/generic/include/syscall/syscall.h
===================================================================
--- kernel/generic/include/syscall/syscall.h	(revision 498b20153808a4296ace87eaa357438dc95949e5)
+++ kernel/generic/include/syscall/syscall.h	(revision 5e8ddf5690a75f99176a2b7d8083393b9361e06b)
@@ -45,11 +45,13 @@
 	
 	SYS_TASK_GET_ID,
-	SYS_TASK_SPAWN,
+	SYS_PROGRAM_SPAWN_LOADER,
 	
 	SYS_FUTEX_SLEEP,
 	SYS_FUTEX_WAKEUP,
+	SYS_SMC_COHERENCE,
 	
 	SYS_AS_AREA_CREATE,
 	SYS_AS_AREA_RESIZE,
+	SYS_AS_AREA_CHANGE_FLAGS,
 	SYS_AS_AREA_DESTROY,
 	
