Index: arch/amd64/include/mm/as.h
===================================================================
--- arch/amd64/include/mm/as.h	(revision 226a6541a5d20f6b543c006e6e2759ad76affadb)
+++ arch/amd64/include/mm/as.h	(revision 5a7d9d102f9d67cd763b1c39365a459c0ad22de8)
@@ -30,5 +30,5 @@
 #define __amd64_AS_H__
 
-#include <arch/types.h>
+#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH	0
 
 #define KERNEL_ADDRESS_SPACE_START_ARCH		(__address) 0xffff800000000000
Index: arch/ia32/include/mm/as.h
===================================================================
--- arch/ia32/include/mm/as.h	(revision 226a6541a5d20f6b543c006e6e2759ad76affadb)
+++ arch/ia32/include/mm/as.h	(revision 5a7d9d102f9d67cd763b1c39365a459c0ad22de8)
@@ -30,5 +30,5 @@
 #define __ia32_AS_H__
 
-#include <arch/types.h>
+#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH	0
 
 #define KERNEL_ADDRESS_SPACE_START_ARCH		((__address) 0x80000000)
Index: arch/ia64/include/mm/as.h
===================================================================
--- arch/ia64/include/mm/as.h	(revision 226a6541a5d20f6b543c006e6e2759ad76affadb)
+++ arch/ia64/include/mm/as.h	(revision 5a7d9d102f9d67cd763b1c39365a459c0ad22de8)
@@ -30,5 +30,5 @@
 #define __ia64_AS_H__
 
-#include <arch/types.h>
+#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH	0
 
 #define KERNEL_ADDRESS_SPACE_START_ARCH		(__address) 0xe000000000000000ULL
Index: arch/mips32/include/mm/as.h
===================================================================
--- arch/mips32/include/mm/as.h	(revision 226a6541a5d20f6b543c006e6e2759ad76affadb)
+++ arch/mips32/include/mm/as.h	(revision 5a7d9d102f9d67cd763b1c39365a459c0ad22de8)
@@ -30,6 +30,5 @@
 #define __mips32_AS_H__
 
-#include <arch/types.h>
-#include <typedefs.h>
+#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH	0
 
 #define KERNEL_ADDRESS_SPACE_START_ARCH		(__address) 0x80000000
Index: arch/ppc32/include/mm/as.h
===================================================================
--- arch/ppc32/include/mm/as.h	(revision 226a6541a5d20f6b543c006e6e2759ad76affadb)
+++ arch/ppc32/include/mm/as.h	(revision 5a7d9d102f9d67cd763b1c39365a459c0ad22de8)
@@ -30,5 +30,5 @@
 #define __ppc32_AS_H__
 
-#include <arch/types.h>
+#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH	0
 
 #define KERNEL_ADDRESS_SPACE_START_ARCH		((__address) 0x80000000)
Index: arch/sparc64/include/mm/as.h
===================================================================
--- arch/sparc64/include/mm/as.h	(revision 226a6541a5d20f6b543c006e6e2759ad76affadb)
+++ arch/sparc64/include/mm/as.h	(revision 5a7d9d102f9d67cd763b1c39365a459c0ad22de8)
@@ -30,5 +30,5 @@
 #define __sparc64_AS_H__
 
-#include <arch/types.h>
+#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH	1
 
 #define KERNEL_ADDRESS_SPACE_START_ARCH		(__address) 0x0000000000000000
Index: generic/include/macros.h
===================================================================
--- generic/include/macros.h	(revision 226a6541a5d20f6b543c006e6e2759ad76affadb)
+++ generic/include/macros.h	(revision 5a7d9d102f9d67cd763b1c39365a459c0ad22de8)
@@ -40,6 +40,6 @@
 #define max(a,b)	((a)>(b)?(a):(b))
 
