diff --git a/src/sbbs3/js_socket.c b/src/sbbs3/js_socket.c
index f26fb7ebdaac5f50f2e6c9585f6db2cbafb0f76a..9e4518b881e7424e60cacf48bb8cf6aee0684200 100644
--- a/src/sbbs3/js_socket.c
+++ b/src/sbbs3/js_socket.c
@@ -314,14 +314,7 @@ static void js_finalize_socket(JSContext *cx, JSObject *obj)
 	if((p=(js_socket_private_t*)JS_GetPrivate(cx,obj))==NULL)
 		return;
 
-	if(p->session != -1) {
-		cryptDestroySession(p->session);
-		p->session=-1;
-	}
-	if(p->external==FALSE && p->sock!=INVALID_SOCKET) {
-		close_socket(p->sock);
-		dbprintf(FALSE, p, "closed/deleted");
-	}
+	do_js_close(p);
 
 	if(p->hostname)
 		free(p->hostname);
@@ -612,6 +605,7 @@ js_accept(JSContext *cx, uintN argc, jsval *arglist)
 			JS_RESUMEREQUEST(cx, rc);
 			return(JS_TRUE);
 		}
+		call_socket_open_callback(TRUE);
 	}
 	else {
 		if((new_socket=accept_socket(p->sock,&(p->remote_addr),&addrlen))==INVALID_SOCKET) {
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index fbd9d7a1ca506ba70ced57767f4633fd77df4499..7adcd37ccc1a9ebab679079fcd86884254cabb60 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -290,28 +290,34 @@ void sock_close_cb(SOCKET sock, void *cb_data)
 		su->socket_open(su->cbdata, FALSE);
 }
 
+void call_socket_open_callback(BOOL open)
+{
+	if(startup!=NULL && startup->socket_open!=NULL) 
+		startup->socket_open(startup->cbdata, open);
+}
+
 SOCKET open_socket(int type, const char* protocol)
 {
 	SOCKET	sock;
 	char	error[256];
 
 	sock=socket(AF_INET, type, IPPROTO_IP);
-	if(sock!=INVALID_SOCKET && startup!=NULL && startup->socket_open!=NULL) 
-		startup->socket_open(startup->cbdata,TRUE);
+	if(sock!=INVALID_SOCKET)
+		call_socket_open_callback(TRUE);
 	if(sock!=INVALID_SOCKET && set_socket_options(&scfg, sock, protocol, error, sizeof(error)))
 		lprintf(LOG_ERR,"%04d !ERROR %s",sock,error);
 
 	return(sock);
 }
 
-// Used by sbbs_t::ftp_put():
+// Used by sbbs_t::ftp_put() and js_accept()
 SOCKET accept_socket(SOCKET s, union xp_sockaddr* addr, socklen_t* addrlen)
 {
 	SOCKET	sock;
 
 	sock=accept(s,&addr->addr,addrlen);
-	if(sock!=INVALID_SOCKET && startup!=NULL && startup->socket_open!=NULL)
-		startup->socket_open(startup->cbdata,TRUE);
+	if(sock!=INVALID_SOCKET)
+		call_socket_open_callback(TRUE);
 
 	return(sock);
 }
@@ -325,8 +331,7 @@ int close_socket(SOCKET sock)
 
 	shutdown(sock,SHUT_RDWR);	/* required on Unix */
 	result=closesocket(sock);
-	if(startup!=NULL && startup->socket_open!=NULL)
-		startup->socket_open(startup->cbdata,FALSE);
+	call_socket_open_callback(FALSE);
 	if(result!=0 && ERROR_VALUE!=ENOTSOCK)
 		lprintf(LOG_WARNING,"!ERROR %d closing socket %d",ERROR_VALUE,sock);
 	return(result);
@@ -5244,8 +5249,7 @@ NO_SSH:
 		}
 
 		// Count the socket:
-		if(startup->socket_open!=NULL)
-			startup->socket_open(startup->cbdata, TRUE);
+		call_socket_open_callback(TRUE);
 
 		if(client_socket == INVALID_SOCKET)	{
 #if 0	/* is this necessary still? */
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 3aba36ea3923dee9e73075798b70ca23bf3b6c42..6fa706e05cef4a27fce115c3fe11a33ac06d249a 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -1357,6 +1357,7 @@ char*	prep_code(char *str, const char* prefix);
 	int 	lputs(int level, const char *);			/* log output */
 	int 	lprintf(int level, const char *fmt, ...);	/* log output */
 	int 	eprintf(int level, const char *fmt, ...);	/* event log */
+	void	call_socket_open_callback(BOOL open);
 	SOCKET	open_socket(int type, const char* protocol);
 	SOCKET	accept_socket(SOCKET s, union xp_sockaddr* addr, socklen_t* addrlen);
 	int		close_socket(SOCKET);