diff --git a/src/sbbs3/atcodes.cpp b/src/sbbs3/atcodes.cpp
index cda01a832f7341afb49ee7b17cc2168aa5c69127..7cdbbe6e413b3efb41305a94396ed1750528819d 100644
--- a/src/sbbs3/atcodes.cpp
+++ b/src/sbbs3/atcodes.cpp
@@ -822,7 +822,7 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen, long* pmode, bool
 		return(client_name);
 
 	if(!strcmp(sp,"BDATE"))
-		return(useron.birth);
+		return getbirthdstr(&cfg, useron.birth, str, sizeof(str));
 
 	if(!strcmp(sp,"AGE")) {
 		safe_snprintf(str,maxlen,"%u",getage(&cfg,useron.birth));
diff --git a/src/sbbs3/chat.cpp b/src/sbbs3/chat.cpp
index e1d767c5971dbaef3f0afefd293cf4f769bf21fa..1d68f5209226aa858c2fbfce1ac8bc275adffa17 100644
--- a/src/sbbs3/chat.cpp
+++ b/src/sbbs3/chat.cpp
@@ -1657,7 +1657,7 @@ void sbbs_t::guruchat(char* line, char* gurubuf, int gurunum, char* last_answer)
 							break;
 						case 'B':
 							if(sys_status&SS_USERON) {
-								SAFECAT(theanswer,useron.birth);
+								getbirthdstr(&cfg, useron.birth, theanswer, sizeof(theanswer));
 							} else {
 								SAFECAT(theanswer,"00/00/00");
 							}
diff --git a/src/sbbs3/logon.cpp b/src/sbbs3/logon.cpp
index ad6d0b8560521e18e8ee7c2092ba6c1482fa692f..8791b89b609df81c6ee1296fd55e7c6c36b0429a 100644
--- a/src/sbbs3/logon.cpp
+++ b/src/sbbs3/logon.cpp
@@ -217,8 +217,8 @@ bool sbbs_t::logon()
 	bputs(text[LoggingOn]);
 	if(useron.rows)
 		rows=useron.rows;
-	unixtodstr(&cfg,(time32_t)logontime,str);
-	if(!strncmp(str,useron.birth,5) && !(useron.rest&FLAG('Q'))) {
+	if(tm.tm_mon == getbirthmonth(&cfg, useron.birth) && tm.tm_mday == getbirthday(&cfg, useron.birth)
+		&& !(useron.rest&FLAG('Q'))) {
 		if(text[HappyBirthday][0]) {
 			bputs(text[HappyBirthday]);
 			pause();
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index 35437cedb7fd5c362864c8f3ba4e21ca776d0c7a..622cf05c779f87095c6db1177949ee3efeb27c63 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -736,7 +736,7 @@ int putusername(scfg_t* cfg, int number, char *name)
 
 #define DECVAL(ch, mul)	(DEC_CHAR_TO_INT(ch) * (mul))
 
-int getbirthyear(const char *birth)
+int getbirthyear(const char* birth)
 {
 	if(isdigit(birth[2]))				// CCYYMMYY format
 		return DECVAL(birth[0], 1000)
@@ -755,7 +755,7 @@ int getbirthyear(const char *birth)
 	return year;
 }
 
-int getbirthmonth(scfg_t* cfg, const char *birth)
+int getbirthmonth(scfg_t* cfg, const char* birth)
 {
 	if(isdigit(birth[5]))				// CCYYMMYY format
 		return DECVAL(birth[4], 10)	+ DECVAL(birth[5], 1);
@@ -766,7 +766,7 @@ int getbirthmonth(scfg_t* cfg, const char *birth)
 	}
 }
 
-int getbirthday(scfg_t* cfg, const char *birth)
+int getbirthday(scfg_t* cfg, const char* birth)
 {
 	if(isdigit(birth[5]))				// CCYYMMYY format
 		return DECVAL(birth[6], 10)	+ DECVAL(birth[7], 1);
@@ -777,6 +777,35 @@ int getbirthday(scfg_t* cfg, const char *birth)
 	}
 }
 
+// Always returns string in MM/DD/YY format
+char* getbirthmmddyy(scfg_t* cfg, const char* birth, char* buf, size_t max)
+{
+	safe_snprintf(buf, max, "%02u/%02u/%02u"
+		, getbirthmonth(cfg, birth)
+		, getbirthday(cfg, birth)
+		, getbirthyear(birth) % 100);
+	return buf;
+}
+
+// Always returns string in DD/MM/YY format
+char* getbirthddmmyy(scfg_t* cfg, const char* birth, char* buf, size_t max)
+{
+	safe_snprintf(buf, max, "%02u/%02u/%02u"
+		, getbirthday(cfg, birth)
+		, getbirthmonth(cfg, birth)
+		, getbirthyear(birth) % 100);
+	return buf;
+}
+
+char* getbirthdstr(scfg_t* cfg, const char* birth, char* buf, size_t max)
+{
+	if(cfg->sys_misc & SM_EURODATE)
+		getbirthddmmyy(cfg, birth, buf, max);
+	else
+		getbirthmmddyy(cfg, birth, buf, max);
+	return buf;
+}
+
 /****************************************************************************/
 /* Returns the age derived from the string 'birth' in the format CCYYMMDD	*/
 /* or legacy: MM/DD/YY or DD/MM/YY											*/
diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h
index e0af4b2afe418e789c42eac91f4be09678895417..858778a62d2dcb04593927c95555a3af35c1e3cb 100644
--- a/src/sbbs3/userdat.h
+++ b/src/sbbs3/userdat.h
@@ -84,6 +84,9 @@ DLLEXPORT int	getage(scfg_t*, const char* birthdate);
 DLLEXPORT int	getbirthmonth(scfg_t*, const char* birthdate);
 DLLEXPORT int	getbirthday(scfg_t*, const char* birthdate);
 DLLEXPORT int	getbirthyear(const char* birthdate);
+DLLEXPORT char* getbirthdstr(scfg_t*, const char* birthdate, char* buf, size_t);
+DLLEXPORT char* getbirthmmddyy(scfg_t*, const char* birthdate, char* buf, size_t);
+DLLEXPORT char* getbirthddmmyy(scfg_t*, const char* birthdate, char* buf, size_t);
 DLLEXPORT char*	username(scfg_t*, int usernumber, char * str);
 DLLEXPORT char* usermailaddr(scfg_t*, char* addr, const char* name);
 DLLEXPORT int	opennodedat(scfg_t*);
diff --git a/src/sbbs3/xtrn_sec.cpp b/src/sbbs3/xtrn_sec.cpp
index 078a807193e48b5c2c19ec956ba078fbf97ce506..82c09f099dfae4a1fedc070fda2474dde949608a 100644
--- a/src/sbbs3/xtrn_sec.cpp
+++ b/src/sbbs3/xtrn_sec.cpp
@@ -237,7 +237,7 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, ulong tl
 		safe_snprintf(str, sizeof(str), "%u\n%u\n%s\n%c\n%u\n%s\n"
 			,useron.level						/* User main level */
 			,useron.level						/* User transfer level */
-			,useron.birth						/* User birthday */
+			,getbirthmmddyy(&cfg, useron.birth, tmp, sizeof(tmp)) /* User birthday (MM/DD/YY) */
 			,useron.sex ? useron.sex : '?'		/* User sex (M/F) */
 			,useron.number						/* User number */
 			,useron.phone); 					/* User phone number */
@@ -452,7 +452,7 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, ulong tl
 			"\n%s\n%02d:%02d\n%c\n"
 			,0									/* 30: Kbytes downloaded today */
 			,(useron.cdt+useron.freecdt)/1024UL /* 31: Max Kbytes to download today */
-			,useron.birth						/* 32: User birthday */
+			,getbirthmmddyy(&cfg, useron.birth, tmp, sizeof(tmp))	/* 32: User birthday (MM/DD/YY) */
 			,node_dir							/* 33: Path to MAIN directory */
 			,data_dir							/* 34: Path to GEN directory */
 			,cfg.sys_op 						/* 35: Sysop name */
@@ -617,7 +617,7 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, ulong tl
 		write(file,&w,sizeof(w)); 			/* Len */
 		write(file,&w,sizeof(w)); 			/* CombinedPtr */
 		write(file,&w,sizeof(w)); 			/* AliasPtr */
-		l=0;
+		l = strtol(useron.birth, NULL, 10);
 		write(file,&l,sizeof(l));			/* Birthday (as a long?) */
 		/* EventInfo */
 		c=0;
@@ -777,7 +777,7 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, ulong tl
 			,8									/* Data bits */
 			,online==ON_LOCAL?"LOCAL":"REMOTE"  /* Online local or remote */
 			,cfg.com_port						/* COMx port */
-			,useron.birth						/* User birthday */
+			,getbirthmmddyy(&cfg, useron.birth, tmp, sizeof(tmp))	/* User birthday (MM/DD/YY) */
 			,dte_rate							/* DTE rate */
 			,"FALSE"                            /* Already connected? */
 			,"Normal Connection");              /* Normal or ARQ connect */
@@ -1151,7 +1151,7 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, ulong tl
 			,tleft/60							/* Minutes left */
 			,useron.phone						/* User's phone number */
 			,useron.location					/* User's city and state */
-			,useron.birth						/* User's birth date */
+			,getbirthmmddyy(&cfg, useron.birth, tmp, sizeof(tmp))	/* User's birth date (MM/DD/YY) */
 			);
 		lfexpand(str,misc);
 		write(file,str,strlen(str));