Index: uspace/srv/vfs/vfs.h
===================================================================
--- uspace/srv/vfs/vfs.h	(revision fa23560fdd0e695738620af86112b84932e3b3e3)
+++ uspace/srv/vfs/vfs.h	(revision 4d21cf8018c22aea36d3bffe12b2b30aad54c593)
@@ -100,15 +100,36 @@
 
 /**
- * Instances of this type represent a file system node (e.g. directory, file).
- * They are abstracted away from any file system implementation and contain just
- * enough bits to uniquely identify the object in its file system instance.
+ * VFS_PAIR uniquely represents a file system instance.
+ */
+#define VFS_PAIR	\
+	int fs_handle;	\
+	int dev_handle;	
+
+/**
+ * VFS_TRIPLET uniquely identifies a file system node (e.g. directory, file) but
+ * doesn't contain any state. For a stateful structure, see vfs_node_t.
  *
  * @note	fs_handle, dev_handle and index are meant to be returned in one
  *		IPC reply.
  */
+#define VFS_TRIPLET	\
+	VFS_PAIR;	\
+	uint64_t index;
+
 typedef struct {
-	int fs_handle;		/**< Global file system ID. */
-	int dev_handle;		/**< Global mount device devno. */
-	uint64_t index;		/**< Index of the node on its file system. */
+	VFS_PAIR;
+} vfs_pair_t;
+
+typedef struct {
+	VFS_TRIPLET;
+} vfs_triplet_t;
+
+/**
+ * Instances of this type represent an active, in-memory VFS node and any state
+ * which may be associated with it.
+ */
+typedef struct {
+	VFS_TRIPLET;		/**< Identity of the node. */
+	atomic_t refcnt;	/**< Usage counter. */
 } vfs_node_t;
 
@@ -129,5 +150,5 @@
 extern link_t fs_head;		/**< List of registered file systems. */
 
-extern vfs_node_t rootfs;	/**< Root node of the root file system. */
+extern vfs_triplet_t rootfs;	/**< Root node of the root file system. */
 
 #define MAX_PATH_LEN		(64 * 1024)
@@ -151,5 +172,5 @@
 extern int fs_name_to_handle(char *, bool);
 
-extern int vfs_lookup_internal(char *, size_t, vfs_node_t *, vfs_node_t *);
+extern int vfs_lookup_internal(char *, size_t, vfs_triplet_t *, vfs_pair_t *);
 
 #define MAX_OPEN_FILES	128	
Index: uspace/srv/vfs/vfs_lookup.c
===================================================================
--- uspace/srv/vfs/vfs_lookup.c	(revision fa23560fdd0e695738620af86112b84932e3b3e3)
+++ uspace/srv/vfs/vfs_lookup.c	(revision 4d21cf8018c22aea36d3bffe12b2b30aad54c593)
@@ -62,8 +62,8 @@
  * @return		EOK on success or an error code from errno.h.
  */
-int vfs_lookup_internal(char *path, size_t len, vfs_node_t *result,
-    vfs_node_t *altroot)
+int vfs_lookup_internal(char *path, size_t len, vfs_triplet_t *result,
+    vfs_pair_t *altroot)
 {
-	vfs_node_t *root;
+	vfs_pair_t *root;
 
 	if (!len)
@@ -73,5 +73,5 @@
 		root = altroot;
 	else
-		root = &rootfs;
+		root = (vfs_pair_t *) &rootfs;
 
 	if (!root->fs_handle)
Index: uspace/srv/vfs/vfs_mount.c
===================================================================
--- uspace/srv/vfs/vfs_mount.c	(revision fa23560fdd0e695738620af86112b84932e3b3e3)
+++ uspace/srv/vfs/vfs_mount.c	(revision 4d21cf8018c22aea36d3bffe12b2b30aad54c593)
@@ -47,15 +47,15 @@
 
 atomic_t rootfs_futex = FUTEX_INITIALIZER;
-vfs_node_t rootfs = { 0 };
-
-static int lookup_root(int fs_handle, int dev_handle, vfs_node_t *root)
+vfs_triplet_t rootfs = {
+	.fs_handle = 0,
+	.dev_handle = 0,
+	.index = 0,
+};
+
+static int lookup_root(int fs_handle, int dev_handle, vfs_triplet_t *root)
 {
-	vfs_node_t altroot = {
+	vfs_pair_t altroot = {
 		.fs_handle = fs_handle,
 		.dev_handle = dev_handle,
-		/*
-		 * At this point, we don't know what is the index of the root
-		 * node. Finally, that's what this function is about.
-		 */
 	};
 
@@ -139,5 +139,5 @@
 	 */
 	int rc;
-	vfs_node_t mounted_root;
+	vfs_triplet_t mounted_root;
 	rc = lookup_root(fs_handle, dev_handle, &mounted_root);
 	if (rc != EOK) {
@@ -150,5 +150,5 @@
 	 * Finally, we need to resolve the path to the mountpoint. 
 	 */
-	vfs_node_t mp;
+	vfs_triplet_t mp;
 	futex_down(&rootfs_futex);
 	if (rootfs.fs_handle) {
