diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index 2c3c454b98fa6b1e3a2964e333a577315506a39f..098a4781a0a8bddec85450c031f9848f1bb2a989 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -190,7 +190,7 @@ int eprintf(int level, const char *fmt, ...)
 	sbuf[sizeof(sbuf)-1]=0;
     va_end(argptr);
 	strip_ctrl(sbuf);
-    return(startup->event_lputs(level,sbuf));
+    return(startup->event_lputs(startup->event_cbdata,level,sbuf));
 }
 
 SOCKET open_socket(int type, const char* protocol)
@@ -669,7 +669,7 @@ js_log(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		rc=JS_SUSPENDREQUEST(cx);
 		if(sbbs->online==ON_LOCAL) {
 			if(startup!=NULL && startup->event_lputs!=NULL && level <= startup->log_level)
-				startup->event_lputs(level,JS_GetStringBytes(str));
+				startup->event_lputs(startup->event_cbdata,level,JS_GetStringBytes(str));
 		} else
 			lputs(level,JS_GetStringBytes(str));
 		JS_RESUMEREQUEST(cx, rc);
diff --git a/src/sbbs3/ntsvcs.c b/src/sbbs3/ntsvcs.c
index de7fe14b40ffa3b73decc225f5477c08081745e5..445b4b22b51fee2cbe3c891cb1ac3ffbc940836d 100644
--- a/src/sbbs3/ntsvcs.c
+++ b/src/sbbs3/ntsvcs.c
@@ -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 2006 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2009 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				*
@@ -280,6 +280,7 @@ static int svc_lputs(void* p, int level, const char* str)
 	char	fname[256];
 	DWORD	len;
 	DWORD	wr;
+	log_msg_t	msg;
 	sbbs_ntsvc_t* svc = (sbbs_ntsvc_t*)p;
 
 	/* Debug Logging */
@@ -291,6 +292,8 @@ static int svc_lputs(void* p, int level, const char* str)
 		return(0);
 
 	len = strlen(str);
+	SAFECOPY(msg.buf, str);
+	msg.level = level;
 
 	/* Mailslot Logging (for sbbsctrl) */
 	if(svc->log_handle != INVALID_HANDLE_VALUE /* Invalid log handle? */
@@ -313,7 +316,8 @@ static int svc_lputs(void* p, int level, const char* str)
 			);
 	}
 	if(svc->log_handle != INVALID_HANDLE_VALUE) {
-		if(!WriteFile(svc->log_handle,str,len,&wr,NULL) || wr!=len) {
+		len=sizeof(msg);
+		if(!WriteFile(svc->log_handle,&msg,len,&wr,NULL) || wr!=len) {
 			/* This most likely indicates the server closed the mailslot */
 			sprintf(debug,"!ERROR %d writing %u bytes to %s pipe (wr=%d)"
 				,GetLastError(),len,svc->name,wr);
@@ -346,15 +350,6 @@ static int svc_lputs(void* p, int level, const char* str)
     return(0);
 }
 
-/****************************************************************************/
-/* Event thread local/log print routine										*/
-/****************************************************************************/
-static int event_lputs(int level, const char *str)
-{
-	svc_lputs(&event,level,str);
-    return(0);
-}
-
 /************************************/
 /* Shared Service Callback Routines */
 /************************************/
@@ -1218,7 +1213,8 @@ int main(int argc, char** argv)
     bbs_startup.size=sizeof(bbs_startup);
 	bbs_startup.cbdata=&bbs;
 	bbs_startup.lputs=svc_lputs;
-	bbs_startup.event_lputs=event_lputs;
+	bbs_startup.event_cbdata=&event;
+	bbs_startup.event_lputs=svc_lputs;
     bbs_startup.started=svc_started;
 	bbs_startup.recycle=svc_recycle;
     bbs_startup.terminated=svc_terminated;
diff --git a/src/sbbs3/ntsvcs.h b/src/sbbs3/ntsvcs.h
index 81d342548147597b8b844a9aa20361674df865ec..82d0d59c7e329fa1ba8dd3e631123e62d3d8f9af 100644
--- a/src/sbbs3/ntsvcs.h
+++ b/src/sbbs3/ntsvcs.h
@@ -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 2006 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2009 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				*
@@ -54,4 +54,9 @@ enum {
 	,SERVICE_CONTROL_SYSOP_UNAVAILABLE		/* BBS service only */
 };
 
+typedef struct {
+	char level;
+	char buf[1024];
+} log_msg_t;
+
 #endif	/* Don't add anything after this line */
\ No newline at end of file
diff --git a/src/sbbs3/sbbscon.c b/src/sbbs3/sbbscon.c
index aef910af5a0c0a44b7ff53463c640cceb36c9c3e..1f4e5cea084e04fe24ef24d44f659a5697cf5ffe 100644
--- a/src/sbbs3/sbbscon.c
+++ b/src/sbbs3/sbbscon.c
@@ -835,7 +835,7 @@ static void services_terminated(void* p, int code)
 /****************************************************************************/
 /* Event thread local/log print routine										*/
 /****************************************************************************/
-static int event_lputs(int level, const char *str)
+static int event_lputs(void* p, int level, const char *str)
 {
 	char		logline[512];
 	char		tstr[64];
diff --git a/src/sbbs3/startup.h b/src/sbbs3/startup.h
index 0c7be71defc008f165d8dad5d2febf90d92cdfab..ee618972c99116df8300bc2a9b93065ae6e33a94 100644
--- a/src/sbbs3/startup.h
+++ b/src/sbbs3/startup.h
@@ -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 2006 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2009 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				*
@@ -88,10 +88,11 @@ typedef struct {
     sem_t**	node_spysem;			/* Spy output semaphore (each node)	*/
 
 	void*	cbdata;					/* Private data passed to callbacks */ 
+	void*	event_cbdata;			/* Private data passed to event_lputs callback */
 
 	/* Callbacks (NULL if unused) */
-	int 	(*lputs)(void*, int, const char*);	/* Log - put string					*/
-    int 	(*event_lputs)(int, const char*);		/* Event log - put string			*/
+	int 	(*lputs)(void*, int, const char*);			/* Log - put string					*/
+    int 	(*event_lputs)(void*, int, const char*);	/* Event log - put string			*/
 	void	(*status)(void*, const char*);
     void	(*started)(void*);
 	void	(*recycle)(void*);