diff --git a/src/sbbs3/atcodes.cpp b/src/sbbs3/atcodes.cpp
index a71b2e0ce79a70c22b5ea57f6fef9b70e7085d8d..4de6ffe1b64bffc274fe3e86a4370df3da55e681 100644
--- a/src/sbbs3/atcodes.cpp
+++ b/src/sbbs3/atcodes.cpp
@@ -43,17 +43,14 @@ extern "C" const char* beta_version;
 /****************************************************************************/
 /* Returns 0 if invalid @ code. Returns length of @ code if valid.          */
 /****************************************************************************/
-int sbbs_t::atcodes(char *instr)
+int sbbs_t::show_atcode(char *instr)
 {
 	char	str[128],str2[128],*p,*tp,*sp;
-    int     i,len;
-	long	l;
-    stats_t stats;
-    node_t  node;
-	struct	tm tm;
-	struct	tm * tm_p;
+    int     len;
+	bool	padded_left=false;
+	bool	padded_right=false;
 
-	sprintf(str,"%.40s",instr);
+	sprintf(str,"%.80s",instr);
 	tp=strchr(str+1,'@');
 	if(!tp)                 /* no terminating @ */
 		return(0);
@@ -64,44 +61,79 @@ int sbbs_t::atcodes(char *instr)
 	(*tp)=0;
 	sp=(str+1);
 
+	if((p=strstr(sp,"-L"))!=NULL)
+		padded_left=true;
+	else if((p=strstr(sp,"-R"))!=NULL)
+		padded_right=true;
+	if(p!=NULL)
+		*p=0;
+
+	p=atcode(sp,str2);
+	if(p==NULL)
+		return(0);
+
+	if(padded_left)
+		rprintf("%-*.*s",len,len,p);
+	else if(padded_right)
+		rprintf("%*.*s",len,len,p);
+	else
+		rputs(p);
+
+	return(len);
+}
+
+char* sbbs_t::atcode(char* sp, char* str)
+{
+	char*	tp;
+	uint	i;
+	long	l;
+    stats_t stats;
+    node_t  node;
+	struct	tm tm;
+	struct	tm * tm_p;
+
+	str[0]=0;
+
 	if(!strcmp(sp,"VER"))
-		bputs(VERSION);
+		return(VERSION);
 
-	else if(!strcmp(sp,"REV"))
-		bprintf("%c",REVISION);
+	if(!strcmp(sp,"REV")) {
+		sprintf(str,"%c",REVISION);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"FULL_VER")) {
-		sprintf(str2,"%s%c%s",VERSION,REVISION,beta_version);
-		truncsp(str2);
+	if(!strcmp(sp,"FULL_VER")) {
+		sprintf(str,"%s%c%s",VERSION,REVISION,beta_version);
+		truncsp(str);
 #if defined(_DEBUG)
-		strcat(str2," Debug");
+		strcat(str," Debug");
 #endif
-		bputs(str2);
+		return(str);
 	}
 
-	else if(!strcmp(sp,"VER_NOTICE")) 
-		bputs(VERSION_NOTICE);
+	if(!strcmp(sp,"VER_NOTICE")) 
+		return(VERSION_NOTICE);
 
-	else if(!strcmp(sp,"OS_VER"))
-		bputs(os_version(str2));
+	if(!strcmp(sp,"OS_VER"))
+		return(os_version(str));
 
 #ifdef JAVASCRIPT
-	else if(!strcmp(sp,"JS_VER"))
-		bputs((char *)JS_GetImplementationVersion());
+	if(!strcmp(sp,"JS_VER"))
+		return((char *)JS_GetImplementationVersion());
 #endif
 
-	else if(!strcmp(sp,"PLATFORM"))
-		bputs(PLATFORM_DESC);
+	if(!strcmp(sp,"PLATFORM"))
+		return(PLATFORM_DESC);
 
-	else if(!strcmp(sp,"COPYRIGHT"))
-		bputs(COPYRIGHT_NOTICE);
+	if(!strcmp(sp,"COPYRIGHT"))
+		return(COPYRIGHT_NOTICE);
 
-	else if(!strcmp(sp,"COMPILER")) {
-		COMPILER_DESC(str2);
-		bputs(str2);
+	if(!strcmp(sp,"COMPILER")) {
+		COMPILER_DESC(str);
+		return(str);
 	}
 
-	else if(!strcmp(sp,"UPTIME")) {
+	if(!strcmp(sp,"UPTIME")) {
 		extern time_t uptime;
 		time_t up=time(NULL)-uptime;
 		if(up<0)
@@ -111,640 +143,764 @@ int sbbs_t::atcodes(char *instr)
 	        sprintf(days,"%u days ",up/(24*60*60));
 			up%=(24*60*60);
 		}
-		bprintf("%s%u:%02u"
+		sprintf(str,"%s%u:%02u"
 	        ,days
 			,up/(60*60)
 			,(up/60)%60
 			);
+		return(str);
 	}
 
-	else if(!strcmp(sp,"SOCKET_LIB")) 
-		bputs(socklib_version(str2));
+	if(!strcmp(sp,"SOCKET_LIB")) 
+		return(socklib_version(str));
 
-	else if(!strcmp(sp,"MSG_LIB")) 
-		bprintf("SMBLIB %s",smb_lib_ver());
+	if(!strcmp(sp,"MSG_LIB")) {
+		sprintf(str,"SMBLIB %s",smb_lib_ver());
+		return(str);
+	}
 
-	else if(!strcmp(sp,"BBS") || !strcmp(sp,"BOARDNAME"))
-		bputs(cfg.sys_name);
+	if(!strcmp(sp,"BBS") || !strcmp(sp,"BOARDNAME"))
+		return(cfg.sys_name);
 
-	else if(!strcmp(sp,"BAUD") || !strcmp(sp,"BPS"))
-		bprintf("%lu",cur_rate);
+	if(!strcmp(sp,"BAUD") || !strcmp(sp,"BPS")) {
+		sprintf(str,"%lu",cur_rate);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"CONN"))
-		bputs(connection);
+	if(!strcmp(sp,"CONN"))
+		return(connection);
 
-	else if(!strcmp(sp,"SYSOP"))
-		bputs(cfg.sys_op);
+	if(!strcmp(sp,"SYSOP"))
+		return(cfg.sys_op);
 
-	else if(!strcmp(sp,"LOCATION"))
-		bputs(cfg.sys_location);
+	if(!strcmp(sp,"LOCATION"))
+		return(cfg.sys_location);
 
-	else if(!strcmp(sp,"NODE"))
-		bprintf("%u",cfg.node_num);
+	if(!strcmp(sp,"NODE")) {
+		sprintf(str,"%u",cfg.node_num);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"TNODE"))
-		bprintf("%u",cfg.sys_nodes);
+	if(!strcmp(sp,"TNODE")) {
+		sprintf(str,"%u",cfg.sys_nodes);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"INETADDR"))
-		bputs(cfg.sys_inetaddr);
+	if(!strcmp(sp,"INETADDR"))
+		return(cfg.sys_inetaddr);
 
