Index: uspace/app/hrctl/hrctl.c
===================================================================
--- uspace/app/hrctl/hrctl.c	(revision 09398589f86c171d008fdf8c9ef18c4f9efb07f7)
+++ uspace/app/hrctl/hrctl.c	(revision a19d7fc4b9a9e9429e475bb951803a662991726d)
@@ -86,4 +86,5 @@
 	{ "create-file", required_argument, 0, 'C' },
 	{ "assemble-file", required_argument, 0, 'A' },
+	{ "stop", required_argument, 0, 'T' },
 	{ 0, 0, 0, 0 }
 };
@@ -231,5 +232,5 @@
 
 	while (c != -1) {
-		c = getopt_long(argc, argv, "hsC:c:A:a:l:015Ln:",
+		c = getopt_long(argc, argv, "hsC:c:A:a:l:015Ln:T:",
 		    long_options, NULL);
 		switch (c) {
@@ -275,4 +276,10 @@
 			assemble = true;
 			break;
+		case 'T':
+			rc = hr_stop(optarg);
+			free(cfg);
+			if (rc != EOK)
+				return 1;
+			return 0;
 		case 'l':
 			if (cfg->level != hr_l_empty)
Index: uspace/lib/device/include/hr.h
===================================================================
--- uspace/lib/device/include/hr.h	(revision 09398589f86c171d008fdf8c9ef18c4f9efb07f7)
+++ uspace/lib/device/include/hr.h	(revision a19d7fc4b9a9e9429e475bb951803a662991726d)
@@ -78,4 +78,5 @@
 extern errno_t hr_create(hr_t *, hr_config_t *);
 extern errno_t hr_assemble(hr_t *, hr_config_t *);
+extern errno_t hr_stop(const char *);
 extern errno_t hr_print_status(void);
 
Index: uspace/lib/device/include/ipc/hr.h
===================================================================
--- uspace/lib/device/include/ipc/hr.h	(revision 09398589f86c171d008fdf8c9ef18c4f9efb07f7)
+++ uspace/lib/device/include/ipc/hr.h	(revision a19d7fc4b9a9e9429e475bb951803a662991726d)
@@ -41,4 +41,5 @@
 	HR_CREATE = IPC_FIRST_USER_METHOD,
 	HR_ASSEMBLE,
+	HR_STOP,
 	HR_STATUS
 } hr_request_t;
Index: uspace/lib/device/src/hr.c
===================================================================
--- uspace/lib/device/src/hr.c	(revision 09398589f86c171d008fdf8c9ef18c4f9efb07f7)
+++ uspace/lib/device/src/hr.c	(revision a19d7fc4b9a9e9429e475bb951803a662991726d)
@@ -180,4 +180,34 @@
 }
 
+errno_t hr_stop(const char *devname)
+{
+	hr_t *hr;
+	errno_t rc;
+	async_exch_t *exch;
+	service_id_t svc_id;
+
+	rc = loc_service_get_id(devname, &svc_id, 0);
+	if (rc != EOK)
+		return rc;
+
+	rc = hr_sess_init(&hr);
+	if (rc != EOK)
+		return rc;
+
+	exch = async_exchange_begin(hr->sess);
+	if (exch == NULL) {
+		rc = EINVAL;
+		goto error;
+	}
+	rc = async_req_1_0(exch, HR_STOP, svc_id);
+	async_exchange_end(exch);
+
+	if (rc != EOK)
+		goto error;
+error:
+	hr_sess_destroy(hr);
+	return rc;
+}
+
 errno_t hr_print_status(void)
 {
@@ -187,5 +217,5 @@
 	aid_t req;
 	size_t size, i;
-	hr_vol_info_t *vols;
+	hr_vol_info_t *vols = NULL;
 
 	rc = hr_sess_init(&hr);
@@ -194,9 +224,10 @@
 
 	exch = async_exchange_begin(hr->sess);
-	if (exch == NULL)
-		return EINVAL;
+	if (exch == NULL) {
+		rc = EINVAL;
+		goto error;
+	}
 
 	req = async_send_0(exch, HR_STATUS, NULL);
-
 	rc = async_data_read_start(exch, &size, sizeof(size_t));
 	if (rc != EOK) {
@@ -230,4 +261,9 @@
 	}
 
+	if (size == 0) {
+		printf("no active arrays\n");
+		goto error;
+	}
+
 	for (i = 0; i < size; i++) {
 		rc = print_vol_info(i, &vols[i]);
@@ -237,4 +273,5 @@
 
 error:
+	hr_sess_destroy(hr);
 	if (vols != NULL)
 		free(vols);
Index: uspace/srv/bd/hr/hr.c
===================================================================
--- uspace/srv/bd/hr/hr.c	(revision 09398589f86c171d008fdf8c9ef18c4f9efb07f7)
+++ uspace/srv/bd/hr/hr.c	(revision a19d7fc4b9a9e9429e475bb951803a662991726d)
@@ -61,4 +61,41 @@
 static service_id_t ctl_sid;
 
+static hr_volume_t *hr_get_volume(service_id_t svc_id)
+{
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "hr_get_volume(): (%" PRIun ")",
+	    svc_id);
+
+	fibril_mutex_lock(&hr_volumes_lock);
+	list_foreach(hr_volumes, lvolumes, hr_volume_t, volume) {
+		if (volume->svc_id == svc_id) {
+			fibril_mutex_unlock(&hr_volumes_lock);
+			return volume;
+		}
+	}
+
+	fibril_mutex_unlock(&hr_volumes_lock);
+	return NULL;
+}
+
+static errno_t hr_remove_volume(service_id_t svc_id)
+{
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "hr_remove_volume(): (%" PRIun ")",
+	    svc_id);
+
+	fibril_mutex_lock(&hr_volumes_lock);
+	list_foreach(hr_volumes, lvolumes, hr_volume_t, volume) {
+		if (volume->svc_id == svc_id) {
+			hr_fini_devs(volume);
+			list_remove(&volume->lvolumes);
+			free(volume);
+			fibril_mutex_unlock(&hr_volumes_lock);
+			return EOK;
+		}
+	}
+
+	fibril_mutex_unlock(&hr_volumes_lock);
+	return ENOENT;
+}
+
 static void hr_create_srv(ipc_call_t *icall)
 {
@@ -262,4 +299,31 @@
 }
 
+static void hr_stop_srv(ipc_call_t *icall)
+{
+	log_msg(LOG_DEFAULT, LVL_NOTE, "hr_stop_srv()");
+
+	errno_t rc;
+	service_id_t svc_id;
+	hr_volume_t *vol;
+
+	svc_id = ipc_get_arg1(icall);
+
+	vol = hr_get_volume(svc_id);
+	if (vol == NULL) {
+		async_answer_0(icall, ENOENT);
+		return;
+	}
+
+	rc = hr_remove_volume(svc_id);
+	if (rc != EOK) {
+		async_answer_0(icall, rc);
+		return;
+	}
+
+	rc = loc_service_unregister(hr_srv, svc_id);
+
+	async_answer_0(icall, rc);
+}
+
 static void hr_print_status_srv(ipc_call_t *icall)
 {
@@ -345,31 +409,17 @@
 			hr_create_srv(&call);
 			break;
+		case HR_ASSEMBLE:
+			hr_assemble_srv(&call);
+			break;
+		case HR_STOP:
+			hr_stop_srv(&call);
+			break;
 		case HR_STATUS:
 			hr_print_status_srv(&call);
 			break;
-		case HR_ASSEMBLE:
-			hr_assemble_srv(&call);
-			break;
 		default:
 			async_answer_0(&call, EINVAL);
 		}
 	}
-}
-
-static hr_volume_t *hr_get_volume(service_id_t svc_id)
-{
-	log_msg(LOG_DEFAULT, LVL_DEBUG, "hr_get_volume(): (%" PRIun ")",
-	    svc_id);
-
-	fibril_mutex_lock(&hr_volumes_lock);
-	list_foreach(hr_volumes, lvolumes, hr_volume_t, volume) {
-		if (volume->svc_id == svc_id) {
-			fibril_mutex_unlock(&hr_volumes_lock);
-			return volume;
-		}
-	}
-
-	fibril_mutex_unlock(&hr_volumes_lock);
-	return NULL;
 }
 
