diff --git a/doc/html/programmer.guide.html b/doc/html/programmer.guide.html
index 31794c65fc6354b41d6a0123e38bc2d0b5ab58de..b04273baa8ccc94ce2bd9209ab4c95335e8593a1 100644
--- a/doc/html/programmer.guide.html
+++ b/doc/html/programmer.guide.html
@@ -411,7 +411,7 @@ main (int argc, char *argv[])
 	job_ptr = job_buffer_ptr->job_table_ptr;
 
 	for (i = 0; i < job_buffer_ptr->job_count; i++) {
-		printf ("JobId=%s UserId=%u\n", 
+		printf ("JobId=%u UserId=%u\n", 
 			job_ptr[i].job_id, job_ptr[i].user_id);
 	}			
 	slurm_free_job_info (job_buffer_ptr);
diff --git a/src/api/allocate.c b/src/api/allocate.c
index 8fb5cfaf04368c0f222f3343f66bb28cef8631a1..2598a35a05b54fc3d2d5d445be902ff64bd7fdec 100644
--- a/src/api/allocate.c
+++ b/src/api/allocate.c
@@ -29,7 +29,8 @@ int
 main (int argc, char *argv[])
 {
 	int error_code;
-	char *node_list, *job_id;
+	char *node_list;
+	uint16_t job_id;
 
 	error_code = slurm_allocate
 		("User=1500 JobName=job01 TotalNodes=400 TotalProcs=1000 ReqNodes=lx[3000-3003] Partition=batch MinRealMemory=1024 MinTmpDisk=2034 Groups=students,employee MinProcs=4 Contiguous=YES Key=1234",
@@ -37,9 +38,8 @@ main (int argc, char *argv[])
 	if (error_code)
 		printf ("allocate error %d\n", error_code);
 	else {
-		printf ("allocate nodes %s to job %s\n", node_list, job_id);
+		printf ("allocate nodes %s to job %u\n", node_list, job_id);
 		free (node_list);
-		free (job_id);
 	}
 
 	while (1) {
@@ -51,9 +51,8 @@ main (int argc, char *argv[])
 			break;
 		}
 		else {
-			printf ("allocate nodes %s to job %s\n", node_list, job_id);
+			printf ("allocate nodes %s to job %u\n", node_list, job_id);
 			free (node_list);
-			free (job_id);
 		}
 	}
 
@@ -66,9 +65,8 @@ main (int argc, char *argv[])
 			break;
 		}
 		else {
-			printf ("allocate nodes %s to job %s\n", node_list, job_id);
+			printf ("allocate nodes %s to job %u\n", node_list, job_id);
 			free (node_list);
-			free (job_id);
 		}
 	}
 
@@ -80,8 +78,9 @@ main (int argc, char *argv[])
 /*
  * slurm_allocate - allocate nodes for a job with supplied contraints. 
  * input: spec - specification of the job's constraints
- *        job_id - place into which a job_id pointer can be placed
- * output: job_id - node_list - list of allocated nodes
+ *        job_id - place into which a job_id can be stored
+ * output: job_id - the job's id
+ *         node_list - list of allocated nodes
  *         returns 0 if no error, EINVAL if the request is invalid, 
  *			EAGAIN if the request can not be satisfied at present
  * NOTE: required specifications include: User=<uid>
@@ -93,17 +92,16 @@ main (int argc, char *argv[])
  *	Shared=<YES|NO> TimeLimit=<minutes> TotalNodes=<count>
  *	TotalProcs=<count>
  * NOTE: the calling function must free the allocated storage at node_list[0]
- *	and job_id[0]
  */
 int
