Index: uspace/srv/fs/exfat/exfat_directory.c
===================================================================
--- uspace/srv/fs/exfat/exfat_directory.c	(revision 25c60f4e31eed4c7355c6d2aa86ca7f9ca81851a)
+++ uspace/srv/fs/exfat/exfat_directory.c	(revision f061de7531389d649fd3556ee8720c063b7b301c)
@@ -54,4 +54,6 @@
 	di->bnum = 0;
 	di->last = false;
+	di->fragmented = false;
+	di->firstc = 0;
 }
 
@@ -62,7 +64,22 @@
 	if (di->nodep->type != EXFAT_DIRECTORY)
 		return EINVAL;
-
-	di->bs = block_bb_get(di->nodep->idx->devmap_handle);
-	di->blocks = di->nodep->size / BPS(di->bs);
+	di->devmap_handle = nodep->idx->devmap_handle;
+	di->fragmented = nodep->fragmented;
+	di->firstc = nodep->firstc;
+
+	di->bs = block_bb_get(di->devmap_handle);
+	di->blocks = nodep->size / BPS(di->bs);
+	return EOK;
+}
+
+int exfat_directory_open_parent(exfat_directory_t *di, 
+    devmap_handle_t devmap_handle, exfat_cluster_t firstc, bool fragmented)
+{
+	exfat_directory_init(di);
+	di->devmap_handle = devmap_handle;
+	di->fragmented = fragmented;
+	di->firstc = firstc;
+	di->bs = block_bb_get(devmap_handle);
+	di->blocks = 0;
 	return EOK;
 }
@@ -84,20 +101,25 @@
 
 	i = (di->pos * sizeof(exfat_dentry_t)) / BPS(di->bs);
-	if (i < di->blocks) {
-		if (di->b && di->bnum != i) {
-			block_put(di->b);
+	if (di->nodep && (i >= di->blocks))
+		return ENOENT;
+
+	if (di->b && di->bnum != i) {
+		block_put(di->b);
+		di->b = NULL;
+	}
+	if (!di->b) {
+		if (di->nodep) {
+			rc = exfat_block_get(&di->b, di->bs, di->nodep, i, BLOCK_FLAGS_NONE);
+		} else {
+			rc = exfat_block_get_by_clst(&di->b, di->bs, di->devmap_handle,
+			    di->fragmented, di->firstc, NULL, i, BLOCK_FLAGS_NONE);
+		}
+		if (rc != EOK) {
 			di->b = NULL;
+			return rc;
 		}
-		if (!di->b) {
-			rc = exfat_block_get(&di->b, di->bs, di->nodep, i, BLOCK_FLAGS_NONE);
-			if (rc != EOK) {
-				di->b = NULL;
-				return rc;
-			}
-			di->bnum = i;
-		}
-		return EOK;
-	}
-	return ENOENT;
+		di->bnum = i;
+	}
+	return EOK;
 }
 
Index: uspace/srv/fs/exfat/exfat_directory.h
===================================================================
--- uspace/srv/fs/exfat/exfat_directory.h	(revision 25c60f4e31eed4c7355c6d2aa86ca7f9ca81851a)
+++ uspace/srv/fs/exfat/exfat_directory.h	(revision f061de7531389d649fd3556ee8720c063b7b301c)
@@ -36,4 +36,5 @@
 #include <stdint.h>
 #include "exfat.h"
+#include "exfat_fat.h"
 #include "exfat_dentry.h"
 
@@ -42,4 +43,5 @@
 	exfat_bs_t *bs;
 	exfat_node_t *nodep;
+	devmap_handle_t devmap_handle;
 	uint32_t blocks;
 	uint32_t bnum;
@@ -47,4 +49,6 @@
 	block_t *b;
 	bool last;
+	bool fragmented;
+	exfat_cluster_t firstc;
 } __attribute__ ((packed)) exfat_directory_t;
 
