diff --git a/src/slurmctld/agent.c b/src/slurmctld/agent.c
index 466520a202f420532c073bd8fe89fac86f3c5ef7..1bfb0f55e9d9611743f853e5030db1118892d96d 100644
--- a/src/slurmctld/agent.c
+++ b/src/slurmctld/agent.c
@@ -103,6 +103,7 @@ typedef struct task_info {
 } task_info_t;
 
 static void alarm_handler(int dummy);
+static void list_delete_retry (void *retry_entry);
 static void queue_agent_retry (agent_info_t *agent_info_ptr, int count);
 static void slurmctld_free_job_launch_msg(batch_job_launch_msg_t * msg);
 static void spawn_retry_agent (agent_arg_t *agent_arg_ptr);
@@ -195,7 +196,7 @@ agent (void *args)
 			                   &agent_info_ptr->thread_mutex);
 		}
  
-		/* create thread, note this is freed from  thread_per_node_rpc() */
+		/* create thread specific dat, NOTE freed from thread_per_node_rpc() */
 		task_specific_ptr 			= xmalloc (sizeof (task_info_t));
 		task_specific_ptr->thread_mutex_ptr	= &agent_info_ptr->thread_mutex;
 		task_specific_ptr->thread_cond_ptr	= &agent_info_ptr->thread_cond;
@@ -530,7 +531,7 @@ queue_agent_retry (agent_info_t *agent_info_ptr, int count)
 	/* add the requeust to a list */
 	pthread_mutex_lock (&retry_mutex);
 	if (retry_list == NULL) {
-		retry_list = list_create (NULL);
+		retry_list = list_create (&list_delete_retry);
 		if (retry_list == NULL)
 			fatal ("list_create failed");
 	}
@@ -539,6 +540,28 @@ queue_agent_retry (agent_info_t *agent_info_ptr, int count)
 	pthread_mutex_unlock (&retry_mutex);
 }
 
+/*
+ * list_delete_retry - delete an entry from the retry list, 
+ *	see common/list.h for documentation
+ */
+void 
+list_delete_retry (void *retry_entry) 
+{
+	agent_arg_t *agent_arg_ptr;	/* pointer to part_record */
+
+	agent_arg_ptr = (agent_arg_t *) retry_entry;
+	if (agent_arg_ptr -> slurm_addr)
+		xfree (agent_arg_ptr -> slurm_addr);
+	if (agent_arg_ptr -> node_names)
+		xfree (agent_arg_ptr -> node_names);
+#if AGENT_IS_THREAD
+	if (agent_arg_ptr -> msg_args)
+		xfree (agent_arg_ptr -> msg_args);
+#endif
+	xfree (agent_arg_ptr);
+}
+
+
 /* agent_retry - Agent for retrying pending RPCs (top one on the queue), 
  *	argument is unused */
 void *
@@ -634,3 +657,14 @@ void slurmctld_free_job_launch_msg(batch_job_launch_msg_t * msg)
 	}
 }
 
+/* agent_purge - purge all pending RPC requests */
+void agent_purge (void)
+{		retry_list = list_create (NULL);
+
+	pthread_mutex_lock (&retry_mutex);
+	if (retry_list == NULL)
+		list_destroy (retry_list);
+	pthread_mutex_unlock (&retry_mutex);
+}
+
+
diff --git a/src/slurmctld/agent.h b/src/slurmctld/agent.h
index aed547c09f11d2dca4da919633630a91c4522e26..300990758237241f9d1f07c6352b976c543f7f3c 100644
--- a/src/slurmctld/agent.h
+++ b/src/slurmctld/agent.h
@@ -56,4 +56,7 @@ extern void *agent_retry (void *args);
 /* retry_pending - retry all pending RPCs for the given node name */
 extern void retry_pending (char *node_name);
 
+/* agent_purge - purge all pending RPC requests */
+extern void agent_purge (void);
+
 #endif /* !_AGENT_H */
diff --git a/src/slurmctld/controller.c b/src/slurmctld/controller.c
index 28a48548c084378dc71658c9fd146bc193efbad8..27072952f85d0d193ebf015c6e7207c882eff9c8 100644
--- a/src/slurmctld/controller.c
+++ b/src/slurmctld/controller.c
@@ -57,6 +57,7 @@
 #define DEFAULT_DAEMONIZE 0
 #define DEFAULT_RECOVER 0
 #define MAX_SERVER_THREAD_COUNT 20
+#define MEM_LEAK_TEST 0
 
 /* Log to stderr and syslog until becomes a daemon */
 log_options_t log_opts = { 1, LOG_LEVEL_INFO,  LOG_LEVEL_INFO, LOG_LEVEL_QUIET } ;
@@ -470,6 +471,25 @@ slurmctld_background ( void * no_data )
 
 	}
 	debug3 ("slurmctld_background shutting down");
+
+#if	MEM_LEAK_TEST
+	/* This should purge all allocated memory,	*\
+	\*	Anything left over represents a leak.	*/
+	if (job_list)
+		list_destroy (job_list);
+
+	if (part_list)
+		list_destroy (part_list);
+
+	if (config_list)
+		list_destroy (config_list);
+	if (node_record_table_ptr)
+		xfree (node_record_table_ptr);
+	if (hash_table)
+		xfree (hash_table);
+
+	agent_purge ();
+#endif
 	return NULL;
 }