Index: abi/include/abi/ipc/methods.h
===================================================================
--- abi/include/abi/ipc/methods.h	(revision c1f7a3156becd4f74fa2d6074b6f098f70960f28)
+++ abi/include/abi/ipc/methods.h	(revision ae6021df81b7a2a9a1f9798557d070693a922d88)
@@ -121,4 +121,7 @@
 	 * - ARG1 - page-aligned offset from the beginning of the memory object
 	 * - ARG2 - page size
+	 * - ARG3 - user defined memory object ID
+	 * - ARG4 - user defined memory object ID
+	 * - ARG5 - user defined memory object ID
 	 *
 	 * on answer, the recipient must set:
Index: abi/include/abi/mm/as.h
===================================================================
--- abi/include/abi/mm/as.h	(revision c1f7a3156becd4f74fa2d6074b6f098f70960f28)
+++ abi/include/abi/mm/as.h	(revision ae6021df81b7a2a9a1f9798557d070693a922d88)
@@ -47,5 +47,5 @@
 #define AS_MAP_FAILED  ((void *) -1)
 
-#define AS_AREA_UNPAGED -1
+#define AS_AREA_UNPAGED NULL 
 
 /** Address space area info exported to uspace. */
@@ -61,4 +61,11 @@
 } as_area_info_t;
 
+typedef struct {
+	int pager;
+	sysarg_t id1;
+	sysarg_t id2;
+	sysarg_t id3;
+} as_area_pager_info_t;
+
 #endif
 
Index: kernel/generic/include/mm/as.h
===================================================================
--- kernel/generic/include/mm/as.h	(revision c1f7a3156becd4f74fa2d6074b6f098f70960f28)
+++ kernel/generic/include/mm/as.h	(revision ae6021df81b7a2a9a1f9798557d070693a922d88)
@@ -188,5 +188,5 @@
 	/** user_backend members */
 	struct {
-		int pager;	/**< Phone to the pager. */
+		as_area_pager_info_t pager_info;
 	};
 
@@ -310,5 +310,5 @@
 /* Address space area related syscalls. */
 extern sysarg_t sys_as_area_create(uintptr_t, size_t, unsigned int, uintptr_t,
-    int);
+    as_area_pager_info_t *);
 extern sysarg_t sys_as_area_resize(uintptr_t, size_t, unsigned int);
 extern sysarg_t sys_as_area_change_flags(uintptr_t, unsigned int);
Index: kernel/generic/src/mm/as.c
===================================================================
--- kernel/generic/src/mm/as.c	(revision c1f7a3156becd4f74fa2d6074b6f098f70960f28)
+++ kernel/generic/src/mm/as.c	(revision ae6021df81b7a2a9a1f9798557d070693a922d88)
@@ -2187,5 +2187,5 @@
 
 sysarg_t sys_as_area_create(uintptr_t base, size_t size, unsigned int flags,
-    uintptr_t bound, int pager)
+    uintptr_t bound, as_area_pager_info_t *pager_info)
 {
 	uintptr_t virt = base;
@@ -2193,9 +2193,12 @@
 	mem_backend_data_t backend_data;
 
-	if (pager == AS_AREA_UNPAGED)
+	if (pager_info == AS_AREA_UNPAGED)
 		backend = &anon_backend;
 	else {
 		backend = &user_backend;
-		backend_data.pager = pager;
+		if (copy_from_uspace(&backend_data.pager_info, pager_info,
+			sizeof(as_area_pager_info_t)) != EOK) {
+			return (sysarg_t) AS_MAP_FAILED;
+		}
 	}
 	as_area_t *area = as_area_create(AS, flags, size,
Index: kernel/generic/src/mm/backend_user.c
===================================================================
--- kernel/generic/src/mm/backend_user.c	(revision c1f7a3156becd4f74fa2d6074b6f098f70960f28)
+++ kernel/generic/src/mm/backend_user.c	(revision ae6021df81b7a2a9a1f9798557d070693a922d88)
@@ -39,4 +39,5 @@
 #include <mm/as.h>
 #include <mm/page.h>
+#include <abi/mm/as.h>
 #include <abi/ipc/methods.h>
 #include <ipc/sysipc.h>
@@ -132,10 +133,15 @@
 		return AS_PF_FAULT;
 
+	as_area_pager_info_t *pager_info = &area->backend_data.pager_info;
+
 	ipc_data_t data = {};
 	IPC_SET_IMETHOD(data, IPC_M_PAGE_IN);
 	IPC_SET_ARG1(data, upage - area->base);
 	IPC_SET_ARG2(data, PAGE_SIZE);
+	IPC_SET_ARG3(data, pager_info->id1);
+	IPC_SET_ARG4(data, pager_info->id2);
+	IPC_SET_ARG5(data, pager_info->id3);
 
-	int rc = ipc_req_internal(area->backend_data.pager, &data);
+	int rc = ipc_req_internal(pager_info->pager, &data);
 
 	if (rc != EOK) {
@@ -143,5 +149,5 @@
 		    "Page-in request for page %#" PRIxn
 		    " at pager %d failed with error %d.",
-		    upage, area->backend_data.pager, rc);
+		    upage, pager_info->pager, rc);
 		return AS_PF_FAULT;
 	}