-	else if(!strcmp(sp,"FIDOADDR")) {
+	if(!strcmp(sp,"FIDOADDR")) {
 		if(cfg.total_faddrs)
-			bputs(faddrtoa(cfg.faddr[0]));
+			return(faddrtoa(cfg.faddr[0]));
+		return(nulstr);
 	}
 
-	else if(!strcmp(sp,"EMAILADDR")) 
-		bputs(usermailaddr(&cfg, str
+	if(!strcmp(sp,"EMAILADDR")) 
+		return(usermailaddr(&cfg, str
 			,cfg.inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name));
 
-	else if(!strcmp(sp,"QWKID"))
-		bputs(cfg.sys_id);
+	if(!strcmp(sp,"QWKID"))
+		return(cfg.sys_id);
 
-	else if(!strcmp(sp,"TIME") || !strcmp(sp,"SYSTIME")) {
+	if(!strcmp(sp,"TIME") || !strcmp(sp,"SYSTIME")) {
 		now=time(NULL);
 		tm_p=gmtime(&now);
 		if(tm_p!=NULL)
 			tm=*tm_p;
 		else
 			memset(&tm,0,sizeof(tm));
-		bprintf("%02d:%02d %s"
+		sprintf(str,"%02d:%02d %s"
 			,tm.tm_hour==0 ? 12
 			: tm.tm_hour>12 ? tm.tm_hour-12
 			: tm.tm_hour, tm.tm_min, tm.tm_hour>11 ? "pm":"am"); 
+		return(str);
 	}
 
-	else if(!strcmp(sp,"DATE") || !strcmp(sp,"SYSDATE")) {
+	if(!strcmp(sp,"DATE") || !strcmp(sp,"SYSDATE")) {
 		now=time(NULL);
-		bputs(unixtodstr(&cfg,now,str2)); }
+		return(unixtodstr(&cfg,now,str)); 
+	}
 
-	else if(!strcmp(sp,"TMSG")) {
+	if(!strcmp(sp,"TMSG")) {
 		l=0;
 		for(i=0;i<cfg.total_subs;i++)
 			l+=getposts(&cfg,i); 		/* l=total posts */
-		bprintf("%lu",l); }
+		sprintf(str,"%lu",l); 
+		return(str);
+	}
 
-	else if(!strcmp(sp,"TUSER"))
-		bprintf("%u",lastuser(&cfg));
+	if(!strcmp(sp,"TUSER")) {
+		sprintf(str,"%u",lastuser(&cfg));
+		return(str);
+	}
 
-	else if(!strcmp(sp,"TFILE")) {
+	if(!strcmp(sp,"TFILE")) {
 		l=0;
 		for(i=0;i<cfg.total_dirs;i++)
 			l+=getfiles(&cfg,i);
-		bprintf("%lu",l); }
+		sprintf(str,"%lu",l); 
+		return(str);
+	}
 
-	else if(!strcmp(sp,"TCALLS") || !strcmp(sp,"NUMCALLS")) {
+	if(!strcmp(sp,"TCALLS") || !strcmp(sp,"NUMCALLS")) {
 		getstats(&cfg,0,&stats);
-		bprintf("%lu",stats.logons); }
+		sprintf(str,"%lu",stats.logons); 
+		return(str);
+	}
 
-	else if(!strcmp(sp,"PREVON") || !strcmp(sp,"LASTCALLERNODE")
+	if(!strcmp(sp,"PREVON") || !strcmp(sp,"LASTCALLERNODE")
 		|| !strcmp(sp,"LASTCALLERSYSTEM"))
-		bputs(lastuseron);
+		return(lastuseron);
 
-	else if(!strcmp(sp,"CLS"))
+	if(!strcmp(sp,"CLS")) {
 		CLS;
+		return(nulstr);
+	}
 
-	else if(!strcmp(sp,"PAUSE") || !strcmp(sp,"MORE"))
+	if(!strcmp(sp,"PAUSE") || !strcmp(sp,"MORE")) {
 		pause();
+		return(nulstr);
+	}
 
-	else if(!strcmp(sp,"RESETPAUSE"))
+	if(!strcmp(sp,"RESETPAUSE")) {
 		lncntr=0;
+		return(nulstr);
+	}
 
-	else if(!strcmp(sp,"NOPAUSE") || !strcmp(sp,"POFF"))
+	if(!strcmp(sp,"NOPAUSE") || !strcmp(sp,"POFF")) {
 		sys_status^=SS_PAUSEOFF;
+		return(nulstr);
+	}
 
-	else if(!strcmp(sp,"PON") || !strcmp(sp,"AUTOMORE"))
+	if(!strcmp(sp,"PON") || !strcmp(sp,"AUTOMORE")) {
 		sys_status^=SS_PAUSEON;
+		return(nulstr);
+	}
 
 	/* NOSTOP */
 
 	/* STOP */
 
-	else if(!strcmp(sp,"BELL") || !strcmp(sp,"BEEP"))
-		outchar(BEL);
+	if(!strcmp(sp,"BELL") || !strcmp(sp,"BEEP"))
+		return("\a");
 
 	// else if(!strcmp(sp,"EVENT"))
-	//	  bputs(sectostr(sys_eventtime,str2));
+	//	  return(sectostr(sys_eventtime,str2));
 
 	/* LASTCALL */
 
-	else if(!strncmp(sp,"NODE",4)) {
+	if(!strncmp(sp,"NODE",4)) {
 		i=atoi(sp+4);
 		if(i && i<=cfg.sys_nodes) {
 			getnodedat(i,&node,0);
-			printnodedat(i,&node); } }
+			printnodedat(i,&node); 
+		} 
+		return(nulstr);
+	}
 
-	else if(!strcmp(sp,"WHO"))
+	if(!strcmp(sp,"WHO")) {
 		whos_online(true);
+		return(nulstr);
+	}
 
 	/* User Codes */
 
-	else if(!strcmp(sp,"USER") || !strcmp(sp,"ALIAS") || !strcmp(sp,"NAME"))
-		bputs(useron.alias);
+	if(!strcmp(sp,"USER") || !strcmp(sp,"ALIAS") || !strcmp(sp,"NAME"))
+		return(useron.alias);
 
-	else if(!strcmp(sp,"FIRST")) {
-		strcpy(str2,useron.alias);
-		tp=strchr(str2,SP);
+	if(!strcmp(sp,"FIRST")) {
+		strcpy(str,useron.alias);
+		tp=strchr(str,SP);
 		if(tp) *tp=0;
-		bputs(str2); }
+		return(str); 
+	}
 
-	else if(!strcmp(sp,"USERNUM")) 
-		bprintf("%u",useron.number);
+	if(!strcmp(sp,"USERNUM")) {
+		sprintf(str,"%u",useron.number);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"PHONE") || !strcmp(sp,"HOMEPHONE")
+	if(!strcmp(sp,"PHONE") || !strcmp(sp,"HOMEPHONE")
 		|| !strcmp(sp,"DATAPHONE") || !strcmp(sp,"DATA"))
-		bputs(useron.phone);
+		return(useron.phone);
 
-	else if(!strcmp(sp,"ADDR1"))
-		bputs(useron.address);
+	if(!strcmp(sp,"ADDR1"))
+		return(useron.address);
 
-	else if(!strcmp(sp,"FROM"))
-		bputs(useron.location);
+	if(!strcmp(sp,"FROM"))
+		return(useron.location);
 
-	else if(!strcmp(sp,"CITY")) {
-		strcpy(str2,useron.location);
-		p=strchr(str2,',');
+	if(!strcmp(sp,"CITY")) {
+		strcpy(str,useron.location);
+		char* p=strchr(str,',');
 		if(p) {
 			*p=0;
-			bputs(str2); } }
+			return(str); 
+		} 
+		return(nulstr);
+	}
 
-	else if(!strcmp(sp,"STATE")) {
-		p=strchr(useron.location,',');
+	if(!strcmp(sp,"STATE")) {
+		char* p=strchr(useron.location,',');
 		if(p) {
 			p++;
 			if(*p==SP)
 				p++;
-			bputs(p); } }
+			return(p); 
+		} 
+		return(nulstr);
+	}
 
-	else if(!strcmp(sp,"CPU"))
-		bputs(useron.comp);
+	if(!strcmp(sp,"CPU"))
+		return(useron.comp);
 		
-	else if(!strcmp(sp,"HOST"))
-		bputs(client_name);
+	if(!strcmp(sp,"HOST"))
+		return(client_name);
 
-	else if(!strcmp(sp,"BDATE"))
-		bputs(useron.birth);
+	if(!strcmp(sp,"BDATE"))
+		return(useron.birth);
 
-	else if(!strcmp(sp,"AGE"))
-		bprintf("%u",getage(&cfg,useron.birth));
+	if(!strcmp(sp,"AGE")) {
+		sprintf(str,"%u",getage(&cfg,useron.birth));
+		return(str);
+	}
 
-	else if(!strcmp(sp,"CALLS") || !strcmp(sp,"NUMTIMESON"))
-		bprintf("%u",useron.logons);
+	if(!strcmp(sp,"CALLS") || !strcmp(sp,"NUMTIMESON")) {
+		sprintf(str,"%u",useron.logons);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"MEMO"))
-		bputs(unixtodstr(&cfg,useron.pwmod,str2));
+	if(!strcmp(sp,"MEMO"))
+		return(unixtodstr(&cfg,useron.pwmod,str));
 
-	else if(!strcmp(sp,"SEC") || !strcmp(sp,"SECURITY"))
-		bprintf("%u",useron.level);
+	if(!strcmp(sp,"SEC") || !strcmp(sp,"SECURITY")) {
+		sprintf(str,"%u",useron.level);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"SINCE"))
-		bputs(unixtodstr(&cfg,useron.firston,str2));
+	if(!strcmp(sp,"SINCE"))
+		return(unixtodstr(&cfg,useron.firston,str));
 
-	else if(!strcmp(sp,"TIMEON") || !strcmp(sp,"TIMEUSED")) {
+	if(!strcmp(sp,"TIMEON") || !strcmp(sp,"TIMEUSED")) {
 		now=time(NULL);
-		bprintf("%u",(now-logontime)/60); }
+		sprintf(str,"%u",(now-logontime)/60); 
+		return(str);
+	}
 
-	else if(!strcmp(sp,"TUSED")) {              /* Synchronet only */
+	if(!strcmp(sp,"TUSED")) {              /* Synchronet only */
 		now=time(NULL);
-		bputs(sectostr(now-logontime,str2)+1); }
+		return(sectostr(now-logontime,str)+1); 
+	}
 
-	else if(!strcmp(sp,"TLEFT")) {              /* Synchronet only */
+	if(!strcmp(sp,"TLEFT")) {              /* Synchronet only */
 		gettimeleft();
-		bputs(sectostr(timeleft,str2)+1); }
+		return(sectostr(timeleft,str)+1); 
+	}
 
-	else if(!strcmp(sp,"TPERD"))                /* Synchronet only */
-		bputs(sectostr(cfg.level_timeperday[useron.level],str)+1);
+	if(!strcmp(sp,"TPERD"))                /* Synchronet only */
+		return(sectostr(cfg.level_timeperday[useron.level],str)+1);
 
-	else if(!strcmp(sp,"TPERC"))                /* Synchronet only */
-		bputs(sectostr(cfg.level_timepercall[useron.level],str)+1);
+	if(!strcmp(sp,"TPERC"))                /* Synchronet only */
+		return(sectostr(cfg.level_timepercall[useron.level],str)+1);
 
-	else if(!strcmp(sp,"TIMELIMIT"))
-		bprintf("%u",cfg.level_timepercall[useron.level]);
+	if(!strcmp(sp,"TIMELIMIT")) {
+		sprintf(str,"%u",cfg.level_timepercall[useron.level]);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"MINLEFT") || !strcmp(sp,"LEFT") || !strcmp(sp,"TIMELEFT")) {
+	if(!strcmp(sp,"MINLEFT") || !strcmp(sp,"LEFT") || !strcmp(sp,"TIMELEFT")) {
 		gettimeleft();
-		bprintf("%u",timeleft/60); }
+		sprintf(str,"%u",timeleft/60); 
+		return(str);
+	}
 
