Index: uspace/srv/vfs/vfs.h
===================================================================
--- uspace/srv/vfs/vfs.h	(revision 6c89f20d4b14cbd0a3794d94dcc96312477bbf1f)
+++ uspace/srv/vfs/vfs.h	(revision b7b675307e0a41ee1e8b50270215df7dabd37b8a)
@@ -66,4 +66,5 @@
 typedef enum {
 	VFS_LOOKUP = VFS_LAST_CMN,
+	VFS_MOUNTED,
 	VFS_DESTROY,
 	VFS_LAST_CLNT,	/* keep this the last member of this enum */
@@ -245,5 +246,5 @@
 extern link_t fs_head;		/**< List of registered file systems. */
 
-extern vfs_triplet_t rootfs;	/**< Root node of the root file system. */
+extern vfs_pair_t rootfs;	/**< Root file system. */
 
 #define MAX_PATH_LEN		(64 * 1024)
Index: uspace/srv/vfs/vfs_lookup.c
===================================================================
--- uspace/srv/vfs/vfs_lookup.c	(revision 6c89f20d4b14cbd0a3794d94dcc96312477bbf1f)
+++ uspace/srv/vfs/vfs_lookup.c	(revision b7b675307e0a41ee1e8b50270215df7dabd37b8a)
@@ -73,5 +73,5 @@
 		root = altroot;
 	else
-		root = (vfs_pair_t *) &rootfs;
+		root = &rootfs;
 
 	if (!root->fs_handle)
Index: uspace/srv/vfs/vfs_ops.c
===================================================================
--- uspace/srv/vfs/vfs_ops.c	(revision 6c89f20d4b14cbd0a3794d94dcc96312477bbf1f)
+++ uspace/srv/vfs/vfs_ops.c	(revision b7b675307e0a41ee1e8b50270215df7dabd37b8a)
@@ -63,21 +63,8 @@
 
 futex_t rootfs_futex = FUTEX_INITIALIZER;
-vfs_triplet_t rootfs = {
+vfs_pair_t rootfs = {
 	.fs_handle = 0,
-	.dev_handle = 0,
-	.index = 0,
+	.dev_handle = 0
 };
-
-static int
-lookup_root(fs_handle_t fs_handle, dev_handle_t dev_handle,
-    vfs_lookup_res_t *result)
-{
-	vfs_pair_t altroot = {
-		.fs_handle = fs_handle,
-		.dev_handle = dev_handle,
-	};
-
-	return vfs_lookup_internal("/", L_DIRECTORY, result, &altroot);
-}
 
 void vfs_mount(ipc_callid_t rid, ipc_call_t *request)
@@ -164,25 +151,5 @@
 	buf[size] = '\0';
 
-	/*
-	 * Lookup the root node of the filesystem being mounted.
-	 * In this case, we don't need to take the namespace_futex as the root
-	 * node cannot be removed. However, we do take a reference to it so
-	 * that we can track how many times it has been mounted.
-	 */
-	vfs_lookup_res_t mr_res;
-	rc = lookup_root(fs_handle, dev_handle, &mr_res);
-	if (rc != EOK) {
-		free(buf);
-		ipc_answer_0(rid, rc);
-		return;
-	}
-	vfs_node_t *mr_node = vfs_node_get(&mr_res);
-	if (!mr_node) {
-		free(buf);
-		ipc_answer_0(rid, ENOMEM);
-		return;
-	}
-
-	/* Finally, we need to resolve the path to the mountpoint. */
+	/* Resolve the path to the mountpoint. */
 	vfs_lookup_res_t mp_res;
 	futex_down(&rootfs_futex);
@@ -194,5 +161,4 @@
 			rwlock_write_unlock(&namespace_rwlock);
 			futex_up(&rootfs_futex);
-			vfs_node_put(mr_node);
 			free(buf);
 			ipc_answer_0(rid, EBUSY);
@@ -204,5 +170,4 @@
 			rwlock_write_unlock(&namespace_rwlock);
 			futex_up(&rootfs_futex);
-			vfs_node_put(mr_node);	/* failed -> drop reference */
 			free(buf);
 			ipc_answer_0(rid, rc);
@@ -213,5 +178,4 @@
 			rwlock_write_unlock(&namespace_rwlock);
 			futex_up(&rootfs_futex);
-			vfs_node_put(mr_node);	/* failed -> drop reference */
 			free(buf);
 			ipc_answer_0(rid, ENOMEM);
@@ -233,18 +197,14 @@
 			free(buf);
 			
-			/* Inform the mount point about the root mount. */
-			phone = vfs_grab_phone(mr_res.triplet.fs_handle);
-			rc = async_req_5_0(phone, VFS_MOUNT,
-			    (ipcarg_t) mr_res.triplet.dev_handle,
-			    (ipcarg_t) mr_res.triplet.index,
-			    (ipcarg_t) mr_res.triplet.fs_handle,
-			    (ipcarg_t) mr_res.triplet.dev_handle,
-			    (ipcarg_t) mr_res.triplet.index);
+			/* Tell the mountee that it is being mounted. */
+			phone = vfs_grab_phone(fs_handle);
+			rc = async_req_1_0(phone, VFS_MOUNTED,
+			    (ipcarg_t) dev_handle);
 			vfs_release_phone(phone);
 
-			if (rc == EOK)
-				rootfs = mr_res.triplet;
-			else 
-				vfs_node_put(mr_node);
+			if (rc == EOK) {
+				rootfs.fs_handle = fs_handle;
+				rootfs.dev_handle = dev_handle;
+			}
 
 			futex_up(&rootfs_futex);
@@ -258,5 +218,4 @@
 			futex_up(&rootfs_futex);
 			free(buf);
-			vfs_node_put(mr_node);	/* failed -> drop reference */
 			ipc_answer_0(rid, ENOENT);
 			return;
@@ -269,24 +228,17 @@
 	/*
 	 * At this point, we have all necessary pieces: file system and device
-	 * handles, and we know the mount point VFS node and also the root node
-	 * of the file system being mounted.
-	 */
-
-	/**
-	 * @todo
-	 * Add more IPC parameters so that we can send mount mode/flags.
-	 */
+	 * handles, and we know the mount point VFS node.
+	 */
+
 	phone = vfs_grab_phone(mp_res.triplet.fs_handle);
-	rc = async_req_5_0(phone, VFS_MOUNT,
+	rc = async_req_4_0(phone, VFS_MOUNT,
 	    (ipcarg_t) mp_res.triplet.dev_handle,
 	    (ipcarg_t) mp_res.triplet.index,
-	    (ipcarg_t) mr_res.triplet.fs_handle,
-	    (ipcarg_t) mr_res.triplet.dev_handle,
-	    (ipcarg_t) mr_res.triplet.index);
+	    (ipcarg_t) fs_handle,
+	    (ipcarg_t) dev_handle);
 	vfs_release_phone(phone);
 
 	if (rc != EOK) {
-		/* Mount failed, drop references to mr_node and mp_node. */
-		vfs_node_put(mr_node);
+		/* Mount failed, drop reference to mp_node. */
 		if (mp_node)
 			vfs_node_put(mp_node);
