diff --git a/src/common/credential_utils.c b/src/common/credential_utils.c
index 603f853f567b8e8f07f0e1e9b0553e5f014d5477..e384717f37214ef561b6a433a8ba80461095c2c6 100644
--- a/src/common/credential_utils.c
+++ b/src/common/credential_utils.c
@@ -19,14 +19,40 @@
 #include <src/common/hostlist.h>
 #define MAX_NAME_LEN 1024
 
-typedef struct revoked_credential
+/* global variables */
+
+/* prototypes */
+
+static int clear_expired_revoked_credentials ( List list ) ;
+static int is_credential_still_valid ( slurm_job_credential_t * credential , List list ) ;
+	
+	
+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 ) ;
+	
+int sign_credential ( slurm_ssl_key_ctx_t * sign_ctx , slurm_job_credential_t * credential ) 
 {
-	int job_id ;
-	time_t expiration ;
-} revoked_credential_t ;
+	char buffer [4096] ;
+	char * buf_ptr = buffer ;
+	int buf_size = sizeof ( buffer ) ;
+	int size = sizeof ( buffer ) ;
+	int error_code = SLURM_SUCCESS ;
+	int signature_size ;
+	
+	pack_job_credential ( credential , (void ** ) & buf_ptr , & size ) ;
+	if ( slurm_ssl_sign ( sign_ctx , buffer , buf_size - size - SLURM_SSL_SIGNATURE_LENGTH , credential -> signature , & signature_size ) )
+	{
+		slurm_seterrno ( ESLURMD_ERROR_SIGNING_CREDENTIAL ) ;
+		error_code = SLURM_ERROR ;
+		goto return_ ;
+	}
 
-int clear_expired_revoked_credentials ( List list ) ;
-int verify_credential ( slurm_ssl_key_ctx_t * verify_ctx , slurm_job_credential_t * credential )
+	return_:
+	return error_code ;
+}
+
+int verify_credential ( slurm_ssl_key_ctx_t * verify_ctx , slurm_job_credential_t * credential , List credential_state_list ) 
 {
 	char buffer [4096] ;
 	char * buf_ptr = buffer ;
@@ -62,35 +88,70 @@ int verify_credential ( slurm_ssl_key_ctx_t * verify_ctx , slurm_job_credential_
 		goto return_ ;
 
 	}
+	*/
+	
+	/*
+	 * need code to check to make sure that only the specified number of procs per node
+	 * are used to launch tasks and not more
+	 */
 
-	if ( is_credential_still_valid ( credential , revoked_credentials_list_t * list ) )
+	if ( is_credential_still_valid ( credential , credential_state_list ) )
 	{
-		slurm_seterrno ( ESLURMD_CREDENTIAL_REVOKED ) ;
 		error_code = SLURM_ERROR ;
 		goto return_ ;
 	}
-	*/
 
 	return_:
 	return error_code ;
 }
 
-int insert_expired_credential ( slurm_job_credential_t * credential , List list ) 
+int expire_credential ( revoke_credential_msg_t * revoke_msg , List list ) 
 {
-	return SLURM_SUCCESS ;
+	time_t now = time ( NULL ) ;
+	ListIterator iterator ;
+	credential_state_t * credential_state ;
+	
+	iterator = list_iterator_create( list ) ;
+
+	while ( ( credential_state = list_next ( iterator ) ) )
+	{
+		if ( revoke_msg -> job_id == credential_state -> job_id ) ;
+		{
+			credential_state -> revoked = true ;
+			credential_state -> revoke_time = now ;
+			return SLURM_SUCCESS ;
+		}
+	}
+	slurm_seterrno ( ESLURMD_CREDENTIAL_TO_EXPIRE_DOESNOT_EXIST ) ;
+	return SLURM_FAILURE ;
 }
 
 int is_credential_still_valid ( slurm_job_credential_t * credential , List list )
 {
 	ListIterator iterator ;
+	credential_state_t * credential_state ;
+	
 	iterator = list_iterator_create( list ) ;
 	clear_expired_revoked_credentials ( list ) ;
-	/*revoked_credential_t * revoked_credential ;
-	while ( ( revoked_credential = list_next ( iterator ) ) )
+
+	while ( ( credential_state = list_next ( iterator ) ) )
 	{
-		if ( credential -> job_id == revoked_credential -> job_id ) ;
+		if ( credential -> job_id == credential_state -> job_id ) ;
+		{
+			if ( credential_state -> revoked )
+			{
+				return ESLURMD_CREDENTIAL_REVOKED ;
+			}
+			/* only allows one launch this is a problem but othrewise we have to do accounting 
+			 * of how many proccess are running and how many the credential allows. */
+			credential_state -> revoked = true ;
+			/* credential_state and is good */
+			return SLURM_SUCCESS ;
+		}
 	}
