Index: uspace/lib/c/generic/vfs/vfs.c
===================================================================
--- uspace/lib/c/generic/vfs/vfs.c	(revision b1b1891d9751df01c489eaf2296e7e543ec7e08c)
+++ uspace/lib/c/generic/vfs/vfs.c	(revision bf9dc4e2a497f5d183351f2b788ef6d7723ba6cf)
@@ -388,4 +388,6 @@
 }
 
+// TODO: Versioning for read.
+
 ssize_t read(int fildes, void *buf, size_t nbyte) 
 {
@@ -665,44 +667,45 @@
 }
 
-static int _unlink(const char *path, int lflag)
+static int _vfs_unlink2(int parent, const char *path, int expect, int wflag)
 {
 	sysarg_t rc;
 	aid_t req;
 	
+	async_exch_t *exch = vfs_exchange_begin();
+	
+	req = async_send_3(exch, VFS_IN_UNLINK2, parent, expect, wflag, NULL);
+	rc = async_data_write_start(exch, path, str_size(path));
+	
+	vfs_exchange_end(exch);
+	
+	sysarg_t rc_orig;
+	async_wait_for(req, &rc_orig);
+	
+	if (rc_orig != EOK) {
+		return (int) rc_orig;
+	}
+	return rc;
+}
+
+int unlink(const char *path)
+{
 	size_t pa_size;
 	char *pa = absolutize(path, &pa_size);
-	if (!pa)
+	if (!pa) {
 		return ENOMEM;
-	
-	async_exch_t *exch = vfs_exchange_begin();
-	
-	req = async_send_1(exch, VFS_IN_UNLINK, lflag, NULL);
-	rc = async_data_write_start(exch, pa, pa_size);
-	if (rc != EOK) {
-		vfs_exchange_end(exch);
-		free(pa);
-
-		sysarg_t rc_orig;
-		async_wait_for(req, &rc_orig);
-
-		if (rc_orig == EOK)
-			return (int) rc;
-		else
-			return (int) rc_orig;
-	}
-	vfs_exchange_end(exch);
-	free(pa);
-	async_wait_for(req, &rc);
-	return rc;
-}
-
-int unlink(const char *path)
-{
-	return _unlink(path, L_NONE);
+	}
+	
+	return _vfs_unlink2(-1, pa, -1, 0);
 }
 
 int rmdir(const char *path)
 {
-	return _unlink(path, L_DIRECTORY);
+	size_t pa_size;
+	char *pa = absolutize(path, &pa_size);
+	if (!pa) {
+		return ENOMEM;
+	}
+	
+	return _vfs_unlink2(-1, pa, -1, WALK_DIRECTORY);
 }
 
