Index: uspace/srv/fs/minixfs/mfs.c
===================================================================
--- uspace/srv/fs/minixfs/mfs.c	(revision 44799a0e5ab124e51750f68656aab2c40477e2b8)
+++ uspace/srv/fs/minixfs/mfs.c	(revision 1dd3e814b3784ebec073a5d6d6edfa6f8720d3d0)
@@ -127,4 +127,13 @@
 			mfs_destroy(callid, &call);
 			break;
+		case VFS_OUT_UNMOUNTED:
+			mfs_unmounted(callid, &call);
+			break;
+		case VFS_OUT_UNMOUNT:
+			mfs_unmount(callid, &call);
+			break;
+		case VFS_OUT_SYNC:
+			mfs_sync(callid, &call);
+			break;
 		default:
 			async_answer_0(callid, ENOTSUP);
Index: uspace/srv/fs/minixfs/mfs.h
===================================================================
--- uspace/srv/fs/minixfs/mfs.h	(revision 44799a0e5ab124e51750f68656aab2c40477e2b8)
+++ uspace/srv/fs/minixfs/mfs.h	(revision 1dd3e814b3784ebec073a5d6d6edfa6f8720d3d0)
@@ -177,4 +177,13 @@
 mfs_destroy(ipc_callid_t rid, ipc_call_t *request);
 
+extern void
+mfs_unmounted(ipc_callid_t rid, ipc_call_t *request);
+
+extern void
+mfs_unmount(ipc_callid_t rid, ipc_call_t *request);
+
+extern void
+mfs_sync(ipc_callid_t rid, ipc_call_t *request);
+
 /*mfs_inode.c*/
 extern int
Index: uspace/srv/fs/minixfs/mfs_ops.c
===================================================================
--- uspace/srv/fs/minixfs/mfs_ops.c	(revision 44799a0e5ab124e51750f68656aab2c40477e2b8)
+++ uspace/srv/fs/minixfs/mfs_ops.c	(revision 1dd3e814b3784ebec073a5d6d6edfa6f8720d3d0)
@@ -250,4 +250,19 @@
 }
 
+void mfs_unmount(ipc_callid_t rid, ipc_call_t *request)
+{
+	libfs_unmount(&mfs_libfs_ops, rid, request);
+}
+
+void mfs_unmounted(ipc_callid_t rid, ipc_call_t *request)
+{
+	devmap_handle_t devmap = (devmap_handle_t) IPC_GET_ARG1(*request);
+
+	(void) block_cache_fini(devmap);
+	block_fini(devmap);
+
+	async_answer_0(rid, EOK);
+}
+
 devmap_handle_t mfs_device_get(fs_node_t *fsnode)
 {
@@ -826,4 +841,10 @@
 	assert(!has_children);
 
+	if (mnode->ino_i->i_nlinks > 0) {
+		mfsdebug("nlinks = %d", mnode->ino_i->i_nlinks);
+		r = EOK;
+		goto out;
+	}
+
 	/*Free the entire inode content*/
 	r = inode_shrink(mnode, mnode->ino_i->i_size);
@@ -832,4 +853,5 @@
 	on_error(r, return r);
 
+out:
 	free(mnode->ino_i);
 	free(mnode);
@@ -935,4 +957,28 @@
 }
 
+void
+mfs_sync(ipc_callid_t rid, ipc_call_t *request)
+{
+	devmap_handle_t devmap = (devmap_handle_t) IPC_GET_ARG1(*request);
+	fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request);
+
+	fs_node_t *fn;
+	int rc = mfs_node_get(&fn, devmap, index);
+	if (rc != EOK) {
+		async_answer_0(rid, rc);
+		return;
+	}
+	if (!fn) {
+		async_answer_0(rid, ENOENT);
+		return;
+	}
+
+	struct mfs_node *mnode = fn->data;
+	mnode->ino_i->dirty = true;
+
+	rc = mfs_node_put(fn);
+	async_answer_0(rid, rc);
+}
+
 /**
  * @}