Index: uspace/app/tester/mm/pager1.c
===================================================================
--- uspace/app/tester/mm/pager1.c	(revision c1f7a3156becd4f74fa2d6074b6f098f70960f28)
+++ uspace/app/tester/mm/pager1.c	(revision ae6021df81b7a2a9a1f9798557d070693a922d88)
@@ -51,5 +51,5 @@
 	
 	void *result = async_as_area_create(AS_AREA_ANY, size,
-	    AS_AREA_READ | AS_AREA_CACHEABLE, vfs_pager_sess);
+	    AS_AREA_READ | AS_AREA_CACHEABLE, vfs_pager_sess, 0, 0, 0);
 	if (result == AS_MAP_FAILED)
 		return NULL;
Index: uspace/lib/c/generic/as.c
===================================================================
--- uspace/lib/c/generic/as.c	(revision c1f7a3156becd4f74fa2d6074b6f098f70960f28)
+++ uspace/lib/c/generic/as.c	(revision ae6021df81b7a2a9a1f9798557d070693a922d88)
@@ -45,11 +45,11 @@
 /** Create address space area.
  *
- * @param base  Starting virtual address of the area.
- *              If set to AS_AREA_ANY ((void *) -1),
- *              the kernel finds a mappable area.
- * @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.
+ * @param base       Starting virtual address of the area.
+ *                   If set to AS_AREA_ANY ((void *) -1), the kernel finds a
+ *                   mappable area.
+ * @param size       Size of the area.
+ * @param flags      Flags describing type of the area.
+ * @param pager_info Pager info structure or AS_AREA_UNPAGED (NULL) if the area
+ *                   is not paged (i.e. anonymous).
  *
  * @return Starting virtual address of the created area on success.
@@ -57,9 +57,10 @@
  *
  */
-void *as_area_create(void *base, size_t size, unsigned int flags, int pager)
+void *as_area_create(void *base, size_t size, unsigned int flags,
+    as_area_pager_info_t *pager_info)
 {
 	return (void *) __SYSCALL5(SYS_AS_AREA_CREATE, (sysarg_t) base,
 	    (sysarg_t) size, (sysarg_t) flags, (sysarg_t) __entry,
-	    (sysarg_t) pager);
+	    (sysarg_t) pager_info);
 }
 
Index: uspace/lib/c/generic/async.c
===================================================================
--- uspace/lib/c/generic/async.c	(revision c1f7a3156becd4f74fa2d6074b6f098f70960f28)
+++ uspace/lib/c/generic/async.c	(revision ae6021df81b7a2a9a1f9798557d070693a922d88)
@@ -117,4 +117,5 @@
 #include <macros.h>
 #include <as.h>
+#include <abi/mm/as.h>
 #include "private/libc.h"
 
@@ -3383,7 +3384,13 @@
 
 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);
+    async_sess_t *pager, sysarg_t id1, sysarg_t id2, sysarg_t id3)
+{
+	as_area_pager_info_t pager_info = {
+		.pager = pager->phone,
+		.id1 = id1,
+		.id2 = id2,
+		.id3 = id3
+	};
+	return as_area_create(base, size, flags, &pager_info);
 }
 
Index: uspace/lib/c/include/as.h
===================================================================
--- uspace/lib/c/include/as.h	(revision c1f7a3156becd4f74fa2d6074b6f098f70960f28)
+++ uspace/lib/c/include/as.h	(revision ae6021df81b7a2a9a1f9798557d070693a922d88)
@@ -53,5 +53,6 @@
 }
 
-extern void *as_area_create(void *, size_t, unsigned int, int);
+extern void *as_area_create(void *, size_t, unsigned int,
+    as_area_pager_info_t *);
 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 c1f7a3156becd4f74fa2d6074b6f098f70960f28)
+++ uspace/lib/c/include/async.h	(revision ae6021df81b7a2a9a1f9798557d070693a922d88)
@@ -488,5 +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 *);
+extern void *async_as_area_create(void *, size_t, unsigned int, async_sess_t *,
+    sysarg_t, sysarg_t, sysarg_t);
 
 #endif
