Index: uspace/lib/c/generic/as.c
===================================================================
--- uspace/lib/c/generic/as.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
+++ uspace/lib/c/generic/as.c	(revision 42d085927b86a7b4df96490eb9d3e6d0d6ca97eb)
@@ -50,4 +50,6 @@
  * @param size  Size of the area.
  * @param flags Flags describing type of the area.
+ * @param pager If non-negative, phone to the external pager backing the area.
+ *              If AS_AREA_UNPAGED (-1), the area is anonymous.
  *
  * @return Starting virtual address of the created area on success.
@@ -55,8 +57,9 @@
  *
  */
-void *as_area_create(void *base, size_t size, unsigned int flags)
+void *as_area_create(void *base, size_t size, unsigned int flags, int pager)
 {
-	return (void *) __SYSCALL4(SYS_AS_AREA_CREATE, (sysarg_t) base,
-	    (sysarg_t) size, (sysarg_t) flags, (sysarg_t) __entry);
+	return (void *) __SYSCALL5(SYS_AS_AREA_CREATE, (sysarg_t) base,
+	    (sysarg_t) size, (sysarg_t) flags, (sysarg_t) __entry,
+	    (sysarg_t) pager);
 }
 
Index: uspace/lib/c/generic/async.c
===================================================================
--- uspace/lib/c/generic/async.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
+++ uspace/lib/c/generic/async.c	(revision 42d085927b86a7b4df96490eb9d3e6d0d6ca97eb)
@@ -116,4 +116,5 @@
 #include <stdlib.h>
 #include <macros.h>
+#include <as.h>
 #include "private/libc.h"
 
@@ -3381,4 +3382,10 @@
 }
 
+void *async_as_area_create(void *base, size_t size, unsigned int flags,
+    async_sess_t *pager)
+{
+	return as_area_create(base, size, flags, pager->phone);
+}
+
 /** @}
  */
