diff --git a/src/database/mysql_common.c b/src/database/mysql_common.c
index eb3c1dd17a1bc0a0d13b31c8f24b6f635619ea5a..3e3fd13a9b796f6d44b752880029542df9520669 100644
--- a/src/database/mysql_common.c
+++ b/src/database/mysql_common.c
@@ -163,8 +163,8 @@ extern int mysql_get_db_connection(MYSQL **mysql_db, char *db_name,
 	else {
 #ifdef MYSQL_OPT_RECONNECT
 {
-		my_bool reconnect = 0;
-		/* make sure reconnect is off */
+		my_bool reconnect = 1;
+		/* make sure reconnect is on */
 		mysql_options(*mysql_db, MYSQL_OPT_RECONNECT, &reconnect);
 }
 #endif
@@ -208,8 +208,13 @@ extern int mysql_db_query(MYSQL *mysql_db, char *query)
 	slurm_mutex_lock(&mysql_lock);
 
 	/* clear out the old results so we don't get a 2014 error */
-	_clear_results(mysql_db);			
+	_clear_results(mysql_db);		
+//try_again:
 	if(mysql_query(mysql_db, query)) {
+		/* if(mysql_errno(mysql_db) == CR_SERVER_GONE_ERROR) { */
+/* 			/\* FIX ME: this means the connection went away *\/ */
+/* 		} */
+
 		error("mysql_query failed: %d %s\n%s",
 		      mysql_errno(mysql_db),
 		      mysql_error(mysql_db), query);
@@ -222,6 +227,49 @@ extern int mysql_db_query(MYSQL *mysql_db, char *query)
 	return SLURM_SUCCESS;
 }
 
+extern int mysql_db_commit(MYSQL *mysql_db)
+{
+	slurm_mutex_lock(&mysql_lock);
+
+	/* clear out the old results so we don't get a 2014 error */
+	_clear_results(mysql_db);		
+	if(mysql_commit(mysql_db)) {
+		error("mysql_commit failed: %d %s",
+		      mysql_errno(mysql_db),
+		      mysql_error(mysql_db));
+		errno = mysql_errno(mysql_db);
+		mysql_autocommit(mysql_db, 1);
+		slurm_mutex_unlock(&mysql_lock);
+		return SLURM_ERROR;
+	}
+	mysql_autocommit(mysql_db, 1);
+	slurm_mutex_unlock(&mysql_lock);
+
+	return SLURM_SUCCESS;
+}
+
+extern int mysql_db_rollback(MYSQL *mysql_db)
+{
+	slurm_mutex_lock(&mysql_lock);
+
+	/* clear out the old results so we don't get a 2014 error */
+	_clear_results(mysql_db);		
+	if(mysql_rollback(mysql_db)) {
+		error("mysql_commit failed: %d %s",
+		      mysql_errno(mysql_db),
+		      mysql_error(mysql_db));
+		errno = mysql_errno(mysql_db);
+		mysql_autocommit(mysql_db, 1);
+		slurm_mutex_unlock(&mysql_lock);
+		return SLURM_ERROR;
+	}
+	mysql_autocommit(mysql_db, 1);
+	slurm_mutex_unlock(&mysql_lock);
+
+	return SLURM_SUCCESS;
+
+}
+
 extern MYSQL_RES *mysql_db_query_ret(MYSQL *mysql_db, char *query)
 {
 	MYSQL_RES *result = NULL;
diff --git a/src/database/mysql_common.h b/src/database/mysql_common.h
index 9e011e56031743327d434cfbc3a9070026c3410f..2b5a6b777ef6d4fe1849bf14df5e60031f58e172 100644
--- a/src/database/mysql_common.h
+++ b/src/database/mysql_common.h
@@ -83,6 +83,8 @@ extern int mysql_get_db_connection(MYSQL **mysql_db, char *db_name,
 				   mysql_db_info_t *db_info);
 extern int mysql_close_db_connection(MYSQL **mysql_db);
 extern int mysql_db_query(MYSQL *mysql_db, char *query);
+extern int mysql_db_commit(MYSQL *mysql_db);
+extern int mysql_db_rollback(MYSQL *mysql_db);
 
 extern MYSQL_RES *mysql_db_query_ret(MYSQL *mysql_db, char *query);
 
diff --git a/src/database/pgsql_common.c b/src/database/pgsql_common.c
index 769bafafc029e06791818567d5333f856b09e7e4..31af50e1caf1d72b48adf8c7027f76bb8d1f957f 100644
--- a/src/database/pgsql_common.c
+++ b/src/database/pgsql_common.c
@@ -45,8 +45,6 @@ pthread_mutex_t pgsql_lock = PTHREAD_MUTEX_INITIALIZER;
 
 #ifdef HAVE_PGSQL
 
-static int rollback_started = 0;
-
 extern int *destroy_pgsql_db_info(pgsql_db_info_t *db_info)
 {
 	if(db_info) {
@@ -94,7 +92,7 @@ extern int pgsql_create_db(PGconn *pgsql_db, char *db_name,
 }
 
 extern int pgsql_get_db_connection(PGconn **pgsql_db, char *db_name,
-				   pgsql_db_info_t *db_info, bool rollback)
+				   pgsql_db_info_t *db_info)
 {
 	int rc = SLURM_SUCCESS;
 	bool storage_init = false;
@@ -126,26 +124,20 @@ extern int pgsql_get_db_connection(PGconn **pgsql_db, char *db_name,
 			pgsql_create_db(*pgsql_db, db_name, db_info);		
 		} else {
 			storage_init = true;
-			debug2("connected to %s", db_name);
-			if(rollback || rollback_started) {
-				rollback_started = 1;
-				PQexec(*pgsql_db, "BEGIN WORK");
-			}
+			/* debug2("connected to %s", db_name); */
+/* 			if(rollback || rollback_started) { */
+/* 				rollback_started = 1; */
+/* 				PQexec(*pgsql_db, "BEGIN WORK"); */
+/* 			} */
 		} 
 	}
 	xfree(connect_line);
 	return rc;
 }
 
-extern int pgsql_close_db_connection(PGconn **pgsql_db, bool commit)
+extern int pgsql_close_db_connection(PGconn **pgsql_db)
 {
-	if(*pgsql_db) {
-		if(rollback_started) {
-			if(commit) 
-				PQexec(*pgsql_db, "COMMIT WORK");
-			else 
-				PQexec(*pgsql_db, "ROLLBACK WORK");
-		}
+	if(pgsql_db && *pgsql_db) {
 		PQfinish(*pgsql_db);
 		*pgsql_db = NULL;
 	}	      
@@ -166,6 +158,17 @@ extern int pgsql_db_query(PGconn *pgsql_db, char *query)
 	return SLURM_SUCCESS;
 }
 
+extern int pgsql_db_commit(PGconn *pgsql_db)
+{
+	return pgsql_db_query(pgsql_db, "COMMIT WORK");	
+}
+
+extern int pgsql_db_rollback(PGconn *pgsql_db)
+{
+	return pgsql_db_query(pgsql_db, "ROLLBACK WORK");
+
+}
+
 extern PGresult *pgsql_db_query_ret(PGconn *pgsql_db, char *query)
 {
 	PGresult *result = NULL;
diff --git a/src/database/pgsql_common.h b/src/database/pgsql_common.h
index decf234a2c99380e87d55bc7521ceaa96f0866f0..b53fbd2fdb4f49f505491e36ad30d338f7216689 100644
--- a/src/database/pgsql_common.h
+++ b/src/database/pgsql_common.h
@@ -79,11 +79,13 @@ extern int pgsql_create_db(PGconn *pgsql_db, char *db_name,
 			   pgsql_db_info_t *db_info);
 
 extern int pgsql_get_db_connection(PGconn **pgsql_db, char *db_name,
-				   pgsql_db_info_t *db_info, bool rollback);
+				   pgsql_db_info_t *db_info);
 
-extern int pgsql_close_db_connection(PGconn **pgsql_db, bool commit);
+extern int pgsql_close_db_connection(PGconn **pgsql_db);
 
 extern int pgsql_db_query(PGconn *pgsql_db, char *query);
+extern int pgsql_db_commit(PGconn *pgsql_db);
+extern int pgsql_db_rollback(PGconn *pgsql_db);
 
 extern PGresult *pgsql_db_query_ret(PGconn *pgsql_db, char *query);
 
diff --git a/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c b/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c
index 3549a7206775fc9f893d0d7dcccb739dd32f2001..cc97087135705c37b3cc59cb01d1f378f0d2b603 100644
--- a/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c
+++ b/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c
@@ -159,7 +159,7 @@ static int _addto_update_list(List update_list, acct_update_type_t type,
 	return SLURM_SUCCESS;
 }
 
-static int _get_affected_rows(MYSQL *mysql_db)
+static int _last_affected_rows(MYSQL *mysql_db)
 {
 	int status=0, rows=0;
 	MYSQL_RES *result = NULL;
@@ -172,7 +172,7 @@ static int _get_affected_rows(MYSQL *mysql_db)
 			if (mysql_field_count(mysql_db) == 0) {
 				status = mysql_affected_rows(mysql_db);
 				if(status > 0)
-					rows+=status;
+					rows = status;
 			}
 		if ((status = mysql_next_result(mysql_db)) > 0)
 			debug3("Could not execute statement\n");
@@ -209,8 +209,7 @@ static int _modify_common(mysql_conn_t *mysql_conn,
 
 	if(rc != SLURM_SUCCESS) {
 		if(mysql_conn->rollback) {
-			mysql_db_query(mysql_conn->acct_mysql_db, "ROLLBACK;");
-			mysql_autocommit(mysql_conn->acct_mysql_db, 1);
+			mysql_db_rollback(mysql_conn->acct_mysql_db);
 		}
 		list_destroy(mysql_conn->update_list);
 		mysql_conn->update_list =
@@ -236,110 +235,116 @@ static int _remove_common(mysql_conn_t *mysql_conn,
 	char *query = NULL;
 	MYSQL_RES *result = NULL;
 	MYSQL_ROW row;
-	int txn_id = 0;
-
-	query = xstrdup_printf("LOCK TABLE %s WRITE;"
-			       "update %s set mod_time=%d, deleted=1 "
-			       "where deleted=0 && (%s);"
-			       "UNLOCK TABLES;", 
-			       table, table, now, name_char);
-
-	rc = mysql_db_query(mysql_conn->acct_mysql_db, query);
-	xfree(query);
-	if(rc != SLURM_SUCCESS) {
-		error("Couldn't remove");
-		return SLURM_ERROR;
-	}
-	if(mysql_conn->rollback) {
-		char *roll = mysql_conn->query;
-		mysql_conn->query = xstrdup_printf(
-			"LOCK TABLE %s WRITE;"
-			"update %s set deleted=0 where deleted=1 && (%s);"
-			"UNLOCK TABLES;",
-			table, table, name_char);
-		if(roll) {
-			xstrfmtcat(mysql_conn->query, "%s", roll);
-			xfree(roll);
-		} 
-	}
 
+	query = xstrdup_printf("update %s set mod_time=%d, deleted=1 "
+			       "where deleted=0 && (%s);",
+			       table, now, name_char);
 	xstrfmtcat(query, 	
-		   "LOCK TABLE %s WRITE;"
-		   "insert into %s "
-		   "(timestamp, action, name, actor) "
+		   "insert into %s (timestamp, action, name, actor) "
 		   "values (%d, %d, \"%s\", '%s');",
 		   txn_table,
-		   txn_table,
 		   now, type, name_char, user_name);
-//	info("query\n%s", query);
+
+	debug3("query\n%s", query);
 	rc = mysql_db_query(mysql_conn->acct_mysql_db, query);
 	xfree(query);
 	if(rc != SLURM_SUCCESS) {
-		error("Couldn't add tnx");
-	}
-	xstrfmtcat(query,
-		   "select last_insert_id();"
-		   "UNLOCK TABLES;");
-	if(!(result = mysql_db_query_ret(mysql_conn->acct_mysql_db,
-					 query))) {
-		xfree(query);
-		error("can't get last id");
+		if(mysql_conn->rollback) {
+			mysql_db_rollback(mysql_conn->acct_mysql_db);
+		}
+		list_destroy(mysql_conn->update_list);
+		mysql_conn->update_list =
+			list_create(destroy_acct_update_object);
+		
 		return SLURM_ERROR;
 	}
-	xfree(query);
-	row = mysql_fetch_row(result);
-	if(!row) {
-		error("nothing returned");
-		return SLURM_ERROR;
-	} 
-	txn_id = atoi(row[0]);			
-	mysql_free_result(result);
-	//info("added transaction %d", txn_id);
 
-	if(mysql_conn->rollback) {
-		char *roll = mysql_conn->query;
-		mysql_conn->query = xstrdup_printf(
-			"LOCK TABLE %s WRITE;"
-			"delete from %s where id=%d;"
-			"UNLOCK TABLES;",
-			txn_table, txn_table, txn_id);
-		if(roll) {
-			xstrfmtcat(mysql_conn->query, "%s", roll);
-			xfree(roll);
-		} 
-	}
-
-	/* Stop here if we are doing associations */
 	if(table == assoc_table || !assoc_char)
 		return SLURM_SUCCESS;
-	
-	query = xstrdup_printf("LOCK TABLE %s WRITE;"
-			       "update %s set mod_time=%d, deleted=1 "
-			       "where deleted=0 && (%s);"
-			       "UNLOCK TABLES;",
-			       assoc_table, assoc_table, now, assoc_char);
-	rc = mysql_db_query(mysql_conn->acct_mysql_db, query);
-	xfree(query);
-	if(rc != SLURM_SUCCESS) {
-		error("Couldn't remove user associations");
+
+	query = xstrdup_printf("SELECT lft, rgt FROM %s WHERE %s;",
+				     assoc_table, assoc_char);
+
+	debug3("query\n%s", query);
+	if(!(result = mysql_db_query_ret(mysql_conn->acct_mysql_db, query))) {
+		if(mysql_conn->rollback) {
+			mysql_db_rollback(mysql_conn->acct_mysql_db);
+		}
+		list_destroy(mysql_conn->update_list);
+		mysql_conn->update_list =
+			list_create(destroy_acct_update_object);
 		return SLURM_ERROR;
 	}
-	
-	if(mysql_conn->rollback) {
-		char *roll = mysql_conn->query;
-		mysql_conn->query = xstrdup_printf(
-			"LOCK TABLE %s WRITE;"
-			"update %s set deleted=0 where deleted=1 && (%s);"
-			"UNLOCK TABLES;",
-			assoc_table, assoc_table, assoc_char);
-		if(roll) {
-			xstrfmtcat(mysql_conn->query, "%s", roll);
-			xfree(roll);
-		} 
+	xfree(query);
+
+	while((row = mysql_fetch_row(result))) {
+		query = xstrdup_printf(
+			"update %s set mod_time=%d, deleted=1 "
+			"where deleted=0 && lft>=%s && rgt<=%s;",
+			assoc_table, now,
+			row[0], row[1]);
+		debug3("query\n%s", query);
+		rc = mysql_db_query(mysql_conn->acct_mysql_db, query);
+		xfree(query);
+		if(rc != SLURM_SUCCESS) {
+			if(mysql_conn->rollback) {
+				mysql_db_rollback(mysql_conn->acct_mysql_db);
+			}
+			list_destroy(mysql_conn->update_list);
+			mysql_conn->update_list =
+				list_create(destroy_acct_update_object);
+			break;
+		}
 	}
-	return SLURM_SUCCESS;
+	mysql_free_result(result);
+
+	return rc;
 }
 
+/* static int _remove_assoc_common(mysql_conn_t *mysql_conn, */
+/* 				uint16_t type, */
+/* 				time_t now, */
+/* 				char *user_name, */
+/* 				char *assoc_char)  */
+/* { */
+/* 	MYSQL_RES *result = NULL; */
+/* 	MYSQL_ROW row; */
+/* 	int lft = 0, rgt = 0; */
+/* 	char *query = xstrdup_printf("SELECT lft, rgt FROM %s WHERE %s;", */
+/* 				     assoc_table, assoc_char); */
+/* 	int rc = SLURM_SUCCESS; */
+
+/* 	debug3("query\n%s", query); */
+/* 	if(!(result = mysql_db_query_ret(mysql_conn->acct_mysql_db, query))) { */
+/* 		xfree(query); */
+/* 		return rc; */
+/* 	} */
+/* 	xfree(query); */
+
+/* 	while((row = mysql_fetch_row(result))) { */
+/* 		query = xstrdup_printf( */
+/* 			"update %s set mod_time=%d, deleted=1 " */
+/* 			"where deleted=0 && lft>=%s && rgt<=%s;", */
+/* 			assoc_table, now, */
+/* 			row[0], row[1]); */
+/* 		debug3("query\n%s", query); */
+/* 		rc = mysql_db_query(mysql_conn->acct_mysql_db, query); */
+/* 		xfree(query); */
+/* 		if(rc != SLURM_SUCCESS) { */
+/* 			if(mysql_conn->rollback) { */
+/* 				mysql_db_rollback(mysql_conn->acct_mysql_db); */
+/* 			} */
+/* 			list_destroy(mysql_conn->update_list); */
+/* 			mysql_conn->update_list = */
+/* 				list_create(destroy_acct_update_object); */
+/* 			break; */
+/* 		} */
+/* 	} */
+/* 	mysql_free_result(result); */
+
+/* 	return rc; */
+
+/* } */
 static int _get_db_index(MYSQL *acct_mysql_db, 
 			 time_t submit, uint32_t jobid, uint32_t associd)
 {
@@ -945,7 +950,7 @@ extern int acct_storage_p_add_users(mysql_conn_t *mysql_conn, uint32_t uid,
 			continue;
 		}
 
-		affect_rows = _get_affected_rows(mysql_conn->acct_mysql_db);
+		affect_rows = _last_affected_rows(mysql_conn->acct_mysql_db);
 		if(!affect_rows) {
 			debug("nothing changed");
 			xfree(extra);
@@ -1106,6 +1111,7 @@ extern int acct_storage_p_add_accts(mysql_conn_t *mysql_conn, uint32_t uid,
 			"UNLOCK TABLES;",
 			acct_table, acct_table, cols, vals,
 			now, extra);
+		debug3("query\n%s", query);
 		rc = mysql_db_query(mysql_conn->acct_mysql_db, query);
 		xfree(cols);
 		xfree(vals);
@@ -1115,7 +1121,9 @@ extern int acct_storage_p_add_accts(mysql_conn_t *mysql_conn, uint32_t uid,
 			xfree(extra);
 			continue;
 		}
-		affect_rows = _get_affected_rows(mysql_conn->acct_mysql_db);
+		affect_rows = _last_affected_rows(mysql_conn->acct_mysql_db);
+		debug3("affected %d", affect_rows);
+
 		if(!affect_rows) {
 			debug3("nothing changed");
 			xfree(extra);
@@ -1141,6 +1149,7 @@ extern int acct_storage_p_add_accts(mysql_conn_t *mysql_conn, uint32_t uid,
 				xstrfmtcat(mysql_conn->query, "%s", roll);
 				xfree(roll);
 			} 
+			info("we got %d \n%s", affect_rows, mysql_conn->query);
 		}
 
 		xstrfmtcat(query, 	
@@ -1305,7 +1314,7 @@ extern int acct_storage_p_add_clusters(mysql_conn_t *mysql_conn, uint32_t uid,
 			continue;
 		}
 
-		affect_rows = _get_affected_rows(mysql_conn->acct_mysql_db);
+		affect_rows = _last_affected_rows(mysql_conn->acct_mysql_db);
 
 		if(!affect_rows) {
 			debug2("nothing changed %d", affect_rows);
@@ -1396,8 +1405,7 @@ extern int acct_storage_p_add_clusters(mysql_conn_t *mysql_conn, uint32_t uid,
 			   "insert into %s (%s, lft, rgt) "
 			   "values (%s, @MyMax+1, @MyMax+2) "
 			   "on duplicate key update deleted=0, "
-			   "lft=@MyMax+1, rgt=@MyMax+2 %s;"
-			   "UNLOCK TABLES;",
+			   "lft=@MyMax+1, rgt=@MyMax+2 %s;",
 			   assoc_table, cols,
 			   vals,
 			   extra);
@@ -1415,22 +1423,10 @@ extern int acct_storage_p_add_clusters(mysql_conn_t *mysql_conn, uint32_t uid,
 			xfree(extra);
 			continue;
 		}
-		affect_rows = _get_affected_rows(mysql_conn->acct_mysql_db);
+		affect_rows = _last_affected_rows(mysql_conn->acct_mysql_db);
 //		info("got %d rows", affect_rows);
-		if(!(result = mysql_db_query_ret(mysql_conn->acct_mysql_db,
-						 "select last_insert_id();"))) {
-			xfree(extra);
-			error("can't get last id");
-			continue;
-		}
-		row = mysql_fetch_row(result);
-		if(!row) {
-			error("nothing returned");
-			xfree(extra);
-			continue;
-		}
-		assoc_id = atoi(row[0]);			
-		mysql_free_result(result);
+		assoc_id = mysql_insert_id(mysql_conn->acct_mysql_db);
+		mysql_db_query(mysql_conn->acct_mysql_db, "UNLOCK TABLES;"); 
 
 		if(mysql_conn->rollback) {
 			char *roll = mysql_conn->query;
@@ -1492,8 +1488,6 @@ extern int acct_storage_p_add_associations(mysql_conn_t *mysql_conn,
 	int assoc_id = 0;
 	int txn_id = 0;
 	int affect_rows = 0;
-	MYSQL_RES *result = NULL;
-	MYSQL_ROW row;
 
 	if((pw=getpwuid(uid))) {
 		user = pw->pw_name;
@@ -1601,7 +1595,7 @@ extern int acct_storage_p_add_associations(mysql_conn_t *mysql_conn,
 			   extra);
 		xfree(cols);
 		xfree(vals);
-		
+		debug3("query\n%s", query);
 		rc = mysql_db_query(mysql_conn->acct_mysql_db, query);
 		xfree(query);
 		if(rc != SLURM_SUCCESS) {
@@ -1609,26 +1603,10 @@ extern int acct_storage_p_add_associations(mysql_conn_t *mysql_conn,
 			xfree(extra);
 			continue;
 		}
-		affect_rows = _get_affected_rows(mysql_conn->acct_mysql_db);
-		xstrfmtcat(query,
-			   "select last_insert_id();"
-			   "UNLOCK TABLES;");
-		if(!(result = mysql_db_query_ret(mysql_conn->acct_mysql_db,
-						 query))) {
-			xfree(query);
-			xfree(extra);
-			error("can't get last id");
-			continue;
-		}
-		xfree(query);
-		row = mysql_fetch_row(result);
-		if(!row) {
-			error("nothing returned");
-			xfree(extra);
-			continue;
-		}
-		assoc_id = atoi(row[0]);
-		mysql_free_result(result);
+		affect_rows = _last_affected_rows(mysql_conn->acct_mysql_db);
+		assoc_id = mysql_insert_id(mysql_conn->acct_mysql_db);
+		//info("last id was %d", assoc_id);
+		mysql_db_query(mysql_conn->acct_mysql_db, "UNLOCK TABLES;"); 
 
 		object->id = assoc_id;
 
@@ -1692,24 +1670,16 @@ extern int acct_storage_p_add_associations(mysql_conn_t *mysql_conn,
 		if(rc != SLURM_SUCCESS) {
 			error("Couldn't add tnx");
 		}
-		xstrfmtcat(query,
-			   "select last_insert_id();"
-			   "UNLOCK TABLES;");
-		if(!(result = mysql_db_query_ret(mysql_conn->acct_mysql_db,
-						 query))) {
-			xfree(query);
-			error("can't get last id");
-			continue;
-		}
-		xfree(query);
-		row = mysql_fetch_row(result);
-		if(!row) {
-			error("nothing returned");
-		} else 
-			txn_id = atoi(row[0]);			
-		mysql_free_result(result);
 
-//		info("got %d %d %d", assoc_id, affect_rows, txn_id);
+		/* just clear all the results here to get the last
+		 * insert id */
+		_last_affected_rows(mysql_conn->acct_mysql_db);
+
+		txn_id = mysql_insert_id(mysql_conn->acct_mysql_db);
+		//info("last id was %d", assoc_id);
+		mysql_db_query(mysql_conn->acct_mysql_db, "UNLOCK TABLES;"); 
+		
+		//info("got %d %d %d", assoc_id, affect_rows, txn_id);
 	
 		if(mysql_conn->rollback) {
 			char *roll = mysql_conn->query;
@@ -2365,7 +2335,7 @@ extern List acct_storage_p_modify_associations(mysql_conn_t *mysql_conn,
 }
 
 extern List acct_storage_p_remove_users(mysql_conn_t *mysql_conn, uint32_t uid, 
-				       acct_user_cond_t *user_q)
+					acct_user_cond_t *user_q)
 {
 #ifdef HAVE_MYSQL
 	ListIterator itr = NULL;
@@ -2676,11 +2646,11 @@ extern List acct_storage_p_remove_clusters(mysql_conn_t *mysql_conn,
 		list_append(ret_list, object);
 		if(!rc) {
 			xstrfmtcat(name_char, "name='%s'", object);
-			xstrfmtcat(assoc_char, "cluster='%s'", object);
+			xstrfmtcat(extra, "cluster='%s'", object);
 			rc = 1;
 		} else  {
 			xstrfmtcat(name_char, " || name='%s'", object);
-			xstrfmtcat(assoc_char, " || cluster='%s'", object);
+			xstrfmtcat(extra, " || cluster='%s'", object);
 		}
 	}
 	mysql_free_result(result);
@@ -2690,6 +2660,9 @@ extern List acct_storage_p_remove_clusters(mysql_conn_t *mysql_conn,
 		list_destroy(ret_list);
 		return NULL;
 	}
+	
+	assoc_char = xstrdup_printf("acct='root' && (%s)", extra);
+	xfree(extra);
 
 	if(_remove_common(mysql_conn, DBD_REMOVE_CLUSTERS, now,
 			  user_name, cluster_table, name_char, assoc_char)
diff --git a/src/plugins/accounting_storage/pgsql/accounting_storage_pgsql.c b/src/plugins/accounting_storage/pgsql/accounting_storage_pgsql.c
index ef1108f69f2c8d9e08803e7b2c86c1c6ae55f1fa..0bcf7a95c713214e81a94e67bda875ec64e4903e 100644
--- a/src/plugins/accounting_storage/pgsql/accounting_storage_pgsql.c
+++ b/src/plugins/accounting_storage/pgsql/accounting_storage_pgsql.c
@@ -641,8 +641,7 @@ extern int init ( void )
 
 	debug2("pgsql_connect() called for db %s", pgsql_db_name);
 		
-	pgsql_get_db_connection(&acct_pgsql_db, pgsql_db_name, pgsql_db_info,
-				0);
+	pgsql_get_db_connection(&acct_pgsql_db, pgsql_db_name, pgsql_db_info);
 		
 	rc = _pgsql_acct_check_tables(acct_pgsql_db, pgsql_db_info->user);
 
@@ -678,8 +677,7 @@ extern void *acct_storage_p_get_connection(bool make_agent, bool rollback)
 	
 	debug2("acct_storage_p_get_connection: request new connection");
 	
-	pgsql_get_db_connection(&acct_pgsql_db, pgsql_db_name, pgsql_db_info,
-				rollback);
+	pgsql_get_db_connection(&acct_pgsql_db, pgsql_db_name, pgsql_db_info);
 	
 	return (void *)acct_pgsql_db;
 #else
@@ -690,7 +688,7 @@ extern void *acct_storage_p_get_connection(bool make_agent, bool rollback)
 extern int acct_storage_p_close_connection(PGconn **acct_pgsql_db)
 {
 #ifdef HAVE_PGSQL
-	pgsql_close_db_connection(acct_pgsql_db, 1);
+	pgsql_close_db_connection(acct_pgsql_db);
 	
 	return SLURM_SUCCESS;
 #else
@@ -1009,9 +1007,9 @@ extern int jobacct_storage_p_job_start(PGconn *acct_pgsql_db,
 	}
 
 	if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) {
-		if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) {
+		if(!pgsql_get_db_connection(&acct_pgsql_db,
+					    pgsql_db_name, pgsql_db_info))
 			return SLURM_ERROR;
-		}
 	}
 
 	debug2("pgsql_jobacct_job_start() called");
@@ -1067,8 +1065,9 @@ try_again:
 		if(!reinit) {
 			error("It looks like the storage has gone "
 			      "away trying to reconnect");
-			acct_storage_p_close_connection(&acct_pgsql_db);
-			acct_pgsql_db = acct_storage_p_get_connection(0);
+			pgsql_close_db_connection(&acct_pgsql_db);
+			pgsql_get_db_connection(&acct_pgsql_db,
+						pgsql_db_name, pgsql_db_info);
 			reinit = 1;
 			goto try_again;
 		} else
@@ -1100,9 +1099,9 @@ extern int jobacct_storage_p_job_complete(PGconn *acct_pgsql_db,
 	}
 
 	if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) {
-		if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) {
+		if(!pgsql_get_db_connection(&acct_pgsql_db,
+					    pgsql_db_name, pgsql_db_info))
 			return SLURM_ERROR;
-		}
 	}
 	
 	debug2("pgsql_jobacct_job_complete() called");
@@ -1165,9 +1164,9 @@ extern int jobacct_storage_p_step_start(PGconn *acct_pgsql_db,
 	}
 
 	if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) {
-		if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) {
+		if(!pgsql_get_db_connection(&acct_pgsql_db,
+					    pgsql_db_name, pgsql_db_info))
 			return SLURM_ERROR;
-		}
 	}
 
 	if(slurmdbd_conf) {
@@ -1259,9 +1258,9 @@ extern int jobacct_storage_p_step_complete(PGconn *acct_pgsql_db,
 	}
 
 	if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) {
-		if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) {
+		if(!pgsql_get_db_connection(&acct_pgsql_db,
+					    pgsql_db_name, pgsql_db_info))
 			return SLURM_ERROR;
-		}
 	}
 	
 	if (jobacct == NULL) {
@@ -1385,9 +1384,9 @@ extern int jobacct_storage_p_suspend(PGconn *acct_pgsql_db,
 	int rc = SLURM_SUCCESS;
 	
 	if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) {
-		if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) {
+		if(!pgsql_get_db_connection(&acct_pgsql_db,
+					    pgsql_db_name, pgsql_db_info))
 			return SLURM_ERROR;
-		}
 	}
 	
 	if(!job_ptr->db_index) {
@@ -1434,9 +1433,9 @@ extern List jobacct_storage_p_get_jobs(PGconn *acct_pgsql_db,
 	List job_list = NULL;
 #ifdef HAVE_PGSQL
 	if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) {
-		if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) {
+		if(!pgsql_get_db_connection(&acct_pgsql_db,
+					    pgsql_db_name, pgsql_db_info))
 			return job_list;
-		}
 	}
 
 	job_list = pgsql_jobacct_process_get_jobs(acct_pgsql_db,
@@ -1456,9 +1455,9 @@ extern void jobacct_storage_p_archive(PGconn *acct_pgsql_db,
 {
 #ifdef HAVE_PGSQL
 	if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) {
-		if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) {
+		if(!pgsql_get_db_connection(&acct_pgsql_db,
+					    pgsql_db_name, pgsql_db_info))
 			return;
-		}
 	}
 
 	pgsql_jobacct_process_archive(acct_pgsql_db, selected_parts, params);
diff --git a/src/plugins/jobcomp/pgsql/jobcomp_pgsql.c b/src/plugins/jobcomp/pgsql/jobcomp_pgsql.c
index 80030181b8d96676a853d62d85b1a1537fc32706..37c4e53e74ee1bb5bfe179434e78cb8ff228d519 100644
--- a/src/plugins/jobcomp/pgsql/jobcomp_pgsql.c
+++ b/src/plugins/jobcomp/pgsql/jobcomp_pgsql.c
@@ -307,7 +307,7 @@ extern int slurm_jobcomp_set_location(char *location)
 		
 	debug2("pgsql_connect() called for db %s", db_name);
 	
-	pgsql_get_db_connection(&jobcomp_pgsql_db, db_name, db_info, 0);
+	pgsql_get_db_connection(&jobcomp_pgsql_db, db_name, db_info);
 	
 	rc = _pgsql_jobcomp_check_tables(db_info->user);
 
diff --git a/src/sacctmgr/account_functions.c b/src/sacctmgr/account_functions.c
index 5bc07ff63306955e77f543544fa50d0e85fa90a7..177aa2cf541a20ebac027395654c55657a724543 100644
--- a/src/sacctmgr/account_functions.c
+++ b/src/sacctmgr/account_functions.c
@@ -37,56 +37,63 @@
 \*****************************************************************************/
 
 #include "sacctmgr.h"
+#include "print.h"
 
 static int _set_cond(int *start, int argc, char *argv[],
 		     acct_account_cond_t *acct_cond,
 		     acct_association_cond_t *assoc_cond)
 {
 	int i;
-	int set = 0;
+	int u_set = 0;
+	int a_set = 0;
+	int end = 0;
 
 	for (i=(*start); i<argc; i++) {
-		if (strncasecmp (argv[i], "Name=", 5) == 0) {
-			addto_char_list(acct_cond->acct_list, argv[i]+5);
-			set = 1;
-		} else if (strncasecmp (argv[i], "Names=", 6) == 0) {
-			addto_char_list(acct_cond->acct_list, argv[i]+6);
-			set = 1;
-		} else if (strncasecmp (argv[i], "Set", 3) == 0) {
+		end = parse_option_end(argv[i]);
+		if (strncasecmp (argv[i], "Set", 3) == 0) {
 			i--;
 			break;
-		} else if (strncasecmp (argv[i], "Descriptions=", 13) == 0) {
-			addto_char_list(acct_cond->description_list,
-					argv[i]+13);
-			set = 1;
-		} else if (strncasecmp (argv[i], "Organizations=", 14) == 0) {
-			addto_char_list(acct_cond->organization_list,
-					argv[i]+14);
-			set = 1;
-		} else if (strncasecmp (argv[i], "QosLevel=", 14) == 0) {
-			acct_cond->qos =
-				str_2_acct_qos(argv[i]+14);
-			set = 1;
-		} else if (strncasecmp (argv[i], "Description=", 12) == 0) {
+		} else if(!end) {
+			addto_char_list(acct_cond->acct_list, argv[i]);
+			addto_char_list(assoc_cond->acct_list, argv[i]);
+			u_set = 1;
+		} else if (strncasecmp (argv[i], "Clusters", 1) == 0) {
+			addto_char_list(assoc_cond->cluster_list, argv[i]+end);
+			a_set = 1;
+		} else if (strncasecmp (argv[i], "Descriptions", 1) == 0) {
 			addto_char_list(acct_cond->description_list,
-					argv[i]+12);
-			set = 1;
-		} else if (strncasecmp (argv[i], "Organization=", 13) == 0) {
+					argv[i]+end);
+			u_set = 1;
+		} else if (strncasecmp (argv[i], "Names", 1) == 0) {
+			addto_char_list(acct_cond->acct_list, argv[i]+end);
+			addto_char_list(assoc_cond->acct_list, argv[i]);
+			u_set = 1;
+		} else if (strncasecmp (argv[i], "Organizations", 1) == 0) {
 			addto_char_list(acct_cond->organization_list,
-					argv[i]+13);
-			set = 1;
-		} else if (strncasecmp (argv[i], "Qos=", 8) == 0) {
-			acct_cond->qos =
-				str_2_acct_qos(argv[i]+8);
-			set = 1;
+					argv[i]+end);
+			u_set = 1;
+		} else if (strncasecmp (argv[i], "Parent", 1) == 0) {
+			assoc_cond->parent_acct = xstrdup(argv[i]+end);
+			a_set = 1;
+		} else if (strncasecmp (argv[i], "QosLevel", 1) == 0) {
+			acct_cond->qos = str_2_acct_qos(argv[i]+end);
+			u_set = 1;
+		} else if (strncasecmp (argv[i], "ShowAssoc", 1) == 0) {
+			acct_cond->with_assocs = 1;
+			u_set = 1;
 		} else {
-			addto_char_list(acct_cond->acct_list, argv[i]);
-			set = 1;
+			printf(" Unknown condition: %s", argv[i]);
 		}
 	}
 	(*start) = i;
 
-	return set;
+	if(u_set && a_set)
+		return 3;
+	else if(u_set)
+		return 1;
+	else if(a_set)
+		return 2;
+	return 0;
 }
 
 static int _set_rec(int *start, int argc, char *argv[],
@@ -94,37 +101,59 @@ static int _set_rec(int *start, int argc, char *argv[],
 		    acct_association_rec_t *assoc)
 {
 	int i;
-	int set = 0;
+	int u_set = 0;
+	int a_set = 0;
+	int end = 0;
 
 	for (i=(*start); i<argc; i++) {
-		if (strncasecmp (argv[i], "Name=", 5) == 0) {
-			acct->name = xstrdup(argv[i]+5);
-			set = 1;
-		} else if (strncasecmp (argv[i], "Where", 5) == 0) {
+		end = parse_option_end(argv[i]);
+		if (strncasecmp (argv[i], "Where", 5) == 0) {
 			i--;
 			break;
-		}else if (strncasecmp (argv[i], "QosLevel=", 14) == 0) {
-			acct->qos =
-				str_2_acct_qos(argv[i]+14);
-			set = 1;
-		} else if (strncasecmp (argv[i], "Description=", 12) == 0) {
-			acct->description = xstrdup(argv[i]+12);
-			set = 1;
-		} else if (strncasecmp (argv[i], "Organization=", 13) == 0) {
-			acct->organization = xstrdup(argv[i]+13);
-			set = 1;
-		} else if (strncasecmp (argv[i], "Qos=", 8) == 0) {
-			acct->qos =
-				str_2_acct_qos(argv[i]+8);
-			set = 1;
+		} else if(!end) {
+			printf(" Bad format on %s: End your option with "
+			       "an '=' sign\n", argv[i]);
+		} else if (strncasecmp (argv[i], "Description", 1) == 0) {
+			acct->description = xstrdup(argv[i]+end);
+			u_set = 1;
+		} else if (strncasecmp (argv[i], "Fairshare", 1) == 0) {
+			assoc->fairshare = atoi(argv[i]+end);
+			a_set = 1;
+		} else if (strncasecmp (argv[i], "MaxCPUSec", 4) == 0) {
+			assoc->max_cpu_secs_per_job =
+				atoi(argv[i]+end);
+			a_set = 1;
+		} else if (strncasecmp (argv[i], "MaxJobs", 4) == 0) {
+			assoc->max_jobs = atoi(argv[i]+end);
+			a_set = 1;
+		} else if (strncasecmp (argv[i], "MaxNodes", 4) == 0) {
+			assoc->max_nodes_per_job = atoi(argv[i]+end);
+			a_set = 1;
+		} else if (strncasecmp (argv[i], "MaxWall", 4) == 0) {
+			assoc->max_wall_duration_per_job = atoi(argv[i]+end);
+			a_set = 1;
+		} else if (strncasecmp (argv[i], "Organization", 1) == 0) {
+			acct->organization = xstrdup(argv[i]+end);
+			u_set = 1;
+		} else if (strncasecmp (argv[i], "Parent", 1) == 0) {
+			assoc->parent_acct = xstrdup(argv[i]+end);
+			a_set = 1;
+		} else if (strncasecmp (argv[i], "QosLevel=", 1) == 0) {
+			acct->qos = str_2_acct_qos(argv[i]+end);
+			u_set = 1;
 		} else {
-			acct->name = xstrdup(argv[i]+5);
-			set = 1;
+			printf(" Unknown option: %s", argv[i]);
 		}
 	}
 	(*start) = i;
 
-	return set;
+	if(u_set && a_set)
+		return 3;
+	else if(u_set)
+		return 1;
+	else if(a_set)
+		return 2;
+	return 0;
 }
 
 static void _print_cond(acct_account_cond_t *acct_cond)
@@ -242,12 +271,13 @@ extern int sacctmgr_add_account(int argc, char *argv[])
 	acct_qos_level_t qos = ACCT_QOS_NOTSET;
 	List acct_list = NULL;
 	List assoc_list = NULL;
-	uint32_t fairshare = 1; 
-	uint32_t max_jobs = 0; 
-	uint32_t max_nodes_per_job = 0;
-	uint32_t max_wall_duration_per_job = 0;
-	uint32_t max_cpu_secs_per_job = 0;
+	uint32_t fairshare = -1; 
+	uint32_t max_jobs = -1; 
+	uint32_t max_nodes_per_job = -1;
+	uint32_t max_wall_duration_per_job = -1;
+	uint32_t max_cpu_secs_per_job = -1;
 	char *acct_str = NULL;
+	char *assoc_str = NULL;
 	int limit_set = 0;
 	
 	for (i=0; i<argc; i++) {
@@ -305,6 +335,7 @@ extern int sacctmgr_add_account(int argc, char *argv[])
 		while((cluster_rec = list_next(itr_c))) {
 			list_append(cluster_list, 
 				    xstrdup(cluster_rec->name));
+			info("adding to cluster %s", cluster_rec->name);
 		}
 		list_iterator_destroy(itr_c);
 	} else {
@@ -340,12 +371,12 @@ extern int sacctmgr_add_account(int argc, char *argv[])
 				printf(" Need a description for "
 				       "these accounts to add.\n"); 
 				rc = SLURM_ERROR;
-				goto end_it;
+				goto no_required;
 			} else if(!organization) {
 				printf(" Need an organization for "
 				       "these accounts to add.\n"); 
 				rc = SLURM_ERROR;
-				goto end_it;
+				goto no_required;
 			} 
 			acct = xmalloc(sizeof(acct_account_rec_t));
 			acct->assoc_list = list_create(NULL);	
@@ -398,65 +429,70 @@ extern int sacctmgr_add_account(int argc, char *argv[])
 				list_append(acct->assoc_list, assoc);
 			else 
 				list_append(assoc_list, assoc);
+			xstrfmtcat(assoc_str,
+				   "  A = %s"
+				   "\tC = %s\n",
+				   assoc->acct,
+				   assoc->cluster);		
+
 		}
 		list_iterator_destroy(itr_c);
 	}
-end_it:
+no_required:
 	list_iterator_destroy(itr);
 	list_destroy(name_list);
 	list_destroy(cluster_list);
 
+	if(!list_count(acct_list) && !list_count(assoc_list)) {
+		printf(" Nothing new added.\n");
+		goto end_it;
+	}
+
 	if(acct_str) {
 		printf(" Adding Account(s)\n%s",acct_str);
-		printf(" Settings =\n");
-		printf("  Description  = %s\n", description);
-		printf("  Organization = %s\n", organization);
+		printf(" Settings\n");
+		printf("  Description     = %s\n", description);
+		printf("  Organization    = %s\n", organization);
 		
 		if(qos != ACCT_QOS_NOTSET)
-			printf("  Qos     = %s\n", 
-			       acct_qos_str(qos));
+		   	printf("  Qos             = %s\n", acct_qos_str(qos));
 		xfree(acct_str);
 	}
 
-	if(list_count(assoc_list))
-		printf(" Associations =\n");
-	if(acct)
-		itr = list_iterator_create(acct->assoc_list);
-	else
-		itr = list_iterator_create(assoc_list);
-	while((assoc = list_next(itr))) {
-		printf("  A = %s"
-		       "\tC = %s\n",
-		       assoc->acct, assoc->cluster);
+	if(assoc_str) {
+		printf(" Associations\n%s", assoc_str);
+		xfree(assoc_str);
 	}
-	list_iterator_destroy(itr);
 
 	if(limit_set) {
-		printf(" Settings =\n");
-		if(fairshare)
+		printf(" Settings\n");
+		if((int)fairshare >= 0)
 			printf("  Fairshare       = %u\n", fairshare);
-		if(max_jobs)
+		if((int)max_cpu_secs_per_job >= 0)
+			printf("  MaxCPUSecs      = %u\n",
+			       max_cpu_secs_per_job);
+		if((int)max_jobs >= 0)
 			printf("  MaxJobs         = %u\n", max_jobs);
-		if(max_nodes_per_job)
+		if((int)max_nodes_per_job >= 0)
 			printf("  MaxNodes        = %u\n", max_nodes_per_job);
-		if(max_wall_duration_per_job)
+		if((int)max_wall_duration_per_job >= 0)
 			printf("  MaxWall         = %u\n",
 			       max_wall_duration_per_job);
-		if(max_cpu_secs_per_job)
-			printf("  MaxCPUSecs      = %u\n",
-			       max_cpu_secs_per_job);
 	}
 
-	if(!list_count(acct_list) && !list_count(assoc_list))
-		printf(" Nothing new added.\n");
-
 	if(list_count(acct_list)) 
 		rc = acct_storage_g_add_accounts(db_conn, my_uid, acct_list);
 	
 
-	if(rc == SLURM_SUCCESS && list_count(assoc_list)) 
-		rc = acct_storage_g_add_associations(db_conn, my_uid, 
-						     assoc_list);
+	if(rc == SLURM_SUCCESS) {
+		if(list_count(assoc_list)) 
+			rc = acct_storage_g_add_associations(db_conn, my_uid, 
+							     assoc_list);
+	} else {
+		printf(" error: Problem adding accounts\n");
+		rc = SLURM_ERROR;
+		goto end_it;
+	}
 	
 	if(rc == SLURM_SUCCESS) {
 		if(commit_check("Would you like to commit changes?")) {
@@ -473,7 +509,12 @@ end_it:
 			}			
 		} else
 			acct_storage_g_commit(db_conn, 0);
+	} else {
+		printf(" error: Problem adding account associations");
+		rc = SLURM_ERROR;
 	}
+
+end_it:
 	list_destroy(acct_list);
 	list_destroy(assoc_list);
 	
@@ -489,61 +530,75 @@ extern int sacctmgr_list_account(int argc, char *argv[])
 	int rc = SLURM_SUCCESS;
 	acct_account_cond_t *acct_cond =
 		xmalloc(sizeof(acct_account_cond_t));
+	acct_association_cond_t *assoc_cond =
+		xmalloc(sizeof(acct_association_cond_t));
 	List acct_list;
 	int i=0;
 	ListIterator itr = NULL;
 	acct_account_rec_t *acct = NULL;
+	print_field_t name_field;
+	print_field_t desc_field;
+	print_field_t org_field;
+	print_field_t qos_field;
+	List print_fields_list; /* types are of print_field_t */
 	
 	acct_cond->acct_list = list_create(slurm_destroy_char);
 	acct_cond->description_list = list_create(slurm_destroy_char);
 	acct_cond->organization_list = list_create(slurm_destroy_char);
 
-	for (i=0; i<argc; i++) {
-		int end = parse_option_end(argv[i]);
-		if (strncasecmp (argv[i], "Names", 1) == 0) {
-			addto_char_list(acct_cond->acct_list, argv[i]+end);
-		} else if (strncasecmp (argv[i], "Description", 1) == 0) {
-			addto_char_list(acct_cond->description_list,
-					argv[i]+end);
-		} else if (strncasecmp (argv[i], "Organization", 1) == 0) {
-			addto_char_list(acct_cond->organization_list,
-					argv[i]+end);
-		} else if (strncasecmp (argv[i], "Qoslevel", 1) == 0) {
-			acct_cond->qos =
-				str_2_acct_qos(argv[i]+end);
-		} else {
-			error("Valid options are 'Names=' "
-			      "'Descriptions=' 'Oranizations=' "
-			      "and 'QosLevel='");
-		}		
-	}
+	assoc_cond->user_list = list_create(slurm_destroy_char);
+	assoc_cond->acct_list = list_create(slurm_destroy_char);
+	assoc_cond->cluster_list = list_create(slurm_destroy_char);
+	assoc_cond->partition_list = list_create(slurm_destroy_char);
+
+	_set_cond(&i, argc, argv, acct_cond, assoc_cond);
 
 	acct_list = acct_storage_g_get_accounts(db_conn, acct_cond);
 	destroy_acct_account_cond(acct_cond);
+	destroy_acct_association_cond(assoc_cond);
 	
 	if(!acct_list) 
 		return SLURM_ERROR;
 	
+	print_fields_list = list_create(NULL);
+
+	name_field.name = "Name";
+	name_field.len = 10;
+	name_field.print_routine = print_str;
+	list_append(print_fields_list, &name_field);
+
+	desc_field.name = "Descr";
+	desc_field.len = 10;
+	desc_field.print_routine = print_str;
+	list_append(print_fields_list, &desc_field);
+
+	org_field.name = "Org";
+	org_field.len = 10;
+	org_field.print_routine = print_str;
+	list_append(print_fields_list, &org_field);
+
+	qos_field.name = "QOS";
+	qos_field.len = 4;
+	qos_field.print_routine = print_str;
+	list_append(print_fields_list, &qos_field);
 
 	itr = list_iterator_create(acct_list);
-	printf("%-15s %-15s %-15s %-10s\n%-15s %-15s %-15s %-10s\n",
-	       "Name", "Description", "Organization", "Qos",
-	       "---------------",
-	       "---------------",
-	       "---------------",
-	       "----------");
-	
+	print_header(print_fields_list);
+
 	while((acct = list_next(itr))) {
-		printf("%-15.15s %-15.15s %-15.15s %-10.10s\n",
-		       acct->name, acct->description,
-		       acct->organization,
-		       acct_qos_str(acct->qos));
+		print_str(VALUE, &name_field, acct->name);
+		print_str(VALUE, &desc_field, acct->name);
+		print_str(VALUE, &org_field, acct->name);
+		print_str(VALUE, &qos_field, acct->name);
+		printf("\n");
+		/*FIX ME: show assocs */
 	}
 
 	printf("\n");
 
 	list_iterator_destroy(itr);
 	list_destroy(acct_list);
+	list_destroy(print_fields_list);
 	return rc;
 }
 
diff --git a/src/sacctmgr/cluster_functions.c b/src/sacctmgr/cluster_functions.c
index f4be913776b78fed9c96ad7b2154c30b9117fa60..1d1afb85d205b120246ad54cef6eb80c7722945c 100644
--- a/src/sacctmgr/cluster_functions.c
+++ b/src/sacctmgr/cluster_functions.c
@@ -140,104 +140,112 @@ extern int sacctmgr_add_cluster(int argc, char *argv[])
 {
 	int rc = SLURM_SUCCESS;
 	int i=0;
-	acct_cluster_rec_t *cluster = xmalloc(sizeof(acct_cluster_rec_t));
+	acct_cluster_rec_t *cluster = NULL;
 	acct_association_rec_t *assoc = NULL;		  
+	List name_list = list_create(slurm_destroy_char);
 	List cluster_list = NULL;
+	uint32_t fairshare = -1; 
+	uint32_t max_jobs = -1; 
+	uint32_t max_nodes_per_job = -1;
+	uint32_t max_wall_duration_per_job = -1;
+	uint32_t max_cpu_secs_per_job = -1;
 	int limit_set = 0;
+	ListIterator itr = NULL;
+	char *name = NULL;
 
 	for (i=0; i<argc; i++) {
-		if (strncasecmp (argv[i], "Name=", 5) == 0) {
-			if(cluster->name)
-				error("can only add one cluster at a time.\n");
-			else {
-				cluster->name = xstrdup(argv[i]+5);
-			}
-		} else if (strncasecmp (argv[i], "FairShare=", 10) == 0) {
-			cluster->default_fairshare = atoi(argv[i]+10);
+		int end = parse_option_end(argv[i]);
+		if(!end) {
+			addto_char_list(name_list, argv[i]+end);
+		} else if (strncasecmp (argv[i], "FairShare", 1) == 0) {
+			fairshare = atoi(argv[i]+end);
 			limit_set = 1;
-		} else if (strncasecmp (argv[i], "MaxJobs=", 8) == 0) {
-			cluster->default_max_jobs = atoi(argv[i]+8);
+		} else if (strncasecmp (argv[i], "MaxCPUSecs4", 4) == 0) {
+			max_cpu_secs_per_job = atoi(argv[i]+end);
 			limit_set = 1;
-		} else if (strncasecmp (argv[i], "MaxNodes=", 9) == 0) {
-			cluster->default_max_nodes_per_job = atoi(argv[i]+9);
+		} else if (strncasecmp (argv[i], "MaxJobs=", 4) == 0) {
+			max_jobs = atoi(argv[i]+end);
 			limit_set = 1;
-		} else if (strncasecmp (argv[i], "MaxWall=", 8) == 0) {
-			cluster->default_max_wall_duration_per_job =
-				atoi(argv[i]+8);
+		} else if (strncasecmp (argv[i], "MaxNodes", 4) == 0) {
+			max_nodes_per_job = atoi(argv[i]+end);
 			limit_set = 1;
-		} else if (strncasecmp (argv[i], "MaxCPUSecs=", 11) == 0) {
-			cluster->default_max_cpu_secs_per_job = 
-				atoi(argv[i]+11);
+		} else if (strncasecmp (argv[i], "MaxWall", 4) == 0) {
+			max_wall_duration_per_job = atoi(argv[i]+end);
 			limit_set = 1;
+		} else if (strncasecmp (argv[i], "Names", 1) == 0) {
+			addto_char_list(name_list, argv[i]+end);
 		} else {
-			if(cluster->name)
-				error("can only add one cluster at a time.\n");
-			else {
-				cluster->name = xstrdup(argv[i]);
-			}
+			printf(" Unknown option: %s", argv[i]);
 		}		
 	}
 
-	if(!cluster->name) {
-		destroy_acct_cluster_rec(cluster);
+	if(!list_count(name_list)) {
+		list_destroy(name_list);
 		printf(" Need name of cluster to add.\n"); 
 		return SLURM_ERROR;
-	} else if(sacctmgr_find_cluster(cluster->name)) {
-		destroy_acct_cluster_rec(cluster);
-		printf(" This cluster already exists.  Not adding.\n");
-		return SLURM_ERROR;
 	}
 
 	printf(" Adding Cluster(s)\n");
-	printf("  Name          = %s\n", cluster->name);
-	if(limit_set)
-		printf(" User Defaults  =\n");
-	if(cluster->default_fairshare <= 0)
-		cluster->default_fairshare = 1;
-	else
-		printf("  Fairshare     = %u\n", cluster->default_fairshare);
-
-	if(cluster->default_max_cpu_secs_per_job <= 0)
-		cluster->default_max_cpu_secs_per_job = -1;
-	else
-		printf("  MaxCPUSecs    = %u\n",
-		       cluster->default_max_cpu_secs_per_job);
-	if(cluster->default_max_jobs <= 0)
-		cluster->default_max_jobs = -1;
-	else
-		printf("  MaxJobs       = %u\n", cluster->default_max_jobs);
-	if(cluster->default_max_nodes_per_job <= 0)
-		cluster->default_max_nodes_per_job = -1;
-	else
-		printf("  MaxNodes      = %u\n",
-		       cluster->default_max_nodes_per_job);
-	if(cluster->default_max_wall_duration_per_job <= 0)
-		cluster->default_max_wall_duration_per_job = -1;
-	else
-		printf("  MaxWall       = %u\n",
-		       cluster->default_max_wall_duration_per_job);
-	
-	cluster_list = list_create(NULL);
-	list_append(cluster_list, cluster);
+	cluster_list = list_create(destroy_acct_cluster_rec);
+	itr = list_iterator_create(name_list);
+	while((name = list_next(itr))) {
+		if(sacctmgr_find_cluster(name)) {
+			printf(" This cluster %salready exists.  "
+			       "Not adding.\n", name);
+			continue;
+		}
+		cluster = xmalloc(sizeof(acct_cluster_rec_t));
+		cluster->name = xstrdup(name);
+		list_append(cluster_list, cluster);
+
+		printf("  Name          = %s\n", cluster->name);
+
+		cluster->default_fairshare = fairshare;		
+		cluster->default_max_cpu_secs_per_job = max_cpu_secs_per_job;
+		cluster->default_max_jobs = max_jobs;
+		cluster->default_max_nodes_per_job = max_nodes_per_job;
+		cluster->default_max_wall_duration_per_job = 
+			max_wall_duration_per_job;
+	}
+	list_iterator_destroy(itr);
+	list_destroy(name_list);
+
+	if(limit_set) {
+		printf(" User Defaults\n");
+		if((int)fairshare >= 0)
+			printf("  Fairshare       = %u\n", fairshare);
+		if((int)max_cpu_secs_per_job >= 0)
+			printf("  MaxCPUSecs      = %u\n",
+			       max_cpu_secs_per_job);
+		if((int)max_jobs >= 0)
+			printf("  MaxJobs         = %u\n", max_jobs);
+		if((int)max_nodes_per_job >= 0)
+			printf("  MaxNodes        = %u\n", max_nodes_per_job);
+		if((int)max_wall_duration_per_job >= 0)
+			printf("  MaxWall         = %u\n",
+			       max_wall_duration_per_job);
+	}
 
 	rc = acct_storage_g_add_clusters(db_conn, my_uid, cluster_list);
 	if(rc == SLURM_SUCCESS) {
 		if(commit_check("Would you like to commit changes?")) {
 			acct_storage_g_commit(db_conn, 1);
-
-			list_append(sacctmgr_cluster_list, cluster);
-			assoc = xmalloc(sizeof(acct_association_rec_t));
-			list_append(sacctmgr_association_list, assoc);
-			assoc->acct = xstrdup("root");
-			assoc->cluster = xstrdup(cluster->name);
-			assoc->fairshare = cluster->default_fairshare;
-			assoc->max_jobs = cluster->default_max_jobs;
-			assoc->max_nodes_per_job =
-				cluster->default_max_nodes_per_job;
-			assoc->max_wall_duration_per_job = 
-				cluster->default_max_wall_duration_per_job;
-			assoc->max_cpu_secs_per_job =
-				cluster->default_max_cpu_secs_per_job;
+			while((cluster = list_pop(cluster_list))) {
+				list_append(sacctmgr_cluster_list, cluster);
+				assoc = xmalloc(sizeof(acct_association_rec_t));
+				list_append(sacctmgr_association_list, assoc);
+				assoc->acct = xstrdup("root");
+				assoc->cluster = xstrdup(cluster->name);
+				assoc->fairshare = cluster->default_fairshare;
+				assoc->max_jobs = cluster->default_max_jobs;
+				assoc->max_nodes_per_job =
+					cluster->default_max_nodes_per_job;
+				assoc->max_wall_duration_per_job = 
+					cluster->
+					default_max_wall_duration_per_job;
+				assoc->max_cpu_secs_per_job =
+					cluster->default_max_cpu_secs_per_job;
+			}
 		} else
 			acct_storage_g_commit(db_conn, 0);
 	} else {
@@ -262,15 +270,13 @@ extern int sacctmgr_list_cluster(int argc, char *argv[])
 	List print_fields_list; /* types are of print_field_t */
 
 	cluster_cond->cluster_list = list_create(slurm_destroy_char);
-	for (i=0; i<argc; i++) {
-		if (strncasecmp (argv[i], "Name=", 5) == 0) {
-			addto_char_list(cluster_cond->cluster_list, argv[i]+5);
-		} else if (strncasecmp (argv[i], "Names=", 6) == 0) {
-			addto_char_list(cluster_cond->cluster_list, argv[i]+6);
-		} else {
-			error("Only 'Names=' is supported as an option");
-		}		
-	}
+	_set_cond(&i, argc, argv, cluster_cond);
+	
+	cluster_list = acct_storage_g_get_clusters(db_conn, cluster_cond);
+	destroy_acct_cluster_cond(cluster_cond);
+	
+	if(!cluster_list) 
+		return SLURM_ERROR;
 	
 	print_fields_list = list_create(NULL);
 
@@ -282,15 +288,7 @@ extern int sacctmgr_list_cluster(int argc, char *argv[])
 /* 	fs_field.name = "FS"; */
 /* 	fs_field.len = 4; */
 /* 	fs_field.print_routine = print_str; */
-/* 	list_append(print_fields_list, &fs_field); */
-
-	cluster_list = acct_storage_g_get_clusters(db_conn, cluster_cond);
-	destroy_acct_cluster_cond(cluster_cond);
-	
-	if(!cluster_list) 
-		return SLURM_ERROR;
-	
-	
+/* 	list_append(print_fields_list, &fs_field); */	
 	
 	itr = list_iterator_create(cluster_list);
 	print_header(print_fields_list);
@@ -356,7 +354,7 @@ extern int sacctmgr_modify_cluster(int argc, char *argv[])
 	if(rec_set) 
 		printf(" User Defaults  =\n");
 	if((int)cluster->default_fairshare <= 0)
-		cluster->default_fairshare = 1;
+		cluster->default_fairshare = -1;
 	else
 		printf("  Fairshare     = %u\n", cluster->default_fairshare);
 
diff --git a/src/sacctmgr/sacctmgr.c b/src/sacctmgr/sacctmgr.c
index 588dea38e3ee8afc62bcd4257a04908f9cf24f26..60c925b7a54ddc02bcd7a3704544df5b25304f7f 100644
--- a/src/sacctmgr/sacctmgr.c
+++ b/src/sacctmgr/sacctmgr.c
@@ -309,35 +309,6 @@ _process_command (int argc, char *argv[])
 	} else if (strncasecmp (argv[0], "all", 3) == 0) {
 		all_flag = 1;
 	} else if (strncasecmp (argv[0], "exit", 1) == 0) {
-		if (argc > 1) {
-			exit_code = 1;
-			fprintf (stderr, 
-				 "too many arguments for keyword:%s\n", 
-				 argv[0]);
-		}
-		//_close_db();
-
-/* 		if(list_count(sacctmgr_action_list) > 0) { */
-/* 				_close_db(); */
-/* 				char tmp_char[255]; */
-
-/* 			snprintf(tmp_char, sizeof(tmp_char), */
-/* 				 "There are %d action(s) that haven't been " */
-/* 				 "committed yet, would you like to commit " */
-/* 				 "before exit?",  */
-/* 				 list_count(sacctmgr_action_list)); */
-/* 			if(commit_check(tmp_char))  */
-/* 				acct_storage_g_close_connection(&db_conn, 1); */
-/* 			else { */
-/* 				acct_storage_g_close_connection(&db_conn, 0); */
-/* 				printf("Changes discarded.\n"); */
-/* 			} */
-/* 			list_destroy(sacctmgr_action_list); */
-/* 			sacctmgr_action_list = NULL; */
-/* 		} else { */
-/* 			list_destroy(sacctmgr_action_list); */
-/* 			sacctmgr_action_list = NULL; */
-/* 		} */
 		exit_flag = 1;
 	} else if (strncasecmp (argv[0], "help", 2) == 0) {
 		if (argc > 1) {
@@ -381,6 +352,15 @@ _process_command (int argc, char *argv[])
 				        argv[0]);
 		}
 		_add_it((argc - 1), &argv[1]);
+	} else if (strncasecmp (argv[0], "create", 3) == 0) {
+		if (argc < 2) {
+			exit_code = 1;
+			if (quiet_flag != 1)
+				fprintf(stderr, 
+				        "too few arguments for keyword:%s\n", 
+				        argv[0]);
+		}
+		_add_it((argc - 1), &argv[1]);
 	} else if (strncasecmp (argv[0], "show", 3) == 0
 		   || strncasecmp (argv[0], "list", 3) == 0) {
 		if (argc < 2) {
@@ -407,6 +387,14 @@ _process_command (int argc, char *argv[])
 			return 0;
 		}
 		_delete_it((argc - 1), &argv[1]);
+	} else if (strncasecmp (argv[0], "remove", 3) == 0) {
+		if (argc < 2) {
+			exit_code = 1;
+			fprintf (stderr, "too few arguments for %s keyword\n",
+				 argv[0]);
+			return 0;
+		}
+		_delete_it((argc - 1), &argv[1]);
 	} else if (strncasecmp (argv[0], "verbose", 4) == 0) {
 		if (argc > 1) {
 			exit_code = 1;
@@ -442,18 +430,18 @@ static void _add_it (int argc, char *argv[])
 	sacctmgr_init();
 
 	/* First identify the entity to add */
-	if (strncasecmp (argv[0], "User", 4) == 0) {
+	if (strncasecmp (argv[0], "User", 1) == 0) {
 		error_code = sacctmgr_add_user((argc - 1), &argv[1]);
-	} else if (strncasecmp (argv[0], "Account", 7) == 0) {
+	} else if (strncasecmp (argv[0], "Account", 1) == 0) {
 		error_code = sacctmgr_add_account((argc - 1), &argv[1]);
-	} else if (strncasecmp (argv[0], "Cluster", 7) == 0) {
+	} else if (strncasecmp (argv[0], "Cluster", 1) == 0) {
 		error_code = sacctmgr_add_cluster((argc - 1), &argv[1]);
 	} else {
 		exit_code = 1;
 		fprintf(stderr, "No valid entity in add command\n");
-		fprintf(stderr, "Input line must include \"Association\", ");
-		fprintf(stderr, "\"UserName\", \"AccountName\", ");
-		fprintf(stderr, "or \"ClusterName\"\n");
+		fprintf(stderr, "Input line must include, ");
+		fprintf(stderr, "\"User\", \"Account\", ");
+		fprintf(stderr, "or \"Cluster\"\n");
 	}
 	
 	if (error_code) {
@@ -471,11 +459,11 @@ static void _show_it (int argc, char *argv[])
 	int error_code = SLURM_SUCCESS;
 		
 	/* First identify the entity to list */
-	if (strncasecmp (argv[0], "User", 4) == 0) {
+	if (strncasecmp (argv[0], "User", 1) == 0) {
 		error_code = sacctmgr_list_user((argc - 1), &argv[1]);
-	} else if (strncasecmp (argv[0], "Account", 7) == 0) {
+	} else if (strncasecmp (argv[0], "Account", 1) == 0) {
 		error_code = sacctmgr_list_account((argc - 1), &argv[1]);
-	} else if (strncasecmp (argv[0], "Cluster", 7) == 0) {
+	} else if (strncasecmp (argv[0], "Cluster", 1) == 0) {
 		error_code = sacctmgr_list_cluster((argc - 1), &argv[1]);
 	} else {
 		exit_code = 1;
@@ -503,11 +491,11 @@ static void _modify_it (int argc, char *argv[])
 	sacctmgr_init();
 
 	/* First identify the entity to modify */
-	if (strncasecmp (argv[0], "User", 4) == 0) {
+	if (strncasecmp (argv[0], "User", 1) == 0) {
 		error_code = sacctmgr_modify_user((argc - 1), &argv[1]);
-	} else if (strncasecmp (argv[0], "Account", 7) == 0) {
+	} else if (strncasecmp (argv[0], "Account", 1) == 0) {
 		error_code = sacctmgr_modify_account((argc - 1), &argv[1]);
-	} else if (strncasecmp (argv[0], "Cluster", 7) == 0) {
+	} else if (strncasecmp (argv[0], "Cluster", 1) == 0) {
 		error_code = sacctmgr_modify_cluster((argc - 1), &argv[1]);
 	} else {
 		exit_code = 1;
@@ -534,11 +522,11 @@ static void _delete_it (int argc, char *argv[])
 	sacctmgr_init();
 
 	/* First identify the entity to delete */
-	if (strncasecmp (argv[0], "User", 4) == 0) {
+	if (strncasecmp (argv[0], "User", 1) == 0) {
 		error_code = sacctmgr_delete_user((argc - 1), &argv[1]);
-	} else if (strncasecmp (argv[0], "Account", 7) == 0) {
+	} else if (strncasecmp (argv[0], "Account", 1) == 0) {
 		error_code = sacctmgr_delete_account((argc - 1), &argv[1]);
-	} else if (strncasecmp (argv[0], "Cluster", 7) == 0) {
+	} else if (strncasecmp (argv[0], "Cluster", 1) == 0) {
 		error_code = sacctmgr_delete_cluster((argc - 1), &argv[1]);
 	} else {
 		exit_code = 1;
@@ -615,7 +603,7 @@ sacctmgr [<OPTION>] [<COMMAND>]                                            \n\
                             MaxCPUSecs=, MaxJobs=, MaxNodes=, MaxWall=,    \n\
                             Organization=, Parent=, and QosLevel=          \n\
                             (where options) Clusters=, Descriptions=,      \n\
-                            Names=, Organizations=, and Parents=           \n\
+                            Names=, Organizations=, Parent=, and QosLevel= \n\
        delete account     - Clusters=, Descriptions=, Names=,              \n\
                             Organizations=, and Parents=                   \n\
                                                                            \n\
diff --git a/src/sacctmgr/user_functions.c b/src/sacctmgr/user_functions.c
index 88c28200ba2af1667122942a8d78eb10bc6f7562..af1ae01807d9590f3178aef1e9f090873f12237e 100644
--- a/src/sacctmgr/user_functions.c
+++ b/src/sacctmgr/user_functions.c
@@ -37,6 +37,7 @@
 \*****************************************************************************/
 
 #include "sacctmgr.h"
+#include "print.h"
 
 static int _set_cond(int *start, int argc, char *argv[],
 		     acct_user_cond_t *user_cond,
@@ -549,13 +550,17 @@ no_default:
 	list_iterator_destroy(itr);
 	destroy_acct_association_cond(assoc_cond);
 
+	if(!list_count(user_list) && !list_count(assoc_list)) {
+		printf(" Nothing new added.\n");
+		goto end_it;
+	}
+
 	if(user_str) {
 		printf(" Adding User(s)\n%s", user_str);
 		printf(" Settings =\n");
 		printf("  Default Account = %s\n", default_acct);
 		if(qos != ACCT_QOS_NOTSET)
-			printf("  Qos        = %s\n", 
-			       acct_qos_str(qos));
+			printf("  Qos        = %s\n", acct_qos_str(qos));
 		
 		if(admin_level != ACCT_ADMIN_NOTSET)
 			printf("  Admin Level     = %s\n", 
@@ -569,9 +574,12 @@ no_default:
 	}
 
 	if(limit_set) {
-		printf(" Non Default Settings =\n");
+		        printf(" Non Default Settings\n");
 		if((int)fairshare >= 0)
 			printf("  Fairshare       = %u\n", fairshare);
+		if((int)max_cpu_secs_per_job >= 0)
+			printf("  MaxCPUSecs      = %u\n",
+			       max_cpu_secs_per_job);
 		if((int)max_jobs >= 0)
 			printf("  MaxJobs         = %u\n", max_jobs);
 		if((int)max_nodes_per_job >= 0)
@@ -579,14 +587,6 @@ no_default:
 		if((int)max_wall_duration_per_job >= 0)
 			printf("  MaxWall         = %u\n",
 			       max_wall_duration_per_job);
-		if((int)max_cpu_secs_per_job >= 0)
-			printf("  MaxCPUSecs      = %u\n",
-			       max_cpu_secs_per_job);
-	}
-
-	if(!list_count(user_list) && !list_count(assoc_list)) {
-		printf(" Nothing new added.\n");
-		goto end_it;
 	}
 
 	if(list_count(user_list)) {