diff --git a/ctrl/text.dat b/ctrl/text.dat
index 7c26cb20573f113c9438f7f0124c7651b49b363f..21bb08f7a99889fe922e30d6bebf64eb56dd38fa 100644
--- a/ctrl/text.dat
+++ b/ctrl/text.dat
@@ -508,8 +508,8 @@
 "UNUSED416"                                                 416 Unused416
 "UNUSED417"                                                 417 Unused417
 "\7\r\nNo user data defined.\r\n"                       418 NoUserData
-"\1r\1h\xAE\xAE\xAE \1iDELETED\1n\1r\1h \xAF\xAF\xAF\r\n"    419 Deleted
-"\1b\1h\xAE\xAE\xAE \1iINACTIVE\1n\1b\1h \xAF\xAF\xAF\r\n"   420 Inactive
+"\1r\1h\xAE\xAE\xAE \1iDELETED\1n\1r\1h \xAF\xAF\xAF\r\n"    419 DeletedUser
+"\1b\1h\xAE\xAE\xAE \1iINACTIVE\1n\1b\1h \xAF\xAF\xAF\r\n"   420 InactiveUser
 "\1n\1cAlias     : \1h%-30.30s  \1n\1cPass \1h%s\1n\1c: "\   421 UeditAliasPassword
 	"\1h%s\r\n"
 "\1n\1cReal Name : \1h%-30.30s  \1n\1cPhone number : "\      422 UeditRealNamePhone
@@ -1109,4 +1109,10 @@
 "paging node %u for private chat"                          922 NodeActivityPagingNode
 "retrieving file from device #%d"                          923 NodeActivityRetrievingFile
 "performing custom activity"                               924 NodeActivityCustom
