diff --git a/src/plugins/select/cray/basil_alps.h b/src/plugins/select/cray/basil_alps.h
index af6f100464fe1b63ea4daefc0c4ec64269dbdcc3..a993d3d976b0bc4b9cfb78d53b0c2bb5b8216b62 100644
--- a/src/plugins/select/cray/basil_alps.h
+++ b/src/plugins/select/cray/basil_alps.h
@@ -546,6 +546,8 @@ extern const struct basil_rsvn *basil_rsvn_by_id(const struct basil_inventory *i
 extern uint64_t *basil_get_rsvn_aprun_apids(const struct basil_inventory *inv,
 					    uint32_t rsvn_id);
 extern int basil_release(uint32_t rsvn_id);
+extern int basil_signal_apids(int32_t rsvn_id, int signal,
+			      struct basil_inventory *inv);
 extern int basil_safe_release(int32_t rsvn_id, struct basil_inventory *inv);
 
 #endif /* __BASIL_ALPS_H__ */
diff --git a/src/plugins/select/cray/basil_interface.c b/src/plugins/select/cray/basil_interface.c
index bb94b25c6818c38dc616bf981a25dfbcda566cf7..e6be0b5cd2c9fbcd04918ea7871438ef7b9b610a 100644
--- a/src/plugins/select/cray/basil_interface.c
+++ b/src/plugins/select/cray/basil_interface.c
@@ -725,6 +725,29 @@ extern int do_basil_confirm(struct job_record *job_ptr)
 	return READY_JOB_FATAL;
 }
 
+/**
+ * do_basil_signal  -  pass job signal on to any APIDs
+ * IN job_ptr - job to be signalled
+ * IN signal  - signal(7) number
+ * Only signal job if an ALPS reservation exists (non-0 reservation ID).
+ */
+extern int do_basil_signal(struct job_record *job_ptr, int signal)
+{
+	uint32_t resv_id;
+
+	if (_get_select_jobinfo(job_ptr->select_jobinfo->data,
+			SELECT_JOBDATA_RESV_ID, &resv_id) != SLURM_SUCCESS) {
+		error("can not read resId for JobId=%u", job_ptr->job_id);
+	} else if (resv_id != 0) {
+		int rc = basil_signal_apids(resv_id, signal, NULL);
+
+		if (rc)
+			error("could not signal APIDS of resId %u: %s", resv_id,
+				basil_strerror(rc));
+	}
+	return SLURM_SUCCESS;
+}
+
 /**
  * do_basil_release - release an (unconfirmed) BASIL reservation
  * IN job_ptr - pointer to job which has just been deallocated resources
diff --git a/src/plugins/select/cray/basil_interface.h b/src/plugins/select/cray/basil_interface.h
index ec59c9813173818dde4f8b8393df25ccc070b9f6..e28b6c4d8f5f7c081a3c098f5bce97fd7daa39ec 100644
--- a/src/plugins/select/cray/basil_interface.h
+++ b/src/plugins/select/cray/basil_interface.h
@@ -41,6 +41,7 @@ extern int basil_inventory(void);
 extern int basil_geometry(struct node_record *node_ptr_array, int node_cnt);
 extern int do_basil_reserve(struct job_record *job_ptr);
 extern int do_basil_confirm(struct job_record *job_ptr);
+extern int do_basil_signal(struct job_record *job_ptr, int signal);
 extern int do_basil_release(struct job_record *job_ptr);
 #else	/* !HAVE_CRAY */
 static inline int basil_node_ranking(struct node_record *ig, int nore)
@@ -67,6 +68,11 @@ static inline int do_basil_confirm(struct job_record *job_ptr)
 	return SLURM_SUCCESS;
 }
 
+static inline int do_basil_signal(struct job_record *job_ptr, int signal)
+{
+	return SLURM_SUCCESS;
+}
+
 static inline int do_basil_release(struct job_record *job_ptr)
 {
 	return SLURM_SUCCESS;
diff --git a/src/plugins/select/cray/select_cray.c b/src/plugins/select/cray/select_cray.c
index d3e4301f6e64e864f664dadb9e2d155a6903bdea..29af7fb6183b9a0eefb0b8e4d11d1dd598f7d621 100644
--- a/src/plugins/select/cray/select_cray.c
+++ b/src/plugins/select/cray/select_cray.c
@@ -281,6 +281,8 @@ extern int select_p_job_expand(struct job_record *from_job_ptr,
 
 extern int select_p_job_signal(struct job_record *job_ptr, int signal)
 {
+	if (do_basil_signal(job_ptr, signal) != SLURM_SUCCESS)
+		return SLURM_ERROR;
 	return other_job_signal(job_ptr, signal);
 }