diff --git a/exec/str_cmds.js b/exec/str_cmds.js
index 7f847935487c75a79303a3771e09a11ef82e918c..315a78555ab97b2865eac725aad7ea355875b0cf 100644
--- a/exec/str_cmds.js
+++ b/exec/str_cmds.js
@@ -820,6 +820,29 @@ function str_cmds(str)
 					console.printfile(plan);
 			}
 		}
+
+		if(str=="HELP") {
+			writeln("SIG\tEdit or delete your default message signature.");
+			writeln("SUBSIG\tEdit or delete your signature for this sub-board (over-rides default).");
+		}
+		if(str=="SIG" || str=="SUBSIG") {
+			var userSigFilename = system.data_dir + "user/" + format("%04u", user.number);
+			if(str == "SUBSIG")
+				userSigFilename += "." + bbs.cursub_code;
+			userSigFilename += ".sig";
+			if (file_exists(userSigFilename)) {
+				if (console.yesno(bbs.text(bbs.text.ViewSignatureQ)))
+					console.printfile(userSigFilename);
+			}
+			if (console.yesno(bbs.text(bbs.text.CreateEditSignatureQ)))
+				console.editfile(userSigFilename);
+			else if (!console.aborted) {
+				if (file_exists(userSigFilename)) {
+					if (console.yesno(bbs.text(bbs.text.DeleteSignatureQ)))
+						file_remove(userSigFilename);
+				}
+			}
+		}
 	}
 
 	if(str=="HELP") {
diff --git a/src/sbbs3/writemsg.cpp b/src/sbbs3/writemsg.cpp
index ef42e8d68afcd8ed2aec2151d44807f12610824d..2b4d95cafcfd82948bf1e1667bd108e0aff452ea 100644
--- a/src/sbbs3/writemsg.cpp
+++ b/src/sbbs3/writemsg.cpp
@@ -750,7 +750,13 @@ bool sbbs_t::writemsg(const char *fname, const char *top, char *subj, int mode,
 		/* Signature file */
 		if ((subnum == INVALID_SUB && cfg.msg_misc & MM_EMAILSIG)
 		    || (subnum != INVALID_SUB && !(cfg.sub[subnum]->misc & SUB_NOUSERSIG))) {
-			SAFEPRINTF2(str, "%suser/%04u.sig", cfg.data_dir, useron.number);
+			bool got_sig = false;
+			if (subnum_is_valid(subnum)) {
+				snprintf(str, sizeof str, "%suser/%04u.%s.sig", cfg.data_dir, useron.number, cfg.sub[subnum]->code);
+				got_sig = fexistcase(str);
+			}
+			if (!got_sig)
+				SAFEPRINTF2(str, "%suser/%04u.sig", cfg.data_dir, useron.number);
 			FILE* sig;
 			if (fexistcase(str) && (sig = fopen(str, "r")) != NULL) {
 				while (!feof(sig)) {