Index: uspace/lib/libblock/libblock.c
===================================================================
--- uspace/lib/libblock/libblock.c	(revision 4e1b57de0f1631729b8907befb57c677fd2d06d4)
+++ 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;
+}
+
 /** @}
  */
