Index: uspace/srv/vfs/Makefile
===================================================================
--- uspace/srv/vfs/Makefile	(revision af0ff9b21ecdf63555517440fea522aec0690fff)
+++ uspace/srv/vfs/Makefile	(revision 2f3a594ec4c4fdd2937c8d7e51ff8b7c3a44bced)
@@ -45,5 +45,6 @@
 	vfs_register.c \
 	vfs_lookup.c \
-	vfs_mount.c
+	vfs_mount.c \
+	vfs_open.c
 
 OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
Index: uspace/srv/vfs/vfs.c
===================================================================
--- uspace/srv/vfs/vfs.c	(revision af0ff9b21ecdf63555517440fea522aec0690fff)
+++ uspace/srv/vfs/vfs.c	(revision 2f3a594ec4c4fdd2937c8d7e51ff8b7c3a44bced)
@@ -57,4 +57,12 @@
 
 	/*
+	 * Initialize the table of open files.
+	 */
+	if (!vfs_conn_open_files_init()) {
+		ipc_answer_fast(iid, ENOMEM, 0, 0);
+		return;
+	}
+
+	/*
 	 * The connection was opened via the IPC_CONNECT_ME_TO call.
 	 * This call needs to be answered.
@@ -65,11 +73,11 @@
 	 * Here we enter the main connection fibril loop.
 	 * The logic behind this loop and the protocol is that we'd like to keep
-	 * each connection open for a while before we close it. The benefit of
-	 * this is that the client doesn't have to establish a new connection
-	 * upon each request.  On the other hand, the client must be ready to
-	 * re-establish a connection if we hang it up due to reaching of maximum
-	 * number of requests per connection or due to the client timing out.
+	 * each connection open until the client hangs up. When the client hangs
+	 * up, we will free its VFS state. The act of hanging up the connection
+	 * by the client is equivalent to client termination because we cannot
+	 * distinguish one from the other. On the other hand, the client can
+	 * hang up arbitrarily if it has no open files and reestablish the
+	 * connection later.
 	 */
-	 
 	while (keep_on_going) {
 		ipc_callid_t callid;
@@ -86,5 +94,4 @@
 		case VFS_REGISTER:
 			vfs_register(callid, &call);
-			keep_on_going = false;
 			break;
 		case VFS_MOUNT:
Index: uspace/srv/vfs/vfs.h
===================================================================
--- uspace/srv/vfs/vfs.h	(revision af0ff9b21ecdf63555517440fea522aec0690fff)
+++ uspace/srv/vfs/vfs.h	(revision 2f3a594ec4c4fdd2937c8d7e51ff8b7c3a44bced)
@@ -153,6 +153,11 @@
 extern int vfs_lookup_internal(char *, size_t, vfs_node_t *, vfs_node_t *);
 
+#define MAX_OPEN_FILES	128	
+
+extern bool vfs_conn_open_files_init(void);
+
 extern void vfs_register(ipc_callid_t, ipc_call_t *);
 extern void vfs_mount(ipc_callid_t, ipc_call_t *);
+extern void vfs_open(ipc_callid_t, ipc_call_t *);
 
 #endif
Index: uspace/srv/vfs/vfs_open.c
===================================================================
--- uspace/srv/vfs/vfs_open.c	(revision 2f3a594ec4c4fdd2937c8d7e51ff8b7c3a44bced)
+++ uspace/srv/vfs/vfs_open.c	(revision 2f3a594ec4c4fdd2937c8d7e51ff8b7c3a44bced)
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2007 Jakub Jermar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup fs
+ * @{
+ */ 
+
+/**
+ * @file	vfs.c
+ * @brief	VFS_OPEN method.
+ */
+
+#include <ipc/ipc.h>
+#include <async.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <bool.h>
+#include <futex.h>
+#include <libadt/list.h>
+#include "vfs.h"
+
+/**
+ * This is a per-connection table of open files.
+ * Our assumption is that each client opens only one connection and therefore
+ * there is one table of open files per task. However, this may not be the case
+ * and the client can open more connections to VFS. In that case, there will be
+ * several tables and several file handle name spaces per task. Besides of this,
+ * the functionality will stay unchanged. So unless the client knows what it is
+ * doing, it should open one connection to VFS only.
+ */
+__thread vfs_file_t files[MAX_OPEN_FILES];
+
+/** Initialize the table of open files. */
+bool vfs_conn_open_files_init(void)
+{
+	memset(files, 0, MAX_OPEN_FILES * sizeof(vfs_file_t));
+	return true;
+}
+
+void vfs_open(ipc_callid_t rid, ipc_call_t *request)
+{
+}
+
+/**
+ * @}
+ */ 
