diff --git a/src/sbbs3/sbbs4defs.h b/src/sbbs3/sbbs4defs.h
index 4c0340ce97a7ff9c6991175887215c957735f625..85ec58081785ecb67a06e3260ec2705929366433 100644
--- a/src/sbbs3/sbbs4defs.h
+++ b/src/sbbs3/sbbs4defs.h
@@ -133,7 +133,7 @@ char* user_dat_columns[] = {
 };
 
 char* stats_dat_columns[] = {
-	 "TimeStamp"
+	 "Date"
 	,"Logons"
 	,"Timeon"
 	,"FilesUploaded"
diff --git a/src/sbbs3/v4upgrade.c b/src/sbbs3/v4upgrade.c
index 5fff6d0ebb603743924184f06cf28f8d1651ff4a..7874c00868377f5f14a2af69d30749c87d531c43 100644
--- a/src/sbbs3/v4upgrade.c
+++ b/src/sbbs3/v4upgrade.c
@@ -37,6 +37,7 @@
 #include "sbbs4defs.h"
 #include "ini_file.h"
 #include "dat_file.h"
+#include "datewrap.h"
 
 scfg_t scfg;
 BOOL overwrite_existing_files=TRUE;
@@ -55,6 +56,52 @@ BOOL overwrite(const char* path)
 	return(TRUE);
 }
 
