Index: kernel/generic/src/mm/as.c
===================================================================
--- kernel/generic/src/mm/as.c	(revision c3878381a2c8f39ab246e3b4280aebe23f59e9e1)
+++ kernel/generic/src/mm/as.c	(revision 01029fc7e46acbe4cd80f0a678a085d214882028)
@@ -696,9 +696,8 @@
 		return ENOENT;
 	}
-	
-	if (area->backend == &phys_backend) {
-		/*
-		 * Remapping of address space areas associated
-		 * with memory mapped devices is not supported.
+
+	if (!area->backend->is_resizable(area)) {
+		/*
+		 * The backend does not support resizing for this area.
 		 */
 		mutex_unlock(&area->lock);
@@ -1057,8 +1056,7 @@
 	}
 	
-	if ((!src_area->backend) || (!src_area->backend->share)) {
-		/*
-		 * There is no backend or the backend does not
-		 * know how to share the area.
+	if (!src_area->backend->is_shareable(src_area)) {
+		/*
+		 * The backend does not permit sharing of this area.
 		 */
 		mutex_unlock(&src_area->lock);
Index: kernel/generic/src/mm/backend_anon.c
===================================================================
--- kernel/generic/src/mm/backend_anon.c	(revision c3878381a2c8f39ab246e3b4280aebe23f59e9e1)
+++ kernel/generic/src/mm/backend_anon.c	(revision 01029fc7e46acbe4cd80f0a678a085d214882028)
@@ -59,4 +59,7 @@
 static void anon_destroy(as_area_t *);
 
+static bool anon_is_resizable(as_area_t *);
+static bool anon_is_shareable(as_area_t *);
+
 static int anon_page_fault(as_area_t *, uintptr_t, pf_access_t);
 static void anon_frame_free(as_area_t *, uintptr_t, uintptr_t);
@@ -67,4 +70,7 @@
 	.share = anon_share,
 	.destroy = anon_destroy,
+
+	.is_resizable = anon_is_resizable,
+	.is_shareable = anon_is_shareable,
 
 	.page_fault = anon_page_fault,
@@ -152,4 +158,13 @@
 }
 
+bool anon_is_resizable(as_area_t *area)
+{
+	return true;
+}
+
+bool anon_is_shareable(as_area_t *area)
+{
+	return !(area->flags & AS_AREA_LATE_RESERVE);
+}
 
 /** Service a page fault in the anonymous memory address space area.
Index: kernel/generic/src/mm/backend_elf.c
===================================================================
--- kernel/generic/src/mm/backend_elf.c	(revision c3878381a2c8f39ab246e3b4280aebe23f59e9e1)
+++ kernel/generic/src/mm/backend_elf.c	(revision 01029fc7e46acbe4cd80f0a678a085d214882028)
@@ -58,4 +58,7 @@
 static void elf_destroy(as_area_t *);
 
+static bool elf_is_resizable(as_area_t *);
+static bool elf_is_shareable(as_area_t *);
+
 static int elf_page_fault(as_area_t *, uintptr_t, pf_access_t);
 static void elf_frame_free(as_area_t *, uintptr_t, uintptr_t);
@@ -66,4 +69,7 @@
 	.share = elf_share,
 	.destroy = elf_destroy,
+
+	.is_resizable = elf_is_resizable,
+	.is_shareable = elf_is_shareable,
 
 	.page_fault = elf_page_fault,
@@ -213,4 +219,15 @@
 }
 
+bool elf_is_resizable(as_area_t *area)
+{
+	return true;
+}
+
+bool elf_is_shareable(as_area_t *area)
+{
+	return true;
+}
+
+
 /** Service a page fault in the ELF backend address space area.
  *
Index: kernel/generic/src/mm/backend_phys.c
===================================================================
--- kernel/generic/src/mm/backend_phys.c	(revision c3878381a2c8f39ab246e3b4280aebe23f59e9e1)
+++ kernel/generic/src/mm/backend_phys.c	(revision 01029fc7e46acbe4cd80f0a678a085d214882028)
@@ -52,4 +52,8 @@
 static void phys_destroy(as_area_t *);
 
+static bool phys_is_resizable(as_area_t *);
+static bool phys_is_shareable(as_area_t *);
+
+
 static int phys_page_fault(as_area_t *, uintptr_t, pf_access_t);
 
@@ -59,4 +63,7 @@
 	.share = phys_share,
 	.destroy = phys_destroy,
+
+	.is_resizable = phys_is_resizable,
+	.is_shareable = phys_is_shareable,
 
 	.page_fault = phys_page_fault,
@@ -87,4 +94,15 @@
 	/* Nothing to do. */
 }
+
+bool phys_is_resizable(as_area_t *area)
+{
+	return false;
+}
+
+bool phys_is_shareable(as_area_t *area)
+{
+	return true;
+}
+
 
 /** Service a page fault in the address space area backed by physical memory.
