diff --git a/RELEASE_NOTES b/RELEASE_NOTES
index 0f161ae1871d651b9d92ee6cead05c683c99c29d..01421b10ab3df11253fe3c7752f0ff4dbfdc525a 100644
--- a/RELEASE_NOTES
+++ b/RELEASE_NOTES
@@ -109,6 +109,7 @@ Changed the following enums and #defines
 
 Added the following API's
 =========================
+Added slurm_kill_job_msg: to send prepared job_step_kill_msg_t.
 
 Changed the following API's
 ============================
diff --git a/slurm/slurm.h.in b/slurm/slurm.h.in
index c18011c1d68182dd9f70b675c5bc80c172dfd07e..10ce8d3b84c075f57e12e84ead9c2d89f77b01ec 100644
--- a/slurm/slurm.h.in
+++ b/slurm/slurm.h.in
@@ -3309,6 +3309,15 @@ extern int slurm_kill_job_step(uint32_t job_id,
  */
 extern int slurm_kill_job2(const char *job_id, uint16_t signal, uint16_t flags);
 
+/*
+ * slurm_kill_job_msg - send kill msg to and existing job or step.
+ *
+ * IN msg_type - msg_type to send
+ * IN kill_msg - job_step_kill_msg_t parameters.
+ * RET 0 on success, otherwise return -1 and set errno to indicate the error
+ */
+extern int slurm_kill_job_msg(uint16_t msg_type, job_step_kill_msg_t *kill_msg);
+
 /*
  * slurm_signal_job - send the specified signal to all steps of an existing job
  * IN job_id     - the job's id
diff --git a/src/api/cancel.c b/src/api/cancel.c
index a0e472023df604cbf26905e3ea3a9047d7fba01b..6af2166b262f3611fc37f10a076f3551daaab3e6 100644
--- a/src/api/cancel.c
+++ b/src/api/cancel.c
@@ -151,3 +151,28 @@ slurm_kill_job2(const char *job_id, uint16_t signal, uint16_t flags)
 
 	return SLURM_SUCCESS;
 }
+
+/*
+ * slurm_kill_job_msg - send kill msg to and existing job or step.
+ *
+ * IN msg_type - msg_type to send
+ * IN kill_msg - job_step_kill_msg_t parameters.
+ * RET 0 on success, otherwise return -1 and set errno to indicate the error
+ */
+extern int slurm_kill_job_msg(uint16_t msg_type, job_step_kill_msg_t *kill_msg)
+{
+	int cc;
+	slurm_msg_t msg;
+	slurm_msg_t_init(&msg);
+
+	msg.msg_type = msg_type;
+        msg.data     = kill_msg;
+
+	if (slurm_send_recv_controller_rc_msg(&msg, &cc, working_cluster_rec)<0)
+		return SLURM_FAILURE;
+
+	if (cc)
+		slurm_seterrno_ret(cc);
+
+	return SLURM_SUCCESS;
+}
diff --git a/src/scancel/scancel.c b/src/scancel/scancel.c
index ea504ca6311bf173be11a2ad9b8143b85012c325..5e0125378f0c068a9afbad645021071f7794a3cd 100644
--- a/src/scancel/scancel.c
+++ b/src/scancel/scancel.c
@@ -746,10 +746,20 @@ _cancel_job_id (void *ci)
 	}
 
 	for (i = 0; i < MAX_CANCEL_RETRY; i++) {
+		job_step_kill_msg_t kill_msg;
+
 		_add_delay();
 		START_TIMER;
-		error_code = slurm_kill_job2(cancel_info->job_id_str,
-					     cancel_info->sig, flags);
+
+		memset(&kill_msg, 0, sizeof(job_step_kill_msg_t));
+		kill_msg.flags	= flags;
+		kill_msg.job_id      = NO_VAL;
+		kill_msg.job_step_id = NO_VAL;
+		kill_msg.signal      = cancel_info->sig;
+		kill_msg.sjob_id     = cancel_info->job_id_str;
+
+		error_code = slurm_kill_job_msg(REQUEST_KILL_JOB, &kill_msg);
+
 		END_TIMER;
 		slurm_mutex_lock(&max_delay_lock);
 		max_resp_time = MAX(max_resp_time, DELTA_TIMER);