+/****************************************************************************/
+/* Converts a date string in format MM/DD/YY into unix time format			*/
+/****************************************************************************/
+long DLLCALL dstrtodate(scfg_t* cfg, char *instr)
+{
+	char*	p;
+	char*	day;
+	char	str[16];
+	struct tm tm;
+
+	if(!instr[0] || !strncmp(instr,"00/00/00",8))
+		return(0);
+
+	if(isdigit(instr[0]) && isdigit(instr[1])
+		&& isdigit(instr[3]) && isdigit(instr[4])
+		&& isdigit(instr[6]) && isdigit(instr[7]))
+		p=instr;	/* correctly formatted */
+	else {
+		p=instr;	/* incorrectly formatted */
+		while(*p && isdigit(*p)) p++;
+		if(*p==0)
+			return(0);
+		p++;
+		day=p;
+		while(*p && isdigit(*p)) p++;
+		if(*p==0)
+			return(0);
+		p++;
+		sprintf(str,"%02u/%02u/%02u"
+			,atoi(instr)%100,atoi(day)%100,atoi(p)%100);
+		p=str;
+	}
+
+	memset(&tm,0,sizeof(tm));
+	tm.tm_year=((p[6]&0xf)*10)+(p[7]&0xf);
+	if(cfg->sys_misc&SM_EURODATE) {
+		tm.tm_mon=((p[3]&0xf)*10)+(p[4]&0xf);
+		tm.tm_mday=((p[0]&0xf)*10)+(p[1]&0xf); }
+	else {
+		tm.tm_mon=((p[0]&0xf)*10)+(p[1]&0xf);
+		tm.tm_mday=((p[3]&0xf)*10)+(p[4]&0xf); }
+
+	return(((tm.tm_year+1900)*10000)+(tm.tm_mon*100)+tm.tm_mday);
+}
+
+
 BOOL upgrade_users(void)
 {
 	char	outpath[MAX_PATH+1];
@@ -101,14 +148,14 @@ BOOL upgrade_users(void)
 
 		/******************************************/
 		/* very personal info */
-		len+=sprintf(rec+len,"%s\t%s\t%s\t%s\t%s\t%s\t%s\t%c\t%s\t"
+		len+=sprintf(rec+len,"%s\t%s\t%s\t%s\t%s\t%s\t%lu\t%c\t%s\t"
 			,user.netmail
 			,user.address
 			,user.location
 			,user.zipcode
 			,user.pass
 			,user.phone
-			,user.birth
+			,dstrtodate(&scfg,user.birth)
 			,user.sex
 			,user.modem
 			);
@@ -117,10 +164,10 @@ BOOL upgrade_users(void)
 
 		/******************************************/
 		/* date/times */
-		len+=sprintf(rec+len,"%lx\t%lx\t%lx\t%lx\t%lx\t%lx\t"
+		len+=sprintf(rec+len,"%lx\t%lx\t%lu\t%lx\t%lx\t%lx\t"
 			,user.laston
 			,user.firston
-			,user.expire
+			,time_to_date(user.expire)
 			,user.pwmod
 			,user.ns_time
 			,user.logontime
@@ -261,19 +308,19 @@ BOOL upgrade_stats(void)
 		return(FALSE);
 	}
 
-	iniSetHexInt(&list,  ROOT_SECTION	,"TimeStamp"	,t				,NULL);
-	iniSetInteger(&list, ROOT_SECTION	,"Logons"		,stats.logons	,NULL);
-	iniSetInteger(&list, ROOT_SECTION	,"LogonsToday"	,stats.ltoday	,NULL);
-	iniSetInteger(&list, ROOT_SECTION	,"Timeon"		,stats.timeon	,NULL);
-	iniSetInteger(&list, ROOT_SECTION	,"TimeonToday"	,stats.ttoday	,NULL);
-	iniSetInteger(&list, ROOT_SECTION	,"Uploads"		,stats.uls		,NULL);
-	iniSetInteger(&list, ROOT_SECTION	,"UploadBytes"	,stats.ulb		,NULL);
-	iniSetInteger(&list, ROOT_SECTION	,"Downloads"	,stats.dls		,NULL);
-	iniSetInteger(&list, ROOT_SECTION	,"DownloadBytes",stats.dlb		,NULL);
-	iniSetInteger(&list, ROOT_SECTION	,"PostsToday"	,stats.ptoday	,NULL);
-	iniSetInteger(&list, ROOT_SECTION	,"EmailToday"	,stats.etoday	,NULL);
-	iniSetInteger(&list, ROOT_SECTION	,"FeedbackToday",stats.ftoday	,NULL);
-	iniSetInteger(&list, ROOT_SECTION	,"NewUsersToday",stats.nusers	,NULL);
+	iniSetDateTime(&list,	ROOT_SECTION	,"TimeStamp"	,TRUE, t		,NULL);
+	iniSetInteger(&list,	ROOT_SECTION	,"Logons"		,stats.logons	,NULL);
+	iniSetInteger(&list,	ROOT_SECTION	,"LogonsToday"	,stats.ltoday	,NULL);
+	iniSetInteger(&list,	ROOT_SECTION	,"Timeon"		,stats.timeon	,NULL);
+	iniSetInteger(&list,	ROOT_SECTION	,"TimeonToday"	,stats.ttoday	,NULL);
+	iniSetInteger(&list,	ROOT_SECTION	,"Uploads"		,stats.uls		,NULL);
+	iniSetLongInt(&list,	ROOT_SECTION	,"UploadBytes"	,stats.ulb		,NULL);
+	iniSetInteger(&list,	ROOT_SECTION	,"Downloads"	,stats.dls		,NULL);
+	iniSetLongInt(&list,	ROOT_SECTION	,"DownloadBytes",stats.dlb		,NULL);
+	iniSetInteger(&list,	ROOT_SECTION	,"PostsToday"	,stats.ptoday	,NULL);
+	iniSetInteger(&list,	ROOT_SECTION	,"EmailToday"	,stats.etoday	,NULL);
+	iniSetInteger(&list,	ROOT_SECTION	,"FeedbackToday",stats.ftoday	,NULL);
+	iniSetInteger(&list,	ROOT_SECTION	,"NewUsersToday",stats.nusers	,NULL);
 
 	success=iniWriteFile(out, list);
 
@@ -311,8 +358,8 @@ BOOL upgrade_stats(void)
 	while(!feof(in)) {
 		if(fread(&csts,1,sizeof(csts),in)!=sizeof(csts))
 			break;
-		fprintf(out,"%lx\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t\n"
-			,csts.time
+		fprintf(out,"%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t\n"
+			,time_to_date(csts.time)
 			,csts.ltoday
 			,csts.ttoday
 			,csts.uls