Index: uspace/lib/c/generic/elf/elf_mod.c
===================================================================
--- uspace/lib/c/generic/elf/elf_mod.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
+++ uspace/lib/c/generic/elf/elf_mod.c	(revision 42d085927b86a7b4df96490eb9d3e6d0d6ca97eb)
@@ -370,5 +370,6 @@
 	 */
 	a = as_area_create((uint8_t *) base + bias, mem_sz,
-	    AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE);
+	    AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE,
+	    AS_AREA_UNPAGED);
 	if (a == AS_MAP_FAILED) {
 		DPRINTF("memory mapping failed (%p, %zu)\n",
Index: uspace/lib/c/generic/fibril.c
===================================================================
--- uspace/lib/c/generic/fibril.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
+++ uspace/lib/c/generic/fibril.c	(revision 42d085927b86a7b4df96490eb9d3e6d0d6ca97eb)
@@ -279,7 +279,7 @@
 	size_t stack_size = (stksz == FIBRIL_DFLT_STK_SIZE) ?
 	    stack_size_get() : stksz;
-	fibril->stack = as_area_create((void *) -1, stack_size,
+	fibril->stack = as_area_create(AS_AREA_ANY, stack_size,
 	    AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE | AS_AREA_GUARD |
-	    AS_AREA_LATE_RESERVE);
+	    AS_AREA_LATE_RESERVE, AS_AREA_UNPAGED);
 	if (fibril->stack == (void *) -1) {
 		fibril_teardown(fibril, false);
Index: uspace/lib/c/generic/io/chargrid.c
===================================================================
--- uspace/lib/c/generic/io/chargrid.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
+++ uspace/lib/c/generic/io/chargrid.c	(revision 42d085927b86a7b4df96490eb9d3e6d0d6ca97eb)
@@ -60,5 +60,6 @@
 	if ((flags & CHARGRID_FLAG_SHARED) == CHARGRID_FLAG_SHARED) {
 		scrbuf = (chargrid_t *) as_area_create(AS_AREA_ANY, size,
-		    AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE);
+		    AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE,
+		    AS_AREA_UNPAGED);
 		if (scrbuf == AS_MAP_FAILED)
 			return NULL;
Index: uspace/lib/c/generic/malloc.c
===================================================================
--- uspace/lib/c/generic/malloc.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
+++ uspace/lib/c/generic/malloc.c	(revision 42d085927b86a7b4df96490eb9d3e6d0d6ca97eb)
@@ -354,5 +354,5 @@
 	size_t asize = ALIGN_UP(size, PAGE_SIZE);
 	void *astart = as_area_create(AS_AREA_ANY, asize,
-	    AS_AREA_WRITE | AS_AREA_READ | AS_AREA_CACHEABLE);
+	    AS_AREA_WRITE | AS_AREA_READ | AS_AREA_CACHEABLE, AS_AREA_UNPAGED);
 	if (astart == AS_MAP_FAILED)
 		return false;
Index: uspace/lib/c/generic/thread.c
===================================================================
--- uspace/lib/c/generic/thread.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
+++ uspace/lib/c/generic/thread.c	(revision 42d085927b86a7b4df96490eb9d3e6d0d6ca97eb)
@@ -116,5 +116,5 @@
 	void *stack = as_area_create(AS_AREA_ANY, stack_size,
 	    AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE | AS_AREA_GUARD |
-	    AS_AREA_LATE_RESERVE);
+	    AS_AREA_LATE_RESERVE, AS_AREA_UNPAGED);
 	if (stack == AS_MAP_FAILED) {
 		free(uarg);
Index: uspace/lib/c/include/as.h
===================================================================
--- uspace/lib/c/include/as.h	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
+++ uspace/lib/c/include/as.h	(revision 42d085927b86a7b4df96490eb9d3e6d0d6ca97eb)
@@ -38,9 +38,5 @@
 #include <sys/types.h>
 #include <abi/mm/as.h>
-#include <task.h>
 #include <libarch/config.h>
-
-#define AS_AREA_ANY    ((void *) -1)
-#define AS_MAP_FAILED  ((void *) -1)
 
 static inline size_t SIZE2PAGES(size_t size)
@@ -57,5 +53,5 @@
 }
 
-extern void *as_area_create(void *, size_t, unsigned int);
+extern void *as_area_create(void *, size_t, unsigned int, int);
 extern int as_area_resize(void *, size_t, unsigned int);
 extern int as_area_change_flags(void *, unsigned int);
Index: uspace/lib/c/include/async.h
===================================================================
--- uspace/lib/c/include/async.h	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
+++ uspace/lib/c/include/async.h	(revision 42d085927b86a7b4df96490eb9d3e6d0d6ca97eb)
@@ -488,4 +488,6 @@
 extern void async_remote_state_release_exchange(async_exch_t *);
 
+extern void *async_as_area_create(void *, size_t, unsigned int, async_sess_t *);
+
 #endif
 
Index: uspace/lib/draw/surface.c
===================================================================
--- uspace/lib/draw/surface.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
+++ uspace/lib/draw/surface.c	(revision 42d085927b86a7b4df96490eb9d3e6d0d6ca97eb)
@@ -64,6 +64,8 @@
 	if (!pixbuf) {
 		if ((flags & SURFACE_FLAG_SHARED) == SURFACE_FLAG_SHARED) {
-			pixbuf = (pixel_t *) as_area_create(AS_AREA_ANY, pixbuf_size,
-			    AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE);
+			pixbuf = (pixel_t *) as_area_create(AS_AREA_ANY,
+			    pixbuf_size,
+			    AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE,
+			    AS_AREA_UNPAGED);
 			if (pixbuf == AS_MAP_FAILED) {
 				free(surface);
Index: uspace/lib/posix/source/sys/mman.c
===================================================================
--- uspace/lib/posix/source/sys/mman.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
+++ uspace/lib/posix/source/sys/mman.c	(revision 42d085927b86a7b4df96490eb9d3e6d0d6ca97eb)
@@ -54,5 +54,5 @@
 		return MAP_FAILED;
 	
-	return as_area_create(start, length, prot);
+	return as_area_create(start, length, prot, AS_AREA_UNPAGED);
 }
 
