Index: abi/include/abi/ipc/methods.h
===================================================================
--- abi/include/abi/ipc/methods.h	(revision c32b6f035e31fd032734df1b3cb93836d49b9c3b)
+++ abi/include/abi/ipc/methods.h	(revision 072607b7612718a490dd8854b8c3cbf320c67751)
@@ -51,144 +51,153 @@
  */
 
-/** This message is sent to answerbox when the phone is hung up
- *
- * The numerical value zero (0) of this method is important,
- * so as the value can be easily tested in conditions.
- *
- */
-#define IPC_M_PHONE_HUNGUP  0
-
-/** Clone connection.
- *
- * The calling task clones one of its phones for the callee.
- *
- * - ARG1 - The caller sets ARG1 to the phone of the cloned connection.
- *        - The callee gets the new phone from ARG1.
- *
- * - on answer, the callee acknowledges the new connection by sending EOK back
- *   or the kernel closes it
- *
- */
-#define IPC_M_CONNECTION_CLONE  1
-
-/** Protocol for establishing a cloned connection.
- *
- * Through this call, the recipient learns about the new cloned connection.
- *
- * - ARG5 - the kernel sets ARG5 to contain the hash of the used phone
- * - on answer, the callee acknowledges the new connection by sending EOK back
- *   or the kernel closes it
- *
- */
-#define IPC_M_CLONE_ESTABLISH  2
-
-/** Protocol for initializing callback connections.
- *
- * Calling process asks the callee to create a callback connection,
- * so that it can start initiating new messages.
- *
- * The protocol for negotiating is:
- * - sys_connect_to_me - sends a message IPC_M_CONNECT_TO_ME
- * - recipient         - upon receipt tries to allocate new phone
- *                       - if it fails, responds with ELIMIT
- *                     - passes call to userspace. If userspace
- *                       responds with error, phone is deallocated and
- *                       error is sent back to caller. Otherwise 
- *                       the call is accepted and the response is sent back.
- *                     - the hash of the allocated phone is passed to userspace
- *                       (on the receiving side) as ARG5 of the call.
- *
- */
-#define IPC_M_CONNECT_TO_ME  3
-
-/** Protocol for initializing new foward connections.
- *
- * Calling process asks the callee to create for him a new connection.
- * E.g. the caller wants a name server to connect him to print server.
- *
- * The protocol for negotiating is:
- * - sys_connect_me_to - send a synchronous message to name server
- *                       indicating that it wants to be connected to some
- *                       service
- *                     - arg1/2/3 are user specified, arg5 contains
- *                       address of the phone that should be connected
- *                       (TODO: it leaks to userspace)
- *  - recipient        -  if ipc_answer == 0, then accept connection
- *                     -  otherwise connection refused
- *                     -  recepient may forward message.
- *
- */
-#define IPC_M_CONNECT_ME_TO  4
-
-/** Send as_area over IPC.
- * - ARG1 - source as_area base address
- * - ARG2 - size of source as_area (filled automatically by kernel)
- * - ARG3 - flags of the as_area being sent
- *
- * on answer, the recipient must set:
- *
- * - ARG1 - dst as_area lower bound
- * - ARG2 - dst as_area base adress pointer
- *          (filled automatically by the kernel)
- *
- */
-#define IPC_M_SHARE_OUT  5
-
-/** Receive as_area over IPC.
- * - ARG1 - destination as_area size
- * - ARG2 - user defined argument
- *
- * on answer, the recipient must set:
- *
- * - ARG1 - source as_area base address
- * - ARG2 - flags that will be used for sharing
- * - ARG3 - dst as_area lower bound
- * - ARG4 - dst as_area base address (filled automatically by kernel)
- *
- */
-#define IPC_M_SHARE_IN  6
-
-/** Send data to another address space over IPC.
- * - ARG1 - source address space virtual address
- * - ARG2 - size of data to be copied, may be overriden by the recipient
- *
- * on answer, the recipient must set:
- *
- * - ARG1 - final destination address space virtual address
- * - ARG2 - final size of data to be copied
- *
- */
-#define IPC_M_DATA_WRITE  7
-
-/** Receive data from another address space over IPC.
- * - ARG1 - destination virtual address in the source address space
- * - ARG2 - size of data to be received, may be cropped by the recipient 
- *
- * on answer, the recipient must set:
- *
- * - ARG1 - source virtual address in the destination address space
- * - ARG2 - final size of data to be copied
- *
- */
-#define IPC_M_DATA_READ  8
-
-/** Authorize change of recipient's state in a third party task.
- * - ARG1 - user protocol defined data
- * - ARG2 - user protocol defined data
- * - ARG3 - user protocol defined data
- * - ARG5 - sender's phone to the third party task
- *
- * on EOK answer, the recipient must set:
- *
- * - ARG1 - recipient's phone to the third party task
- */
-#define IPC_M_STATE_CHANGE_AUTHORIZE  9
-
-/** Debug the recipient.
- * - ARG1 - specifies the debug method (from udebug_method_t)
- * - other arguments are specific to the debug method
- *
- */
-#define IPC_M_DEBUG  10
+enum {
+	/** This message is sent to answerbox when the phone is hung up
+	 *
+	 * The numerical value zero (0) of this method is important,
+	 * so as the value can be easily tested in conditions.
+	 */
+	IPC_M_PHONE_HUNGUP = 0,
+
+	/** Clone connection.
+	 *
+	 * The calling task clones one of its phones for the callee.
+	 *
+	 * - ARG1 - The caller sets ARG1 to the phone of the cloned connection.
+	 *        - The callee gets the new phone from ARG1.
+	 *
+	 * - on answer, the callee acknowledges the new connection by sending EOK back
+	 *   or the kernel closes it
+	 */
+	IPC_M_CONNECTION_CLONE,
+
+	/** Protocol for establishing a cloned connection.
+	 *
+	 * Through this call, the recipient learns about the new cloned connection.
+	 *
+	 * - ARG5 - the kernel sets ARG5 to contain the hash of the used phone
+	 * - on answer, the callee acknowledges the new connection by sending EOK back
+	 *   or the kernel closes it
+	 */
+	IPC_M_CLONE_ESTABLISH,
+
+	/** Protocol for initializing callback connections.
+	 *
+	 * Calling process asks the callee to create a callback connection,
+	 * so that it can start initiating new messages.
+	 *
+	 * The protocol for negotiating is:
+	 * - sys_connect_to_me - sends a message IPC_M_CONNECT_TO_ME
+	 * - recipient         - upon receipt tries to allocate new phone
+	 *                       - if it fails, responds with ELIMIT
+	 *                     - passes call to userspace. If userspace
+	 *                       responds with error, phone is deallocated and
+	 *                       error is sent back to caller. Otherwise 
+	 *                       the call is accepted and the response is sent back.
+	 *                     - the hash of the allocated phone is passed to userspace
+	 *                       (on the receiving side) as ARG5 of the call.
+	 */
+	IPC_M_CONNECT_TO_ME,
+
+	/** Protocol for initializing new foward connections.
+	 *
+	 * Calling process asks the callee to create for him a new connection.
+	 * E.g. the caller wants a name server to connect him to print server.
+	 *
+	 * The protocol for negotiating is:
+	 * - sys_connect_me_to - send a synchronous message to name server
+	 *                       indicating that it wants to be connected to some
+	 *                       service
+	 *                     - arg1/2/3 are user specified, arg5 contains
+	 *                       address of the phone that should be connected
+	 *                       (TODO: it leaks to userspace)
+	 *  - recipient        - if ipc_answer == 0, then accept connection
+	 *                     - otherwise connection refused
+	 *                     - recepient may forward message.
+	 */
+	IPC_M_CONNECT_ME_TO,
+
+	/** Share a single page over IPC.
+	 *
+	 * - ARG1 - page-aligned offset from the beginning of the memory object
+	 * - ARG2 - page size
+	 *
+	 * on answer, the recipient must set:
+	 *
+	 * - ARG1 - source user page address
+	 */ 
+	IPC_M_PAGE_IN,
+
+	/** Receive as_area over IPC.
+	 * 
+	 * - ARG1 - destination as_area size
+	 * - ARG2 - user defined argument
+	 *
+	 * on answer, the recipient must set:
+	 *
+	 * - ARG1 - source as_area base address
+	 * - ARG2 - flags that will be used for sharing
+	 * - ARG3 - dst as_area lower bound
+	 * - ARG4 - dst as_area base address (filled automatically by kernel)
+	 */
+	IPC_M_SHARE_IN,
+
+	/** Send as_area over IPC.
+	 *
+	 * - ARG1 - source as_area base address
+	 * - ARG2 - size of source as_area (filled automatically by kernel)
+	 * - ARG3 - flags of the as_area being sent
+	 *
+	 * on answer, the recipient must set:
+	 *
+	 * - ARG1 - dst as_area lower bound
+	 * - ARG2 - dst as_area base adress pointer
+	 *          (filled automatically by the kernel)
+	 */
+	IPC_M_SHARE_OUT,
+
+	/** Receive data from another address space over IPC.
+	 *
+	 * - ARG1 - destination virtual address in the source address space
+	 * - ARG2 - size of data to be received, may be cropped by the recipient 
+	 *
+	 * on answer, the recipient must set:
+	 *
+	 * - ARG1 - source virtual address in the destination address space
+	 * - ARG2 - final size of data to be copied
+	 */
+	IPC_M_DATA_READ,
+
+	/** Send data to another address space over IPC.
+	 *
+	 * - ARG1 - source address space virtual address
+	 * - ARG2 - size of data to be copied, may be overriden by the recipient
+	 *
+	 * on answer, the recipient must set:
+	 *
+	 * - ARG1 - final destination address space virtual address
+	 * - ARG2 - final size of data to be copied
+	 */
+	IPC_M_DATA_WRITE,
+
+	/** Authorize change of recipient's state in a third party task.
+ 	 *
+	 * - ARG1 - user protocol defined data
+	 * - ARG2 - user protocol defined data
+	 * - ARG3 - user protocol defined data
+	 * - ARG5 - sender's phone to the third party task
+	 *
+	 * on EOK answer, the recipient must set:
+	 *
+	 * - ARG1 - recipient's phone to the third party task
+	 */
+	IPC_M_STATE_CHANGE_AUTHORIZE,
+
+	/** Debug the recipient.
+	 *
+	 * - ARG1 - specifies the debug method (from udebug_method_t)
+	 * - other arguments are specific to the debug method
+	 */
+	IPC_M_DEBUG,
+};
 
 /** Last system IPC method */
