Index: uspace/lib/c/generic/bd.c
===================================================================
--- uspace/lib/c/generic/bd.c	(revision 1c635d6076d5ecbddc9b9e9a97d69324a6d97b18)
+++ uspace/lib/c/generic/bd.c	(revision 07e28f85b1f999b56eed801d80fd58294df652a4)
@@ -150,4 +150,15 @@
 }
 
+int bd_sync_cache(bd_t *bd, aoff64_t ba, size_t cnt)
+{
+	async_exch_t *exch = async_exchange_begin(bd->sess);
+
+	int rc = async_req_3_0(exch, BD_SYNC_CACHE, LOWER32(ba),
+	    UPPER32(ba), cnt);
+	async_exchange_end(exch);
+
+	return rc;
+}
+
 int bd_get_block_size(bd_t *bd, size_t *rbsize)
 {
Index: uspace/lib/c/generic/bd_srv.c
===================================================================
--- uspace/lib/c/generic/bd_srv.c	(revision 1c635d6076d5ecbddc9b9e9a97d69324a6d97b18)
+++ uspace/lib/c/generic/bd_srv.c	(revision 07e28f85b1f999b56eed801d80fd58294df652a4)
@@ -128,4 +128,23 @@
 }
 
+static void bd_sync_cache_srv(bd_srv_t *srv, ipc_callid_t callid,
+    ipc_call_t *call)
+{
+	aoff64_t ba;
+	size_t cnt;
+	int rc;
+
+	ba = MERGE_LOUP32(IPC_GET_ARG1(*call), IPC_GET_ARG2(*call));
+	cnt = IPC_GET_ARG3(*call);
+
+	if (srv->srvs->ops->sync_cache == NULL) {
+		async_answer_0(callid, ENOTSUP);
+		return;
+	}
+
+	rc = srv->srvs->ops->sync_cache(srv, ba, cnt);
+	async_answer_0(callid, rc);
+}
+
 static void bd_write_blocks_srv(bd_srv_t *srv, ipc_callid_t callid,
     ipc_call_t *call)
@@ -244,4 +263,7 @@
 			bd_read_toc_srv(srv, callid, &call);
 			break;
+		case BD_SYNC_CACHE:
+			bd_sync_cache_srv(srv, callid, &call);
+			break;
 		case BD_WRITE_BLOCKS:
 			bd_write_blocks_srv(srv, callid, &call);
