diff --git a/src/api/allocate.c b/src/api/allocate.c
index 9baad9f054623920a1e3d9239587cbd9717fcfc7..d05cc44277322941dc825abcf18f731b3a7c88ab 100644
--- a/src/api/allocate.c
+++ b/src/api/allocate.c
@@ -1,5 +1,5 @@
 /*****************************************************************************\
- * allocate.c - allocate nodes for a job with supplied contraints
+ * allocate.c - allocate nodes for a job or step with supplied contraints
  *****************************************************************************
  *  Copyright (C) 2002 The Regents of the University of California.
  *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
@@ -87,6 +87,7 @@ slurm_allocate_resources (job_desc_msg_t * job_desc_msg ,
 				slurm_seterrno ( rc );
 				return SLURM_PROTOCOL_ERROR;
 			}
+			*slurm_alloc_msg = NULL;
 			break ;
 		case RESPONSE_RESOURCE_ALLOCATION:
 		case RESPONSE_IMMEDIATE_RESOURCE_ALLOCATION:
@@ -151,6 +152,7 @@ int slurm_job_will_run (job_desc_msg_t * job_desc_msg , resource_allocation_resp
 				slurm_seterrno ( rc );
 				return SLURM_PROTOCOL_ERROR;
 			}
+			*slurm_alloc_msg = NULL;
 			break ;
 		case RESPONSE_JOB_WILL_RUN:
 			*slurm_alloc_msg = ( resource_allocation_response_msg_t * ) response_msg . data ;
@@ -215,6 +217,7 @@ slurm_allocate_resources_and_run (job_desc_msg_t * job_desc_msg ,
 				slurm_seterrno ( rc );
 				return SLURM_PROTOCOL_ERROR;
 			}
+			*slurm_alloc_msg = NULL;
 			break ;
 		case RESPONSE_ALLOCATION_AND_RUN_JOB_STEP:
 			/* Calling method is responsible to free this memory */
@@ -230,3 +233,68 @@ slurm_allocate_resources_and_run (job_desc_msg_t * job_desc_msg ,
 	return SLURM_PROTOCOL_SUCCESS ;
 }
 
+/* slurm_job_step_create - create a job step for a given job id */
+int
+slurm_job_step_create (job_step_create_request_msg_t * slurm_step_alloc_req_msg, 
+			job_step_create_response_msg_t ** slurm_step_alloc_resp_msg )
+{
+	int msg_size ;
+	int rc ;
+	slurm_fd sockfd ;
+	slurm_msg_t request_msg ;
+	slurm_msg_t response_msg ;
+	return_code_msg_t * slurm_rc_msg ;
+
+	/* init message connection for message communication with controller */
+	if ( ( sockfd = slurm_open_controller_conn ( ) ) == SLURM_SOCKET_ERROR ) {
+		slurm_seterrno ( SLURM_COMMUNICATIONS_CONNECTION_ERROR );
+		return SLURM_SOCKET_ERROR ;
+	}
+
+	/* send request message */
+	request_msg . msg_type = REQUEST_JOB_STEP_CREATE ;
+	request_msg . data = slurm_step_alloc_req_msg ; 
+	if ( ( rc = slurm_send_controller_msg ( sockfd , & request_msg ) ) == SLURM_SOCKET_ERROR ) {
+		slurm_seterrno ( SLURM_COMMUNICATIONS_SEND_ERROR );
+		return SLURM_SOCKET_ERROR ;
+	}
+
+	/* receive message */
+	if ( ( msg_size = slurm_receive_msg ( sockfd , & response_msg ) ) == SLURM_SOCKET_ERROR ) {
+		slurm_seterrno ( SLURM_COMMUNICATIONS_RECEIVE_ERROR );
+		return SLURM_SOCKET_ERROR ;
+	}
+
+	/* shutdown message connection */
+	if ( ( rc = slurm_shutdown_msg_conn ( sockfd ) ) == SLURM_SOCKET_ERROR ) {
+		slurm_seterrno ( SLURM_COMMUNICATIONS_SHUTDOWN_ERROR );
+		return SLURM_SOCKET_ERROR ;
+	}
+	if ( msg_size )
+		return msg_size;
+
+	switch ( response_msg . msg_type )
+	{
+		case RESPONSE_SLURM_RC:
+			slurm_rc_msg = ( return_code_msg_t * ) response_msg . data ;
+			rc = slurm_rc_msg->return_code;
+			slurm_free_return_code_msg ( slurm_rc_msg );	
+			if (rc) {
+				slurm_seterrno ( rc );
+				return SLURM_PROTOCOL_ERROR;
+			*slurm_step_alloc_resp_msg = NULL;
+			}
+			break ;
+		case RESPONSE_JOB_STEP_CREATE:
+			/* Calling method is responsible to free this memory */
+			*slurm_step_alloc_resp_msg = ( job_step_create_response_msg_t * ) response_msg . data ;
+			return SLURM_PROTOCOL_SUCCESS;
+			break ;
+		default:
+			slurm_seterrno ( SLURM_UNEXPECTED_MSG_ERROR );
+			return SLURM_PROTOCOL_ERROR;
+			break ;
+	}
+
+	return SLURM_PROTOCOL_SUCCESS ;
+}
diff --git a/src/api/slurm.h b/src/api/slurm.h
index 23e3fbc797e8b83963817376282fa42ec70aa23b..884cef695ca6db9dcf089d040d9bb4bba43ab382 100644
--- a/src/api/slurm.h
+++ b/src/api/slurm.h
@@ -114,6 +114,10 @@ extern int slurm_load_partitions (time_t update_time, partition_info_msg_t **par
 extern int slurm_submit_batch_job (job_desc_msg_t * job_desc_msg, 
 		submit_response_msg_t ** slurm_alloc_msg );
 
+/* slurm_job_step_create - create a job step for a given job id */
+extern int slurm_job_step_create (job_step_create_request_msg_t * slurm_step_alloc_req_msg, 
+			job_step_create_response_msg_t ** slurm_step_alloc_resp_msg );
+
 extern int slurm_get_job_steps (time_t update_time, uint32_t job_id, uint32_t step_id, job_step_info_response_msg_t **step_response_pptr);
 extern void  slurm_print_job_step_info_msg ( FILE* out, job_step_info_response_msg_t * job_step_info_msg_ptr );
 extern void slurm_print_job_step_info ( FILE* out, job_step_info_t * job_step_ptr );