-	else if(!strcmp(sp,"LASTON"))
-		bputs(timestr(&useron.laston));
+	if(!strcmp(sp,"LASTON")) 
+		return(timestr(&useron.laston));
 
-	else if(!strcmp(sp,"LASTDATEON"))
-		bputs(unixtodstr(&cfg,useron.laston,str2));
+	if(!strcmp(sp,"LASTDATEON"))
+		return(unixtodstr(&cfg,useron.laston,str));
 
-	else if(!strcmp(sp,"LASTTIMEON")) {
+	if(!strcmp(sp,"LASTTIMEON")) {
 		tm_p=gmtime(&useron.laston);
 		if(tm_p)
 			tm=*tm_p;
 		else
 			memset(&tm,0,sizeof(tm));
-		bprintf("%02d:%02d %s"
+		sprintf(str,"%02d:%02d %s"
 			,tm.tm_hour==0 ? 12
 			: tm.tm_hour>12 ? tm.tm_hour-12
 			: tm.tm_hour, tm.tm_min, tm.tm_hour>11 ? "pm":"am"); 
+		return(str);
 	}
 
-	else if(!strcmp(sp,"MSGLEFT") || !strcmp(sp,"MSGSLEFT"))
-		bprintf("%u",useron.posts);
+	if(!strcmp(sp,"MSGLEFT") || !strcmp(sp,"MSGSLEFT")) {
+		sprintf(str,"%u",useron.posts);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"MSGREAD"))
-		bprintf("%u",posts_read);
+	if(!strcmp(sp,"MSGREAD")) {
+		sprintf(str,"%u",posts_read);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"FREESPACE")) 
-		bprintf("%lu",getfreediskspace(cfg.temp_dir)); 
+	if(!strcmp(sp,"FREESPACE")) {
+		sprintf(str,"%lu",getfreediskspace(cfg.temp_dir)); 
+		return(str);
+	}
 
-	else if(!strcmp(sp,"UPBYTES"))
-		bprintf("%lu",useron.ulb);
+	if(!strcmp(sp,"UPBYTES")) {
+		sprintf(str,"%lu",useron.ulb);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"UPK"))
-		bprintf("%lu",useron.ulb/1024L);
+	if(!strcmp(sp,"UPK")) {
+		sprintf(str,"%lu",useron.ulb/1024L);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"UPS") || !strcmp(sp,"UPFILES"))
-		bprintf("%u",useron.uls);
+	if(!strcmp(sp,"UPS") || !strcmp(sp,"UPFILES")) {
+		sprintf(str,"%u",useron.uls);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"DLBYTES"))
-		bprintf("%lu",useron.dlb);
+	if(!strcmp(sp,"DLBYTES")) {
+		sprintf(str,"%lu",useron.dlb);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"DOWNK"))
-		bprintf("%lu",useron.dlb/1024L);
+	if(!strcmp(sp,"DOWNK")) {
+		sprintf(str,"%lu",useron.dlb/1024L);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"DOWNS") || !strcmp(sp,"DLFILES"))
-		bprintf("%u",useron.dls);
+	if(!strcmp(sp,"DOWNS") || !strcmp(sp,"DLFILES")) {
+		sprintf(str,"%u",useron.dls);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"LASTNEW"))
-		bputs(unixtodstr(&cfg,ns_time,str2));
+	if(!strcmp(sp,"LASTNEW"))
+		return(unixtodstr(&cfg,ns_time,str));
 
