Index: arch/ppc32/Makefile.inc
===================================================================
--- arch/ppc32/Makefile.inc	(revision ab4ac14bc92a83f8b39807a0cc66945b532c7a65)
+++ arch/ppc32/Makefile.inc	(revision 63f5cd624fce0a9f9d21523f20fc6a44eec1a11c)
@@ -29,11 +29,11 @@
 build: image.boot
 
-image.boot: kernel
-	make -C arch/$(ARCH)/loader COMPILER=$(COMPILER) KERNEL=../../../$(KERNELDIR)/kernel.bin
+image.boot: kernel uspace
+	make -C arch/$(ARCH)/loader COMPILER=$(COMPILER) KERNEL=../../../$(KERNELDIR)/kernel.bin INIT=../../../$(USPACEDIR)/init/init
 	cp arch/$(ARCH)/loader/image.boot image.boot
 
-clean: clean_kernel
+clean: clean_kernel clean_uspace
 	make -C arch/$(ARCH)/loader clean
 	-rm -f image.boot
 
-arch_distclean: distclean_kernel
+arch_distclean: distclean_kernel distclean_uspace
Index: arch/ppc32/loader/Makefile
===================================================================
--- arch/ppc32/loader/Makefile	(revision ab4ac14bc92a83f8b39807a0cc66945b532c7a65)
+++ arch/ppc32/loader/Makefile	(revision 63f5cd624fce0a9f9d21523f20fc6a44eec1a11c)
@@ -65,6 +65,6 @@
 -include Makefile.depend
 
-image.boot: depend $(OBJECTS) kernel.o
-	$(LD) -no-check-sections -N -T _link.ld $(OBJECTS) kernel.o -o $@
+image.boot: depend $(OBJECTS) kernel.o init.o
+	$(LD) -no-check-sections -N -T _link.ld $(OBJECTS) kernel.o init.o -o $@
 
 depend:
@@ -72,8 +72,11 @@
 
 clean:
-	-rm -f $(OBJECTS) image.boot kernel.o Makefile.depend
+	-rm -f $(OBJECTS) image.boot kernel.o init.o Makefile.depend
 
 kernel.o: $(KERNEL)
-	$(OBJCOPY) -I binary -O elf32-powerpc -B powerpc:common --rename-section .data=.image $(KERNEL) $@
+	$(OBJCOPY) -I binary -O elf32-powerpc -B powerpc:common --rename-section .data=.kernel_image $(KERNEL) $@
+
+init.o: $(INIT)
+	$(OBJCOPY) -I binary -O elf32-powerpc -B powerpc:common --rename-section .data=.init_image $(INIT) $@
 
 %.o: %.S
Index: arch/ppc32/loader/_link.ld
===================================================================
--- arch/ppc32/loader/_link.ld	(revision ab4ac14bc92a83f8b39807a0cc66945b532c7a65)
+++ arch/ppc32/loader/_link.ld	(revision 63f5cd624fce0a9f9d21523f20fc6a44eec1a11c)
@@ -24,5 +24,8 @@
 		
 		. = ALIGN(4096);
-		*(.image);
+		*(.kernel_image);
+		
+		. = ALIGN(4096);
+		*(.init_image);
 	}
 }
Index: arch/ppc32/loader/main.c
===================================================================
--- arch/ppc32/loader/main.c	(revision ab4ac14bc92a83f8b39807a0cc66945b532c7a65)
+++ arch/ppc32/loader/main.c	(revision 63f5cd624fce0a9f9d21523f20fc6a44eec1a11c)
@@ -34,4 +34,8 @@
 #define KERNEL_END ((void *) &_binary_____________kernel_kernel_bin_end)
 #define KERNEL_SIZE ((unsigned int) KERNEL_END - (unsigned int) KERNEL_START)
