Index: kernel/generic/src/lib/rd.c
===================================================================
--- kernel/generic/src/lib/rd.c	(revision 21881bd89560b621656e09355bf15dd512a7c207)
+++ kernel/generic/src/lib/rd.c	(revision 8969f46521c752673b4f66d59e0481fe70513ca3)
@@ -33,5 +33,5 @@
 /**
  * @file
- * @brief	RAM disk support.
+ * @brief RAM disk support.
  *
  * Support for RAM disk images.
@@ -39,66 +39,31 @@
 
 #include <lib/rd.h>
-#include <byteorder.h>
 #include <mm/frame.h>
 #include <sysinfo/sysinfo.h>
 #include <ddi/ddi.h>
-#include <align.h>
 
-static parea_t rd_parea;		/**< Physical memory area for rd. */
+/** Physical memory area for RAM disk. */
+static parea_t rd_parea;
 
-/**
- * RAM disk initialization routine. At this point, the RAM disk memory is shared
- * and information about the share is provided as sysinfo values to the
- * userspace tasks.
- */  
-int init_rd(rd_header_t *header, size_t size)
+/** RAM disk initialization routine
+ *
+ * The information about the RAM disk is provided as sysinfo
+ * values to the uspace tasks.
+ *
+ */
+void init_rd(void *data, size_t size)
 {
-	/* Identify RAM disk */
-	if ((header->magic[0] != RD_MAG0) || (header->magic[1] != RD_MAG1) ||
-	    (header->magic[2] != RD_MAG2) || (header->magic[3] != RD_MAG3))
-		return RE_INVALID;
+	uintptr_t base = KA2PA((uintptr_t) data);
+	ASSERT((base % FRAME_SIZE) == 0);
 	
-	/* Identify version */	
-	if (header->version != RD_VERSION)
-		return RE_UNSUPPORTED;
-	
-	uint32_t hsize;
-	uint64_t dsize;
-	switch (header->data_type) {
-	case RD_DATA_LSB:
-		hsize = uint32_t_le2host(header->header_size);
-		dsize = uint64_t_le2host(header->data_size);
-		break;
-	case RD_DATA_MSB:
-		hsize = uint32_t_be2host(header->header_size);
-		dsize = uint64_t_be2host(header->data_size);
-		break;
-	default:
-		return RE_UNSUPPORTED;
-	}
-	
-	if ((hsize % FRAME_SIZE) || (dsize % FRAME_SIZE))
-		return RE_UNSUPPORTED;
-		
-	if (hsize > size)
-		return RE_INVALID;
-	
-	if ((uint64_t) hsize + dsize > size)
-		dsize = size - hsize;
-	
-	rd_parea.pbase = ALIGN_DOWN((uintptr_t) KA2PA((void *) header + hsize),
-	    FRAME_SIZE);
-	rd_parea.frames = SIZE2FRAMES(dsize);
+	rd_parea.pbase = base;
+	rd_parea.frames = SIZE2FRAMES(size);
 	rd_parea.unpriv = false;
 	rd_parea.mapped = false;
 	ddi_parea_register(&rd_parea);
-
+	
 	sysinfo_set_item_val("rd", NULL, true);
-	sysinfo_set_item_val("rd.header_size", NULL, hsize);	
-	sysinfo_set_item_val("rd.size", NULL, dsize);
-	sysinfo_set_item_val("rd.address.physical", NULL,
-	    (sysarg_t) KA2PA((void *) header + hsize));
-
-	return RE_OK;
+	sysinfo_set_item_val("rd.size", NULL, size);
+	sysinfo_set_item_val("rd.address.physical", NULL, (sysarg_t) base);
 }
 
Index: kernel/generic/src/main/kinit.c
===================================================================
--- kernel/generic/src/main/kinit.c	(revision 21881bd89560b621656e09355bf15dd512a7c207)
+++ kernel/generic/src/main/kinit.c	(revision 8969f46521c752673b4f66d59e0481fe70513ca3)
@@ -179,5 +179,5 @@
 	for (i = 0; i < init.cnt; i++) {
 		if (init.tasks[i].addr % FRAME_SIZE) {
-			printf("init[%zu].addr is not frame aligned\n", i);
+			printf("init[%zu]: Address is not frame aligned\n", i);
 			programs[i].task = NULL;
 			continue;
@@ -203,22 +203,28 @@
 		    namebuf, &programs[i]);
 		
-		if ((rc == 0) && (programs[i].task != NULL)) {
+		if (rc == 0) {
+			if (programs[i].task != NULL) {
+				/*
+				 * Set capabilities to init userspace tasks.
+				 */
+				cap_set(programs[i].task, CAP_CAP | CAP_MEM_MANAGER |
+				    CAP_IO_MANAGER | CAP_IRQ_REG);
+				
+				if (!ipc_phone_0)
+					ipc_phone_0 = &programs[i].task->answerbox;
+			}
+			
 			/*
-			 * Set capabilities to init userspace tasks.
+			 * If programs[i].task == NULL then it is
+			 * the program loader and it was registered
+			 * successfully.
 			 */
-			cap_set(programs[i].task, CAP_CAP | CAP_MEM_MANAGER |
-			    CAP_IO_MANAGER | CAP_IRQ_REG);
-			
-			if (!ipc_phone_0)
-				ipc_phone_0 = &programs[i].task->answerbox;
-		} else if (rc == 0) {
-			/* It was the program loader and was registered */
-		} else {
-			/* RAM disk image */
-			int rd = init_rd((rd_header_t *) init.tasks[i].addr, init.tasks[i].size);
-			
-			if (rd != RE_OK)
-				printf("Init binary %zu not used (error %d)\n", i, rd);
-		}
+		} else if (i == init.cnt - 1) {
+			/*
+			 * Assume the last task is the RAM disk.
+			 */
+			init_rd((void *) init.tasks[i].addr, init.tasks[i].size);
+		} else
+			printf("init[%zu]: Init binary load failed (error %d)\n", i, rc);
 	}
 	
