Index: uspace/srv/fs/fat/fat_ops.c
===================================================================
--- uspace/srv/fs/fat/fat_ops.c	(revision 0c2eee05298ba20832407a11fcc054344d3cc5fc)
+++ uspace/srv/fs/fat/fat_ops.c	(revision 83937ccdc2b837d5c6a3681b11f3c1e76e3a6ade)
@@ -150,4 +150,5 @@
 	}
 	fat_node_initialize(nodep);
+	fs_node_initialize(fn);
 	fn->data = nodep;
 	nodep->bp = fn;
@@ -848,4 +849,5 @@
 		return;
 	}
+	fs_node_initialize(rfn);
 	fat_node_t *rootp = (fat_node_t *)malloc(sizeof(fat_node_t));
 	if (!rootp) {
@@ -887,5 +889,5 @@
 void fat_mount(ipc_callid_t rid, ipc_call_t *request)
 {
-	ipc_answer_0(rid, ENOTSUP);
+	libfs_mount(&fat_libfs_ops, rid, request);
 }
 
Index: uspace/srv/fs/tmpfs/tmpfs_ops.c
===================================================================
--- uspace/srv/fs/tmpfs/tmpfs_ops.c	(revision 0c2eee05298ba20832407a11fcc054344d3cc5fc)
+++ uspace/srv/fs/tmpfs/tmpfs_ops.c	(revision 83937ccdc2b837d5c6a3681b11f3c1e76e3a6ade)
@@ -251,4 +251,5 @@
 		return NULL;
 	}
+	fs_node_initialize(nodep->bp);
 	nodep->bp->data = nodep;	/* link the FS and TMPFS nodes */
 	if (!tmpfs_root_get(dev_handle))
Index: uspace/srv/vfs/vfs_ops.c
===================================================================
--- uspace/srv/vfs/vfs_ops.c	(revision 0c2eee05298ba20832407a11fcc054344d3cc5fc)
+++ uspace/srv/vfs/vfs_ops.c	(revision 83937ccdc2b837d5c6a3681b11f3c1e76e3a6ade)
@@ -85,9 +85,15 @@
 {
 	vfs_lookup_res_t mp_res;
+	vfs_lookup_res_t mr_res;
 	vfs_node_t *mp_node = NULL;
+	vfs_node_t *mr_node;
+	fs_index_t rindex;
+	size_t rsize;
+	unsigned rlnkcnt;
 	ipcarg_t rc;
 	int phone;
 	aid_t msg;
 	ipc_call_t answer;
+			
 
 	/* Resolve the path to the mountpoint. */
@@ -130,10 +136,4 @@
 		/* We still don't have the root file system mounted. */
 		if (str_cmp(mp, "/") == 0) {
-			vfs_lookup_res_t mr_res;
-			vfs_node_t *mr_node;
-			fs_index_t rindex;
-			size_t rsize;
-			unsigned rlnkcnt;
-			
 			/*
 			 * For this simple, but important case,
@@ -202,4 +202,8 @@
 	 */
 	
+	int mountee_phone = vfs_grab_phone(fs_handle);
+	assert(mountee_phone >= 0);
+	vfs_release_phone(mountee_phone);
+
 	phone = vfs_grab_phone(mp_res.triplet.fs_handle);
 	msg = async_send_4(phone, VFS_MOUNT,
@@ -208,4 +212,17 @@
 	    (ipcarg_t) fs_handle,
 	    (ipcarg_t) dev_handle, &answer);
+	
+	/* send connection */
+	rc = async_req_1_0(phone, IPC_M_CONNECTION_CLONE, mountee_phone);
+	if (rc != EOK) {
+		async_wait_for(msg, NULL);
+		vfs_release_phone(phone);
+		/* Mount failed, drop reference to mp_node. */
+		if (mp_node)
+			vfs_node_put(mp_node);
+		ipc_answer_0(rid, rc);
+		return;
+	}
+	
 	/* send the mount options */
 	rc = ipc_data_write_start(phone, (void *)opts, str_size(opts));
@@ -228,4 +245,19 @@
 	}
 	
+	rindex = (fs_index_t) IPC_GET_ARG1(answer);
+	rsize = (size_t) IPC_GET_ARG2(answer);
+	rlnkcnt = (unsigned) IPC_GET_ARG3(answer);
+	
+	mr_res.triplet.fs_handle = fs_handle;
+	mr_res.triplet.dev_handle = dev_handle;
+	mr_res.triplet.index = rindex;
+	mr_res.size = rsize;
+	mr_res.lnkcnt = rlnkcnt;
+	mr_res.type = VFS_NODE_DIRECTORY;
+	
+	/* Add reference to the mounted root. */
+	mr_node = vfs_node_get(&mr_res); 
+	assert(mr_node);
+
 	ipc_answer_0(rid, rc);
 }