-	*/
+	/* credential_state does not exist */
+	insert_credential_state ( credential , list ) ;	
+
 	return SLURM_SUCCESS ;
 }
 
@@ -98,16 +159,52 @@ int clear_expired_revoked_credentials ( List list )
 {
 	time_t now = time ( NULL ) ;
 	ListIterator iterator ;
+	credential_state_t * credential_state ;
+
 	iterator = list_iterator_create( list ) ;
-	/*revoked_credential_t * revoked_credential ;
-	while ( ( revoked_credential = list_next ( iterator ) ) )
+	while ( ( credential_state = list_next ( iterator ) ) )
 	{
-		if ( now + EXPIATION_WINDOW > revoked_credential -> expiration )
+		if ( now + EXPIRATION_WINDOW > credential_state -> expiration )
 		{
 			list_delete ( iterator ) ;
 		}
 	}
-	*/
 	return SLURM_SUCCESS ;
 }
-	
+
+int initialize_credential_state_list ( List * list )
+{
+	*list = list_create ( free_credential_state ) ;
+	return SLURM_SUCCESS ;
+}
+
+int destroy_credential_state_list ( List list )
+{
+	list_destroy ( list ) ;
+	return SLURM_SUCCESS ;
+}
+
+int init_credential_state ( credential_state_t * credential_state , slurm_job_credential_t * credential )
+{
+	credential_state -> job_id = credential -> job_id ;	
+	credential_state -> expiration = credential -> expiration_time  ;
+	credential_state -> revoked = false ;
+	return SLURM_SUCCESS ;
+}
+
+void free_credential_state ( void * credential_state )
+{
+	if ( credential_state )
+	{
+		xfree ( credential_state ) ;
+	}
+}
+
+int insert_credential_state ( slurm_job_credential_t * credential , List list )
+{
+	credential_state_t * credential_state ;
+	credential_state = xmalloc ( sizeof ( slurm_job_credential_t ) ) ;
+	init_credential_state ( credential_state , credential ) ;
+	list_append ( list , credential_state ) ;
+	return SLURM_SUCCESS ;	
+}
diff --git a/src/common/credential_utils.h b/src/common/credential_utils.h
index 8d39b9627128ac96b6fb4ad0ccd118b5b4d03e1c..ccefa5cd2aefa53f3e3e6149c5947700a4478c8e 100644
--- a/src/common/credential_utils.h
+++ b/src/common/credential_utils.h
@@ -9,8 +9,28 @@
 #include <openssl/pem.h>
 #include <openssl/ssl.h>
 
+#include <src/common/list.h>
 #include <src/common/slurm_protocol_api.h>
 #include <src/slurmd/signature_utils.h>