Index: kernel/Makefile
===================================================================
--- kernel/Makefile	(revision c32b6f035e31fd032734df1b3cb93836d49b9c3b)
+++ kernel/Makefile	(revision 072607b7612718a490dd8854b8c3cbf320c67751)
@@ -279,4 +279,5 @@
 	generic/src/ipc/ops/datawrite.c \
 	generic/src/ipc/ops/debug.c \
+	generic/src/ipc/ops/pagein.c \
 	generic/src/ipc/ops/sharein.c \
 	generic/src/ipc/ops/shareout.c \
Index: kernel/generic/src/ipc/ops/pagein.c
===================================================================
--- kernel/generic/src/ipc/ops/pagein.c	(revision 072607b7612718a490dd8854b8c3cbf320c67751)
+++ kernel/generic/src/ipc/ops/pagein.c	(revision 072607b7612718a490dd8854b8c3cbf320c67751)
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2016 Jakub Jermar 
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup genericipc
+ * @{
+ */
+/** @file
+ */
+
+#include <ipc/sysipc_ops.h>
+#include <ipc/ipc.h>
+#include <mm/as.h>
+#include <mm/page.h>
+#include <genarch/mm/page_pt.h>
+#include <genarch/mm/page_ht.h>
+#include <mm/frame.h>
+#include <proc/task.h>
+#include <abi/errno.h>
+#include <arch.h>
+
+static int answer_preprocess(call_t *answer, ipc_data_t *olddata)
+{
+	if (!IPC_GET_RETVAL(answer->data)) {
+		pte_t *pte;
+		uintptr_t frame;
+
+		page_table_lock(AS, true);
+		pte = page_mapping_find(AS, IPC_GET_ARG1(answer->data), false);
+		if (pte) {
+			frame = PTE_GET_FRAME(pte);
+			frame_reference_add(ADDR2PFN(frame));
+			IPC_SET_ARG1(answer->data, frame);
+		} else {
+			IPC_SET_RETVAL(answer->data, ENOENT);
+		}
+		page_table_unlock(AS, true);
+	}
+	
+	return EOK;
+}
+
+sysipc_ops_t ipc_m_page_in_ops = {
+	.request_preprocess = null_request_preprocess,
+	.request_forget = null_request_forget,
+	.request_process = null_request_process,
+	.answer_cleanup = null_answer_cleanup,
+	.answer_preprocess = answer_preprocess,
+	.answer_process = null_answer_process,
+};
+
+/** @}
+ */
Index: kernel/generic/src/ipc/sysipc.c
===================================================================
--- kernel/generic/src/ipc/sysipc.c	(revision c32b6f035e31fd032734df1b3cb93836d49b9c3b)
+++ kernel/generic/src/ipc/sysipc.c	(revision 072607b7612718a490dd8854b8c3cbf320c67751)
@@ -106,4 +106,5 @@
 {
 	switch (imethod) {
+	case IPC_M_PAGE_IN:
 	case IPC_M_SHARE_OUT:
 	case IPC_M_SHARE_IN:
@@ -137,4 +138,5 @@
 	case IPC_M_CONNECT_TO_ME:
 	case IPC_M_CONNECT_ME_TO:
+	case IPC_M_PAGE_IN:
 	case IPC_M_SHARE_OUT:
 	case IPC_M_SHARE_IN:
Index: kernel/generic/src/ipc/sysipc_ops.c
===================================================================
--- kernel/generic/src/ipc/sysipc_ops.c	(revision c32b6f035e31fd032734df1b3cb93836d49b9c3b)
+++ kernel/generic/src/ipc/sysipc_ops.c	(revision 072607b7612718a490dd8854b8c3cbf320c67751)
@@ -42,4 +42,5 @@
 sysipc_ops_t ipc_m_connect_to_me_ops;
 sysipc_ops_t ipc_m_connect_me_to_ops;
+sysipc_ops_t ipc_m_page_in_ops;
 sysipc_ops_t ipc_m_share_out_ops;
 sysipc_ops_t ipc_m_share_in_ops;
@@ -54,4 +55,5 @@
 	[IPC_M_CONNECT_TO_ME] = &ipc_m_connect_to_me_ops,
 	[IPC_M_CONNECT_ME_TO] = &ipc_m_connect_me_to_ops,
+	[IPC_M_PAGE_IN] = &ipc_m_page_in_ops,
 	[IPC_M_SHARE_OUT] = &ipc_m_share_out_ops,
 	[IPC_M_SHARE_IN] = &ipc_m_share_in_ops,
