Index: kernel/generic/src/mm/as.c
===================================================================
--- kernel/generic/src/mm/as.c	(revision d9d0088ab6bc13dc60f19b86e9279a8caaf0b3b1)
+++ kernel/generic/src/mm/as.c	(revision cd1ecf119d89a28653ac6c49c63579c4799199c0)
@@ -324,5 +324,4 @@
  *
  * @return True if the two areas conflict, false otherwise.
- *
  */
 NO_TRACE static bool area_is_conflicting(uintptr_t addr,
@@ -331,14 +330,22 @@
 	assert((addr % PAGE_SIZE) == 0);
 
-	/* Add guard page size unless area is at the end of VA domain */
 	size_t gsize = P2SZ(count);
-	if (guarded && !overflows(addr, P2SZ(count)))
-		gsize += PAGE_SIZE;
-
-	/* Add guard page size unless area is at the end of VA domain */
-	size_t agsize = P2SZ(area->pages);
-	if ((area->flags & AS_AREA_GUARD) != 0 &&
-	    !overflows(area->base, P2SZ(area->pages)))
-		agsize += PAGE_SIZE;
+    	size_t agsize = P2SZ(area->pages);
+
+	/*
+	 * A guarded area has one guard page before, one page after.
+	 * What we do here is: if either area is guarded, we add
+	 * PAGE_SIZE to the size of both areas. That guarantees
+	 * they will be spaced at least one page apart.
+	 */
+	if (guarded || (area->flags & AS_AREA_GUARD) != 0) {
+		/* Add guard page size unless area is at the end of VA domain */
+		if (!overflows(addr, P2SZ(count)))
+			gsize += PAGE_SIZE;
+
+		/* Add guard page size unless area is at the end of VA domain */
+		if (!overflows(area->base, P2SZ(area->pages)))
+			agsize += PAGE_SIZE;
+	}
 
 	return overlaps(addr, gsize, area->base, agsize);
