diff -uNr vmmon-only-org/common/task.c vmmon-only/common/task.c
--- vmmon-only-org/common/task.c	2007-11-28 19:58:17.000000000 +0900
+++ vmmon-only/common/task.c	2008-03-07 15:31:40.000000000 +0900
@@ -25,7 +25,7 @@
  * we do not need asm/page.h anymore in this file - not surprising, this
  * is common file, yes?  And Windows do not have page.h, do they?
  */
-#define _I386_PAGE_H
+#define _ASM_X86_PAGE_H
 /* On Linux, must come before any inclusion of asm/page.h --hpreg */
 #include "hostKernel.h"
 #ifdef linux
diff -uNr vmmon-only-org/linux/driver.c vmmon-only/linux/driver.c
--- vmmon-only-org/linux/driver.c	2007-11-28 19:59:26.000000000 +0900
+++ vmmon-only/linux/driver.c	2008-03-07 15:31:40.000000000 +0900
@@ -147,7 +147,11 @@
 
 static int LinuxDriver_Close(struct inode *inode, struct file *filp);
 static unsigned int LinuxDriverPoll(struct file *file, poll_table *wait);
-#if defined(VMW_NOPAGE_261)
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)
+static int LinuxDriverFault(struct vm_area_struct *vma, struct vm_fault *vmf);
+static int LinuxDriverLockedFault(struct vm_area_struct *vma, struct vm_fault *vmf);
+#elif defined(VMW_NOPAGE_261)
 static struct page *LinuxDriverNoPage(struct vm_area_struct *vma,
                            unsigned long address, int *type);
 static struct page *LinuxDriverLockedNoPage(struct vm_area_struct *vma,
@@ -163,16 +167,25 @@
 static unsigned long LinuxDriverLockedNoPage(struct vm_area_struct *vma,
 			   unsigned long address, int unused);
 #endif
+
 static int LinuxDriverMmap(struct file *filp, struct vm_area_struct *vma);
 
 static void LinuxDriverPollTimeout(unsigned long clientData);
 
 static struct vm_operations_struct vmuser_mops = {
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)
+	.fault = LinuxDriverFault
+#else
 	.nopage = LinuxDriverNoPage
+#endif
 };
 
 struct vm_operations_struct vmuser_locked_mops = {
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)
+	.fault = LinuxDriverLockedFault
+#else
 	.nopage = LinuxDriverLockedNoPage
+#endif
 };
 
 static struct file_operations vmuser_fops;
@@ -1143,7 +1156,25 @@
  *-----------------------------------------------------------------------------
  */
 
-#ifdef VMW_NOPAGE_261
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)
+static int LinuxDriverFault(struct vm_area_struct *vma, struct vm_fault *vmf)
+{
+        VMLinux *vmLinux = (VMLinux *) vma->vm_file->private_data;
+        unsigned long pg, address = (unsigned long)vmf->virtual_address;
+        address = vmf->virtual_address - vma->vm_start;
+        pg = (address >> PAGE_SHIFT) + compat_vm_pgoff(vma);
+//        pg = (unsigned long)vmf->pgoff << PAGE_SHIFT;
+	pg = VMMON_MAP_OFFSET(pg);
+	if (pg >= vmLinux->size4Gb) {
+		return 0;
+	}
+	vmf->page = vmLinux->pages4Gb[pg];
+	get_page(vmf->page);
+        return 0;
+}
+
+#else
+#if defined(VMW_NOPAGE_261)
 static struct page *LinuxDriverNoPage(struct vm_area_struct *vma, //IN
 				      unsigned long address, 	  //IN
 				      int *type)		  //OUT: Fault type
@@ -1177,7 +1208,7 @@
 	return page_address(page);
 #endif
 }
-
+#endif
 
 /*
  *-----------------------------------------------------------------------------
diff -uNr vmmon-only-org/linux/driver_compat.h vmmon-only/linux/driver_compat.h
--- vmmon-only-org/linux/driver_compat.h	2007-07-23 12:58:15.000000000 +0900
+++ vmmon-only/linux/driver_compat.h	2008-03-07 15:31:40.000000000 +0900
@@ -268,7 +268,51 @@
  *-----------------------------------------------------------------------------
  */
 
-#ifdef VMW_NOPAGE_261
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)
+static int LinuxDriverLockedFault(struct vm_area_struct *vma, struct vm_fault *vmf)
+{
+   VMLinux *vmLinux = (VMLinux *) vma->vm_private_data;
+   unsigned long pfn, pg, address = (unsigned long)vmf->virtual_address;
+   struct page* pgt;
+   struct VMHostEntry* vmhe;
+   struct page* result;
+
+   address = vmf->virtual_address - vma->vm_start;
+   pg = (address >> PAGE_SHIFT) + compat_vm_pgoff(vma);
+//   pg = (unsigned long)vmf->pgoff << PAGE_SHIFT;
+
+   if (pg >= vmLinux->sizeLocked) {
+      printk(KERN_DEBUG "vmmon: Something went wrong: entry %08lX out of range (>=%08X) for mapping on filp %p\n", pg, vmLinux->sizeLocked, vmLinux);
+      return NOPAGE_SIGBUS;
+   }
+   if (!vmLinux->vm || !vmLinux->vm->vmhost) {
+      printk(KERN_DEBUG "vmmon: Something went wrong: no vm or vmhost for mapping on filp %p\n", vmLinux);
+      return NOPAGE_SIGBUS;
+   }
+   pgt = vmLinux->pagesLocked->ent[pg / VMHOST_MAPPING_PT];
+   if (!pgt) {
+      printk(KERN_DEBUG "vmmon: Something went wrong: missing entry %08lX from mapping on filp %p\n", pg, vmLinux);
+      return NOPAGE_SIGBUS;
+   }
+   vmhe = kmap(pgt);
+   result = vmhe->ent[pg % VMHOST_MAPPING_PT];
+   kunmap(pgt);
+   if (!result) {
+      printk(KERN_DEBUG "vmmon: Something went wrong: attempt to access non-existing entry %08lX in mapping on filp %p\n", pg, vmLinux);
+      return NOPAGE_SIGBUS;
+   }
+   if (!PhysTrack_Test(vmLinux->vm->vmhost->AWEPages, page_to_pfn(result))) {
+      printk(KERN_DEBUG "vmmon: MPN %08lX not tracked! Someone released it before removing it from VA first!\n", pg);
+      return NOPAGE_SIGBUS;
+   }
+   get_page(result);
+
+   return 0;
+
+}
+#else
+
+#if defined(VMW_NOPAGE_261)
 static struct page *LinuxDriverLockedNoPage(struct vm_area_struct *vma, //IN
 				            unsigned long address,      //IN
 				            int *type)		        //OUT: Fault type
@@ -324,6 +368,7 @@
 #endif
 }
 
+#endif
 
 /*
  *-----------------------------------------------------------------------------
