return 1;
        }
 
-       if ((shadow_access == PT_ACCESS_NOT_PRESENT) &&
-           (guest_access == PT_ACCESS_NOT_PRESENT)) {
+       /*
+         if ((shadow_access == PT_ACCESS_NOT_PRESENT) &&
+         (guest_access == PT_ACCESS_NOT_PRESENT)) {
+         // Page tables completely blank, handle guest first
+         return 1;
+         }
+       */
+
+       if (guest_access == PT_ACCESS_NOT_PRESENT) {
            // Page tables completely blank, handle guest first
            return 1;
        }
-
+       
        // Otherwise we'll handle the guest fault later...?
     }
 
 
        PrintDebug("Access error injecting pf to guest (guest access error=%d) (pf error code=%d)\n", 
                   guest_pte_access, *(uint_t*)&error_code);
 #ifdef CONFIG_SYMBIOTIC_SWAP
-       if (is_swapped_pte32(guest_pte)) {
+       if ((error_code.write == 0) && (is_swapped_pte32(guest_pte))) {
            PrintError("Page fault on swapped out page (pte=%x)\n", *(uint32_t *)guest_pte);
 
            addr_t swp_pg_addr = v3_get_swapped_pg_addr(info, shadow_pte, guest_pte);
                 */
                
                /* We need some way to check permissions.... */
-
+               
                shadow_pte->accessed = 1;
-               shadow_pte->writable = 1;
+               shadow_pte->writable = 0;
+
+               if (fault_addr & 0xc0000000) {
+                   shadow_pte->user_page = 0;
+               } else {
+                   shadow_pte->user_page = 1;
+               }
+
                shadow_pte->write_through = 0;
                shadow_pte->cache_disable = 0;
                shadow_pte->global_page = 0;
-               shadow_pte->user_page = 1;
+       
                shadow_pte->present = 1;
                
                shadow_pte->page_base_addr = swp_pg_addr;
 
     if (shdw_ptr_list == NULL) {
        shdw_ptr_list = (struct list_head *)V3_Malloc(sizeof(struct list_head *));
        INIT_LIST_HEAD(shdw_ptr_list);
+       v3_htable_insert(swap_state->shdw_ptr_ht, (addr_t)*(uint32_t *)guest_pte, (addr_t)shdw_ptr_list);
     }
 
     shdw_ptr = (struct shadow_pointer *)V3_Malloc(sizeof(struct shadow_pointer));