-slurm_allocate (char *spec, char **node_list, char **job_id) 
+slurm_allocate (char *spec, char **node_list, uint16_t *job_id) 
 {
 	int buffer_offset, buffer_size, in_size;
 	char *request_msg, *buffer, *job_id_ptr;
 	int sockfd;
 	struct sockaddr_in serv_addr;
 
-	node_list[0] = job_id[0] = NULL;
+	node_list[0] = NULL;
 	if ((spec == NULL) || (node_list == (char **) NULL))
 		return EINVAL;
 	request_msg = malloc (strlen (spec) + 10);
@@ -164,10 +162,7 @@ slurm_allocate (char *spec, char **node_list, char **job_id)
 	}
 	job_id_ptr = strchr(buffer, (int) ' ');
 	if (job_id_ptr != NULL) {
-		job_id[0] = malloc(strlen(job_id_ptr));
-		job_id_ptr[0] = (char) NULL;
-		if (job_id[0] != NULL)
-			strcpy(job_id[0], &job_id_ptr[1]);
+		*job_id = (uint16_t) atoi (&job_id_ptr[1]);
 	}
 	node_list[0] = buffer;
 	return 0;
diff --git a/src/api/cancel.c b/src/api/cancel.c
index 959f3370f916c5c9405dd7e4224c2b803d6a2634..79e7ee4c7f6dc76478c9fc49ccdce55ec8860673 100644
--- a/src/api/cancel.c
+++ b/src/api/cancel.c
@@ -13,6 +13,7 @@
 
 #include <errno.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <syslog.h>
 #include <sys/socket.h>
@@ -20,7 +21,6 @@
 #include <arpa/inet.h>
 #include <unistd.h>
 
-#include "slurm.h"
 #include "slurmlib.h"
 
 #if DEBUG_MODULE
