diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index e56eef0e5f81d8259bc259145520dd64f7af0c30..6a0ea1591fbaafcd957d87d5cac0e6d1a89aebb2 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -103,6 +103,7 @@ char*			text[TOTAL_TEXT];
 
 bool pause_on_exit=false;
 bool pause_on_abend=false;
+bool mtxfile_locked=false;
 bool terminated=false;
 
 str_list_t	locked_bso_nodes;
@@ -686,7 +687,7 @@ bool bso_lock_node(fidoaddr_t dest)
 	for(unsigned attempt=0;;) {
 		char tmp[128];
 		time_t t;
-		if(fmutex_open(fname, program_id(), cfg.bsy_timeout, &t, /* auto-remove: */true) >= 0)
+		if(fmutex(fname, program_id(), cfg.bsy_timeout, &t))
 			break;
 		lprintf(LOG_NOTICE, "Node (%s) externally locked via: %s (since %s)", smb_faddrtoa(&dest, NULL), fname, time_as_hhmm(&scfg, t, tmp));
 		if(++attempt >= cfg.bso_lock_attempts) {
@@ -2987,6 +2988,7 @@ const char* area_desc(const char* areatag)
 void cleanup(void)
 {
 	char*		p;
+	char		path[MAX_PATH+1];
 
 	if(bad_areas != NULL) {
 		lprintf(LOG_DEBUG, "Writing %lu areas to %s", (ulong)strListCount(bad_areas), cfg.badareafile);
@@ -3009,6 +3011,16 @@ void cleanup(void)
 		}
 		strListFree(&bad_areas);
 	}
+	while((p=strListPop(&locked_bso_nodes)) != NULL) {
+		delfile(p, __LINE__);
+		free(p);
+	}
+
+	if(mtxfile_locked) {
+		SAFEPRINTF(path,"%ssbbsecho.bsy", scfg.ctrl_dir);
+		if(delfile(path, __LINE__))
+			mtxfile_locked = false;
+	}
 }
 
 void bail(int error_level)
@@ -6419,10 +6431,11 @@ int main(int argc, char **argv)
 
 	SAFEPRINTF(path,"%ssbbsecho.bsy", scfg.ctrl_dir);
 	time_t t;
-	if(fmutex_open(path, program_id(), cfg.bsy_timeout, &t, /* auto-remove: */true) < 0) {
+	if(!fmutex(path, program_id(), cfg.bsy_timeout, &t)) {
 		lprintf(LOG_WARNING, "Mutex file exists (%s): SBBSecho appears to be already running since %s", path, time_as_hhmm(&scfg, t, str));
 		bail(1);
 	}
+	mtxfile_locked = true;
 	atexit(cleanup);
 
 	if(cfg.max_log_size && ftello(fidologfile) >= cfg.max_log_size) {