diff -urN vmware-server-kernel.orig/vmmon-only/autoconf/fault.c vmware-server-kernel/vmmon-only/autoconf/fault.c
--- vmware-server-kernel.orig/vmmon-only/autoconf/fault.c	1970-01-01 01:00:00.000000000 +0100
+++ vmware-server-kernel/vmmon-only/autoconf/fault.c	2008-09-21 16:56:04.000000000 +0200
@@ -0,0 +1,18 @@
+/*
+ * we'll try to use fault instead of nopage since 2.6.26
+ */
+#include <linux/autoconf.h>
+#include <linux/version.h>
+
+#include <linux/mm.h>
+
+int LinuxDriverFault(struct vm_area_struct *vma,
+					 struct vm_fault *vmf) {
+	(void)vma;
+	(void)vmf;
+	return VM_FAULT_MAJOR;
+}
+
+struct vm_operations_struct vmuser_mops = {
+        .fault = LinuxDriverFault
+};
diff -ur vmware-server-kernel.orig/vmmon-only/linux/driver.c vmware-server-kernel/vmmon-only/linux/driver.c
--- vmware-server-kernel.orig/vmmon-only/linux/driver.c	2008-09-21 16:46:30.000000000 +0200
+++ vmware-server-kernel/vmmon-only/linux/driver.c	2008-09-21 17:17:54.000000000 +0200
@@ -122,7 +122,12 @@
 
 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 defined(VMW_FAULT)
+int LinuxDriverFault(struct vm_area_struct *vma,
+					 struct vm_fault *vmf);
+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,
@@ -143,11 +148,19 @@
 static void LinuxDriverPollTimeout(unsigned long clientData);
 
 static struct vm_operations_struct vmuser_mops = {
+#if defined(VMW_FAULT)
+	.fault = LinuxDriverFault
+#else
 	.nopage = LinuxDriverNoPage
+#endif
 };
 
 struct vm_operations_struct vmuser_locked_mops = {
+#if defined(VMW_FAULT)
+	.fault = LinuxDriverLockedFault
+#else
 	.nopage = LinuxDriverLockedNoPage
+#endif
 };
 
 static struct file_operations vmuser_fops;
@@ -987,7 +1000,10 @@
  *-----------------------------------------------------------------------------
  */
 
-#ifdef VMW_NOPAGE_261
+#if defined(VMW_FAULT)
+int LinuxDriverFault(struct vm_area_struct *vma, //IN
+					 struct vm_fault *vmf)       //INOUT
+#elif defined(VMW_NOPAGE_261)
 static struct page *LinuxDriverNoPage(struct vm_area_struct *vma, //IN
 				      unsigned long address, 	  //IN
 				      int *type)		  //OUT: Fault type
@@ -1004,12 +1020,19 @@
 	VMLinux *vmLinux = (VMLinux *) vma->vm_file->private_data;
 	unsigned long pg;
 	
-	pg = (address - vma->vm_start) >> PAGE_SHIFT;
+	pg = ((unsigned long)vmf->virtual_address - vma->vm_start) >> PAGE_SHIFT; // use vmf->pgoff?
 	if (pg >= vmLinux->size4Gb) {
+#ifdef VMW_FAULT
+		return VM_FAULT_SIGBUS;
+#else
 		return 0;
+#endif		
 	}
 	get_page(virt_to_page(vmLinux->pages4Gb[pg]));
-#ifdef KERNEL_2_4_0
+#if defined(VMW_FAULT)
+	vmf->page = virt_to_page(vmLinux->pages4Gb[pg]);
+	return VM_FAULT_MAJOR;
+#elif defined(KERNEL_2_4_0)
 #ifdef VMW_NOPAGE_261
         *type = VM_FAULT_MINOR;
 #endif
@@ -1037,7 +1060,10 @@
  *-----------------------------------------------------------------------------
  */
 
