diff --git a/src/common/credential_utils.c b/src/common/credential_utils.c
index d7ab4cebbe15a5aca136b85481607a5dcc0a2aec..1fa06607340a4b42c0816e2ee952bbbf75e03d11 100644
--- a/src/common/credential_utils.c
+++ b/src/common/credential_utils.c
@@ -29,6 +29,7 @@ static int is_credential_still_valid ( slurm_job_credential_t * credential , Lis
 static int init_credential_state ( credential_state_t * credential_state , slurm_job_credential_t * credential ) ;
 void free_credential_state ( void * credential_state ) ;
 static int insert_credential_state ( slurm_job_credential_t * credential , List list ) ;
+static int insert_revoked_credential_state ( revoke_credential_msg_t * revoke_msg , List list ) ;
 	
 int sign_credential ( slurm_ssl_key_ctx_t * sign_ctx , slurm_job_credential_t * credential ) 
 {
@@ -121,8 +122,8 @@ int revoke_credential ( revoke_credential_msg_t * revoke_msg , List list )
 			return SLURM_SUCCESS ;
 		}
 	}
-	slurm_seterrno ( ESLURMD_CREDENTIAL_TO_EXPIRE_DOESNOT_EXIST ) ;
-	return SLURM_FAILURE ;
+	insert_revoked_credential_state ( revoke_msg , list ) ;
+	return SLURM_SUCCESS ;
 }
 
 int is_credential_still_valid ( slurm_job_credential_t * credential , List list )
@@ -207,3 +208,18 @@ int insert_credential_state ( slurm_job_credential_t * credential , List list )
 	list_append ( list , credential_state ) ;
 	return SLURM_SUCCESS ;	
 }
+
+int insert_revoked_credential_state ( revoke_credential_msg_t * revoke_msg , List list )
+{
+	time_t now = time ( NULL ) ;
+	credential_state_t * credential_state ;
+	
+	credential_state = xmalloc ( sizeof ( slurm_job_credential_t ) ) ;
+	credential_state -> job_id = revoke_msg -> job_id ;	
+	credential_state -> expiration = revoke_msg -> expiration_time ;
+	credential_state -> revoked = true ;
+	credential_state -> revoke_time = now ;
+	list_append ( list , credential_state ) ;
+	return SLURM_SUCCESS ;	
+}
+
diff --git a/src/common/slurm_protocol_defs.h b/src/common/slurm_protocol_defs.h
index fb3cb90bd8eb8345ddbb7aa6a45c6646af5cafea..207620b7edefef54ee83a918ba0f4674a73f794f 100644
--- a/src/common/slurm_protocol_defs.h
+++ b/src/common/slurm_protocol_defs.h
@@ -487,6 +487,7 @@ typedef struct return_code_msg {
 typedef struct revoke_credential_msg
 {
 	uint32_t job_id ;
+	time_t expiration_time;	
 	char signature[SLURM_SSL_SIGNATURE_LENGTH] ;
 } revoke_credential_msg_t ;
 
diff --git a/src/common/slurm_protocol_pack.c b/src/common/slurm_protocol_pack.c
index ad72fc92d38a13cff1d295f44ed24dadb7eca7ba..8637d2d87548df66ba8ff91e688084ccb7fc21bf 100644
--- a/src/common/slurm_protocol_pack.c
+++ b/src/common/slurm_protocol_pack.c
@@ -731,6 +731,7 @@ void pack_revoke_credential_msg ( revoke_credential_msg_t* msg , void ** buffer
 	assert ( msg != NULL );
 
 	pack32( msg->job_id, buffer, length ) ;
+	pack32( ( uint32_t ) msg->expiration_time, buffer, length ) ;
 	packmem( msg->signature, SLURM_SSL_SIGNATURE_LENGTH , buffer, length ) ; 
 }
 
@@ -744,6 +745,7 @@ int unpack_revoke_credential_msg ( revoke_credential_msg_t** msg , void ** buffe
 		return ENOMEM;
 
 	unpack32( &(tmp_ptr->job_id), buffer, length ) ;
+	unpack32( &(tmp_ptr->expiration_time), buffer, length ) ;
 	unpackmem( tmp_ptr->signature, & uint16_tmp , buffer, length ) ; 
 
 	*msg = tmp_ptr;
diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c
index 3c2e6072487612aa1c6a7c066d6a84ac251de321..ddf43a09e66ee1c3efa0455a5fcc328bb0ecdd5a 100644
--- a/src/slurmctld/job_mgr.c
+++ b/src/slurmctld/job_mgr.c
@@ -710,6 +710,7 @@ load_job_state ( void )
 #ifdef HAVE_LIBELAN3
 			if (buffer_size < (2 * sizeof (uint16_t)))
 				break;
+			qsw_alloc_jobinfo(&step_ptr->qsw_job);
 			qsw_unpack_jobinfo(step_ptr->qsw_job, buf_ptr, &buffer_size);
 #endif
 			safe_unpack16 (&step_flag, &buf_ptr, &buffer_size);
diff --git a/src/slurmctld/node_scheduler.c b/src/slurmctld/node_scheduler.c
index a4460d072ea97f44dee0dc61553dc64b16cf3066..88f314d99d55553ad5d46d209c32c33b667800b4 100644
--- a/src/slurmctld/node_scheduler.c
+++ b/src/slurmctld/node_scheduler.c
@@ -199,6 +199,7 @@ deallocate_nodes (struct job_record  * job_ptr)
 
 	last_node_update = time (NULL);
 	revoke_job_cred.job_id = job_ptr -> job_id;
+	revoke_job_cred.expiration_time = job_ptr -> details -> credential . expiration_time ;
 	memset ( (void *)revoke_job_cred.signature, 0, sizeof (revoke_job_cred.signature));
 
 	for (i = 0; i < node_record_count; i++) {
diff --git a/src/slurmd/slurmd.c b/src/slurmd/slurmd.c
index 8f7297588cf6f70e235509abb287c6f6d1768622..04c3b87f4d69090eabc2e4f3d5c2d15036d64c00 100644
--- a/src/slurmd/slurmd.c
+++ b/src/slurmd/slurmd.c
@@ -511,9 +511,9 @@ void slurm_rpc_revoke_credential ( slurm_msg_t * msg )
 	/* return result */
 	if (error_code)
 	{
-		error ("slurmd_req:  error %d, time=%ld",
+		error ("slurmd_req:  error %m errno %d, time=%ld",
 				error_code, (long) (clock () - start_time));
-		slurm_send_rc_msg ( msg , error_code );
+		slurm_send_rc_msg ( msg , errno );
 	}
 	else
 	{