Index: uspace/lib/c/generic/vfs/vfs.c
===================================================================
--- uspace/lib/c/generic/vfs/vfs.c	(revision 3ce78580bbc80418ca6c31d4cb2e2155ece8c7f9)
+++ uspace/lib/c/generic/vfs/vfs.c	(revision 10e4cd70353b84f2b635166e4fb6190278a8c488)
@@ -35,4 +35,5 @@
 #include <vfs/canonify.h>
 #include <vfs/vfs.h>
+#include <vfs/vfs_mtab.h>
 #include <vfs/vfs_sess.h>
 #include <macros.h>
@@ -831,4 +832,70 @@
 }
 
+int get_mtab_list(list_t *mtab_list)
+{
+	sysarg_t rc;
+	size_t i;
+	size_t num_mounted_fs;
+	
+	async_exch_t *exch = vfs_exchange_begin();
+
+	rc = async_req_0_0(exch, VFS_IN_GET_MTAB);
+	if (rc != EOK)
+		goto exit;
+
+	/* Ask VFS how many filesystems are mounted */
+	rc = async_req_0_1(exch, VFS_IN_PING, &num_mounted_fs);
+	if (rc != EOK)
+		goto exit;
+
+	for (i = 0; i < num_mounted_fs; ++i) {
+		mtab_list_ent_t *mtab_list_ent;
+		mtab_ent_t *mtab_ent;
+
+		mtab_list_ent = malloc(sizeof(mtab_list_ent_t));
+		if (!mtab_list_ent) {
+			rc = ENOMEM;
+			goto exit;
+		}
+
+		mtab_ent = &mtab_list_ent->mtab_ent;
+
+		rc = async_data_read_start(exch, (void *) &mtab_ent->mp,
+		    MAX_PATH_LEN);
+		if (rc != EOK)
+			goto exit;
+
+		rc = async_data_read_start(exch, (void *) &mtab_ent->opts,
+			MAX_MNTOPTS_LEN);
+		if (rc != EOK)
+			goto exit;
+
+		rc = async_data_read_start(exch, (void *) &mtab_ent->fs_name,
+			FS_NAME_MAXLEN);
+		if (rc != EOK)
+			goto exit;
+
+		sysarg_t p[3];
+		int j;
+
+		for (j = 0; j < 3; ++j) {
+			rc = async_req_0_1(exch, VFS_IN_PING, &p[j]);
+			if (rc != EOK)
+				goto exit;
+		}
+
+		mtab_ent->flags = p[0];
+		mtab_ent->instance = p[1];
+		mtab_ent->fs_handle = p[2];
+
+		link_initialize(&mtab_list_ent->link);
+		list_append(&mtab_list_ent->link, mtab_list);
+	}
+
+exit:
+	vfs_exchange_end(exch);
+	return rc;
+}
+
 /** @}
  */
Index: uspace/lib/c/include/ipc/vfs.h
===================================================================
--- uspace/lib/c/include/ipc/vfs.h	(revision 3ce78580bbc80418ca6c31d4cb2e2155ece8c7f9)
+++ uspace/lib/c/include/ipc/vfs.h	(revision 10e4cd70353b84f2b635166e4fb6190278a8c488)
@@ -42,4 +42,5 @@
 #define FS_NAME_MAXLEN  20
 #define MAX_PATH_LEN    (64 * 1024)
+#define MAX_MNTOPTS_LEN 256
 #define PLB_SIZE        (2 * MAX_PATH_LEN)
 
@@ -80,4 +81,5 @@
 	VFS_IN_DUP,
 	VFS_IN_WAIT_HANDLE,
+	VFS_IN_GET_MTAB,
 } vfs_in_request_t;
 
Index: uspace/lib/c/include/vfs/vfs.h
===================================================================
--- uspace/lib/c/include/vfs/vfs.h	(revision 3ce78580bbc80418ca6c31d4cb2e2155ece8c7f9)
+++ uspace/lib/c/include/vfs/vfs.h	(revision 10e4cd70353b84f2b635166e4fb6190278a8c488)
@@ -39,4 +39,5 @@
 #include <ipc/vfs.h>
 #include <ipc/loc.h>
+#include <adt/list.h>
 #include <stdio.h>
 #include <async.h>
