Index: uspace/srv/fs/tmpfs/tmpfs_ops.c
===================================================================
--- uspace/srv/fs/tmpfs/tmpfs_ops.c	(revision a4eb8a602f25a7cbe7abf54950ff0f3ceffdcc89)
+++ uspace/srv/fs/tmpfs/tmpfs_ops.c	(revision a92da0ab969fe27e89dc49e17eb3cceb2aabcbb7)
@@ -283,5 +283,4 @@
 	unsigned long index = IPC_GET_ARG2(*request);
 	off_t pos = IPC_GET_ARG3(*request);
-	size_t size = IPC_GET_ARG4(*request);
 
 	/*
@@ -298,10 +297,9 @@
 
 	/*
-	 * Receive the communication area.
+	 * Receive the read request.
 	 */
 	ipc_callid_t callid;
-	ipc_call_t call;
-	callid = async_get_call(&call);
-	if (IPC_GET_METHOD(call) != IPC_M_AS_AREA_SEND) {
+	size_t size;
+	if (!ipc_data_read_receive(&callid, size)) {
 		ipc_answer_0(callid, EINVAL);	
 		ipc_answer_0(rid, EINVAL);
@@ -309,25 +307,6 @@
 	}
 
-	int flags = IPC_GET_ARG3(call);
-	if (!(flags & AS_AREA_WRITE)) {
-		ipc_answer_0(callid, EINVAL);
-		ipc_answer_0(rid, EINVAL);
-		return;
-	}
-	size_t sz = IPC_GET_ARG2(call);
-	uint8_t *buf = as_get_mappable_page(sz);
-	if (!buf) {
-		ipc_answer_0(callid, ENOMEM);
-		ipc_answer_0(rid, ENOMEM);
-		return;
-	}
-	ipc_answer_1(callid, EOK, buf);		/* commit to share the area */
-
 	size_t bytes = max(0, min(dentry->size - pos, size));
-	memcpy(buf, dentry->data + pos, bytes);
-
-	(void) as_area_destroy(buf);
-
-	ipc_answer_1(rid, EOK, bytes);
+	(void) ipc_data_read_deliver(callid, dentry->data + pos, bytes);
 }
 