@@ -36,7 +36,7 @@ main (int argc, char *argv[])
 	}
 
 	for (i=1; i<argc; i++) {
-		error_code = slurm_cancel (argv[i]);
+		error_code = slurm_cancel ((uint16_t) atoi(argv[i]));
 		if (error_code != 0)
 			printf ("slurm_cancel error %d for job %s\n", 
 				error_code, argv[i]);
@@ -54,21 +54,19 @@ main (int argc, char *argv[])
  *			EAGAIN if the request can not be satisfied at present
  */
 int
-slurm_cancel (char *job_id) 
+slurm_cancel (uint16_t job_id) 
 {
 	int buffer_offset, buffer_size, in_size;
-	char *request_msg, *buffer;
+	char *request_msg, *buffer, id_str[20];
 	int sockfd;
 	struct sockaddr_in serv_addr;
 
-	if (job_id == NULL)
-		return EINVAL;
-
-	request_msg = malloc (strlen (job_id) + 11);
+	sprintf (id_str, "%u", job_id);
+	request_msg = malloc (strlen (id_str) + 11);
 	if (request_msg == NULL)
 		return EAGAIN;
 	strcpy (request_msg, "JobCancel ");
-	strcat (request_msg, job_id);
+	strcat (request_msg, id_str);
 
 	if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0)
 		return EINVAL;
diff --git a/src/api/job_info.c b/src/api/job_info.c
index 39324daa74ab9ef3c7c8f6f64ed5b759914f7c9d..a5141bfd9c14c6674b63fae79ab7721b2f62e277 100644
--- a/src/api/job_info.c
+++ b/src/api/job_info.c
@@ -46,7 +46,7 @@ main (int argc, char *argv[])
 	job_ptr = job_buffer_ptr->job_table_ptr;
 
 	for (i = 0; i < job_buffer_ptr->job_count; i++) {
-		printf ("JobId=%s UserId=%u ", 
+		printf ("JobId=%u UserId=%u ", 
 			job_ptr[i].job_id, job_ptr[i].user_id);
 		printf ("JobState=%u TimeLimit=%u ", 
 			job_ptr[i].job_state, job_ptr[i].time_limit);
@@ -213,10 +213,7 @@ slurm_load_job (time_t update_time, struct job_buffer **job_buffer_ptr)
 			free (buffer);
 			return ENOMEM;
 		}
-		unpackstr_ptr (&job[i].job_id, &uint16_tmp, 
-			&buf_ptr, &buffer_size);
-		if (job[i].job_id == NULL)
-			job[i].job_id = "";
+		unpack16  (&job[i].job_id, &buf_ptr, &buffer_size);
 		unpack32  (&job[i].user_id, &buf_ptr, &buffer_size);
 		unpack16  (&job[i].job_state, &buf_ptr, &buffer_size);
 		unpack32  (&job[i].time_limit, &buf_ptr, &buffer_size);
diff --git a/src/api/submit.c b/src/api/submit.c
index 3c39771653f9291d25f8a59bc6614aa3310f67d1..75800040dbb1855c8c65d6f33692fbce0e27aeeb 100644
--- a/src/api/submit.c
+++ b/src/api/submit.c
@@ -28,8 +28,8 @@
 int 
 main (int argc, char *argv[]) 
 {
-	int error_code, i;
-	char *job_id;
+	int error_code, i, count;
+	uint16_t job_id;
 
 	error_code = slurm_submit
 		("User=1500 Script=/bin/hostname JobName=job01 TotalNodes=400 TotalProcs=1000 ReqNodes=lx[3000-3003] Partition=batch MinRealMemory=1024 MinTmpDisk=2034 Groups=students,employee MinProcs=4 Contiguous=YES Key=1234",
@@ -38,12 +38,15 @@ main (int argc, char *argv[])
 		printf ("submit error %d\n", error_code);
 		exit (error_code);
 	}
-	else {
-		printf ("job %s submitted\n", job_id);
-		free (job_id);
-	}			/* else */
+	else
+		printf ("job %u submitted\n", job_id);
 
-	for (i=0; i<5; i++) {
+	if (argc > 1) 
+		count = atoi (argv[1]);
+	else
+		count = 5;
+
+	for (i=0; i<count; i++) {
 		error_code = slurm_submit
 			("User=1500 Script=/bin/hostname JobName=more TotalProcs=4000 Partition=batch Key=1234 ",
 			 &job_id);
@@ -52,8 +55,7 @@ main (int argc, char *argv[])
 			break;
 		}
 		else {
-			printf ("job %s submitted\n", job_id);
-			free (job_id);
+			printf ("job %u submitted\n", job_id);
 		}
 	}
 
@@ -68,7 +70,6 @@ main (int argc, char *argv[])
  *	job_id - place to store id of submitted job
  * output: job_id - the job's id
  *	returns 0 if no error, EINVAL if the request is invalid
- * NOTE: the caller must free the storage at job_id[0]
  * NOTE: required specification include: Script=<script_path_name>
  *	User=<uid>
  * NOTE: optional specifications include: Contiguous=<YES|NO> 
@@ -80,14 +81,14 @@ main (int argc, char *argv[])
  *	TotalProcs=<count> Immediate=<YES|NO>
  */
 int
-slurm_submit (char *spec, char **job_id)
+slurm_submit (char *spec, uint16_t *job_id)
 {
 	int buffer_offset, buffer_size, in_size;
 	char *request_msg, *buffer;
 	int sockfd;
 	struct sockaddr_in serv_addr;
 
-	if ((spec == NULL) || (job_id == (char **) NULL))
+	if (spec == NULL)
 		return EINVAL;
 	request_msg = malloc (strlen (spec) + 10);
 	if (request_msg == NULL)
@@ -145,6 +146,6 @@ slurm_submit (char *spec, char **job_id)
 		free (buffer);
 		return EINVAL;
 	}
-	job_id[0] = buffer;
+	*job_id = (uint16_t) atoi (buffer);
 	return 0;
 }
diff --git a/src/common/slurm.h b/src/common/slurm.h
index bbb46b94fcecb77e7c52e64f2e071e88538c319c..756cf5d62c90e44d1e4398c5ed325457f3a89ca7 100644
--- a/src/common/slurm.h
+++ b/src/common/slurm.h
@@ -151,10 +151,11 @@ struct job_details {
 };
 
 struct job_record {
-	char job_id[MAX_ID_LEN];	/* job ID */
+	uint16_t job_id;		/* job ID */
 	uint32_t magic;			/* magic cookie to test data integrity */
 	char name[MAX_NAME_LEN];	/* name of the job */
 	char partition[MAX_NAME_LEN];	/* name of the partition */
+	struct part_record *part_ptr;	/* pointer to the partition record */
 	uint32_t user_id;		/* user the job runs as */
 	enum job_states job_state;	/* state of the job */
 	char *nodes;			/* comma delimited list of nodes allocated to job */
@@ -309,7 +310,7 @@ extern void  delete_job_details (struct job_record *job_entry);
  * output: return 0 on success, errno otherwise
  * global: job_list - pointer to global job list
  */
-extern int delete_job_record (char *job_id);
+extern int delete_job_record (uint16_t job_id);
 
 /* 
  * delete_node_record - delete record for node with specified name
@@ -334,7 +335,7 @@ extern int delete_part_record (char *name);
  * output: return 0 on success, errno otherwise
  * global: step_list - global step list
  */
-extern int delete_step_record (char *job_id, uint16_t step_id);
+extern int delete_step_record (uint16_t job_id, uint16_t step_id);
 
 /* 
  * find_job_record - return a pointer to the job record with the given job_id
@@ -342,7 +343,7 @@ extern int delete_step_record (char *job_id, uint16_t step_id);
  * output: pointer to the job's record, NULL on error
  * global: job_list - global job list pointer
  */
-extern struct job_record *find_job_record (char *job_id);
+extern struct job_record *find_job_record (uint16_t job_id);
 
 /* 
  * find_node_record - find a record for node with specified name,
@@ -366,7 +367,7 @@ extern struct part_record *find_part_record (char *name);
  * output: pointer to the job step's record, NULL on error
  * global: step_list - global step list
  */
-extern struct step_record *find_step_record (char *job_id, uint16_t step_id);
+extern struct step_record *find_step_record (uint16_t job_id, uint16_t step_id);
 
 /* 
  * init_job_conf - initialize the job configuration tables and values. 
@@ -431,10 +432,9 @@ extern int  is_key_valid (int key);
  * globals: job_list - pointer to global job list 
  *	list_part - global list of partition info
  *	default_part_loc - pointer to default partition 
- * NOTE: the calling program must xfree the memory pointed to by new_job_id 
- *	and node_list
+ * NOTE: the calling program must xfree the memory pointed to by node_list
  */
-extern int job_allocate (char *job_specs, char **new_job_id, char **node_list);
+extern int job_allocate (char *job_specs, uint16_t *new_job_id, char **node_list);
 
 /* 
  * job_cancel - cancel the specified job
@@ -444,7 +444,7 @@ extern int job_allocate (char *job_specs, char **new_job_id, char **node_list);
  * global: job_list - pointer global job list
  *	last_job_update - time of last job table update
  */
-extern int job_cancel (char * job_id);
+extern int job_cancel (uint16_t job_id);
 
 /*
  * job_create - parse the suppied job specification and create job_records for it
@@ -456,9 +456,8 @@ extern int job_cancel (char * job_id);
  * globals: job_list - pointer to global job list 
  *	list_part - global list of partition info
  *	default_part_loc - pointer to default partition 
- * NOTE: the calling program must xfree the memory pointed to by new_job_id
  */
-extern int job_create (char *job_specs, char **new_job_id, int allocate);
+extern int job_create (char *job_specs, uint16_t *new_job_id, int allocate);
 
 /* job_lock - lock the job information */
 extern void job_lock ();
@@ -722,7 +721,7 @@ extern int parse_job_specs (char *job_specs, char **req_features, char **req_nod
 		 int *contiguous, int *req_cpus, int *req_nodes,
 		 int *min_cpus, int *min_memory, int *min_tmp_disk, int *key,
 		 int *shared, int *dist, char **script, int *time_limit, 
-		 int *procs_per_task, char **job_id, int *priority, 
+		 int *procs_per_task, int *job_id, int *priority, 
 		 int *user_id);
 
 /* part_lock - lock the partition information */
@@ -844,9 +843,8 @@ extern int slurm_parser (char *spec, ...);
  * globals: job_list - pointer to global job list 
  *	list_part - global list of partition info
  *	default_part_loc - pointer to default partition 
- * NOTE: the calling program must xfree the memory pointed to by new_job_id
  */
-extern int step_create (char *step_specs, char **new_job_id, int allocate);
+extern int step_create (char *step_specs, uint16_t *new_job_id, int allocate);
 
 /* step_lock - lock the step information 
  * global: step_mutex - semaphore for the step table
@@ -867,7 +865,7 @@ extern void step_unlock ();
  * NOTE: the contents of spec are overwritten by white space
  * NOTE: only the job's priority and time_limt may be changed once queued
  */
-extern int update_job (char *job_id, char *spec);
+extern int update_job (uint16_t job_id, char *spec);
 
 /* 
  * update_node - update the configuration data for one or more nodes
diff --git a/src/common/slurmlib.h b/src/common/slurmlib.h
index c06ab7f52e4da2eb812b7d09dc3cdef5785012fd..429e26e1d05fd943c8070f33c65920c49bae12a8 100644
--- a/src/common/slurmlib.h
+++ b/src/common/slurmlib.h
@@ -81,7 +81,7 @@ struct build_buffer {
 };
 
 struct job_table {
-	char *job_id;		/* job ID */
+	uint16_t job_id;	/* job ID */
 	char *name;		/* name of the job */
 	uint32_t user_id;	/* user the job runs as */
 	uint16_t job_state;	/* state of the job, see enum job_states */
@@ -158,8 +158,9 @@ struct part_buffer {
 /*
  * slurm_allocate - allocate nodes for a job with supplied contraints. 
  * input: spec - specification of the job's constraints
- *        job_id - place into which a job_id pointer can be placed
- * output: job_id - node_list - list of allocated nodes
+ *        job_id - place into which a job_id can be stored
+ * output: job_id - the job's id
+ *         node_list - list of allocated nodes
  *         returns 0 if no error, EINVAL if the request is invalid, 
  *			EAGAIN if the request can not be satisfied at present
  * NOTE: required specifications include: User=<uid>
@@ -171,9 +172,8 @@ struct part_buffer {
  *	Shared=<YES|NO> TimeLimit=<minutes> TotalNodes=<count>
  *	TotalProcs=<count>
  * NOTE: the calling function must free the allocated storage at node_list[0]
- * NOTE: the calling function must free the allocated storage at job_id[0]
  */
-extern int slurm_allocate (char *spec, char **node_list, char **job_id);
+extern int slurm_allocate (char *spec, char **node_list, uint16_t *job_id);
 
 /*
  * slurm_cancel - cancel the specified job 
@@ -181,7 +181,7 @@ extern int slurm_allocate (char *spec, char **node_list, char **job_id);
  * output: returns 0 if no error, EINVAL if the request is invalid, 
  *			EAGAIN if the request can not be satisfied at present
  */
-extern int slurm_cancel (char *job_id);
+extern int slurm_cancel (uint16_t job_id);
 
 /*
  * slurm_free_build_info - free the build information buffer (if allocated)
@@ -271,7 +271,6 @@ extern int slurm_load_part (time_t update_time, struct part_buffer **part_buffer
  *	job_id - place to store id of submitted job
  * output: job_id - the job's id
  *	returns 0 if no error, EINVAL if the request is invalid
- * NOTE: the caller must free the storage at job_id[0]
  * NOTE: required specification include: Script=<script_path_name>
  *	User=<uid>
  * NOTE: optional specifications include: Contiguous=<YES|NO> 
@@ -282,7 +281,7 @@ extern int slurm_load_part (time_t update_time, struct part_buffer **part_buffer
  *	Shared=<YES|NO> TimeLimit=<minutes> TotalNodes=<count>
  *	TotalProcs=<count> Immediate=<YES|NO>
  */
-extern int slurm_submit (char *spec, char **job_id);
+extern int slurm_submit (char *spec, uint16_t *job_id);
 
 /*
  * slurm_will_run - determine if a job would execute immediately 
@@ -301,7 +300,7 @@ extern int slurm_submit (char *spec, char **job_id);
  *	Shared=<YES|NO> TimeLimit=<minutes> TotalNodes=<count>
  *	TotalProcs=<count>
  */
-extern int slurm_will_run (char *spec, char **job_id);
+extern int slurm_will_run (char *spec, uint16_t *job_id);
 
 /* 
  * parse_node_name - parse the node name for regular expressions and return a sprintf format 
diff --git a/src/scontrol/scontrol.c b/src/scontrol/scontrol.c
index b24ac6f4b6862f521e1fd6758d716accb6f8bee6..546f827c3340a6b7bcedc7485139cd452e5e0fb5 100644
--- a/src/scontrol/scontrol.c
+++ b/src/scontrol/scontrol.c
@@ -24,7 +24,7 @@ static int input_words;		/* number of words of input permitted */
 void dump_command (int argc, char *argv[]);
 int get_command (int *argc, char *argv[]);
 void print_build (char *build_param);
-void print_job (char *job_id);
+void print_job (char * job_id_str);
 void print_node (char *node_name, struct node_buffer *node_buffer_ptr);
 void print_node_list (char *node_list);
 void print_part (char *partition_name);
@@ -271,12 +271,13 @@ print_build (char *build_param)
 
 /*
  * print_job - print the specified job's information
- * input: job_id - NULL to print information about all jobs
+ * input: job_id - job's id or NULL to print information about all jobs
  */
 void 
-print_job (char *job_id) 
+print_job (char * job_id_str) 
 {
 	int error_code, i;
+	uint16_t job_id = 0;
 	static struct job_buffer *old_job_buffer_ptr = NULL;
 	struct job_buffer *job_buffer_ptr = NULL;
 	struct job_table *job_ptr = NULL;
@@ -298,17 +299,21 @@ print_job (char *job_id)
 	}
 	else if (error_code == 0)
 		old_job_buffer_ptr = job_buffer_ptr;
+printf("time=%lu\n",(long)old_job_buffer_ptr->last_update);
 
 	if (quiet_flag == -1)
 		printf ("last_update_time=%ld\n", (long) job_buffer_ptr->last_update);
 
+	if (job_id_str)
+		job_id = (uint16_t) atoi (job_id_str);
+
 	job_ptr = job_buffer_ptr->job_table_ptr;
 	for (i = 0; i < job_buffer_ptr->job_count; i++) {
-		if (job_id && 
-		    strcmp (job_id, job_ptr[i].job_id) != 0)
+		if (job_id_str && 
+		    job_id != job_ptr[i].job_id) 
 			continue;
 
-		printf ("JobId=%s UserId=%u ", 
+		printf ("JobId=%u UserId=%u ", 
 			job_ptr[i].job_id, job_ptr[i].user_id);
 		printf ("JobState=%u TimeLimit=%u ", 
 			job_ptr[i].job_state, job_ptr[i].time_limit);
@@ -335,7 +340,7 @@ print_job (char *job_id)
 		printf ("JobScript=%s\n\n",
 			job_ptr[i].job_script);
 
-		if (job_id)
+		if (job_id_str)
 			break;
 	}
 }