Index: uspace/srv/vfs/vfs.h
===================================================================
--- uspace/srv/vfs/vfs.h	(revision 8b65e5477a0b0f3212ff4ec991e53d3ab063eb6c)
+++ uspace/srv/vfs/vfs.h	(revision 2a827f43a1e6f7d7d4ce89fc379f7c3cb2b739d8)
@@ -192,4 +192,5 @@
 
 extern vfs_file_t *vfs_file_get(int);
+extern void vfs_file_put(vfs_file_t *);
 extern int vfs_fd_assign(vfs_file_t *, int);
 extern int vfs_fd_alloc(bool desc);
Index: uspace/srv/vfs/vfs_file.c
===================================================================
--- uspace/srv/vfs/vfs_file.c	(revision 8b65e5477a0b0f3212ff4ec991e53d3ab063eb6c)
+++ uspace/srv/vfs/vfs_file.c	(revision 2a827f43a1e6f7d7d4ce89fc379f7c3cb2b739d8)
@@ -258,4 +258,5 @@
 	if ((fd >= 0) && (fd < MAX_OPEN_FILES)) {
 		vfs_file_t *file = FILES[fd];
+		vfs_file_addref(file);
 		fibril_mutex_unlock(&VFS_DATA->lock);
 		return file;
@@ -266,4 +267,15 @@
 }
 
+/** Stop using a file structure.
+ *
+ * @param file		VFS file structure.
+ */
+void vfs_file_put(vfs_file_t *file)
+{
+	fibril_mutex_lock(&VFS_DATA->lock);
+	vfs_file_delref(file);
+	fibril_mutex_unlock(&VFS_DATA->lock);
+}
+
 /**
  * @}
Index: uspace/srv/vfs/vfs_ops.c
===================================================================
--- uspace/srv/vfs/vfs_ops.c	(revision 8b65e5477a0b0f3212ff4ec991e53d3ab063eb6c)
+++ uspace/srv/vfs/vfs_ops.c	(revision 2a827f43a1e6f7d7d4ce89fc379f7c3cb2b739d8)
@@ -604,4 +604,5 @@
 	vfs_node_addref(node);
 	vfs_node_put(node);
+	vfs_file_put(file);
 	
 	/* Success! Return the new file descriptor to the client. */
@@ -676,4 +677,5 @@
 	vfs_node_addref(node);
 	vfs_node_put(node);
+	vfs_file_put(file);
 	
 	/* Success! Return the new file descriptor to the client. */
@@ -711,5 +713,6 @@
 	vfs_release_phone(file->node->fs_handle, fs_phone);
 	fibril_mutex_unlock(&file->lock);
-	
+
+	vfs_file_put(file);
 	ipc_answer_0(rid, rc);
 }
@@ -765,4 +768,5 @@
 		ipc_answer_0(rid, ret);
 	
+	vfs_file_put(file);
 	ret = vfs_fd_free(fd);
 	ipc_answer_0(rid, ret);
@@ -865,5 +869,6 @@
 		file->pos += bytes;
 	fibril_mutex_unlock(&file->lock);
-	
+	vfs_file_put(file);	
+
 	/*
 	 * FS server's reply is the final result of the whole operation we
@@ -905,4 +910,5 @@
 			file->pos = (aoff64_t) off;
 			fibril_mutex_unlock(&file->lock);
+			vfs_file_put(file);
 			ipc_answer_1(rid, EOK, off);
 			return;
@@ -912,4 +918,5 @@
 		if ((off >= 0) && (file->pos + off < file->pos)) {
 			fibril_mutex_unlock(&file->lock);
+			vfs_file_put(file);
 			ipc_answer_0(rid, EOVERFLOW);
 			return;
@@ -918,4 +925,5 @@
 		if ((off < 0) && (file->pos < (aoff64_t) -off)) {
 			fibril_mutex_unlock(&file->lock);
+			vfs_file_put(file);
 			ipc_answer_0(rid, EOVERFLOW);
 			return;
@@ -926,4 +934,5 @@
 		
 		fibril_mutex_unlock(&file->lock);
+		vfs_file_put(file);
 		ipc_answer_2(rid, EOK, LOWER32(newoff),
 		    UPPER32(newoff));
@@ -936,4 +945,5 @@
 			fibril_rwlock_read_unlock(&file->node->contents_rwlock);
 			fibril_mutex_unlock(&file->lock);
+			vfs_file_put(file);
 			ipc_answer_0(rid, EOVERFLOW);
 			return;
@@ -943,4 +953,5 @@
 			fibril_rwlock_read_unlock(&file->node->contents_rwlock);
 			fibril_mutex_unlock(&file->lock);
+			vfs_file_put(file);
 			ipc_answer_0(rid, EOVERFLOW);
 			return;
@@ -952,4 +963,5 @@
 		fibril_rwlock_read_unlock(&file->node->contents_rwlock);
 		fibril_mutex_unlock(&file->lock);
+		vfs_file_put(file);
 		ipc_answer_2(rid, EOK, LOWER32(newoff), UPPER32(newoff));
 		return;
@@ -957,4 +969,5 @@
 	
 	fibril_mutex_unlock(&file->lock);
+	vfs_file_put(file);
 	ipc_answer_0(rid, EINVAL);
 }
@@ -995,4 +1008,5 @@
 
 	fibril_mutex_unlock(&file->lock);
+	vfs_file_put(file);
 	ipc_answer_0(rid, (sysarg_t)rc);
 }
@@ -1011,4 +1025,5 @@
 	ipc_callid_t callid;
 	if (!async_data_read_receive(&callid, NULL)) {
+		vfs_file_put(file);
 		ipc_answer_0(callid, EINVAL);
 		ipc_answer_0(rid, EINVAL);
@@ -1028,4 +1043,5 @@
 
 	fibril_mutex_unlock(&file->lock);
+	vfs_file_put(file);
 	ipc_answer_0(rid, rc);
 }
@@ -1329,14 +1345,14 @@
 	int newfd = IPC_GET_ARG2(*request);
 	
+	/* If the file descriptors are the same, do nothing. */
+	if (oldfd == newfd) {
+		ipc_answer_1(rid, EOK, newfd);
+		return;
+	}
+	
 	/* Lookup the file structure corresponding to oldfd. */
 	vfs_file_t *oldfile = vfs_file_get(oldfd);
 	if (!oldfile) {
 		ipc_answer_0(rid, EBADF);
-		return;
-	}
-	
-	/* If the file descriptors are the same, do nothing. */
-	if (oldfd == newfd) {
-		ipc_answer_1(rid, EOK, newfd);
 		return;
 	}
@@ -1355,4 +1371,6 @@
 		if (ret != EOK) {
 			fibril_mutex_unlock(&oldfile->lock);
+			vfs_file_put(oldfile);
+			vfs_file_put(newfile);
 			ipc_answer_0(rid, ret);
 			return;
@@ -1362,7 +1380,10 @@
 		if (ret != EOK) {
 			fibril_mutex_unlock(&oldfile->lock);
+			vfs_file_put(oldfile);
+			vfs_file_put(newfile);
 			ipc_answer_0(rid, ret);
 			return;
 		}
+		vfs_file_put(newfile);
 	}
 	
@@ -1370,4 +1391,5 @@
 	int ret = vfs_fd_assign(oldfile, newfd);
 	fibril_mutex_unlock(&oldfile->lock);
+	vfs_file_put(oldfile);
 	
 	if (ret != EOK)
