Index: uspace/srv/bd/hr/hr.c
===================================================================
--- uspace/srv/bd/hr/hr.c	(revision 49da04407e5900013a273fd9ee22ded0a7af5acb)
+++ uspace/srv/bd/hr/hr.c	(revision da80de9a46399f701d6045204c960aec68108ea6)
@@ -376,5 +376,5 @@
 	fibril_rwlock_read_unlock(&vol->extents_lock);
 
-	vol->hr_ops.state_event(vol);
+	vol->hr_ops.vol_state_eval(vol);
 
 	async_answer_0(icall, EOK);
Index: uspace/srv/bd/hr/io.c
===================================================================
--- uspace/srv/bd/hr/io.c	(revision 49da04407e5900013a273fd9ee22ded0a7af5acb)
+++ uspace/srv/bd/hr/io.c	(revision da80de9a46399f701d6045204c960aec68108ea6)
@@ -60,5 +60,5 @@
 	 */
 	if (rc != EOK && (rc != ENOMEM || io->type == HR_BD_WRITE))
-		io->vol->state_callback(io->vol, io->extent, rc);
+		io->vol->hr_ops.ext_state_cb(io->vol, io->extent, rc);
 
 	return rc;
Index: uspace/srv/bd/hr/metadata/native.c
===================================================================
--- uspace/srv/bd/hr/metadata/native.c	(revision 49da04407e5900013a273fd9ee22ded0a7af5acb)
+++ uspace/srv/bd/hr/metadata/native.c	(revision da80de9a46399f701d6045204c960aec68108ea6)
@@ -389,5 +389,5 @@
 		rc = meta_native_write_block(ext->svc_id, md_block);
 		if (with_state_callback && rc != EOK)
-			vol->state_callback(vol, i, rc);
+			vol->hr_ops.ext_state_cb(vol, i, rc);
 	}
 
@@ -397,5 +397,5 @@
 
 	if (with_state_callback)
-		vol->hr_ops.state_event(vol);
+		vol->hr_ops.vol_state_eval(vol);
 
 	free(md_block);
Index: uspace/srv/bd/hr/raid0.c
===================================================================
--- uspace/srv/bd/hr/raid0.c	(revision 49da04407e5900013a273fd9ee22ded0a7af5acb)
+++ uspace/srv/bd/hr/raid0.c	(revision da80de9a46399f701d6045204c960aec68108ea6)
@@ -53,6 +53,4 @@
 #include "var.h"
 
-static void hr_raid0_update_vol_state(hr_volume_t *);
-static void hr_raid0_state_callback(hr_volume_t *, size_t, errno_t);
 static errno_t hr_raid0_bd_op(hr_bd_op_type_t, bd_srv_t *, aoff64_t, size_t,
     void *, const void *, size_t);
@@ -92,5 +90,5 @@
 	}
 
-	hr_raid0_update_vol_state(new_volume);
+	hr_raid0_vol_state_eval(new_volume);
 	if (new_volume->state != HR_VOL_ONLINE) {
 		HR_NOTE("\"%s\": unusable state, not creating\n",
@@ -103,6 +101,4 @@
 	new_volume->hr_bds.sarg = new_volume;
 
-	new_volume->state_callback = hr_raid0_state_callback;
-
 	return EOK;
 }
@@ -130,68 +126,8 @@
 }
 
