diff --git a/src/common/slurm_protocol_api.c b/src/common/slurm_protocol_api.c
index 139b8e4445462058b045a5644eed5b843ddcf13b..f3edea12da942b98e02d9f48f0c8e6e2128a5fce 100644
--- a/src/common/slurm_protocol_api.c
+++ b/src/common/slurm_protocol_api.c
@@ -593,6 +593,24 @@ char *slurm_get_accounting_storage_loc(void)
 	return storage_loc;	
 }
 
+/* slurm_get_accounting_storage_enforce
+ * returns whether or not to enforce associations
+ */
+int slurm_get_accounting_storage_enforce(void)
+{
+	int enforce = 0;
+	slurm_ctl_conf_t *conf;
+
+	if(slurmdbd_conf) {
+	} else {
+		conf = slurm_conf_lock();
+		enforce = conf->accounting_storage_enforce;
+		slurm_conf_unlock();
+	}
+	return enforce;	
+
+}
+
 /* slurm_set_accounting_storage_loc
  * IN: char *loc (name of file or database)
  * RET 0 or error code
diff --git a/src/common/slurm_protocol_api.h b/src/common/slurm_protocol_api.h
index 8c2fbabefe3d476aff70c5a08f42087de5461515..f632101828ae4964f7d6adde928a2dd9ada78338 100644
--- a/src/common/slurm_protocol_api.h
+++ b/src/common/slurm_protocol_api.h
@@ -245,6 +245,11 @@ char *slurm_get_accounting_storage_host(void);
  */
 char *slurm_get_accounting_storage_loc(void);
 
