Index: kernel/generic/include/lib/elf.h
===================================================================
--- kernel/generic/include/lib/elf.h	(revision e3f819f43b108ff90a50324cbced9c2b89d2171e)
+++ kernel/generic/include/lib/elf.h	(revision 57d44dd9c17ddb49818d70775e58b45ccd3511fd)
@@ -39,8 +39,4 @@
 #include <arch/elf.h>
 
-/** 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/lib/elf_load.h
===================================================================
--- kernel/generic/include/lib/elf_load.h	(revision e3f819f43b108ff90a50324cbced9c2b89d2171e)
+++ kernel/generic/include/lib/elf_load.h	(revision 57d44dd9c17ddb49818d70775e58b45ccd3511fd)
@@ -46,15 +46,7 @@
 #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_LOADER         5  /* The image is actually a program loader. */
-#define EE_IRRECOVERABLE  6  /* Irrecoverable error. */
+#define EE_IRRECOVERABLE  5  /* Irrecoverable error. */
 
-/**
- * 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 *, as_t *, unsigned int);
+extern unsigned int elf_load(elf_header_t *, as_t *);
 extern const char *elf_error(unsigned int rc);
 
Index: kernel/generic/src/lib/elf.c
===================================================================
--- kernel/generic/src/lib/elf.c	(revision e3f819f43b108ff90a50324cbced9c2b89d2171e)
+++ kernel/generic/src/lib/elf.c	(revision 57d44dd9c17ddb49818d70775e58b45ccd3511fd)
@@ -46,4 +46,5 @@
 #include <macros.h>
 #include <arch.h>
+#include <str.h>
 
 #include <lib/elf_load.h>
@@ -58,6 +59,4 @@
 };
 
-static int segment_header(elf_segment_header_t *, elf_header_t *, as_t *,
-    unsigned int);
 static int load_segment(elf_segment_header_t *, elf_header_t *, as_t *);
 
@@ -71,5 +70,5 @@
  *
  */
-unsigned int elf_load(elf_header_t *header, as_t *as, unsigned int flags)
+unsigned int elf_load(elf_header_t *header, as_t *as)
 {
 	/* Identify ELF */
@@ -106,5 +105,8 @@
 		    header->e_phoff))[i];
 
-		int rc = segment_header(seghdr, header, as, flags);
+		if (seghdr->p_type != PT_LOAD)
+			continue;
+
+		int rc = load_segment(seghdr, header, as);
 		if (rc != EE_OK)
 			return rc;
@@ -126,46 +128,4 @@
 
 	return error_codes[rc];
-}
-
-/** Process segment header.
- *
- * @param entry Segment header.
- * @param elf   ELF header.
- * @param as    Address space into wich the ELF is being loaded.
- *
- * @return EE_OK on success, error code otherwise.
- *
- */
-static int segment_header(elf_segment_header_t *entry, elf_header_t *elf,
-    as_t *as, unsigned int flags)
-{
-	switch (entry->p_type) {
-	case PT_NULL:
-	case PT_PHDR:
-	case PT_NOTE:
-		break;
-	case PT_LOAD:
-		return load_segment(entry, elf, as);
-	case PT_TLS:
-		break;
-	case PT_DYNAMIC:
-	case PT_INTERP:
-		// FIXME
-		/*
-		char *interp = (char *) elf + entry->p_offset;
-		if (memcmp((uintptr_t) interp, (uintptr_t) ELF_INTERP_ZSTR,
-		    ELF_INTERP_ZLEN) != 0) {
-			return EE_UNSUPPORTED;
-		} */
-		if ((flags & ELD_F_LOADER) == 0)
-			return EE_LOADER;
-		break;
-	case PT_SHLIB:
-	case PT_LOPROC:
-	case PT_HIPROC:
-	default:
-		return EE_UNSUPPORTED;
-	}
-	return EE_OK;
 }
 
Index: kernel/generic/src/main/kinit.c
===================================================================
--- kernel/generic/src/main/kinit.c	(revision e3f819f43b108ff90a50324cbced9c2b89d2171e)
+++ kernel/generic/src/main/kinit.c	(revision 57d44dd9c17ddb49818d70775e58b45ccd3511fd)
@@ -253,33 +253,42 @@
 		assert(page);
 
+		if (str_cmp(name, "loader") == 0) {
+			/* Register image as the program loader */
+			if (program_loader == NULL) {
+				program_loader = (void *) page;
+				log(LF_OTHER, LVL_NOTE, "Program loader at %p",
+				    program_loader);
+			} else {
+				log(LF_OTHER, LVL_ERROR,
+				    "init[%zu]: Second binary named \"loader\""
+				    " present.", i);
+			}
+			continue;
+		}
+
 		errno_t rc = program_create_from_image((void *) page, namebuf,
 		    &programs[i]);
 
 		if (rc == 0) {
-			if (programs[i].task != NULL) {
+			assert(programs[i].task != NULL);
+
+			/*
+			 * Set permissions to init userspace tasks.
+			 */
+			perm_set(programs[i].task,
+			    PERM_PERM | PERM_MEM_MANAGER |
+			    PERM_IO_MANAGER | PERM_IRQ_REG);
+
+			if (!ipc_box_0) {
+				ipc_box_0 = &programs[i].task->answerbox;
 				/*
-				 * Set permissions to init userspace tasks.
+				 * Hold the first task so that
+				 * ipc_box_0 remains a valid pointer
+				 * even if the first task exits for
+				 * whatever reason.
 				 */
-				perm_set(programs[i].task,
-				    PERM_PERM | PERM_MEM_MANAGER |
-				    PERM_IO_MANAGER | PERM_IRQ_REG);
-
-				if (!ipc_box_0) {
-					ipc_box_0 = &programs[i].task->answerbox;
-					/*
-					 * Hold the first task so that
-					 * ipc_box_0 remains a valid pointer
-					 * even if the first task exits for
-					 * whatever reason.
-					 */
-					task_hold(programs[i].task);
-				}
+				task_hold(programs[i].task);
 			}
 
-			/*
-			 * If programs[i].task == NULL then it is
-			 * the program loader and it was registered
-			 * successfully.
-			 */
 		} else if (i == init.cnt - 1) {
 			/*
@@ -287,9 +296,10 @@
 			 */
 			init_rd((void *) init.tasks[i].paddr, init.tasks[i].size);
-		} else
+		} else {
 			log(LF_OTHER, LVL_ERROR,
 			    "init[%zu]: Init binary load failed "
 			    "(error %s, loader status %u)", i,
 			    str_error_name(rc), programs[i].loader_status);
+		}
 	}
 
