diff --git a/src/slurmd/shmem_struct.c b/src/slurmd/shmem_struct.c
index 74903b21cd7dac35f581c725d4c4261bad351e16..a8d5e93d38b95c0a6a73e858a8630b220fd1f8fd 100644
--- a/src/slurmd/shmem_struct.c
+++ b/src/slurmd/shmem_struct.c
@@ -195,3 +195,22 @@ int find_job_id_for_session ( slurmd_shmem_t * shmem , int session_id )
 	info ( "No job_id found for session_id %i", session_id );
 	return SLURM_FAILURE ; 
 }
+
+void * find_job_step ( slurmd_shmem_t * shmem , int job_id , int job_step_id ) 
+{
+	int i ;
+	pthread_mutex_lock ( & shmem -> mutex ) ;
+	for ( i=0 ; i < MAX_JOB_STEPS ; i ++ )
+        {
+		if (shmem -> job_steps[i].used == false 
+				&& shmem -> job_steps[i].job_id == job_id 
+				&& shmem -> job_steps[i].job_step_id == job_step_id 
+			)
+		{
+			pthread_mutex_unlock ( & shmem -> mutex ) ;
+			return & shmem -> job_steps[i] ;
+		} 
+        }
+	pthread_mutex_unlock ( & shmem -> mutex ) ;
+	return (void * ) SLURM_ERROR ;
+}
diff --git a/src/slurmd/shmem_struct.h b/src/slurmd/shmem_struct.h
index c3d1be92b49b11f7b2c068d002b8c16d872f831b..a0cb853c7f8bdd1eb6c66645a0aa1582447cc687 100644
--- a/src/slurmd/shmem_struct.h
+++ b/src/slurmd/shmem_struct.h
@@ -54,4 +54,6 @@ void * alloc_task ( slurmd_shmem_t * shmem , job_step_t * job_step ) ;
 int find_job_id_for_session ( slurmd_shmem_t * shmem , int session_id ) ;
 /* clears a job_step and associated task list for future use */
 int deallocate_job_step ( job_step_t * jobstep ) ;
+/* find a particular job_step */
+void * find_job_step ( slurmd_shmem_t * shmem , int job_id , int job_step_id ) ;
 #endif
diff --git a/src/slurmd/task_mgr.c b/src/slurmd/task_mgr.c
index c2bafece4cfed5a6ffcbf4b60b3c1b81567884b1..8702988038234a95cb095a64c97fd7c7c0c1ccdb 100644
--- a/src/slurmd/task_mgr.c
+++ b/src/slurmd/task_mgr.c
@@ -464,24 +464,20 @@ int setup_child_pipes ( int * pipes )
 int kill_tasks ( kill_tasks_msg_t * kill_task_msg )
 {
 	int error_code = SLURM_SUCCESS ;
-
+	slurmd_shmem_t * shmem_ptr = get_shmem ( ) ;
+	job_step_t * job_step_ptr = find_job_step ( shmem_ptr , kill_task_msg -> job_id , kill_task_msg -> job_step_id ) ;
+	task_t * task_ptr = job_step_ptr -> head_task ;
+	while ( task_ptr != NULL )
+	{
+		kill_task ( task_ptr ) ;
+		task_ptr = task_ptr -> next ;
+	}
 	return error_code ;
 }
 
 
 int kill_task ( task_t * task )
 {
-	return SLURM_SUCCESS ;
-}
-
-int setup_task_env  (task_start_t * task_start )
-{
-	int i ;
-	for ( i = 0 ; i < task_start -> launch_msg -> envc ; i ++ )
-	{
-		char * env_var = xmalloc ( strlen (  task_start -> launch_msg -> env[i] ) ) ;
-		memcpy ( env_var , task_start -> launch_msg -> env[i] , strlen (  task_start -> launch_msg -> env[i] ) ) ;
-		putenv ( env_var ) ;
-	}
+	kill ( task -> task_start . exec_pid , SIGKILL ) ;
 	return SLURM_SUCCESS ;
 }