diff --git a/src/sbbs3/data.cpp b/src/sbbs3/data.cpp
index c1f59064d2fecd7904b8c615001cc7eef9cf0088..78366ebd54bf60fe54a5b100882aaf62ffe62a69 100644
--- a/src/sbbs3/data.cpp
+++ b/src/sbbs3/data.cpp
@@ -165,7 +165,6 @@ void sbbs_t::gettimeleft(void)
     char    str[128];
 	char 	tmp[512];
     int     i;
-    time_t  eventtime=0;
 	time_t	thisevent;
     long    tleft;
     struct  tm tm, last_tm;
@@ -177,8 +176,8 @@ void sbbs_t::gettimeleft(void)
 	if(useron.exempt&FLAG('T')) {   /* Time online exemption */
 		timeleft=cfg.level_timepercall[useron.level]*60;
 		if(timeleft<10)             /* never get below 10 for exempt users */
-			timeleft=10; }
-	else {
+			timeleft=10; 
+	} else {
 		tleft=(((long)cfg.level_timeperday[useron.level]-useron.ttoday)
 			+useron.textra)*60L;
 		if(tleft<0) tleft=0;
@@ -189,16 +188,19 @@ void sbbs_t::gettimeleft(void)
 		if(tleft>0x7fffL)
 			timeleft=0x7fff;
 		else
-			timeleft=tleft; }
+			timeleft=tleft; 
+	}
 
 	/* Timed event time reduction handler */
 
+	event_time=0;
 	for(i=0;i<cfg.total_events;i++) {
 		if(!cfg.event[i]->node || cfg.event[i]->node>cfg.sys_nodes)
 			continue;
 		if(!(cfg.event[i]->misc&EVENT_FORCE)
 			|| (!(cfg.event[i]->misc&EVENT_EXCL) && cfg.event[i]->node!=cfg.node_num)
-			|| !(cfg.event[i]->days&(1<<tm.tm_wday)))
+			|| !(cfg.event[i]->days&(1<<tm.tm_wday))
+			|| (cfg.event[i]->mdays!=0 && !(cfg.event[i]->mdays&(1<<tm.tm_mday)))) 
 			continue;
 
 		if(localtime_r(&cfg.event[i]->last,&last_tm)==NULL)
@@ -209,26 +211,25 @@ void sbbs_t::gettimeleft(void)
 		thisevent=mktime(&tm);
 		if(tm.tm_mday==last_tm.tm_mday && tm.tm_mon==last_tm.tm_mon)
 			thisevent+=24L*60L*60L;     /* already ran today, so add 24hrs */
-		if(!eventtime || thisevent<eventtime)
-			eventtime=thisevent; 
+		if(!event_time || thisevent<event_time)
+			event_time=thisevent; 
+	}
+	if(event_time && now+(time_t)timeleft>event_time) {    /* less time, set flag */
+		timeleft=event_time-now; 
+		if(!(sys_status&SS_EVENT)) {
+			lprintf("Node %d Time reduced (to %s) due to upcoming event on %s"
+				,cfg.node_num,sectostr(timeleft,tmp),timestr(&event_time));
+			sys_status|=SS_EVENT;
+		}
 	}
-	if(eventtime && now+(time_t)timeleft>eventtime) {    /* less time, set flag */
-		sys_status|=SS_EVENT;
-		timeleft=eventtime-now; }
-
-#if 0	// We don't support front-end mailers anymore
-	/* Event time passed by front-end */
-	if(next_event && (next_event<now || next_event-now<(time_t)timeleft)) {
-		timeleft=next_event-now;
-		sys_status|=SS_EVENT; }
-#endif
 
 	if((long)timeleft<0)  /* timeleft can't go negative */
 		timeleft=0;
 	if(thisnode.status==NODE_NEWUSER) {
 		timeleft=cfg.level_timepercall[cfg.new_level];
 		if(timeleft<10*60L)
-			timeleft=10*60L; }
+			timeleft=10*60L; 
+	}
 
 	if(gettimeleft_inside)			/* The following code is not recursive */
 		return;
@@ -238,7 +239,7 @@ void sbbs_t::gettimeleft(void)
 		logline(nulstr,"Ran out of time");
 		SAVELINE;
 		if(sys_status&SS_EVENT)
-			bputs(text[ReducedTime]);
+			bprintf(text[ReducedTime],timestr(&event_time));
 		bputs(text[TimesUp]);
 		if(!(sys_status&(SS_EVENT|SS_USERON)) && useron.cdt>=100L*1024L
 			&& !(cfg.sys_misc&SM_NOCDTCVT)) {
@@ -254,7 +255,9 @@ void sbbs_t::gettimeleft(void)
 				RESTORELINE;
 				gettimeleft();
 				gettimeleft_inside=0;
-				return; } }
+				return; 
+			} 
+		}
 		if(cfg.sys_misc&SM_TIME_EXP && !(sys_status&SS_EVENT)
 			&& !(useron.exempt&FLAG('E'))) {
 											/* set to expired values */
@@ -286,7 +289,8 @@ void sbbs_t::gettimeleft(void)
 				useron.flags4&=~cfg.expired_flags4; /* expired status */
 				useron.exempt&=~cfg.expired_exempt;
 				useron.rest|=cfg.expired_rest;
-				useron.expire=0; }
+				useron.expire=0; 
+			}
 			putuserrec(&cfg,useron.number,U_LEVEL,2,ultoa(useron.level,str,10));
 			putuserrec(&cfg,useron.number,U_FLAGS1,8,ultoa(useron.flags1,str,16));
 			putuserrec(&cfg,useron.number,U_FLAGS2,8,ultoa(useron.flags2,str,16));
@@ -300,8 +304,10 @@ void sbbs_t::gettimeleft(void)
 			RESTORELINE;
 			gettimeleft();
 			gettimeleft_inside=0;
-			return; }
+			return; 
+		}
 		SYNC;
-		hangup(); }
+		hangup(); 
+	}
 	gettimeleft_inside=0;
 }