-#ifdef VMW_NOPAGE_261
+#if defined(VMW_FAULT)
+int LinuxDriverLockedFault(struct vm_area_struct *vma, //IN
+						   struct vm_fault *vmf) //INOUT
+#elif defined(VMW_NOPAGE_261)
 static struct page *LinuxDriverLockedNoPage(struct vm_area_struct *vma, //IN
 				            unsigned long address,      //IN
 				            int *type)		        //OUT: Fault type
@@ -1057,33 +1083,56 @@
    struct VMHostEntry* vmhe;
    struct page* result;
 	
-   pg = ((address - vma->vm_start) >> PAGE_SHIFT) + compat_vm_pgoff(vma);
+   pg = (((unsigned long)vmf->virtual_address - vma->vm_start) >> PAGE_SHIFT) + compat_vm_pgoff(vma); // use vmf->pgoff?
    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);
+#ifdef VMW_FAULT
+      return VM_FAULT_SIGBUS;
+#else
       return NOPAGE_SIGBUS;
+#endif
    }
    if (!vmLinux->vm || !vmLinux->vm->vmhost) {
       printk(KERN_DEBUG "vmmon: Something went wrong: no vm or vmhost for mapping on filp %p\n", vmLinux);
+#ifdef VMW_FAULT
+      return VM_FAULT_SIGBUS;
+#else
       return NOPAGE_SIGBUS;
+#endif
    }
    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);
+#ifdef VMW_FAULT
+      return VM_FAULT_SIGBUS;
+#else
       return NOPAGE_SIGBUS;
+#endif
    }
    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);
+#ifdef VMW_FAULT
+      return VM_FAULT_SIGBUS;
+#else
       return NOPAGE_SIGBUS;
+#endif
    }
    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);
+#ifdef VMW_FAULT
+      return VM_FAULT_SIGBUS;
+#else
       return NOPAGE_SIGBUS;
+#endif
    }
    get_page(result);
-#ifdef KERNEL_2_4_0
+#if defined(VMW_FAULT)
+   vmf->page = result;
+   return VM_FAULT_MAJOR;
+#elif defined(KERNEL_2_4_0)
 #ifdef VMW_NOPAGE_261
    *type = VM_FAULT_MINOR;
 #endif
diff -ur vmware-server-kernel.orig/vmmon-only/Makefile.kernel vmware-server-kernel/vmmon-only/Makefile.kernel
--- vmware-server-kernel.orig/vmmon-only/Makefile.kernel	2008-09-21 16:46:30.000000000 +0200
+++ vmware-server-kernel/vmmon-only/Makefile.kernel	2008-09-21 16:55:08.000000000 +0200
@@ -13,6 +13,7 @@
 
 EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE)
 
+EXTRA_CFLAGS += $(call vm_check_build, $(SRCROOT)/autoconf/fault.c,   -DVMW_FAULT, )
 EXTRA_CFLAGS += $(call vm_check_build, $(SRCROOT)/autoconf/nopage1.c, -DVMW_NOPAGE_261, )
 EXTRA_CFLAGS += $(call vm_check_build, $(SRCROOT)/autoconf/skas1.c,   -DVMW_SKAS_MMAP, )
 EXTRA_CFLAGS += $(call vm_check_build, $(SRCROOT)/autoconf/epoll.c,   -DVMW_HAVE_EPOLL, )
diff -ur vmware-server-kernel.orig/vmmon-only/Makefile.normal vmware-server-kernel/vmmon-only/Makefile.normal
--- vmware-server-kernel.orig/vmmon-only/Makefile.normal	2008-09-21 16:46:30.000000000 +0200
+++ vmware-server-kernel/vmmon-only/Makefile.normal	2008-09-21 16:55:07.000000000 +0200
@@ -60,6 +60,7 @@
 INCLUDE += $(shell $(CC) $(INCLUDE) -E $(SRCROOT)/autoconf/geninclude.c \
 	   | sed -n -e 's!^APATH!-I$(HEADER_DIR)/asm!p')
 
