Index: uspace/srv/vfs/vfs.c
===================================================================
--- uspace/srv/vfs/vfs.c	(revision 10e4cd70353b84f2b635166e4fb6190278a8c488)
+++ uspace/srv/vfs/vfs.c	(revision 4965357ff2b6d6e35e8abbabc7da06e5fa98f3e8)
@@ -128,5 +128,5 @@
 			break;
 		case VFS_IN_GET_MTAB:
-			//vfs_get_mounted_fs_info(callid, &call);
+			vfs_get_mtab(callid, &call);
 			break;
 		default:
Index: uspace/srv/vfs/vfs.h
===================================================================
--- uspace/srv/vfs/vfs.h	(revision 10e4cd70353b84f2b635166e4fb6190278a8c488)
+++ uspace/srv/vfs/vfs.h	(revision 4965357ff2b6d6e35e8abbabc7da06e5fa98f3e8)
@@ -220,4 +220,5 @@
 extern void vfs_rename(ipc_callid_t, ipc_call_t *);
 extern void vfs_wait_handle(ipc_callid_t, ipc_call_t *);
+extern void vfs_get_mtab(ipc_callid_t, ipc_call_t *);
 
 #endif
Index: uspace/srv/vfs/vfs_ops.c
===================================================================
--- uspace/srv/vfs/vfs_ops.c	(revision 10e4cd70353b84f2b635166e4fb6190278a8c488)
+++ uspace/srv/vfs/vfs_ops.c	(revision 4965357ff2b6d6e35e8abbabc7da06e5fa98f3e8)
@@ -464,6 +464,4 @@
 		 */
 		
-		free(mp);
-		
 		exch = vfs_exchange_grab(mr_node->fs_handle);
 		rc = async_req_1_0(exch, VFS_OUT_UNMOUNTED,
@@ -473,4 +471,5 @@
 		if (rc != EOK) {
 			fibril_rwlock_write_unlock(&namespace_rwlock);
+			free(mp);
 			vfs_node_put(mr_node);
 			async_answer_0(rid, rc);
@@ -490,7 +489,7 @@
 		
 		rc = vfs_lookup_internal(mp, L_MP, &mp_res, NULL);
-		free(mp);
 		if (rc != EOK) {
 			fibril_rwlock_write_unlock(&namespace_rwlock);
+			free(mp);
 			vfs_node_put(mr_node);
 			async_answer_0(rid, rc);
@@ -501,4 +500,5 @@
 		if (!mp_node) {
 			fibril_rwlock_write_unlock(&namespace_rwlock);
+			free(mp);
 			vfs_node_put(mr_node);
 			async_answer_0(rid, ENOMEM);
@@ -513,4 +513,5 @@
 		if (rc != EOK) {
 			fibril_rwlock_write_unlock(&namespace_rwlock);
+			free(mp);
 			vfs_node_put(mp_node);
 			vfs_node_put(mr_node);
@@ -530,6 +531,29 @@
 	 */
 	vfs_node_forget(mr_node);
-	
 	fibril_rwlock_write_unlock(&namespace_rwlock);
+
+	fibril_mutex_lock(&mtab_list_lock);
+
+	int found = 0;
+
+	list_foreach(mtab_list, cur) {
+		mtab_list_ent_t *ent = list_get_instance(cur, mtab_list_ent_t,
+		    link);
+
+		mtab_ent_t *mtab_ent = &ent->mtab_ent;
+
+		if (str_cmp(mtab_ent->mp, mp) == 0) {
+			list_remove(&ent->link);
+			mtab_size--;
+			free(ent);
+			found = 1;
+			break;
+		}
+	}
+	assert(found);
+
+	free(mp);
+
+	fibril_mutex_unlock(&mtab_list_lock);
 	async_answer_0(rid, EOK);
 }
@@ -1320,4 +1344,73 @@
 }
 
+void vfs_get_mtab(ipc_callid_t rid, ipc_call_t *request)
+{
+	ipc_callid_t callid;
+	ipc_call_t data;
+	sysarg_t rc = EOK;
+	size_t len;
+
+	fibril_mutex_lock(&mtab_list_lock);
+
+	/* Send to the caller the number of mounted filesystems */
+	callid = async_get_call(&data);
+	if (IPC_GET_IMETHOD(data) != VFS_IN_PING) {
+		rc = ENOTSUP;
+		async_answer_1(callid, rc, 0);
+		goto exit;
+	}
+	async_answer_1(callid, EOK, mtab_size);
+
+	list_foreach(mtab_list, cur) {
+		mtab_list_ent_t *ent = list_get_instance(cur, mtab_list_ent_t,
+		    link);
+
+		mtab_ent_t *mtab_ent = &ent->mtab_ent;
+
+		rc = ENOTSUP;
+
+		if (!async_data_read_receive(&callid, &len))
+			goto exit;
+
+		(void) async_data_read_finalize(callid, mtab_ent->mp,
+		    str_size(mtab_ent->mp));
+
+		if (!async_data_read_receive(&callid, &len))
+			goto exit;
+
+		(void) async_data_read_finalize(callid, mtab_ent->opts,
+		    str_size(mtab_ent->opts));
+
+		if (!async_data_read_receive(&callid, &len))
+			goto exit;
+
+		(void) async_data_read_finalize(callid, mtab_ent->fs_name,
+		    str_size(mtab_ent->fs_name));
+
+		sysarg_t p[3];
+
+		p[0] = mtab_ent->flags;
+		p[1] = mtab_ent->instance;
+		p[2] = mtab_ent->fs_handle;
+
+		int i;
+		for (i = 0; i < 3; ++i) {
+			callid = async_get_call(&data);
+			if (IPC_GET_IMETHOD(data) != VFS_IN_PING) {
+				rc = ENOTSUP;
+				async_answer_1(callid, rc, 0);
+				goto exit;
+			}
+			async_answer_1(callid, EOK, p[i]);
+		}
+
+		rc = EOK;
+	}
+
+exit:
+	fibril_mutex_unlock(&mtab_list_lock);
+	async_answer_0(rid, rc);
+}
+
 /**
  * @}