+/* slurm_get_accounting_storage_enforce
+ * returns whether or not to enforce associations
+ */
+int slurm_get_accounting_storage_enforce(void);
+
 /* slurm_set_accounting_storage_loc
  * IN: char *loc (name of file or database)
  * RET 0 or error code
diff --git a/src/common/slurmdbd_defs.c b/src/common/slurmdbd_defs.c
index 25818bcf52f3ad330d0d289162f6d68a700ec18c..c12cbb8f53ab42b51822d31287138326bcb6fa21 100644
--- a/src/common/slurmdbd_defs.c
+++ b/src/common/slurmdbd_defs.c
@@ -441,9 +441,10 @@ extern Buf pack_slurmdbd_msg(slurmdbd_msg_t *req)
 					     req->data, buffer);
 		break;
 	default:
-		error("slurmdbd: Invalid message type pack %u(%s)",
+		error("slurmdbd: Invalid message type pack %u(%s:%u)",
 		      req->msg_type,
-		      slurmdbd_msg_type_2_str(req->msg_type));
+		      slurmdbd_msg_type_2_str(req->msg_type, 1),
+		      req->msg_type);
 		free_buf(buffer);
 		return NULL;
 	}
@@ -571,7 +572,8 @@ extern int unpack_slurmdbd_msg(slurmdbd_msg_t *resp, Buf buffer)
 	default:
 		error("slurmdbd: Invalid message type unpack %u(%s)",
 		      resp->msg_type,
-		      slurmdbd_msg_type_2_str(resp->msg_type));
+		      slurmdbd_msg_type_2_str(resp->msg_type, 1),
+		      resp->msg_type);
 		return SLURM_ERROR;
 	}
 	return rc;
@@ -693,161 +695,314 @@ extern slurmdbd_msg_type_t str_2_slurmdbd_msg_type(char *msg_type)
 	return NO_VAL;
 }
 
-extern char *slurmdbd_msg_type_2_str(slurmdbd_msg_type_t msg_type)
+extern char *slurmdbd_msg_type_2_str(slurmdbd_msg_type_t msg_type, int get_enum)
 {
 	switch(msg_type) {
 	case DBD_INIT:
-		return "Init";
+		if(get_enum) {
+			return "DBD_INIT";
+		} else
+			return "Init";
 		break;
 	case DBD_FINI:
-		return "Fini";
+		if(get_enum) {
+			return "DBD_FINI";
+		} else
+			return "Fini";
 		break;
 	case DBD_ADD_ACCOUNTS:
-		return "Add Accounts";
+		if(get_enum) {
+			return "DBD_ADD_ACCOUNTS";
+		} else
+			return "Add Accounts";
 		break;
 	case DBD_ADD_ACCOUNT_COORDS:
-		return "Add Account Coord";
+		if(get_enum) {
+			return "DBD_ADD_ACCOUNT_COORDS";
+		} else
+			return "Add Account Coord";
 		break;
 	case DBD_ADD_ASSOCS:
-		return "Add Associations";
+		if(get_enum) {
+			return "DBD_ADD_ASSOCS";
+		} else
+			return "Add Associations";
 		break;
 	case DBD_ADD_CLUSTERS:
-		return "Add Clusters";
+		if(get_enum) {
+			return "DBD_ADD_CLUSTERS";
+		} else
+			return "Add Clusters";
 		break;
 	case DBD_ADD_USERS:
-		return "Add Users";
+		if(get_enum) {
+			return "DBD_ADD_USERS";
+		} else
+			return "Add Users";
 		break;
 	case DBD_CLUSTER_PROCS:
-		return "Cluster Processors";
+		if(get_enum) {
+			return "DBD_CLUSTER_PROCS";
+		} else
+			return "Cluster Processors";
 		break;
 	case DBD_FLUSH_JOBS:
-		return "Flush Jobs";
+		if(get_enum) {
+			return "DBD_FLUSH_JOBS";
+		} else
+			return "Flush Jobs";
 		break;
 	case DBD_GET_ACCOUNTS:
-		return "Get Accounts";
+		if(get_enum) {
+			return "DBD_GET_ACCOUNTS";
+		} else
+			return "Get Accounts";
 		break;
 	case DBD_GET_ASSOCS:
-		return "Get Associations";
+		if(get_enum) {
+			return "DBD_GET_ASSOCS";
+		} else
+			return "Get Associations";
 		break;
 	case DBD_GET_ASSOC_USAGE:
-		return "Get Association Usage";
+		if(get_enum) {
+			return "DBD_GET_ASSOC_USAGE";
+		} else
+			return "Get Association Usage";
 		break;
 	case DBD_GET_CLUSTERS:
-		return "Get Clusters";
+		if(get_enum) {
+			return "DBD_GET_CLUSTERS";
+		} else
+			return "Get Clusters";
 		break;
 	case DBD_GET_CLUSTER_USAGE:
-		return "Get Cluster Usage";
+		if(get_enum) {
+			return "DBD_GET_CLUSTER_USAGE";
+		} else
+			return "Get Cluster Usage";
 		break;
 	case DBD_GET_JOBS:
-		return "Get Jobs";
+		if(get_enum) {
+			return "DBD_GET_JOBS";
+		} else
+			return "Get Jobs";
 		break;
 	case DBD_GET_USERS:
-		return "Get Users";
+		if(get_enum) {
+			return "DBD_GET_USERS";
+		} else
+			return "Get Users";
 		break;
 	case DBD_GOT_ACCOUNTS:
-		return "Got Accounts";
+		if(get_enum) {
+			return "DBD_GOT_ACCOUNTS";
+		} else
+			return "Got Accounts";
 		break;
 	case DBD_GOT_ASSOCS:
-		return "Got Associations";
+		if(get_enum) {
+			return "DBD_GOT_ASSOCS";
+		} else
+			return "Got Associations";
 		break;
 	case DBD_GOT_ASSOC_USAGE:
-		return "Got Association Usage";
+		if(get_enum) {
+			return "DBD_GOT_ASSOC_USAGE";
+		} else
+			return "Got Association Usage";
 		break;
 	case DBD_GOT_CLUSTERS:
-		return "Got Clusters";
+		if(get_enum) {
+			return "DBD_GOT_CLUSTERS";
+		} else
+			return "Got Clusters";
 		break;
 	case DBD_GOT_CLUSTER_USAGE:
-		return "Got Cluster Usage";
+		if(get_enum) {
+			return "DBD_GOT_CLUSTER_USAGE";
+		} else
+			return "Got Cluster Usage";
 		break;
 	case DBD_GOT_JOBS:
-		return "Got Jobs";
+		if(get_enum) {
+			return "DBD_GOT_JOBS";
+		} else
+			return "Got Jobs";
 		break;
 	case DBD_GOT_LIST:
-		return "Got List";
+		if(get_enum) {
+			return "DBD_GOT_LIST";
+		} else
+			return "Got List";
 		break;
 	case DBD_GOT_USERS:
-		return "Got Users";
+		if(get_enum) {
+			return "DBD_GOT_USERS";
+		} else
+			return "Got Users";
 		break;
 	case DBD_JOB_COMPLETE:
-		return "Job Complete";
+		if(get_enum) {
+			return "DBD_JOB_COMPLETE";
+		} else
+			return "Job Complete";
 		break;
 	case DBD_JOB_START:
-		return "Job Start";
+		if(get_enum) {
+			return "DBD_JOB_START";
+		} else
+			return "Job Start";
 		break;
 	case DBD_JOB_START_RC:
-		return "Job Start RC";
+		if(get_enum) {
+			return "DBD_JOB_START_RC";
+		} else
+			return "Job Start RC";
 		break;
 	case DBD_JOB_SUSPEND:
-		return "Job Suspend";
+		if(get_enum) {
+			return "DBD_JOB_SUSPEND";
+		} else
+			return "Job Suspend";
 		break;
 	case DBD_MODIFY_ACCOUNTS:
-		return "Modify Accounts";
+		if(get_enum) {
+			return "DBD_MODIFY_ACCOUNTS";
+		} else
+			return "Modify Accounts";
 		break;
 	case DBD_MODIFY_ASSOCS:
-		return "Modify Associations";
+		if(get_enum) {
+			return "DBD_MODIFY_ASSOCS";
+		} else
+			return "Modify Associations";
 		break;
 	case DBD_MODIFY_CLUSTERS:
-		return "Modify Clusters";
+		if(get_enum) {
+			return "DBD_MODIFY_CLUSTERS";
+		} else
+			return "Modify Clusters";
 		break;
 	case DBD_MODIFY_USERS:
-		return "Modify Users";
+		if(get_enum) {
+			return "DBD_MODIFY_USERS";
+		} else
+			return "Modify Users";
 		break;
 	case DBD_NODE_STATE:
-		return "Node State";
+		if(get_enum) {
+			return "DBD_NODE_STATE";
+		} else
+			return "Node State";
 		break;
 	case DBD_RC:
-		return "RC";
+		if(get_enum) {
+			return "DBD_RC";
+		} else
+			return "Return Code";
 		break;
 	case DBD_REGISTER_CTLD:
-		return "Register Cluster";
+		if(get_enum) {
+			return "DBD_REGISTER_CTLD";
+		} else
+			return "Register Cluster";
 		break;
 	case DBD_REMOVE_ACCOUNTS:
-		return "Remove Accounts";
+		if(get_enum) {
+			return "DBD_REMOVE_ACCOUNTS";
+		} else
+			return "Remove Accounts";
 		break;
 	case DBD_REMOVE_ACCOUNT_COORDS:
-		return "Remove Account Coords";
+		if(get_enum) {
+			return "DBD_REMOVE_ACCOUNT_COORDS";
+		} else
+			return "Remove Account Coords";
 		break;
 	case DBD_REMOVE_ASSOCS:
-		return "Remove Associations";
+		if(get_enum) {
+			return "DBD_REMOVE_ASSOCS";
+		} else
+			return "Remove Associations";
 		break;
 	case DBD_REMOVE_CLUSTERS:
-		return "Remove Clusters";
+		if(get_enum) {
+			return "DBD_REMOVE_CLUSTERS";
+		} else
+			return "Remove Clusters";
 		break;
 	case DBD_REMOVE_USERS:
-		return "Remove Users";
+		if(get_enum) {
+			return "DBD_REMOVE_USERS";
+		} else
+			return "Remove Users";
 		break;
 	case DBD_ROLL_USAGE:
-		return "Roll Usage";
+		if(get_enum) {
+			return "DBD_ROLL_USAGE";
+		} else
+			return "Roll Usage";
 		break;
 	case DBD_STEP_COMPLETE:
-		return "Step Complete";
+		if(get_enum) {
+			return "DBD_STEP_COMPLETE";
+		} else
+			return "Step Complete";
 		break;
 	case DBD_STEP_START:
-		return "Step Start";
+		if(get_enum) {
+			return "DBD_STEP_START";
+		} else
+			return "Step Start";
 		break;
 	case DBD_UPDATE_SHARES_USED:
-		return "Update Shares Used";
+		if(get_enum) {
+			return "DBD_UPDATE_SHARES_USED";
+		} else
+			return "Update Shares Used";
 		break;
 	case DBD_GET_JOBS_COND:
-		return "Get Jobs Conditional";
+		if(get_enum) {
+			return "DBD_GET_JOBS_COND";
+		} else
+			return "Get Jobs Conditional";
 		break;
 	case DBD_GET_TXN:
-		return "Get Transations";
+		if(get_enum) {
+			return "DBD_GET_TXN";
+		} else
+			return "Get Transations";
 		break;
 	case DBD_GOT_TXN:
-		return "Got Transations";
+		if(get_enum) {
+			return "DBD_GOT_TXN";
+		} else
+			return "Got Transations";
 		break;
 	case DBD_ADD_QOS:
-		return "Add QOS";
+		if(get_enum) {
+			return "DBD_ADD_QOS";
+		} else
+			return "Add QOS";
 		break;
 	case DBD_GET_QOS:
-		return "Get QOS";
+		if(get_enum) {
+			return "DBD_GET_QOS";
+		} else
+			return "Get QOS";
 		break;
 	case DBD_GOT_QOS:
-		return "Got QOS";
+		if(get_enum) {
+			return "DBD_GOT_QOS";
+		} else
+			return "Got QOS";
 		break;
 	case DBD_REMOVE_QOS:
-		return "Remove QOS";
+		if(get_enum) {
+			return "DBD_REMOVE_QOS";
+		} else
+			return "Remove QOS";
 		break;
 	default:
 		return "Unknown";
@@ -985,9 +1140,20 @@ static int _get_return_code(void)
 	case DBD_RC:
 		if (slurmdbd_unpack_rc_msg(&msg, buffer) == SLURM_SUCCESS) {
 			rc = msg->return_code;
-			if (rc != SLURM_SUCCESS)
-				error("slurmdbd: DBD_RC is %d from %u: %s",
-				      rc, msg->sent_type, msg->comment);
+			if (rc != SLURM_SUCCESS) {
+				error("slurmdbd: DBD_RC is %d from %s(%u): %s",
+				      rc,
+				      slurmdbd_msg_type_2_str(msg->sent_type,
+							       1),
+				      msg->sent_type,
+				      msg->comment);
+				if(msg->sent_type == DBD_REGISTER_CTLD &&
+				   slurm_get_accounting_storage_enforce())
+					fatal("You need to add this cluster "
+					      "to accounting if you want to "
+					      "enforce associations, or no "
+					      "jobs will ever run.");
+			}
 			slurmdbd_free_rc_msg(msg);
 		} else
 			error("slurmdbd: unpack message error");
diff --git a/src/common/slurmdbd_defs.h b/src/common/slurmdbd_defs.h
index 8fa02c7841b285491c6866e5973932325d05b247..4ddc042644ab138aaa4d1afabbd36661c655c10b 100644
--- a/src/common/slurmdbd_defs.h
+++ b/src/common/slurmdbd_defs.h
@@ -355,7 +355,8 @@ extern Buf pack_slurmdbd_msg(slurmdbd_msg_t *req);
 extern int unpack_slurmdbd_msg(slurmdbd_msg_t *resp, Buf buffer);
 
 extern slurmdbd_msg_type_t str_2_slurmdbd_msg_type(char *msg_type);
-extern char *slurmdbd_msg_type_2_str(slurmdbd_msg_type_t msg_type);
+extern char *slurmdbd_msg_type_2_str(slurmdbd_msg_type_t msg_type,
+				     int get_enum);
 
 /*****************************************************************************\
  * Free various SlurmDBD message structures
diff --git a/src/sacctmgr/txn_functions.c b/src/sacctmgr/txn_functions.c
index b98286b01d77331c41951c3e44677b2d7c9a6e42..17ea28bd8a321df15688b88e5ffae71060e14611 100644
--- a/src/sacctmgr/txn_functions.c
+++ b/src/sacctmgr/txn_functions.c
@@ -204,7 +204,8 @@ extern int sacctmgr_list_txn(int argc, char *argv[])
 			case PRINT_ACTION:
 				field->print_routine(
 					field, 
-					slurmdbd_msg_type_2_str(txn->action));
+					slurmdbd_msg_type_2_str(txn->action,
+								0));
 				break;
 			case PRINT_ACTOR:
 				field->print_routine(field,
diff --git a/src/slurmctld/controller.c b/src/slurmctld/controller.c
index b6903a886f404426a9f774435b89e87b2302f09c..140d8af2cb497192a82afa25a6fb840892758852 100644
--- a/src/slurmctld/controller.c
+++ b/src/slurmctld/controller.c
@@ -419,10 +419,11 @@ int main(int argc, char *argv[])
 				&thread_attr, _slurmctld_rpc_mgr, NULL))
 			fatal("pthread_create error %m");
 		slurm_attr_destroy(&thread_attr);
-		clusteracct_storage_g_register_ctld(
-					slurmctld_conf.cluster_name, 
-					slurmctld_conf.slurmctld_port);
 
+		clusteracct_storage_g_register_ctld(
+			slurmctld_conf.cluster_name, 
+			slurmctld_conf.slurmctld_port);
+		
 		/*
 		 * create attached thread for signal handling
 		 */