Index: kernel/generic/include/byteorder.h
===================================================================
--- kernel/generic/include/byteorder.h	(revision 0cf1dcf618f56b3af8ac02f020702b3d38273d91)
+++ kernel/generic/include/byteorder.h	(revision 058b021e12166270a97cf3aaf8f91a30aedc513c)
@@ -42,5 +42,5 @@
 		((n & 0xff0000) << 24) |
 		((n & 0xff000000LL) << 8) |
-		((n & 0xff00000000LL) >>8) |
+		((n & 0xff00000000LL) >> 8) |
 		((n & 0xff0000000000LL) >> 24) |
 		((n & 0xff000000000000LL) >> 40) |
Index: kernel/generic/include/lib/rd.h
===================================================================
--- kernel/generic/include/lib/rd.h	(revision 0cf1dcf618f56b3af8ac02f020702b3d38273d91)
+++ kernel/generic/include/lib/rd.h	(revision 058b021e12166270a97cf3aaf8f91a30aedc513c)
@@ -36,7 +36,45 @@
 #define KERN_RD_H_
 
+#include <arch/types.h>
 #include <typedefs.h>
 
-extern bool init_rd(void * addr);
+/**
+ * RAM disk version
+ */
+#define	RD_VERSION	0
+
+/**
+ * RAM disk magic number
+ */
+#define RD_MAGIC_SIZE	4
+#define RD_MAG0			'H'
+#define RD_MAG1			'O'
+#define RD_MAG2			'R'
+#define RD_MAG3			'D'
+
+/**
+ * RAM disk data encoding types
+ */
+#define RD_DATA_NONE	0
+#define RD_DATA_LSB		1		/* Least significant byte first (little endian) */
+#define RD_DATA_MSB		2		/* Most signigicant byte first (big endian) */
+
+/**
+ * RAM disk error return codes
+ */
+#define RE_OK			0	/* No error */
+#define RE_INVALID		1	/* Invalid RAM disk image */
+#define RE_UNSUPPORTED		2	/* Non-supported image (e.g. wrong version) */
+
+/** RAM disk header */
+typedef struct {
+	uint8_t magic[RD_MAGIC_SIZE];
+	uint8_t version;
+	uint8_t data_type;
+	uint32_t header_size;
+	uint64_t data_size;
+} rd_header;
+
+extern int init_rd(rd_header * addr);
 
 #endif
Index: kernel/generic/src/lib/rd.c
===================================================================
--- kernel/generic/src/lib/rd.c	(revision 0cf1dcf618f56b3af8ac02f020702b3d38273d91)
+++ kernel/generic/src/lib/rd.c	(revision 058b021e12166270a97cf3aaf8f91a30aedc513c)
@@ -39,8 +39,30 @@
 
 #include <lib/rd.h>
+#include <arch/byteorder.h>
 
-bool init_rd(void * addr)
+int init_rd(rd_header * header)
 {
-	return false;
+	/* 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;
+	
+	/* Identify version */	
+	if (header->version != RD_VERSION)
+		return RE_UNSUPPORTED;
+	
+	uint64_t hsize;
+	switch (header->data_type) {
+	case RD_DATA_LSB:
+		hsize = uint64_t_le2host(header->header_size);
+		break;
+//	case RD_DATA_MSB:
+//		hsize = uint64_t_be2host(header->header_size);
+//		break;
+	default:
+		return RE_UNSUPPORTED;
+	}
+		
+
+	return RE_OK;
 }
 
Index: kernel/generic/src/main/kinit.c
===================================================================
--- kernel/generic/src/main/kinit.c	(revision 0cf1dcf618f56b3af8ac02f020702b3d38273d91)
+++ kernel/generic/src/main/kinit.c	(revision 058b021e12166270a97cf3aaf8f91a30aedc513c)
@@ -181,7 +181,7 @@
 				ipc_phone_0 = &utask->answerbox;
 		} else {
-			bool rd = init_rd((void *) init.tasks[i].addr);
+			int rd = init_rd((void *) init.tasks[i].addr);
 			
-			if (!rd)
+			if (rd != RE_OK)
 				printf("Init binary %zd not used.\n", i);
 		}