Index: kernel/generic/src/proc/program.c
===================================================================
--- kernel/generic/src/proc/program.c	(revision e3f819f43b108ff90a50324cbced9c2b89d2171e)
+++ kernel/generic/src/proc/program.c	(revision 57d44dd9c17ddb49818d70775e58b45ccd3511fd)
@@ -143,21 +143,10 @@
 		return ENOMEM;
 
-	prg->loader_status = elf_load((elf_header_t *) image_addr, as, 0);
+	prg->loader_status = elf_load((elf_header_t *) image_addr, as);
 	if (prg->loader_status != EE_OK) {
 		as_destroy(as);
 		prg->task = NULL;
 		prg->main_thread = NULL;
-
-		if (prg->loader_status != EE_LOADER)
-			return ENOTSUP;
-
-		/* Register image as the program loader */
-		if (program_loader != NULL)
-			return ELIMIT;
-
-		program_loader = image_addr;
-		log(LF_OTHER, LVL_NOTE, "Program loader at %p", (void *) image_addr);
-
-		return EOK;
+		return ENOTSUP;
 	}
 
@@ -188,6 +177,5 @@
 	}
 
-	prg->loader_status = elf_load((elf_header_t *) program_loader, as,
-	    ELD_F_LOADER);
+	prg->loader_status = elf_load((elf_header_t *) program_loader, as);
 	if (prg->loader_status != EE_OK) {
 		as_destroy(as);
Index: uspace/lib/c/generic/elf/elf_mod.c
===================================================================
--- uspace/lib/c/generic/elf/elf_mod.c	(revision e3f819f43b108ff90a50324cbced9c2b89d2171e)
+++ uspace/lib/c/generic/elf/elf_mod.c	(revision 57d44dd9c17ddb49818d70775e58b45ccd3511fd)
@@ -268,6 +268,16 @@
 		break;
 	case PT_INTERP:
-		/* Assume silently interp == "/app/dload" */
-		elf->info->interp = "/app/dload";
+		elf->info->interp =
+		    (void *)((uint8_t *)entry->p_vaddr + elf->bias);
+
+		// FIXME: This actually won't work, because the text segment is
+		// not loaded yet.
+		#if 0
+		if (elf->info->interp[entry->p_filesz - 1] != '\0') {
+			DPRINTF("Unterminated ELF interp string.\n");
+			return EE_INVALID;
+		}
+		DPRINTF("interpreter: \"%s\"\n", elf->info->interp);
+		#endif
 		break;
 	case PT_DYNAMIC:
Index: uspace/lib/c/include/elf/elf_mod.h
===================================================================
--- uspace/lib/c/include/elf/elf_mod.h	(revision e3f819f43b108ff90a50324cbced9c2b89d2171e)
+++ uspace/lib/c/include/elf/elf_mod.h	(revision 57d44dd9c17ddb49818d70775e58b45ccd3511fd)
@@ -51,7 +51,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_LOADER		5	/* The image is actually a program loader. */
-#define EE_IRRECOVERABLE	6
-#define EE_IO			7	/* Could not read file. */
+#define EE_IRRECOVERABLE	5
+#define EE_IO			6	/* Could not read file. */
 
 typedef enum {
Index: uspace/srv/loader/Makefile
===================================================================
--- uspace/srv/loader/Makefile	(revision e3f819f43b108ff90a50324cbced9c2b89d2171e)
+++ uspace/srv/loader/Makefile	(revision 57d44dd9c17ddb49818d70775e58b45ccd3511fd)
@@ -36,6 +36,5 @@
 
 GENERIC_SOURCES = \
-	main.c \
-	interp.S
+	main.c
 
 SOURCES = \
Index: pace/srv/loader/interp.S
===================================================================
--- uspace/srv/loader/interp.S	(revision e3f819f43b108ff90a50324cbced9c2b89d2171e)
+++ 	(revision )
@@ -1,21 +1,0 @@
-#
-# Provide a string to be included in a special DT_INTERP header, even though
-# this is a statically-linked executable. This will mark the binary as
-# the program loader.
-#
-
-#if ((defined(UARCH_abs32le)) && (defined(COMPILER_gcc_cross)) \
-    && (defined(CROSS_TARGET_arm32)))
-	#define ATSIGN(arg)  % ## arg
-#endif
-
-#ifdef UARCH_arm32
-	#define ATSIGN(arg)  % ## arg
-#endif
-
-#ifndef ATSIGN
-	#define ATSIGN(arg)  @ ## arg
-#endif
-
-.section .interp, "a", ATSIGN(progbits)
-	.string "kernel"
