Index: uspace/lib/c/include/ipc/vfs.h
===================================================================
--- uspace/lib/c/include/ipc/vfs.h	(revision 27b76ca72fe73962d4f6bcdaeca5a243066e314f)
+++ uspace/lib/c/include/ipc/vfs.h	(revision 221ab41add03a52746867d331fd50827f827efa8)
@@ -82,5 +82,6 @@
 
 typedef enum {
-	VFS_OUT_READ = IPC_FIRST_USER_METHOD,
+	VFS_OUT_OPEN_NODE = IPC_FIRST_USER_METHOD,
+	VFS_OUT_READ,
 	VFS_OUT_WRITE,
 	VFS_OUT_TRUNCATE,
Index: uspace/lib/fs/libfs.c
===================================================================
--- uspace/lib/fs/libfs.c	(revision 27b76ca72fe73962d4f6bcdaeca5a243066e314f)
+++ uspace/lib/fs/libfs.c	(revision 221ab41add03a52746867d331fd50827f827efa8)
@@ -72,4 +72,6 @@
     ipc_call_t *);
 static void libfs_stat(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *);
+static void libfs_open_node(libfs_ops_t *, fs_handle_t, ipc_callid_t,
+    ipc_call_t *);
 
 static void vfs_out_mounted(ipc_callid_t rid, ipc_call_t *req)
@@ -196,4 +198,9 @@
 }
 
+static void vfs_out_open_node(ipc_callid_t rid, ipc_call_t *req)
+{
+	libfs_open_node(libfs_ops, reg.fs_handle, rid, req);
+}
+
 static void vfs_out_stat(ipc_callid_t rid, ipc_call_t *req)
 {
@@ -260,4 +267,7 @@
 		case VFS_OUT_DESTROY:
 			vfs_out_destroy(callid, &call);
+			break;
+		case VFS_OUT_OPEN_NODE:
+			vfs_out_open_node(callid, &call);
 			break;
 		case VFS_OUT_STAT:
@@ -835,4 +845,36 @@
 }
 
+/** Open VFS triplet.
+ *
+ * @param ops     libfs operations structure with function pointers to
+ *                file system implementation
+ * @param rid     Request ID of the VFS_OUT_OPEN_NODE request.
+ * @param request VFS_OUT_OPEN_NODE request data itself.
+ *
+ */
+void libfs_open_node(libfs_ops_t *ops, fs_handle_t fs_handle, ipc_callid_t rid,
+    ipc_call_t *request)
+{
+	devmap_handle_t devmap_handle = IPC_GET_ARG1(*request);
+	fs_index_t index = IPC_GET_ARG2(*request);
+	
+	fs_node_t *fn;
+	int rc = ops->node_get(&fn, devmap_handle, index);
+	on_error(rc, answer_and_return(rid, rc));
+	
+	if (fn == NULL) {
+		async_answer_0(rid, ENOENT);
+		return;
+	}
+	
+	rc = ops->node_open(fn);
+	aoff64_t size = ops->size_get(fn);
+	async_answer_4(rid, rc, LOWER32(size), UPPER32(size),
+	    ops->lnkcnt_get(fn),
+	    (ops->is_file(fn) ? L_FILE : 0) | (ops->is_directory(fn) ? L_DIRECTORY : 0));
+	
+	(void) ops->node_put(fn);
+}
+
 /** @}
  */
