diff --git a/src/sacctmgr/account_functions.c b/src/sacctmgr/account_functions.c
index 89058ef624f1335d5572c96683539a36a9273e73..741b5221aca89cff770ea4f4ccf1d26e4b61b230 100644
--- a/src/sacctmgr/account_functions.c
+++ b/src/sacctmgr/account_functions.c
@@ -667,8 +667,6 @@ extern int sacctmgr_list_account(int argc, char *argv[])
 	ListIterator itr2 = NULL;
 	slurmdb_account_rec_t *acct = NULL;
 	slurmdb_association_rec_t *assoc = NULL;
-	char *object;
-	char *tmp_char = NULL;
 
 	int field_count = 0;
 
@@ -677,35 +675,6 @@ extern int sacctmgr_list_account(int argc, char *argv[])
 	List format_list = list_create(slurm_destroy_char);
 	List print_fields_list; /* types are of print_field_t */
 
-	enum {
-		PRINT_ACCOUNT,
-		PRINT_CLUSTER,
-		PRINT_COORDS,
-		PRINT_DQOS,
-		PRINT_DESC,
-		PRINT_FAIRSHARE,
-		PRINT_GRPCM,
-		PRINT_GRPC,
-		PRINT_GRPJ,
-		PRINT_GRPN,
-		PRINT_GRPS,
-		PRINT_GRPW,
-		PRINT_ID,
-		PRINT_MAXC,
-		PRINT_MAXCM,
-		PRINT_MAXJ,
-		PRINT_MAXN,
-		PRINT_MAXS,
-		PRINT_MAXW,
-		PRINT_ORG,
-		PRINT_QOS,
-		PRINT_QOS_RAW,
-		PRINT_PID,
-		PRINT_PNAME,
-		PRINT_PART,
-		PRINT_USER
-	};
-
 	acct_cond->with_assocs = with_assoc_flag;
 
 	for (i=0; i<argc; i++) {
@@ -722,10 +691,10 @@ extern int sacctmgr_list_account(int argc, char *argv[])
 		list_destroy(format_list);
 		return SLURM_ERROR;
 	} else if(!list_count(format_list)) {
-		slurm_addto_char_list(format_list, "A,Des,O");
+		slurm_addto_char_list(format_list, "Acc,Des,O");
 		if(acct_cond->with_assocs)
 			slurm_addto_char_list(format_list,
-					      "Cl,ParentN,U,Shares,GrpJ,GrpN,"
+					      "Cl,ParentN,U,Share,GrpJ,GrpN,"
 					      "GrpCPUs,GrpS,GrpWall,GrpCPUMins,"
 					      "MaxJ,MaxN,MaxCPUs,MaxS,MaxW,"
 					      "MaxCPUMins,QOS,DefaultQOS");
@@ -746,189 +715,7 @@ extern int sacctmgr_list_account(int argc, char *argv[])
 		}
 	}
 
