Index: generic/include/arch.h
===================================================================
--- generic/include/arch.h	(revision 75e1db00d0ee9a3395d39a41f301594454557f36)
+++ generic/include/arch.h	(revision d6e852916cb4672682728fa0540fe558bca857b2)
@@ -43,8 +43,4 @@
 #define PREEMPTION_DISABLED	THE->preemption_disabled
 
-#ifndef early_mapping
-#define early_mapping(stack, size)
-#endif /* early_mapping */
-
 /**
  * For each possible kernel stack, structure
Index: generic/include/config.h
===================================================================
--- generic/include/config.h	(revision 75e1db00d0ee9a3395d39a41f301594454557f36)
+++ generic/include/config.h	(revision d6e852916cb4672682728fa0540fe558bca857b2)
@@ -41,13 +41,18 @@
 
 struct config {
+	count_t cpu_count;
+	volatile count_t cpu_active;
+
 	__address base;
 	size_t memory_size;
-	size_t kernel_size;
 	
 	__address init_addr;
 	size_t init_size;
-
-	count_t cpu_count;
-	volatile count_t cpu_active;
+	
+	__address heap_addr;
+	size_t heap_size;
+	size_t heap_delta;            /**< Extra space between heap and stack (enforced by alignment requirements) */
+	
+	size_t kernel_size;           /**< Size of memory in bytes taken by kernel, heap and stack */
 };
 
Index: generic/src/main/main.c
===================================================================
--- generic/src/main/main.c	(revision 75e1db00d0ee9a3395d39a41f301594454557f36)
+++ generic/src/main/main.c	(revision d6e852916cb4672682728fa0540fe558bca857b2)
@@ -83,5 +83,4 @@
 #endif
 
-
 config_t config;
 context_t ctx;
@@ -98,21 +97,4 @@
 __address init_addr = 0;
 size_t init_size = 0;
-
-/**
- * Size of memory in bytes taken by kernel and heap.
- */
-static size_t kernel_size;
-
-/**
- * Size of heap.
- */
-static size_t heap_size;
-
-
-/**
- * Extra space between heap and stack
- * enforced by alignment requirements.
- */
-static size_t heap_delta;
 
 void main_bsp(void);
@@ -141,18 +123,23 @@
 	config.cpu_count = 1;
 	config.cpu_active = 1;
+	
 	config.base = hardcoded_load_address;
 	config.memory_size = get_memory_size();
 	config.init_addr = init_addr;
 	config.init_size = init_size;
-
-	heap_size = CONFIG_HEAP_SIZE + (config.memory_size/FRAME_SIZE)*sizeof(frame_t);
-	kernel_size = ALIGN_UP(hardcoded_ktext_size + hardcoded_kdata_size + heap_size, PAGE_SIZE);
-	heap_delta = kernel_size - (hardcoded_ktext_size + hardcoded_kdata_size + heap_size);
-	
-	config.kernel_size = kernel_size + CONFIG_STACK_SIZE;
+	
+	if (init_size > 0)
+		config.heap_addr = init_addr + init_size;
+	else
+		config.heap_addr = hardcoded_load_address + hardcoded_ktext_size + hardcoded_kdata_size;
+	
+	config.heap_size = CONFIG_HEAP_SIZE + (config.memory_size / FRAME_SIZE) * sizeof(frame_t);
+	
+	config.kernel_size = ALIGN_UP(config.heap_addr - hardcoded_load_address + config.heap_size, PAGE_SIZE);
+	config.heap_delta = config.kernel_size - (config.heap_addr - hardcoded_load_address + config.heap_size);
+	config.kernel_size = config.kernel_size + CONFIG_STACK_SIZE;
 	
 	context_save(&ctx);
-	early_mapping(config.base + hardcoded_ktext_size + hardcoded_kdata_size, CONFIG_STACK_SIZE + heap_size + heap_delta);
-	context_set(&ctx, FADDR(main_bsp_separated_stack), config.base + kernel_size, CONFIG_STACK_SIZE);
+	context_set(&ctx, FADDR(main_bsp_separated_stack), config.base + config.kernel_size, CONFIG_STACK_SIZE);
 	context_restore(&ctx);
 	/* not reached */
@@ -186,10 +173,10 @@
 	
 	arch_pre_mm_init();
-	early_heap_init(config.base + hardcoded_ktext_size + hardcoded_kdata_size, heap_size + heap_delta);
+	early_heap_init(config.heap_addr, config.heap_size + config.heap_delta);
 	frame_init();
 	page_init();
 	tlb_init();
 	arch_post_mm_init();
-
+	
 	printf("%s, release %s (%s)%s\nBuilt%s for %s\n%s\n", project, release, name, revision, timestamp, arch, copyright);
 	printf("%P: hardcoded_ktext_size=%dK, hardcoded_kdata_size=%dK\n",
