diff --git a/src/sbbs3/sbbs_ini.c b/src/sbbs3/sbbs_ini.c
index 7aa9ca16413f182f7ec3f4785d05c2a06b7936d1..8a6bef2067e9da8276696456451eeb936e980984 100644
--- a/src/sbbs3/sbbs_ini.c
+++ b/src/sbbs3/sbbs_ini.c
@@ -443,6 +443,12 @@ void sbbs_read_ini(
 			=iniReadInteger(fp,section,strJavaScriptMaxBytes		,global->js.max_bytes);
 		web->js_cx_stack
 			=iniReadInteger(fp,section,strJavaScriptContextStack	,global->js.cx_stack);
+		web->js_branch_limit
+			=iniReadInteger(fp,section,strJavaScriptBranchLimit		,global->js.branch_limit);
+		web->js_gc_interval
+			=iniReadInteger(fp,section,strJavaScriptGcInterval		,global->js.gc_interval);
+		web->js_yield_interval
+			=iniReadInteger(fp,section,strJavaScriptYieldInterval	,global->js.yield_interval);
 
 		SAFECOPY(web->host_name
 			,iniReadString(fp,section,strHostName,global->host_name,value));
@@ -982,6 +988,21 @@ BOOL sbbs_write_ini(
 		else if(!iniSetInteger(lp,section,strJavaScriptContextStack	,web->js_cx_stack,&style))
 			break;
 
+		if(web->js_branch_limit==global->js.branch_limit)
+			iniRemoveValue(lp,section,strJavaScriptBranchLimit);
+		else if(!iniSetInteger(lp,section,strJavaScriptBranchLimit	,web->js_branch_limit,&style))
+			break;
+
+		if(web->js_gc_interval==global->js.gc_interval)
+			iniRemoveValue(lp,section,strJavaScriptGcInterval);
+		else if(!iniSetInteger(lp,section,strJavaScriptGcInterval	,web->js_gc_interval,&style))
+			break;
+
+		if(web->js_yield_interval==global->js.yield_interval)
+			iniRemoveValue(lp,section,strJavaScriptYieldInterval);
+		else if(!iniSetInteger(lp,section,strJavaScriptYieldInterval,web->js_yield_interval,&style))
+			break;
+
 		if(strcmp(web->host_name,global->host_name)==0
             || strcmp(bbs->host_name,cfg->sys_inetaddr)==0)
 			iniRemoveKey(lp,section,strHostName);
diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c
index 3fbde907aaa2bd714fd2b7515f16d5fb8071cf81..794ee88c2e5d80d7878af122b352b3b7c1bca3ea 100644
--- a/src/sbbs3/websrvr.c
+++ b/src/sbbs3/websrvr.c
@@ -212,6 +212,7 @@ typedef struct  {
 	JSObject*		js_query;
 	JSObject*		js_header;
 	JSObject*		js_request;
+	js_branch_t		js_branch;
 
 	/* Client info */
 	client_t		client;
@@ -819,7 +820,6 @@ static BOOL send_headers(http_session_t *session, const char *status)
 	struct tm	tm;
 	char	*headers;
 	char	header[MAX_REQUEST_LINE+1];
-	char	*p;
 	list_node_t	*node;
 
 	lprintf(LOG_DEBUG,"%04d Request resolved to: %s"
@@ -1379,7 +1379,6 @@ static void js_add_header(http_session_t * session, char *key, char *value)
 static BOOL parse_headers(http_session_t * session)
 {
 	char	*head_line;
-	char	next_char;
 	char	*value;
 	char	*p;
 	int		i;
@@ -1626,7 +1625,6 @@ static BOOL get_request_headers(http_session_t * session)
 	char	head_line[MAX_REQUEST_LINE+1];
 	char	next_char;
 	char	*value;
-	char	*p;
 	int		i;
 
 	while(sockreadline(session,head_line,sizeof(head_line)-1)>0) {
@@ -2435,6 +2433,17 @@ static JSFunctionSpec js_global_functions[] = {
 	{0}
 };
 
+static JSBool
+js_BranchCallback(JSContext *cx, JSScript *script)
+{
+	http_session_t* session;
+
+	if((session=(http_session_t*)JS_GetContextPrivate(cx))==NULL)
+		return(JS_FALSE);
+
+    return(js_CommonBranchCallback(cx,&session->js_branch));
+}
+
 static JSContext* 
 js_initcx(JSRuntime* runtime, SOCKET sock, JSObject** glob, http_session_t *session)
 {
@@ -2452,6 +2461,8 @@ js_initcx(JSRuntime* runtime, SOCKET sock, JSObject** glob, http_session_t *sess
 
     JS_SetErrorReporter(js_cx, js_ErrorReporter);
 
+	JS_SetBranchCallback(js_cx, js_BranchCallback);
+
 	do {
 
 		lprintf(LOG_INFO,"%04d JavaScript: Initializing Global object",sock);
@@ -2591,7 +2602,7 @@ static BOOL exec_ssjs(http_session_t* session)  {
 		/* RUN SCRIPT */
 		JS_ClearPendingException(session->js_cx);
 
-
+		session->js_branch.counter=0;
 
 		if((js_script=JS_CompileFile(session->js_cx, session->js_glob
 			,session->req.physical_path))==NULL) {
@@ -3313,6 +3324,11 @@ void DLLCALL web_server(void* arg)
 			SAFECOPY(session->host_ip,host_ip);
 			session->addr=client_addr;
    			session->socket=client_socket;
+			session->js_branch.auto_terminate=TRUE;
+			session->js_branch.terminated=&terminate_server;
+			session->js_branch.limit=startup->js_branch_limit;
+			session->js_branch.gc_interval=startup->js_gc_interval;
+			session->js_branch.yield_interval=startup->js_yield_interval;
 
 			_beginthread(http_session_thread, 0, session);
 			served++;
diff --git a/src/sbbs3/websrvr.h b/src/sbbs3/websrvr.h
index d972035169a49c5d9f01edbbc8a785a3f2f74e60..6f571b1919ed76ea8b63a65b20d701822d3c88c6 100644
--- a/src/sbbs3/websrvr.h
+++ b/src/sbbs3/websrvr.h
@@ -53,6 +53,9 @@ typedef struct {
     DWORD	options;
     DWORD	js_max_bytes;
 	DWORD	js_cx_stack;
+	DWORD	js_branch_limit;
+	DWORD	js_yield_interval;
+	DWORD	js_gc_interval;
 
 	void*	cbdata;				/* Private data passed to callbacks */