diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index 9ca880b4518b8bfe47db9cc7ba1c22a49c9acd5a..7dbe33ebddca2d3529b29309893983ae5ee5b2f8 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -667,6 +667,7 @@ js_client_add(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	if((service_client=(service_client_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
+	service_client->service->clients++;
 	memset(&client,0,sizeof(client));
 	client.size=sizeof(client);
 	client.protocol=service_client->service->protocol;
@@ -739,6 +740,7 @@ static JSBool
 js_client_remove(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	SOCKET	sock=INVALID_SOCKET;
+	service_client_t* service_client;
 
 	if(active_clients)
 		active_clients--, update_clients();
@@ -746,6 +748,12 @@ js_client_remove(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
 	sock=js_socket(cx,argv[0]);
 
 	client_off(sock);
+
+	if((service_client=(service_client_t*)JS_GetContextPrivate(cx))==NULL)
+		return(JS_FALSE);
+
+	service_client->service->clients--;
+
 #if 0	
 	lprintf(LOG_DEBUG,"client_remove(%04u)",sock);
 #endif
@@ -1595,6 +1603,8 @@ void DLLCALL services_thread(void* arg)
 	uptime=0;
 	served=0;
 	startup->recycle_now=FALSE;
+	startup->shutdown_now=FALSE;
+
 	do {
 
 		thread_up(FALSE /* setuid */);
@@ -1789,24 +1799,31 @@ void DLLCALL services_thread(void* arg)
 			for(i=0;i<(int)services;i++) 
 				total_clients+=service[i].clients;
 
-			if(total_clients==0 && !(startup->options&BBS_OPT_NO_RECYCLE)) {
-				if((p=semfile_list_check(&initialized,&recycle_semfiles))!=NULL) {
-					lprintf(LOG_INFO,"0000 Recycle semaphore file (%s) detected",p);
-					break;
+			if(total_clients==0) {
+				if(!(startup->options&BBS_OPT_NO_RECYCLE)) {
+					if((p=semfile_list_check(&initialized,&recycle_semfiles))!=NULL) {
+						lprintf(LOG_INFO,"0000 Recycle semaphore file (%s) detected",p);
+						break;
+					}
+#if 0	/* unused */
+					if(startup->recycle_sem!=NULL && sem_trywait(&startup->recycle_sem)==0)
+						startup->recycle_now=TRUE;
+#endif
+					if(startup->recycle_now==TRUE) {
+						lprintf(LOG_NOTICE,"0000 Recycle semaphore signaled");
+						startup->recycle_now=FALSE;
+						break;
+					}
 				}
-				if(startup->recycle_sem!=NULL && sem_trywait(&startup->recycle_sem)==0)
-					startup->recycle_now=TRUE;
-				if(startup->recycle_now==TRUE) {
-					lprintf(LOG_NOTICE,"0000 Recycle semaphore signaled");
-					startup->recycle_now=FALSE;
+				if(((p=semfile_list_check(&initialized,&shutdown_semfiles))!=NULL
+						&& lprintf(LOG_INFO,"0000 Shutdown semaphore file (%s) detected",p))
+					|| (startup->shutdown_now==TRUE
+						&& lprintf(LOG_INFO,"0000 Shutdown semaphore signaled"))) {
+					startup->shutdown_now=FALSE;
+					terminated=TRUE;
 					break;
 				}
 			}
-			if((p=semfile_list_check(&initialized,&shutdown_semfiles))!=NULL) {
-				lprintf(LOG_INFO,"0000 Shutdown semaphore file (%s) detected",p);
-				terminated=TRUE;
-				break;
-			}
 
 			/* Setup select() parms */
 			FD_ZERO(&socket_set);	
diff --git a/src/sbbs3/services.h b/src/sbbs3/services.h
index 835b24bf936e059e496a7780ff98033be834e78f..f0341eab01587b86c389f5a79312a8b0b3d832f1 100644
--- a/src/sbbs3/services.h
+++ b/src/sbbs3/services.h
@@ -75,7 +75,7 @@ typedef struct {
 	/* Misc */
     char	host_name[128];
 	BOOL	recycle_now;
-	sem_t	recycle_sem;
+	BOOL	shutdown_now;
 	DWORD	log_mask;
 	uint	bind_retry_count;		/* Number of times to retry bind() calls */
 	uint	bind_retry_delay;		/* Time to wait between each bind() retry */