-	print_fields_list = list_create(destroy_print_field);
-
-	itr = list_iterator_create(format_list);
-	while((object = list_next(itr))) {
-		int command_len = 0;
-		int newlen = 0;
-
-		if((tmp_char = strstr(object, "\%"))) {
-			newlen = atoi(tmp_char+1);
-			tmp_char[0] = '\0';
-		}
-
-		command_len = strlen(object);
-
-		field = xmalloc(sizeof(print_field_t));
-		if(!strncasecmp("Account", object, MAX(command_len, 1))
-		   || !strncasecmp("Acct", object, MAX(command_len, 4))
-		   || !strncasecmp("Name", object, MAX(command_len, 2))) {
-			field->type = PRINT_ACCOUNT;
-			field->name = xstrdup("Account");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Cluster", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_CLUSTER;
-			field->name = xstrdup("Cluster");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Coordinators", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_COORDS;
-			field->name = xstrdup("Coordinators");
-			field->len = 20;
-			field->print_routine = sacctmgr_print_coord_list;
-		} else if(!strncasecmp("DefaultQOS", object,
-				       MAX(command_len, 3))) {
-			field->type = PRINT_DQOS;
-			field->name = xstrdup("Def QOS");
-			field->len = 9;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Description", object,
-				       MAX(command_len, 3))) {
-			field->type = PRINT_DESC;
-			field->name = xstrdup("Descr");
-			field->len = 20;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("FairShare", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_FAIRSHARE;
-			field->name = xstrdup("FairShare");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpCPUMins", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_GRPCM;
-			field->name = xstrdup("GrpCPUMins");
-			field->len = 11;
-			field->print_routine = print_fields_uint64;
-		} else if(!strncasecmp("GrpCPUs", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_GRPC;
-			field->name = xstrdup("GrpCPUs");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPJ;
-			field->name = xstrdup("GrpJobs");
-			field->len = 7;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpNodes", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPN;
-			field->name = xstrdup("GrpNodes");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpSubmitJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPS;
-			field->name = xstrdup("GrpSubmit");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpWall", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPW;
-			field->name = xstrdup("GrpWall");
-			field->len = 11;
-			field->print_routine = print_fields_time;
-		} else if(!strncasecmp("ID", object, MAX(command_len, 1))) {
-			field->type = PRINT_ID;
-			field->name = xstrdup("ID");
-			field->len = 6;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxCPUMinsPerJob", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_MAXCM;
-			field->name = xstrdup("MaxCPUMins");
-			field->len = 11;
-			field->print_routine = print_fields_uint64;
-		} else if(!strncasecmp("MaxCPUsPerJob", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_MAXC;
-			field->name = xstrdup("MaxCPUs");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXJ;
-			field->name = xstrdup("MaxJobs");
-			field->len = 7;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxNodesPerJob", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXN;
-			field->name = xstrdup("MaxNodes");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxSubmitJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXS;
-			field->name = xstrdup("MaxSubmit");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxWallDurationPerJob", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXW;
-			field->name = xstrdup("MaxWall");
-			field->len = 11;
-			field->print_routine = print_fields_time;
-		} else if(!strncasecmp("Organization", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_ORG;
-			field->name = xstrdup("Org");
-			field->len = 20;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("QOSRAWLevel", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_QOS_RAW;
-			field->name = xstrdup("QOS_RAW");
-			field->len = 10;
-			field->print_routine = print_fields_char_list;
-		} else if(!strncasecmp("QOSLevel", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_QOS;
-			field->name = xstrdup("QOS");
-			field->len = 20;
-			field->print_routine = sacctmgr_print_qos_list;
-		} else if(!strncasecmp("ParentID", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_PID;
-			field->name = xstrdup("Par ID");
-			field->len = 6;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("ParentName", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_PNAME;
-			field->name = xstrdup("Par Name");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Shares", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_FAIRSHARE;
-			field->name = xstrdup("Shares");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("User", object, MAX(command_len, 1))) {
-			field->type = PRINT_USER;
-			field->name = xstrdup("User");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else {
-			exit_code=1;
-			fprintf(stderr, "Unknown field '%s'\n", object);
-			xfree(field);
-			continue;
-		}
-
-		if(newlen)
-			field->len = newlen;
-
-		list_append(print_fields_list, field);
-	}
-	list_iterator_destroy(itr);
+	print_fields_list = sacctmgr_process_format_list(format_list);
 	list_destroy(format_list);
 
 	if(exit_code) {
@@ -961,18 +748,12 @@ extern int sacctmgr_list_account(int argc, char *argv[])
 				int curr_inx = 1;
 				while((field = list_next(itr2))) {
 					switch(field->type) {
-					case PRINT_ACCOUNT:
+					case PRINT_ACCT:
 						field->print_routine(
 							field, acct->name,
 							(curr_inx ==
 							 field_count));
 						break;
-					case PRINT_CLUSTER:
-						field->print_routine(
-							field, assoc->cluster,
-							(curr_inx ==
-							 field_count));
-						break;
 					case PRINT_COORDS:
 						field->print_routine(
 							field,
@@ -980,23 +761,6 @@ extern int sacctmgr_list_account(int argc, char *argv[])
 							(curr_inx ==
 							 field_count));
 						break;
-					case PRINT_DQOS:
-						if(!g_qos_list) {
-							g_qos_list =
-								acct_storage_g_get_qos(
-									db_conn,
-									my_uid,
-									NULL);
-						}
-						tmp_char = slurmdb_qos_str(
-							g_qos_list,
-							assoc->def_qos_id);
-						field->print_routine(
-							field,
-							tmp_char,
-							(curr_inx ==
-							 field_count));
-						break;
 					case PRINT_DESC:
 						field->print_routine(
 							field,
@@ -1004,104 +768,6 @@ extern int sacctmgr_list_account(int argc, char *argv[])
 							(curr_inx ==
 							 field_count));
 						break;
-					case PRINT_FAIRSHARE:
-						field->print_routine(
-							field,
-							assoc->shares_raw,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_GRPCM:
-						field->print_routine(
-							field,
-							assoc->grp_cpu_mins,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_GRPC:
-						field->print_routine(
-							field,
-							assoc->grp_cpus,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_GRPJ:
-						field->print_routine(
-							field,
-							assoc->grp_jobs,
-							(curr_inx
-							 == field_count));
-						break;
-					case PRINT_GRPN:
-						field->print_routine(
-							field,
-							assoc->grp_nodes,
-							(curr_inx
-							 == field_count));
-						break;
-					case PRINT_GRPS:
-						field->print_routine(
-							field,
-							assoc->grp_submit_jobs,
-							(curr_inx
-							 == field_count));
-						break;
-					case PRINT_GRPW:
-						field->print_routine(
-							field,
-							assoc->grp_wall,
-							(curr_inx
-							 == field_count));
-						break;
-					case PRINT_ID:
-						field->print_routine(
-							field, assoc->id,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_MAXCM:
-						field->print_routine(
-							field,
-							assoc->
-							max_cpu_mins_pj,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_MAXC:
-						field->print_routine(
-							field,
-							assoc->max_cpus_pj,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_MAXJ:
-						field->print_routine(
-							field, assoc->max_jobs,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_MAXN:
-						field->print_routine(
-							field, assoc->
-							max_nodes_pj,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_MAXS:
-						field->print_routine(
-							field,
-							assoc->max_submit_jobs,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_MAXW:
-						field->print_routine(
-							field,
-							assoc->
-							max_wall_pj,
-							(curr_inx ==
-							 field_count));
-						break;
 					case PRINT_ORG:
 						field->print_routine(
 							field,
@@ -1109,58 +775,9 @@ extern int sacctmgr_list_account(int argc, char *argv[])
 							(curr_inx ==
 							 field_count));
 						break;
-					case PRINT_QOS:
-						if(!g_qos_list) {
-							g_qos_list =
-								acct_storage_g_get_qos(
-									db_conn,
-									my_uid,
-									NULL);
-						}
-						field->print_routine(
-							field,
-							g_qos_list,
-							assoc->qos_list,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_QOS_RAW:
-						field->print_routine(
-							field,
-							assoc->qos_list,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_PID:
-						field->print_routine(
-							field,
-							assoc->parent_id,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_PNAME:
-						field->print_routine(
-							field,
-							assoc->parent_acct,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_PART:
-						field->print_routine(
-							field,
-							assoc->partition,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_USER:
-						field->print_routine(
-							field, assoc->user,
-							(curr_inx ==
-							 field_count));
-						break;
 					default:
-						field->print_routine(
-							field, NULL,
+						sacctmgr_print_association_rec(
+							assoc, field, NULL,
 							(curr_inx ==
 							 field_count));
 						break;
@@ -1175,40 +792,13 @@ extern int sacctmgr_list_account(int argc, char *argv[])
 			int curr_inx = 1;
 			while((field = list_next(itr2))) {
 				switch(field->type) {
-					/* All the association stuff */
-				case PRINT_CLUSTER:
-				case PRINT_DQOS:
-				case PRINT_FAIRSHARE:
-				case PRINT_GRPCM:
-				case PRINT_GRPC:
-				case PRINT_GRPJ:
-				case PRINT_GRPN:
-				case PRINT_GRPS:
-				case PRINT_GRPW:
-				case PRINT_ID:
-				case PRINT_MAXCM:
-				case PRINT_MAXC:
-				case PRINT_MAXJ:
-				case PRINT_MAXN:
-				case PRINT_MAXS:
-				case PRINT_MAXW:
-				case PRINT_QOS_RAW:
-				case PRINT_PID:
-				case PRINT_PNAME:
-				case PRINT_PART:
-				case PRINT_USER:
-					field->print_routine(
-						field, NULL,
-						(curr_inx ==
-						 field_count));
-					break;
 				case PRINT_QOS:
 					field->print_routine(
 						field, NULL,
 						NULL,
 						(curr_inx == field_count));
 					break;
-				case PRINT_ACCOUNT:
+				case PRINT_ACCT:
 					field->print_routine(
 						field, acct->name,
 						(curr_inx ==
diff --git a/src/sacctmgr/association_functions.c b/src/sacctmgr/association_functions.c
index de84259cc546fb9dcfa105f02aed838f472fcf0a..a2beddf54180b5f5a73a6a7f37a59d2f40096021 100644
--- a/src/sacctmgr/association_functions.c
+++ b/src/sacctmgr/association_functions.c
@@ -38,7 +38,6 @@
 \*****************************************************************************/
 
 #include "src/sacctmgr/sacctmgr.h"
-static bool tree_display = 0;
 
 static int _set_cond(int *start, int argc, char *argv[],
 		     slurmdb_association_cond_t *assoc_cond,
@@ -178,8 +177,7 @@ extern int sacctmgr_set_association_cond(slurmdb_association_cond_t *assoc_cond,
 				db_conn, my_uid, NULL);
 
 		if (slurmdb_addto_qos_char_list(assoc_cond->def_qos_id_list,
-					       g_qos_list,
-					       value, 0))
+						g_qos_list, value, 0))
 			set = 1;
 		else
 			exit_code = 1;
@@ -432,6 +430,134 @@ extern int sacctmgr_set_association_rec(slurmdb_association_rec_t *assoc,
 	return set;
 }
 
+extern void sacctmgr_print_association_rec(slurmdb_association_rec_t *assoc,
+					   print_field_t *field, List tree_list,
+					   bool last)
+{
+	char *print_acct = NULL;
+	char *tmp_char = NULL;
+
+	xassert(field);
+
+	if(!assoc) {
+		field->print_routine(field, NULL, last);
+		return;
+	}
+
+	switch(field->type) {
+	case PRINT_ACCT:
+		if (tree_display) {
+			char *local_acct = NULL;
+			char *parent_acct = NULL;
+			if (assoc->user) {
+				local_acct = xstrdup_printf("|%s", assoc->acct);
+				parent_acct = assoc->acct;
+			} else {
+				local_acct =
+					xstrdup(assoc->acct);
+				parent_acct =
+					assoc->parent_acct;
+			}
+			print_acct = slurmdb_tree_name_get(
+				local_acct, parent_acct, tree_list);
+			xfree(local_acct);
+		} else {
+			print_acct = assoc->acct;
+		}
+		field->print_routine(field, print_acct, last);
+		break;
+	case PRINT_CLUSTER:
+		field->print_routine(field, assoc->cluster, last);
+		break;
+	case PRINT_DQOS:
+		if (!g_qos_list)
+			g_qos_list = acct_storage_g_get_qos(
+				db_conn, my_uid, NULL);
+		tmp_char = slurmdb_qos_str(g_qos_list, assoc->def_qos_id);
+		field->print_routine(field, tmp_char, last);
+		break;
+	case PRINT_FAIRSHARE:
+		field->print_routine(field, assoc->shares_raw, last);
+		break;
+	case PRINT_GRPCM:
+		field->print_routine(field, assoc->grp_cpu_mins, last);
+		break;
+	case PRINT_GRPCRM:
+		field->print_routine(field, assoc->grp_cpu_run_mins, last);
+		break;
+	case PRINT_GRPC:
+		field->print_routine(field, assoc->grp_cpus, last);
+		break;
+	case PRINT_GRPJ:
+		field->print_routine(field, assoc->grp_jobs, last);
+		break;
+	case PRINT_GRPN:
+		field->print_routine(field, assoc->grp_nodes, last);
+		break;
+	case PRINT_GRPS:
+		field->print_routine(field, assoc->grp_submit_jobs, last);
+		break;
+	case PRINT_GRPW:
+		field->print_routine(field, assoc->grp_wall, last);
+		break;
+	case PRINT_ID:
+		field->print_routine(field, assoc->id, last);
+		break;
+	case PRINT_LFT:
+		field->print_routine(field, assoc->lft, last);
+		break;
+	case PRINT_MAXCM:
+		field->print_routine(field, assoc->max_cpu_mins_pj, last);
+		break;
+	case PRINT_MAXCRM:
+		field->print_routine(field, assoc->max_cpu_run_mins, last);
+		break;
+	case PRINT_MAXC:
+		field->print_routine(field, assoc->max_cpus_pj, last);
+		break;
+	case PRINT_MAXJ:
+		field->print_routine(field, assoc->max_jobs, last);
+		break;
+	case PRINT_MAXN:
+		field->print_routine(field, assoc->max_nodes_pj, last);
+		break;
+	case PRINT_MAXS:
+		field->print_routine(field, assoc->max_submit_jobs, last);
+		break;
+	case PRINT_MAXW:
+		field->print_routine(field, assoc->max_wall_pj,	last);
+		break;
+	case PRINT_PID:
+		field->print_routine(field, assoc->parent_id, last);
+		break;
+	case PRINT_PNAME:
+		field->print_routine(field, assoc->parent_acct, last);
+		break;
+	case PRINT_PART:
+		field->print_routine(field, assoc->partition, last);
+		break;
+	case PRINT_QOS:
+		if (!g_qos_list)
+			g_qos_list = acct_storage_g_get_qos(
+				db_conn, my_uid, NULL);
+
+		field->print_routine(field, g_qos_list, assoc->qos_list, last);
+		break;
+	case PRINT_QOS_RAW:
+		field->print_routine(field, assoc->qos_list, last);
+		break;
+	case PRINT_RGT:
+		field->print_routine(field, assoc->rgt, last);
+		break;
+	case PRINT_USER:
+		field->print_routine(field, assoc->user, last);
+		break;
+	default:
+		field->print_routine(field, NULL, last);
+		break;
+	}
+}
+
 extern int sacctmgr_list_association(int argc, char *argv[])
 {
 	int rc = SLURM_SUCCESS;
@@ -443,9 +569,7 @@ extern int sacctmgr_list_association(int argc, char *argv[])
 	int i=0;
 	ListIterator itr = NULL;
 	ListIterator itr2 = NULL;
-	char *object = NULL;
-	char *tmp_char = NULL;
-	char *print_acct = NULL, *last_cluster = NULL;
+	char *last_cluster = NULL;
 	List tree_list = NULL;
 
 	int field_count = 0;
@@ -455,34 +579,6 @@ extern int sacctmgr_list_association(int argc, char *argv[])
 	List format_list = list_create(slurm_destroy_char);
 	List print_fields_list; /* types are of print_field_t */
 
-	enum {
-		PRINT_ACCOUNT,
-		PRINT_CLUSTER,
-		PRINT_DQOS,
-		PRINT_FAIRSHARE,
-		PRINT_GRPCM,
-		PRINT_GRPC,
-		PRINT_GRPJ,
-		PRINT_GRPN,
-		PRINT_GRPS,
-		PRINT_GRPW,
-		PRINT_ID,
-		PRINT_LFT,
-		PRINT_MAXC,
-		PRINT_MAXCM,
-		PRINT_MAXJ,
-		PRINT_MAXN,
-		PRINT_MAXS,
-		PRINT_MAXW,
-		PRINT_PID,
-		PRINT_PNAME,
-		PRINT_PART,
-		PRINT_QOS,
-		PRINT_QOS_RAW,
-		PRINT_RGT,
-		PRINT_USER
-	};
-
 	for (i=0; i<argc; i++) {
 		int command_len = strlen(argv[i]);
 		if (!strncasecmp(argv[i], "Where", MAX(command_len, 5))
@@ -496,199 +592,15 @@ extern int sacctmgr_list_association(int argc, char *argv[])
 		list_destroy(format_list);
 		return SLURM_ERROR;
 	} else if (!list_count(format_list)) {
-		slurm_addto_char_list(format_list, "C,A,U,Part");
+		slurm_addto_char_list(format_list, "Cluster,Account,User,Part");
 		if (!assoc_cond->without_parent_limits)
 			slurm_addto_char_list(format_list,
-					      "Shares,GrpJ,GrpN,GrpCPUs,"
+					      "Share,GrpJ,GrpN,GrpCPUs,"
 					      "GrpS,GrpWall,GrpCPUMins,MaxJ,"
 					      "MaxN,MaxCPUs,MaxS,MaxW,"
 					      "MaxCPUMins,QOS,DefaultQOS");
 	}
-	print_fields_list = list_create(destroy_print_field);
-
-	itr = list_iterator_create(format_list);
-	while((object = list_next(itr))) {
-		int command_len = 0;
-		int newlen = 0;
-
-		if ((tmp_char = strstr(object, "\%"))) {
-			newlen = atoi(tmp_char+1);
-			tmp_char[0] = '\0';
-		}
-
-		command_len = strlen(object);
-
-		field = xmalloc(sizeof(print_field_t));
-
-		if (!strncasecmp("Account", object, MAX(command_len, 1))
-		   || !strncasecmp("Acct", object, MAX(command_len, 4))) {
-			field->type = PRINT_ACCOUNT;
-			field->name = xstrdup("Account");
-			if (tree_display)
-				field->len = -20;
-			else
-				field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if (!strncasecmp("Cluster", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_CLUSTER;
-			field->name = xstrdup("Cluster");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if (!strncasecmp("DefaultQOS", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_DQOS;
-			field->name = xstrdup("Def QOS");
-			field->len = 9;
-			field->print_routine = print_fields_str;
-		} else if (!strncasecmp("FairShare", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_FAIRSHARE;
-			field->name = xstrdup("FairShare");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("GrpCPUMins", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_GRPCM;
-			field->name = xstrdup("GrpCPUMins");
-			field->len = 11;
-			field->print_routine = print_fields_uint64;
-		} else if (!strncasecmp("GrpCPUs", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_GRPC;
-			field->name = xstrdup("GrpCPUs");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("GrpJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPJ;
-			field->name = xstrdup("GrpJobs");
-			field->len = 7;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("GrpNodes", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPN;
-			field->name = xstrdup("GrpNodes");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("GrpSubmitJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPS;
-			field->name = xstrdup("GrpSubmit");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("GrpWall", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPW;
-			field->name = xstrdup("GrpWall");
-			field->len = 11;
-			field->print_routine = print_fields_time;
-		} else if (!strncasecmp("ID", object, MAX(command_len, 1))) {
-			field->type = PRINT_ID;
-			field->name = xstrdup("ID");
-			field->len = 6;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("LFT", object, MAX(command_len, 1))) {
-			field->type = PRINT_LFT;
-			field->name = xstrdup("LFT");
-			field->len = 6;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("MaxCPUMinsPerJob", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_MAXCM;
-			field->name = xstrdup("MaxCPUMins");
-			field->len = 11;
-			field->print_routine = print_fields_uint64;
-		} else if (!strncasecmp("MaxCPUsPerJob", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_MAXC;
-			field->name = xstrdup("MaxCPUs");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("MaxJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXJ;
-			field->name = xstrdup("MaxJobs");
-			field->len = 7;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("MaxNodesPerJob", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXN;
-			field->name = xstrdup("MaxNodes");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("MaxSubmitJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXS;
-			field->name = xstrdup("MaxSubmit");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("MaxWallDurationPerJob", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXW;
-			field->name = xstrdup("MaxWall");
-			field->len = 11;
-			field->print_routine = print_fields_time;
-		} else if (!strncasecmp("QOSRAWLevel", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_QOS_RAW;
-			field->name = xstrdup("QOS_RAW");
-			field->len = 10;
-			field->print_routine = print_fields_char_list;
-		} else if (!strncasecmp("QOSLevel", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_QOS;
-			field->name = xstrdup("QOS");
-			field->len = 20;
-			field->print_routine = sacctmgr_print_qos_list;
-		} else if (!strncasecmp("ParentID", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_PID;
-			field->name = xstrdup("Par ID");
-			field->len = 6;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("ParentName", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_PNAME;
-			field->name = xstrdup("Par Name");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if (!strncasecmp("Partition", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_PART;
-			field->name = xstrdup("Partition");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if (!strncasecmp("RGT", object, MAX(command_len, 1))) {
-			field->type = PRINT_RGT;
-			field->name = xstrdup("RGT");
-			field->len = 6;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("Shares", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_FAIRSHARE;
-			field->name = xstrdup("Shares");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if (!strncasecmp("User", object, MAX(command_len, 1))) {
-			field->type = PRINT_USER;
-			field->name = xstrdup("User");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else {
-			exit_code=1;
-			fprintf(stderr, "Unknown field '%s'\n", object);
-			exit(1);
-			xfree(field);
-			continue;
-		}
-
-		if (newlen)
-			field->len = newlen;
-
-		list_append(print_fields_list, field);
-	}
-	list_iterator_destroy(itr);
+	print_fields_list = sacctmgr_process_format_list(format_list);
 	list_destroy(format_list);
 
 	if (exit_code) {
@@ -729,176 +641,9 @@ extern int sacctmgr_list_association(int argc, char *argv[])
 			last_cluster = assoc->cluster;
 		}
 		while((field = list_next(itr2))) {
-			switch(field->type) {
-			case PRINT_ACCOUNT:
-				if (tree_display) {
-					char *local_acct = NULL;
-					char *parent_acct = NULL;
-					if (assoc->user) {
-						local_acct = xstrdup_printf(
-							"|%s", assoc->acct);
-						parent_acct = assoc->acct;
-					} else {
-						local_acct =
-							xstrdup(assoc->acct);
-						parent_acct =
-							assoc->parent_acct;
-					}
-					print_acct = slurmdb_tree_name_get(
-						local_acct,
-						parent_acct, tree_list);
-					xfree(local_acct);
-				} else {
-					print_acct = assoc->acct;
-				}
-				field->print_routine(
-					field,
-					print_acct,
-					(curr_inx == field_count));
-				break;
-			case PRINT_CLUSTER:
-				field->print_routine(
-					field,
-					assoc->cluster,
-					(curr_inx == field_count));
-				break;
-			case PRINT_DQOS:
-				if (!g_qos_list)
-					g_qos_list = acct_storage_g_get_qos(
-						db_conn, my_uid, NULL);
-				tmp_char = slurmdb_qos_str(g_qos_list,
-							   assoc->def_qos_id);
-				field->print_routine(
-					field,
-					tmp_char,
-					(curr_inx == field_count));
-				break;
-			case PRINT_FAIRSHARE:
-				field->print_routine(
-					field,
-					assoc->shares_raw,
-					(curr_inx == field_count));
-				break;
-			case PRINT_GRPCM:
-				field->print_routine(
-					field,
-					assoc->grp_cpu_mins,
-					(curr_inx == field_count));
-				break;
-			case PRINT_GRPC:
-				field->print_routine(field,
-						     assoc->grp_cpus,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_GRPJ:
-				field->print_routine(field,
-						     assoc->grp_jobs,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_GRPN:
-				field->print_routine(field,
-						     assoc->grp_nodes,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_GRPS:
-				field->print_routine(field,
-						     assoc->grp_submit_jobs,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_GRPW:
-				field->print_routine(
-					field,
-					assoc->grp_wall,
-					(curr_inx == field_count));
-				break;
-			case PRINT_ID:
-				field->print_routine(field,
-						     assoc->id,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_LFT:
-				field->print_routine(field,
-						     assoc->lft,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_MAXCM:
-				field->print_routine(
-					field,
-					assoc->max_cpu_mins_pj,
-					(curr_inx == field_count));
-				break;
-			case PRINT_MAXC:
-				field->print_routine(field,
-						     assoc->max_cpus_pj,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_MAXJ:
-				field->print_routine(field,
-						     assoc->max_jobs,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_MAXN:
-				field->print_routine(field,
-						     assoc->max_nodes_pj,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_MAXS:
-				field->print_routine(field,
-						     assoc->max_submit_jobs,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_MAXW:
-				field->print_routine(
-					field,
-					assoc->max_wall_pj,
-					(curr_inx == field_count));
-				break;
-			case PRINT_PID:
-				field->print_routine(field,
-						     assoc->parent_id,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_PNAME:
-				field->print_routine(field,
-						     assoc->parent_acct,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_PART:
-				field->print_routine(field,
-						     assoc->partition,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_QOS:
-				if (!g_qos_list)
-					g_qos_list = acct_storage_g_get_qos(
-						db_conn, my_uid, NULL);
-
-				field->print_routine(field,
-						     g_qos_list,
-						     assoc->qos_list,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_QOS_RAW:
-				field->print_routine(field,
-						     assoc->qos_list,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_RGT:
-				field->print_routine(field,
-						     assoc->rgt,
-						     (curr_inx == field_count));
-				break;
-			case PRINT_USER:
-				field->print_routine(field,
-						     assoc->user,
-						     (curr_inx == field_count));
-				break;
-			default:
-				field->print_routine(
-					field, NULL,
-					(curr_inx == field_count));
-				break;
-			}
+			sacctmgr_print_association_rec(
+				assoc, field, tree_list,
+				(curr_inx == field_count));
 			curr_inx++;
 		}
 		list_iterator_reset(itr2);
@@ -913,6 +658,7 @@ extern int sacctmgr_list_association(int argc, char *argv[])
 	list_destroy(first_list);
 	list_destroy(assoc_list);
 	list_destroy(print_fields_list);
+	tree_display = 0;
 	return rc;
 }
 
diff --git a/src/sacctmgr/cluster_functions.c b/src/sacctmgr/cluster_functions.c
index 01521092f31fe1b3c1a82a5211d86d07385959e8..7907d335be0f3662671c9748d24a1273cd70a831 100644
--- a/src/sacctmgr/cluster_functions.c
+++ b/src/sacctmgr/cluster_functions.c
@@ -392,7 +392,6 @@ extern int sacctmgr_list_cluster(int argc, char *argv[])
 	ListIterator itr = NULL;
 	ListIterator itr2 = NULL;
 	slurmdb_cluster_rec_t *cluster = NULL;
-	char *object;
 	char *tmp_char = NULL;
 
 	int field_count = 0;
@@ -402,35 +401,6 @@ extern int sacctmgr_list_cluster(int argc, char *argv[])
 	List format_list = list_create(slurm_destroy_char);
 	List print_fields_list; /* types are of print_field_t */
 
-	enum {
-		PRINT_CLUSTER,
-		PRINT_CHOST,
-		PRINT_CPORT,
-		PRINT_CLASS,
-		PRINT_CPUS,
-		PRINT_DEF_QOS,
-		PRINT_FAIRSHARE,
-		PRINT_FLAGS,
-		PRINT_GRPCM,
-		PRINT_GRPC,
-		PRINT_GRPJ,
-		PRINT_GRPN,
-		PRINT_GRPS,
-		PRINT_GRPW,
-		PRINT_MAXC,
-		PRINT_MAXCM,
-		PRINT_MAXJ,
-		PRINT_MAXN,
-		PRINT_MAXS,
-		PRINT_MAXW,
-		PRINT_NODECNT,
-		PRINT_NODES,
-		PRINT_QOS,
-		PRINT_QOS_RAW,
-		PRINT_RPC_VERSION,
-		PRINT_SELECT,
-	};
-
 	slurmdb_init_cluster_cond(cluster_cond);
 	cluster_cond->cluster_list = list_create(slurm_destroy_char);
 	for (i=0; i<argc; i++) {
@@ -447,8 +417,6 @@ extern int sacctmgr_list_cluster(int argc, char *argv[])
 		return SLURM_ERROR;
 	}
 
-	print_fields_list = list_create(destroy_print_field);
-
 	if(!list_count(format_list)) {
 		slurm_addto_char_list(format_list,
 				      "Cl,Controlh,Controlp,RPC");
@@ -460,181 +428,7 @@ extern int sacctmgr_list_cluster(int argc, char *argv[])
 
 	cluster_cond->with_deleted = with_deleted;
 
-	itr = list_iterator_create(format_list);
-	while((object = list_next(itr))) {
-		int command_len = 0;
-		int newlen = 0;
-
-		if((tmp_char = strstr(object, "\%"))) {
-			newlen = atoi(tmp_char+1);
-			tmp_char[0] = '\0';
-		}
-
-		command_len = strlen(object);
-
-		field = xmalloc(sizeof(print_field_t));
-		if(!strncasecmp("Cluster", object, MAX(command_len, 2))
-		   || !strncasecmp("Name", object, MAX(command_len, 2))) {
-			field->type = PRINT_CLUSTER;
-			field->name = xstrdup("Cluster");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("ControlHost", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_CHOST;
-			field->name = xstrdup("ControlHost");
-			field->len = 15;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("ControlPort", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_CPORT;
-			field->name = xstrdup("ControlPort");
-			field->len = 12;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("Classification", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_CPUS;
-			field->name = xstrdup("Class");
-			field->len = 9;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("CPUCount", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_CPUS;
-			field->name = xstrdup("CPUCount");
-			field->len = 9;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("DefaultQOS", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_DEF_QOS;
-			field->name = xstrdup("Def QOS");
-			field->len = 9;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("FairShare", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_FAIRSHARE;
-			field->name = xstrdup("FairShare");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("Flags", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_FLAGS;
-			field->name = xstrdup("Flags");
-			field->len = 20;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("GrpCPUs", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_GRPC;
-			field->name = xstrdup("GrpCPUs");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPJ;
-			field->name = xstrdup("GrpJobs");
-			field->len = 7;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpNodes", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPN;
-			field->name = xstrdup("GrpNodes");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpSubmitJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPS;
-			field->name = xstrdup("GrpSubmit");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxCPUMinsPerJob", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_MAXCM;
-			field->name = xstrdup("MaxCPUMins");
-			field->len = 11;
-			field->print_routine = print_fields_uint64;
-		} else if(!strncasecmp("MaxCPUsPerJob", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_MAXC;
-			field->name = xstrdup("MaxCPUs");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXJ;
-			field->name = xstrdup("MaxJobs");
-			field->len = 7;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxNodesPerJob", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXN;
-			field->name = xstrdup("MaxNodes");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxSubmitJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXS;
-			field->name = xstrdup("MaxSubmit");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxWallDurationPerJob", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXW;
-			field->name = xstrdup("MaxWall");
-			field->len = 11;
-			field->print_routine = print_fields_time;
-		} else if(!strncasecmp("NodeCount", object,
-				       MAX(command_len, 5))) {
-			field->type = PRINT_NODECNT;
-			field->name = xstrdup("NodeCount");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("NodeNames", object,
-				       MAX(command_len, 5))) {
-			field->type = PRINT_NODES;
-			field->name = xstrdup("NodeNames");
-			field->len = 20;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("QOSRAWLevel", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_QOS_RAW;
-			field->name = xstrdup("QOS_RAW");
-			field->len = 10;
-			field->print_routine = print_fields_char_list;
-		} else if(!strncasecmp("QOSLevel", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_QOS;
-			field->name = xstrdup("QOS");
-			field->len = 20;
-			field->print_routine = sacctmgr_print_qos_list;
-		} else if(!strncasecmp("RPC", object, MAX(command_len, 1))) {
-			field->type = PRINT_RPC_VERSION;
-			field->name = xstrdup("RPC");
-			field->len = 3;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("Shares", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_FAIRSHARE;
-			field->name = xstrdup("Shares");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("PluginIDSelect", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_SELECT;
-			field->name = xstrdup("PluginIDSelect");
-			field->len = 14;
-			field->print_routine = print_fields_uint;
-		} else {
-			exit_code=1;
-			fprintf(stderr, "Unknown field '%s'\n", object);
-			xfree(field);
-			continue;
-		}
-
-		if(newlen)
-			field->len = newlen;
-
-		list_append(print_fields_list, field);
-	}
-	list_iterator_destroy(itr);
+	print_fields_list = sacctmgr_process_format_list(format_list);
 	list_destroy(format_list);
 
 	if(exit_code) {
@@ -698,7 +492,7 @@ extern int sacctmgr_list_cluster(int argc, char *argv[])
 						     (curr_inx == field_count));
 				break;
 			}
-			case PRINT_DEF_QOS:
+			case PRINT_DQOS:
 				if(!g_qos_list) {
 					g_qos_list = acct_storage_g_get_qos(
 						db_conn,
@@ -796,7 +590,7 @@ extern int sacctmgr_list_cluster(int argc, char *argv[])
 					(curr_inx == field_count));
 				break;
 			}
-			case PRINT_NODES:
+			case PRINT_CLUSTER_NODES:
 				field->print_routine(
 					field,
 					cluster->nodes,
diff --git a/src/sacctmgr/common.c b/src/sacctmgr/common.c
index 84d001b9d92856c9668acee70d9e03f56683df5e..6c058fa7476dd1ca2b32febfa73cb123e6ac8e04 100644
--- a/src/sacctmgr/common.c
+++ b/src/sacctmgr/common.c
@@ -83,18 +83,18 @@ extern int parse_option_end(char *option)
 {
 	int end = 0;
 
-	if(!option)
+	if (!option)
 		return 0;
 
 	while(option[end]) {
-		if((option[end] == '=')
+		if ((option[end] == '=')
 		   || (option[end] == '+' && option[end+1] == '=')
 		   || (option[end] == '-' && option[end+1] == '='))
 			break;
 		end++;
 	}
 
-	if(!option[end])
+	if (!option[end])
 		return 0;
 
 	end++;
@@ -110,7 +110,7 @@ extern char *strip_quotes(char *option, int *increased, bool make_lower)
 	char quote_c = '\0';
 	int quote = 0;
 
-	if(!option)
+	if (!option)
 		return NULL;
 
 	/* first strip off the ("|')'s */
@@ -122,14 +122,14 @@ extern char *strip_quotes(char *option, int *increased, bool make_lower)
 	start = i;
 
 	while(option[i]) {
-		if(quote && option[i] == quote_c) {
+		if (quote && option[i] == quote_c) {
 			end++;
 			break;
-		} else if(option[i] == '\"' || option[i] == '\'')
+		} else if (option[i] == '\"' || option[i] == '\'')
 			option[i] = '`';
-		else if(make_lower) {
+		else if (make_lower) {
 			char lower = tolower(option[i]);
-			if(lower != option[i])
+			if (lower != option[i])
 				option[i] = lower;
 		}
 
@@ -140,18 +140,357 @@ extern char *strip_quotes(char *option, int *increased, bool make_lower)
 	meat = xmalloc((i-start)+1);
 	memcpy(meat, option+start, (i-start));
 
-	if(increased)
+	if (increased)
 		(*increased) += end;
 
 	return meat;
 }
 
+static print_field_t *_get_print_field(char *object)
+{
+	/* This should be kept in alpha order to avoid picking the
+	   wrong field name.
+	*/
+	print_field_t *field = xmalloc(sizeof(print_field_t));
+	char *tmp_char = NULL;
+	int command_len, field_len = 0;
+
+	if((tmp_char = strstr(object, "\%"))) {
+		field_len = atoi(tmp_char+1);
+		tmp_char[0] = '\0';
+	}
+	command_len = strlen(object);
+
+	if (!strncasecmp("Account", object, MAX(command_len, 3))
+	    || !strncasecmp("Acct", object, MAX(command_len, 4))) {
+		field->type = PRINT_ACCT;
+		field->name = xstrdup("Account");
+		if (tree_display)
+			field->len = -20;
+		else
+			field->len = 10;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("ActionRaw", object, MAX(command_len, 7))) {
+		field->type = PRINT_ACTIONRAW;
+		field->name = xstrdup("ActionRaw");
+		field->len = 10;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("Action", object, MAX(command_len, 4))) {
+		field->type = PRINT_ACTION;
+		field->name = xstrdup("Action");
+		field->len = 20;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("Actor", object, MAX(command_len, 4))) {
+		field->type = PRINT_ACTOR;
+		field->name = xstrdup("Actor");
+		field->len = 10;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("AdminLevel", object, MAX(command_len, 2))) {
+		field->type = PRINT_ADMIN;
+		field->name = xstrdup("Admin");
+		field->len = 9;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("Classification", object,
+				MAX(command_len, 3))) {
+		field->type = PRINT_CPUS;
+		field->name = xstrdup("Class");
+		field->len = 9;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("ClusterNodes", object, MAX(command_len, 8))
+		   || !strncasecmp("NodeNames", object, MAX(command_len, 8))) {
+		field->type = PRINT_CLUSTER_NODES;
+		field->name = xstrdup("Cluster Nodes");
+		field->len = 20;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("Cluster", object, MAX(command_len, 2))) {
+		field->type = PRINT_CLUSTER;
+		field->name = xstrdup("Cluster");
+		field->len = 10;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("Coordinators", object, MAX(command_len, 2))) {
+		field->type = PRINT_COORDS;
+		field->name = xstrdup("Coord Accounts");
+		field->len = 20;
+		field->print_routine = sacctmgr_print_coord_list;
+	} else if (!strncasecmp("ControlHost", object, MAX(command_len, 8))) {
+		field->type = PRINT_CHOST;
+		field->name = xstrdup("ControlHost");
+		field->len = 15;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("ControlPort", object, MAX(command_len, 8))) {
+		field->type = PRINT_CPORT;
+		field->name = xstrdup("ControlPort");
+		field->len = 12;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("CPUCount", object, MAX(command_len, 2))) {
+		field->type = PRINT_CPUS;
+		field->name = xstrdup("CPUCount");
+		field->len = 9;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("DefaultAccount", object,
+				MAX(command_len, 8))) {
+		field->type = PRINT_DACCT;
+		field->name = xstrdup("Def Acct");
+		field->len = 10;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("DefaultQOS", object, MAX(command_len, 8))) {
+		field->type = PRINT_DQOS;
+		field->name = xstrdup("Def QOS");
+		field->len = 9;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("DefaultWCKey", object, MAX(command_len, 8))) {
+		field->type = PRINT_DWCKEY;
+		field->name = xstrdup("Def WCKey");
+		field->len = 10;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("Description", object, MAX(command_len, 3))) {
+		field->type = PRINT_DESC;
+		field->name = xstrdup("Descr");
+		field->len = 20;
+		field->print_routine = print_fields_str;
+	} else if(!strncasecmp("Duration", object, MAX(command_len, 2))) {
+		field->type = PRINT_DURATION;
+		field->name = xstrdup("Duration");
+		field->len = 13;
+		field->print_routine = print_fields_time_from_secs;
+	} else if(!strncasecmp("End", object, MAX(command_len, 2))) {
+		field->type = PRINT_END;
+		field->name = xstrdup("End");
+		field->len = 19;
+		field->print_routine = print_fields_date;
+	} else if(!strncasecmp("EventRaw", object, MAX(command_len, 6))) {
+		field->type = PRINT_EVENTRAW;
+		field->name = xstrdup("EventRaw");
+		field->len = 8;
+		field->print_routine = print_fields_uint;
+	} else if(!strncasecmp("Event", object, MAX(command_len, 2))) {
+		field->type = PRINT_EVENT;
+		field->name = xstrdup("Event");
+		field->len = 7;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("Flags", object, MAX(command_len, 2))) {
+		field->type = PRINT_FLAGS;
+		field->name = xstrdup("Flags");
+		field->len = 20;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("GrpCPUMins", object, MAX(command_len, 7))) {
+		field->type = PRINT_GRPCM;
+		field->name = xstrdup("GrpCPUMins");
+		field->len = 11;
+		field->print_routine = print_fields_uint64;
+	} else if (!strncasecmp("GrpCPURunMins", object, MAX(command_len, 7))) {
+		field->type = PRINT_GRPCRM;
+		field->name = xstrdup("GrpCPURunMins");
+		field->len = 13;
+		field->print_routine = print_fields_uint64;
+	} else if (!strncasecmp("GrpCPUs", object, MAX(command_len, 7))) {
+		field->type = PRINT_GRPC;
+		field->name = xstrdup("GrpCPUs");
+		field->len = 8;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("GrpJobs", object, MAX(command_len, 4))) {
+		field->type = PRINT_GRPJ;
+		field->name = xstrdup("GrpJobs");
+		field->len = 7;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("GrpNodes", object, MAX(command_len, 4))) {
+		field->type = PRINT_GRPN;
+		field->name = xstrdup("GrpNodes");
+		field->len = 8;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("GrpSubmitJobs", object, MAX(command_len, 4))) {
+		field->type = PRINT_GRPS;
+		field->name = xstrdup("GrpSubmit");
+		field->len = 9;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("GrpWall", object, MAX(command_len, 4))) {
+		field->type = PRINT_GRPW;
+		field->name = xstrdup("GrpWall");
+		field->len = 11;
+		field->print_routine = print_fields_time;
+	} else if (!strncasecmp("ID", object, MAX(command_len, 2))) {
+		field->type = PRINT_ID;
+		field->name = xstrdup("ID");
+		field->len = 6;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("Info", object, MAX(command_len, 2))) {
+		field->type = PRINT_INFO;
+		field->name = xstrdup("Info");
+		field->len = 20;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("LFT", object, MAX(command_len, 1))) {
+		field->type = PRINT_LFT;
+		field->name = xstrdup("LFT");
+		field->len = 6;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("MaxCPUMinsPerJob", object,
+				MAX(command_len, 7))) {
+		field->type = PRINT_MAXCM;
+		field->name = xstrdup("MaxCPUMins");
+		field->len = 11;
+		field->print_routine = print_fields_uint64;
+	} else if (!strncasecmp("MaxCPURunMins", object, MAX(command_len, 7))) {
+		field->type = PRINT_MAXCRM;
+		field->name = xstrdup("MaxCPURunMins");
+		field->len = 13;
+		field->print_routine = print_fields_uint64;
+	} else if (!strncasecmp("MaxCPUsPerJob", object, MAX(command_len, 7))) {
+		field->type = PRINT_MAXC;
+		field->name = xstrdup("MaxCPUs");
+		field->len = 8;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("MaxJobs", object, MAX(command_len, 4))) {
+		field->type = PRINT_MAXJ;
+		field->name = xstrdup("MaxJobs");
+		field->len = 7;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("MaxNodesPerJob", object,
+				MAX(command_len, 4))) {
+		field->type = PRINT_MAXN;
+		field->name = xstrdup("MaxNodes");
+		field->len = 8;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("MaxSubmitJobs", object, MAX(command_len, 4))) {
+		field->type = PRINT_MAXS;
+		field->name = xstrdup("MaxSubmit");
+		field->len = 9;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("MaxWallDurationPerJob", object,
+				MAX(command_len, 4))) {
+		field->type = PRINT_MAXW;
+		field->name = xstrdup("MaxWall");
+		field->len = 11;
+		field->print_routine = print_fields_time;
+	} else if (!strncasecmp("Name", object, MAX(command_len, 2))) {
+		field->type = PRINT_NAME;
+		field->name = xstrdup("Name");
+		field->len = 10;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("NodeCount", object, MAX(command_len, 5))) {
+		field->type = PRINT_NODECNT;
+		field->name = xstrdup("NodeCount");
+		field->len = 9;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("NodeName", object, MAX(command_len, 5))) {
+		field->type = PRINT_NODENAME;
+		field->name = xstrdup("NodeName");
+		field->len = 20;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("Organization", object, MAX(command_len, 1))) {
+		field->type = PRINT_ORG;
+		field->name = xstrdup("Org");
+		field->len = 20;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("ParentID", object, MAX(command_len, 7))) {
+		field->type = PRINT_PID;
+		field->name = xstrdup("Par ID");
+		field->len = 6;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("ParentName", object, MAX(command_len, 7))) {
+		field->type = PRINT_PNAME;
+		field->name = xstrdup("Par Name");
+		field->len = 10;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("Partition", object, MAX(command_len, 4))) {
+		field->type = PRINT_PART;
+		field->name = xstrdup("Partition");
+		field->len = 10;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("PluginIDSelect", object,
+				MAX(command_len, 2))) {
+		field->type = PRINT_SELECT;
+		field->name = xstrdup("PluginIDSelect");
+		field->len = 14;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("Preempt", object, MAX(command_len, 7))) {
+		field->type = PRINT_PREE;
+		field->name = xstrdup("Preempt");
+		field->len = 10;
+		field->print_routine = sacctmgr_print_qos_bitstr;
+	} else if (!strncasecmp("PreemptMode", object, MAX(command_len, 8))) {
+		field->type = PRINT_PREEM;
+		field->name = xstrdup("PreemptMode");
+		field->len = 11;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("Priority", object, MAX(command_len, 3))) {
+		field->type = PRINT_PRIO;
+		field->name = xstrdup("Priority");
+		field->len = 10;
+		field->print_routine = print_fields_int;
+	} else if (!strncasecmp("Problem", object, MAX(command_len, 1))) {
+		field->type = PRINT_PROBLEM;
+		field->name = xstrdup("Problem");
+		field->len = 40;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("QOSLevel", object, MAX(command_len, 3))) {
+		field->type = PRINT_QOS;
+		field->name = xstrdup("QOS");
+		field->len = 20;
+		field->print_routine = sacctmgr_print_qos_list;
+	} else if (!strncasecmp("QOSRAWLevel", object, MAX(command_len, 4))) {
+		field->type = PRINT_QOS_RAW;
+		field->name = xstrdup("QOS_RAW");
+		field->len = 10;
+		field->print_routine = print_fields_char_list;
+	} else if (!strncasecmp("RGT", object, MAX(command_len, 1))) {
+		field->type = PRINT_RGT;
+		field->name = xstrdup("RGT");
+		field->len = 6;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("RPC", object, MAX(command_len, 1))) {
+		field->type = PRINT_RPC_VERSION;
+		field->name = xstrdup("RPC");
+		field->len = 3;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("Share", object, MAX(command_len, 1))
+		   || !strncasecmp("FairShare", object, MAX(command_len, 2))) {
+		field->type = PRINT_FAIRSHARE;
+		field->name = xstrdup("Share");
+		field->len = 9;
+		field->print_routine = print_fields_uint;
+	} else if (!strncasecmp("TimeStamp", object, MAX(command_len, 1))) {
+		field->type = PRINT_TS;
+		field->name = xstrdup("Time");
+		field->len = 19;
+		field->print_routine = print_fields_date;
+	} else if (!strncasecmp("UsageFactor", object, MAX(command_len, 3))) {
+		field->type = PRINT_UF;
+		field->name = xstrdup("UsageFactor");
+		field->len = 11;
+		field->print_routine = print_fields_double;
+	} else if (!strncasecmp("User", object, MAX(command_len, 1))) {
+		field->type = PRINT_USER;
+		field->name = xstrdup("User");
+		field->len = 10;
+		field->print_routine = print_fields_str;
+	} else if (!strncasecmp("WCKeys", object, MAX(command_len, 2))) {
+		field->type = PRINT_WCKEYS;
+		field->name = xstrdup("WCKeys");
+		field->len = 20;
+		field->print_routine = print_fields_char_list;
+	} else if (!strncasecmp("Where", object, MAX(command_len, 2))) {
+		field->type = PRINT_WHERE;
+		field->name = xstrdup("Where");
+		field->len = 20;
+		field->print_routine = print_fields_str;
+	} else {
+		exit_code=1;
+		fprintf(stderr, "Unknown field '%s'\n", object);
+		exit(1);
+	}
+
+	if (field_len)
+		field->len = field_len;
+	return field;
+}
+
 extern int notice_thread_init()
 {
 	pthread_attr_t attr;
 
 	slurm_attr_init(&attr);
-	if(pthread_create(&lock_warning_thread, &attr, &_print_lock_warn, NULL))
+	if (pthread_create(&lock_warning_thread, &attr,
+			   &_print_lock_warn, NULL))
 		error ("pthread_create error %m");
 	slurm_attr_destroy(&attr);
 	return SLURM_SUCCESS;
@@ -170,7 +509,7 @@ extern int commit_check(char *warning)
 	fd_set rfds;
 	struct timeval tv;
 
-	if(!rollback_flag)
+	if (!rollback_flag)
 		return 1;
 
 	printf("%s (You have 30 seconds to decide)\n", warning);
@@ -178,7 +517,7 @@ extern int commit_check(char *warning)
 	while(c != 'Y' && c != 'y'
 	      && c != 'N' && c != 'n'
 	      && c != '\n') {
-		if(c) {
+		if (c) {
 			printf("Y or N please\n");
 		}
 		printf("(N/y): ");
@@ -188,16 +527,16 @@ extern int commit_check(char *warning)
 		/* Wait up to 30 seconds. */
 		tv.tv_sec = 30;
 		tv.tv_usec = 0;
-		if((ans = select(fd+1, &rfds, NULL, NULL, &tv)) <= 0)
+		if ((ans = select(fd+1, &rfds, NULL, NULL, &tv)) <= 0)
 			break;
 
 		c = getchar();
 		printf("\n");
 	}
 	_nonblock(0);
-	if(ans <= 0)
+	if (ans <= 0)
 		printf("timeout\n");
-	else if(c == 'Y' || c == 'y')
+	else if (c == 'Y' || c == 'y')
 		return 1;
 
 	return 0;
@@ -263,31 +602,31 @@ extern slurmdb_association_rec_t *sacctmgr_find_association(char *user,
 	List assoc_list = NULL;
 
 	memset(&assoc_cond, 0, sizeof(slurmdb_association_cond_t));
-	if(account) {
+	if (account) {
 		assoc_cond.acct_list = list_create(NULL);
 		list_append(assoc_cond.acct_list, account);
 	} else {
 		error("need an account to find association");
 		return NULL;
 	}
-	if(cluster) {
+	if (cluster) {
 		assoc_cond.cluster_list = list_create(NULL);
 		list_append(assoc_cond.cluster_list, cluster);
 	} else {
-		if(assoc_cond.acct_list)
+		if (assoc_cond.acct_list)
 			list_destroy(assoc_cond.acct_list);
 		error("need an cluster to find association");
 		return NULL;
 	}
 
 	assoc_cond.user_list = list_create(NULL);
-	if(user)
+	if (user)
 		list_append(assoc_cond.user_list, user);
 	else
 		list_append(assoc_cond.user_list, "");
 
 	assoc_cond.partition_list = list_create(NULL);
-	if(partition)
+	if (partition)
 		list_append(assoc_cond.partition_list, partition);
 	else
 		list_append(assoc_cond.partition_list, "");
@@ -300,7 +639,7 @@ extern slurmdb_association_rec_t *sacctmgr_find_association(char *user,
 	list_destroy(assoc_cond.user_list);
 	list_destroy(assoc_cond.partition_list);
 
-	if(assoc_list)
+	if (assoc_list)
 		assoc = list_pop(assoc_list);
 
 	list_destroy(assoc_list);
@@ -409,17 +748,17 @@ extern int sacctmgr_remove_assoc_usage(slurmdb_association_cond_t *assoc_cond)
 }
 
 extern slurmdb_association_rec_t *sacctmgr_find_account_base_assoc(char *account,
-								char *cluster)
+								   char *cluster)
 {
 	slurmdb_association_rec_t *assoc = NULL;
 	char *temp = "root";
 	slurmdb_association_cond_t assoc_cond;
 	List assoc_list = NULL;
 
-	if(!cluster)
+	if (!cluster)
 		return NULL;
 
-	if(account)
+	if (account)
 		temp = account;
 
 	memset(&assoc_cond, 0, sizeof(slurmdb_association_cond_t));
@@ -437,7 +776,7 @@ extern slurmdb_association_rec_t *sacctmgr_find_account_base_assoc(char *account
 	list_destroy(assoc_cond.cluster_list);
 	list_destroy(assoc_cond.user_list);
 
-	if(assoc_list)
+	if (assoc_list)
 		assoc = list_pop(assoc_list);
 
 	list_destroy(assoc_list);
@@ -457,7 +796,7 @@ extern slurmdb_user_rec_t *sacctmgr_find_user(char *name)
 	slurmdb_association_cond_t assoc_cond;
 	List user_list = NULL;
 
-	if(!name)
+	if (!name)
 		return NULL;
 
 	memset(&user_cond, 0, sizeof(slurmdb_user_cond_t));
@@ -471,7 +810,7 @@ extern slurmdb_user_rec_t *sacctmgr_find_user(char *name)
 
 	list_destroy(assoc_cond.user_list);
 
-	if(user_list)
+	if (user_list)
 		user = list_pop(user_list);
 
 	list_destroy(user_list);
@@ -486,7 +825,7 @@ extern slurmdb_account_rec_t *sacctmgr_find_account(char *name)
 	slurmdb_association_cond_t assoc_cond;
 	List account_list = NULL;
 
-	if(!name)
+	if (!name)
 		return NULL;
 
 	memset(&account_cond, 0, sizeof(slurmdb_account_cond_t));
@@ -500,7 +839,7 @@ extern slurmdb_account_rec_t *sacctmgr_find_account(char *name)
 
 	list_destroy(assoc_cond.acct_list);
 
-	if(account_list)
+	if (account_list)
 		account = list_pop(account_list);
 
 	list_destroy(account_list);
@@ -514,7 +853,7 @@ extern slurmdb_cluster_rec_t *sacctmgr_find_cluster(char *name)
 	slurmdb_cluster_cond_t cluster_cond;
 	List cluster_list = NULL;
 
-	if(!name)
+	if (!name)
 		return NULL;
 
 	slurmdb_init_cluster_cond(&cluster_cond);
@@ -526,7 +865,7 @@ extern slurmdb_cluster_rec_t *sacctmgr_find_cluster(char *name)
 
 	list_destroy(cluster_cond.cluster_list);
 
-	if(cluster_list)
+	if (cluster_list)
 		cluster = list_pop(cluster_list);
 
 	list_destroy(cluster_list);
@@ -541,24 +880,24 @@ extern slurmdb_association_rec_t *sacctmgr_find_association_from_list(
 	ListIterator itr = NULL;
 	slurmdb_association_rec_t * assoc = NULL;
 
-	if(!assoc_list)
+	if (!assoc_list)
 		return NULL;
 
 	itr = list_iterator_create(assoc_list);
 	while((assoc = list_next(itr))) {
-		if(((!user && assoc->user)
-		    || (user && (!assoc->user
-				 || strcasecmp(user, assoc->user))))
-		   || ((!account && assoc->acct)
-		       || (account && (!assoc->acct
-				       || strcasecmp(account, assoc->acct))))
-		   || ((!cluster && assoc->cluster)
-		       || (cluster && (!assoc->cluster
-				       || strcasecmp(cluster, assoc->cluster))))
-		   || ((!partition && assoc->partition)
-		       || (partition && (!assoc->partition
-					 || strcasecmp(partition,
-						       assoc->partition)))))
+		if (((!user && assoc->user)
+		     || (user && (!assoc->user
+				  || strcasecmp(user, assoc->user))))
+		    || ((!account && assoc->acct)
+			|| (account && (!assoc->acct
+					|| strcasecmp(account, assoc->acct))))
+		    || ((!cluster && assoc->cluster)
+			|| (cluster && (!assoc->cluster
+					|| strcasecmp(cluster, assoc->cluster))))
+		    || ((!partition && assoc->partition)
+			|| (partition && (!assoc->partition
+					  || strcasecmp(partition,
+							assoc->partition)))))
 			continue;
 		break;
 	}
@@ -574,21 +913,21 @@ extern slurmdb_association_rec_t *sacctmgr_find_account_base_assoc_from_list(
 	slurmdb_association_rec_t *assoc = NULL;
 	char *temp = "root";
 
-	if(!cluster || !assoc_list)
+	if (!cluster || !assoc_list)
 		return NULL;
 
-	if(account)
+	if (account)
 		temp = account;
 	/* info("looking for %s %s in %d", account, cluster, */
 /* 	     list_count(assoc_list)); */
 	itr = list_iterator_create(assoc_list);
 	while((assoc = list_next(itr))) {
 		/* info("is it %s %s %s", assoc->user, assoc->acct, assoc->cluster); */
-		if(assoc->user
-		   || strcasecmp(temp, assoc->acct)
-		   || strcasecmp(cluster, assoc->cluster))
+		if (assoc->user
+		    || strcasecmp(temp, assoc->acct)
+		    || strcasecmp(cluster, assoc->cluster))
 			continue;
-	/* 	info("found it"); */
+		/* 	info("found it"); */
 		break;
 	}
 	list_iterator_destroy(itr);
@@ -603,17 +942,17 @@ extern slurmdb_qos_rec_t *sacctmgr_find_qos_from_list(
 	slurmdb_qos_rec_t *qos = NULL;
 	char *working_name = NULL;
 
-	if(!name || !qos_list)
+	if (!name || !qos_list)
 		return NULL;
 
-	if(name[0] == '+' || name[0] == '-')
+	if (name[0] == '+' || name[0] == '-')
 		working_name = name+1;
 	else
 		working_name = name;
 
 	itr = list_iterator_create(qos_list);
 	while((qos = list_next(itr))) {
-		if(!strcasecmp(working_name, qos->name))
+		if (!strcasecmp(working_name, qos->name))
 			break;
 	}
 	list_iterator_destroy(itr);
@@ -628,12 +967,12 @@ extern slurmdb_user_rec_t *sacctmgr_find_user_from_list(
 	ListIterator itr = NULL;
 	slurmdb_user_rec_t *user = NULL;
 
-	if(!name || !user_list)
+	if (!name || !user_list)
 		return NULL;
 
 	itr = list_iterator_create(user_list);
 	while((user = list_next(itr))) {
-		if(!strcasecmp(name, user->name))
+		if (!strcasecmp(name, user->name))
 			break;
 	}
 	list_iterator_destroy(itr);
@@ -648,12 +987,12 @@ extern slurmdb_account_rec_t *sacctmgr_find_account_from_list(
 	ListIterator itr = NULL;
 	slurmdb_account_rec_t *account = NULL;
 
-	if(!name || !acct_list)
+	if (!name || !acct_list)
 		return NULL;
 
 	itr = list_iterator_create(acct_list);
 	while((account = list_next(itr))) {
-		if(!strcasecmp(name, account->name))
+		if (!strcasecmp(name, account->name))
 			break;
 	}
 	list_iterator_destroy(itr);
@@ -668,12 +1007,12 @@ extern slurmdb_cluster_rec_t *sacctmgr_find_cluster_from_list(
 	ListIterator itr = NULL;
 	slurmdb_cluster_rec_t *cluster = NULL;
 
-	if(!name || !cluster_list)
+	if (!name || !cluster_list)
 		return NULL;
 
 	itr = list_iterator_create(cluster_list);
 	while((cluster = list_next(itr))) {
-		if(!strcasecmp(name, cluster->name))
+		if (!strcasecmp(name, cluster->name))
 			break;
 	}
 	list_iterator_destroy(itr);
@@ -687,21 +1026,21 @@ extern slurmdb_wckey_rec_t *sacctmgr_find_wckey_from_list(
 	ListIterator itr = NULL;
 	slurmdb_wckey_rec_t * wckey = NULL;
 
-	if(!wckey_list)
+	if (!wckey_list)
 		return NULL;
 
 	itr = list_iterator_create(wckey_list);
 	while((wckey = list_next(itr))) {
-		if(((!user && wckey->user)
-		    || (user && (!wckey->user
-				 || strcasecmp(user, wckey->user))))
-		   || ((!name && wckey->name)
-		       || (name && (!wckey->name
-				    || strcasecmp(name, wckey->name))))
-		   || ((!cluster && wckey->cluster)
-		       || (cluster && (!wckey->cluster
-				       || strcasecmp(cluster,
-						     wckey->cluster)))))
+		if (((!user && wckey->user)
+		     || (user && (!wckey->user
+				  || strcasecmp(user, wckey->user))))
+		    || ((!name && wckey->name)
+			|| (name && (!wckey->name
+				     || strcasecmp(name, wckey->name))))
+		    || ((!cluster && wckey->cluster)
+			|| (cluster && (!wckey->cluster
+					|| strcasecmp(cluster,
+						      wckey->cluster)))))
 			continue;
 		break;
 	}
@@ -715,7 +1054,7 @@ extern int get_uint(char *in_value, uint32_t *out_value, char *type)
 	char *ptr = NULL, *meat = NULL;
 	long num;
 
-	if(!(meat = strip_quotes(in_value, NULL, 1))) {
+	if (!(meat = strip_quotes(in_value, NULL, 1))) {
 		error("Problem with strip_quotes");
 		return SLURM_ERROR;
 	}
@@ -739,7 +1078,7 @@ extern int get_uint16(char *in_value, uint16_t *out_value, char *type)
 	char *ptr = NULL, *meat = NULL;
 	long num;
 
-	if(!(meat = strip_quotes(in_value, NULL, 1))) {
+	if (!(meat = strip_quotes(in_value, NULL, 1))) {
 		error("Problem with strip_quotes");
 		return SLURM_ERROR;
 	}
@@ -764,7 +1103,7 @@ extern int get_uint64(char *in_value, uint64_t *out_value, char *type)
 	char *ptr = NULL, *meat = NULL;
 	long long num;
 
-	if(!(meat = strip_quotes(in_value, NULL, 1))) {
+	if (!(meat = strip_quotes(in_value, NULL, 1))) {
 		error("Problem with strip_quotes");
 		return SLURM_ERROR;
 	}
@@ -789,7 +1128,7 @@ extern int get_double(char *in_value, double *out_value, char *type)
 	char *ptr = NULL, *meat = NULL;
 	double num;
 
-	if(!(meat = strip_quotes(in_value, NULL, 1))) {
+	if (!(meat = strip_quotes(in_value, NULL, 1))) {
 		error("Problem with strip_quotes");
 		return SLURM_ERROR;
 	}
@@ -818,13 +1157,13 @@ extern int addto_action_char_list(List char_list, char *names)
 	uint32_t id=0;
 	int count = 0;
 
-	if(!char_list) {
+	if (!char_list) {
 		error("No list was given to fill in");
 		return 0;
 	}
 
 	itr = list_iterator_create(char_list);
-	if(names) {
+	if (names) {
 		if (names[i] == '\"' || names[i] == '\'') {
 			quote_c = names[i];
 			quote = 1;
@@ -832,17 +1171,17 @@ extern int addto_action_char_list(List char_list, char *names)
 		}
 		start = i;
 		while(names[i]) {
-			if(quote && names[i] == quote_c)
+			if (quote && names[i] == quote_c)
 				break;
 			else if (names[i] == '\"' || names[i] == '\'')
 				names[i] = '`';
-			else if(names[i] == ',') {
-				if((i-start) > 0) {
+			else if (names[i] == ',') {
+				if ((i-start) > 0) {
 					name = xmalloc((i-start+1));
 					memcpy(name, names+start, (i-start));
 
 					id = str_2_slurmdbd_msg_type(name);
-					if(id == NO_VAL) {
+					if (id == NO_VAL) {
 						error("You gave a bad action "
 						      "'%s'.", name);
 						xfree(name);
@@ -852,12 +1191,12 @@ extern int addto_action_char_list(List char_list, char *names)
 
 					name = xstrdup_printf("%u", id);
 					while((tmp_char = list_next(itr))) {
-						if(!strcasecmp(tmp_char, name))
+						if (!strcasecmp(tmp_char, name))
 							break;
 					}
 					list_iterator_reset(itr);
 
-					if(!tmp_char) {
+					if (!tmp_char) {
 						list_append(char_list, name);
 						count++;
 					} else
@@ -866,7 +1205,7 @@ extern int addto_action_char_list(List char_list, char *names)
 
 				i++;
 				start = i;
-				if(!names[i]) {
+				if (!names[i]) {
 					error("There is a problem with "
 					      "your request.  It appears you "
 					      "have spaces inside your list.");
@@ -875,12 +1214,12 @@ extern int addto_action_char_list(List char_list, char *names)
 			}
 			i++;
 		}
-		if((i-start) > 0) {
+		if ((i-start) > 0) {
 			name = xmalloc((i-start)+1);
 			memcpy(name, names+start, (i-start));
 
 			id = str_2_slurmdbd_msg_type(name);
-			if(id == NO_VAL)  {
+			if (id == NO_VAL)  {
 				error("You gave a bad action '%s'.",
 				      name);
 				xfree(name);
@@ -890,11 +1229,11 @@ extern int addto_action_char_list(List char_list, char *names)
 
 			name = xstrdup_printf("%u", id);
 			while((tmp_char = list_next(itr))) {
-				if(!strcasecmp(tmp_char, name))
+				if (!strcasecmp(tmp_char, name))
 					break;
 			}
 
-			if(!tmp_char) {
+			if (!tmp_char) {
 				list_append(char_list, name);
 				count++;
 			} else
@@ -912,7 +1251,7 @@ extern List copy_char_list(List char_list)
 	char *tmp_char = NULL;
 	ListIterator itr = NULL;
 
-	if(!char_list || !list_count(char_list))
+	if (!char_list || !list_count(char_list))
 		return NULL;
 
 	itr = list_iterator_create(char_list);
@@ -934,8 +1273,8 @@ extern void sacctmgr_print_coord_list(
 	char *print_this = NULL;
 	slurmdb_coord_rec_t *object = NULL;
 
-	if(!value || !list_count(value)) {
-		if(print_fields_parsable_print)
+	if (!value || !list_count(value)) {
+		if (print_fields_parsable_print)
 			print_this = xstrdup("");
 		else
 			print_this = xstrdup(" ");
@@ -943,7 +1282,7 @@ extern void sacctmgr_print_coord_list(
 		list_sort(value, (ListCmpF)sort_coord_list);
 		itr = list_iterator_create(value);
 		while((object = list_next(itr))) {
-			if(print_this)
+			if (print_this)
 				xstrfmtcat(print_this, ",%s",
 					   object->name);
 			else
@@ -952,16 +1291,16 @@ extern void sacctmgr_print_coord_list(
 		list_iterator_destroy(itr);
 	}
 
-	if(print_fields_parsable_print == PRINT_FIELDS_PARSABLE_NO_ENDING
-	   && last)
+	if (print_fields_parsable_print == PRINT_FIELDS_PARSABLE_NO_ENDING
+	    && last)
 		printf("%s", print_this);
-	else if(print_fields_parsable_print)
+	else if (print_fields_parsable_print)
 		printf("%s|", print_this);
 	else {
-		if(strlen(print_this) > abs_len)
+		if (strlen(print_this) > abs_len)
 			print_this[abs_len-1] = '+';
 
-		if(field->len == abs_len)
+		if (field->len == abs_len)
 			printf("%*.*s ", abs_len, abs_len, print_this);
 		else
 			printf("%-*.*s ", abs_len, abs_len, print_this);
@@ -977,16 +1316,16 @@ extern void sacctmgr_print_qos_list(print_field_t *field, List qos_list,
 
 	print_this = get_qos_complete_str(qos_list, value);
 
-	if(print_fields_parsable_print == PRINT_FIELDS_PARSABLE_NO_ENDING
-	   && last)
+	if (print_fields_parsable_print == PRINT_FIELDS_PARSABLE_NO_ENDING
+	    && last)
 		printf("%s", print_this);
-	else if(print_fields_parsable_print)
+	else if (print_fields_parsable_print)
 		printf("%s|", print_this);
 	else {
-		if(strlen(print_this) > abs_len)
+		if (strlen(print_this) > abs_len)
 			print_this[abs_len-1] = '+';
 
-		if(field->len == abs_len)
+		if (field->len == abs_len)
 			printf("%*.*s ", abs_len, abs_len, print_this);
 		else
 			printf("%-*.*s ", abs_len, abs_len, print_this);
@@ -1002,16 +1341,16 @@ extern void sacctmgr_print_qos_bitstr(print_field_t *field, List qos_list,
 
 	print_this = get_qos_complete_str_bitstr(qos_list, value);
 
-	if(print_fields_parsable_print == PRINT_FIELDS_PARSABLE_NO_ENDING
-	   && last)
+	if (print_fields_parsable_print == PRINT_FIELDS_PARSABLE_NO_ENDING
+	    && last)
 		printf("%s", print_this);
-	else if(print_fields_parsable_print)
+	else if (print_fields_parsable_print)
 		printf("%s|", print_this);
 	else {
-		if(strlen(print_this) > abs_len)
+		if (strlen(print_this) > abs_len)
 			print_this[abs_len-1] = '+';
 
-		if(field->len == abs_len)
+		if (field->len == abs_len)
 			printf("%*.*s ", abs_len, abs_len, print_this);
 		else
 			printf("%-*.*s ", abs_len, abs_len, print_this);
@@ -1021,93 +1360,93 @@ extern void sacctmgr_print_qos_bitstr(print_field_t *field, List qos_list,
 
 extern void sacctmgr_print_assoc_limits(slurmdb_association_rec_t *assoc)
 {
-	if(!assoc)
+	if (!assoc)
 		return;
 
-	if(assoc->shares_raw == INFINITE)
+	if (assoc->shares_raw == INFINITE)
 		printf("  Fairshare     = NONE\n");
-	else if(assoc->shares_raw != NO_VAL)
+	else if (assoc->shares_raw != NO_VAL)
 		printf("  Fairshare     = %u\n", assoc->shares_raw);
 
-	if(assoc->grp_cpu_mins == INFINITE)
+	if (assoc->grp_cpu_mins == INFINITE)
 		printf("  GrpCPUMins    = NONE\n");
-	else if(assoc->grp_cpu_mins != NO_VAL)
+	else if (assoc->grp_cpu_mins != NO_VAL)
 		printf("  GrpCPUMins    = %llu\n",
 		       (long long unsigned)assoc->grp_cpu_mins);
 
-	if(assoc->grp_cpus == INFINITE)
+	if (assoc->grp_cpus == INFINITE)
 		printf("  GrpCPUs       = NONE\n");
-	else if(assoc->grp_cpus != NO_VAL)
+	else if (assoc->grp_cpus != NO_VAL)
 		printf("  GrpCPUs       = %u\n", assoc->grp_cpus);
 
-	if(assoc->grp_jobs == INFINITE)
+	if (assoc->grp_jobs == INFINITE)
 		printf("  GrpJobs       = NONE\n");
-	else if(assoc->grp_jobs != NO_VAL)
+	else if (assoc->grp_jobs != NO_VAL)
 		printf("  GrpJobs       = %u\n", assoc->grp_jobs);
 
-	if(assoc->grp_nodes == INFINITE)
+	if (assoc->grp_nodes == INFINITE)
 		printf("  GrpNodes      = NONE\n");
-	else if(assoc->grp_nodes != NO_VAL)
+	else if (assoc->grp_nodes != NO_VAL)
 		printf("  GrpNodes      = %u\n", assoc->grp_nodes);
 
-	if(assoc->grp_submit_jobs == INFINITE)
+	if (assoc->grp_submit_jobs == INFINITE)
 		printf("  GrpSubmitJobs = NONE\n");
-	else if(assoc->grp_submit_jobs != NO_VAL)
+	else if (assoc->grp_submit_jobs != NO_VAL)
 		printf("  GrpSubmitJobs = %u\n",
 		       assoc->grp_submit_jobs);
 
-	if(assoc->grp_wall == INFINITE)
+	if (assoc->grp_wall == INFINITE)
 		printf("  GrpWall       = NONE\n");
-	else if(assoc->grp_wall != NO_VAL) {
+	else if (assoc->grp_wall != NO_VAL) {
 		char time_buf[32];
 		mins2time_str((time_t) assoc->grp_wall,
 			      time_buf, sizeof(time_buf));
 		printf("  GrpWall       = %s\n", time_buf);
 	}
 
-	if(assoc->max_cpu_mins_pj == (uint64_t)INFINITE)
+	if (assoc->max_cpu_mins_pj == (uint64_t)INFINITE)
 		printf("  MaxCPUMins    = NONE\n");
-	else if(assoc->max_cpu_mins_pj != (uint64_t)NO_VAL)
+	else if (assoc->max_cpu_mins_pj != (uint64_t)NO_VAL)
 		printf("  MaxCPUMins    = %llu\n",
 		       (long long unsigned)assoc->max_cpu_mins_pj);
 
-	if(assoc->max_cpus_pj == INFINITE)
+	if (assoc->max_cpus_pj == INFINITE)
 		printf("  MaxCPUs       = NONE\n");
-	else if(assoc->max_cpus_pj != NO_VAL)
+	else if (assoc->max_cpus_pj != NO_VAL)
 		printf("  MaxCPUs       = %u\n", assoc->max_cpus_pj);
 
-	if(assoc->max_jobs == INFINITE)
+	if (assoc->max_jobs == INFINITE)
 		printf("  MaxJobs       = NONE\n");
-	else if(assoc->max_jobs != NO_VAL)
+	else if (assoc->max_jobs != NO_VAL)
 		printf("  MaxJobs       = %u\n", assoc->max_jobs);
 
-	if(assoc->max_nodes_pj == INFINITE)
+	if (assoc->max_nodes_pj == INFINITE)
 		printf("  MaxNodes      = NONE\n");
-	else if(assoc->max_nodes_pj != NO_VAL)
+	else if (assoc->max_nodes_pj != NO_VAL)
 		printf("  MaxNodes      = %u\n", assoc->max_nodes_pj);
 
-	if(assoc->max_submit_jobs == INFINITE)
+	if (assoc->max_submit_jobs == INFINITE)
 		printf("  MaxSubmitJobs = NONE\n");
-	else if(assoc->max_submit_jobs != NO_VAL)
+	else if (assoc->max_submit_jobs != NO_VAL)
 		printf("  MaxSubmitJobs = %u\n",
 		       assoc->max_submit_jobs);
 
-	if(assoc->max_wall_pj == INFINITE)
+	if (assoc->max_wall_pj == INFINITE)
 		printf("  MaxWall       = NONE\n");
-	else if(assoc->max_wall_pj != NO_VAL) {
+	else if (assoc->max_wall_pj != NO_VAL) {
 		char time_buf[32];
 		mins2time_str((time_t) assoc->max_wall_pj,
 			      time_buf, sizeof(time_buf));
 		printf("  MaxWall       = %s\n", time_buf);
 	}
 
-	if(assoc->qos_list) {
-		if(!g_qos_list)
+	if (assoc->qos_list) {
+		if (!g_qos_list)
 			g_qos_list =
 				acct_storage_g_get_qos(db_conn, my_uid, NULL);
 		char *temp_char = get_qos_complete_str(g_qos_list,
 						       assoc->qos_list);
-		if(temp_char) {
+		if (temp_char) {
 			printf("  QOS           = %s\n", temp_char);
 			xfree(temp_char);
 		}
@@ -1116,96 +1455,96 @@ extern void sacctmgr_print_assoc_limits(slurmdb_association_rec_t *assoc)
 
 extern void sacctmgr_print_qos_limits(slurmdb_qos_rec_t *qos)
 {
-	if(!qos)
+	if (!qos)
 		return;
 
-	if(qos->preempt_list && !g_qos_list)
+	if (qos->preempt_list && !g_qos_list)
 		g_qos_list = acct_storage_g_get_qos(db_conn, my_uid, NULL);
 
-	if(qos->grp_cpu_mins == INFINITE)
+	if (qos->grp_cpu_mins == INFINITE)
 		printf("  GrpCPUMins     = NONE\n");
-	else if(qos->grp_cpu_mins != NO_VAL)
+	else if (qos->grp_cpu_mins != NO_VAL)
 		printf("  GrpCPUMins     = %llu\n",
 		       (long long unsigned)qos->grp_cpu_mins);
 
-	if(qos->grp_cpus == INFINITE)
+	if (qos->grp_cpus == INFINITE)
 		printf("  GrpCPUs        = NONE\n");
-	else if(qos->grp_cpus != NO_VAL)
+	else if (qos->grp_cpus != NO_VAL)
 		printf("  GrpCPUs        = %u\n", qos->grp_cpus);
 
-	if(qos->grp_jobs == INFINITE)
+	if (qos->grp_jobs == INFINITE)
 		printf("  GrpJobs        = NONE\n");
-	else if(qos->grp_jobs != NO_VAL)
+	else if (qos->grp_jobs != NO_VAL)
 		printf("  GrpJobs        = %u\n", qos->grp_jobs);
 
-	if(qos->grp_nodes == INFINITE)
+	if (qos->grp_nodes == INFINITE)
 		printf("  GrpNodes       = NONE\n");
-	else if(qos->grp_nodes != NO_VAL)
+	else if (qos->grp_nodes != NO_VAL)
 		printf("  GrpNodes       = %u\n", qos->grp_nodes);
 
-	if(qos->grp_submit_jobs == INFINITE)
+	if (qos->grp_submit_jobs == INFINITE)
 		printf("  GrpSubmitJobs  = NONE\n");
-	else if(qos->grp_submit_jobs != NO_VAL)
+	else if (qos->grp_submit_jobs != NO_VAL)
 		printf("  GrpSubmitJobs  = %u\n",
 		       qos->grp_submit_jobs);
 
-	if(qos->grp_wall == INFINITE)
+	if (qos->grp_wall == INFINITE)
 		printf("  GrpWall        = NONE\n");
-	else if(qos->grp_wall != NO_VAL) {
+	else if (qos->grp_wall != NO_VAL) {
 		char time_buf[32];
 		mins2time_str((time_t) qos->grp_wall,
 			      time_buf, sizeof(time_buf));
 		printf("  GrpWall        = %s\n", time_buf);
 	}
 
-	if(qos->max_cpu_mins_pj == (uint64_t)INFINITE)
+	if (qos->max_cpu_mins_pj == (uint64_t)INFINITE)
 		printf("  MaxCPUMins     = NONE\n");
-	else if(qos->max_cpu_mins_pj != (uint64_t)NO_VAL)
+	else if (qos->max_cpu_mins_pj != (uint64_t)NO_VAL)
 		printf("  MaxCPUMins     = %llu\n",
 		       (long long unsigned)qos->max_cpu_mins_pj);
 
-	if(qos->max_cpus_pj == INFINITE)
+	if (qos->max_cpus_pj == INFINITE)
 		printf("  MaxCPUs        = NONE\n");
-	else if(qos->max_cpus_pj != NO_VAL)
+	else if (qos->max_cpus_pj != NO_VAL)
 		printf("  MaxCPUs        = %u\n", qos->max_cpus_pj);
 
-	if(qos->max_jobs_pu == INFINITE)
+	if (qos->max_jobs_pu == INFINITE)
 		printf("  MaxJobs        = NONE\n");
-	else if(qos->max_jobs_pu != NO_VAL)
+	else if (qos->max_jobs_pu != NO_VAL)
 		printf("  MaxJobs        = %u\n", qos->max_jobs_pu);
 
-	if(qos->max_nodes_pj == INFINITE)
+	if (qos->max_nodes_pj == INFINITE)
 		printf("  MaxNodes       = NONE\n");
-	else if(qos->max_nodes_pj != NO_VAL)
+	else if (qos->max_nodes_pj != NO_VAL)
 		printf("  MaxNodes       = %u\n", qos->max_nodes_pj);
 
-	if(qos->max_submit_jobs_pu == INFINITE)
+	if (qos->max_submit_jobs_pu == INFINITE)
 		printf("  MaxSubmitJobs  = NONE\n");
-	else if(qos->max_submit_jobs_pu != NO_VAL)
+	else if (qos->max_submit_jobs_pu != NO_VAL)
 		printf("  MaxSubmitJobs  = %u\n",
 		       qos->max_submit_jobs_pu);
 
-	if(qos->max_wall_pj == INFINITE)
+	if (qos->max_wall_pj == INFINITE)
 		printf("  MaxWall        = NONE\n");
-	else if(qos->max_wall_pj != NO_VAL) {
+	else if (qos->max_wall_pj != NO_VAL) {
 		char time_buf[32];
 		mins2time_str((time_t) qos->max_wall_pj,
 			      time_buf, sizeof(time_buf));
 		printf("  MaxWall        = %s\n", time_buf);
 	}
 
-	if(qos->preempt_list) {
+	if (qos->preempt_list) {
 		char *temp_char = get_qos_complete_str(g_qos_list,
 						       qos->preempt_list);
-		if(temp_char) {
+		if (temp_char) {
 			printf("  Preempt        = %s\n", temp_char);
 			xfree(temp_char);
 		}
 	}
 
-	if(qos->priority == INFINITE)
+	if (qos->priority == INFINITE)
 		printf("  Priority       = NONE\n");
-	else if(qos->priority != NO_VAL)
+	else if (qos->priority != NO_VAL)
 		printf("  Priority       = %d\n", qos->priority);
 
 }
@@ -1222,3 +1561,21 @@ extern int sort_coord_list(slurmdb_coord_rec_t *coord_a,
 
 	return 0;
 }
+
+extern List sacctmgr_process_format_list(List format_list)
+{
+	List print_fields_list = list_create(destroy_print_field);
+	ListIterator itr = list_iterator_create(format_list);
+	print_field_t *field = NULL;
+	char *object = NULL;
+
+	while((object = list_next(itr))) {
+		if(!(field = _get_print_field(object)))
+			exit(1);
+
+		list_append(print_fields_list, field);
+	}
+	list_iterator_destroy(itr);
+
+	return print_fields_list;
+}
diff --git a/src/sacctmgr/event_functions.c b/src/sacctmgr/event_functions.c
index ce156aab572179a5928ef62ccea4861215ae86a5..08c6b27804c9e7a26c8865f70437b9b59ff7cfcf 100644
--- a/src/sacctmgr/event_functions.c
+++ b/src/sacctmgr/event_functions.c
@@ -471,22 +471,6 @@ extern int sacctmgr_list_event(int argc, char *argv[])
 	List format_list = list_create(slurm_destroy_char);
 	List print_fields_list; /* types are of print_field_t */
 
-	enum {
-		PRINT_CLUSTER,
-		PRINT_CLUSTER_NODES,
-		PRINT_CPUS,
-		PRINT_DURATION,
-		PRINT_END,
-		PRINT_EVENTRAW,
-		PRINT_EVENT,
-		PRINT_NODENAME,
-		PRINT_START,
-		PRINT_REASON,
-		PRINT_STATERAW,
-		PRINT_STATE,
-		PRINT_USER
-	};
-
 	for (i=0; i<argc; i++) {
 		int command_len = strlen(argv[i]);
 		if (!strncasecmp (argv[i], "Where", MAX(command_len, 5))
diff --git a/src/sacctmgr/file_functions.c b/src/sacctmgr/file_functions.c
index b836d2a9e6e30f73c25826d9b29095f1a1848b43..a3224e5444dd03a7a7de5231c0aaa9a38da79371 100644
--- a/src/sacctmgr/file_functions.c
+++ b/src/sacctmgr/file_functions.c
@@ -72,41 +72,6 @@ typedef struct {
 	List wckey_list;
 } sacctmgr_file_opts_t;
 
-enum {
-	PRINT_ACCOUNT,
-	PRINT_CLASSIFICATION,
-	PRINT_ADMIN,
-	PRINT_CLUSTER,
-	PRINT_COORDS,
-	PRINT_DACCT,
-	PRINT_DQOS,
-	PRINT_DWCKEY,
-	PRINT_DESC,
-	PRINT_FAIRSHARE,
-	PRINT_GRPCM,
-	PRINT_GRPC,
-	PRINT_GRPJ,
-	PRINT_GRPN,
-	PRINT_GRPS,
-	PRINT_GRPW,
-	PRINT_ID,
-	PRINT_MAXC,
-	PRINT_MAXCM,
-	PRINT_MAXJ,
-	PRINT_MAXN,
-	PRINT_MAXS,
-	PRINT_MAXW,
-	PRINT_NAME,
-	PRINT_ORG,
-	PRINT_QOS,
-	PRINT_QOS_RAW,
-	PRINT_PID,
-	PRINT_PARENT,
-	PRINT_PART,
-	PRINT_USER,
-	PRINT_WCKEYS
-};
-
 typedef enum {
 	MOD_CLUSTER,
 	MOD_ACCT,
@@ -561,213 +526,6 @@ static sacctmgr_file_opts_t *_parse_options(char *options)
 	return file_opts;
 }
 
-static List _set_up_print_fields(List format_list)
-{
-	ListIterator itr = NULL;
-	List print_fields_list = NULL;
-	print_field_t *field = NULL;
-	char *object = NULL;
-
-	print_fields_list = list_create(destroy_print_field);
-	itr = list_iterator_create(format_list);
-	while((object = list_next(itr))) {
-		int command_len = strlen(object);
-		field = xmalloc(sizeof(print_field_t));
-		if(!strncasecmp("Account", object, MAX(command_len, 2))) {
-			field->type = PRINT_ACCOUNT;
-			field->name = xstrdup("Account");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("AdminLevel", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_ADMIN;
-			field->name = xstrdup("Admin");
-			field->len = 9;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Cluster", object,
-				       MAX(command_len, 3))) {
-			field->type = PRINT_CLUSTER;
-			field->name = xstrdup("Cluster");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Classification", object,
-				       MAX(command_len, 3))) {
-			field->type = PRINT_CLASSIFICATION;
-			field->name = xstrdup("Classif");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Coordinators", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_COORDS;
-			field->name = xstrdup("Coord Accounts");
-			field->len = 20;
-			field->print_routine = sacctmgr_print_coord_list;
-		} else if(!strncasecmp("DefaultAccount", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_DACCT;
-			field->name = xstrdup("Def Acct");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("DefaultQOS", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_DQOS;
-			field->name = xstrdup("Def QOS");
-			field->len = 9;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("DefaultWckey", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_DWCKEY;
-			field->name = xstrdup("Def WCKey");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Description", object,
-				       MAX(command_len, 3))) {
-			field->type = PRINT_DESC;
-			field->name = xstrdup("Descr");
-			field->len = 20;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("FairShare", object,
-				       MAX(command_len, 1))
-			  || !strncasecmp("Shares", object,
-					  MAX(command_len, 1))) {
-			field->type = PRINT_FAIRSHARE;
-			field->name = xstrdup("FairShare");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpCPUMins", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_GRPCM;
-			field->name = xstrdup("GrpCPUMins");
-			field->len = 11;
-			field->print_routine = print_fields_uint64;
-		} else if(!strncasecmp("GrpCPUs", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_GRPC;
-			field->name = xstrdup("GrpCPUs");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPJ;
-			field->name = xstrdup("GrpJobs");
-			field->len = 7;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpNodes", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPN;
-			field->name = xstrdup("GrpNodes");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpSubmitJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPS;
-			field->name = xstrdup("GrpSubmit");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpWall", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPW;
-			field->name = xstrdup("GrpWall");
-			field->len = 11;
-			field->print_routine = print_fields_time;
-		} else if(!strncasecmp("ID", object, MAX(command_len, 1))) {
-			field->type = PRINT_ID;
-			field->name = xstrdup("ID");
-			field->len = 6;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxCPUMinsPerJob", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_MAXCM;
-			field->name = xstrdup("MaxCPUMins");
-			field->len = 11;
-			field->print_routine = print_fields_uint64;
-		} else if(!strncasecmp("MaxCPUsPerJob", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_MAXC;
-			field->name = xstrdup("MaxCPUs");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXJ;
-			field->name = xstrdup("MaxJobs");
-			field->len = 7;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxNodesPerJob", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXN;
-			field->name = xstrdup("MaxNodes");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxSubmitJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXS;
-			field->name = xstrdup("MaxSubmit");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxWallDurationPerJob", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXW;
-			field->name = xstrdup("MaxWall");
-			field->len = 11;
-			field->print_routine = print_fields_time;
-		} else if(!strncasecmp("Name", object, MAX(command_len, 1))) {
-			field->type = PRINT_NAME;
-			field->name = xstrdup("Name");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Organization", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_ORG;
-			field->name = xstrdup("Org");
-			field->len = 20;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("QOSRAWLevel", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_QOS_RAW;
-			field->name = xstrdup("QOS_RAW");
-			field->len = 7;
-			field->print_routine = print_fields_char_list;
-		} else if(!strncasecmp("QOSLevel", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_QOS;
-			field->name = xstrdup("QOS");
-			field->len = 9;
-			field->print_routine = sacctmgr_print_qos_list;
-		} else if(!strncasecmp("Parent", object, MAX(command_len, 4))) {
-			field->type = PRINT_PARENT;
-			field->name = xstrdup("Parent");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Partition", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_PART;
-			field->name = xstrdup("Partition");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("User", object, MAX(command_len, 1))) {
-			field->type = PRINT_USER;
-			field->name = xstrdup("User");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("WCKeys", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_WCKEYS;
-			field->name = xstrdup("WCKeys");
-			field->len = 20;
-			field->print_routine = print_fields_char_list;
-		} else {
-			exit_code=1;
-			fprintf(stderr, "Unknown field '%s'\n", object);
-			xfree(field);
-			continue;
-		}
-		list_append(print_fields_list, field);
-	}
-	list_iterator_destroy(itr);
-	return print_fields_list;
-}
-
 static int _print_out_assoc(List assoc_list, bool user, bool add)
 {
 	List format_list = NULL;
@@ -787,13 +545,13 @@ static int _print_out_assoc(List assoc_list, bool user, bool add)
 				      "User,Account");
 	else
 		slurm_addto_char_list(format_list,
-				      "Account,Parent");
+				      "Account,ParentName");
 	slurm_addto_char_list(format_list,
-			      "F,GrpCPUM,GrpCPUs,"
+			      "Share,GrpCPUM,GrpCPUs,"
 			      "GrpJ,GrpN,GrpS,GrpW,MaxCPUM,MaxCPUs,"
 			      "MaxJ,MaxS,MaxN,MaxW,QOS,DefaultQOS");
 
-	print_fields_list = _set_up_print_fields(format_list);
+	print_fields_list = sacctmgr_process_format_list(format_list);
 	list_destroy(format_list);
 
 	print_fields_header(print_fields_list);
@@ -803,7 +561,7 @@ static int _print_out_assoc(List assoc_list, bool user, bool add)
 	while((assoc = list_next(itr))) {
 		while((field = list_next(itr2))) {
 			switch(field->type) {
-			case PRINT_ACCOUNT:
+			case PRINT_ACCT:
 				field->print_routine(field,
 						     assoc->acct);
 				break;
@@ -877,7 +635,7 @@ static int _print_out_assoc(List assoc_list, bool user, bool add)
 					field,
 					assoc->max_wall_pj);
 				break;
-			case PRINT_PARENT:
+			case PRINT_PNAME:
 				field->print_routine(field,
 						     assoc->parent_acct);
 				break;
@@ -2635,7 +2393,7 @@ extern void load_sacctmgr_cfg_file (int argc, char *argv[])
 		slurm_addto_char_list(format_list,
 				"Name,Description,Organization,QOS");
 
-		print_fields_list = _set_up_print_fields(format_list);
+		print_fields_list = sacctmgr_process_format_list(format_list);
 		list_flush(format_list);
 
 		print_fields_header(print_fields_list);
@@ -2686,7 +2444,7 @@ extern void load_sacctmgr_cfg_file (int argc, char *argv[])
 		slurm_addto_char_list(format_list,
 				      "Name,DefaultA,DefaultW,QOS,Admin,Coord");
 
-		print_fields_list = _set_up_print_fields(format_list);
+		print_fields_list = sacctmgr_process_format_list(format_list);
 		list_flush(format_list);
 		print_fields_header(print_fields_list);
 
diff --git a/src/sacctmgr/problem_functions.c b/src/sacctmgr/problem_functions.c
index 0e2fca1b279246aad512948ec2a48ba6ea7a85ae..32762a41a904b4746d3e58351afcd6c78becd627 100644
--- a/src/sacctmgr/problem_functions.c
+++ b/src/sacctmgr/problem_functions.c
@@ -38,7 +38,6 @@
 \*****************************************************************************/
 
 #include "src/sacctmgr/sacctmgr.h"
-static bool tree_display = 0;
 
 static int _set_cond(int *start, int argc, char *argv[],
 		     slurmdb_association_cond_t *assoc_cond,
@@ -136,7 +135,6 @@ extern int sacctmgr_list_problem(int argc, char *argv[])
 	int i=0;
 	ListIterator itr = NULL;
 	ListIterator itr2 = NULL;
-	char *object = NULL;
 	List tree_list = NULL;
 
 	int field_count = 0;
@@ -146,13 +144,6 @@ extern int sacctmgr_list_problem(int argc, char *argv[])
 	List format_list = list_create(slurm_destroy_char);
 	List print_fields_list; /* types are of print_field_t */
 
-	enum {
-		PRINT_ACCOUNT,
-		PRINT_CLUSTER,
-		PRINT_PROBLEM,
-		PRINT_USER,
-	};
-
 	for (i=0; i<argc; i++) {
 		int command_len = strlen(argv[i]);
 		if (!strncasecmp (argv[i], "Where", MAX(command_len, 5))
@@ -166,65 +157,9 @@ extern int sacctmgr_list_problem(int argc, char *argv[])
 		list_destroy(format_list);
 		return SLURM_ERROR;
 	} else if(!list_count(format_list))
-		slurm_addto_char_list(format_list, "C,A,U,Problem");
-
-	print_fields_list = list_create(destroy_print_field);
-
-	itr = list_iterator_create(format_list);
-	while((object = list_next(itr))) {
-		char *tmp_char = NULL;
-		int command_len = 0;
-		int newlen = 0;
-
-		if((tmp_char = strstr(object, "\%"))) {
-			newlen = atoi(tmp_char+1);
-			tmp_char[0] = '\0';
-		}
-
-		command_len = strlen(object);
-
-		field = xmalloc(sizeof(print_field_t));
+		slurm_addto_char_list(format_list, "Cl,Acct,User,Problem");
 
-		if(!strncasecmp("Account", object, MAX(command_len, 1))
-		   || !strncasecmp("Acct", object, MAX(command_len, 4))) {
-			field->type = PRINT_ACCOUNT;
-			field->name = xstrdup("Account");
-			if(tree_display)
-				field->len = -20;
-			else
-				field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Cluster", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_CLUSTER;
-			field->name = xstrdup("Cluster");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Problem", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_PROBLEM;
-			field->name = xstrdup("Problem");
-			field->len = 40;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("User", object, MAX(command_len, 1))) {
-			field->type = PRINT_USER;
-			field->name = xstrdup("User");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else {
-			exit_code=1;
-			fprintf(stderr, "Unknown field '%s'\n", object);
-			exit(1);
-			xfree(field);
-			continue;
-		}
-
-		if(newlen)
-			field->len = newlen;
-
-		list_append(print_fields_list, field);
-	}
-	list_iterator_destroy(itr);
+	print_fields_list = sacctmgr_process_format_list(format_list);
 	list_destroy(format_list);
 
 	if(exit_code) {
@@ -254,7 +189,7 @@ extern int sacctmgr_list_problem(int argc, char *argv[])
 		int curr_inx = 1;
 		while((field = list_next(itr2))) {
 			switch(field->type) {
-			case PRINT_ACCOUNT:
+			case PRINT_ACCT:
 				field->print_routine(
 					field,
 					assoc->acct,
@@ -301,5 +236,6 @@ extern int sacctmgr_list_problem(int argc, char *argv[])
 	list_iterator_destroy(itr);
 	list_destroy(assoc_list);
 	list_destroy(print_fields_list);
+	tree_display = 0;
 	return rc;
 }
diff --git a/src/sacctmgr/qos_functions.c b/src/sacctmgr/qos_functions.c
index 2d92a45dfde83b51fa0c82902116a93a19bb62cf..d1f133b8fa0f89c992e68b5601016c0fc41a1609 100644
--- a/src/sacctmgr/qos_functions.c
+++ b/src/sacctmgr/qos_functions.c
@@ -565,7 +565,6 @@ extern int sacctmgr_list_qos(int argc, char *argv[])
 	ListIterator itr = NULL;
 	ListIterator itr2 = NULL;
 	slurmdb_qos_rec_t *qos = NULL;
-	char *object;
 	List qos_list = NULL;
 	int field_count = 0;
 
@@ -574,28 +573,6 @@ extern int sacctmgr_list_qos(int argc, char *argv[])
 	List format_list = list_create(slurm_destroy_char);
 	List print_fields_list; /* types are of print_field_t */
 
-	enum {
-		PRINT_DESC,
-		PRINT_ID,
-		PRINT_NAME,
-		PRINT_GRPCM,
-		PRINT_GRPC,
-		PRINT_GRPJ,
-		PRINT_GRPN,
-		PRINT_GRPS,
-		PRINT_GRPW,
-		PRINT_MAXC,
-		PRINT_MAXCM,
-		PRINT_MAXJ,
-		PRINT_MAXN,
-		PRINT_MAXS,
-		PRINT_MAXW,
-		PRINT_PREE,
-		PRINT_PREEM,
-		PRINT_PRIO,
-		PRINT_UF,
-	};
-
 	for (i=0; i<argc; i++) {
 		int command_len = strlen(argv[i]);
 		if (!strncasecmp (argv[i], "Where", MAX(command_len, 5))
@@ -609,162 +586,11 @@ extern int sacctmgr_list_qos(int argc, char *argv[])
 		list_destroy(format_list);
 		return SLURM_ERROR;
 	} else if(!list_count(format_list)) {
-		slurm_addto_char_list(format_list, "N,Prio,Preempt,PreemptM,"
+		slurm_addto_char_list(format_list, "Name,Prio,Preempt,PreemptM,"
 				      "GrpJ,GrpN,GrpS,MaxJ,MaxN,MaxS,MaxW");
 	}
 
-	print_fields_list = list_create(destroy_print_field);
-
-	itr = list_iterator_create(format_list);
-	while((object = list_next(itr))) {
-		char *tmp_char = NULL;
-		int command_len = 0;
-		int newlen = 0;
-
-		if((tmp_char = strstr(object, "\%"))) {
-			newlen = atoi(tmp_char+1);
-			tmp_char[0] = '\0';
-		}
-
-		command_len = strlen(object);
-
-		field = xmalloc(sizeof(print_field_t));
-		if(!strncasecmp("Description", object, MAX(command_len, 1))) {
-			field->type = PRINT_DESC;
-			field->name = xstrdup("Descr");
-			field->len = 20;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("GrpCPUMins", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_GRPCM;
-			field->name = xstrdup("GrpCPUMins");
-			field->len = 11;
-			field->print_routine = print_fields_uint64;
-		} else if(!strncasecmp("GrpCPUs", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_GRPC;
-			field->name = xstrdup("GrpCPUs");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPJ;
-			field->name = xstrdup("GrpJobs");
-			field->len = 7;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpNodes", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPN;
-			field->name = xstrdup("GrpNodes");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpSubmitJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPS;
-			field->name = xstrdup("GrpSubmit");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpWall", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPW;
-			field->name = xstrdup("GrpWall");
-			field->len = 11;
-			field->print_routine = print_fields_time;
-		} else if(!strncasecmp("GrpWallRaw", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_GRPW;
-			field->name = xstrdup("GrpWall");
-			field->len = 11;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("ID", object, MAX(command_len, 1))) {
-			field->type = PRINT_ID;
-			field->name = xstrdup("ID");
-			field->len = 6;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxCPUMinsPerJob", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_MAXCM;
-			field->name = xstrdup("MaxCPUMins");
-			field->len = 11;
-			field->print_routine = print_fields_uint64;
-		} else if(!strncasecmp("MaxCPUsPerJob", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_MAXC;
-			field->name = xstrdup("MaxCPUs");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxJobsPerUser", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXJ;
-			field->name = xstrdup("MaxJobs");
-			field->len = 7;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxNodesPerJob", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXN;
-			field->name = xstrdup("MaxNodes");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxSubmitJobsPerUser", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXS;
-			field->name = xstrdup("MaxSubmit");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxWallDurationPerJob", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXW;
-			field->name = xstrdup("MaxWall");
-			field->len = 11;
-			field->print_routine = print_fields_time;
-		} else if(!strncasecmp("MaxWallRaw", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_MAXW;
-			field->name = xstrdup("MaxWall");
-			field->len = 11;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("Name", object, MAX(command_len, 1))) {
-			field->type = PRINT_NAME;
-			field->name = xstrdup("Name");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Preempt", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_PREE;
-			field->name = xstrdup("Preempt");
-			field->len = 10;
-			field->print_routine = sacctmgr_print_qos_bitstr;
-		} else if(!strncasecmp("PreemptMode", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_PREEM;
-			field->name = xstrdup("PreemptMode");
-			field->len = 11;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Priority", object,
-				       MAX(command_len, 3))) {
-			field->type = PRINT_PRIO;
-			field->name = xstrdup("Priority");
-			field->len = 10;
-			field->print_routine = print_fields_int;
-		} else if(!strncasecmp("UsageFactor", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_UF;
-			field->name = xstrdup("UsageFactor");
-			field->len = 11;
-			field->print_routine = print_fields_double;
-		} else {
-			exit_code=1;
-			fprintf(stderr, "Unknown field '%s'\n", object);
-			xfree(field);
-			continue;
-		}
-
-		if(newlen)
-			field->len = newlen;
-
-		list_append(print_fields_list, field);
-	}
-	list_iterator_destroy(itr);
+	print_fields_list = sacctmgr_process_format_list(format_list);
 	list_destroy(format_list);
 
 	if(exit_code) {
diff --git a/src/sacctmgr/sacctmgr.c b/src/sacctmgr/sacctmgr.c
index b07968e088ecf5a7cb0f3d8cc01119c24161fe7d..07a65ac58747e63e14a37bcda6a86f9df5505c42 100644
--- a/src/sacctmgr/sacctmgr.c
+++ b/src/sacctmgr/sacctmgr.c
@@ -58,6 +58,7 @@ int with_assoc_flag = 0;
 void *db_conn = NULL;
 uint32_t my_uid = 0;
 List g_qos_list = NULL;
+bool tree_display = 0;
 
 static void	_add_it (int argc, char *argv[]);
 static void	_archive_it (int argc, char *argv[]);
@@ -921,13 +922,12 @@ sacctmgr [<OPTION>] [<COMMAND>]                                            \n\
                             MaxWall, QOS, ParentID, ParentName,            \n\
                             Partition, RawQOS, RGT, User                   \n\
                                                                            \n\
-       Cluster            - Classification, Cluster, ControlHost,          \n\
-                            ControlPort, CpuCount, DefaultQOS, Fairshare,  \n\
-                            Flags, GrpCPUMins, GrpCPUs, GrpJobs,           \n\
+       Cluster            - Classification, Cluster, ClusterNodes,         \n\
+                            ControlHost, ControlPort, CpuCount, DefaultQOS,\n\
+                            Fairshare, Flags, GrpCPUMins, GrpCPUs, GrpJobs,\n\
                             GrpNodes, GrpSubmitJob, MaxCPUMins,            \n\
                             MaxCPUs, MaxJobs, MaxNodes, MaxSubmitJobs,     \n\
-                            MaxWall, NodeCount, NodeNames, PluginIDSelect, \n\
-                            RPC                                            \n\
+                            MaxWall, NodeCount, PluginIDSelect, RPC        \n\
                                                                            \n\
        Event              - Cluster, ClusterNodes, CPUs, Duration, End,    \n\
                             Event, EventRaw, NodeName, Reason, Start,      \n\
diff --git a/src/sacctmgr/sacctmgr.h b/src/sacctmgr/sacctmgr.h
index e77298d9d965775da0e3b144d33b34bfd49b6b65..4d055ba3e63d2b4859cc1902bbd7b68a4c692561 100644
--- a/src/sacctmgr/sacctmgr.h
+++ b/src/sacctmgr/sacctmgr.h
@@ -87,6 +87,94 @@
 #define CKPT_WAIT	10
 #define	MAX_INPUT_FIELDS 128
 
+typedef enum {
+	/* COMMON */
+	PRINT_ACCT,
+	PRINT_CLUSTER,
+	PRINT_COORDS,
+	PRINT_DESC,
+	PRINT_NAME,
+	PRINT_PART,
+	PRINT_QOS,
+	PRINT_QOS_RAW,
+	PRINT_USER,
+	PRINT_WCKEYS,
+
+	/* LIMITS */
+	PRINT_FAIRSHARE = 1000,
+	PRINT_GRPCM,
+	PRINT_GRPCRM,
+	PRINT_GRPC,
+	PRINT_GRPJ,
+	PRINT_GRPN,
+	PRINT_GRPS,
+	PRINT_GRPW,
+	PRINT_MAXCM,
+	PRINT_MAXCRM,
+	PRINT_MAXC,
+	PRINT_MAXJ,
+	PRINT_MAXN,
+	PRINT_MAXS,
+	PRINT_MAXW,
+
+	/* ASSOCIATION */
+	PRINT_DQOS = 2000,
+	PRINT_ID,
+	PRINT_LFT,
+	PRINT_PID,
+	PRINT_PNAME,
+	PRINT_RGT,
+
+	/* CLUSTER */
+	PRINT_CHOST = 3000,
+	PRINT_CPORT,
+	PRINT_CLASS,
+	PRINT_CPUS,
+	PRINT_FLAGS,
+	PRINT_NODECNT,
+	PRINT_CLUSTER_NODES,
+	PRINT_RPC_VERSION,
+	PRINT_SELECT,
+
+	/* ACCT */
+	PRINT_ORG = 4000,
+
+	/* USER */
+	PRINT_ADMIN = 5000,
+	PRINT_DACCT,
+	PRINT_DWCKEY,
+
+	/* QOS */
+	PRINT_PREE = 6000,
+	PRINT_PREEM,
+	PRINT_PRIO,
+	PRINT_UF,
+
+	/* PROBLEM */
+	PRINT_PROBLEM = 7000,
+
+	/* TXN */
+	PRINT_ACTIONRAW = 8000,
+	PRINT_ACTION,
+	PRINT_ACTOR,
+	PRINT_INFO,
+	PRINT_TS,
+	PRINT_WHERE,
+
+	/* EVENT */
+	PRINT_DURATION,
+	PRINT_END,
+	PRINT_EVENTRAW,
+	PRINT_EVENT,
+	PRINT_NODENAME,
+	PRINT_REASON,
+	PRINT_START,
+	PRINT_STATERAW,
+	PRINT_STATE,
+
+} sacctmgr_print_t;
+
+
 extern char *command_name;
 extern int exit_code;	/* sacctmgr's exit code, =1 on any error at any time */
 extern int exit_flag;	/* program to terminate if =1 */
@@ -99,6 +187,7 @@ extern int readonly_flag; /* make it so you can only run list commands */
 extern void *db_conn;
 extern uint32_t my_uid;
 extern List g_qos_list;
+extern bool tree_display;
 
 extern int sacctmgr_set_association_cond(slurmdb_association_cond_t *assoc_cond,
 					 char *type, char *value,
@@ -106,6 +195,9 @@ extern int sacctmgr_set_association_cond(slurmdb_association_cond_t *assoc_cond,
 extern int sacctmgr_set_association_rec(slurmdb_association_rec_t *assoc_rec,
 					char *type, char *value,
 					int command_len, int option);
+extern void sacctmgr_print_association_rec(slurmdb_association_rec_t *assoc,
+					   print_field_t *field, List tree_list,
+					   bool last);
 
 extern int sacctmgr_add_association(int argc, char *argv[]);
 extern int sacctmgr_add_user(int argc, char *argv[]);
@@ -168,6 +260,7 @@ extern void sacctmgr_print_qos_limits(slurmdb_qos_rec_t *qos);
 extern int sacctmgr_remove_assoc_usage(slurmdb_association_cond_t *assoc_cond);
 extern int sort_coord_list(slurmdb_coord_rec_t *coord_a,
 			   slurmdb_coord_rec_t *coord_b);
+extern List sacctmgr_process_format_list(List format_list);
 
 /* you need to free the objects returned from these functions */
 extern slurmdb_association_rec_t *sacctmgr_find_association(char *user,
diff --git a/src/sacctmgr/txn_functions.c b/src/sacctmgr/txn_functions.c
index 3795eedfa9fcf35b575675fc002e405c80a2413a..8d69f691ab6ad8238aaf6806f412a6cf30e8df9b 100644
--- a/src/sacctmgr/txn_functions.c
+++ b/src/sacctmgr/txn_functions.c
@@ -170,7 +170,6 @@ extern int sacctmgr_list_txn(int argc, char *argv[])
 	int i=0;
 	ListIterator itr = NULL;
 	ListIterator itr2 = NULL;
-	char *object = NULL;
 	int field_count = 0;
 
 	print_field_t *field = NULL;
@@ -178,19 +177,6 @@ extern int sacctmgr_list_txn(int argc, char *argv[])
 	List format_list = list_create(slurm_destroy_char);
 	List print_fields_list; /* types are of print_field_t */
 
-	enum {
-		PRINT_ACCT,
-		PRINT_ACTIONRAW,
-		PRINT_ACTION,
-		PRINT_ACTOR,
-		PRINT_CLUSTER,
-		PRINT_ID,
-		PRINT_INFO,
-		PRINT_TS,
-		PRINT_USER,
-		PRINT_WHERE
-	};
-
 	for (i=0; i<argc; i++) {
 		int command_len = strlen(argv[i]);
 		if (!strncasecmp (argv[i], "Where", MAX(command_len, 5))
@@ -205,8 +191,6 @@ extern int sacctmgr_list_txn(int argc, char *argv[])
 		return SLURM_ERROR;
 	}
 
-	print_fields_list = list_create(destroy_print_field);
-
 	if(!list_count(format_list)) {
 		slurm_addto_char_list(format_list, "T,Action,Actor,Where,Info");
 		if(txn_cond->with_assoc_info)
@@ -214,88 +198,7 @@ extern int sacctmgr_list_txn(int argc, char *argv[])
 					      "User,Account,Cluster");
 	}
 
-	itr = list_iterator_create(format_list);
-	while((object = list_next(itr))) {
-		char *tmp_char = NULL;
-		int command_len = 0;
-		int newlen = 0;
-
-		if((tmp_char = strstr(object, "\%"))) {
-			newlen = atoi(tmp_char+1);
-			tmp_char[0] = '\0';
-		}
-
-		command_len = strlen(object);
-
-		field = xmalloc(sizeof(print_field_t));
-		if(!strncasecmp("Accounts", object, MAX(command_len, 3))) {
-			field->type = PRINT_ACCT;
-			field->name = xstrdup("Accounts");
-			field->len = 20;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("ActionRaw", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_ACTIONRAW;
-			field->name = xstrdup("ActionRaw");
-			field->len = 10;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("Action", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_ACTION;
-			field->name = xstrdup("Action");
-			field->len = 20;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Actor", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_ACTOR;
-			field->name = xstrdup("Actor");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Clusters", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_CLUSTER;
-			field->name = xstrdup("Clusters");
-			field->len = 20;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("ID", object, MAX(command_len, 2))) {
-			field->type = PRINT_ID;
-			field->name = xstrdup("ID");
-			field->len = 6;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("Info", object, MAX(command_len, 2))) {
-			field->type = PRINT_INFO;
-			field->name = xstrdup("Info");
-			field->len = 20;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("TimeStamp", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_TS;
-			field->name = xstrdup("Time");
-			field->len = 19;
-			field->print_routine = print_fields_date;
-		} else if(!strncasecmp("Users", object, MAX(command_len, 4))) {
-			field->type = PRINT_USER;
-			field->name = xstrdup("Users");
-			field->len = 20;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Where", object, MAX(command_len, 1))) {
-			field->type = PRINT_WHERE;
-			field->name = xstrdup("Where");
-			field->len = 20;
-			field->print_routine = print_fields_str;
-		} else {
-			exit_code=1;
-			fprintf(stderr, " Unknown field '%s'\n", object);
-			xfree(field);
-			continue;
-		}
-
-		if(newlen)
-			field->len = newlen;
-
-		list_append(print_fields_list, field);
-	}
-	list_iterator_destroy(itr);
+	print_fields_list = sacctmgr_process_format_list(format_list);
 	list_destroy(format_list);
 
 	if(exit_code) {
diff --git a/src/sacctmgr/user_functions.c b/src/sacctmgr/user_functions.c
index e0b873f66810beb7c909e766e91c37ee7642366f..f95e427cf50a141193fc0657612502d1ef32b2e2 100644
--- a/src/sacctmgr/user_functions.c
+++ b/src/sacctmgr/user_functions.c
@@ -1133,8 +1133,6 @@ extern int sacctmgr_list_user(int argc, char *argv[])
 	ListIterator itr2 = NULL;
 	slurmdb_user_rec_t *user = NULL;
 	slurmdb_association_rec_t *assoc = NULL;
-	char *object;
-	char *tmp_char = NULL;
 
 	print_field_t *field = NULL;
 	int field_count = 0;
@@ -1142,38 +1140,6 @@ extern int sacctmgr_list_user(int argc, char *argv[])
 	List format_list = list_create(slurm_destroy_char);
 	List print_fields_list; /* types are of print_field_t */
 
-	enum {
-		PRINT_ACCOUNT,
-		PRINT_ADMIN,
-		PRINT_CLUSTER,
-		PRINT_COORDS,
-		PRINT_DQOS,
-		PRINT_DACCT,
-		PRINT_DWCKEY,
-		PRINT_FAIRSHARE,
-		PRINT_GRPCM,
-		PRINT_GRPCRM,
-		PRINT_GRPC,
-		PRINT_GRPJ,
-		PRINT_GRPN,
-		PRINT_GRPS,
-		PRINT_GRPW,
-		PRINT_ID,
-		PRINT_MAXC,
-		PRINT_MAXCM,
-		PRINT_MAXCRM,
-		PRINT_MAXJ,
-		PRINT_MAXN,
-		PRINT_MAXS,
-		PRINT_MAXW,
-		PRINT_QOS,
-		PRINT_QOS_RAW,
-		PRINT_PID,
-		PRINT_PNAME,
-		PRINT_PART,
-		PRINT_USER
-	};
-
 	user_cond->with_assocs = with_assoc_flag;
 
 	for (i=0; i<argc; i++) {
@@ -1199,7 +1165,7 @@ extern int sacctmgr_list_user(int argc, char *argv[])
 			slurm_addto_char_list(format_list, "U,DefaultA,Ad");
 		if(user_cond->with_assocs)
 			slurm_addto_char_list(format_list,
-					      "Cl,Ac,Part,Shares,"
+					      "Cl,Ac,Part,Share,"
 					      "MaxJ,MaxN,MaxCPUs,MaxS,MaxW,"
 					      "MaxCPUMins,QOS,DefaultQOS");
 		if(user_cond->with_coords)
@@ -1217,208 +1183,7 @@ extern int sacctmgr_list_user(int argc, char *argv[])
 		}
 	}
 
-	print_fields_list = list_create(destroy_print_field);
-
-	itr = list_iterator_create(format_list);
-	while((object = list_next(itr))) {
-		int command_len = 0;
-		int newlen = 0;
-
-		if((tmp_char = strstr(object, "\%"))) {
-			newlen = atoi(tmp_char+1);
-			tmp_char[0] = '\0';
-		}
-
-		command_len = strlen(object);
-
-		field = xmalloc(sizeof(print_field_t));
-		if(!strncasecmp("Account", object, MAX(command_len, 2))
-		   || !strncasecmp("Acct", object, MAX(command_len, 4))) {
-			field->type = PRINT_ACCOUNT;
-			field->name = xstrdup("Account");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("AdminLevel", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_ADMIN;
-			field->name = xstrdup("Admin");
-			field->len = 9;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Cluster", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_CLUSTER;
-			field->name = xstrdup("Cluster");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Coordinators", object,
-				       MAX(command_len, 2))) {
-			field->type = PRINT_COORDS;
-			field->name = xstrdup("Coord Accounts");
-			field->len = 20;
-			field->print_routine = sacctmgr_print_coord_list;
-		} else if(!strncasecmp("DefaultAccount", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_DACCT;
-			field->name = xstrdup("Def Acct");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("DefaultWCKey", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_DWCKEY;
-			field->name = xstrdup("Def WCKey");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("DefaultQOS", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_DQOS;
-			field->name = xstrdup("Def QOS");
-			field->len = 9;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("FairShare", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_FAIRSHARE;
-			field->name = xstrdup("FairShare");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpCPUMins", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_GRPCM;
-			field->name = xstrdup("GrpCPUMins");
-			field->len = 11;
-			field->print_routine = print_fields_uint64;
-		} else if(!strncasecmp("GrpCPURunMins", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_GRPCRM;
-			field->name = xstrdup("GrpCPURunMins");
-			field->len = 13;
-			field->print_routine = print_fields_uint64;
-		} else if(!strncasecmp("GrpCPUs", object,
-				       MAX(command_len, 8))) {
-			field->type = PRINT_GRPC;
-			field->name = xstrdup("GrpCPUs");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPJ;
-			field->name = xstrdup("GrpJobs");
-			field->len = 7;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpNodes", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPN;
-			field->name = xstrdup("GrpNodes");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpSubmitJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPS;
-			field->name = xstrdup("GrpSubmit");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("GrpWall", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_GRPW;
-			field->name = xstrdup("GrpWall");
-			field->len = 11;
-			field->print_routine = print_fields_time;
-		} else if(!strncasecmp("ID", object, MAX(command_len, 1))) {
-			field->type = PRINT_ID;
-			field->name = xstrdup("ID");
-			field->len = 6;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxCPUMinsPerJob", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_MAXCM;
-			field->name = xstrdup("MaxCPUMins");
-			field->len = 11;
-			field->print_routine = print_fields_uint64;
-		} else if(!strncasecmp("MaxCPURunMins", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_MAXCRM;
-			field->name = xstrdup("MaxCPURunMins");
-			field->len = 11;
-			field->print_routine = print_fields_uint64;
-		} else if(!strncasecmp("MaxCPUsPerJob", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_MAXC;
-			field->name = xstrdup("MaxCPUs");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXJ;
-			field->name = xstrdup("MaxJobs");
-			field->len = 7;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxNodesPerJob", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXN;
-			field->name = xstrdup("MaxNodes");
-			field->len = 8;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxSubmitJobs", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXS;
-			field->name = xstrdup("MaxSubmit");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("MaxWallDurationPerJob", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_MAXW;
-			field->name = xstrdup("MaxWall");
-			field->len = 11;
-			field->print_routine = print_fields_time;
-		} else if(!strncasecmp("QOSRAWLevel", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_QOS_RAW;
-			field->name = xstrdup("QOS_RAW");
-			field->len = 10;
-			field->print_routine = print_fields_char_list;
-		} else if(!strncasecmp("QOSLevel", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_QOS;
-			field->name = xstrdup("QOS");
-			field->len = 20;
-			field->print_routine = sacctmgr_print_qos_list;
-		} else if(!strncasecmp("ParentID", object,
-				       MAX(command_len, 7))) {
-			field->type = PRINT_PID;
-			field->name = xstrdup("Par ID");
-			field->len = 6;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("Partition", object,
-				       MAX(command_len, 4))) {
-			field->type = PRINT_PART;
-			field->name = xstrdup("Partition");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else if(!strncasecmp("Shares", object,
-				       MAX(command_len, 1))) {
-			field->type = PRINT_FAIRSHARE;
-			field->name = xstrdup("Shares");
-			field->len = 9;
-			field->print_routine = print_fields_uint;
-		} else if(!strncasecmp("User", object, MAX(command_len, 1))
-			  || !strncasecmp("Name", object,
-					  MAX(command_len, 2))) {
-			field->type = PRINT_USER;
-			field->name = xstrdup("User");
-			field->len = 10;
-			field->print_routine = print_fields_str;
-		} else {
-			exit_code=1;
-			fprintf(stderr, "Unknown field '%s'\n", object);
-			xfree(field);
-			continue;
-		}
-
-		if(newlen)
-			field->len = newlen;
-
-		list_append(print_fields_list, field);
-	}
-	list_iterator_destroy(itr);
+	print_fields_list = sacctmgr_process_format_list(format_list);
 	list_destroy(format_list);
 
 	if(exit_code) {
@@ -1452,13 +1217,6 @@ extern int sacctmgr_list_user(int argc, char *argv[])
 				int curr_inx = 1;
 				while((field = list_next(itr2))) {
 					switch(field->type) {
-					case PRINT_ACCOUNT:
-						field->print_routine(
-							field,
-							assoc->acct,
-							(curr_inx ==
-							 field_count));
-						break;
 					case PRINT_ADMIN:
 						field->print_routine(
 							field,
@@ -1468,13 +1226,6 @@ extern int sacctmgr_list_user(int argc, char *argv[])
 							(curr_inx ==
 							 field_count));
 						break;
-					case PRINT_CLUSTER:
-						field->print_routine(
-							field,
-							assoc->cluster,
-							(curr_inx ==
-							 field_count));
-						break;
 					case PRINT_COORDS:
 						field->print_routine(
 							field,
@@ -1500,191 +1251,9 @@ extern int sacctmgr_list_user(int argc, char *argv[])
 							(curr_inx ==
 							 field_count));
 						break;
-					case PRINT_DQOS:
-						if(!g_qos_list)
-							g_qos_list =
-								acct_storage_g_get_qos(
-									db_conn,
-									my_uid,
-									NULL);
-						tmp_char = slurmdb_qos_str(
-							g_qos_list,
-							assoc->def_qos_id);
-						field->print_routine(
-							field,
-							tmp_char,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_FAIRSHARE:
-						field->print_routine(
-							field,
-							assoc->shares_raw,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_GRPCM:
-						field->print_routine(
-							field,
-							assoc->grp_cpu_mins,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_GRPCRM:
-						field->print_routine(
-							field,
-							assoc->grp_cpu_run_mins,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_GRPC:
-						field->print_routine(
-							field,
-							assoc->grp_cpus,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_GRPJ:
-						field->print_routine(
-							field,
-							assoc->grp_jobs,
-							(curr_inx
-							 == field_count));
-						break;
-					case PRINT_GRPN:
-						field->print_routine(
-							field,
-							assoc->grp_nodes,
-							(curr_inx
-							 == field_count));
-						break;
-					case PRINT_GRPS:
-						field->print_routine(
-							field,
-							assoc->grp_submit_jobs,
-							(curr_inx
-							 == field_count));
-						break;
-					case PRINT_GRPW:
-						field->print_routine(
-							field,
-							assoc->grp_wall,
-							(curr_inx
-							 == field_count));
-						break;
-					case PRINT_ID:
-						field->print_routine(
-							field,
-							assoc->id,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_MAXCM:
-						field->print_routine(
-							field,
-							assoc->
-							max_cpu_mins_pj,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_MAXCRM:
-						field->print_routine(
-							field,
-							assoc->
-							max_cpu_run_mins,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_MAXC:
-						field->print_routine(
-							field,
-							assoc->max_cpus_pj,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_MAXJ:
-						field->print_routine(
-							field,
-							assoc->max_jobs,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_MAXN:
-						field->print_routine(
-							field,
-							assoc->
-							max_nodes_pj,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_MAXS:
-						field->print_routine(
-							field,
-							assoc->max_submit_jobs,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_MAXW:
-						field->print_routine(
-							field,
-							assoc->
-							max_wall_pj,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_QOS:
-						if(!g_qos_list) {
-							g_qos_list =
-								acct_storage_g_get_qos(
-									db_conn,
-									my_uid,
-									NULL);
-						}
-						field->print_routine(
-							field,
-							g_qos_list,
-							assoc->qos_list,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_QOS_RAW:
-						field->print_routine(
-							field,
-							NULL,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_PID:
-						field->print_routine(
-							field,
-							assoc->parent_id,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_PNAME:
-						field->print_routine(
-							field,
-							assoc->parent_acct,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_PART:
-						field->print_routine(
-							field,
-							assoc->partition,
-							(curr_inx ==
-							 field_count));
-						break;
-					case PRINT_USER:
-						field->print_routine(
-							field,
-							user->name,
-							(curr_inx ==
-							 field_count));
-						break;
 					default:
-						field->print_routine(
-							field, NULL,
+						sacctmgr_print_association_rec(
+							assoc, field, NULL,
 							(curr_inx ==
 							 field_count));
 						break;
@@ -1699,33 +1268,6 @@ extern int sacctmgr_list_user(int argc, char *argv[])
 			int curr_inx = 1;
 			while((field = list_next(itr2))) {
 				switch(field->type) {
-					/* All the association stuff */
-				case PRINT_ACCOUNT:
-				case PRINT_CLUSTER:
-				case PRINT_DQOS:
-				case PRINT_FAIRSHARE:
-				case PRINT_GRPCM:
-				case PRINT_GRPC:
-				case PRINT_GRPJ:
-				case PRINT_GRPN:
-				case PRINT_GRPS:
-				case PRINT_GRPW:
-				case PRINT_ID:
-				case PRINT_MAXCM:
-				case PRINT_MAXC:
-				case PRINT_MAXJ:
-				case PRINT_MAXN:
-				case PRINT_MAXS:
-				case PRINT_MAXW:
-				case PRINT_QOS_RAW:
-				case PRINT_PID:
-				case PRINT_PNAME:
-				case PRINT_PART:
-					field->print_routine(
-						field,
-						NULL,
-						(curr_inx == field_count));
-					break;
 				case PRINT_QOS:
 					field->print_routine(
 						field, NULL,