@@ -52,4 +56,6 @@
 extern void exfat_directory_init(exfat_directory_t *di);
 extern int exfat_directory_open(exfat_node_t *nodep, exfat_directory_t *di);
+extern int exfat_directory_open_parent(exfat_directory_t *di, 
+    devmap_handle_t devmap_handle, exfat_cluster_t firstc, bool fragmented);
 extern int exfat_directory_close(exfat_directory_t *di);
 
Index: uspace/srv/fs/exfat/exfat_ops.c
===================================================================
--- uspace/srv/fs/exfat/exfat_ops.c	(revision 25c60f4e31eed4c7355c6d2aa86ca7f9ca81851a)
+++ uspace/srv/fs/exfat/exfat_ops.c	(revision f061de7531389d649fd3556ee8720c063b7b301c)
@@ -112,5 +112,35 @@
 static int exfat_node_sync(exfat_node_t *node)
 {
-	/* TODO */
+//	block_t *b;
+//	exfat_bs_t *bs;
+//	fat_dentry_t *d;
+//	int rc;
+
+//	assert(node->dirty);
+
+//	bs = block_bb_get(node->idx->devmap_handle);
+
+	/* Read the block that contains the dentry of interest. */
+/*
+	rc = _fat_block_get(&b, bs, node->idx->devmap_handle, node->idx->pfc,
+	    NULL, (node->idx->pdi * sizeof(fat_dentry_t)) / BPS(bs),
+	    BLOCK_FLAGS_NONE);
+	if (rc != EOK)
+		return rc;
+
+	d = ((fat_dentry_t *)b->data) + (node->idx->pdi % DPS(bs));
+
+	d->firstc = host2uint16_t_le(node->firstc);
+	if (node->type == FAT_FILE) {
+		d->size = host2uint32_t_le(node->size);
+	} else if (node->type == FAT_DIRECTORY) {
+		d->attr = FAT_ATTR_SUBDIR;
+	}
+*/
+	/* TODO: update other fields? (e.g time fields) */
+
+//	b->dirty = true;		/* need to sync block */
+//	rc = block_put(b);
+//	return rc;
 	return EOK;
 }
@@ -366,5 +396,4 @@
 
 	if (nodep->fragmented) {
-		/* TODO */
 		rc = bitmap_append_clusters(bs, nodep, clusters);
 		if (rc != ENOSPC)
@@ -406,5 +435,4 @@
 
 	if (nodep->fragmented) {
-		/* TODO */
 		exfat_cluster_t clsts, prev_clsts, new_clsts;
 		prev_clsts = ROUND_UP(nodep->size, BPC(bs)) / BPC(bs);
@@ -414,5 +442,4 @@
 
 		clsts = prev_clsts - new_clsts;
-		
 		rc = bitmap_free_clusters(bs, nodep, clsts);
 		if (rc != EOK)
@@ -688,6 +715,4 @@
 	 * dentry data is kept in the child node structure.
 	 */
-
-	/* TODO */
 	rc = exfat_directory_write_file(&di, name);
 	if (rc!=EOK)
@@ -897,12 +922,19 @@
 	printf("Sectors per cluster: %d\n", SPC(bs));
 	printf("KBytes per cluster: %d\n", SPC(bs)*BPS(bs)/1024);
-	
+
+	/* bitmap_set_cluster(bs, devmap_handle, 9); */
+	/* bitmap_clear_cluster(bs, devmap_handle, 9); */
+
 	int i, rc;
 	exfat_cluster_t clst;
-	for (i=0; i<6; i++) {
+	for (i=0; i<=10; i++) {
 		rc = exfat_get_cluster(bs, devmap_handle, i, &clst);
 		if (rc != EOK)
 			return;
-		printf("Clst %d: %x\n", i, clst);
+		printf("Clst %d: %x", i, clst);
+		if (i>=2)
+			printf(", Bitmap: %d\n", bitmap_is_free(bs, devmap_handle, i)!=EOK);
+		else
+			printf("\n");
 	}
 }
