diff --git a/src/common/forward.c b/src/common/forward.c
index ff76698387aaa8d11d3f7303e24362c6d38bf358..349ee74ec189e0fce03215cee0039ff1f45b73eb 100644
--- a/src/common/forward.c
+++ b/src/common/forward.c
@@ -47,6 +47,7 @@
 #endif /* WITH_PTHREADS */
 
 #define MAX_RETRIES 3
+int _destroy_data_info_data(ret_data_info_t *ret_data_info);
 
 void *_forward_thread(void *arg)
 {
@@ -188,6 +189,164 @@ cleanup:
 	return (NULL);
 }
 
+int _destroy_data_info_data(ret_data_info_t *ret_data_info)
+{
+	switch(ret_data_info->type) {
+	case REQUEST_RESOURCE_ALLOCATION:
+		slurm_free_job_desc_msg(ret_data_info->data);
+		break;
+	case REQUEST_BUILD_INFO:
+		slurm_free_last_update_msg(ret_data_info->data);
+		break;
+	case REQUEST_JOB_INFO:
+		slurm_free_job_info_request_msg(ret_data_info->data);
+		break;
+	case REQUEST_JOB_END_TIME:
+		slurm_free_old_job_alloc_msg(ret_data_info->data);
+		break;
+	case REQUEST_NODE_INFO:
+		slurm_free_node_info_request_msg(ret_data_info->data);
+		break;
+	case REQUEST_PARTITION_INFO:
+		slurm_free_part_info_request_msg(ret_data_info->data);
+		break;
+	case MESSAGE_EPILOG_COMPLETE:
+		slurm_free_epilog_complete_msg(ret_data_info->data);
+		break;
+	case REQUEST_CANCEL_JOB_STEP:
+		slurm_free_job_step_kill_msg(ret_data_info->data);
+		break;
+	case REQUEST_COMPLETE_JOB_ALLOCATION:
+		slurm_free_complete_job_allocation_msg(ret_data_info->data);
+		break;
+	case REQUEST_COMPLETE_BATCH_SCRIPT:
+		slurm_free_complete_batch_script_msg(ret_data_info->data);
+		break;
+	case REQUEST_JOB_STEP_CREATE:
+		slurm_free_job_step_create_request_msg(ret_data_info->data);
+		break;
+	case REQUEST_JOB_STEP_INFO:
+		slurm_free_job_step_info_request_msg(ret_data_info->data);
+		break;
+	case REQUEST_JOB_WILL_RUN:
+		slurm_free_job_desc_msg(ret_data_info->data);
+		break;
+	case MESSAGE_NODE_REGISTRATION_STATUS:
+		slurm_free_node_registration_status_msg(ret_data_info->data);
+		break;
+	case REQUEST_OLD_JOB_RESOURCE_ALLOCATION:
+		slurm_free_old_job_alloc_msg(ret_data_info->data);
+		break;
+	case REQUEST_PING:		
+		/* No body to free */
+		break;
+	case REQUEST_RECONFIGURE:
+		/* No body to free */
+		break;
+	case REQUEST_CONTROL:
+		/* No body to free */
+		break;
+	case REQUEST_SHUTDOWN:
+		slurm_free_shutdown_msg(ret_data_info->data);
+		break;
+	case REQUEST_SHUTDOWN_IMMEDIATE:
+		/* No body to free */
+		break;
+	case REQUEST_SUBMIT_BATCH_JOB:
+		slurm_free_job_desc_msg(ret_data_info->data);
+		break;
+	case REQUEST_UPDATE_JOB:
+		slurm_free_job_desc_msg(ret_data_info->data);
+		break;
+	case REQUEST_UPDATE_NODE:
+		slurm_free_update_node_msg(ret_data_info->data);
+		break;
+	case REQUEST_UPDATE_PARTITION:
+		slurm_free_update_part_msg(ret_data_info->data);
+		break;
+	case REQUEST_DELETE_PARTITION:		
+		slurm_free_delete_part_msg(ret_data_info->data);
+		break;
+	case REQUEST_NODE_REGISTRATION_STATUS:
+		slurm_free_node_registration_status_msg(ret_data_info->data);
+		break;
+	case REQUEST_CHECKPOINT:
+		slurm_free_checkpoint_msg(ret_data_info->data);
+		break;
+	case REQUEST_CHECKPOINT_COMP:
+		slurm_free_checkpoint_comp_msg(ret_data_info->data);
+		break;
+	case REQUEST_SUSPEND:
+		slurm_free_suspend_msg(ret_data_info->data);
+		break;
+	case REQUEST_JOB_READY:
+		slurm_free_job_id_msg(ret_data_info->data);
+		break;
+	case REQUEST_NODE_SELECT_INFO:
+		slurm_free_node_select_msg(ret_data_info->data);
+		break;
+	case REQUEST_STEP_COMPLETE:
+		slurm_free_step_complete_msg(ret_data_info->data);
+		break;
+	case MESSAGE_STAT_JOBACCT:
+		slurm_free_stat_jobacct_msg(ret_data_info->data);
+		break;
+	case REQUEST_BATCH_JOB_LAUNCH:
+		slurm_free_job_launch_msg(ret_data_info->data);
+		break;
+	case REQUEST_LAUNCH_TASKS:
+		slurm_free_launch_tasks_request_msg(ret_data_info->data);
+		break;
+	case REQUEST_SPAWN_TASK:
+		slurm_free_spawn_task_request_msg(ret_data_info->data);
+		break;
+	case REQUEST_SIGNAL_TASKS:
+		slurm_free_kill_tasks_msg(ret_data_info->data);
+		break;
+	case REQUEST_TERMINATE_TASKS:
+		slurm_free_kill_tasks_msg(ret_data_info->data);
+		break;
+	case REQUEST_KILL_TIMELIMIT:
+		slurm_free_timelimit_msg(ret_data_info->data);
+		break; 
+	case REQUEST_REATTACH_TASKS:
+		slurm_free_reattach_tasks_request_msg(ret_data_info->data);
+		break;
+	case REQUEST_SIGNAL_JOB:
+		slurm_free_signal_job_msg(ret_data_info->data);
+		break;
+	case REQUEST_SUSPEND:
+		slurm_free_suspend_msg(ret_data_info->data);
+		break;
+	case REQUEST_TERMINATE_JOB:
+		slurm_free_kill_job_msg(ret_data_info->data);
+		break;
+	case REQUEST_UPDATE_JOB_TIME:
+		slurm_free_update_job_time_msg(ret_data_info->data);
+		break;
+	case REQUEST_JOB_ID:
+		slurm_free_job_id_request_msg(ret_data_info->data);
+		break;
+	case REQUEST_FILE_BCAST:
+		slurm_free_file_bcast_msg(ret_data_info->data);
+		break;
+	case REQUEST_STEP_COMPLETE:
+		slurm_free_step_complete_msg(ret_data_info->data);
+		break;
+	case MESSAGE_STAT_JOBACCT:
+		slurm_free_stat_jobacct_msg(ret_data_info->data);
+		break;
+	case RESPONSE_SLURM_RC:
+		slurm_free_return_code_msg(ret_data_info->data);
+		break;
+	default:
+		error("invalid RPC msg_type=%d", ret_data_info->msg_type);
+		slurm_send_rc_msg(msg, EINVAL);
+		break; 
+	}
+	return SLURM_SUCCESS;
+}
+
 /*
  * forward_init    - initilize forward structure
  * IN: forward     - forward_t *   - struct to store forward info
@@ -467,6 +626,7 @@ void destroy_data_info(void *object)
 {
 	ret_data_info_t *ret_data_info = (ret_data_info_t *)object;
 	if(ret_data_info) {
+		_destroy_data_info_data(ret_data_info);
 		xfree(ret_data_info->node_name);
 		/*
 		  FIXME: needs to probably be something for all 
diff --git a/src/plugins/jobacct/aix/jobacct_aix.c b/src/plugins/jobacct/aix/jobacct_aix.c
index cda3748098fe259875cbaee5ba00d67d0b9fe809..ef543410ad410a6b5a724c0c3b9bd75aa1f3e152 100644
--- a/src/plugins/jobacct/aix/jobacct_aix.c
+++ b/src/plugins/jobacct/aix/jobacct_aix.c
@@ -269,9 +269,6 @@ struct jobacctinfo *jobacct_p_stat_task(pid_t pid)
 
 struct jobacctinfo *jobacct_p_remove_task(pid_t pid)
 {
-#ifdef HAVE_AIX
-	_get_process_data();
-#endif
 	return common_remove_task(pid);
 }
 
diff --git a/src/plugins/jobacct/linux/jobacct_linux.c b/src/plugins/jobacct/linux/jobacct_linux.c
index 690c9c4111a8afa80639a290ac2e8b2aa755faa3..1de4f66cdcf4f32b986d994b6094f04140f570af 100644
--- a/src/plugins/jobacct/linux/jobacct_linux.c
+++ b/src/plugins/jobacct/linux/jobacct_linux.c
@@ -259,7 +259,6 @@ struct jobacctinfo *jobacct_p_stat_task(pid_t pid)
 
 struct jobacctinfo *jobacct_p_remove_task(pid_t pid)
 {
-	_get_process_data();
 	return common_remove_task(pid);
 }
 
diff --git a/src/slurmd/slurmstepd/mgr.c b/src/slurmd/slurmstepd/mgr.c
index d55ac89d4677b31bf8f890b3882a16d0090e8f81..4ecc314c52ff1f15627073e662ebe0c2d73e36fe 100644
--- a/src/slurmd/slurmstepd/mgr.c
+++ b/src/slurmd/slurmstepd/mgr.c
@@ -908,8 +908,6 @@ _fork_all_tasks(slurmd_job_t *job)
 			(unsigned long) job->task[i]->gtid, 
 			(unsigned long) pid); 
 
-		jobacct_g_add_task(pid, job->task[i]->gtid);
-
 		job->task[i]->pid = pid;
 		if (i == 0)
 			job->pgid = pid;
@@ -945,6 +943,8 @@ _fork_all_tasks(slurmd_job_t *job)
 			goto fail1;
                 }
 
+		jobacct_g_add_task(job->task[i]->pid, job->task[i]->gtid);
+
 		if (spank_task_post_fork (job, i) < 0) {
 			error ("spank task %d post-fork failed", i);
 			return SLURM_ERROR;