Index: kernel/arch/ppc32/include/mm/page.h
===================================================================
--- kernel/arch/ppc32/include/mm/page.h	(revision f817d3a500d65d74090358c680483a7a8c72924e)
+++ kernel/arch/ppc32/include/mm/page.h	(revision 12bf33aabbb4c9c0de96d2a50f4601aff4642be2)
@@ -121,5 +121,5 @@
 /* Macros for querying the last-level PTEs. */
 #define PTE_VALID_ARCH(pte)			(*((uint32_t *) (pte)) != 0)
-#define PTE_PRESENT_ARCH(pte)			((pte)->p != 0)
+#define PTE_PRESENT_ARCH(pte)			((pte)->present != 0)
 #define PTE_GET_FRAME_ARCH(pte)			((pte)->pfn << 12)
 #define PTE_WRITABLE_ARCH(pte)			1
@@ -135,11 +135,11 @@
 	pte_t *p = &pt[i];
 	
-	return ((1 << PAGE_CACHEABLE_SHIFT) |
-	    ((!p->p) << PAGE_PRESENT_SHIFT) |
+	return (((!p->page_cache_disable) << PAGE_CACHEABLE_SHIFT) |
+	    ((!p->present) << PAGE_PRESENT_SHIFT) |
 	    (1 << PAGE_USER_SHIFT) |
 	    (1 << PAGE_READ_SHIFT) |
 	    (1 << PAGE_WRITE_SHIFT) |
 	    (1 << PAGE_EXEC_SHIFT) |
-	    (p->g << PAGE_GLOBAL_SHIFT));
+	    (p->global << PAGE_GLOBAL_SHIFT));
 }
 
@@ -148,6 +148,7 @@
 	pte_t *p = &pt[i];
 	
-	p->p = !(flags & PAGE_NOT_PRESENT);
-	p->g = (flags & PAGE_GLOBAL) != 0;
+	p->page_cache_disable = !(flags & PAGE_CACHEABLE);
+	p->present = !(flags & PAGE_NOT_PRESENT);
+	p->global = (flags & PAGE_GLOBAL) != 0;
 	p->valid = 1;
 }
Index: kernel/arch/ppc32/include/mm/tlb.h
===================================================================
--- kernel/arch/ppc32/include/mm/tlb.h	(revision f817d3a500d65d74090358c680483a7a8c72924e)
+++ kernel/arch/ppc32/include/mm/tlb.h	(revision 12bf33aabbb4c9c0de96d2a50f4601aff4642be2)
@@ -40,4 +40,9 @@
 #include <typedefs.h>
 
+#define WIMG_GUARDED    0x01
+#define WIMG_COHERENT   0x02
+#define WIMG_NO_CACHE   0x04
+#define WIMG_WRITETHRU  0x08
+
 typedef struct {
 	unsigned v : 1;          /**< Valid */
Index: kernel/arch/ppc32/include/types.h
===================================================================
--- kernel/arch/ppc32/include/types.h	(revision f817d3a500d65d74090358c680483a7a8c72924e)
+++ kernel/arch/ppc32/include/types.h	(revision 12bf33aabbb4c9c0de96d2a50f4601aff4642be2)
@@ -85,9 +85,11 @@
 /** Page Table Entry. */
 typedef struct {
-	unsigned p : 1;       /**< Present bit. */
-	unsigned a : 1;       /**< Accessed bit. */
-	unsigned g : 1;       /**< Global bit. */
-	unsigned valid : 1;   /**< Valid content even if not present. */
-	unsigned pfn : 20;    /**< Physical frame number. */
+	unsigned present : 1;             /**< Present bit. */
+	unsigned page_write_through : 1;  /**< Write thought caching. */
+	unsigned page_cache_disable : 1;  /**< No caching. */
+	unsigned accessed : 1;            /**< Accessed bit. */
+	unsigned global : 1;              /**< Global bit. */
+	unsigned valid : 1;               /**< Valid content even if not present. */
+	unsigned pfn : 20;                /**< Physical frame number. */
 } pte_t;
 
Index: kernel/arch/ppc32/src/mm/tlb.c
===================================================================
--- kernel/arch/ppc32/src/mm/tlb.c	(revision f817d3a500d65d74090358c680483a7a8c72924e)
+++ kernel/arch/ppc32/src/mm/tlb.c	(revision 12bf33aabbb4c9c0de96d2a50f4601aff4642be2)
@@ -67,5 +67,5 @@
 	 */	
 	pte_t *pte = page_mapping_find(as, badvaddr);
-	if ((pte) && (pte->p)) {
+	if ((pte) && (pte->present)) {
 		/*
 		 * Mapping found in page tables.
@@ -89,5 +89,5 @@
 			page_table_lock(as, lock);
 			pte = page_mapping_find(as, badvaddr);
-			ASSERT((pte) && (pte->p));
+			ASSERT((pte) && (pte->present));
 			*pfrc = 0;
 			return pte;
@@ -127,5 +127,5 @@
 
 
-static void pht_insert(const uintptr_t vaddr, const pfn_t pfn)
+static void pht_insert(const uintptr_t vaddr, const pte_t *pte)
 {
 	uint32_t page = (vaddr >> 12) & 0xffff;
@@ -190,7 +190,8 @@
 	phte[base + i].h = h;
 	phte[base + i].api = api;
-	phte[base + i].rpn = pfn;
+	phte[base + i].rpn = pte->pfn;
 	phte[base + i].r = 0;
 	phte[base + i].c = 0;
+	phte[base + i].wimg = (pte->page_cache_disable ? WIMG_NO_CACHE : 0);
 	phte[base + i].pp = 2; // FIXME
 }
@@ -264,4 +265,5 @@
 	phte_physical[base + i].r = 0;
 	phte_physical[base + i].c = 0;
+	phte_physical[base + i].wimg = 0;
 	phte_physical[base + i].pp = 2; // FIXME
 }
@@ -319,6 +321,6 @@
 	}
 	
-	pte->a = 1; /* Record access to PTE */
-	pht_insert(badvaddr, pte->pfn);
+	pte->accessed = 1; /* Record access to PTE */
+	pht_insert(badvaddr, pte);
 	
 	page_table_unlock(as, lock);
