diff --git a/src/sbbs3/GNUmakefile b/src/sbbs3/GNUmakefile
index a10cc0d7f254c25da473f778213021478109c35d..ece7b1459cac2d81e422627f1e1c832bfecf54c6 100644
--- a/src/sbbs3/GNUmakefile
+++ b/src/sbbs3/GNUmakefile
@@ -164,6 +164,10 @@ ifndef NSPRDIR
  NSPRDIR := ../../lib/mozilla/nspr/$(os).$(BUILD)
 endif
 
+ifdef DONT_BLAME_SYNCHRONET
+ LFLAGS += -DDONT_BLAME_SYNCHRONET
+endif
+
 LFLAGS += -L$(JSLIBDIR) -l$(JSLIB)
 
 # The following are needed for echocfg (uses UIFC)
diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index be43a44013d190255c7148abdf9f803fee220590..ad4ba4ea23061424263a8f8930ac886260a43fc9 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -4495,6 +4495,10 @@ void DLLCALL ftp_server(void* arg)
 
 	startup=(ftp_startup_t*)arg;
 
+#ifdef _THREAD_SUID_BROKEN
+	startup->seteuid(TRUE);
+#endif
+
     if(startup==NULL) {
     	sbbs_beep(100,500);
     	fprintf(stderr, "No startup structure passed!\n");
@@ -4531,6 +4535,7 @@ void DLLCALL ftp_server(void* arg)
 	served=0;
 	startup->recycle_now=FALSE;
 	recycle_server=TRUE;
+
 	do {
 
 		thread_up(FALSE /* setuid */);
@@ -4660,10 +4665,6 @@ void DLLCALL ftp_server(void* arg)
 			return;
 		}
 
-		/* signal caller that we've started up successfully */
-		if(startup->started!=NULL)
-    		startup->started();
-
 		lprintf("%04d FTP Server thread started on port %d",server_socket,startup->port);
 		status(STATUS_WFC);
 
@@ -4675,6 +4676,10 @@ void DLLCALL ftp_server(void* arg)
 				initialized=t;
 		}
 
