Index: uspace/lib/libc/generic/vfs/vfs.c
===================================================================
--- uspace/lib/libc/generic/vfs/vfs.c	(revision 1090b8c5d547b44cb82f921d66261080be81ccc2)
+++ uspace/lib/libc/generic/vfs/vfs.c	(revision 98000fb4ea6015506f059c9b121e417ce991ecfd)
@@ -50,10 +50,11 @@
 #include <string.h>
 #include <devmap.h>
-#include "../../../srv/vfs/vfs.h"
-
-int vfs_phone = -1;
-futex_t vfs_phone_futex = FUTEX_INITIALIZER;
-
-futex_t cwd_futex = FUTEX_INITIALIZER;
+#include <ipc/vfs.h>
+#include <ipc/devmap.h>
+
+static int vfs_phone = -1;
+static futex_t vfs_phone_futex = FUTEX_INITIALIZER;
+static futex_t cwd_futex = FUTEX_INITIALIZER;
+
 DIR *cwd_dir = NULL;
 char *cwd_path = NULL;
@@ -211,7 +212,8 @@
 	futex_up(&vfs_phone_futex);
 	free(pa);
-
+	
 	if (rc != EOK)
 	    return (int) rc;
+	
 	return (int) IPC_GET_ARG1(answer);
 }
@@ -220,4 +222,25 @@
 {
 	return _open(path, L_FILE, oflag);
+}
+
+int open_node(fs_node_t *node, int oflag)
+{
+	futex_down(&vfs_phone_futex);
+	async_serialize_start();
+	vfs_connect();
+	
+	ipc_call_t answer;
+	aid_t req = async_send_4(vfs_phone, VFS_OPEN_NODE, node->fs_handle,
+	    node->dev_handle, node->index, oflag, &answer);
+	
+	ipcarg_t rc;
+	async_wait_for(req, &rc);
+	async_serialize_end();
+	futex_up(&vfs_phone_futex);
+	
+	if (rc != EOK)
+	    return (int) rc;
+	
+	return (int) IPC_GET_ARG1(answer);
 }
 
@@ -290,4 +313,62 @@
 	else
 		return -1;
+}
+
+int fd_phone(int fildes)
+{
+	futex_down(&vfs_phone_futex);
+	async_serialize_start();
+	vfs_connect();
+	
+	ipcarg_t device;
+	ipcarg_t rc = async_req_1_1(vfs_phone, VFS_DEVICE, fildes, &device);
+	
+	async_serialize_end();
+	futex_up(&vfs_phone_futex);
+	
+	if (rc != EOK)
+		return -1;
+	
+	return devmap_device_connect((dev_handle_t) device, 0);
+}
+
+void fd_node(int fildes, fs_node_t *node)
+{
+	futex_down(&vfs_phone_futex);
+	async_serialize_start();
+	vfs_connect();
+	
+	ipcarg_t fs_handle;
+	ipcarg_t dev_handle;
+	ipcarg_t index;
+	ipcarg_t rc = async_req_1_3(vfs_phone, VFS_NODE, fildes, &fs_handle,
+	    &dev_handle, &index);
+	
+	async_serialize_end();
+	futex_up(&vfs_phone_futex);
+	
+	if (rc == EOK) {
+		node->fs_handle = (fs_handle_t) fs_handle;
+		node->dev_handle = (dev_handle_t) dev_handle;
+		node->index = (fs_index_t) index;
+	} else {
+		node->fs_handle = 0;
+		node->dev_handle = 0;
+		node->index = 0;
+	}
+}
+
+int fsync(int fildes)
+{
+	futex_down(&vfs_phone_futex);
+	async_serialize_start();
+	vfs_connect();
+	
+	ipcarg_t rc = async_req_1_0(vfs_phone, VFS_SYNC, fildes);
+	
+	async_serialize_end();
+	futex_up(&vfs_phone_futex);
+	
+	return (int) rc;
 }
 
@@ -387,5 +468,5 @@
 	futex_up(&vfs_phone_futex);
 	free(pa);
-	return rc; 
+	return rc;
 }
 
@@ -417,5 +498,5 @@
 	futex_up(&vfs_phone_futex);
 	free(pa);
-	return rc; 
+	return rc;
 }
 
