diff --git a/src/sbbs3/ntsvcs.c b/src/sbbs3/ntsvcs.c
index 1832a334da595a4f029b8c59f9aeb87102ead61c..346dddefb9a90539807326c2733f196c33998a79 100644
--- a/src/sbbs3/ntsvcs.c
+++ b/src/sbbs3/ntsvcs.c
@@ -74,6 +74,7 @@ typedef struct {
 	char*					display_name;
 	char*					description;
 	void*					startup;
+	HANDLE*					recycle_sem;
 	void					(*thread)(void* arg);
 	void					(WINAPI *ctrl_handler)(DWORD);
 	HANDLE					log_handle;
@@ -89,6 +90,7 @@ sbbs_ntsvc_t bbs ={
 	"Provides support for Telnet and RLogin clients and executes timed events. " \
 		"This service provides the critical functions of your Synchronet BBS.",
 	&bbs_startup,
+	&bbs_startup.recycle_sem,
 	bbs_thread,
 	bbs_ctrl_handler,
 	INVALID_HANDLE_VALUE
@@ -102,6 +104,7 @@ sbbs_ntsvc_t event ={
 	NULL,
 	NULL,
 	NULL,
+	NULL,
 	INVALID_HANDLE_VALUE
 };
 
@@ -110,6 +113,7 @@ sbbs_ntsvc_t ftp = {
 	"Synchronet FTP Server",
 	"Provides support for FTP clients (including web browsers) for file transfers.",
 	&ftp_startup,
+	&ftp_startup.recycle_sem,
 	ftp_server,
 	ftp_ctrl_handler,
 	INVALID_HANDLE_VALUE
@@ -121,6 +125,7 @@ sbbs_ntsvc_t web = {
 	"Synchronet Web Server",
 	"Provides support for Web (HTML/HTTP) clients (browsers).",
 	&web_startup,
+	&web_startup.recycle_sem,
 	web_server,
 	web_ctrl_handler,
 	INVALID_HANDLE_VALUE
@@ -133,6 +138,7 @@ sbbs_ntsvc_t mail = {
 	"Sends and receives Internet e-mail (using SMTP) and allows users to remotely " \
 		"access their e-mail using an Internet mail client (using POP3).",
 	&mail_startup,
+	&mail_startup.recycle_sem,
 	mail_server,
 	mail_ctrl_handler,
 	INVALID_HANDLE_VALUE
@@ -146,6 +152,7 @@ sbbs_ntsvc_t services = {
 		"Stock services include Finger, Gopher, NNTP, and IRC. Edit your ctrl/services.ini " \
 		"file for configuration of individual Synchronet Services.",
 	&services_startup,
+	&services_startup.recycle_sem,
 	services_thread,
 	services_ctrl_handler,
 	INVALID_HANDLE_VALUE
@@ -377,6 +384,10 @@ static void WINAPI svc_start(sbbs_ntsvc_t* svc, DWORD argc, LPTSTR *argv)
 		return;
 	}
 
+	if(svc->recycle_sem!=NULL 
+		&& ((*svc->recycle_sem)=CreateSemaphore(NULL,0,1,svc->name))==NULL)
+		svc_lputs(svc,"!Error creating recycle semaphore");
+
 	memset(&svc->status,0,sizeof(SERVICE_STATUS));
 	svc->status.dwServiceType=SERVICE_WIN32_SHARE_PROCESS;
 	svc->status.dwControlsAccepted=SERVICE_ACCEPT_SHUTDOWN;