-	else if(!strcmp(sp,"NEWFILETIME"))
-		bputs(timestr(&ns_time));
+	if(!strcmp(sp,"NEWFILETIME"))
+		return(timestr(&ns_time));
 
 	/* MAXDL */
 
-	else if(!strcmp(sp,"MAXDK") || !strcmp(sp,"DLKLIMIT") || !strcmp(sp,"KBLIMIT"))
-		bprintf("%lu",cfg.level_freecdtperday[useron.level]/1024L);
+	if(!strcmp(sp,"MAXDK") || !strcmp(sp,"DLKLIMIT") || !strcmp(sp,"KBLIMIT")) {
+		sprintf(str,"%lu",cfg.level_freecdtperday[useron.level]/1024L);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"DAYBYTES"))     /* amt of free cdts used today */
-		bprintf("%lu",cfg.level_freecdtperday[useron.level]-useron.freecdt);
+	if(!strcmp(sp,"DAYBYTES")) {    /* amt of free cdts used today */
+		sprintf(str,"%lu",cfg.level_freecdtperday[useron.level]-useron.freecdt);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"BYTELIMIT"))
-		bprintf("%lu",cfg.level_freecdtperday[useron.level]);
+	if(!strcmp(sp,"BYTELIMIT")) {
+		sprintf(str,"%lu",cfg.level_freecdtperday[useron.level]);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"KBLEFT"))
-		bprintf("%lu",(useron.cdt+useron.freecdt)/1024L);
+	if(!strcmp(sp,"KBLEFT")) {
+		sprintf(str,"%lu",(useron.cdt+useron.freecdt)/1024L);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"BYTESLEFT"))
-		bprintf("%lu",useron.cdt+useron.freecdt);
+	if(!strcmp(sp,"BYTESLEFT")) {
+		sprintf(str,"%lu",useron.cdt+useron.freecdt);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"CONF"))
-		bprintf("%s %s"
+	if(!strcmp(sp,"CONF")) {
+		sprintf("%s %s"
 			,usrgrps ? cfg.grp[usrgrp[curgrp]]->sname :nulstr
 			,usrgrps ? cfg.sub[usrsub[curgrp][cursub[curgrp]]]->sname : nulstr);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"CONFNUM"))
-		bprintf("%u %u",curgrp+1,cursub[curgrp]+1);
+	if(!strcmp(sp,"CONFNUM")) {
+		sprintf(str,"%u %u",curgrp+1,cursub[curgrp]+1);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"NUMDIR"))
-		bprintf("%u %u",usrlibs ? curlib+1 : 0,usrlibs ? curdir[curlib]+1 : 0);
+	if(!strcmp(sp,"NUMDIR")) {
+		sprintf(str,"%u %u",usrlibs ? curlib+1 : 0,usrlibs ? curdir[curlib]+1 : 0);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"EXDATE") || !strcmp(sp,"EXPDATE"))
-		bputs(unixtodstr(&cfg,useron.expire,str2));
+	if(!strcmp(sp,"EXDATE") || !strcmp(sp,"EXPDATE"))
+		return(unixtodstr(&cfg,useron.expire,str));
 
-	else if(!strcmp(sp,"EXPDAYS")) {
+	if(!strcmp(sp,"EXPDAYS")) {
 		now=time(NULL);
 		l=useron.expire-now;
 		if(l<0)
 			l=0;
-		bprintf("%u",l/(1440L*60L)); }
+		sprintf(str,"%u",l/(1440L*60L)); 
+		return(str);
+	}
 
-	else if(!strcmp(sp,"MEMO1"))
-		bputs(useron.note);
+	if(!strcmp(sp,"MEMO1"))
+		return(useron.note);
 
-	else if(!strcmp(sp,"MEMO2") || !strcmp(sp,"COMPANY"))
-		bputs(useron.name);
+	if(!strcmp(sp,"MEMO2") || !strcmp(sp,"COMPANY"))
+		return(useron.name);
 
-	else if(!strcmp(sp,"ZIP"))
-		bputs(useron.zipcode);
+	if(!strcmp(sp,"ZIP"))
+		return(useron.zipcode);
 
-	else if(!strcmp(sp,"HANGUP"))
+	if(!strcmp(sp,"HANGUP")) {
 		hangup();
-
-	else
-		return(syncatcodes(sp, len));
-
-	return(len);
-}
-
-int sbbs_t::syncatcodes(char *sp, int len)
-{
-	char str2[128],*tp;
-    stats_t stats;
+		return(nulstr);
+	}
 
 	/* Synchronet Specific */
 
-	if(!strncmp(sp,"SETSTR:",7))
+	if(!strncmp(sp,"SETSTR:",7)) {
 		strcpy(main_csi.str,sp+7);
+		return(nulstr);
+	}
 
-	else if(!strncmp(sp,"EXEC:",5))
+	if(!strncmp(sp,"EXEC:",5)) {
 		exec_bin(sp+5,&main_csi);
+		return(nulstr);
+	}
 
-	else if(!strncmp(sp,"MENU:",5))
+	if(!strncmp(sp,"MENU:",5)) {
 		menu(sp+5);
+		return(nulstr);
+	}
 
-	else if(!strncmp(sp,"TYPE:",5))
-		printfile(cmdstr(sp+5,nulstr,nulstr,str2),0);
-
-	else if(!strcmp(sp,"QUESTION"))
-		bputs(question);
-
-	else if(!strncmp(sp,"NAME-L",6))
-		bprintf("%-*.*s",len,len,useron.alias);
+	if(!strncmp(sp,"TYPE:",5)) {
+		printfile(cmdstr(sp+5,nulstr,nulstr,str),0);
+		return(nulstr);
+	}
 
-	else if(!strncmp(sp,"NAME-R",6))
-		bprintf("%*.*s",len,len,useron.alias);
+	if(!strcmp(sp,"QUESTION"))
+		return(question);
 
-	else if(!strcmp(sp,"HANDLE"))
-		bputs(useron.handle);
+	if(!strcmp(sp,"HANDLE"))
+		return(useron.handle);
 
-	else if(!strcmp(sp,"CID") || !strcmp(sp,"IP"))
-		bputs(cid);
+	if(!strcmp(sp,"CID") || !strcmp(sp,"IP"))
+		return(cid);
 
