diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index 7474f3b5286c702e5d8f8adf732d4660aae7d6e4..b9491edb3072670d3e095f43d9c04690a41c0638 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -90,6 +90,8 @@ struct xpms_set				*ts_set;
 static	sbbs_t*	sbbs=NULL;
 static	scfg_t	scfg;
 static	char *	text[TOTAL_TEXT];
+static	scfg_t	node_scfg[MAX_NODES];
+static	char *	node_text[MAX_NODES][TOTAL_TEXT];
 static	WORD	first_node;
 static	WORD	last_node;
 static	bool	terminate_server=false;
@@ -4917,6 +4919,12 @@ static void cleanup(int code)
 	free_cfg(&scfg);
 	free_text(text);
 
+	for(int i = 0; i < MAX_NODES; i++) {
+		free_text(node_text[i]);
+		free_cfg(&node_scfg[i]);
+		memset(&node_scfg[i], 0, sizeof(node_scfg[i]));
+	}
+
 	semfile_list_free(&recycle_semfiles);
 	semfile_list_free(&shutdown_semfiles);
 	semfile_list_free(&clear_attempts_semfiles);
@@ -5317,23 +5325,6 @@ NO_SSH:
 		YIELD();
 		if(protected_uint32_value(node_threads_running)==0) {	/* check for re-run flags and recycle/shutdown sem files */
 			if(!(startup->options&BBS_OPT_NO_RECYCLE)) {
-
-				bool rerun=false;
-				for(i=first_node;i<=last_node;i++) {
-					if(sbbs->getnodedat(i,&node,0)!=0)
-						continue;
-					if(node.misc&NODE_RRUN) {
-						sbbs->getnodedat(i,&node,1);
-						if(!rerun)
-							lprintf(LOG_INFO,"Node %d flagged for re-run",i);
-						rerun=true;
-						node.misc&=~NODE_RRUN;
-						sbbs->putnodedat(i,&node);
-					}
-				}
-				if(rerun)
-					break;
-
 				if((p=semfile_list_check(&initialized,recycle_semfiles))!=NULL) {
 					lprintf(LOG_INFO,"Recycle semaphore file (%s) detected"
 						,p);
@@ -5715,11 +5706,42 @@ NO_SSH:
 			continue;
 		}
 
+		// Load the configuration files for this node, only if/when needed/updated
+		scfg_t* cfg = &node_scfg[i - 1];
+		if(cfg->size != sizeof(*cfg) || (node.misc & NODE_RRUN)) {
+			sbbs->bprintf("Loading configuration...");
+			free_cfg(cfg);
+			free_text(node_text[i - 1]);
+			cfg->size = sizeof(*cfg);
+			cfg->node_num = i;
+		    SAFECOPY(cfg->ctrl_dir, startup->ctrl_dir);
+			lprintf(LOG_INFO,"Node %d Loading configuration files from %s", cfg->node_num, cfg->ctrl_dir);
+			SAFECOPY(logstr,UNKNOWN_LOAD_ERROR);
+			if(!load_cfg(cfg, node_text[i - 1], TRUE, logstr)) {
+				lprintf(LOG_CRIT,"!ERROR %s",logstr);
+				lprintf(LOG_CRIT,"!FAILED to load configuration files");
+				sbbs->bprintf(" FAILED: %s", logstr);
+				client_off(client_socket);
+				SSH_END(client_socket);
+				close_socket(client_socket);
+				sbbs->getnodedat(cfg->node_num,&node,true);
+				node.status = NODE_WFC;
+				sbbs->putnodedat(cfg->node_num,&node);
+				continue;
+			}
+			if(node.misc & NODE_RRUN) {
+				sbbs->getnodedat(cfg->node_num,&node,true);
+				node.misc &= ~NODE_RRUN;
+				sbbs->putnodedat(cfg->node_num,&node);
+			}
+			sbbs->bputs(crlf);
+		}
+
         node_socket[i-1]=client_socket;
 
 		sbbs_t* new_node = new sbbs_t(/* node_num: */i, &client_addr, client_addr_len, host_name
         	,client_socket
-			,&scfg, text, &client);
+			,cfg, node_text[i-1], &client);
 
 		new_node->client=client;
 #ifdef USE_CRYPTLIB