Index: uspace/srv/fs/minixfs/Makefile
===================================================================
--- uspace/srv/fs/minixfs/Makefile	(revision cfbcd86527baadf8d06a61c7d65f4bbe8facaf82)
+++ uspace/srv/fs/minixfs/Makefile	(revision 54caa41b481059a83c03d23b3b1c963d412cced2)
@@ -38,4 +38,5 @@
 	mfs_inode.c \
 	mfs_read.c \
+	mfs_dentry.c \
 	mfs_utils.c
 
Index: uspace/srv/fs/minixfs/mfs.c
===================================================================
--- uspace/srv/fs/minixfs/mfs.c	(revision cfbcd86527baadf8d06a61c7d65f4bbe8facaf82)
+++ uspace/srv/fs/minixfs/mfs.c	(revision 54caa41b481059a83c03d23b3b1c963d412cced2)
@@ -107,4 +107,7 @@
 			mfs_stat(callid, &call);
 			break;
+		case VFS_OUT_LOOKUP:
+			mfs_lookup(callid, &call);
+			break;
 		default:
 			async_answer_0(callid, ENOTSUP);
Index: uspace/srv/fs/minixfs/mfs.h
===================================================================
--- uspace/srv/fs/minixfs/mfs.h	(revision cfbcd86527baadf8d06a61c7d65f4bbe8facaf82)
+++ uspace/srv/fs/minixfs/mfs.h	(revision 54caa41b481059a83c03d23b3b1c963d412cced2)
@@ -96,4 +96,14 @@
         /*Block numbers for indirect zones*/
         uint32_t        i_izone[V2_NR_INDIRECT_ZONES];
+
+	bool dirty;
+};
+
+/*Generic MFS directory entry*/
+struct mfs_dentry_info {
+	uint32_t d_inum;
+	char d_name[MFS3_MAX_NAME_LEN];
+
+	bool dirty;
 };
 
@@ -113,8 +123,10 @@
 extern void mfs_mounted(ipc_callid_t rid, ipc_call_t *request);
 extern void mfs_mount(ipc_callid_t rid, ipc_call_t *request);
+extern void mfs_lookup(ipc_callid_t rid, ipc_call_t *request);
 extern aoff64_t mfs_size_get(fs_node_t *node);
 extern bool mfs_is_directory(fs_node_t *fsnode);
 extern bool mfs_is_file(fs_node_t *fsnode);
 extern char mfs_plb_get_char(unsigned pos);
+extern int mfs_has_children(bool *has_children, fs_node_t *fsnode);
 extern int mfs_root_get(fs_node_t **rfn, devmap_handle_t handle);
 extern devmap_handle_t mfs_device_get(fs_node_t *fsnode);
@@ -138,4 +150,8 @@
 int read_map(uint32_t *b, const struct mfs_node *mnode, const uint32_t pos);
 
+/*mfs_dentry.c*/
+extern struct mfs_dentry_info *
+read_directory_entry(struct mfs_node *mnode, unsigned index);
+
 #endif
 
Index: uspace/srv/fs/minixfs/mfs_inode.c
===================================================================
--- uspace/srv/fs/minixfs/mfs_inode.c	(revision cfbcd86527baadf8d06a61c7d65f4bbe8facaf82)
+++ uspace/srv/fs/minixfs/mfs_inode.c	(revision 54caa41b481059a83c03d23b3b1c963d412cced2)
@@ -79,6 +79,7 @@
 
 	block_put(b);
+	free(ino);
+	ino_i->dirty = false;
 
-	free(ino);
 	return ino_i;
 
@@ -137,6 +138,7 @@
 
 	block_put(b);
+	free(ino);
+	ino_i->dirty = false;
 
-	free(ino);
 	return ino_i;
 
Index: uspace/srv/fs/minixfs/mfs_ops.c
===================================================================
--- uspace/srv/fs/minixfs/mfs_ops.c	(revision cfbcd86527baadf8d06a61c7d65f4bbe8facaf82)
+++ uspace/srv/fs/minixfs/mfs_ops.c	(revision 54caa41b481059a83c03d23b3b1c963d412cced2)
@@ -54,5 +54,6 @@
 	.is_file = mfs_is_file,
 	.node_get = mfs_node_get,
-	.plb_get_char = mfs_plb_get_char
+	.plb_get_char = mfs_plb_get_char,
+	.has_children = mfs_has_children
 };
 
@@ -312,7 +313,51 @@
 }
 
+void mfs_lookup(ipc_callid_t rid, ipc_call_t *request)
+{
+	libfs_lookup(&mfs_libfs_ops, mfs_reg.fs_handle, rid, request);
+}
+
 char mfs_plb_get_char(unsigned pos)
 {
 	return mfs_reg.plb_ro[pos % PLB_SIZE];
+}
+
+int mfs_has_children(bool *has_children, fs_node_t *fsnode)
+{
+	struct mfs_node *mnode = fsnode->data;
+	const struct mfs_ino_info *ino_i = mnode->ino_i;
+	const struct mfs_instance *inst = mnode->instance;
+	const struct mfs_sb_info *sbi = inst->sbi;
+	int i;
+
+	*has_children = false;
+
+	if (!S_ISDIR(mnode->ino_i->i_mode))
+		goto out;
+
+	struct mfs_dentry_info *d_info;
+
+	for (i = 2; i < ino_i->i_size / sbi->dirsize; ++i) {
+		d_info = read_directory_entry(mnode, i);
+
+		if (!d_info)
+			goto out;
+
+		if (d_info->d_inum) {
+			*has_children = true;
+			free(d_info);
+			break;
+		}
+
+		free(d_info);
+	}
+
+	if (*has_children)
+		mfsdebug("Has children\n");
+	else
+		mfsdebug("Has not children\n");
+
+out:
+	return EOK;
 }
 
