Index: kernel/arch/amd64/include/interrupt.h
===================================================================
--- kernel/arch/amd64/include/interrupt.h	(revision a1f60f34d64053b65db351e780b9315fdd0384a3)
+++ kernel/arch/amd64/include/interrupt.h	(revision 64f6ef041c53542ec74adf92465986abf208b1c3)
@@ -117,7 +117,4 @@
 extern void trap_virtual_disable_irqs(uint16_t irqmask);
 
-/* AMD64 - specific page handler */
-extern void ident_page_fault(unsigned int, istate_t *);
-
 #endif
 
Index: kernel/arch/amd64/src/boot/boot.S
===================================================================
--- kernel/arch/amd64/src/boot/boot.S	(revision a1f60f34d64053b65db351e780b9315fdd0384a3)
+++ kernel/arch/amd64/src/boot/boot.S	(revision 64f6ef041c53542ec74adf92465986abf208b1c3)
@@ -263,50 +263,69 @@
 #
 .macro ptl2gen cnt g
-.if \cnt
-	ptl2gen "\cnt - 8" \g
-	.quad ((\cnt - 8) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-	.quad ((\cnt - 7) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-	.quad ((\cnt - 6) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-	.quad ((\cnt - 5) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-	.quad ((\cnt - 4) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-	.quad ((\cnt - 3) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-	.quad ((\cnt - 2) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-	.quad ((\cnt - 1) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-.endif
+	.if \cnt
+		ptl2gen "\cnt - 8" \g
+		.quad ((\cnt - 8) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
+		.quad ((\cnt - 7) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
+		.quad ((\cnt - 6) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
+		.quad ((\cnt - 5) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
+		.quad ((\cnt - 4) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
+		.quad ((\cnt - 3) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
+		.quad ((\cnt - 2) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
+		.quad ((\cnt - 1) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
+	.endif
 .endm
 
-# Page table for pages in the first gigabyte.
-.align 4096
-.global ptl_2_0g
+# Page table for pages in the 1st gigabyte.
+.align 4096
 ptl_2_0g:
 	ptl2gen 512 0
 
-# Page table for pages in the second gigabyte.
-.align 4096
-.global ptl_2_1g
+# Page table for pages in the 2nd gigabyte.
+.align 4096
 ptl_2_1g:
 	ptl2gen 512 1
 
-# Page table for pages in the third gigabyte.
-.align 4096
-.global ptl_2_2g
+# Page table for pages in the 3rd gigabyte.
+.align 4096
 ptl_2_2g:
 	ptl2gen 512 2
 
-# Page table for pages in the fourth gigabyte.
-.align 4096
-.global ptl_2_3g
+# Page table for pages in the 4th gigabyte.
+.align 4096
 ptl_2_3g:
 	ptl2gen 512 3
 
-.align 4096
-.global ptl_1
+# Page table for pages in the 5th gigabyte.
+.align 4096
+ptl_2_4g:
+	ptl2gen 512 3
+
+# Page table for pages in the 6th gigabyte.
+.align 4096
+ptl_2_5g:
+	ptl2gen 512 3
+
+# Page table for pages in the 7th gigabyte.
+.align 4096
+ptl_2_6g:
+	ptl2gen 512 3
+
+# Page table for pages in the 8th gigabyte.
+.align 4096
+ptl_2_7g:
+	ptl2gen 512 3
+
+.align 4096
 ptl_1:
-	# Identity mapping for [0; 4G)
+	# Identity mapping for [0; 8G)
 	.quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT)
 	.quad ptl_2_1g + (PTL_WRITABLE | PTL_PRESENT)
 	.quad ptl_2_2g + (PTL_WRITABLE | PTL_PRESENT)
 	.quad ptl_2_3g + (PTL_WRITABLE | PTL_PRESENT)
-	.fill 508, 8, 0
+	.quad ptl_2_4g + (PTL_WRITABLE | PTL_PRESENT)
+	.quad ptl_2_5g + (PTL_WRITABLE | PTL_PRESENT)
+	.quad ptl_2_6g + (PTL_WRITABLE | PTL_PRESENT)
+	.quad ptl_2_7g + (PTL_WRITABLE | PTL_PRESENT)
+	.fill 504, 8, 0
 
 .align 4096
Index: kernel/arch/amd64/src/interrupt.c
===================================================================
--- kernel/arch/amd64/src/interrupt.c	(revision a1f60f34d64053b65db351e780b9315fdd0384a3)
+++ kernel/arch/amd64/src/interrupt.c	(revision 64f6ef041c53542ec74adf92465986abf208b1c3)
@@ -214,5 +214,4 @@
 	exc_register(12, "ss_fault", true, (iroutine_t) ss_fault);
 	exc_register(13, "gp_fault", true, (iroutine_t) gp_fault);
-	exc_register(14, "ident_mapper", true, (iroutine_t) ident_page_fault);
 	
 #ifdef CONFIG_SMP
Index: kernel/arch/amd64/src/mm/page.c
===================================================================
--- kernel/arch/amd64/src/mm/page.c	(revision a1f60f34d64053b65db351e780b9315fdd0384a3)
+++ kernel/arch/amd64/src/mm/page.c	(revision 64f6ef041c53542ec74adf92465986abf208b1c3)
@@ -39,5 +39,4 @@
 #include <mm/frame.h>
 #include <mm/as.h>
-#include <arch/interrupt.h>
 #include <arch/asm.h>
 #include <config.h>
@@ -47,55 +46,4 @@
 #include <panic.h>
 #include <align.h>
-
-/* Definitions for identity page mapper */
-pte_t helper_ptl1[512] __attribute__((aligned (PAGE_SIZE)));
-pte_t helper_ptl2[512] __attribute__((aligned (PAGE_SIZE)));
-pte_t helper_ptl3[512] __attribute__((aligned (PAGE_SIZE)));
-
-static uintptr_t oldpage = 0;
-
-extern pte_t ptl_0;  /* From boot.S */
-
-#define PTL1_PRESENT(ptl0, page) \
-	(!(GET_PTL1_FLAGS_ARCH(ptl0, PTL0_INDEX_ARCH(page)) & PAGE_NOT_PRESENT))
-
-#define PTL2_PRESENT(ptl1, page) \
-	(!(GET_PTL2_FLAGS_ARCH(ptl1, PTL1_INDEX_ARCH(page)) & PAGE_NOT_PRESENT))
-
-#define PTL3_PRESENT(ptl2, page) \
-	(!(GET_PTL3_FLAGS_ARCH(ptl2, PTL2_INDEX_ARCH(page)) & PAGE_NOT_PRESENT))
-
-#define PTL1_ADDR(ptl0, page) \
-	((pte_t *) PA2KA(GET_PTL1_ADDRESS_ARCH(ptl0, PTL0_INDEX_ARCH(page))))
-
-#define PTL2_ADDR(ptl1, page) \
-	((pte_t *) PA2KA(GET_PTL2_ADDRESS_ARCH(ptl1, PTL1_INDEX_ARCH(page))))
-
-#define PTL3_ADDR(ptl2, page) \
-	((pte_t *) PA2KA(GET_PTL3_ADDRESS_ARCH(ptl2, PTL2_INDEX_ARCH(page))))
-
-#define SETUP_PTL1(ptl0, page, tgt) \
-	{ \
-		SET_PTL1_ADDRESS_ARCH(ptl0, PTL0_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \
-		SET_PTL1_FLAGS_ARCH(ptl0, PTL0_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \
-	}
-
-#define SETUP_PTL2(ptl1, page, tgt) \
-	{ \
-		SET_PTL2_ADDRESS_ARCH(ptl1, PTL1_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \
-		SET_PTL2_FLAGS_ARCH(ptl1, PTL1_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \
-	}
-
-#define SETUP_PTL3(ptl2, page, tgt) \
-	{ \
-		SET_PTL3_ADDRESS_ARCH(ptl2, PTL2_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \
-		SET_PTL3_FLAGS_ARCH(ptl2, PTL2_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \
-	}
-
-#define SETUP_FRAME(ptl3, page, tgt) \
-	{ \
-		SET_FRAME_ADDRESS_ARCH(ptl3, PTL3_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \
-		SET_FRAME_FLAGS_ARCH(ptl3, PTL3_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \
-	}
 
 void page_arch_init(void)
@@ -122,63 +70,4 @@
 	} else
 		write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
-}
-
-/** Identity page mapper
- *
- * We need to map whole physical memory identically before the page subsystem
- * is initializaed. This thing clears page table and fills in the specific
- * items.
- *
- */
-void ident_page_fault(unsigned int n, istate_t *istate)
-{
-	pte_t *aptl_1;
-	pte_t *aptl_2;
-	pte_t *aptl_3;
-	
-	uintptr_t page = read_cr2();
-	
-	/* Unmap old address */
-	if (oldpage) {
-		pte_t *aptl_1 = PTL1_ADDR(&ptl_0, oldpage);
-		pte_t *aptl_2 = PTL2_ADDR(aptl_1, oldpage);
-		pte_t *aptl_3 = PTL3_ADDR(aptl_2, oldpage);
-		
-		SET_FRAME_FLAGS_ARCH(aptl_3, PTL3_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT);
-		
-		if (KA2PA(aptl_3) == KA2PA(helper_ptl3))
-			SET_PTL3_FLAGS_ARCH(aptl_2, PTL2_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT);
-		
-		if (KA2PA(aptl_2) == KA2PA(helper_ptl2))
-			SET_PTL2_FLAGS_ARCH(aptl_1, PTL1_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT);
-		
-		if (KA2PA(aptl_1) == KA2PA(helper_ptl1))
-			SET_PTL1_FLAGS_ARCH(&ptl_0, PTL0_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT);
-	}
-	
-	if (PTL1_PRESENT(&ptl_0, page))
-		aptl_1 = PTL1_ADDR(&ptl_0, page);
-	else {
-		SETUP_PTL1(&ptl_0, page, helper_ptl1);
-		aptl_1 = helper_ptl1;
-	}
-	
-	if (PTL2_PRESENT(aptl_1, page)) 
-		aptl_2 = PTL2_ADDR(aptl_1, page);
-	else {
-		SETUP_PTL2(aptl_1, page, helper_ptl2);
-		aptl_2 = helper_ptl2;
-	}
-	
-	if (PTL3_PRESENT(aptl_2, page))
-		aptl_3 = PTL3_ADDR(aptl_2, page);
-	else {
-		SETUP_PTL3(aptl_2, page, helper_ptl3);
-		aptl_3 = helper_ptl3;
-	}
-	
-	SETUP_FRAME(aptl_3, page, page);
-	
-	oldpage = page;
 }
 
Index: kernel/arch/ia32/src/mm/frame.c
===================================================================
--- kernel/arch/ia32/src/mm/frame.c	(revision a1f60f34d64053b65db351e780b9315fdd0384a3)
+++ kernel/arch/ia32/src/mm/frame.c	(revision 64f6ef041c53542ec74adf92465986abf208b1c3)
@@ -47,6 +47,6 @@
 #include <print.h>
 
-#define PHYSMEM_LIMIT32  0x7c000000ull
-#define PHYSMEM_LIMIT64  0xe0000000ull
+#define PHYSMEM_LIMIT32  0x07c000000ull
+#define PHYSMEM_LIMIT64  0x200000000ull
 
 size_t hardcoded_unmapped_ktext_size = 0;
@@ -96,7 +96,9 @@
 		 * or clip zones which go beyond PHYSMEM_LIMIT64.
 		 *
-		 * The limit PHYSMEM_LIMIT64 (3.5 GB) is caused
-		 * by various limitations of the current kernel
-		 * memory management.
+		 * The PHYSMEM_LIMIT64 (8 GB) is the size of the
+		 * fixed 1:1 identically mapped physical memory
+		 * accessible during the bootstrap process.
+		 * This is a severe limitation of the current
+		 * kernel memory management.
 		 *
 		 */
