diff --git a/RELEASE_NOTES b/RELEASE_NOTES
index 5a03d1e2ce5dac6ad1777ebc666ba506aa8de669..f121af6e9c9aca63fc1a7da7aa8f197e0a48ae3c 100644
--- a/RELEASE_NOTES
+++ b/RELEASE_NOTES
@@ -64,7 +64,7 @@ COMMAND CHANGES (see man pages for details)
 
 BLUEGENE SPECIFIC CHANGES
 =========================
-
+BGQ support added.
 
 OTHER CHANGES
 =============
@@ -98,6 +98,9 @@ job_info_t
 	batch_host		name of the host running the batch script
 	preempt_time		time that a job become preempted
 
+job_step_create_response_msg_t
+	select_jobinfo		data needed from the select plugin for a step
+
 partition_info_t
 	grace_time		preempted job's grace time in seconds
 
diff --git a/src/common/env.c b/src/common/env.c
index 2393ec3873bd26267d605e488e8c50ebef505536..7595f60467a4d09738cbfa14fa6b6c8de60853a9 100644
--- a/src/common/env.c
+++ b/src/common/env.c
@@ -113,6 +113,14 @@ static int _setup_particulars(uint32_t cluster_flags,
 			setenvf(dest, "MPIRUN_NOFREE", "%d", 1);
 			setenvf(dest, "MPIRUN_NOALLOCATE", "%d", 1);
 			xfree(bg_part_id);
+			select_g_select_jobinfo_get(select_jobinfo,
+						    SELECT_JOBDATA_IONODES,
+						    &bg_part_id);
+			if (bg_part_id) {
+				setenvf(dest, "SLURM_JOB_SUB_MP", "%s",
+					bg_part_id);
+				xfree(bg_part_id);
+			}
 		} else
 			rc = SLURM_FAILURE;
 