+CC_OPTS += $(call vm_check_build, $(SRCROOT)/autoconf/fault.c,   -DVMW_FAULT, )
 CC_OPTS += $(call vm_check_build, $(SRCROOT)/autoconf/nopage1.c, -DVMW_NOPAGE_261, )
 CC_OPTS += $(call vm_check_build, $(SRCROOT)/autoconf/skas1.c,   -DVMW_SKAS_MMAP, )
 CC_OPTS += $(call vm_check_build, $(SRCROOT)/autoconf/epoll.c,   -DVMW_HAVE_EPOLL, )
diff -ur vmware-server-kernel.orig/vmnet-only/bridge.c vmware-server-kernel/vmnet-only/bridge.c
--- vmware-server-kernel.orig/vmnet-only/bridge.c	2008-09-21 16:46:29.000000000 +0200
+++ vmware-server-kernel/vmnet-only/bridge.c	2008-09-21 17:31:47.000000000 +0200
@@ -274,7 +274,7 @@
                         struct net_device *net)  // IN: Network device
 {
 #ifdef VMW_NETDEV_HAS_NET
-   if (net->nd_net != bridge->internalDev->nd_net) {
+   if (dev_net(net) != dev_net(bridge->internalDev)) {
       return 0;
    }
 #endif
diff -ur vmware-server-kernel.orig/vmnet-only/procfs.c vmware-server-kernel/vmnet-only/procfs.c
--- vmware-server-kernel.orig/vmnet-only/procfs.c	2008-09-21 16:46:29.000000000 +0200
+++ vmware-server-kernel/vmnet-only/procfs.c	2008-09-21 17:35:53.000000000 +0200
@@ -63,7 +63,7 @@
 {
    int retval;
 
-   retval = VNetProc_MakeEntry(&proc_root, "vmnet", S_IFDIR, &base);
+   retval = VNetProc_MakeEntry(NULL, "vmnet", S_IFDIR, &base);
    if (retval) {
       return retval;
    }
@@ -95,7 +95,7 @@
 void
 VNetProc_Cleanup(void)
 {
-   VNetProc_RemoveEntry(base, &proc_root);
+   VNetProc_RemoveEntry(base, NULL);
    base = NULL;
 }
 
diff -ur vmware-server-kernel.orig/vmnet-only/vmnetInt.h vmware-server-kernel/vmnet-only/vmnetInt.h
--- vmware-server-kernel.orig/vmnet-only/vmnetInt.h	2008-09-21 16:46:29.000000000 +0200
+++ vmware-server-kernel/vmnet-only/vmnetInt.h	2008-09-21 17:30:33.000000000 +0200
@@ -63,7 +63,7 @@
 #   define dev_lock_list()    read_lock(&dev_base_lock)
 #   define dev_unlock_list()  read_unlock(&dev_base_lock)
 #   ifdef VMW_NETDEV_HAS_NET
-#      define DEV_GET(x)      __dev_get_by_name((x)->internalDev->nd_net, (x)->name)
+#      define DEV_GET(x)      __dev_get_by_name(dev_net((x)->internalDev), (x)->name)
 #   else
 #      define DEV_GET(x)      __dev_get_by_name((x)->name)
 #   endif
@@ -89,7 +89,7 @@
 
 #ifdef VMW_NETDEV_HAS_NET
 extern struct proto vmnet_proto;
-#   define compat_sk_alloc(_bri, _pri) sk_alloc((_bri)->internalDev->nd_net, \
+#   define compat_sk_alloc(_bri, _pri) sk_alloc(dev_net((_bri)->internalDev), \
                                                 PF_NETLINK, _pri, &vmnet_proto)
 #elif defined(VMW_HAVE_SK_ALLOC_WITH_PROTO)
 extern struct proto vmnet_proto;
