diff --git a/src/slurmd/slurmd/req.c b/src/slurmd/slurmd/req.c
index 88082bcab84efaa193e6d7706dc9b97157ecf632..0384ba8468aefc927a9bf9d619dfd11599c6b973 100644
--- a/src/slurmd/slurmd/req.c
+++ b/src/slurmd/slurmd/req.c
@@ -144,6 +144,13 @@ slurmd_req(slurm_msg_t *msg)
 {
 	int rc;
 
+	if (msg == NULL) {
+		if (waiters)
+			list_destroy(waiters);
+		waiters = NULL;
+		return;
+	}
+
 	switch(msg->msg_type) {
 	case REQUEST_BATCH_JOB_LAUNCH:
 		/* Mutex locking moved into _rpc_batch_job() due to 
diff --git a/src/slurmd/slurmd/req.h b/src/slurmd/slurmd/req.h
index 652109006b4b5d9a4eb52ea88c93a8a4668be2e3..740a6f366d5542e629d6f93482baa855b4b781f8 100644
--- a/src/slurmd/slurmd/req.h
+++ b/src/slurmd/slurmd/req.h
@@ -42,6 +42,8 @@
 
 /* Process request contained in slurm message `msg' from client at
  * msg->orig_addr
+ *
+ * If msg == NULL, then purge allocated memory.
  */
 void slurmd_req(slurm_msg_t *msg);
 
diff --git a/src/slurmd/slurmd/slurmd.c b/src/slurmd/slurmd/slurmd.c
index 842799c7216a5072b3bc9affa37aa33a4300a1d5..30e834a0ca0c8ebdc626a59c47c8d3175c349f79 100644
--- a/src/slurmd/slurmd/slurmd.c
+++ b/src/slurmd/slurmd/slurmd.c
@@ -985,6 +985,10 @@ cleanup:
  *
  * Then exercise the slurmd functionality before executing
  * > scontrol shutdown
+ *
+ * There should be some definitely lost records from 
+ * init_setproctitle (setproctitle.c), but it should otherwise account 
+ * for all memory.
 \**************************************************************************/
 static int
 _slurmd_fini()
@@ -996,6 +1000,7 @@ _slurmd_fini()
 	slurm_conf_destroy();
 	slurm_proctrack_fini();
 	slurm_auth_fini();
+	slurmd_req(NULL);	/* purge memory allocated by slurmd_req() */
 	return SLURM_SUCCESS;
 }