Index: kernel/generic/include/proc/program.h
===================================================================
--- kernel/generic/include/proc/program.h	(revision d89b2595703f0414fde6bf19c69c20795daa1c5d)
+++ kernel/generic/include/proc/program.h	(revision fb13b443f9001bc37d9726efa1ca239735ab5bd0)
@@ -38,4 +38,5 @@
 #include <typedefs.h>
 
+struct answerbox;
 struct task;
 struct thread;
@@ -55,5 +56,6 @@
 extern void *program_loader;
 
-extern errno_t program_create(as_t *, uspace_addr_t, char *, program_t *);
+extern errno_t program_create(as_t *, uspace_addr_t, char *, struct answerbox *,
+	program_t *);
 extern errno_t program_create_from_image(void *, char *, program_t *);
 extern errno_t program_create_loader(program_t *, char *);
Index: kernel/generic/include/proc/task.h
===================================================================
--- kernel/generic/include/proc/task.h	(revision d89b2595703f0414fde6bf19c69c20795daa1c5d)
+++ kernel/generic/include/proc/task.h	(revision fb13b443f9001bc37d9726efa1ca239735ab5bd0)
@@ -139,5 +139,5 @@
 extern void task_init(void);
 extern void task_done(void);
-extern task_t *task_create(as_t *, const char *);
+extern task_t *task_create(as_t *, const char *, answerbox_t *);
 extern void task_destroy(task_t *);
 extern void task_hold(task_t *);
Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision d89b2595703f0414fde6bf19c69c20795daa1c5d)
+++ kernel/generic/src/ipc/ipc.c	(revision fb13b443f9001bc37d9726efa1ca239735ab5bd0)
@@ -65,5 +65,5 @@
 static void ipc_forget_call(call_t *);
 
-/** Answerbox that new tasks are automatically connected to */
+/** Answerbox that is assigned to boot-time tasks */
 answerbox_t *ipc_box_0 = NULL;
 
Index: kernel/generic/src/main/main.c
===================================================================
--- kernel/generic/src/main/main.c	(revision d89b2595703f0414fde6bf19c69c20795daa1c5d)
+++ kernel/generic/src/main/main.c	(revision fb13b443f9001bc37d9726efa1ca239735ab5bd0)
@@ -298,5 +298,5 @@
 	 * Create kernel task.
 	 */
-	task_t *kernel = task_create(AS_KERNEL, "kernel");
+	task_t *kernel = task_create(AS_KERNEL, "kernel", NULL);
 	if (!kernel)
 		panic("Cannot create kernel task.");
Index: kernel/generic/src/proc/program.c
===================================================================
--- kernel/generic/src/proc/program.c	(revision d89b2595703f0414fde6bf19c69c20795daa1c5d)
+++ kernel/generic/src/proc/program.c	(revision fb13b443f9001bc37d9726efa1ca239735ab5bd0)
@@ -64,4 +64,5 @@
  * @param entry_addr Program entry-point address in program address space.
  * @param name       Name to set for the program's task.
+ * @param answerbox  Answerbox where box 0 is connected to (may be NULL).
  * @param prg        Buffer for storing program information.
  *
@@ -69,5 +70,6 @@
  *
  */
-errno_t program_create(as_t *as, uspace_addr_t entry_addr, char *name, program_t *prg)
+errno_t program_create(as_t *as, uspace_addr_t entry_addr, char *name,
+	struct answerbox *answerbox, program_t *prg)
 {
 	uspace_arg_t *kernel_uarg = (uspace_arg_t *)
@@ -77,5 +79,5 @@
 
 	prg->loader_status = EOK;
-	prg->task = task_create(as, name);
+	prg->task = task_create(as, name, answerbox);
 	if (!prg->task) {
 		free(kernel_uarg);
@@ -157,5 +159,5 @@
 
 	return program_create(as, ((elf_header_t *) image_addr)->e_entry,
-	    name, prg);
+	    name, ipc_box_0, prg);
 }
 
@@ -191,5 +193,5 @@
 
 	return program_create(as, ((elf_header_t *) program_loader)->e_entry,
-	    name, prg);
+	    name, &TASK->answerbox, prg);
 }
 
Index: kernel/generic/src/proc/task.c
===================================================================
--- kernel/generic/src/proc/task.c	(revision d89b2595703f0414fde6bf19c69c20795daa1c5d)
+++ kernel/generic/src/proc/task.c	(revision fb13b443f9001bc37d9726efa1ca239735ab5bd0)
@@ -190,11 +190,12 @@
 /** Create new task with no threads.
  *
- * @param as   Task's address space.
- * @param name Symbolic name (a copy is made).
+ * @param as         Task's address space.
+ * @param name       Symbolic name (a copy is made).
+ * @param answerbox  (Optional) answerbox where box 0 is connected to.
  *
  * @return New task's structure.
  *
  */
-task_t *task_create(as_t *as, const char *name)
+task_t *task_create(as_t *as, const char *name, answerbox_t *answerbox)
 {
 	task_t *task = (task_t *) slab_alloc(task_cache, FRAME_ATOMIC);
@@ -234,6 +235,6 @@
 #endif
 
-	if ((ipc_box_0) &&
-	    (container_check(ipc_box_0->task->container, task->container))) {
+	if ((answerbox) &&
+	    (container_check(answerbox->task->container, task->container))) {
 		cap_phone_handle_t phone_handle;
 		errno_t rc = phone_alloc(task, true, &phone_handle, NULL);
@@ -247,5 +248,5 @@
 		kobject_t *phone_obj = kobject_get(task, phone_handle,
 		    KOBJECT_TYPE_PHONE);
-		(void) ipc_phone_connect(phone_obj->phone, ipc_box_0);
+		(void) ipc_phone_connect(phone_obj->phone, answerbox);
 	}
 