-"never"                                                    925 Never
\ No newline at end of file
+"never"                                                    925 Never
+"Deleting"                                                 926 Deleting
+"\1[\1>"                                                   927 DoneDeleting
+"Deleted"                                                  926 Deleted
+"@Deleted@ %d %s"                                          928 DeletedNumberItems
+"E-Mail"                                                   929 E_Mail
+"E-Mails"                                                  930 E_Mails
\ No newline at end of file
diff --git a/src/sbbs3/con_out.cpp b/src/sbbs3/con_out.cpp
index 86b2da1046048cab1562d0c6e7eeda14cd68f389..88f40c18f270bd3e23fc0e457a5c5d1e46c3c86d 100644
--- a/src/sbbs3/con_out.cpp
+++ b/src/sbbs3/con_out.cpp
@@ -99,6 +99,7 @@ int sbbs_t::bputs(const char *str, int mode)
 		}
 		if(!(mode&P_NOATCODES) && str[l]=='@') {
 			if(str==mnestr			/* Mnemonic string or */
+				|| (mode&P_ATCODES)	/* trusted parameters to formatted string */
 				|| (str>=text[0]	/* Straight out of TEXT.DAT */
 					&& str<=text[TOTAL_TEXT-1])) {
 				i=show_atcode(str+l);	/* return 0 if not valid @ code */
diff --git a/src/sbbs3/mail.cpp b/src/sbbs3/mail.cpp
index dfc3def5606c50a6a21df43936b1def07c775685..170fe9c60a46d0fa4e516c3116f3d11192c1f568 100644
--- a/src/sbbs3/mail.cpp
+++ b/src/sbbs3/mail.cpp
@@ -58,6 +58,7 @@ int sbbs_t::delmail(uint usernumber, int which)
 	}
 	smb_rewind(smb.sid_fp);
 	for(l=0;l<smb.status.total_msgs;) {
+		progress(text[Deleting], l, smb.status.total_msgs);
 		memset(&msg, 0, sizeof(msg));
 		if(smb_fread(&smb,&msg.idx,sizeof(idxrec_t),smb.sid_fp)!=sizeof(idxrec_t))
 			break;
@@ -98,6 +99,7 @@ int sbbs_t::delmail(uint usernumber, int which)
 		idxbuf[l]=msg.idx;
 		l++; 
 	}
+	bputs(text[DoneDeleting]);
 	smb_rewind(smb.sid_fp);
 	for(i=0;i<l;i++) {
 		if(smb_fwrite(&smb,&idxbuf[i],sizeof(idxrec_t),smb.sid_fp) != sizeof(idxrec_t)) {
@@ -158,7 +160,7 @@ void sbbs_t::telluser(smbmsg_t* msg)
 /************************************************************************/
 /* Deletes all mail waiting for user number 'usernumber'                */
 /************************************************************************/
-void sbbs_t::delallmail(uint usernumber, int which, bool permanent, int lm_mode)
+int sbbs_t::delallmail(uint usernumber, int which, bool permanent, int lm_mode)
 {
 	int 		i;
 	int			deleted=0;
@@ -168,7 +170,7 @@ void sbbs_t::delallmail(uint usernumber, int which, bool permanent, int lm_mode)
 
 	if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) {
 		errormsg(WHERE,ERR_OPEN,"MAIL",i);
-		return; 
+		return 0;
 	}
 	snprintf(smb.file, sizeof smb.file, "%smail",cfg.data_dir);
 	smb.retry_time=cfg.smb_retry_time;
@@ -176,23 +178,24 @@ void sbbs_t::delallmail(uint usernumber, int which, bool permanent, int lm_mode)
 	if((i=smb_open(&smb))!=0) {
 		errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error);
 		smb_stack(&smb,SMB_STACK_POP);
-		return; 
+		return 0;
 	}
 
 	mail=loadmail(&smb,&msgs,usernumber,which,lm_mode);
 	if(!msgs) {
 		smb_close(&smb);
 		smb_stack(&smb,SMB_STACK_POP);
-		return; 
+		return 0;
 	}
 	if((i=smb_locksmbhdr(&smb))!=0) {			/* Lock the base, so nobody */
 		smb_close(&smb);
 		smb_stack(&smb,SMB_STACK_POP);
 		free(mail);
 		errormsg(WHERE,ERR_LOCK,smb.file,i,smb.last_error);	/* messes with the index */
-		return; 
+		return 0;
 	}
 	for(u=0;u<msgs;u++) {
+		progress(text[Deleting], u, msgs);
 		msg.idx.offset=0;						/* search by number */
 		if((mail[u].attr&MSG_PERMANENT) && !permanent)
 			continue;
@@ -208,6 +211,7 @@ void sbbs_t::delallmail(uint usernumber, int which, bool permanent, int lm_mode)
 			smb_unlockmsghdr(&smb,&msg); 
 		} 
 	}
+	bputs(text[DoneDeleting]);
 
 	if(msgs)
 		free(mail);
@@ -216,5 +220,5 @@ void sbbs_t::delallmail(uint usernumber, int which, bool permanent, int lm_mode)
 	smb_unlocksmbhdr(&smb);
 	smb_close(&smb);
 	smb_stack(&smb,SMB_STACK_POP);
+	return deleted;
 }
-
diff --git a/src/sbbs3/readmail.cpp b/src/sbbs3/readmail.cpp
index 48c2d7cb6798e298333ee2ccb5dcb5af104a7b12..d89c361697d72244a42359923c35d54136810e2b 100644
--- a/src/sbbs3/readmail.cpp
+++ b/src/sbbs3/readmail.cpp
@@ -416,7 +416,7 @@ int sbbs_t::readmail(uint usernumber, int which, int lm_mode)
 			case 'K':	/* Kill All Mail */
 				SAFEPRINTF(str,text[DeleteMailQ],"everyone");
 				if(!noyes(str))
-					delallmail(usernumber, which, /* permanent: */false, lm_mode);
+					bprintf(P_ATCODES, text[DeletedNumberItems], delallmail(usernumber, which, /* permanent: */false, lm_mode), text[E_Mails]);
 				domsg=false;
 				break;
 			case 'F':  /* Forward last piece */
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index ff073a5a5dc109d93070f631c2cb5bf766f28b55..078a9f1c079e236404a313fa5fbae4c67ff01a69 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -891,7 +891,7 @@ public:
 	/* mail.cpp */
 	int		delmail(uint usernumber,int which);
 	void	telluser(smbmsg_t* msg);
-	void	delallmail(uint usernumber, int which, bool permanent=true, int lm_mode = 0);
+	int		delallmail(uint usernumber, int which, bool permanent=true, int lm_mode = 0);
 
 	/* getmsg.cpp */
 	int		loadmsg(smbmsg_t *msg, uint number);
