Index: uspace/srv/fs/minixfs/mfs.c
===================================================================
--- uspace/srv/fs/minixfs/mfs.c	(revision e666ddcc652c7bfa81d45990c8a13fc5542c0719)
+++ uspace/srv/fs/minixfs/mfs.c	(revision 668f194964ffdbc14852fc1c726cc01d7f6dd391)
@@ -99,5 +99,4 @@
 			return;
 		case VFS_OUT_MOUNTED:
-			mfsdebug("Mount request received\n");
 			mfs_mounted(callid, &call);
 			break;
@@ -109,6 +108,8 @@
 			break;
 		case VFS_OUT_LOOKUP:
-			mfsdebug("lookup called\n");
 			mfs_lookup(callid, &call);
+			break;
+		case VFS_OUT_READ:
+			mfs_read(callid, &call);
 			break;
 		default:
Index: uspace/srv/fs/minixfs/mfs.h
===================================================================
--- uspace/srv/fs/minixfs/mfs.h	(revision e666ddcc652c7bfa81d45990c8a13fc5542c0719)
+++ uspace/srv/fs/minixfs/mfs.h	(revision 668f194964ffdbc14852fc1c726cc01d7f6dd391)
@@ -35,4 +35,5 @@
 
 #include <minix.h>
+#include <macros.h>
 #include <libblock.h>
 #include <libfs.h>
@@ -153,4 +154,8 @@
 extern void mfs_stat(ipc_callid_t rid, ipc_call_t *request);
 
+extern void
+mfs_read(ipc_callid_t rid, ipc_call_t *request);
+
+
 /*mfs_inode.c*/
 int
Index: uspace/srv/fs/minixfs/mfs_ops.c
===================================================================
--- uspace/srv/fs/minixfs/mfs_ops.c	(revision e666ddcc652c7bfa81d45990c8a13fc5542c0719)
+++ uspace/srv/fs/minixfs/mfs_ops.c	(revision 668f194964ffdbc14852fc1c726cc01d7f6dd391)
@@ -59,6 +59,5 @@
 static int mfs_link(fs_node_t *pfn, fs_node_t *cfn, const char *name);
 
-static
-int mfs_node_get(fs_node_t **rfn, devmap_handle_t devmap_handle,
+static int mfs_node_get(fs_node_t **rfn, devmap_handle_t devmap_handle,
 			fs_index_t index);
 
@@ -381,7 +380,4 @@
 	assert(mnode->ino_i);
 
-	mfsdebug("inode links = %d\n", (int) mnode->ino_i->i_nlinks);
-	mfsdebug("inode size is %d\n", (int) mnode->ino_i->i_size);
-
 	return mnode->ino_i->i_size;
 }
@@ -399,6 +395,4 @@
 	struct mfs_instance *instance;
 
-	mfsdebug("mfs_node_get()\n");
-
 	rc = mfs_instance_get(devmap_handle, &instance);
 
@@ -412,6 +406,4 @@
 {
 	struct mfs_node *mnode = fsnode->data;
-
-	mfsdebug("mfs_node_put()\n");
 
 	put_inode(mnode);
@@ -435,6 +427,4 @@
 	struct mfs_node *mnode = fsnode->data;
 
-	mfsdebug("mfs_index_get()\n");
-
 	assert(mnode->ino_i);
 	return mnode->ino_i->index;
@@ -450,5 +440,4 @@
 
 	rc = mnode->ino_i->i_nlinks;
-	mfsdebug("mfs_lnkcnt_get(): %u\n", rc);
 	return rc;
 }
@@ -515,6 +504,4 @@
 {
 	int rc = mfs_node_get(rfn, handle, MFS_ROOT_INO);
-
-	mfsdebug("mfs_root_get %s\n", rc == EOK ? "OK" : "FAIL");
 	return rc;
 }
@@ -577,7 +564,74 @@
 }
 
-/*
- * Find a filesystem instance given the devmap handle
- */
+void
+mfs_read(ipc_callid_t rid, ipc_call_t *request)
+{
+	int rc;
+	devmap_handle_t handle = (devmap_handle_t) IPC_GET_ARG1(*request);
+	fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request);
+	aoff64_t pos = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request),
+				IPC_GET_ARG4(*request));
+	fs_node_t *fn;
+
+	rc = mfs_node_get(&fn, handle, index);
+	if (rc != EOK) {
+		async_answer_0(rid, rc);
+		return;
+	}
+	if (!fn) {
+		async_answer_0(rid, ENOENT);
+		return;
+	}
+
+	struct mfs_node *mnode;
+	struct mfs_ino_info *ino_i;
+	size_t len, bytes = 0;
+	ipc_callid_t callid;
+
+	mnode = fn->data;
+	ino_i = mnode->ino_i;
+
+	if (!async_data_read_receive(&callid, &len)) {
+		mfs_node_put(fn);
+		async_answer_0(callid, EINVAL);
+		async_answer_0(rid, EINVAL);
+		return;
+	}
+
+	if (S_ISDIR(ino_i->i_mode)) {
+		aoff64_t spos = pos;
+		struct mfs_dentry_info *d_info;
+
+		while (1) {
+			d_info = read_directory_entry(mnode, pos);
+			if (!d_info) {
+				/*Reached the end of the dentries list*/
+				break;
+			}
+
+			if (d_info->d_inum) {
+				/*Dentry found!*/
+				mfsdebug("DENTRY FOUND %s!!\n", d_info->d_name);
+				goto found;
+			}
+
+			free(d_info);
+			pos++;
+		}
+
+		rc = mfs_node_put(fn);
+		async_answer_0(callid, rc != EOK ? rc : ENOENT);
+		async_answer_1(rid, rc != EOK ? rc : ENOENT, 0);
+		return;
+found:
+		async_data_read_finalize(callid, d_info->d_name,
+				str_size(d_info->d_name) + 1);
+		bytes = ((pos - spos) + 1);
+	}
+
+	rc = mfs_node_put(fn);
+	async_answer_1(rid, rc, (sysarg_t)bytes);
+}
+
 int mfs_instance_get(devmap_handle_t handle, struct mfs_instance **instance)
 {
