diff --git a/src/api/step_launch.c b/src/api/step_launch.c
index a7d51913290a3b8233e59e5f3031fc3b30bbe906..483d4411db58f5404454835df1043dea7d084def 100644
--- a/src/api/step_launch.c
+++ b/src/api/step_launch.c
@@ -1119,9 +1119,12 @@ _job_complete_handler(struct step_launch_state *sls, slurm_msg_t *complete_msg)
 			step_msg->job_id, step_msg->step_id);
 	}
 
-	/* FIXME: does nothing yet */
+	if (sls->callback.step_signal)
+		(sls->callback.step_signal)(SIGKILL);
 
+	force_terminated_job = true;
 	pthread_mutex_lock(&sls->lock);
+	sls->abort = true;
 	pthread_cond_broadcast(&sls->cond);
 	pthread_mutex_unlock(&sls->lock);
 }
@@ -1129,8 +1132,12 @@ _job_complete_handler(struct step_launch_state *sls, slurm_msg_t *complete_msg)
 static void
 _timeout_handler(struct step_launch_state *sls, slurm_msg_t *timeout_msg)
 {
-	/* FIXME: does nothing yet */
+	if (sls->callback.step_signal)
+		(sls->callback.step_signal)(SIGKILL);
+
+	force_terminated_job = true;
 	pthread_mutex_lock(&sls->lock);
+	sls->abort = true;
 	pthread_cond_broadcast(&sls->cond);
 	pthread_mutex_unlock(&sls->lock);
 }
@@ -1442,11 +1449,6 @@ _handle_msg(void *arg, slurm_msg_t *msg)
 		break;
 	case SRUN_JOB_COMPLETE:
 		debug2("received job step complete message");
-		force_terminated_job = true;
-		pthread_mutex_lock(&sls->lock);
-		sls->abort = true;
-		pthread_cond_broadcast(&sls->cond);
-		pthread_mutex_unlock(&sls->lock);
 		_job_complete_handler(sls, msg);
 		slurm_free_srun_job_complete_msg(msg->data);
 		break;