@@ -1128,6 +1136,7 @@ env_array_for_batch_job(char ***dest, const batch_job_launch_msg_t *batch,
  *	SLURM_STEP_LAUNCHER_PORT
  *	SLURM_STEP_LAUNCHER_IPADDR
  *	SLURM_STEP_RESV_PORTS
+ *      SLURM_STEP_SUB_MP
  *
  * Sets OBSOLETE variables:
  *	SLURM_STEPID
@@ -1163,6 +1172,13 @@ env_array_for_step(char ***dest,
 		env_array_overwrite_fmt(dest, "SLURM_STEP_RESV_PORTS",
 					"%s", step->resv_ports);
 	}
+	select_g_select_jobinfo_get(step->select_jobinfo,
+				    SELECT_JOBDATA_IONODES,
+				    &tmp);
+	if (tmp) {
+		setenvf(dest, "SLURM_STEP_SUB_MP", "%s", tmp);
+		xfree(tmp);
+	}
 
 	/* OBSOLETE, but needed by MPI, do not remove */
 	env_array_overwrite_fmt(dest, "SLURM_STEPID", "%u", step->job_step_id);
diff --git a/src/common/slurm_protocol_defs.c b/src/common/slurm_protocol_defs.c
index 8beacae74a6f76031bb05c50483e0da9d4faf424..3d94ef08fd41337fd17280279f86ae637f2b35dc 100644
--- a/src/common/slurm_protocol_defs.c
+++ b/src/common/slurm_protocol_defs.c
@@ -1728,6 +1728,7 @@ void slurm_free_job_step_create_response_msg(
 		xfree(msg->resv_ports);
 		slurm_step_layout_destroy(msg->step_layout);
 		slurm_cred_destroy(msg->cred);
+		select_g_select_jobinfo_free(msg->select_jobinfo);
 		if (msg->switch_job)
 			switch_free_jobinfo(msg->switch_job);
 
diff --git a/src/common/slurm_protocol_defs.h b/src/common/slurm_protocol_defs.h
index 28a086d36ca9f533363e3614c6cf4543a91cb4aa..2e44922eb6eb2e6a84562ef7ef8160a70ea1fdd8 100644
--- a/src/common/slurm_protocol_defs.h
+++ b/src/common/slurm_protocol_defs.h
@@ -616,6 +616,7 @@ typedef struct job_step_create_response_msg {
 	slurm_step_layout_t *step_layout; /* information about how the
                                            * step is laid out */
 	slurm_cred_t *cred;    	  /* slurm job credential */
+	dynamic_plugin_data_t *select_jobinfo;	/* select opaque data type */
 	switch_jobinfo_t *switch_job;	/* switch context, opaque
                                          * data structure */
 } job_step_create_response_msg_t;
diff --git a/src/common/slurm_protocol_pack.c b/src/common/slurm_protocol_pack.c
index cf5fafb772a37c213b5f33336df3f71101231497..07b47c6914b041e1f78bb859fed26dffe2cedc88 100644
--- a/src/common/slurm_protocol_pack.c
+++ b/src/common/slurm_protocol_pack.c
@@ -3441,12 +3441,23 @@ _pack_job_step_create_response_msg(job_step_create_response_msg_t * msg,
 {
 	xassert(msg != NULL);
 
-	packstr(msg->resv_ports, buffer);
-	pack32(msg->job_step_id, buffer);
-	pack_slurm_step_layout(msg->step_layout, buffer, protocol_version);
-	slurm_cred_pack(msg->cred, buffer);
-	switch_pack_jobinfo(msg->switch_job, buffer);
-
+	if(protocol_version >= SLURM_2_3_PROTOCOL_VERSION) {
+		packstr(msg->resv_ports, buffer);
+		pack32(msg->job_step_id, buffer);
+		pack_slurm_step_layout(
+			msg->step_layout, buffer, protocol_version);
+		slurm_cred_pack(msg->cred, buffer);
+		select_g_select_jobinfo_pack(
+			msg->select_jobinfo, buffer, protocol_version);
+		switch_pack_jobinfo(msg->switch_job, buffer);
+	} else {
+		packstr(msg->resv_ports, buffer);
+		pack32(msg->job_step_id, buffer);
+		pack_slurm_step_layout(
+			msg->step_layout, buffer, protocol_version);
+		slurm_cred_pack(msg->cred, buffer);
+		switch_pack_jobinfo(msg->switch_job, buffer);
+	}
 }
 
 static int
@@ -3462,20 +3473,45 @@ _unpack_job_step_create_response_msg(job_step_create_response_msg_t ** msg,
 	tmp_ptr = xmalloc(sizeof(job_step_create_response_msg_t));
 	*msg = tmp_ptr;
 
-	safe_unpackstr_xmalloc(&tmp_ptr->resv_ports, &uint32_tmp, buffer);
-	safe_unpack32(&tmp_ptr->job_step_id, buffer);
-	if (unpack_slurm_step_layout(&tmp_ptr->step_layout, buffer,
-				     protocol_version))
-		goto unpack_error;
+	if(protocol_version >= SLURM_2_3_PROTOCOL_VERSION) {
+		safe_unpackstr_xmalloc(
+			&tmp_ptr->resv_ports, &uint32_tmp, buffer);
+		safe_unpack32(&tmp_ptr->job_step_id, buffer);
+		if (unpack_slurm_step_layout(&tmp_ptr->step_layout, buffer,
+					     protocol_version))
+			goto unpack_error;
 
-	if (!(tmp_ptr->cred = slurm_cred_unpack(buffer, protocol_version)))
-		goto unpack_error;
+		if (!(tmp_ptr->cred = slurm_cred_unpack(
+			      buffer, protocol_version)))
+			goto unpack_error;
 
-	switch_alloc_jobinfo(&tmp_ptr->switch_job);
-	if (switch_unpack_jobinfo(tmp_ptr->switch_job, buffer)) {
-		error("switch_unpack_jobinfo: %m");
-		switch_free_jobinfo(tmp_ptr->switch_job);
-		goto unpack_error;
+		if (select_g_select_jobinfo_unpack(
+			    &tmp_ptr->select_jobinfo, buffer, protocol_version))
+			goto unpack_error;
+		switch_alloc_jobinfo(&tmp_ptr->switch_job);
+		if (switch_unpack_jobinfo(tmp_ptr->switch_job, buffer)) {
+			error("switch_unpack_jobinfo: %m");
+			switch_free_jobinfo(tmp_ptr->switch_job);
+			goto unpack_error;
+		}
+	} else {
+		safe_unpackstr_xmalloc(
+			&tmp_ptr->resv_ports, &uint32_tmp, buffer);
+		safe_unpack32(&tmp_ptr->job_step_id, buffer);
+		if (unpack_slurm_step_layout(&tmp_ptr->step_layout, buffer,
+					     protocol_version))
+			goto unpack_error;
+
+		if (!(tmp_ptr->cred = slurm_cred_unpack(
+			      buffer, protocol_version)))
+			goto unpack_error;
+
+		switch_alloc_jobinfo(&tmp_ptr->switch_job);
+		if (switch_unpack_jobinfo(tmp_ptr->switch_job, buffer)) {
+			error("switch_unpack_jobinfo: %m");
+			switch_free_jobinfo(tmp_ptr->switch_job);
+			goto unpack_error;
+		}
 	}
 	return SLURM_SUCCESS;
 
diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c
index 44d0c65138cc076000f52afcbc8a6f0c9cbbce14..34efaf59f86cdc5c84626bd1e622ff0bcf4455e8 100644
--- a/src/slurmctld/proc_req.c
+++ b/src/slurmctld/proc_req.c
@@ -1678,6 +1678,8 @@ static void _slurm_rpc_job_step_create(slurm_msg_t * msg)
 		}
 #endif
 		job_step_resp.cred        = slurm_cred;
+		job_step_resp.select_jobinfo = select_g_select_jobinfo_copy(
+			step_rec->select_jobinfo);
 		job_step_resp.switch_job  = switch_copy_jobinfo(
 			step_rec->switch_job);