Index: uspace/app/bdsh/cmds/modules/bdd/bdd.c
===================================================================
--- uspace/app/bdsh/cmds/modules/bdd/bdd.c	(revision af65b727b2d309464d7cc25a7ce3ad5dc5afbdbc)
+++ uspace/app/bdsh/cmds/modules/bdd/bdd.c	(revision 1fbe064b3b6175ba2c4ce86e56eb782cca0c3191)
@@ -103,5 +103,5 @@
 	}
 
-	rc = block_cache_init(handle, BLOCK_SIZE, 2);
+	rc = block_cache_init(handle, BLOCK_SIZE, 2, CACHE_MODE_WB);
 	if (rc != EOK) {
 		printf("Error: could not init block cache.\n");
Index: uspace/lib/libblock/libblock.c
===================================================================
--- uspace/lib/libblock/libblock.c	(revision af65b727b2d309464d7cc25a7ce3ad5dc5afbdbc)
+++ uspace/lib/libblock/libblock.c	(revision 1fbe064b3b6175ba2c4ce86e56eb782cca0c3191)
@@ -66,4 +66,5 @@
 	hash_table_t block_hash;
 	link_t free_head;
+	enum cache_mode mode;
 } cache_t;
 
@@ -80,4 +81,7 @@
 } devcon_t;
 
+static int write_block(devcon_t *devcon, bn_t boff, size_t block_size,
+    const void *src);
+
 static devcon_t *devcon_search(dev_handle_t dev_handle)
 {
@@ -251,5 +255,6 @@
 };
 
-int block_cache_init(dev_handle_t dev_handle, size_t size, unsigned blocks)
+int block_cache_init(dev_handle_t dev_handle, size_t size, unsigned blocks,
+    enum cache_mode mode)
 {
 	devcon_t *devcon = devcon_search(dev_handle);
@@ -267,4 +272,5 @@
 	cache->block_size = size;
 	cache->block_count = blocks;
+	cache->mode = mode;
 
 	if (!hash_table_create(&cache->block_hash, CACHE_BUCKETS, 1,
@@ -414,4 +420,5 @@
 	devcon_t *devcon = devcon_search(block->dev_handle);
 	cache_t *cache;
+	int rc;
 
 	assert(devcon);
@@ -427,4 +434,11 @@
 		 */
 		list_append(&block->free_link, &cache->free_head);
+		if (cache->mode != CACHE_MODE_WB && block->dirty) {
+			rc = write_block(devcon, block->boff, block->size,
+			    block->data);
+			assert(rc == EOK);
+
+			block->dirty = false;
+		}
 	}
 	fibril_mutex_unlock(&block->lock);
@@ -491,4 +505,30 @@
 }
 
+/** Write block to block device.
+ *
+ * @param devcon	Device connection.
+ * @param boff		Block index.
+ * @param block_size	Block size.
+ * @param src		Buffer containing the data to write.
+ *
+ * @return		EOK on success or negative error code on failure.
+ */
+static int write_block(devcon_t *devcon, bn_t boff, size_t block_size,
+    const void *src)
+{
+	ipcarg_t retval;
+	int rc;
+
+	assert(devcon);
+	memcpy(devcon->com_area, src, block_size);
+	
+	rc = async_req_2_1(devcon->dev_phone, BD_WRITE_BLOCK,
+	    boff, block_size, &retval);
+	if ((rc != EOK) || (retval != EOK))
+		return (rc != EOK ? rc : (int) retval);
+
+	return EOK;
+}
+
 /** @}
  */
Index: uspace/lib/libblock/libblock.h
===================================================================
--- uspace/lib/libblock/libblock.h	(revision af65b727b2d309464d7cc25a7ce3ad5dc5afbdbc)
+++ uspace/lib/libblock/libblock.h	(revision 1fbe064b3b6175ba2c4ce86e56eb782cca0c3191)
@@ -85,4 +85,12 @@
 } block_t;
 
+/** Caching mode */
+enum cache_mode {
+	/** Write-Through */
+	CACHE_MODE_WT,
+	/** Write-Back */
+	CACHE_MODE_WB
+};
+
 extern int block_init(dev_handle_t, size_t);
 extern void block_fini(dev_handle_t);
@@ -91,5 +99,5 @@
 extern void *block_bb_get(dev_handle_t);
 
-extern int block_cache_init(dev_handle_t, size_t, unsigned);
+extern int block_cache_init(dev_handle_t, size_t, unsigned, enum cache_mode);
 
 extern block_t *block_get(dev_handle_t, bn_t, int flags);
Index: uspace/srv/fs/fat/fat_ops.c
===================================================================
--- uspace/srv/fs/fat/fat_ops.c	(revision af65b727b2d309464d7cc25a7ce3ad5dc5afbdbc)
+++ uspace/srv/fs/fat/fat_ops.c	(revision 1fbe064b3b6175ba2c4ce86e56eb782cca0c3191)
@@ -771,4 +771,5 @@
 {
 	dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);
+	enum cache_mode cmode;
 	fat_bs_t *bs;
 	uint16_t bps;
@@ -798,4 +799,10 @@
 	opts[size] = '\0';
 
+	/* Check for option enabling write through. */
+	if (str_cmp(opts, "wtcache") == 0)
+		cmode = CACHE_MODE_WT;
+	else
+		cmode = CACHE_MODE_WB;
+
 	/* initialize libblock */
 	rc = block_init(dev_handle, BS_SIZE);
@@ -827,5 +834,5 @@
 
 	/* Initialize the block cache */
-	rc = block_cache_init(dev_handle, bps, 0 /* XXX */);
+	rc = block_cache_init(dev_handle, bps, 0 /* XXX */, cmode);
 	if (rc != EOK) {
 		block_fini(dev_handle);
