diff --git a/src/sbbs3/js_msg_area.cpp b/src/sbbs3/js_msg_area.cpp
index 05fbb31e227e4829db3065b946b51dea548b3e06..cce287b340c3e93ddad034f9b3d80498e4ebfaf8 100644
--- a/src/sbbs3/js_msg_area.cpp
+++ b/src/sbbs3/js_msg_area.cpp
@@ -106,11 +106,11 @@ struct js_msg_area_priv {
 	subscan_t	*subscan;
 };
 
-BOOL DLLCALL js_CreateMsgAreaProperties(JSContext* cx, scfg_t* cfg, JSObject* subobj, uint subnum)
+BOOL DLLCALL js_CreateMsgAreaProperties(JSContext* cx, scfg_t* cfg, JS::HandleObject subobj, uint subnum)
 {
 	char		str[128];
-	JSString*	js_str;
-	JS::Value		val;
+	JS::RootedString js_str(cx);
+	JS::RootedValue		val(cx);
 	sub_t*		sub;
 
 	if(subnum==INVALID_SUB || subnum>=cfg->total_subs)
@@ -118,128 +118,128 @@ BOOL DLLCALL js_CreateMsgAreaProperties(JSContext* cx, scfg_t* cfg, JSObject* su
 
 	sub=cfg->sub[subnum];
 
-	if(!JS_DefineProperty(cx, subobj, "number", INT_TO_JSVAL(subnum)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "number", subnum
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
-	if(!JS_DefineProperty(cx, subobj, "grp_number", INT_TO_JSVAL(sub->grp)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "grp_number", sub->grp
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 	if((js_str=JS_NewStringCopyZ(cx, cfg->grp[sub->grp]->sname))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "grp_name", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "grp_name", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 	if((js_str=JS_NewStringCopyZ(cx, sub->code))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "code", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "code", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 	if((js_str=JS_NewStringCopyZ(cx, sub->sname))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "name", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "name", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 	if((js_str=JS_NewStringCopyZ(cx, sub->lname))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "description", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "description", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 	if((js_str=JS_NewStringCopyZ(cx, sub->qwkname))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "qwk_name", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "qwk_name", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 	if((js_str=JS_NewStringCopyZ(cx, subnewsgroupname(cfg, sub, str, sizeof(str))))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "newsgroup", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "newsgroup", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 	if((js_str=JS_NewStringCopyZ(cx, sub->arstr))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "ars", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "ars", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 	if((js_str=JS_NewStringCopyZ(cx, sub->read_arstr))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "read_ars", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "read_ars", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 	if((js_str=JS_NewStringCopyZ(cx, sub->post_arstr))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "post_ars", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "post_ars", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 	if((js_str=JS_NewStringCopyZ(cx, sub->op_arstr))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "operator_ars", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "operator_ars", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 	if((js_str=JS_NewStringCopyZ(cx, sub->mod_arstr))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "moderated_ars", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "moderated_ars", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 	if((js_str=JS_NewStringCopyZ(cx, sub->data_dir))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "data_dir", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "data_dir", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 	if((js_str=JS_NewStringCopyZ(cx, sub->origline))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "fidonet_origin", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "fidonet_origin", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 	if((js_str=JS_NewStringCopyZ(cx, sub->tagline))==NULL)
 		return(FALSE);
-	if(!JS_DefineProperty(cx, subobj, "qwknet_tagline", STRING_TO_JSVAL(js_str)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "qwknet_tagline", js_str
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
-	val=UINT_TO_JSVAL(sub->misc);
+	val.setNumber(sub->misc);
 	if(!JS_DefineProperty(cx, subobj, "settings", val
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
-	if(!JS_DefineProperty(cx, subobj, "ptridx", INT_TO_JSVAL(sub->ptridx)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "ptridx", sub->ptridx
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
-	if(!JS_DefineProperty(cx, subobj, "qwk_conf", INT_TO_JSVAL(sub->qwkconf)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "qwk_conf", sub->qwkconf
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
-	if(!JS_DefineProperty(cx, subobj, "max_crcs", INT_TO_JSVAL(sub->maxcrcs)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "max_crcs", sub->maxcrcs
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
-	if(!JS_DefineProperty(cx, subobj, "max_msgs", INT_TO_JSVAL(sub->maxmsgs)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "max_msgs", sub->maxmsgs
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
-	if(!JS_DefineProperty(cx, subobj, "max_age", INT_TO_JSVAL(sub->maxage)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "max_age", sub->maxage
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
-	if(!JS_DefineProperty(cx, subobj, "print_mode", INT_TO_JSVAL(sub->pmode)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "print_mode", sub->pmode
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
-	if(!JS_DefineProperty(cx, subobj, "print_mode_neg", INT_TO_JSVAL(sub->n_pmode)
-		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+	if(!JS_DefineProperty(cx, subobj, "print_mode_neg", sub->n_pmode
+		,JSPROP_ENUMERATE|JSPROP_READONLY))
 		return(FALSE);
 
 
@@ -262,43 +262,43 @@ enum {
 
 static bool js_sub_get(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::MutableHandleValue vp)
 {
-	JS::Value idval;
-    int       tiny;
+	JS::RootedValue idval(cx);
+	int32_t       tiny;
 	subscan_t*	scan;
 
 	if((scan=(subscan_t*)JS_GetPrivate(obj))==NULL)
 		return(true);
 
-    JS_IdToValue(cx, id, &idval);
-    tiny = JSVAL_TO_INT(idval);
+	JS_IdToValue(cx, id, &idval);
+	tiny = idval.toInt32();
 
 	switch(tiny) {
 		case SUB_PROP_SCAN_PTR:
-			vp.set(UINT_TO_JSVAL(scan->ptr));
+			vp.setNumber((unsigned)scan->ptr);
 			break;
 		case SUB_PROP_SCAN_CFG:
-			vp.set(UINT_TO_JSVAL(scan->cfg));
+			vp.setNumber((unsigned)scan->cfg);
 			break;
 		case SUB_PROP_LAST_READ:
-			vp.set(UINT_TO_JSVAL(scan->last));
+			vp.setNumber((unsigned)scan->last);
 			break;
 	}
 
 	return(true);
 }
 
-static bool js_sub_set(JSContext *cx, JS::HandleObject obj, JS::HandleId id, bool strict, JS::MutableHandleValue vp)
+static bool js_sub_set(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::MutableHandleValue vp, JS::ObjectOpResult &result)
 {
-	JS::Value idval;
+	JS::RootedValue idval(cx);
 	int32_t		val=0;
-    int       tiny;
+	int32_t       tiny;
 	subscan_t*	scan;
 
 	if((scan=(subscan_t*)JS_GetPrivate(obj))==NULL)
 		return(true);
 
-    JS_IdToValue(cx, id, &idval);
-    tiny = JSVAL_TO_INT(idval);
+	JS_IdToValue(cx, id, &idval);
+	tiny = idval.toInt32();
 
 	switch(tiny) {
 		case SUB_PROP_SCAN_PTR:
@@ -504,29 +504,6 @@ bool DLLCALL js_msg_area_resolve(JSContext* cx, JS::HandleObject areaobj, JS::Ha
 
 				if((subobj=JS_NewObject(cx, &js_sub_class, subobj_proto, NULL))==NULL)
 					return false;
-/** Crash ^^^ Here in JSexec/ircd upon recycle/reload of script:
-
-	mozjs185-1.0.dll!62e4a968() 	
-	[Frames below may be incorrect and/or missing, no symbols loaded for mozjs185-1.0.dll]	
-	mozjs185-1.0.dll!62eda4b2() 	
-	mozjs185-1.0.dll!62e9cd4e() 	
-	mozjs185-1.0.dll!62ea3cf0() 	
-	mozjs185-1.0.dll!62e4e39e() 	
-	mozjs185-1.0.dll!62edd884() 	
-	mozjs185-1.0.dll!62e8010f() 	
-	mozjs185-1.0.dll!62e5b0c9() 	
-	mozjs185-1.0.dll!62e4b1ee() 	
->	sbbs.dll!js_CreateMsgAreaObject(JSContext * cx=0x07b33ce8, JSObject * parent=0x0a37f028, scfg_t * cfg=0x004a2b20, user_t * user=0x00000000, client_t * client=0x00000000, subscan_t * subscan=0x00000000)  Line 459 + 0x17 bytes	C
-	sbbs.dll!js_CreateUserObjects(JSContext * cx=0x07b33ce8, JSObject * parent=0x0a37f028, scfg_t * cfg=0x004a2b20, user_t * user=0x00000000, client_t * client=0x00000000, char * html_index_file=0x00000000, subscan_t * subscan=0x00000000)  Line 1431 + 0x1d bytes	C
-	sbbs.dll!js_CreateCommonObjects(JSContext * js_cx=0x07b33ce8, scfg_t * cfg=0x004a2b20, scfg_t * node_cfg=0x004a2b20, jsSyncMethodSpec * methods=0x00000000, __int64 uptime=0, char * host_name=0x101bdaa6, char * socklib_desc=0x101bdaa6, js_branch_t * branch=0x019c8f30, js_startup_t * js_startup=0x0012f7cc, client_t * client=0x00000000, unsigned int client_socket=4294967295, js_server_props_t * props=0x00000000)  Line 3858 + 0x1b bytes	C
-	sbbs.dll!js_load(JSContext * cx=0x02e36300, unsigned int argc=3, unsigned __int64 * arglist=0x01d700d0)  Line 282 + 0x44 bytes	C
-	mozjs185-1.0.dll!62e91dfd() 	
-	jsexec.exe!__lock_fhandle(int fh=1240564)  Line 467	C
-	7ffdf000()	
-	ffff0007()	
-	mozjs185-1.0.dll!62fe9c60() 	
-
-*/
 
 				if(p->subscan!=NULL)
 					JS_SetPrivate(subobj,&p->subscan[d]);
diff --git a/src/sbbs3/objects.mk b/src/sbbs3/objects.mk
index 358d72390535e67ee0813bc4589f8acb4ac52cb0..06c8f6a468a848e459e7fc2f5b45c953e4166845 100644
--- a/src/sbbs3/objects.mk
+++ b/src/sbbs3/objects.mk
@@ -40,7 +40,6 @@ OBJS	=	$(MTOBJODIR)$(DIRSEP)ansiterm$(OFILE) \
 			$(MTOBJODIR)$(DIRSEP)getstr$(OFILE)\
 			$(MTOBJODIR)$(DIRSEP)inkey$(OFILE)\
 			$(MTOBJODIR)$(DIRSEP)ident$(OFILE)\
-			$(MTOBJODIR)$(DIRSEP)js_private$(OFILE)\
 			$(MTOBJODIR)$(DIRSEP)js_bbs$(OFILE)\
 			$(MTOBJODIR)$(DIRSEP)js_client$(OFILE)\
 			$(MTOBJODIR)$(DIRSEP)js_com$(OFILE)\
@@ -54,6 +53,7 @@ OBJS	=	$(MTOBJODIR)$(DIRSEP)ansiterm$(OFILE) \
 			$(MTOBJODIR)$(DIRSEP)js_internal$(OFILE)\
 			$(MTOBJODIR)$(DIRSEP)js_msg_area$(OFILE)\
 			$(MTOBJODIR)$(DIRSEP)js_msgbase$(OFILE)\
+			$(MTOBJODIR)$(DIRSEP)js_private$(OFILE)\
 			$(MTOBJODIR)$(DIRSEP)js_queue$(OFILE)\
 			$(MTOBJODIR)$(DIRSEP)js_request$(OFILE)\
 			$(MTOBJODIR)$(DIRSEP)js_rtpool$(OFILE)\
@@ -246,7 +246,6 @@ JSDOOR_OBJS = \
 			$(MTOBJODIR)$(DIRSEP)date_str$(OFILE) \
 			$(MTOBJODIR)$(DIRSEP)dat_rec$(OFILE) \
 			$(MTOBJODIR)$(DIRSEP)jsdoor$(OFILE) \
-			$(MTOBJODIR)$(DIRSEP)js_private$(OFILE)\
 			$(MTOBJODIR)$(DIRSEP)js_uifc$(OFILE) \
 			$(MTOBJODIR)$(DIRSEP)js_conio$(OFILE) \
 			$(MTOBJODIR)$(DIRSEP)js_request$(OFILE) \
@@ -258,6 +257,7 @@ JSDOOR_OBJS = \
 			$(MTOBJODIR)$(DIRSEP)js_cryptcert$(OFILE) \
 			$(MTOBJODIR)$(DIRSEP)js_cryptkeyset$(OFILE) \
 			$(MTOBJODIR)$(DIRSEP)js_global$(OFILE) \
+			$(MTOBJODIR)$(DIRSEP)js_private$(OFILE)\
 			$(MTOBJODIR)$(DIRSEP)js_rtpool$(OFILE) \
 			$(MTOBJODIR)$(DIRSEP)js_sprintf$(OFILE) \
 			$(MTOBJODIR)$(DIRSEP)js_file$(OFILE) \