diff --git a/src/sbbs3/atcodes.cpp b/src/sbbs3/atcodes.cpp
index cecbfe452e4e6b9dd6f4044486fa5e3e6cbc6b23..e4314e6c2139c3c5414bcee523a4654bb96141c1 100644
--- a/src/sbbs3/atcodes.cpp
+++ b/src/sbbs3/atcodes.cpp
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2014 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -55,6 +55,7 @@ int sbbs_t::show_atcode(const char *instr)
 	int		disp_len;
 	bool	padded_left=false;
 	bool	padded_right=false;
+	bool	centered=false;
 	const char *cp;
 
 	SAFECOPY(str,instr);
@@ -73,6 +74,8 @@ int sbbs_t::show_atcode(const char *instr)
 		padded_left=true;
 	else if((p=strstr(sp,"-R"))!=NULL)
 		padded_right=true;
+	else if((p=strstr(sp,"-C"))!=NULL)
+		centered=true;
 	if(p!=NULL) {
 		if(*(p+2) && isdigit(*(p+2)))
 			disp_len=atoi(p+2);
@@ -87,7 +90,14 @@ int sbbs_t::show_atcode(const char *instr)
 		bprintf("%-*.*s",disp_len,disp_len,cp);
 	else if(padded_right)
 		bprintf("%*.*s",disp_len,disp_len,cp);
-	else
+	else if(centered) {
+		size_t vlen = strlen(cp);
+		if(vlen < disp_len) {
+			int left = (disp_len - vlen) / 2;
+			bprintf("%*s%-*s", left, "", disp_len - left, cp);
+		} else
+			bputs(cp);
+	} else
 		bputs(cp);
 
 	return(len);
@@ -969,6 +979,9 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen)
 		return(current_msg->subj==NULL ? nulstr : current_msg->subj);
 	if(!strcmp(sp,"MSG_DATE") && current_msg!=NULL)
 		return(timestr(current_msg->hdr.when_written.time));
+	if(!strcmp(sp,"MSG_AGE") && current_msg!=NULL)
+		return age_of_posted_item(str, maxlen
+			, current_msg->hdr.when_written.time - (smb_tzutc(current_msg->hdr.when_written.zone) * 60));
 	if(!strcmp(sp,"MSG_TIMEZONE") && current_msg!=NULL)
 		return(smb_zonestr(current_msg->hdr.when_written.zone,NULL));
 	if(!strcmp(sp,"MSG_ATTR") && current_msg!=NULL) {
@@ -1033,6 +1046,8 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen)
 			safe_snprintf(str,maxlen,"%s %s"
 				,cfg.grp[cfg.sub[smb.subnum]->grp]->sname
 				,cfg.sub[smb.subnum]->sname);
+		else
+			strncpy(str, "Email", maxlen);
 		return(str);
 	}
 	if(!strcmp(sp,"SMB_AREA_DESC")) {
@@ -1040,6 +1055,8 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen)
 			safe_snprintf(str,maxlen,"%s %s"
 				,cfg.grp[cfg.sub[smb.subnum]->grp]->lname
 				,cfg.sub[smb.subnum]->lname);
+		else
+			strncpy(str, "Personal Email", maxlen);
 		return(str);
 	}
 	if(!strcmp(sp,"SMB_GROUP")) {