-int verify_credential ( slurm_ssl_key_ctx_t * verfify_ctx , slurm_job_credential_t * credential ) ;
+
+typedef struct credential_state
+{
+	int job_id ;
+	short int revoked ;
+	short int procs ;
+	short int totol_procs ;
+	short int procs_allocated ;
+	time_t revoke_time ;
+	time_t expiration ;
+} credential_state_t ;
+
+#define EXPIRATION_WINDOW 600
+
+/* function prototypes */
+int initialize_credential_state_list ( List * list ) ;
+int destroy_credential_state_list ( List list ) ;
+int verify_credential ( slurm_ssl_key_ctx_t * verfify_ctx , slurm_job_credential_t * credential , List credential_state_list ) ;
+int sign_credential ( slurm_ssl_key_ctx_t * sign_ctx , slurm_job_credential_t * credential ) ; 
+int expire_credential ( revoke_credential_msg_t * revoke_msg , List list ) ;
 
 #endif
diff --git a/src/common/slurm_errno.h b/src/common/slurm_errno.h
index 51b5d8d8d61dd396cab8da98f5fc10d2bf0cac17..3a8ad1b007a14483da98a178d052f81fe8accea8 100644
--- a/src/common/slurm_errno.h
+++ b/src/common/slurm_errno.h
@@ -14,4 +14,6 @@
 #define ESLURMD_NODE_NAME_NOT_PRESENT_IN_CREDENTIAL	90006
 #define ESLURMD_CREDENTIAL_EXPIRED			90007
 #define ESLURMD_CREDENTIAL_REVOKED			90008
+#define ESLURMD_CREDENTIAL_TO_EXPIRE_DOESNOT_EXIST	90009
+#define ESLURMD_ERROR_SIGNING_CREDENTIAL		90010
 #endif
diff --git a/src/slurmd/slurmd.c b/src/slurmd/slurmd.c
index 26e1162630617d60f16fac7a034dd0b47d259a59..038ef0c1811b5cf0545cab5e1e080c37c97f6c1f 100644
--- a/src/slurmd/slurmd.c
+++ b/src/slurmd/slurmd.c
@@ -57,6 +57,7 @@ time_t init_time;
 slurmd_shmem_t * shmem_seg ;
 char hostname[MAX_NAME_LEN] ;
 slurm_ssl_key_ctx_t verify_ctx ;
+List credential_state_list ;
 
 /* function prototypes */
 static void slurmd_req ( slurm_msg_t * msg );
@@ -96,7 +97,7 @@ int main (int argc, char *argv[])
 
 	/* shared memory init */
 	slurmd_init ( ) ;
-
+	
 	if ( ( error_code = getnodename (node_name, MAX_NAME_LEN) ) ) 
 		fatal ("slurmd: %m errno %d from getnodename", errno);
 
@@ -119,11 +120,13 @@ int slurmd_init ( )
 	init_shmem ( shmem_seg ) ;
 	slurm_ssl_init ( ) ;
 	slurm_init_verifier ( & verify_ctx , "pub_key_file" ) ;
+	initialize_credential_state_list ( & credential_state_list ) ;
 	return SLURM_SUCCESS ;
 }
 
 int slurmd_destroy ( )
 {
+	destroy_credential_state_list ( credential_state_list ) ;
 	rel_shmem ( shmem_seg ) ;
 	slurm_destroy_ssl_key_ctx ( & verify_ctx ) ;
 	slurm_ssl_destroy ( ) ;
@@ -314,7 +317,7 @@ void slurm_rpc_launch_tasks ( slurm_msg_t * msg )
 
 	/* do RPC call */
 	/* test credentials */
-	verify_credential ( & verify_ctx , task_desc -> credential ) ;
+	verify_credential ( & verify_ctx , task_desc -> credential , credential_state_list ) ;
 
 	task_resp . return_code = error_code ;
 	task_resp . node_name = node_name ;
@@ -408,8 +411,7 @@ void slurm_rpc_revoke_credential ( slurm_msg_t * msg )
 	start_time = clock ();
 
 	/* do RPC call */
-	
-	/*error_code = revoke credential ( revoke_credential_msg ); */
+	error_code = expire_credential ( revoke_credential_msg, credential_state_list ) ;
 	
 	/* return result */
 	if (error_code)