diff --git a/src/slurmctld/node_scheduler.c b/src/slurmctld/node_scheduler.c
index 2d092fc263582f011385c00afa37c4e69cf74242..238939322fd3b41a4fd9b33cd7c0a5d0727da489 100644
--- a/src/slurmctld/node_scheduler.c
+++ b/src/slurmctld/node_scheduler.c
@@ -2724,6 +2724,31 @@ static void _launch_prolog(struct job_record *job_ptr)
 	agent_arg_ptr->msg_type = REQUEST_LAUNCH_PROLOG;
 	agent_arg_ptr->msg_args = (void *) prolog_msg_ptr;
 
+	/* At least on a Cray we have to treat this as a real step, so
+	 * this is where to do it.
+	 */
+	if (slurmctld_conf.prolog_flags & PROLOG_FLAG_CONTAIN) {
+		struct step_record step_rec;
+		slurm_step_layout_t layout;
+
+		memset(&step_rec, 0, sizeof(step_rec));
+		memset(&layout, 0, sizeof(layout));
+
+#ifdef HAVE_FRONT_END
+		layout.node_list = job_ptr->front_end_ptr->name;
+#else
+		layout.node_list = job_ptr->nodes;
+#endif
+		layout.node_cnt = agent_arg_ptr->node_count;
+
+		step_rec.step_layout = &layout;
+		step_rec.step_id = SLURM_EXTERN_CONT;
+		step_rec.job_ptr = job_ptr;
+		step_rec.name = "external";
+
+		select_g_step_start(&step_rec);
+	}
+
 	/* Launch the RPC via agent */
 	agent_queue_request(agent_arg_ptr);
 }
diff --git a/src/slurmctld/step_mgr.c b/src/slurmctld/step_mgr.c
index 11dd5ce461346769c12eae822df73670043a71e3..fc634b454c1746a5e95b79e2c74cac3191203ee3 100644
--- a/src/slurmctld/step_mgr.c
+++ b/src/slurmctld/step_mgr.c
@@ -742,7 +742,7 @@ int job_step_complete(uint32_t job_id, uint32_t step_id, uid_t uid,
 		return ESLURM_INVALID_JOB_ID;
 
 	if (step_ptr->step_id == SLURM_EXTERN_CONT)
-		return SLURM_SUCCESS;
+		return select_g_step_finish(step_ptr, true);
 
 	/* If the job is already cleaning we have already been here
 	 * before, so just return. */