diff --git a/src/slurmd/mgr.c b/src/slurmd/mgr.c
index 7346f3a5518dab789ec7b0e3ccf94a42aaf8b92a..6a0737cc02006a7142f76d5b6a9407cea92be10f 100644
--- a/src/slurmd/mgr.c
+++ b/src/slurmd/mgr.c
@@ -73,6 +73,7 @@ static int  _unblock_all_signals(void);
 static int  _block_most_signals(void);
 static int  _send_exit_msg(int rc, task_info_t *t);
 static int  _complete_job(slurmd_job_t *job, int rc, int status);
+static void _send_batch_launch_resp(slurmd_job_t *job);
 static void _send_launch_resp(slurmd_job_t *job, int rc);
 static void _wait_for_all_tasks(slurmd_job_t *job);
 static void _slurmd_job_log_init(slurmd_job_t *job);
@@ -348,7 +349,9 @@ _run_job(slurmd_job_t *job)
 	}
 
 	rc = _exec_all_tasks(job);
-	if (!job->batch)
+	if (job->batch)
+		_send_batch_launch_resp(job);
+	else
 		_send_launch_resp(job, rc);
 	_wait_for_all_tasks(job);
 
@@ -747,6 +750,37 @@ _block_most_signals(void)
 	return SLURM_SUCCESS;
 }
 
+static void
+_send_batch_launch_resp(slurmd_job_t *job)
+{	
+	slurm_msg_t resp_msg;
+	batch_launch_response_msg_t resp;
+	List         steps = shm_get_steps();
+	ListIterator i     = list_iterator_create(steps);
+	job_step_t  *s     = NULL;
+	bool        found  = false;
+
+	while ((s = list_next(i))) {
+		if (s->jobid == job->jobid) {
+			resp.sid = s->sid;
+			found = true;
+			break;
+		}
+	}
+	list_destroy(steps);
+	if (!found)
+		error("failed to find jobid %u in shared memory", job->jobid);
+	else {
+		debug("Sending batch launch resp");
+		resp_msg.data         = &resp;
+		resp_msg.msg_type     = RESPONSE_BATCH_JOB_LAUNCH;
+
+		/* resp.sid           = s->sid; set above */
+		resp.job_id           = job->jobid;
+		slurm_send_only_controller_msg(&resp_msg);
+	}
+}
+
 static void
 _send_launch_resp(slurmd_job_t *job, int rc)
 {	
diff --git a/src/slurmd/req.c b/src/slurmd/req.c
index 7133ada854f5b902d03c191f639b063ee00ecd18..e93fd54e67f1e3cddd00552d0726fd073aa33f05 100644
--- a/src/slurmd/req.c
+++ b/src/slurmd/req.c
@@ -32,6 +32,7 @@
 #include <signal.h>
 #include <string.h>
 #include <sys/param.h>
+#include <unistd.h>
 
 #include "src/common/credential_utils.h"
 #include "src/common/log.h"
@@ -315,10 +316,11 @@ static void  _rpc_pid2jid(slurm_msg_t *msg, slurm_addr *cli)
 	List         steps = shm_get_steps();
 	ListIterator i     = list_iterator_create(steps);
 	job_step_t  *s     = NULL;  
-	bool        found  = false; 
+	bool         found = false; 
+	pid_t	     mysid = getsid(req->job_pid);
 
-	while ((s = list_next(i))) {
-		if (s->sid == req->job_pid) {
+	while ((mysid != -1) && (s = list_next(i))) {
+		if (s->sid == mysid) {
 			resp.job_id = s->jobid;
 			found = true;
 			break;
diff --git a/src/slurmd/slurmd.h b/src/slurmd/slurmd.h
index 1b0b3ef1d14451568570fc780e0f9c075bc0c5e3..82cfb17e896d535d63c7a965946a0e94b24bb6a4 100644
--- a/src/slurmd/slurmd.h
+++ b/src/slurmd/slurmd.h
@@ -47,6 +47,9 @@
 #include "src/common/slurm_protocol_api.h"
 #include "src/common/signature_utils.h"
 
+#ifndef __USE_XOPEN_EXTENDED
+extern pid_t getsid(pid_t pid);		/* missing from <unistd.h> */
+#endif
 /*
  * Global config type
  */