-void hr_raid0_state_event(hr_volume_t *vol)
-{
-	HR_DEBUG("%s()", __func__);
-
-	hr_raid0_update_vol_state(vol);
-}
-
-static errno_t hr_raid0_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
-{
-	HR_DEBUG("%s()", __func__);
-
-	hr_volume_t *vol = bd->srvs->sarg;
-
-	atomic_fetch_add_explicit(&vol->open_cnt, 1, memory_order_relaxed);
-
-	return EOK;
-}
-
-static errno_t hr_raid0_bd_close(bd_srv_t *bd)
-{
-	HR_DEBUG("%s()", __func__);
-
-	hr_volume_t *vol = bd->srvs->sarg;
-
-	atomic_fetch_sub_explicit(&vol->open_cnt, 1, memory_order_relaxed);
-
-	return EOK;
-}
-
-static errno_t hr_raid0_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt)
-{
-	return hr_raid0_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0);
-}
-
-static errno_t hr_raid0_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
-    void *buf, size_t size)
-{
-	return hr_raid0_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size);
-}
-
-static errno_t hr_raid0_bd_write_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
-    const void *data, size_t size)
-{
-	return hr_raid0_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size);
-}
-
-static errno_t hr_raid0_bd_get_block_size(bd_srv_t *bd, size_t *rsize)
-{
-	hr_volume_t *vol = bd->srvs->sarg;
-
-	*rsize = vol->bsize;
-	return EOK;
-}
-
-static errno_t hr_raid0_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb)
-{
-	hr_volume_t *vol = bd->srvs->sarg;
-
-	*rnb = vol->data_blkno;
-	return EOK;
-}
-
-static void hr_raid0_update_vol_state(hr_volume_t *vol)
-{
+void hr_raid0_vol_state_eval(hr_volume_t *vol)
+{
+	HR_DEBUG("%s()", __func__);
+
 	fibril_mutex_lock(&vol->md_lock);
 
@@ -226,6 +162,8 @@
 }
 
-static void hr_raid0_state_callback(hr_volume_t *vol, size_t extent, errno_t rc)
-{
+void hr_raid0_ext_state_cb(hr_volume_t *vol, size_t extent, errno_t rc)
+{
+	HR_DEBUG("%s()", __func__);
+
 	if (rc == EOK)
 		return;
@@ -246,7 +184,64 @@
 }
 
+static errno_t hr_raid0_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
+{
+	HR_DEBUG("%s()", __func__);
+
+	hr_volume_t *vol = bd->srvs->sarg;
+
+	atomic_fetch_add_explicit(&vol->open_cnt, 1, memory_order_relaxed);
+
+	return EOK;
+}
+
+static errno_t hr_raid0_bd_close(bd_srv_t *bd)
+{
+	HR_DEBUG("%s()", __func__);
+
+	hr_volume_t *vol = bd->srvs->sarg;
+
+	atomic_fetch_sub_explicit(&vol->open_cnt, 1, memory_order_relaxed);
+
+	return EOK;
+}
+
+static errno_t hr_raid0_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt)
+{
+	return hr_raid0_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0);
+}
+
+static errno_t hr_raid0_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
+    void *buf, size_t size)
+{
+	return hr_raid0_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size);
+}
+
+static errno_t hr_raid0_bd_write_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
+    const void *data, size_t size)
+{
+	return hr_raid0_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size);
+}
+
+static errno_t hr_raid0_bd_get_block_size(bd_srv_t *bd, size_t *rsize)
+{
+	hr_volume_t *vol = bd->srvs->sarg;
+
+	*rsize = vol->bsize;
+	return EOK;
+}
+
+static errno_t hr_raid0_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb)
+{
+	hr_volume_t *vol = bd->srvs->sarg;
+
+	*rnb = vol->data_blkno;
+	return EOK;
+}
+
 static errno_t hr_raid0_bd_op(hr_bd_op_type_t type, bd_srv_t *bd, aoff64_t ba,
     size_t cnt, void *dst, const void *src, size_t size)
 {
+	HR_DEBUG("%s()", __func__);
+
 	hr_volume_t *vol = bd->srvs->sarg;
 	errno_t rc;
Index: uspace/srv/bd/hr/raid1.c
===================================================================
--- uspace/srv/bd/hr/raid1.c	(revision 49da04407e5900013a273fd9ee22ded0a7af5acb)
+++ uspace/srv/bd/hr/raid1.c	(revision da80de9a46399f701d6045204c960aec68108ea6)
@@ -56,6 +56,4 @@
 #include "var.h"
 
-static void hr_raid1_update_vol_state(hr_volume_t *);
-static void hr_raid1_ext_state_callback(hr_volume_t *, size_t, errno_t);
 static size_t hr_raid1_count_good_extents(hr_volume_t *, uint64_t, size_t,
     uint64_t);
@@ -106,9 +104,7 @@
 	new_volume->hr_bds.sarg = new_volume;
 
-	new_volume->state_callback = hr_raid1_ext_state_callback;
-
 	/* force volume state update */
 	hr_mark_vol_state_dirty(new_volume);
-	hr_raid1_update_vol_state(new_volume);
+	hr_raid1_vol_state_eval(new_volume);
 
 	fibril_rwlock_read_lock(&new_volume->states_lock);
@@ -140,11 +136,4 @@
 }
 
