Index: uspace/app/hrctl/hrctl.c
===================================================================
--- uspace/app/hrctl/hrctl.c	(revision d84773ac35e32d33b7b0368f165b6660ba6a1e0d)
+++ uspace/app/hrctl/hrctl.c	(revision cf28ffd3efdce6cee71cacbd1154fa35c8baa679)
@@ -59,4 +59,5 @@
     "  -s, --status              display status of active arrays\n"
     "  -T, --stop                stop an active array\n"
+    "  -F, --fail-extent         fail an extent, use with -T and set it before\n"
     "  -c, --create=NAME         create new array\n"
     "  -a, --assemble=NAME       assemble an existing array\n"
@@ -88,4 +89,5 @@
 	{ "assemble-file", required_argument, 0, 'A' },
 	{ "stop", required_argument, 0, 'T' },
+	{ "fail-extent", required_argument, 0, 'F' },
 	{ 0, 0, 0, 0 }
 };
@@ -220,4 +222,5 @@
 	int retval, c;
 	bool create, assemble;
+	long fail_extent = -1;
 	hr_t *hr;
 	hr_config_t *cfg;
@@ -241,5 +244,5 @@
 
 	while (c != -1) {
-		c = getopt_long(argc, argv, "hsC:c:A:a:l:0145Ln:T:",
+		c = getopt_long(argc, argv, "hsC:c:A:a:l:0145Ln:T:F:",
 		    long_options, NULL);
 		switch (c) {
@@ -286,5 +289,5 @@
 			break;
 		case 'T':
-			rc = hr_stop(optarg);
+			rc = hr_stop(optarg, fail_extent);
 			free(cfg);
 			if (rc != EOK) {
@@ -295,4 +298,7 @@
 			}
 			return 0;
+		case 'F':
+			fail_extent = strtol(optarg, NULL, 10);
+			break;
 		case 'l':
 			if (cfg->level != HR_LVL_UNKNOWN)
Index: uspace/lib/device/include/hr.h
===================================================================
--- uspace/lib/device/include/hr.h	(revision d84773ac35e32d33b7b0368f165b6660ba6a1e0d)
+++ uspace/lib/device/include/hr.h	(revision cf28ffd3efdce6cee71cacbd1154fa35c8baa679)
@@ -97,5 +97,5 @@
 
 extern errno_t hr_create(hr_t *, hr_config_t *, bool);
-extern errno_t hr_stop(const char *);
+extern errno_t hr_stop(const char *, long);
 extern errno_t hr_print_status(void);
 
Index: uspace/lib/device/src/hr.c
===================================================================
--- uspace/lib/device/src/hr.c	(revision d84773ac35e32d33b7b0368f165b6660ba6a1e0d)
+++ uspace/lib/device/src/hr.c	(revision cf28ffd3efdce6cee71cacbd1154fa35c8baa679)
@@ -169,5 +169,5 @@
 }
 
-errno_t hr_stop(const char *devname)
+errno_t hr_stop(const char *devname, long extent)
 {
 	hr_t *hr;
@@ -189,5 +189,5 @@
 		goto error;
 	}
-	rc = async_req_1_0(exch, HR_STOP, svc_id);
+	rc = async_req_2_0(exch, HR_STOP, svc_id, extent);
 	async_exchange_end(exch);
 
Index: uspace/srv/bd/hr/hr.c
===================================================================
--- uspace/srv/bd/hr/hr.c	(revision d84773ac35e32d33b7b0368f165b6660ba6a1e0d)
+++ uspace/srv/bd/hr/hr.c	(revision cf28ffd3efdce6cee71cacbd1154fa35c8baa679)
@@ -255,9 +255,11 @@
 	log_msg(LOG_DEFAULT, LVL_NOTE, "hr_stop_srv()");
 
-	errno_t rc;
+	errno_t rc = EOK;
 	service_id_t svc_id;
+	long fail_extent;
 	hr_volume_t *vol;
 
 	svc_id = ipc_get_arg1(icall);
+	fail_extent = (long) ipc_get_arg2(icall);
 
 	vol = hr_get_volume(svc_id);
@@ -267,12 +269,17 @@
 	}
 
-	rc = hr_remove_volume(svc_id);
-	if (rc != EOK) {
-		async_answer_0(icall, rc);
-		return;
-	}
-
-	rc = loc_service_unregister(hr_srv, svc_id);
-
+	if (fail_extent == -1) {
+		rc = hr_remove_volume(svc_id);
+		if (rc != EOK) {
+			async_answer_0(icall, rc);
+			return;
+		}
+		rc = loc_service_unregister(hr_srv, svc_id);
+	} else {
+		/* fibril safe for now */
+		fibril_mutex_lock(&vol->lock);
+		hr_update_ext_status(vol, fail_extent, HR_EXT_FAILED);
+		fibril_mutex_unlock(&vol->lock);
+	}
 	async_answer_0(icall, rc);
 }