+
+#define INIT_START ((void *) &_binary_____________uspace_init_init_start)
+#define INIT_END ((void *) &_binary_____________uspace_init_init_end)
+#define INIT_SIZE ((unsigned int) INIT_END - (unsigned int) INIT_START)
 
 #define HEAP_GAP 1024000
@@ -80,4 +84,5 @@
 	
 	check_align(KERNEL_START, "Kernel image");
+	check_align(INIT_START, "Init image");
 	check_align(&real_mode, "Bootstrap trampoline");
 	check_align(&trans, "Translation table");
@@ -108,14 +113,29 @@
 	printf("\nMemory statistics (total %d MB)\n", bootinfo.memmap.total >> 20);
 	printf(" kernel image         at %L (size %d bytes)\n", KERNEL_START, KERNEL_SIZE);
-	printf(" boot info            at %L (physical %L)\n", &bootinfo, bootinfo_pa);
+	printf(" init image           at %L (size %d bytes)\n", INIT_START, INIT_SIZE);
+	printf(" boot info structure  at %L (physical %L)\n", &bootinfo, bootinfo_pa);
 	printf(" bootstrap trampoline at %L (physical %L)\n", &real_mode, real_mode_pa);
 	printf(" translation table    at %L (physical %L)\n", &trans, trans_pa);
 	
-	unsigned int top = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE);
-	unsigned int addr;
-	for (addr = 0; addr < KERNEL_SIZE; addr += PAGE_SIZE) {
-		void *pa = ofw_translate(KERNEL_START + addr);
-		fix_overlap(KERNEL_START + addr, &pa, "Kernel image", &top);
-		trans[addr >> PAGE_WIDTH] = pa;
+	unsigned int top = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE) + ALIGN_UP(INIT_SIZE, PAGE_SIZE);
+	unsigned int kernel_pages = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE) >> PAGE_WIDTH;
+	unsigned int init_pages = ALIGN_UP(INIT_SIZE, PAGE_SIZE) >> PAGE_WIDTH;
+	
+	unsigned int i;
+	
+	for (i = 0; i < kernel_pages; i++) {
+		void *pa = ofw_translate(KERNEL_START + (i << PAGE_WIDTH));
+		fix_overlap(KERNEL_START + (i << PAGE_WIDTH), &pa, "Kernel image", &top);
+		trans[i] = pa;
+	}
+	
+	for (i = 0; i < init_pages; i++) {
+		void *pa = ofw_translate(INIT_START + (i << PAGE_WIDTH));
+		fix_overlap(INIT_START + (i << PAGE_WIDTH), &pa, "Init image", &top);
+		trans[kernel_pages + i] = pa;
+		if (i == 0) {
+			bootinfo.init.addr = (void *) ((kernel_pages + i) << PAGE_WIDTH);
+			bootinfo.init.size = INIT_SIZE;
+		}
 	}
 	
@@ -125,4 +145,4 @@
 	
 	printf("\nBooting the kernel...\n");
-	jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, KERNEL_SIZE, fb, real_mode_pa);
+	jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, (kernel_pages + init_pages) << PAGE_WIDTH, fb, real_mode_pa);
 }
Index: arch/ppc32/loader/main.h
===================================================================
--- arch/ppc32/loader/main.h	(revision ab4ac14bc92a83f8b39807a0cc66945b532c7a65)
+++ arch/ppc32/loader/main.h	(revision 63f5cd624fce0a9f9d21523f20fc6a44eec1a11c)
@@ -40,4 +40,10 @@
 
 typedef struct {
+	void *addr;
+	unsigned int size;
+} utask_t;
+
+typedef struct {
+	utask_t init;
 	memmap_t memmap;
 	screen_t screen;
@@ -46,4 +52,8 @@
 extern int _binary_____________kernel_kernel_bin_start;
 extern int _binary_____________kernel_kernel_bin_end;
+
+extern int _binary_____________uspace_init_init_start;
+extern int _binary_____________uspace_init_init_end;
+
 extern void start(void);
 extern void bootstrap(void);