-void hr_raid1_state_event(hr_volume_t *vol)
-{
-	HR_DEBUG("%s()", __func__);
-
-	hr_raid1_update_vol_state(vol);
-}
-
 errno_t hr_raid1_add_hotspare(hr_volume_t *vol, service_id_t hotspare)
 {
@@ -153,66 +142,13 @@
 	errno_t rc = hr_util_add_hotspare(vol, hotspare);
 
-	hr_raid1_update_vol_state(vol);
+	hr_raid1_vol_state_eval(vol);
 
 	return rc;
 }
 
-static errno_t hr_raid1_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
-{
-	HR_DEBUG("%s()", __func__);
-
-	hr_volume_t *vol = bd->srvs->sarg;
-
-	atomic_fetch_add_explicit(&vol->open_cnt, 1, memory_order_relaxed);
-
-	return EOK;
-}
-
-static errno_t hr_raid1_bd_close(bd_srv_t *bd)
-{
-	HR_DEBUG("%s()", __func__);
-
-	hr_volume_t *vol = bd->srvs->sarg;
-
-	atomic_fetch_sub_explicit(&vol->open_cnt, 1, memory_order_relaxed);
-
-	return EOK;
-}
-
-static errno_t hr_raid1_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt)
-{
-	return hr_raid1_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0);
-}
-
-static errno_t hr_raid1_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
-    void *buf, size_t size)
-{
-	return hr_raid1_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size);
-}
-
-static errno_t hr_raid1_bd_write_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
-    const void *data, size_t size)
-{
-	return hr_raid1_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size);
-}
-
-static errno_t hr_raid1_bd_get_block_size(bd_srv_t *bd, size_t *rsize)
-{
-	hr_volume_t *vol = bd->srvs->sarg;
-
-	*rsize = vol->bsize;
-	return EOK;
-}
-
-static errno_t hr_raid1_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb)
-{
-	hr_volume_t *vol = bd->srvs->sarg;
-
-	*rnb = vol->data_blkno;
-	return EOK;
-}
-
-static void hr_raid1_update_vol_state(hr_volume_t *vol)
-{
+void hr_raid1_vol_state_eval(hr_volume_t *vol)
+{
+	HR_DEBUG("%s()", __func__);
+
 	bool exp = true;
 
@@ -271,7 +207,9 @@
 }
 
-static void hr_raid1_ext_state_callback(hr_volume_t *vol, size_t extent,
+void hr_raid1_ext_state_cb(hr_volume_t *vol, size_t extent,
     errno_t rc)
 {
+	HR_DEBUG("%s()", __func__);
+
 	if (rc == EOK)
 		return;
@@ -297,4 +235,59 @@
 }
 
+static errno_t hr_raid1_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
+{
+	HR_DEBUG("%s()", __func__);
+
+	hr_volume_t *vol = bd->srvs->sarg;
+
+	atomic_fetch_add_explicit(&vol->open_cnt, 1, memory_order_relaxed);
+
+	return EOK;
+}
+
+static errno_t hr_raid1_bd_close(bd_srv_t *bd)
+{
+	HR_DEBUG("%s()", __func__);
+
+	hr_volume_t *vol = bd->srvs->sarg;
+
+	atomic_fetch_sub_explicit(&vol->open_cnt, 1, memory_order_relaxed);
+
+	return EOK;
+}
+
+static errno_t hr_raid1_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt)
+{
+	return hr_raid1_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0);
+}
+
+static errno_t hr_raid1_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
+    void *buf, size_t size)
+{
+	return hr_raid1_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size);
+}
+
+static errno_t hr_raid1_bd_write_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
+    const void *data, size_t size)
+{
+	return hr_raid1_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size);
+}
+
+static errno_t hr_raid1_bd_get_block_size(bd_srv_t *bd, size_t *rsize)
+{
+	hr_volume_t *vol = bd->srvs->sarg;
+
+	*rsize = vol->bsize;
+	return EOK;
+}
+
+static errno_t hr_raid1_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb)
+{
+	hr_volume_t *vol = bd->srvs->sarg;
+
+	*rnb = vol->data_blkno;
+	return EOK;
+}
+
 static size_t hr_raid1_count_good_extents(hr_volume_t *vol, uint64_t ba,
     size_t cnt, uint64_t rebuild_blk)