-	else if(!strcmp(sp,"LOCAL-IP")) {
+	if(!strcmp(sp,"LOCAL-IP")) {
 		struct in_addr in_addr;
 		in_addr.s_addr=local_addr;
-		bprintf("%s",inet_ntoa(in_addr));
+		return(inet_ntoa(in_addr));
 	}
 
-	else if(!strcmp(sp,"CRLF")) {
-		CRLF;
-	}
+	if(!strcmp(sp,"CRLF"))
+		return("\r\n");
 
-	else if(!strcmp(sp,"PUSHXY")) 
+	if(!strcmp(sp,"PUSHXY")) {
 		ANSI_SAVE();
+		return(nulstr);
+	}
 
-	else if(!strcmp(sp,"POPXY")) 
+	if(!strcmp(sp,"POPXY")) {
 		ANSI_RESTORE();
+		return(nulstr);
+	}
 
-	else if(!strcmp(sp,"UP")) 
-		rputs("\x1b[A");
+	if(!strcmp(sp,"UP")) 
+		return("\x1b[A");
 
-	else if(!strcmp(sp,"DOWN")) 
-		rputs("\x1b[B");
+	if(!strcmp(sp,"DOWN")) 
+		return("\x1b[B");
 
-	else if(!strcmp(sp,"RIGHT")) 
-		rputs("\x1b[C");
+	if(!strcmp(sp,"RIGHT")) 
+		return("\x1b[C");
 
-	else if(!strcmp(sp,"LEFT")) 
-		rputs("\x1b[D");
+	if(!strcmp(sp,"LEFT")) 
+		return("\x1b[D");
 
-	else if(!strncmp(sp,"UP:",3))
-		rprintf("\x1b[%dA",atoi(sp+3));
+	if(!strncmp(sp,"UP:",3)) {
+		sprintf(str,"\x1b[%dA",atoi(sp+3));
+		return(str);
+	}
 
-	else if(!strncmp(sp,"DOWN:",5))
-		rprintf("\x1b[%dB",atoi(sp+5));
+	if(!strncmp(sp,"DOWN:",5)) {
+		sprintf(str,"\x1b[%dB",atoi(sp+5));
+		return(str);
+	}
 
-	else if(!strncmp(sp,"LEFT:",5))
-		rprintf("\x1b[%dC",atoi(sp+5));
+	if(!strncmp(sp,"LEFT:",5)) {
+		sprintf(str,"\x1b[%dC",atoi(sp+5));
+		return(str);
+	}
 
-	else if(!strncmp(sp,"RIGHT:",6))
-		rprintf("\x1b[%dD",atoi(sp+6));
+	if(!strncmp(sp,"RIGHT:",6)) {
+		sprintf(str,"\x1b[%dD",atoi(sp+6));
+		return(str);
+	}
 
-	else if(!strncmp(sp,"GOTOXY:",7)) {
+	if(!strncmp(sp,"GOTOXY:",7)) {
 		tp=strchr(sp,',');
 		if(tp!=NULL) {
 			tp++;
 			GOTOXY(atoi(sp+7),atoi(tp));
 		}
+		return(nulstr);
 	}
 
-	else if(!strcmp(sp,"GRP"))
-		bputs(usrgrps ? cfg.grp[usrgrp[curgrp]]->sname : nulstr);
-
-	else if(!strncmp(sp,"GRP-L",5))
-		bprintf("%-*.*s",len,len,usrgrps ? cfg.grp[usrgrp[curgrp]]->sname : nulstr);
-
-	else if(!strncmp(sp,"GRP-R",5))
-		bprintf("%*.*s",len,len,usrgrps ? cfg.grp[usrgrp[curgrp]]->sname : nulstr);
-
-	else if(!strcmp(sp,"GRPL"))
-		bputs(usrgrps ? cfg.grp[usrgrp[curgrp]]->lname : nulstr);
-
-	else if(!strncmp(sp,"GRPL-L",6))
-		bprintf("%-*.*s",len,len,usrgrps ? cfg.grp[usrgrp[curgrp]]->lname : nulstr);
-
-	else if(!strncmp(sp,"GRPL-R",6))
-		bprintf("%*.*s",len,len,usrgrps ? cfg.grp[usrgrp[curgrp]]->lname : nulstr);
-
-	else if(!strcmp(sp,"GN"))
-		bprintf("%u",usrgrps ? curgrp+1 : 0);
-
-	else if(!strcmp(sp,"GL"))
-		bprintf("%-4u",usrgrps ? curgrp+1 : 0);
-
-	else if(!strcmp(sp,"GR"))
-		bprintf("%4u",usrgrps ? curgrp+1 : 0);
-
-	else if(!strcmp(sp,"SUB"))
-		bputs(usrgrps ? cfg.sub[usrsub[curgrp][cursub[curgrp]]]->sname : nulstr);
-
-	else if(!strncmp(sp,"SUB-L",5))
-		bprintf("%-*.*s",len,len,usrgrps
-			? cfg.sub[usrsub[curgrp][cursub[curgrp]]]->sname : nulstr);
-
-	else if(!strncmp(sp,"SUB-R",5))
-		bprintf("%*.*s",len,len,usrgrps
-			? cfg.sub[usrsub[curgrp][cursub[curgrp]]]->sname : nulstr);
-
-	else if(!strcmp(sp,"SUBL"))
-		bputs(usrgrps  ? cfg.sub[usrsub[curgrp][cursub[curgrp]]]->lname : nulstr);
-
-	else if(!strncmp(sp,"SUBL-L",6))
-		bprintf("%-*.*s",len,len,usrgrps
-			? cfg.sub[usrsub[curgrp][cursub[curgrp]]]->lname : nulstr);
-
-	else if(!strncmp(sp,"SUBL-R",6))
-		bprintf("%*.*s",len,len,usrgrps
-			? cfg.sub[usrsub[curgrp][cursub[curgrp]]]->lname : nulstr);
-
-	else if(!strcmp(sp,"SN"))
-		bprintf("%u",usrgrps ? cursub[curgrp]+1 : 0);
+	if(!strcmp(sp,"GRP"))
+		return(usrgrps ? cfg.grp[usrgrp[curgrp]]->sname : nulstr);
 
-	else if(!strcmp(sp,"SL"))
-		bprintf("%-4u",usrgrps ? cursub[curgrp]+1 : 0);
+	if(!strcmp(sp,"GRPL"))
+		return(usrgrps ? cfg.grp[usrgrp[curgrp]]->lname : nulstr);
 
-	else if(!strcmp(sp,"SR"))
-		bprintf("%4u",usrgrps ? cursub[curgrp]+1 : 0);
-
-	else if(!strcmp(sp,"LIB"))
-		bputs(usrlibs ? cfg.lib[usrlib[curlib]]->sname : nulstr);
+	if(!strcmp(sp,"GN")) {
+		sprintf(str,"%u",usrgrps ? curgrp+1 : 0);
+		return(str);
+	}
 
-	else if(!strncmp(sp,"LIB-L",5))
-		bprintf("%-*.*s",len,len,usrlibs ? cfg.lib[usrlib[curlib]]->sname : nulstr);
+	if(!strcmp(sp,"GL")) {
+		sprintf(str,"%-4u",usrgrps ? curgrp+1 : 0);
+		return(str);
+	}
 
-	else if(!strncmp(sp,"LIB-R",5))
-		bprintf("%*.*s",len,len,usrlibs ? cfg.lib[usrlib[curlib]]->sname : nulstr);
+	if(!strcmp(sp,"GR")) {
+		sprintf(str,"%4u",usrgrps ? curgrp+1 : 0);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"LIBL"))
-		bputs(usrlibs ? cfg.lib[usrlib[curlib]]->lname : nulstr);
+	if(!strcmp(sp,"SUB"))
+		return(usrgrps ? cfg.sub[usrsub[curgrp][cursub[curgrp]]]->sname : nulstr);
 
-	else if(!strncmp(sp,"LIBL-L",6))
-		bprintf("%-*.*s",len,len,usrlibs ? cfg.lib[usrlib[curlib]]->lname : nulstr);
+	if(!strcmp(sp,"SUBL"))
+		return(usrgrps  ? cfg.sub[usrsub[curgrp][cursub[curgrp]]]->lname : nulstr);
 
-	else if(!strncmp(sp,"LIBL-R",6))
-		bprintf("%*.*s",len,len,usrlibs ? cfg.lib[usrlib[curlib]]->lname : nulstr);
+	if(!strcmp(sp,"SN")) {
+		sprintf(str,"%u",usrgrps ? cursub[curgrp]+1 : 0);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"LN"))
-		bprintf("%u",usrlibs ? curlib+1 : 0);
+	if(!strcmp(sp,"SL")) {
+		sprintf(str,"%-4u",usrgrps ? cursub[curgrp]+1 : 0);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"LL"))
-		bprintf("%-4u",usrlibs ? curlib+1 : 0);
+	if(!strcmp(sp,"SR")) {
+		sprintf(str,"%4u",usrgrps ? cursub[curgrp]+1 : 0);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"LR"))
-		bprintf("%4u",usrlibs  ? curlib+1 : 0);
+	if(!strcmp(sp,"LIB"))
+		return(usrlibs ? cfg.lib[usrlib[curlib]]->sname : nulstr);
 