@@ -55,4 +56,5 @@
 
 extern int fd_wait(void);
+extern int get_mtab_list(list_t *mtab_list);
 
 extern async_exch_t *vfs_exchange_begin(void);
Index: uspace/srv/vfs/vfs.c
===================================================================
--- uspace/srv/vfs/vfs.c	(revision 3ce78580bbc80418ca6c31d4cb2e2155ece8c7f9)
+++ uspace/srv/vfs/vfs.c	(revision 10e4cd70353b84f2b635166e4fb6190278a8c488)
@@ -127,4 +127,7 @@
 			vfs_wait_handle(callid, &call);
 			break;
+		case VFS_IN_GET_MTAB:
+			//vfs_get_mounted_fs_info(callid, &call);
+			break;
 		default:
 			async_answer_0(callid, ENOTSUP);
Index: uspace/srv/vfs/vfs.h
===================================================================
--- uspace/srv/vfs/vfs.h	(revision 3ce78580bbc80418ca6c31d4cb2e2155ece8c7f9)
+++ uspace/srv/vfs/vfs.h	(revision 10e4cd70353b84f2b635166e4fb6190278a8c488)
@@ -150,4 +150,7 @@
 extern list_t fs_list;		/**< List of registered file systems. */
 
+extern fibril_mutex_t fs_mntlist_lock;
+extern list_t fs_mntlist;	/**< List of mounted file systems. */
+
 extern vfs_pair_t rootfs;	/**< Root file system. */
 
@@ -162,6 +165,4 @@
 extern uint8_t *plb;		/**< Path Lookup Buffer */
 extern list_t plb_entries;	/**< List of active PLB entries. */
-
-#define MAX_MNTOPTS_LEN		256
 
 /** Holding this rwlock prevents changes in file system namespace. */ 
Index: uspace/srv/vfs/vfs_ops.c
===================================================================
--- uspace/srv/vfs/vfs_ops.c	(revision 3ce78580bbc80418ca6c31d4cb2e2155ece8c7f9)
+++ uspace/srv/vfs/vfs_ops.c	(revision 10e4cd70353b84f2b635166e4fb6190278a8c488)
@@ -52,4 +52,9 @@
 #include <assert.h>
 #include <vfs/canonify.h>
+#include <vfs/vfs_mtab.h>
+
+FIBRIL_MUTEX_INITIALIZE(mtab_list_lock);
+LIST_INITIALIZE(mtab_list);
+static size_t mtab_size = 0;
 
 /* Forward declarations of static functions. */
@@ -353,12 +358,38 @@
 	fibril_mutex_unlock(&fs_list_lock);
 	
+	/* Do the mount */
+	vfs_mount_internal(rid, service_id, fs_handle, mp, opts);
+
+	/* Add the filesystem info to the list of mounted filesystems */
+	mtab_list_ent_t *mtab_list_ent = malloc(sizeof(mtab_list_ent_t));
+	if (!mtab_list_ent) {
+		async_answer_0(callid, ENOMEM);
+		async_answer_0(rid, ENOMEM);
+		free(mp);
+		free(fs_name);
+		free(opts);
+		return;
+	}
+
+	mtab_ent_t *mtab_ent = &mtab_list_ent->mtab_ent;
+
+	mtab_ent->fs_handle = fs_handle;
+	str_cpy(mtab_ent->mp, MAX_PATH_LEN, mp);
+	str_cpy(mtab_ent->fs_name, FS_NAME_MAXLEN, fs_name);
+	str_cpy(mtab_ent->opts, MAX_MNTOPTS_LEN, opts);
+	mtab_ent->flags = flags;
+	mtab_ent->instance = instance;
+
+	link_initialize(&mtab_list_ent->link);
+
+	fibril_mutex_lock(&mtab_list_lock);
+	list_append(&mtab_list_ent->link, &mtab_list);
+	mtab_size++;
+	fibril_mutex_unlock(&mtab_list_lock);
+
+	free(mp);
+
 	/* Acknowledge that we know fs_name. */
 	async_answer_0(callid, EOK);
-	
-	/* Do the mount */
-	vfs_mount_internal(rid, service_id, fs_handle, mp, opts);
-	free(mp);
-	free(fs_name);
-	free(opts);
 }
 