+		/* signal caller that we've started up successfully */
+		if(startup->started!=NULL)
+    		startup->started();
+
 		while(server_socket!=INVALID_SOCKET) {
 
 			if(!(startup->options&FTP_OPT_NO_RECYCLE)) {
diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index a7f509a6c95abd5ef93888246fdaede0d1bd5ef7..a66c9fab115766a6221c96bd8048b1bbed7ba8ea 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -2941,10 +2941,10 @@ static void sendmail_thread(void* arg)
 	smb_t		smb;
 	smbmsg_t	msg;
 
-	sendmail_running=TRUE;
-
 	thread_up(TRUE /* setuid */);
 
+	sendmail_running=TRUE;
+
 	lprintf("0000 SendMail thread started");
 
 	memset(&msg,0,sizeof(msg));
@@ -3346,6 +3346,10 @@ void DLLCALL mail_server(void* arg)
 
 	startup=(mail_startup_t*)arg;
 
+#ifdef _THREAD_SUID_BROKEN
+	startup->seteuid(TRUE);
+#endif
+
     if(startup==NULL) {
     	sbbs_beep(100,500);
     	fprintf(stderr, "No startup structure passed!\n");
@@ -3375,6 +3379,7 @@ void DLLCALL mail_server(void* arg)
 	served=0;
 	startup->recycle_now=FALSE;
 	recycle_server=TRUE;
+
 	do {
 
 		thread_up(FALSE /* setuid */);
@@ -3548,10 +3553,6 @@ void DLLCALL mail_server(void* arg)
 		if(!(startup->options&MAIL_OPT_NO_SENDMAIL))
 			_beginthread(sendmail_thread, 0, NULL);
 
-		/* signal caller that we've started up successfully */
-		if(startup->started!=NULL)
-    		startup->started();
-
 		lprintf("%04d Mail Server thread started",server_socket);
 		status(STATUS_WFC);
 
@@ -3563,6 +3564,10 @@ void DLLCALL mail_server(void* arg)
 				initialized=t;
 		}
 
+		/* signal caller that we've started up successfully */
+		if(startup->started!=NULL)
+    		startup->started();
+
 		while(server_socket!=INVALID_SOCKET) {
 
 			if(!(startup->options&MAIL_OPT_NO_RECYCLE)) {
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index 8c4756afd661b0e136677ba7b6b09b2bd74955a1..c0c0609ef215bb7a3152a315026a1626dca01cb9 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -3540,6 +3540,10 @@ void DLLCALL bbs_thread(void* arg)
 		return;
 	}
 
+#ifdef _THREAD_SUID_BROKEN
+	startup->seteuid(TRUE);
+#endif
+
 	/* Setup intelligent defaults */
 	if(startup->telnet_port==0)				startup->telnet_port=IPPORT_TELNET;
 	if(startup->rlogin_port==0)				startup->rlogin_port=513;
@@ -3806,10 +3810,6 @@ void DLLCALL bbs_thread(void* arg)
 		lprintf("RLogin server listening on port %d",startup->rlogin_port);
 	}
 
-	/* signal caller that we've started up successfully */
-    if(startup->started!=NULL)
-    	startup->started();
-
 	sbbs = new sbbs_t(0, server_addr.sin_addr.s_addr
 		,"BBS System", telnet_socket, &scfg, text, NULL);
     sbbs->online = 0;
@@ -3930,6 +3930,11 @@ void DLLCALL bbs_thread(void* arg)
 	}
 #endif // __unix__ (unix-domain spy sockets)
 
+	/* signal caller that we've started up successfully */
+    if(startup->started!=NULL)
+    	startup->started();
+
+
 	while(telnet_socket!=INVALID_SOCKET) {
 
 		if(node_threads_running==0 && !event_mutex_locked) {	/* check for re-run flags */
diff --git a/src/sbbs3/sbbscon.c b/src/sbbs3/sbbscon.c
index a3b36dfec817a7b437640aeeb0ece4f158557b48..487608d3779b76b1460064e8b9b4219a5c7bb205 100644
--- a/src/sbbs3/sbbscon.c
+++ b/src/sbbs3/sbbscon.c
@@ -229,25 +229,6 @@ static int lputs(char *str)
 }
 
 #ifdef __unix__
-/**********************************************************
-* Change uid of the calling process to the user if specified
-* **********************************************************/
-static BOOL do_setuid(void) 
-{
-	BOOL	result=FALSE;
-
-	setregid(-1,old_gid);
-	setreuid(-1,old_uid);
-	if(!setregid(new_gid,new_gid) && !setreuid(new_uid,new_uid)) 
-		result=TRUE;
-
-	if(!result) {
-		lputs("!setuid FAILED");
-		lputs(strerror(errno));
-	}
-	return result;
-}
-
 /**********************************************************
 * Change uid of the calling process to the user if specified
 * **********************************************************/
@@ -287,6 +268,29 @@ static BOOL do_seteuid(BOOL to_new)
 	}
 	return result;
 }
+
+/**********************************************************
+* Change uid of the calling process to the user if specified
+* **********************************************************/
+static BOOL do_setuid(void) 
+{
+#if defined(_THREAD_SUID_BROKEN) || defined(DONT_BLAME_SYNCHRONET)
+	return(do_seteuid(TRUE));
+#else
+	BOOL	result=FALSE;
+
+	setregid(-1,old_gid);
+	setreuid(-1,old_uid);
+	if(!setregid(new_gid,new_gid) && !setreuid(new_uid,new_uid)) 
+		result=TRUE;
+
+	if(!result) {
+		lputs("!setuid FAILED");
+		lputs(strerror(errno));
+	}
+	return result;
+#endif
+}
 #endif   /* __unix__ */
 
 #ifdef _WINSOCKAPI_
@@ -1537,6 +1541,7 @@ int main(int argc, char** argv)
 			/* ToDo: Something seems to be broken here on FreeBSD now */
 			/* ToDo: Now, they try to re-bind on FreeBSD */
 			/* ToDo: Seems like I switched problems with Linux */
+#if defined(DONT_BLAME_SYNCHRONET) || defined(_THREAD_SUID_BROKEN)
  			if(bbs_startup.telnet_port < IPPORT_RESERVED
 				|| (bbs_startup.options & BBS_OPT_ALLOW_RLOGIN
 					&& bbs_startup.rlogin_port < IPPORT_RESERVED))
@@ -1551,6 +1556,7 @@ int main(int argc, char** argv)
 				mail_startup.options|=MAIL_OPT_NO_RECYCLE;
 			/* Perhaps a BBS_OPT_NO_RECYCLE_LOW option? */
 			services_startup.options|=BBS_OPT_NO_RECYCLE;
+#endif
 		}
 	}
 
diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index ff618b41fb4c84f166b4f786efc53eb73f0b348e..0a5da0545afced7b4ebf60cdfead39940db1d6f3 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -1590,6 +1590,10 @@ void DLLCALL services_thread(void* arg)
 		return;
 	}
 
+#ifdef _THREAD_SUID_BROKEN
+	startup->seteuid(TRUE);
+#endif
+
 	/* Setup intelligent defaults */
 	if(startup->sem_chk_freq==0)			startup->sem_chk_freq=5;
 	if(startup->js_max_bytes==0)			startup->js_max_bytes=JAVASCRIPT_MAX_BYTES;
@@ -1769,10 +1773,6 @@ void DLLCALL services_thread(void* arg)
 				_beginthread(js_static_service_thread, 0, &service[i]);
 		}
 
-		/* signal caller that we've started up successfully */
-		if(startup->started!=NULL)
-    		startup->started();
-
 		status("Listening");
 
 		if(initialized==0) {
@@ -1785,6 +1785,10 @@ void DLLCALL services_thread(void* arg)
 			
 		terminated=FALSE;
 
+		/* signal caller that we've started up successfully */
+		if(startup->started!=NULL)
+    		startup->started();
+
 		/* Main Server Loop */
 		while(!terminated) {
 
diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c
index 9be2877615f54d9af438539a3c9036940a4f3b01..29486406db0911c80bc219f70a2f62982f0567da 100644
--- a/src/sbbs3/websrvr.c
+++ b/src/sbbs3/websrvr.c
@@ -2264,7 +2264,7 @@ void http_session_thread(void* arg)
 	socket=session.socket;
 	lprintf("%04d Session thread started", session.socket);
 
-	thread_up(FALSE /* setuid */);
+	thread_up(TRUE /* setuid */);
 	session.finished=FALSE;
 
 	if(startup->options&BBS_OPT_NO_HOST_LOOKUP)
@@ -2435,6 +2435,10 @@ void DLLCALL web_server(void* arg)
 		return;
 	}
 
+#ifdef _THREAD_SUID_BROKEN
+	startup->seteuid(TRUE);
+#endif
+
 	/* Setup intelligent defaults */
 	if(startup->port==0)					startup->port=IPPORT_HTTP;
 	if(startup->root_dir[0]==0)				SAFECOPY(startup->root_dir,"../html");
@@ -2582,14 +2586,14 @@ void DLLCALL web_server(void* arg)
 		lprintf("Web Server listening on port %d",startup->port);
 		status("Listening");
 
-		/* signal caller that we've started up successfully */
-		if(startup->started!=NULL)
-    		startup->started();
-
 		lprintf("Web Server thread started");
 
 		sprintf(path,"%swebsrvr.rec",scfg.ctrl_dir);
 
+		/* signal caller that we've started up successfully */
+		if(startup->started!=NULL)
+    		startup->started();
+
 		while(server_socket!=INVALID_SOCKET) {
 
 			/* check for re-cycle semaphores */