diff --git a/src/sbbs3/sbbsdefs.h b/src/sbbs3/sbbsdefs.h
index 6beb9f8c67d2c00dbed1cb60afacd74671c3de25..9baf4e383425bf34d2dae2b88ebc471fd091d991 100644
--- a/src/sbbs3/sbbsdefs.h
+++ b/src/sbbs3/sbbsdefs.h
@@ -694,6 +694,7 @@ typedef enum {						/* Values for xtrn_t.event				*/
 #define P_HIDEMARKS	(1<<17)		/* Hide the mark-up characters				*/
 #define P_REMOTE	(1<<18)		/* Only print when online == ON_REMOTE		*/
 #define P_INDENT	(1<<19)		/* Indent lines to current cursor column	*/
+#define P_ATCODES	(1<<20)		/* Trusted @-codes in formatted string		*/
 
 								/* Bits in 'mode' for listfiles             */
 #define FL_ULTIME   (1<<0)		/* List files by upload time                */
diff --git a/src/sbbs3/text.h b/src/sbbs3/text.h
index 82e0d8eee2fcb8d878e850ecdda70e40055cedf3..7f596c22fee464d23b00348a15f59f721852b989 100644
--- a/src/sbbs3/text.h
+++ b/src/sbbs3/text.h
@@ -435,8 +435,8 @@ enum text {
 	,Unused416
 	,Unused417
 	,NoUserData
-	,Deleted
-	,Inactive
+	,DeletedUser
+	,InactiveUser
 	,UeditAliasPassword
 	,UeditRealNamePhone
 	,UeditAddressBirthday
@@ -942,6 +942,12 @@ enum text {
 	,NodeActivityRetrievingFile
 	,NodeActivityCustom
 	,Never
+	,Deleting
+	,DoneDeleting
+	,Deleted
+	,DeletedNumberItems
+	,E_Mail
+	,E_Mails
 
 	,TOTAL_TEXT
 };
diff --git a/src/sbbs3/text_defaults.c b/src/sbbs3/text_defaults.c
index 465beb7c6154c3a7c0b6371290c1f2ca22c115bb..7cb84a7f02bb6fd20b802824bb9b65973790710a 100644
--- a/src/sbbs3/text_defaults.c
+++ b/src/sbbs3/text_defaults.c
@@ -695,8 +695,8 @@ const char * const text_defaults[TOTAL_TEXT]={
 	,"\x55\x4e\x55\x53\x45\x44\x34\x31\x36" // 416 Unused416
 	,"\x55\x4e\x55\x53\x45\x44\x34\x31\x37" // 417 Unused417
 	,"\x07\x0d\x0a\x4e\x6f\x20\x75\x73\x65\x72\x20\x64\x61\x74\x61\x20\x64\x65\x66\x69\x6e\x65\x64\x2e\x0d\x0a" // 418 NoUserData
-	,"\x01\x72\x01\x68\xae\xae\xae\x20\x01\x69\x44\x45\x4c\x45\x54\x45\x44\x01\x6e\x01\x72\x01\x68\x20\xaf\xaf\xaf\x0d\x0a" // 419 Deleted
-	,"\x01\x62\x01\x68\xae\xae\xae\x20\x01\x69\x49\x4e\x41\x43\x54\x49\x56\x45\x01\x6e\x01\x62\x01\x68\x20\xaf\xaf\xaf\x0d\x0a" // 420 Inactive
+	,"\x01\x72\x01\x68\xae\xae\xae\x20\x01\x69\x44\x45\x4c\x45\x54\x45\x44\x01\x6e\x01\x72\x01\x68\x20\xaf\xaf\xaf\x0d\x0a" // 419 DeletedUser
+	,"\x01\x62\x01\x68\xae\xae\xae\x20\x01\x69\x49\x4e\x41\x43\x54\x49\x56\x45\x01\x6e\x01\x62\x01\x68\x20\xaf\xaf\xaf\x0d\x0a" // 420 InactiveUser
 	,"\x01\x6e\x01\x63\x41\x6c\x69\x61\x73\x20\x20\x20\x20\x20\x3a\x20\x01\x68\x25\x2d\x33\x30\x2e\x33\x30\x73\x20\x20\x01\x6e\x01\x63"
 		"\x50\x61\x73\x73\x20\x01\x68\x25\x73\x01\x6e\x01\x63\x3a\x20\x01\x68\x25\x73\x0d\x0a" // 421 UeditAliasPassword
 	,"\x01\x6e\x01\x63\x52\x65\x61\x6c\x20\x4e\x61\x6d\x65\x20\x3a\x20\x01\x68\x25\x2d\x33\x30\x2e\x33\x30\x73\x20\x20\x01\x6e\x01\x63"
@@ -1488,4 +1488,10 @@ const char * const text_defaults[TOTAL_TEXT]={
 	,"\x72\x65\x74\x72\x69\x65\x76\x69\x6e\x67\x20\x66\x69\x6c\x65\x20\x66\x72\x6f\x6d\x20\x64\x65\x76\x69\x63\x65\x20\x23\x25\x64" // 923 NodeActivityRetrievingFile
 	,"\x70\x65\x72\x66\x6f\x72\x6d\x69\x6e\x67\x20\x63\x75\x73\x74\x6f\x6d\x20\x61\x63\x74\x69\x76\x69\x74\x79" // 924 NodeActivityCustom
 	,"\x6e\x65\x76\x65\x72" // 925 Never
+	,"\x44\x65\x6c\x65\x74\x69\x6e\x67" // 926 Deleting
+	,"\x01\x5b\x01\x3e" // 927 DoneDeleting
+	,"\x44\x65\x6c\x65\x74\x65\x64" // 926 Deleted
+	,"\x40\x44\x65\x6c\x65\x74\x65\x64\x40\x20\x25\x64\x20\x25\x73" // 928 DeletedNumberItems
+	,"\x45\x2d\x4d\x61\x69\x6c" // 929 E_Mail
+	,"\x45\x2d\x4d\x61\x69\x6c\x73" // 930 E_Mails
 };
diff --git a/src/sbbs3/text_id.c b/src/sbbs3/text_id.c
index 7b195f4f8775b6de5985b1f84f3883baffcd0e69..e397e235041ecfdb18bad974e7bcc516f4974d1c 100644
--- a/src/sbbs3/text_id.c
+++ b/src/sbbs3/text_id.c
@@ -419,8 +419,8 @@ const char* const text_id[]={
 	,"Unused416"
 	,"Unused417"
 	,"NoUserData"
-	,"Deleted"
-	,"Inactive"
+	,"DeletedUser"
+	,"InactiveUser"
 	,"UeditAliasPassword"
 	,"UeditRealNamePhone"
 	,"UeditAddressBirthday"
@@ -926,4 +926,10 @@ const char* const text_id[]={
 	,"NodeActivityRetrievingFile"
 	,"NodeActivityCustom"
 	,"Never"
+	,"Deleting"
+	,"DoneDeleting"
+	,"Deleted"
+	,"DeletedNumberItems"
+	,"E_Mail"
+	,"E_Mails"
 };
diff --git a/src/sbbs3/useredit.cpp b/src/sbbs3/useredit.cpp
index 9bc3bc0d731273853c854fe23945c891d2ff8fef..726b87f9acdbe3e7b9ffac9f9d934f1328e70237 100644
--- a/src/sbbs3/useredit.cpp
+++ b/src/sbbs3/useredit.cpp
@@ -149,9 +149,9 @@ void sbbs_t::useredit(int usernumber)
 		if(lncntr>=rows-2)
 			lncntr=0;
 		if(user.misc&DELETED)
-			center(text[Deleted]);
+			center(text[DeletedUser]);
 		else if(user.misc&INACTIVE)
-			center(text[Inactive]);
+			center(text[InactiveUser]);
 		else
 			CRLF;
 		l=lastuser(&cfg);
@@ -1168,7 +1168,7 @@ void sbbs_t::purgeuser(int usernumber)
 	getuserdat(&cfg,&user);
 	SAFEPRINTF2(str,"Purged %s #%u",user.alias,usernumber);
 	logentry("!*",str);
-	delallmail(usernumber, MAIL_ANY);
+	bprintf(P_ATCODES, text[DeletedNumberItems], delallmail(usernumber, MAIL_ANY), text[E_Mails]);
 	putusername(&cfg,usernumber,nulstr);
 	putusermisc(usernumber, user.misc | DELETED);
 }