-/* Return true if the interlvals overlap */
-static inline int overlaps(__address s1,size_t sz1, __address s2, size_t sz2)
+/** Return true if the interlvals overlap. */
+static inline int overlaps(__address s1, size_t sz1, __address s2, size_t sz2)
 {
 	__address e1 = s1+sz1;
Index: generic/include/mm/as.h
===================================================================
--- generic/include/mm/as.h	(revision 226a6541a5d20f6b543c006e6e2759ad76affadb)
+++ generic/include/mm/as.h	(revision 5a7d9d102f9d67cd763b1c39365a459c0ad22de8)
@@ -37,4 +37,7 @@
 #include <synch/spinlock.h>
 #include <adt/list.h>
+
+/** Defined to be true if user address space and kernel address space shadow each other. */
+#define KERNEL_ADDRESS_SPACE_SHADOWED	KERNEL_ADDRESS_SPACE_SHADOWED_ARCH
 
 #define KERNEL_ADDRESS_SPACE_START	KERNEL_ADDRESS_SPACE_START_ARCH
Index: generic/src/lib/elf.c
===================================================================
--- generic/src/lib/elf.c	(revision 226a6541a5d20f6b543c006e6e2759ad76affadb)
+++ generic/src/lib/elf.c	(revision 5a7d9d102f9d67cd763b1c39365a459c0ad22de8)
@@ -166,10 +166,4 @@
 	}
 
-	/*
-	 * Check if the segment doesn't interfere with kernel address space.
-	 */
-	if (entry->p_vaddr + ALIGN_UP(entry->p_memsz, PAGE_SIZE) >= USER_ADDRESS_SPACE_END)
-		return EE_MEMORY;
-	
 	if (entry->p_flags & PF_X)
 		flags |= AS_AREA_EXEC;
@@ -196,5 +190,5 @@
 	a = as_area_create(as, flags, entry->p_memsz, entry->p_vaddr);
 	if (!a)
-		return EE_IRRECOVERABLE;
+		return EE_MEMORY;
 	
 	for (i = 0; i < SIZE2FRAMES(entry->p_filesz); i++) {
Index: generic/src/mm/as.c
===================================================================
--- generic/src/mm/as.c	(revision 226a6541a5d20f6b543c006e6e2759ad76affadb)
+++ generic/src/mm/as.c	(revision 5a7d9d102f9d67cd763b1c39365a459c0ad22de8)
@@ -52,4 +52,5 @@
 #include <debug.h>
 #include <memstr.h>
+#include <macros.h>
 #include <arch.h>
 #include <print.h>
@@ -538,7 +539,13 @@
 	as_area_t *a;
 	
+	/*
+	 * We don't want any area to have conflicts with NULL page.
+	 */
+	if (overlaps(va, size, NULL, PAGE_SIZE))
+		return false;
+	
 	for (cur = as->as_area_head.next; cur != &as->as_area_head; cur = cur->next) {
-		__address start;
-		__address end;
+		__address a_start;
+		size_t a_size;
 	
 		a = list_get_instance(cur, as_area_t, link);
@@ -548,30 +555,21 @@
 		spinlock_lock(&a->lock);
 
-		start = a->base;
-		end = a->base + a->pages * PAGE_SIZE - 1;
+		a_start = a->base;
+		a_size = a->pages * PAGE_SIZE;
 
 		spinlock_unlock(&a->lock);
 
-		if ((va >= start) && (va <= end)) {
-			/*
-			 * Tested area is inside another area.
-			 */
-			return false;
-		}
-		
-		if ((start >= va) && (start < va + size)) {
-			/*
-			 * Another area starts in tested area.
-			 */
-			return false;
-		}
-		
-		if ((end >= va) && (end < va + size)) {
-			/*
-			 * Another area ends in tested area.
-			 */
-			return false;
-		}
-
+		if (overlaps(va, size, a_start, a_size))
+			return false;		
+
+	}
+
+	/*
+	 * So far, the area does not conflict with other areas.
+	 * Check if it doesn't conflict with kernel address space.
+	 */	 
+	if (!KERNEL_ADDRESS_SPACE_SHADOWED) {
+		return !overlaps(va, size, 
+			KERNEL_ADDRESS_SPACE_START, KERNEL_ADDRESS_SPACE_END-KERNEL_ADDRESS_SPACE_START);
 	}
 