-	else if(!strcmp(sp,"DIR"))
-		bputs(usrlibs ? cfg.dir[usrdir[curlib][curdir[curlib]]]->sname :nulstr);
+	if(!strcmp(sp,"LIBL"))
+		return(usrlibs ? cfg.lib[usrlib[curlib]]->lname : nulstr);
 
-	else if(!strncmp(sp,"DIR-L",5))
-		bprintf("%-*.*s",len,len,usrlibs
-			? cfg.dir[usrdir[curlib][curdir[curlib]]]->sname : nulstr);
+	if(!strcmp(sp,"LN")) {
+		sprintf(str,"%u",usrlibs ? curlib+1 : 0);
+		return(str);
+	}
 
-	else if(!strncmp(sp,"DIR-R",5))
-		bprintf("%*.*s",len,len,usrlibs
-			? cfg.dir[usrdir[curlib][curdir[curlib]]]->sname : nulstr);
+	if(!strcmp(sp,"LL")) {
+		sprintf(str,"%-4u",usrlibs ? curlib+1 : 0);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"DIRL"))
-		bputs(usrlibs ? cfg.dir[usrdir[curlib][curdir[curlib]]]->lname : nulstr);
+	if(!strcmp(sp,"LR")) {
+		sprintf(str,"%4u",usrlibs  ? curlib+1 : 0);
+		return(str);
+	}
 
-	else if(!strncmp(sp,"DIRL-L",6))
-		bprintf("%-*.*s",len,len,usrlibs
-			? cfg.dir[usrdir[curlib][curdir[curlib]]]->lname : nulstr);
+	if(!strcmp(sp,"DIR"))
+		return(usrlibs ? cfg.dir[usrdir[curlib][curdir[curlib]]]->sname :nulstr);
 
-	else if(!strncmp(sp,"DIRL-R",6))
-		bprintf("%*.*s",len,len,usrlibs
-			? cfg.dir[usrdir[curlib][curdir[curlib]]]->lname : nulstr);
+	if(!strcmp(sp,"DIRL"))
+		return(usrlibs ? cfg.dir[usrdir[curlib][curdir[curlib]]]->lname : nulstr);
 
-	else if(!strcmp(sp,"DN"))
-		bprintf("%u",usrlibs ? curdir[curlib]+1 : 0);
+	if(!strcmp(sp,"DN")) {
+		sprintf(str,"%u",usrlibs ? curdir[curlib]+1 : 0);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"DL"))
-		bprintf("%-4u",usrlibs ? curdir[curlib]+1 : 0);
+	if(!strcmp(sp,"DL")) {
+		sprintf(str,"%-4u",usrlibs ? curdir[curlib]+1 : 0);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"DR"))
-		bprintf("%4u",usrlibs ? curdir[curlib]+1 : 0);
+	if(!strcmp(sp,"DR")) {
+		sprintf(str,"%4u",usrlibs ? curdir[curlib]+1 : 0);
+		return(str);
+	}
 
-	else if(!strcmp(sp,"NOACCESS")) {
+	if(!strcmp(sp,"NOACCESS")) {
 		if(noaccess_str==text[NoAccessTime])
-			bprintf(noaccess_str,noaccess_val/60,noaccess_val%60);
+			sprintf(str,noaccess_str,noaccess_val/60,noaccess_val%60);
 		else if(noaccess_str==text[NoAccessDay])
-			bprintf(noaccess_str,wday[noaccess_val]);
+			sprintf(str,noaccess_str,wday[noaccess_val]);
 		else
-			bprintf(noaccess_str,noaccess_val); }
+			sprintf(str,noaccess_str,noaccess_val); 
+		return(str);
+	}
 
-	else if(!strcmp(sp,"LAST")) {
+	if(!strcmp(sp,"LAST")) {
 		tp=strrchr(useron.alias,SP);
 		if(tp) tp++;
 		else tp=useron.alias;
-		bputs(tp); }
+		return(tp); 
+	}
 
-	else if(!strcmp(sp,"REAL")) {
-		strcpy(str2,useron.name);
-		tp=strchr(str2,SP);
+	if(!strcmp(sp,"REAL")) {
+		strcpy(str,useron.name);
+		tp=strchr(str,SP);
 		if(tp) *tp=0;
-		bputs(str2); }
+		return(str); 
+	}
 
-	else if(!strcmp(sp,"FIRSTREAL")) {
-		strcpy(str2,useron.name);
-		tp=strchr(str2,SP);
+	if(!strcmp(sp,"FIRSTREAL")) {
+		strcpy(str,useron.name);
+		tp=strchr(str,SP);
 		if(tp) *tp=0;
-		bputs(str2); }
+		return(str); 
+	}
 
-	else if(!strcmp(sp,"LASTREAL")) {
+	if(!strcmp(sp,"LASTREAL")) {
 		tp=strrchr(useron.name,SP);
 		if(tp) tp++;
 		else tp=useron.name;
-		bputs(tp); }
+		return(tp); 
+	}
 
-	else if(!strcmp(sp,"MAILW"))
-		bprintf("%u",getmail(&cfg,useron.number,0));
+	if(!strcmp(sp,"MAILW")) {
+		sprintf(str,"%u",getmail(&cfg,useron.number,0));
+		return(str);
+	}
 
-	else if(!strcmp(sp,"MAILP"))
-		bprintf("%u",getmail(&cfg,useron.number,1));
+	if(!strcmp(sp,"MAILP")) {
+		sprintf(str,"%u",getmail(&cfg,useron.number,1));
+		return(str);
+	}
 
-	else if(!strncmp(sp,"MAILW:",6))
-		bprintf("%u",getmail(&cfg,atoi(sp+6),0));
+	if(!strncmp(sp,"MAILW:",6)) {
+		sprintf(str,"%u",getmail(&cfg,atoi(sp+6),0));
+		return(str);
+	}
 
-	else if(!strncmp(sp,"MAILP:",6))
-		bprintf("%u",getmail(&cfg,atoi(sp+6),1));
+	if(!strncmp(sp,"MAILP:",6)) {
+		sprintf(str,"%u",getmail(&cfg,atoi(sp+6),1));
+		return(str);
+	}
 
-	else if(!strcmp(sp,"MSGREPLY"))
-		bprintf("%c",cfg.sys_misc&SM_RA_EMU ? 'R' : 'A');
+	if(!strcmp(sp,"MSGREPLY")) {
+		sprintf(str,"%c",cfg.sys_misc&SM_RA_EMU ? 'R' : 'A');
+		return(str);
+	}
 
-	else if(!strcmp(sp,"MSGREREAD"))
-		bprintf("%c",cfg.sys_misc&SM_RA_EMU ? 'A' : 'R');
+	if(!strcmp(sp,"MSGREREAD")) {
+		sprintf(str,"%c",cfg.sys_misc&SM_RA_EMU ? 'A' : 'R');
+		return(str);
+	}
 