@@ -319,4 +312,6 @@
     size_t cnt, void *data_read, const void *data_write, size_t size)
 {
+	HR_DEBUG("%s()", __func__);
+
 	hr_volume_t *vol = bd->srvs->sarg;
 	hr_range_lock_t *rl = NULL;
@@ -377,5 +372,5 @@
 
 			if (rc != EOK) {
-				hr_raid1_ext_state_callback(vol, i, rc);
+				hr_raid1_ext_state_cb(vol, i, rc);
 			} else {
 				successful++;
@@ -458,5 +453,5 @@
 	fibril_rwlock_read_unlock(&vol->extents_lock);
 
-	hr_raid1_update_vol_state(vol);
+	hr_raid1_vol_state_eval(vol);
 
 	return rc;
@@ -565,5 +560,5 @@
 	fibril_rwlock_read_unlock(&vol->extents_lock);
 
-	hr_raid1_update_vol_state(vol);
+	hr_raid1_vol_state_eval(vol);
 
 	if (buf != NULL)
@@ -690,5 +685,5 @@
 
 		if (rc != ENOMEM)
-			hr_raid1_ext_state_callback(vol, i, rc);
+			hr_raid1_ext_state_cb(vol, i, rc);
 
 		if (i + 1 >= vol->extent_no) {
@@ -705,5 +700,5 @@
 				    "because of not enough memory\n",
 				    vol->devname, vol->svc_id);
-				hr_raid1_ext_state_callback(vol, rebuild_idx,
+				hr_raid1_ext_state_cb(vol, rebuild_idx,
 				    ENOMEM);
 			}
@@ -723,5 +718,5 @@
 		 * XXX: for now we do
 		 */
-		hr_raid1_ext_state_callback(vol, rebuild_idx, rc);
+		hr_raid1_ext_state_cb(vol, rebuild_idx, rc);
 
 		HR_ERROR("rebuild on \"%s\" (%" PRIun "), failed due to "
Index: uspace/srv/bd/hr/raid5.c
===================================================================
--- uspace/srv/bd/hr/raid5.c	(revision 49da04407e5900013a273fd9ee22ded0a7af5acb)
+++ uspace/srv/bd/hr/raid5.c	(revision da80de9a46399f701d6045204c960aec68108ea6)
@@ -57,5 +57,4 @@
 static ssize_t hr_raid5_get_bad_ext(hr_volume_t *);
 static errno_t hr_raid5_update_vol_state(hr_volume_t *);
-static void hr_raid5_handle_extent_error(hr_volume_t *, size_t, errno_t);
 static void xor(void *, const void *, size_t);
 
@@ -148,5 +147,5 @@
 }
 
-void hr_raid5_state_event(hr_volume_t *vol)
+void hr_raid5_vol_state_eval(hr_volume_t *vol)
 {
 	fibril_mutex_lock(&vol->lock);
@@ -189,4 +188,13 @@
 }
 
+void hr_raid5_ext_state_cb(hr_volume_t *vol, size_t extent,
+    errno_t rc)
+{
+	if (rc == ENOENT)
+		hr_update_ext_state(vol, extent, HR_EXT_MISSING);
+	else if (rc != EOK)
+		hr_update_ext_state(vol, extent, HR_EXT_FAILED);
+}
+
 static errno_t hr_raid5_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
 {
@@ -299,13 +307,4 @@
 		return EIO;
 	}
-}
-
-static void hr_raid5_handle_extent_error(hr_volume_t *vol, size_t extent,
-    errno_t rc)
-{
-	if (rc == ENOENT)
-		hr_update_ext_state(vol, extent, HR_EXT_MISSING);
-	else if (rc != EOK)
-		hr_update_ext_state(vol, extent, HR_EXT_FAILED);
 }
 
@@ -648,5 +647,5 @@
 			goto error;
 
-		hr_raid5_handle_extent_error(vol, extent, rc);
+		hr_raid5_ext_state_cb(vol, extent, rc);
 
 		if (rc != EOK) {
@@ -802,5 +801,5 @@
 				    ba, cnt, buf);
 			if (rc != EOK) {
-				hr_raid5_handle_extent_error(vol, i, rc);
+				hr_raid5_ext_state_cb(vol, i, rc);
 				HR_ERROR("rebuild on \"%s\" (%" PRIun "), "
 				    "failed due to a failed ONLINE extent, "
@@ -818,5 +817,5 @@
 		rc = block_write_direct(rebuild_ext->svc_id, ba, cnt, xorbuf);
 		if (rc != EOK) {
-			hr_raid5_handle_extent_error(vol, bad, rc);
+			hr_raid5_ext_state_cb(vol, bad, rc);
 			HR_ERROR("rebuild on \"%s\" (%" PRIun "), failed due to "
 			    "the rebuilt extent number %zu failing\n",
Index: uspace/srv/bd/hr/util.c
===================================================================
--- uspace/srv/bd/hr/util.c	(revision 49da04407e5900013a273fd9ee22ded0a7af5acb)
+++ uspace/srv/bd/hr/util.c	(revision da80de9a46399f701d6045204c960aec68108ea6)
@@ -98,10 +98,12 @@
 		vol->hr_ops.create = hr_raid0_create;
 		vol->hr_ops.init = hr_raid0_init;
-		vol->hr_ops.state_event = hr_raid0_state_event;
+		vol->hr_ops.vol_state_eval = hr_raid0_vol_state_eval;
+		vol->hr_ops.ext_state_cb = hr_raid0_ext_state_cb;
 		break;
 	case HR_LVL_1:
 		vol->hr_ops.create = hr_raid1_create;
 		vol->hr_ops.init = hr_raid1_init;
-		vol->hr_ops.state_event = hr_raid1_state_event;
+		vol->hr_ops.vol_state_eval = hr_raid1_vol_state_eval;
+		vol->hr_ops.ext_state_cb = hr_raid1_ext_state_cb;
 		if (meta_flags & HR_METADATA_HOTSPARE_SUPPORT)
 			vol->hr_ops.add_hotspare = hr_raid1_add_hotspare;
@@ -111,5 +113,6 @@
 		vol->hr_ops.create = hr_raid5_create;
 		vol->hr_ops.init = hr_raid5_init;
-		vol->hr_ops.state_event = hr_raid5_state_event;
+		vol->hr_ops.vol_state_eval = hr_raid5_vol_state_eval;
+		vol->hr_ops.ext_state_cb = hr_raid5_ext_state_cb;
 		if (meta_flags & HR_METADATA_HOTSPARE_SUPPORT)
 			vol->hr_ops.add_hotspare = hr_raid5_add_hotspare;
Index: uspace/srv/bd/hr/var.h
===================================================================
--- uspace/srv/bd/hr/var.h	(revision 49da04407e5900013a273fd9ee22ded0a7af5acb)
+++ uspace/srv/bd/hr/var.h	(revision da80de9a46399f701d6045204c960aec68108ea6)
@@ -58,6 +58,7 @@
 	errno_t (*create)(hr_volume_t *);
 	errno_t (*init)(hr_volume_t *);
-	void (*state_event)(hr_volume_t *);
 	errno_t (*add_hotspare)(hr_volume_t *, service_id_t);
+	void (*vol_state_eval)(hr_volume_t *);
+	void (*ext_state_cb)(hr_volume_t *, size_t, errno_t);
 } hr_ops_t;
 
@@ -104,5 +105,4 @@
 	_Atomic int open_cnt; /* open/close() counter */
 	hr_vol_state_t state; /* volume state */
-	void (*state_callback)(hr_volume_t *, size_t, errno_t);
 } hr_volume_t;
 
@@ -136,11 +136,14 @@
 extern errno_t hr_raid5_init(hr_volume_t *);
 
-extern void hr_raid0_state_event(hr_volume_t *);
-extern void hr_raid1_state_event(hr_volume_t *);
-extern void hr_raid5_state_event(hr_volume_t *);
-
 extern errno_t hr_raid1_add_hotspare(hr_volume_t *, service_id_t);
 extern errno_t hr_raid5_add_hotspare(hr_volume_t *, service_id_t);
 
+extern void hr_raid0_vol_state_eval(hr_volume_t *);
+extern void hr_raid1_vol_state_eval(hr_volume_t *);
+extern void hr_raid5_vol_state_eval(hr_volume_t *);
+
+extern void hr_raid0_ext_state_cb(hr_volume_t *, size_t, errno_t);
+extern void hr_raid1_ext_state_cb(hr_volume_t *, size_t, errno_t);
+extern void hr_raid5_ext_state_cb(hr_volume_t *, size_t, errno_t);
 #endif
 
