diff --git a/src/scontrol/update_job.c b/src/scontrol/update_job.c
index ff69737daf80eb0342928fe99738c27ba856a96d..c0c81e051b356889cdaf34441efc08af77d98fc3 100644
--- a/src/scontrol/update_job.c
+++ b/src/scontrol/update_job.c
@@ -253,8 +253,8 @@ scontrol_hold(char *op, char *job_str)
 	char *next_str;
 	job_desc_msg_t job_msg;
 	uint32_t job_id = 0;
-	uint32_t array_id;
 	char *job_name = NULL;
+	char *job_id_str = NULL;
 	slurm_job_info_t *job_ptr;
 
 	if (job_str && !strncasecmp(job_str, "JobID=", 6))
@@ -264,19 +264,31 @@ scontrol_hold(char *op, char *job_str)
 	if (job_str && !strncasecmp(job_str, "Job=", 4))
 		job_str += 4;
 
+	slurm_init_job_desc_msg (&job_msg);	job_msg.user_id = getuid();
+	if ((strncasecmp(op, "holdu", 5) == 0) ||
+	    (strncasecmp(op, "uhold", 5) == 0)) {
+		job_msg.priority = 0;
+		job_msg.alloc_sid = ALLOC_SID_USER_HOLD;
+	} else if (strncasecmp(op, "hold", 4) == 0) {
+		job_msg.priority = 0;
+		job_msg.alloc_sid = 0;
+	} else
+		job_msg.priority = INFINITE;
+
 	if (job_str && (job_str[0] >= '0') && (job_str[0] <= '9')) {
 		job_id = (uint32_t) strtol(job_str, &next_str, 10);
-		if (next_str[0] == '_')
-			array_id = strtol(next_str+1, &next_str, 10);
-		else
-			array_id = NO_VAL;
+		if (next_str[0] == '_') {
+			job_msg.job_id_str = job_str;
+			if (slurm_update_job(&job_msg))
+				rc = slurm_get_errno();
+			return rc;
+		}
 		if ((job_id == 0) || (next_str[0] != '\0')) {
 			fprintf(stderr, "Invalid job id specified (%s)\n",
 				job_str);
 			return 1;
 		}
 	} else if (job_str) {
-		array_id = NO_VAL;
 		job_id = 0;
 		job_name = job_str;
 		last_job_id = NO_VAL;
@@ -294,31 +306,16 @@ scontrol_hold(char *op, char *job_str)
 		last_job_id = job_id;
 	}
 
-	slurm_init_job_desc_msg (&job_msg);
 	/* set current user, needed e.g., for AllowGroups checks */
-	job_msg.user_id = getuid();
-	if ((strncasecmp(op, "holdu", 5) == 0) ||
-	    (strncasecmp(op, "uhold", 5) == 0)) {
-		job_msg.priority = 0;
-		job_msg.alloc_sid = ALLOC_SID_USER_HOLD;
-	} else if (strncasecmp(op, "hold", 4) == 0) {
-		job_msg.priority = 0;
-		job_msg.alloc_sid = 0;
-	} else
-		job_msg.priority = INFINITE;
 	for (i = 0, job_ptr = resp->job_array; i < resp->record_count;
 	     i++, job_ptr++) {
-		if ((array_id != NO_VAL) &&
-		    (job_ptr->array_task_id != array_id))
-			continue;
 		if (job_name &&
 		    ((job_ptr->name == NULL) ||
 		     strcmp(job_name, job_ptr->name)))
 			continue;
 
 		if (!IS_JOB_PENDING(job_ptr)) {
-			if ((array_id == NO_VAL) &&
-			    (job_ptr->array_task_id != NO_VAL))
+			if (job_ptr->array_task_id != NO_VAL)
 				continue;
 			if (job_name)
 				continue;
@@ -326,14 +323,23 @@ scontrol_hold(char *op, char *job_str)
 			rc = MAX(rc, ESLURM_JOB_NOT_PENDING);
 		}
 
-		job_msg.job_id = job_ptr->job_id;
+		if (job_ptr->array_task_str) {
+			xstrfmtcat(job_id_str, "%u_%s",
+				   job_ptr->array_job_id,
+				   job_ptr->array_task_str);
+		} else if (job_ptr->array_task_id != NO_VAL) {
+			xstrfmtcat(job_id_str, "%u_%u",
+				   job_ptr->array_job_id,
+				   job_ptr->array_task_id);
+		} else {
+			xstrfmtcat(job_id_str, "%u", job_ptr->job_id);
+		}
+		job_msg.job_id_str = job_id_str;
 		if (slurm_update_job(&job_msg)) {
 			rc2 = slurm_get_errno();
 			rc = MAX(rc, rc2);
 		}
-
-		if (array_id != NO_VAL)
-			break;
+		xfree(job_id_str);
 	}
 
 	return rc;