-	else if(!strncmp(sp,"STATS.",6)) {
+	if(!strncmp(sp,"STATS.",6)) {
 		getstats(&cfg,0,&stats);
 		sp+=6;
 		if(!strcmp(sp,"LOGONS")) 
-			bprintf("%u",stats.logons);
+			sprintf(str,"%u",stats.logons);
 		else if(!strcmp(sp,"LTODAY")) 
-			bprintf("%u",stats.ltoday);
+			sprintf(str,"%u",stats.ltoday);
 		else if(!strcmp(sp,"TIMEON")) 
-			bprintf("%u",stats.timeon);
+			sprintf(str,"%u",stats.timeon);
 		else if(!strcmp(sp,"TTODAY")) 
-			bprintf("%u",stats.ttoday);
+			sprintf(str,"%u",stats.ttoday);
 		else if(!strcmp(sp,"ULS")) 
-			bprintf("%u",stats.uls);
+			sprintf(str,"%u",stats.uls);
 		else if(!strcmp(sp,"ULB")) 
-			bprintf("%u",stats.ulb);
+			sprintf(str,"%u",stats.ulb);
 		else if(!strcmp(sp,"DLS")) 
-			bprintf("%u",stats.dls);
+			sprintf(str,"%u",stats.dls);
 		else if(!strcmp(sp,"DLB")) 
-			bprintf("%u",stats.dlb);
+			sprintf(str,"%u",stats.dlb);
 		else if(!strcmp(sp,"PTODAY")) 
-			bprintf("%u",stats.ptoday);
+			sprintf(str,"%u",stats.ptoday);
 		else if(!strcmp(sp,"ETODAY")) 
-			bprintf("%u",stats.etoday);
+			sprintf(str,"%u",stats.etoday);
 		else if(!strcmp(sp,"FTODAY")) 
-			bprintf("%u",stats.ftoday);
+			sprintf(str,"%u",stats.ftoday);
 		else if(!strcmp(sp,"NUSERS")) 
-			bprintf("%u",stats.nusers);
+			sprintf(str,"%u",stats.nusers);
+		return(str);
 	}
 
 	/* Message header codes */
-	else if(!strcmp(sp,"MSG_TO") && current_msg!=NULL)
-		bputs(current_msg->to==NULL ? nulstr : current_msg->to);
-	else if(!strcmp(sp,"MSG_TO_EXT") && current_msg!=NULL) {
+	if(!strcmp(sp,"MSG_TO") && current_msg!=NULL) {
+		if(current_msg->to==NULL)
+			return(nulstr);
 		if(current_msg->to_ext!=NULL)
-			bprintf("#%s",current_msg->to_ext);
+			sprintf(str,"%s #%s",current_msg->to,current_msg->to_ext);
+		else if(current_msg->to_net.type!=NET_NONE)
+			sprintf(str,"%s (%s)",current_msg->to
+				,current_msg->to_net.type==NET_FIDO
+					? faddrtoa(*(faddr_t *)current_msg->to_net.addr) 
+					: (char*)current_msg->to_net.addr);
+		else
+			strcpy(str,current_msg->to);
+		return(str);
 	}
-	else if(!strcmp(sp,"MSG_TO_NET") && current_msg!=NULL) {
+	if(!strcmp(sp,"MSG_TO_NAME") && current_msg!=NULL)
+		return(current_msg->to==NULL ? nulstr : current_msg->to);
+	if(!strcmp(sp,"MSG_TO_EXT") && current_msg!=NULL) {
+		if(current_msg->to_ext==NULL)
+			return(nulstr);
+		return(current_msg->to_ext);
+	}
+	if(!strcmp(sp,"MSG_TO_NET") && current_msg!=NULL) {
 		if(current_msg->to_net.type!=NET_NONE)
-			bprintf("(%s)",current_msg->to_net.type==NET_FIDO
+			sprintf(str,"%s",current_msg->to_net.type==NET_FIDO
 				? faddrtoa(*(faddr_t *)current_msg->to_net.addr) 
 				: (char*)current_msg->to_net.addr);
+		return(str);
 	}
-	else if(!strcmp(sp,"MSG_FROM") && current_msg!=NULL) {
-		if(!(current_msg->hdr.attr&MSG_ANONYMOUS) || SYSOP)
-			bputs(current_msg->from==NULL ? nulstr : current_msg->from);
+	if(!strcmp(sp,"MSG_FROM") && current_msg!=NULL) {
+		if(current_msg->from==NULL)
+			return(nulstr);
+		if(current_msg->hdr.attr&MSG_ANONYMOUS && !SYSOP)
+			return(text[Anonymous]);
+		if(current_msg->from_ext!=NULL)
+			sprintf(str,"%s #%s",current_msg->from,current_msg->from_ext);
+		else if(current_msg->from_net.type!=NET_NONE)
+			sprintf(str,"%s (%s)",current_msg->from
+				,current_msg->from_net.type==NET_FIDO
+					? faddrtoa(*(faddr_t *)current_msg->from_net.addr) 
+					: (char*)current_msg->from_net.addr);
+		else
+			strcpy(str,current_msg->from);
+		return(str);
 	}
-	else if(!strcmp(sp,"MSG_FROM_EXT") && current_msg!=NULL) {
+	if(!strcmp(sp,"MSG_FROM_NAME") && current_msg!=NULL) {
+		if(current_msg->from==NULL)
+			return(nulstr);
+		if(current_msg->hdr.attr&MSG_ANONYMOUS && !SYSOP)
+			return(text[Anonymous]);
+		return(current_msg->from);
+	}		
+	if(!strcmp(sp,"MSG_FROM_EXT") && current_msg!=NULL) {
 		if(!(current_msg->hdr.attr&MSG_ANONYMOUS) || SYSOP)
 			if(current_msg->from_ext!=NULL)
-				bprintf("#%s",current_msg->from_ext);
+				return(current_msg->from_ext);
+		return(nulstr);
 	}
-	else if(!strcmp(sp,"MSG_FROM_NET") && current_msg!=NULL) {
-		if(current_msg->to_net.type!=NET_NONE
+	if(!strcmp(sp,"MSG_FROM_NET") && current_msg!=NULL) {
+		if(current_msg->from_net.type!=NET_NONE
 			&& (!(current_msg->hdr.attr&MSG_ANONYMOUS) || SYSOP))
-			bprintf("(%s)",current_msg->from_net.type==NET_FIDO
+			sprintf(str,"%s",current_msg->from_net.type==NET_FIDO
 				? faddrtoa(*(faddr_t *)current_msg->from_net.addr) 
 				: (char*)current_msg->from_net.addr);
+		return(str);
 	}
-	else if(!strcmp(sp,"MSG_SUBJECT") && current_msg!=NULL)
-		bputs(current_msg->subj==NULL ? nulstr : current_msg->subj);
-	else if(!strcmp(sp,"MSG_DATE") && current_msg!=NULL)
-		bputs(timestr((time_t *)&current_msg->hdr.when_written.time));
-	else if(!strcmp(sp,"MSG_TIMEZONE") && current_msg!=NULL)
-		bputs(zonestr(current_msg->hdr.when_written.zone));
-	else if(!strcmp(sp,"MSG_ATTR") && current_msg!=NULL)
-		bprintf("%s%s%s%s%s%s%s%s%s%s"
+	if(!strcmp(sp,"MSG_SUBJECT") && current_msg!=NULL)
+		return(current_msg->subj==NULL ? nulstr : current_msg->subj);
+	if(!strcmp(sp,"MSG_DATE") && current_msg!=NULL)
+		return(timestr((time_t *)&current_msg->hdr.when_written.time));
+	if(!strcmp(sp,"MSG_TIMEZONE") && current_msg!=NULL)
+		return(zonestr(current_msg->hdr.when_written.zone));
+	if(!strcmp(sp,"MSG_ATTR") && current_msg!=NULL) {
+		sprintf(str,"%s%s%s%s%s%s%s%s%s%s"
 			,current_msg->hdr.attr&MSG_PRIVATE		? "Private  "   :nulstr
 			,current_msg->hdr.attr&MSG_READ			? "Read  "      :nulstr
 			,current_msg->hdr.attr&MSG_DELETE		? "Deleted  "   :nulstr
@@ -756,42 +912,64 @@ int sbbs_t::syncatcodes(char *sp, int len)
 			,current_msg->hdr.attr&MSG_VALIDATED	? "Validated  " :nulstr
 			,current_msg->hdr.attr&MSG_REPLIED		? "Replied  "	:nulstr
 			);
-	else if(!strcmp(sp,"SMB_GROUP")) {
+		return(str);
+	}
+	if(!strcmp(sp,"SMB_AREA")) {
+		if(smb.subnum!=INVALID_SUB && smb.subnum<cfg.total_subs)
+			sprintf(str,"%s %s"
+				,cfg.grp[cfg.sub[smb.subnum]->grp]->sname
+				,cfg.sub[smb.subnum]->sname);
+		return(str);
+	}
+	if(!strcmp(sp,"SMB_AREA_DESC")) {
 		if(smb.subnum!=INVALID_SUB && smb.subnum<cfg.total_subs)
-			bputs(cfg.grp[cfg.sub[smb.subnum]->grp]->sname);
+			sprintf(str,"%s %s"
+				,cfg.grp[cfg.sub[smb.subnum]->grp]->lname
+				,cfg.sub[smb.subnum]->lname);
+		return(str);
 	}
-	else if(!strcmp(sp,"SMB_GROUP_DESC")) {
+	if(!strcmp(sp,"SMB_GROUP")) {
 		if(smb.subnum!=INVALID_SUB && smb.subnum<cfg.total_subs)
-			bputs(cfg.grp[cfg.sub[smb.subnum]->grp]->lname);
+			return(cfg.grp[cfg.sub[smb.subnum]->grp]->sname);
+		return(nulstr);
 	}
-	else if(!strcmp(sp,"SMB_GROUP_NUM")) {
+	if(!strcmp(sp,"SMB_GROUP_DESC")) {
+		if(smb.subnum!=INVALID_SUB && smb.subnum<cfg.total_subs)
+			return(cfg.grp[cfg.sub[smb.subnum]->grp]->lname);
+		return(nulstr);
+	}
+	if(!strcmp(sp,"SMB_GROUP_NUM")) {
 		if(smb.subnum!=INVALID_SUB && smb.subnum<cfg.total_subs) {
 			uint ugrp;
 			for(ugrp=0;ugrp<usrgrps;ugrp++)
 				if(usrgrp[ugrp]==cfg.sub[smb.subnum]->grp)
 					break;
-			bprintf("%u",ugrp+1);
+			sprintf(str,"%u",ugrp+1);
 		}
+		return(str);
 	}
-	else if(!strcmp(sp,"SMB_SUB")) {
+	if(!strcmp(sp,"SMB_SUB")) {
 		if(smb.subnum==INVALID_SUB)
-			bputs("Mail");
+			return("Mail");
 		else if(smb.subnum<cfg.total_subs)
-			bputs(cfg.sub[smb.subnum]->sname);
+			return(cfg.sub[smb.subnum]->sname);
+		return(nulstr);
 	}
-	else if(!strcmp(sp,"SMB_SUB_DESC")) {
+	if(!strcmp(sp,"SMB_SUB_DESC")) {
 		if(smb.subnum==INVALID_SUB)
-			bputs("Mail");
+			return("Mail");
 		else if(smb.subnum<cfg.total_subs)
-			bputs(cfg.sub[smb.subnum]->lname);
+			return(cfg.sub[smb.subnum]->lname);
+		return(nulstr);
 	}
-	else if(!strcmp(sp,"SMB_SUB_CODE")) {
+	if(!strcmp(sp,"SMB_SUB_CODE")) {
 		if(smb.subnum==INVALID_SUB)
-			bputs("MAIL");
+			return("MAIL");
 		else if(smb.subnum<cfg.total_subs)
-			bputs(cfg.sub[smb.subnum]->code);
+			return(cfg.sub[smb.subnum]->code);
+		return(nulstr);
 	}
-	else if(!strcmp(sp,"SMB_SUB_NUM")) {
+	if(!strcmp(sp,"SMB_SUB_NUM")) {
 		if(smb.subnum!=INVALID_SUB && smb.subnum<cfg.total_subs) {
 			uint ugrp;
 			for(ugrp=0;ugrp<usrgrps;ugrp++)
@@ -801,12 +979,10 @@ int sbbs_t::syncatcodes(char *sp, int len)
 			for(usub=0;usub<usrsubs[ugrp];usub++)
 				if(usrsub[ugrp][usub]==smb.subnum)
 					break;
-			bprintf("%u",usub+1);
+			sprintf(str,"%u",usub+1);
 		}
+		return(str);
 	}
-	
-	else return(0);
-
-	return(len);
+	return(NULL);
 }
 
diff --git a/src/sbbs3/con_out.cpp b/src/sbbs3/con_out.cpp
index 20845891b39d1bf4ca9deb02a014c53a45c70fd2..2dfb3b11b04c9669eefc8fbe1770d56d7177d872 100644
--- a/src/sbbs3/con_out.cpp
+++ b/src/sbbs3/con_out.cpp
@@ -82,7 +82,7 @@ int sbbs_t::bputs(char *str)
 			if(str==mnestr			/* Mnemonic string or */
 				|| (str>=text[0]	/* Straight out of TEXT.DAT */
 					&& str<=text[TOTAL_TEXT-1])) {
-				i=atcodes(str+l);		/* return 0 if not valid @ code */
+				i=show_atcode(str+l);	/* return 0 if not valid @ code */
 				l+=i;					/* i is length of code string */
 				if(i)					/* if valid string, go to top */
 					continue; }
@@ -90,7 +90,7 @@ int sbbs_t::bputs(char *str)
 				if(str==text[i])
 					break;
 			if(i<TOTAL_TEXT) {		/* Replacement text */
-				i=atcodes(str+l);
+				i=show_atcode(str+l);
 				l+=i;
 				if(i)
 					continue; } }
diff --git a/src/sbbs3/putmsg.cpp b/src/sbbs3/putmsg.cpp
index eb831c47a85789190cc016e30be5c55b95434aef..fa2f93e3efd3ec1a195f59b7a987f9eb75a0b723 100644
--- a/src/sbbs3/putmsg.cpp
+++ b/src/sbbs3/putmsg.cpp
@@ -216,7 +216,7 @@ char sbbs_t::putmsg(char HUGE16 *str, long mode)
 			if(str[l]==ESC && str[l+1]=='$')    /* WIP command */
 				lncntr=0;
 			if(str[l]=='@' && !(mode&P_NOATCODES)) {
-				i=atcodes((char *)str+l);	/* returns 0 if not valid @ code */
+				i=show_atcode((char *)str+l);	/* returns 0 if not valid @ code */
 				l+=i;					/* i is length of code string */
 				if(i)					/* if valid string, go to top */
 					continue; }