diff --git a/src/sbbs3/scfg/scfg.h b/src/sbbs3/scfg/scfg.h
index f4398763505158824196675e8c0a2f6dd0364458..4b34ed455fbb8154f66e619d1f9f3ded0a8c8a53 100644
--- a/src/sbbs3/scfg/scfg.h
+++ b/src/sbbs3/scfg/scfg.h
@@ -144,6 +144,7 @@ int  bits(long l);
 void getar(char *desc, char *ar);
 bool new_sub(unsigned new_subnum, unsigned group_num);
 bool new_qhub_sub(qhub_t*, unsigned qsubnum, sub_t*, unsigned confnum);
+void remove_sub(scfg_t*, unsigned subnum);
 void sort_subs(int grpnum);
 void sort_dirs(int libnum);
 unsigned subs_in_group(unsigned grpnum);
diff --git a/src/sbbs3/scfg/scfgmsg.c b/src/sbbs3/scfg/scfgmsg.c
index da726b7ddd26eb60e8cda636a0cf6975dc4b63d2..f409fc53651f6d2e656a18e7b6237d652b3ed7c7 100644
--- a/src/sbbs3/scfg/scfgmsg.c
+++ b/src/sbbs3/scfg/scfgmsg.c
@@ -526,17 +526,7 @@ void msgs_cfg()
 			if (msk == MSK_DEL) {
 				for (j = 0; j < cfg.total_subs;) {
 					if (cfg.sub[j]->grp == grpnum) {	/* delete subs of this group */
-						free(cfg.sub[j]);
-						cfg.total_subs--;
-						k = j;
-						while (k < cfg.total_subs) {	/* move all subs down */
-							cfg.sub[k] = cfg.sub[k + 1];
-							for (q = 0; q < cfg.total_qhubs; q++)
-								for (s = 0; s < cfg.qhub[q]->subs; s++)
-									if (cfg.qhub[q]->sub[s] == cfg.sub[j])
-										cfg.qhub[q]->sub[s] = NULL;
-							k++;
-						}
+						remove_sub(&cfg, j);
 					}
 					else j++;
 				}
diff --git a/src/sbbs3/scfg/scfgsub.c b/src/sbbs3/scfg/scfgsub.c
index 47d7bc64dd5e406b63a3e445f40e16043b82fa95..22708d7de8ada6d5fc8a37868d529737448fce57 100644
--- a/src/sbbs3/scfg/scfgsub.c
+++ b/src/sbbs3/scfg/scfgsub.c
@@ -95,13 +95,29 @@ bool new_sub(unsigned new_subnum, unsigned group_num)
 	return true;
 }
 
+void remove_sub(scfg_t* cfg, unsigned subnum)
+{
+	sub_t* sub = cfg->sub[subnum];
+	// Remove the sub-board from any QWKnet hub sub-boards
+	for (unsigned q = 0; q < cfg->total_qhubs; q++) {
+		for (unsigned s = 0; s < cfg->qhub[q]->subs; s++) {
+			if (cfg->qhub[q]->sub[s] == sub)
+				cfg->qhub[q]->sub[s] = NULL;
+		}
+	}
+	FREE_AND_NULL(cfg->sub[subnum]);
+	--cfg->total_subs;
+	for (unsigned i = subnum; i < cfg->total_subs; i++)
+		cfg->sub[i] = cfg->sub[i + 1];
+}
+
 void sub_cfg(uint grpnum)
 {
 	static int dflt,tog_dflt,opt_dflt,net_dflt,adv_dflt,bar;
 	char str[128],str2[128],done=0,code[128];
 	char path[MAX_PATH+1];
 	char data_dir[MAX_PATH+1];
-	int j,m,n,ptridx,q,s;
+	int j,m,n,ptridx;
 	uint i,subnum[MAX_OPTS+1];
 	static sub_t savsub;
 
@@ -291,15 +307,7 @@ void sub_cfg(uint grpnum)
 			}
 			if(msk == MSK_CUT)
 				savsub = *cfg.sub[subnum[i]];
-			free(cfg.sub[subnum[i]]);
-			cfg.total_subs--;
-			for(j=subnum[i];j<cfg.total_subs;j++)
-				cfg.sub[j]=cfg.sub[j+1];
-			for(q=0;q<cfg.total_qhubs;q++)
-				for(s=0;s<cfg.qhub[q]->subs;s++) {
-					if(cfg.qhub[q]->sub[s] == cfg.sub[subnum[i]])
-						cfg.qhub[q]->sub[s] = NULL;
-				}
+			remove_sub(&cfg, subnum[i]);
 			uifc.changes = TRUE;
 			continue; 
 		}