diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index 6a0ea1591fbaafcd957d87d5cac0e6d1a89aebb2..e56eef0e5f81d8259bc259145520dd64f7af0c30 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -103,7 +103,6 @@ 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;
@@ -687,7 +686,7 @@ bool bso_lock_node(fidoaddr_t dest)
 	for(unsigned attempt=0;;) {
 		char tmp[128];
 		time_t t;
-		if(fmutex(fname, program_id(), cfg.bsy_timeout, &t))
+		if(fmutex_open(fname, program_id(), cfg.bsy_timeout, &t, /* auto-remove: */true) >= 0)
 			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) {
@@ -2988,7 +2987,6 @@ 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);
@@ -3011,16 +3009,6 @@ 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)
@@ -6431,11 +6419,10 @@ int main(int argc, char **argv)
 
 	SAFEPRINTF(path,"%ssbbsecho.bsy", scfg.ctrl_dir);
 	time_t t;
-	if(!fmutex(path, program_id(), cfg.bsy_timeout, &t)) {
+	if(fmutex_open(path, program_id(), cfg.bsy_timeout, &t, /* auto-remove: */true) < 0) {
 		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) {