diff --git a/src/sbbs3/ctrl/MainFormUnit.cpp b/src/sbbs3/ctrl/MainFormUnit.cpp
index a6adb7854505710794c5d1e7b48a52eaf6ab1296..b2b267337d55dff3b041215ac35e81ef8851802f 100644
--- a/src/sbbs3/ctrl/MainFormUnit.cpp
+++ b/src/sbbs3/ctrl/MainFormUnit.cpp
@@ -1999,7 +1999,7 @@ void __fastcall TMainForm::StartupTimerTick(TObject *Sender)
 
 void __fastcall TMainForm::DisplayMainPanels(TObject* Sender)
 {
-	if(bbs_startup.options&BBS_OPT_MUTE)
+	if(sound_muted(&cfg))
 		SoundToggle->Checked=false;
 	else
 		SoundToggle->Checked=true;
@@ -2557,35 +2557,11 @@ void __fastcall TMainForm::HelpAboutMenuItemClick(TObject *Sender)
 //---------------------------------------------------------------------------
 BOOL MuteService(SC_HANDLE svc, SERVICE_STATUS* status, BOOL mute)
 {
-	if(svc==NULL || controlService==NULL)
-    	return(FALSE);
-
-	return controlService(svc
-        ,mute ? SERVICE_CONTROL_MUTE:SERVICE_CONTROL_UNMUTE, status);
 }
 //---------------------------------------------------------------------------
 void __fastcall TMainForm::SoundToggleExecute(TObject *Sender)
 {
     SoundToggle->Checked=!SoundToggle->Checked;
-
-    if(!SoundToggle->Checked) {
-	    bbs_startup.options|=BBS_OPT_MUTE;
-	    ftp_startup.options|=FTP_OPT_MUTE;
-	    web_startup.options|=FTP_OPT_MUTE;
-	    mail_startup.options|=MAIL_OPT_MUTE;
-	    services_startup.options|=MAIL_OPT_MUTE;
-	} else {
-	    bbs_startup.options&=~BBS_OPT_MUTE;
-	    ftp_startup.options&=~FTP_OPT_MUTE;
-	    web_startup.options&=~FTP_OPT_MUTE;
-	    mail_startup.options&=~MAIL_OPT_MUTE;
-	    services_startup.options&=~MAIL_OPT_MUTE;
-    }
-    MuteService(bbs_svc,&bbs_svc_status,!SoundToggle->Checked);
-    MuteService(ftp_svc,&ftp_svc_status,!SoundToggle->Checked);
-    MuteService(web_svc,&web_svc_status,!SoundToggle->Checked);
-    MuteService(mail_svc,&mail_svc_status,!SoundToggle->Checked);
-    MuteService(services_svc,&services_svc_status,!SoundToggle->Checked);
 }
 //---------------------------------------------------------------------------
 void __fastcall TMainForm::BBSStatisticsLogMenuItemClick(TObject *Sender)
@@ -2699,12 +2675,18 @@ void __fastcall TMainForm::UpTimerTick(TObject *Sender)
     static  time_t start;
     ulong   up;
     static  bool sysop_available;
+	static	bool sound_muted;
 
     if(ChatToggle->Checked != sysop_available) {
         sysop_available = ChatToggle->Checked;
         set_sysop_availability(&cfg, sysop_available);
     }
 	
+    if(SoundToggle->Checked != !sound_muted) {
+        sound_muted = !SoundToggle->Checked;
+        set_sound_muted(&cfg, sound_muted);
+    }
+	
 	if(clearLoginAttemptList) {
 		loginAttemptListClear(&login_attempt_list);
 		clearLoginAttemptList = false;
@@ -3147,11 +3129,12 @@ void __fastcall TMainForm::reload_config(void)
     	ChatToggle->Checked=true;
     else
     	ChatToggle->Checked=false;
-        
-    if(bbs_startup.options&BBS_OPT_MUTE)
+
+	if(sound_muted(&cfg))
     	SoundToggle->Checked=false;
     else
     	SoundToggle->Checked=true;
+
 	SetControls();
 }
 //---------------------------------------------------------------------------
diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index 68324b09665a76c31caeaaa26bffd31563848d11..18870ac95624d5d2d528c22ce7f074a0d5323376 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -1724,7 +1724,7 @@ void ftp_printfile(SOCKET sock, CRYPT_SESSION sess, const char* name, unsigned c
 static BOOL ftp_hacklog(char* prot, char* user, char* text, char* host, union xp_sockaddr* addr)
 {
 #ifdef _WIN32
-	if(startup->sound.hack[0] && !(startup->options&FTP_OPT_MUTE)) 
+	if(startup->sound.hack[0] && !sound_muted(&scfg)) 
 		PlaySound(startup->sound.hack, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
@@ -2198,7 +2198,7 @@ static void ctrl_thread(void* arg)
 	free(arg);
 
 #ifdef _WIN32
-	if(startup->sound.answer[0] && !(startup->options&FTP_OPT_MUTE)) 
+	if(startup->sound.answer[0] && !sound_muted(&scfg)) 
 		PlaySound(startup->sound.answer, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
@@ -2566,7 +2566,7 @@ static void ctrl_thread(void* arg)
 			putuserdat(&scfg, &user);
 
 #ifdef _WIN32
-			if(startup->sound.login[0] && !(startup->options&FTP_OPT_MUTE)) 
+			if(startup->sound.login[0] && !sound_muted(&scfg)) 
 				PlaySound(startup->sound.login, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 			continue;
@@ -4807,14 +4807,14 @@ static void ctrl_thread(void* arg)
 			lprintf(LOG_ERR,"%04d <%s> !ERROR in logoutuserdat", sock, user.alias);
 		lprintf(LOG_INFO,"%04d <%s> logged off", sock, user.alias);
 #ifdef _WIN32
-		if(startup->sound.logout[0] && !(startup->options&FTP_OPT_MUTE)) 
+		if(startup->sound.logout[0] && !sound_muted(&scfg)) 
 			PlaySound(startup->sound.logout, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
 	}
 
 #ifdef _WIN32
-	if(startup->sound.hangup[0] && !(startup->options&FTP_OPT_MUTE)) 
+	if(startup->sound.hangup[0] && !sound_muted(&scfg)) 
 		PlaySound(startup->sound.hangup, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
diff --git a/src/sbbs3/login.cpp b/src/sbbs3/login.cpp
index 094684302fcd62be033a0080e1b48927b30b4fac..4690fdcfc444e1dbcfea730b968cb004862fb792 100644
--- a/src/sbbs3/login.cpp
+++ b/src/sbbs3/login.cpp
@@ -147,7 +147,7 @@ int sbbs_t::login(char *username, char *pw_prompt, const char* user_pw, const ch
 	}
 
 #ifdef _WIN32
-	if(startup->sound.login[0] && !(startup->options&BBS_OPT_MUTE))
+	if(startup->sound.login[0] && !sound_muted(&cfg))
 		PlaySound(startup->sound.login, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
@@ -173,7 +173,7 @@ void sbbs_t::badlogin(char* user, char* passwd, const char* protocol, xp_sockadd
 		getnameinfo(&addr->addr, addr_len, host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD);
 		::hacklog(&cfg, reason, user, passwd, host_name, addr);
 #ifdef _WIN32
-		if(startup->sound.hack[0] && !(startup->options&BBS_OPT_MUTE))
+		if(startup->sound.hack[0] && !sound_muted(&cfg))
 			PlaySound(startup->sound.hack, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 	}
diff --git a/src/sbbs3/logout.cpp b/src/sbbs3/logout.cpp
index d2df4e4d2242003b4945d74460bfd9676009bb85..25c7a07de80fbf6a346afb94884ed74746a09b4f 100644
--- a/src/sbbs3/logout.cpp
+++ b/src/sbbs3/logout.cpp
@@ -149,7 +149,7 @@ void sbbs_t::logout()
 	answertime=now; // In case we're re-logging on
 
 #ifdef _WIN32
-	if(startup->sound.logout[0] && !(startup->options&BBS_OPT_MUTE))
+	if(startup->sound.logout[0] && !sound_muted(&cfg))
 		PlaySound(startup->sound.logout, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index 1134be59bff87c178f8bf1f37ec0027322446ae5..a2dd7d4c95997884839978b0ad8aad7f515dad2e 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -958,7 +958,7 @@ static void badlogin(SOCKET sock, CRYPT_SESSION sess, const char* prot, const ch
 		if(startup->login_attempt.hack_threshold && count>=startup->login_attempt.hack_threshold) {
 			hacklog(&scfg, reason, user, passwd, host, addr);
 #ifdef _WIN32
-			if(startup->sound.hack[0] && !(startup->options&MAIL_OPT_MUTE)) 
+			if(startup->sound.hack[0] && !sound_muted(&scfg)) 
 				PlaySound(startup->sound.hack, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 		}
@@ -1028,7 +1028,7 @@ static void pop3_thread(void* arg)
 		lprintf(LOG_DEBUG,"%04d %s session thread started", socket, client.protocol);
 
 #ifdef _WIN32
-	if(startup->pop3_sound[0] && !(startup->options&MAIL_OPT_MUTE)) 
+	if(startup->pop3_sound[0] && !sound_muted(&scfg)) 
 		PlaySound(startup->pop3_sound, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
@@ -1344,7 +1344,7 @@ static void pop3_thread(void* arg)
 		SAFEPRINTF2(str,"%s: %s", client.protocol, user.alias);
 		status(str);
 #ifdef _WIN32
-		if(startup->sound.login[0] && !(startup->options&MAIL_OPT_MUTE)) 
+		if(startup->sound.login[0] && !sound_muted(&scfg)) 
 			PlaySound(startup->sound.login, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 		SAFEPRINTF(smb.file,"%smail",scfg.data_dir);
@@ -1715,7 +1715,7 @@ static void pop3_thread(void* arg)
 		}
 		if(user.number) {
 #ifdef _WIN32
-			if(startup->sound.logout[0] && !(startup->options&MAIL_OPT_MUTE)) 
+			if(startup->sound.logout[0] && !sound_muted(&scfg)) 
 				PlaySound(startup->sound.logout, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 			if(!logoutuserdat(&scfg,&user,time(NULL),client.time))
@@ -2935,7 +2935,7 @@ static void smtp_thread(void* arg)
 	lprintf(LOG_DEBUG,"%04d %s Session thread started", socket, client.protocol);
 
 #ifdef _WIN32
-	if(startup->inbound_sound[0] && !(startup->options&MAIL_OPT_MUTE)) 
+	if(startup->inbound_sound[0] && !sound_muted(&scfg)) 
 		PlaySound(startup->inbound_sound, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 	SAFEPRINTF(domain_list,"%sdomains.cfg",scfg.ctrl_dir);
@@ -4218,7 +4218,7 @@ static void smtp_thread(void* arg)
 			SAFEPRINTF(client_id, "<%s>", relay_user.alias);
 			sockprintf(socket,client.protocol,session,auth_ok);
 #ifdef _WIN32
-			if(startup->sound.login[0] && !(startup->options&MAIL_OPT_MUTE)) 
+			if(startup->sound.login[0] && !sound_muted(&scfg)) 
 				PlaySound(startup->sound.login, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 			continue;
@@ -4316,7 +4316,7 @@ static void smtp_thread(void* arg)
 			SAFEPRINTF(client_id, "<%s>", relay_user.alias);
 			sockprintf(socket,client.protocol,session,auth_ok);
 #ifdef _WIN32
-			if(startup->sound.login[0] && !(startup->options&MAIL_OPT_MUTE)) 
+			if(startup->sound.login[0] && !sound_muted(&scfg)) 
 				PlaySound(startup->sound.login, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 			continue;
@@ -5037,7 +5037,7 @@ static void smtp_thread(void* arg)
 
 #ifdef _WIN32
 	if(relay_user.number) {
-		if(startup->sound.logout[0] && !(startup->options&MAIL_OPT_MUTE)) 
+		if(startup->sound.logout[0] && !sound_muted(&scfg)) 
 			PlaySound(startup->sound.logout, NULL, SND_ASYNC|SND_FILENAME);
 	}
 #endif
@@ -5605,7 +5605,7 @@ static void sendmail_thread(void* arg)
 			SAFEPRINTF2(str,"Sending (%u of %u)", u+1, msgs);
 			status(str);
 #ifdef _WIN32
-			if(startup->outbound_sound[0] && !(startup->options&MAIL_OPT_MUTE)) 
+			if(startup->outbound_sound[0] && !sound_muted(&scfg)) 
 				PlaySound(startup->outbound_sound, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index 3e9c2ca292d40e0f17709f7dd4cae8d262dccf3d..c397eaafb4ecc7a15b88ca9bad32232a4c043c15 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -4386,7 +4386,7 @@ void node_thread(void* arg)
 	}
 
 #ifdef _WIN32
-	if(startup->sound.hangup[0] && !(startup->options&BBS_OPT_MUTE))
+	if(startup->sound.hangup[0] && !sound_muted(&scfg))
 		PlaySound(startup->sound.hangup, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
@@ -5337,7 +5337,7 @@ NO_SSH:
 		}
 
 #ifdef _WIN32
-		if(startup->sound.answer[0] && !(startup->options&BBS_OPT_MUTE))
+		if(startup->sound.answer[0] && !sound_muted(&scfg))
 			PlaySound(startup->sound.answer, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
diff --git a/src/sbbs3/ntsvcs.c b/src/sbbs3/ntsvcs.c
index 97083e4076db135280524ab1c4c8cc0b65155522..6e55acf4dd34ca60f9b4821a2bf3d3787f01c0cf 100644
--- a/src/sbbs3/ntsvcs.c
+++ b/src/sbbs3/ntsvcs.c
@@ -185,12 +185,6 @@ static void svc_ctrl_handler(sbbs_ntsvc_t* svc, DWORD dwCtrlCode)
 		case SERVICE_CONTROL_RECYCLE:
 			*svc->recycle_now=TRUE;
 			break;
-		case SERVICE_CONTROL_MUTE:
-			*svc->options|=BBS_OPT_MUTE;
-			break;
-		case SERVICE_CONTROL_UNMUTE:
-			*svc->options&=~BBS_OPT_MUTE;
-			break;
 		case SERVICE_CONTROL_STOP:
 		case SERVICE_CONTROL_SHUTDOWN:
 			svc->terminate();
@@ -632,14 +626,6 @@ static const char* control_desc(DWORD ctrl)
 		/* Synchronet-specific */
 		case SERVICE_CONTROL_RECYCLE:
 			return("Recycling");
-		case SERVICE_CONTROL_MUTE:
-			return("Muting");
-		case SERVICE_CONTROL_UNMUTE:
-			return("Un-muting");
-		case SERVICE_CONTROL_SYSOP_AVAILABLE:
-			return("Sysop Available");
-		case SERVICE_CONTROL_SYSOP_UNAVAILABLE:	
-			return("Sysop Unavailable");
 	}
 	SAFEPRINTF(str,"Control: %d", ctrl);
 	return(str);
@@ -1304,12 +1290,6 @@ int main(int argc, char** argv)
 
 		if(!stricmp(arg,"recycle"))
 			return control(argv[i+1],SERVICE_CONTROL_RECYCLE);
-
-		if(!stricmp(arg,"mute"))
-			return control(argv[i+1],SERVICE_CONTROL_MUTE);
-
-		if(!stricmp(arg,"unmute"))
-			return control(argv[i+1],SERVICE_CONTROL_UNMUTE);
 	}
 
 	if(start_services) {
@@ -1341,8 +1321,6 @@ int main(int argc, char** argv)
     printf("%-20s %s\n","start","to start services");
     printf("%-20s %s\n","stop","to stop services");
 	printf("%-20s %s\n","recycle","to recycle services");
-	printf("%-20s %s\n","mute","to mute (sounds of) services");
-	printf("%-20s %s\n","unmute","to unmute (sounds of) services");
 
 	printf("\nAvailable Services:\n\n");
 	printf("%-20s %s\n","Name","Description");
diff --git a/src/sbbs3/ntsvcs.h b/src/sbbs3/ntsvcs.h
index ee124af77bdc1129ba723c33cf4fb7df0947ccda..9a2fa2c8a0ad1d53b8507a29e9a609583d42fdc2 100644
--- a/src/sbbs3/ntsvcs.h
+++ b/src/sbbs3/ntsvcs.h
@@ -1,7 +1,5 @@
 /* Synchronet BBS Windows NT Service Names */
 
-/* $Id: ntsvcs.h,v 1.7 2018/03/20 03:36:11 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -46,10 +32,6 @@
 /* User-defined control codes */
 enum {
 	 SERVICE_CONTROL_RECYCLE=128
-	,SERVICE_CONTROL_MUTE
-	,SERVICE_CONTROL_UNMUTE
-	,SERVICE_CONTROL_SYSOP_AVAILABLE		/* BBS service only */
-	,SERVICE_CONTROL_SYSOP_UNAVAILABLE		/* BBS service only */
 };
 
 typedef struct {
@@ -59,4 +41,4 @@ typedef struct {
 	uint32_t	repeated;
 } log_msg_t;
 
-#endif	/* Don't add anything after this line */
\ No newline at end of file
+#endif	/* Don't add anything after this line */
diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index 30b5aa81dda88914d274b39168ba563ba62f2596..f2b0bc384f99af3b46fe262a104da2c089e88e96 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -326,7 +326,7 @@ static void badlogin(SOCKET sock, char* prot, char* user, char* passwd, char* ho
 	if(startup->login_attempt.hack_threshold && count>=startup->login_attempt.hack_threshold) {
 		hacklog(&scfg, reason, user, passwd, host, addr);
 #ifdef _WIN32
-		if(startup->sound.hack[0] && !(startup->options&BBS_OPT_MUTE))
+		if(startup->sound.hack[0] && !sound_muted(&scfg))
 			PlaySound(startup->sound.hack, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 	}
@@ -460,7 +460,7 @@ js_login(JSContext *cx, uintN argc, jsval *arglist)
 	JS_SET_RVAL(cx, arglist,BOOLEAN_TO_JSVAL(JS_TRUE));
 
 #ifdef _WIN32
-	if(startup->sound.login[0] && !(startup->options&BBS_OPT_MUTE)
+	if(startup->sound.login[0] && !sound_muted(&scfg)
 		&& !(service->options&BBS_OPT_MUTE))
 		PlaySound(startup->sound.login, NULL, SND_ASYNC|SND_FILENAME);
 #endif
@@ -1189,7 +1189,7 @@ static void js_service_thread(void* arg)
 		logoutuserdat(&scfg,&service_client.user,time(NULL),service_client.logintime);
 
 #ifdef _WIN32
-		if(startup->sound.logout[0] && !(startup->options&BBS_OPT_MUTE)
+		if(startup->sound.logout[0] && !sound_muted(&scfg)
 			&& !(service->options&BBS_OPT_MUTE))
 			PlaySound(startup->sound.logout, NULL, SND_ASYNC|SND_FILENAME);
 #endif
@@ -1200,7 +1200,7 @@ static void js_service_thread(void* arg)
 	update_clients();
 
 #ifdef _WIN32
-	if(startup->sound.hangup[0] && !(startup->options&BBS_OPT_MUTE)
+	if(startup->sound.hangup[0] && !sound_muted(&scfg)
 		&& !(service->options&BBS_OPT_MUTE))
 		PlaySound(startup->sound.hangup, NULL, SND_ASYNC|SND_FILENAME);
 #endif
@@ -1522,7 +1522,7 @@ static void native_service_thread(void* arg)
 	update_clients();
 
 #ifdef _WIN32
-	if(startup->sound.hangup[0] && !(startup->options&BBS_OPT_MUTE)
+	if(startup->sound.hangup[0] && !sound_muted(&scfg)
 		&& !(service->options&BBS_OPT_MUTE))
 		PlaySound(startup->sound.hangup, NULL, SND_ASYNC|SND_FILENAME);
 #endif
@@ -2292,7 +2292,7 @@ void services_thread(void* arg)
 					}
 
 	#ifdef _WIN32
-					if(startup->sound.answer[0] && !(startup->options&BBS_OPT_MUTE)
+					if(startup->sound.answer[0] && !sound_muted(&scfg)
 						&& !(service[i].options&BBS_OPT_MUTE))
 						PlaySound(startup->sound.answer, NULL, SND_ASYNC|SND_FILENAME);
 	#endif
diff --git a/src/sbbs3/startup.h b/src/sbbs3/startup.h
index a4365ce55ab57be737b2421acb6d284798a0a171..6c0c5cba3f7e41e0a7ff909bf1eb2fc9b5ec5e2e 100644
--- a/src/sbbs3/startup.h
+++ b/src/sbbs3/startup.h
@@ -185,12 +185,12 @@ static struct init_field {
 #define BBS_OPT_ALLOW_SSH			(1<<12)	/* Allow logins via BSD SSH			*/
 #define BBS_OPT_NO_DOS				(1<<13) /* Don't attempt to run 16-bit DOS programs */
 #define BBS_OPT_NO_NEWDAY_EVENTS	(1<<14)	/* Don't check for a new day in event thread */
-#define BBS_OPT_NO_TELNET		(1<<15)	/* Don't accept incoming telnet connections */
+#define BBS_OPT_NO_TELNET			(1<<15)	/* Don't accept incoming telnet connections */
 #define BBS_OPT_HAPROXY_PROTO   	(1<<26)	/* Incoming requests are via HAproxy */
 #define BBS_OPT_NO_RECYCLE			(1<<27)	/* Disable recycling of server		*/
 #define BBS_OPT_GET_IDENT			(1<<28)	/* Get Identity (RFC 1413)			*/
-#define BBS_OPT_NO_JAVASCRIPT		(1<<29)	/* JavaScript disabled				*/
-#define BBS_OPT_MUTE				(1<<31)	/* Mute sounds						*/
+#define BBS_OPT_NO_JAVASCRIPT		(1<<29)	/* JavaScript disabled - Not supported */
+#define BBS_OPT_MUTE				(1<<31)	/* Mute sounds - DEPRECATED (controlled via semfile) */
 
 /* bbs_startup_t.options bits that require re-init/recycle when changed */
 #define BBS_INIT_OPTS	(BBS_OPT_ALLOW_RLOGIN|BBS_OPT_ALLOW_SSH|BBS_OPT_NO_EVENTS|BBS_OPT_NO_SPY_SOCKETS \
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index 41304af1d0074f23cf9e5c996587fd9b84c27e81..83a1c87b711c5cba5418c52ac8f6dbaa2f262748 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -3688,6 +3688,25 @@ BOOL set_sysop_availability(scfg_t* scfg, BOOL available)
 	return remove(sysop_available_semfile(scfg)) == 0;
 }
 
+static char* sound_muted_semfile(scfg_t* scfg)
+{
+	static char semfile[MAX_PATH+1];
+	SAFEPRINTF(semfile, "%ssound.muted", scfg->ctrl_dir);
+	return semfile;
+}
+
+BOOL sound_muted(scfg_t* scfg)
+{
+	return fexist(sound_muted_semfile(scfg));
+}
+
+BOOL set_sound_muted(scfg_t* scfg, BOOL muted)
+{
+	if(muted)
+		return ftouch(sound_muted_semfile(scfg));
+	return remove(sound_muted_semfile(scfg)) == 0;
+}
+
 /************************************/
 /* user .ini file get/set functions */
 /************************************/
diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h
index 9dc1d7915f344a0e30370550440c64759a69213e..4155e9c9d2db90b2bc4b952dba8505dc8d175c44 100644
--- a/src/sbbs3/userdat.h
+++ b/src/sbbs3/userdat.h
@@ -128,6 +128,8 @@ DLLEXPORT time_t gettimeleft(scfg_t*, user_t*, time_t starttime);
 DLLEXPORT BOOL	check_name(scfg_t*, const char* name);
 DLLEXPORT BOOL	sysop_available(scfg_t*);
 DLLEXPORT BOOL	set_sysop_availability(scfg_t*, BOOL available);
+DLLEXPORT BOOL	sound_muted(scfg_t*);
+DLLEXPORT BOOL	set_sound_muted(scfg_t*, BOOL muted);
 
 DLLEXPORT int	lookup_user(scfg_t*, link_list_t*, const char* name);
 
diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c
index 1674fed09d3d9f2c66fd8611cd4beadb72b3c795..616024a914a2349cb7f64e2cba1ff560620a8804 100644
--- a/src/sbbs3/websrvr.c
+++ b/src/sbbs3/websrvr.c
@@ -1619,7 +1619,7 @@ void http_logoff(http_session_t* session, SOCKET socket, int line)
 	session->last_user_num=session->user.number;
 
 #ifdef _WIN32
-	if(startup->sound.logout[0] && !(startup->options&BBS_OPT_MUTE))
+	if(startup->sound.logout[0] && !sound_muted(&scfg))
 		PlaySound(startup->sound.logout, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 }
@@ -1847,7 +1847,7 @@ static void badlogin(SOCKET sock, const char* prot, const char* user, const char
 	if(startup->login_attempt.hack_threshold && count>=startup->login_attempt.hack_threshold) {
 		hacklog(&scfg, reason, user, passwd, host, addr);
 #ifdef _WIN32
-		if(startup->sound.hack[0] && !(startup->options&BBS_OPT_MUTE))
+		if(startup->sound.hack[0] && !sound_muted(&scfg))
 			PlaySound(startup->sound.hack, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 	}
@@ -2015,7 +2015,7 @@ static BOOL check_ars(http_session_t * session)
 		,session->socket,session->req.auth.username,session->req.ars);
 
 #ifdef _WIN32
-	if(startup->sound.hack[0] && !(startup->options&BBS_OPT_MUTE))
+	if(startup->sound.hack[0] && !sound_muted(&scfg))
 		PlaySound(startup->sound.hack, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
@@ -5447,7 +5447,7 @@ js_login(JSContext *cx, uintN argc, jsval *arglist)
 	JS_SET_RVAL(cx, arglist,BOOLEAN_TO_JSVAL(JS_TRUE));
 
 #ifdef _WIN32
-	if(startup->sound.login[0] && !(startup->options&BBS_OPT_MUTE))
+	if(startup->sound.login[0] && !sound_muted(&scfg))
 		PlaySound(startup->sound.login, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
@@ -6383,7 +6383,7 @@ void http_session_thread(void* arg)
 		lprintf(LOG_DEBUG,"%04d !!! DANGER WILL ROBINSON, DANGER !!!", session.socket);
 
 #ifdef _WIN32
-	if(startup->sound.answer[0] && !(startup->options&BBS_OPT_MUTE))
+	if(startup->sound.answer[0] && !sound_muted(&scfg))
 		PlaySound(startup->sound.answer, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
@@ -6621,7 +6621,7 @@ void http_session_thread(void* arg)
 	}
 
 #ifdef _WIN32
-	if(startup->sound.hangup[0] && !(startup->options&BBS_OPT_MUTE))
+	if(startup->sound.hangup[0] && !sound_muted(&scfg))
 		PlaySound(startup->sound.hangup, NULL, SND_ASYNC|SND_FILENAME);
 #endif