diff --git a/src/sbbs3/newuser.cpp b/src/sbbs3/newuser.cpp
index 145d8d2b026b0cc3a8f771bab6111e3c7d7df412..c0358676d73370177d5439bd51ebe5dc7feee514 100644
--- a/src/sbbs3/newuser.cpp
+++ b/src/sbbs3/newuser.cpp
@@ -468,6 +468,9 @@ void sbbs_t::newuser()
 	remove(str);
 	sprintf(str,"%suser/%04u.msg",cfg.data_dir,useron.number); /* delete ex-comment */
 	remove(str);
+	sprintf(str,"%suser/%04u.sig",cfg.data_dir,useron.number); /* delete signature */
+	remove(str);
+
 	if(cfg.newuser_mod[0])
 		exec_bin(cfg.newuser_mod,&main_csi);
 	user_event(EVENT_NEWUSER);
diff --git a/src/sbbs3/useredit.cpp b/src/sbbs3/useredit.cpp
index e34c43dd5b9b3d8c81ffae9a72e53ccd9bafa4f9..365a0ada19283f4216d7b676bab1678abe695abb 100644
--- a/src/sbbs3/useredit.cpp
+++ b/src/sbbs3/useredit.cpp
@@ -948,45 +948,49 @@ void sbbs_t::maindflts(user_t* user)
 				putuserrec(&cfg,user->number,U_MISC,8,ultoa(user->misc,str,16));
 				break;
 			case 'W':
-				if(noyes(text[NewPasswordQ]))
-					break;
-				bputs(text[CurrentPassword]);
-				console|=CON_R_ECHOX;
-				if(!(cfg.sys_misc&SM_ECHO_PW))
-					console|=CON_L_ECHOX;
-				ch=getstr(str,LEN_PASS,K_UPPER);
-				console&=~(CON_R_ECHOX|CON_L_ECHOX);
-				if(strcmp(str,user->pass)) {
-					bputs(text[WrongPassword]);
-					pause();
-					break; }
-				bputs(text[NewPassword]);
-				if(!getstr(str,LEN_PASS,K_UPPER|K_LINE))
-					break;
-				truncsp(str);
-				if(!chkpass(str,user,false)) {
-					CRLF;
-					pause();
-					break; }
-				bputs(text[VerifyPassword]);
-				console|=CON_R_ECHOX;
-				if(!(cfg.sys_misc&SM_ECHO_PW))
-					console|=CON_L_ECHOX;
-				getstr(tmp,LEN_PASS,K_UPPER);
-				console&=~(CON_R_ECHOX|CON_L_ECHOX);
-				if(strcmp(str,tmp)) {
-					bputs(text[WrongPassword]);
-					pause();
-					break; }
-				if(!online)
-					break;
-				putuserrec(&cfg,user->number,U_PASS,LEN_PASS,str);
-				now=time(NULL);
-				putuserrec(&cfg,user->number,U_PWMOD,8,ultoa(now,tmp,16));
-				bputs(text[PasswordChanged]);
-				sprintf(str,"%s changed password",useron.alias);
-				logline(nulstr,str);
-				pause();
+				if(!noyes(text[NewPasswordQ])) {
+					bputs(text[CurrentPassword]);
+					console|=CON_R_ECHOX;
+					if(!(cfg.sys_misc&SM_ECHO_PW))
+						console|=CON_L_ECHOX;
+					ch=getstr(str,LEN_PASS,K_UPPER);
+					console&=~(CON_R_ECHOX|CON_L_ECHOX);
+					if(strcmp(str,user->pass)) {
+						bputs(text[WrongPassword]);
+						pause();
+						break; }
+					bputs(text[NewPassword]);
+					if(!getstr(str,LEN_PASS,K_UPPER|K_LINE))
+						break;
+					truncsp(str);
+					if(!chkpass(str,user,false)) {
+						CRLF;
+						pause();
+						break; }
+					bputs(text[VerifyPassword]);
+					console|=CON_R_ECHOX;
+					if(!(cfg.sys_misc&SM_ECHO_PW))
+						console|=CON_L_ECHOX;
+					getstr(tmp,LEN_PASS,K_UPPER);
+					console&=~(CON_R_ECHOX|CON_L_ECHOX);
+					if(strcmp(str,tmp)) {
+						bputs(text[WrongPassword]);
+						pause();
+						break; }
+					if(!online)
+						break;
+					putuserrec(&cfg,user->number,U_PASS,LEN_PASS,str);
+					now=time(NULL);
+					putuserrec(&cfg,user->number,U_PWMOD,8,ultoa(now,tmp,16));
+					bputs(text[PasswordChanged]);
+					sprintf(str,"%s changed password",useron.alias);
+					logline(nulstr,str);
+				}
+				sprintf(str,"%suser/%04u.sig",cfg.data_dir,user->number);
+				if(!noyes("Create/Edit signature"))
+					editfile(str);
+				else if(fexist(str) && !noyes("Delete signature"))
+					remove(str);
 				break;
 			case 'Z':
 				menu("dlprot");
diff --git a/src/sbbs3/writemsg.cpp b/src/sbbs3/writemsg.cpp
index 86a07336c31cfb626b2240a15c3a70d8ad55c7e9..483891f29bddaf5e2caf06304acab4fb88a609b9 100644
--- a/src/sbbs3/writemsg.cpp
+++ b/src/sbbs3/writemsg.cpp
@@ -402,6 +402,21 @@ bool sbbs_t::writemsg(char *fname, char *top, char *title, long mode, int subnum
 
 	if(buf[l])
 		bputs(text[NoMoreLines]);
+
+	/* Signature file */
+	sprintf(str,"%suser/%04u.sig",cfg.data_dir,useron.number);
+	FILE* sig;
+	if(!(mode&WM_EXTDESC) && fexist(str) && (sig=fopen(str,"rb"))!=NULL) {
+		while(!feof(sig)) {
+			if(!fgets(str,sizeof(str)-1,sig))
+				break;
+			fputs(str,stream);
+			l+=strlen(str);	/* byte counter */
+			i++;			/* line counter */
+		}
+		fclose(sig);
+	}
+
 	fclose(stream);
 	LFREE((char *)buf);
 	bprintf(text[SavedNBytes],l,i);