diff --git a/src/sbbs3/js_file_area.cpp b/src/sbbs3/js_file_area.cpp
index c35af6300742193ad7b34d2cc43d198dca936238..3d1737bf37b196093b48ee9d1315aee8ad9385f0 100644
--- a/src/sbbs3/js_file_area.cpp
+++ b/src/sbbs3/js_file_area.cpp
@@ -105,76 +105,81 @@ struct js_file_area_priv {
 	char		*html_index_file;
 };
 
-bool DLLCALL js_file_area_resolve(JSContext* cx, JS::HandleObject areaobj, JS::HandleId id)
+bool DLLCALL js_file_area_resolve(JSContext* cx, JS::HandleObject areaobj, JS::HandleId id, bool *resolved)
 {
 	char		vpath[MAX_PATH+1];
-	JSObject*	alllibs;
-	JSObject*	alldirs;
-	JSObject*	libobj;
-	JSObject*	dirobj;
-	JSObject*	alt_list;
-	JSObject*	lib_list;
-	JSObject*	dir_list;
-	JSString*	js_str;
-	JS::Value		val;
-	int		lib_index;
-	int		dir_index;
-	uint		l,d;
-	BOOL		is_op;
-	char*		name=NULL;
+	JS::RootedObject alllibs(cx);
+	JS::RootedObject alldirs(cx);
+	JS::RootedObject libobj(cx);
+	JS::RootedObject dirobj(cx);
+	JS::RootedObject alt_list(cx);
+	JS::RootedObject lib_list(cx);
+	JS::RootedObject dir_list(cx);
+	JS::RootedString js_str(cx);
+	JS::RootedValue  val(cx);
+	int              lib_index;
+	int              dir_index;
+	uint             l,d;
+	bool             is_op;
+	char*            name=NULL;
 	struct js_file_area_priv *p;
 
 	if((p=(struct js_file_area_priv*)JS_GetPrivate(areaobj))==NULL)
 		return false;
 
-	if(id != JSID_VOID && id != JSID_EMPTY) {
-		JS::Value idval;
+	if(!JSID_IS_VOID(id) && !JSID_IS_EMPTY(id)) {
+		JS::RootedValue idval(cx);
 
 		JS_IdToValue(cx, id, &idval);
-		if(JSVAL_IS_STRING(idval))
-			JSSTRING_TO_MSTRING(cx, JSVAL_TO_STRING(idval), name, NULL);
+		if(idval.isString())
+			JSSTRING_TO_MSTRING(cx, idval.toString(), name, NULL);
 	}
 
 	/* file_area.properties */
 	if(name==NULL || strcmp(name, "min_diskspace")==0) {
 		if(name)
 			free(name);
-		val=UINT_TO_JSVAL(p->cfg->min_dspace);
-		JS_DefineProperty(cx, areaobj, "min_diskspace", val, NULL, NULL, JSPROP_ENUMERATE);
-		if(name)
+		val.setNumber((uint32_t)p->cfg->min_dspace);
+		JS_DefineProperty(cx, areaobj, "min_diskspace", p->cfg->min_dspace, JSPROP_ENUMERATE);
+		if(name) {
+			*resolved = true;
 			return(true);
+		}
 	}
 
 	if(name==NULL || strcmp(name, "settings")==0) {
 		if(name)
 			free(name);
-		val=UINT_TO_JSVAL(p->cfg->file_misc);
-		JS_DefineProperty(cx, areaobj, "settings", val, NULL, NULL, JSPROP_ENUMERATE);
-		if(name)
+		JS_DefineProperty(cx, areaobj, "settings", p->cfg->file_misc, JSPROP_ENUMERATE);
+		if(name) {
+			*resolved = true;
 			return(true);
+		}
 	}
 
 	if(name==NULL || strcmp(name, "alt_paths")==0) {
 		if(name)
 			free(name);
 		/* file_area.alt_paths[] */
-		if((alt_list=JS_NewArrayObject(cx, 0, NULL))==NULL) 
+		if((alt_list=JS_NewArrayObject(cx, 0))==NULL) 
 			return false;
 
-		val=OBJECT_TO_JSVAL(alt_list);
-		if(!JS_SetProperty(cx, areaobj, "alt_paths", &val)) 
+		val.setObject(*alt_list);
+		if(!JS_SetProperty(cx, areaobj, "alt_paths", val)) 
 			return false;
 
 		for (l=0; l<p->cfg->altpaths; l++) {
 			if((js_str=JS_NewStringCopyZ(cx, p->cfg->altpath[l]))==NULL)
 				return false;
-			val=STRING_TO_JSVAL(js_str);
+			val.setString(js_str);
 
-			if(!JS_SetElement(cx, alt_list, l, &val))
+			if(!JS_SetElement(cx, alt_list, l, val))
 				return false;
 		}
-		if(name)
+		if(name) {
+			*resolved = true;
 			return(true);
+		}
 	}
 
 #ifdef BUILD_JSDOCS
@@ -184,18 +189,18 @@ bool DLLCALL js_file_area_resolve(JSContext* cx, JS::HandleObject areaobj, JS::H
 	if (name==NULL || strcmp(name, "lib")==0 || strcmp(name, "dir")==0 || strcmp(name, "lib_list")==0) {
 		if(name)
 			FREE_AND_NULL(name);
-		if((alllibs=JS_NewObject(cx, NULL, NULL, areaobj))==NULL)
+		if((alllibs=JS_NewPlainObject(cx))==NULL)
 			return false;
 
-		val=OBJECT_TO_JSVAL(alllibs);
-		if (!JS_SetProperty(cx, areaobj, "lib", &val))
+		val.setObject(*alllibs);
+		if (!JS_SetProperty(cx, areaobj, "lib", val))
 			return false;
 
-		if((alldirs=JS_NewObject(cx, NULL, NULL, areaobj))==NULL)
+		if((alldirs=JS_NewPlainObject(cx))==NULL)
 			return false;
 
-		val=OBJECT_TO_JSVAL(alldirs);
-		if(!JS_SetProperty(cx, areaobj, "dir", &val))
+		val.setObject(*alldirs);
+		if(!JS_SetProperty(cx, areaobj, "dir", val))
 			return false;
 
 #ifdef BUILD_JSDOCS
@@ -203,69 +208,69 @@ bool DLLCALL js_file_area_resolve(JSContext* cx, JS::HandleObject areaobj, JS::H
 #endif
 
 		/* file_area.lib_list[] */
-		if((lib_list=JS_NewArrayObject(cx, 0, NULL))==NULL) 
+		if((lib_list=JS_NewArrayObject(cx, 0))==NULL) 
 			return false;
 
-		val=OBJECT_TO_JSVAL(lib_list);
-		if(!JS_SetProperty(cx, areaobj, "lib_list", &val)) 
+		val.setObject(*lib_list);
+		if(!JS_SetProperty(cx, areaobj, "lib_list", val))
 			return false;
 
 		for(l=0;l<p->cfg->total_libs;l++) {
 
-			if((libobj=JS_NewObject(cx, NULL, NULL, NULL))==NULL)
+			if((libobj=JS_NewPlainObject(cx))==NULL)
 				return false;
 
-			val=OBJECT_TO_JSVAL(libobj);
+			val.setObject(*libobj);
 			lib_index=-1;
 			if(p->user==NULL || chk_ar(p->cfg,p->cfg->lib[l]->ar,p->user,p->client)) {
 
 				if(!JS_GetArrayLength(cx, lib_list, (unsigned*)&lib_index))
 					return false;
 
-				if(!JS_SetElement(cx, lib_list, lib_index, &val))
+				if(!JS_SetElement(cx, lib_list, lib_index, val))
 					return false;
 			}
 
 			/* Add as property (associative array element) */
 			if(!JS_DefineProperty(cx, alllibs, p->cfg->lib[l]->sname, val
-				,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE))
+				,JSPROP_READONLY|JSPROP_ENUMERATE))
 				return false;
 
-			val=INT_TO_JSVAL(lib_index);
-			if(!JS_SetProperty(cx, libobj, "index", &val))
+			val.setNumber((double)lib_index);
+			if(!JS_SetProperty(cx, libobj, "index", val))
 				return false;
 
-			val=INT_TO_JSVAL(l);
-			if(!JS_SetProperty(cx, libobj, "number", &val))
+			val.setNumber(l);
+			if(!JS_SetProperty(cx, libobj, "number", val))
 				return false;
 
 			if((js_str=JS_NewStringCopyZ(cx, p->cfg->lib[l]->sname))==NULL)
 				return false;
-			val=STRING_TO_JSVAL(js_str);
-			if(!JS_SetProperty(cx, libobj, "name", &val))
+			val.setString(js_str);
+			if(!JS_SetProperty(cx, libobj, "name", val))
 				return false;
 
 			if((js_str=JS_NewStringCopyZ(cx, p->cfg->lib[l]->lname))==NULL)
 				return false;
-			val=STRING_TO_JSVAL(js_str);
-			if(!JS_SetProperty(cx, libobj, "description", &val))
+			val.setString(js_str);
+			if(!JS_SetProperty(cx, libobj, "description", val))
 				return false;
 
 			if((js_str=JS_NewStringCopyZ(cx, p->cfg->lib[l]->arstr))==NULL)
 				return false;
-			val=STRING_TO_JSVAL(js_str);
-			if(!JS_SetProperty(cx, libobj, "ars", &val))
+			val.setString(js_str);
+			if(!JS_SetProperty(cx, libobj, "ars", val))
 				return false;
 
 			sprintf(vpath,"/%s/%s",p->cfg->lib[l]->sname,p->html_index_file);
 			if((js_str=JS_NewStringCopyZ(cx, vpath))==NULL)
 				return false;
-			val=STRING_TO_JSVAL(js_str);
-			if(!JS_SetProperty(cx, libobj, "link", &val))
+			val.setString(js_str);
+			if(!JS_SetProperty(cx, libobj, "link", val))
 				return false;
 
-			val = BOOLEAN_TO_JSVAL(lib_index >= 0);
-			if(!JS_SetProperty(cx, libobj, "can_access", &val))
+			val.setBoolean(lib_index >= 0);
+			if(!JS_SetProperty(cx, libobj, "can_access", val))
 				return false;
 
 #ifdef BUILD_JSDOCS
@@ -273,176 +278,176 @@ bool DLLCALL js_file_area_resolve(JSContext* cx, JS::HandleObject areaobj, JS::H
 #endif
 
 			/* dir_list[] */
-			if((dir_list=JS_NewArrayObject(cx, 0, NULL))==NULL) 
+			if((dir_list=JS_NewArrayObject(cx, 0))==NULL) 
 				return false;
 
-			val=OBJECT_TO_JSVAL(dir_list);
-			if(!JS_SetProperty(cx, libobj, "dir_list", &val)) 
+			val.setObject(*dir_list);
+			if(!JS_SetProperty(cx, libobj, "dir_list", val)) 
 				return false;
 
 			for(d=0;d<p->cfg->total_dirs;d++) {
 				if(p->cfg->dir[d]->lib!=l)
 					continue;
 
-				if((dirobj=JS_NewObject(cx, NULL, NULL, NULL))==NULL)
+				if((dirobj=JS_NewPlainObject(cx))==NULL)
 					return false;
 
-				val=OBJECT_TO_JSVAL(dirobj);
+				val.setObject(*dirobj);
 				dir_index=-1;
 				if(p->user==NULL || chk_ar(p->cfg,p->cfg->dir[d]->ar,p->user,p->client)) {
 
 					if(!JS_GetArrayLength(cx, dir_list, (unsigned*)&dir_index))
 						return false;
 
-					if(!JS_SetElement(cx, dir_list, dir_index, &val))
+					if(!JS_SetElement(cx, dir_list, dir_index, val))
 						return false;
 				}
 
 				/* Add as property (associative array element) */
 				if(!JS_DefineProperty(cx, alldirs, p->cfg->dir[d]->code, val
-					,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE))
+					,JSPROP_READONLY|JSPROP_ENUMERATE))
 					return false;
 
 				if(d==p->cfg->user_dir 
 					&& !JS_DefineProperty(cx, areaobj, "user_dir", val
-						,NULL,NULL,JSPROP_READONLY))
+						,JSPROP_READONLY))
 					return false;
 
 				if(d==p->cfg->sysop_dir 
 					&& !JS_DefineProperty(cx, areaobj, "sysop_dir", val
-						,NULL,NULL,JSPROP_READONLY))
+						,JSPROP_READONLY))
 					return false;
 
 				if(d==p->cfg->upload_dir 
 					&& !JS_DefineProperty(cx, areaobj, "upload_dir", val
-						,NULL,NULL,JSPROP_READONLY))
+						,JSPROP_READONLY))
 					return false;
 
 				if(d==p->cfg->lib[l]->offline_dir
 					&& !JS_DefineProperty(cx, libobj, "offline_dir", val
-						,NULL,NULL,JSPROP_READONLY))
+						,JSPROP_READONLY))
 					return false;
 
-				val=INT_TO_JSVAL(dir_index);
-				if(!JS_SetProperty(cx, dirobj, "index", &val))
+				val.setNumber((double)dir_index);
+				if(!JS_SetProperty(cx, dirobj, "index", val))
 					return false;
 
-				val=INT_TO_JSVAL(d);
-				if(!JS_SetProperty(cx, dirobj, "number", &val))
+				val.setNumber(d);
+				if(!JS_SetProperty(cx, dirobj, "number", val))
 					return false;
 
-				val=INT_TO_JSVAL(lib_index);
-				if(!JS_SetProperty(cx, dirobj, "lib_index", &val))
+				val.setNumber((double)lib_index);
+				if(!JS_SetProperty(cx, dirobj, "lib_index", val))
 					return false;
 
-				val=INT_TO_JSVAL(p->cfg->dir[d]->lib);
-				if(!JS_SetProperty(cx, dirobj, "lib_number", &val))
+				val.setNumber((double)p->cfg->dir[d]->lib);
+				if(!JS_SetProperty(cx, dirobj, "lib_number", val))
 					return false;
 
 				if((js_str=JS_NewStringCopyZ(cx, p->cfg->lib[p->cfg->dir[d]->lib]->sname))==NULL)
 					return false;
-				val=STRING_TO_JSVAL(js_str);
-				if(!JS_SetProperty(cx, dirobj, "lib_name", &val))
+				val.setString(js_str);
+				if(!JS_SetProperty(cx, dirobj, "lib_name", val))
 					return false;
 
 				if((js_str=JS_NewStringCopyZ(cx, p->cfg->dir[d]->code))==NULL)
 					return false;
-				val=STRING_TO_JSVAL(js_str);
-				if(!JS_SetProperty(cx, dirobj, "code", &val))
+				val.setString(js_str);
+				if(!JS_SetProperty(cx, dirobj, "code", val))
 					return false;
 
 				if((js_str=JS_NewStringCopyZ(cx, p->cfg->dir[d]->sname))==NULL)
 					return false;
-				val=STRING_TO_JSVAL(js_str);
-				if(!JS_SetProperty(cx, dirobj, "name", &val))
+				val.setString(js_str);
+				if(!JS_SetProperty(cx, dirobj, "name", val))
 					return false;
 
 				if((js_str=JS_NewStringCopyZ(cx, p->cfg->dir[d]->lname))==NULL)
 					return false;
-				val=STRING_TO_JSVAL(js_str);
-				if(!JS_SetProperty(cx, dirobj, "description", &val))
+				val.setString(js_str);
+				if(!JS_SetProperty(cx, dirobj, "description", val))
 					return false;
 
 				if((js_str=JS_NewStringCopyZ(cx, p->cfg->dir[d]->path))==NULL)
 					return false;
-				val=STRING_TO_JSVAL(js_str);
-				if(!JS_SetProperty(cx, dirobj, "path", &val))
+				val.setString(js_str);
+				if(!JS_SetProperty(cx, dirobj, "path", val))
 					return false;
 
 				if((js_str=JS_NewStringCopyZ(cx, p->cfg->dir[d]->arstr))==NULL)
 					return false;
-				if(!JS_DefineProperty(cx, dirobj, "ars", STRING_TO_JSVAL(js_str)
-					,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+				if(!JS_DefineProperty(cx, dirobj, "ars", js_str
+					,JSPROP_ENUMERATE|JSPROP_READONLY))
 					return false;
 
 				if((js_str=JS_NewStringCopyZ(cx, p->cfg->dir[d]->ul_arstr))==NULL)
 					return false;
-				if(!JS_DefineProperty(cx, dirobj, "upload_ars", STRING_TO_JSVAL(js_str)
-					,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+				if(!JS_DefineProperty(cx, dirobj, "upload_ars", js_str
+					,JSPROP_ENUMERATE|JSPROP_READONLY))
 					return false;
 
 				if((js_str=JS_NewStringCopyZ(cx, p->cfg->dir[d]->dl_arstr))==NULL)
 					return false;
-				if(!JS_DefineProperty(cx, dirobj, "download_ars", STRING_TO_JSVAL(js_str)
-					,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+				if(!JS_DefineProperty(cx, dirobj, "download_ars", js_str
+					,JSPROP_ENUMERATE|JSPROP_READONLY))
 					return false;
 
 				if((js_str=JS_NewStringCopyZ(cx, p->cfg->dir[d]->ex_arstr))==NULL)
 					return false;
-				if(!JS_DefineProperty(cx, dirobj, "exempt_ars", STRING_TO_JSVAL(js_str)
-					,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))	/* exception here: Oct-15-2006 */
+				if(!JS_DefineProperty(cx, dirobj, "exempt_ars", js_str
+					,JSPROP_ENUMERATE|JSPROP_READONLY))	/* exception here: Oct-15-2006 */
 					return false;
 
 				if((js_str=JS_NewStringCopyZ(cx, p->cfg->dir[d]->op_arstr))==NULL)
 					return false;
-				if(!JS_DefineProperty(cx, dirobj, "operator_ars", STRING_TO_JSVAL(js_str)
-					,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
+				if(!JS_DefineProperty(cx, dirobj, "operator_ars", js_str
+					,JSPROP_ENUMERATE|JSPROP_READONLY))
 					return false;
 
 				if((js_str=JS_NewStringCopyZ(cx, p->cfg->dir[d]->exts))==NULL)
 					return false;
-				val=STRING_TO_JSVAL(js_str);
-				if(!JS_SetProperty(cx, dirobj, "extensions", &val))
+				val.setString(js_str);
+				if(!JS_SetProperty(cx, dirobj, "extensions", val))
 					return false;
 
 				if((js_str=JS_NewStringCopyZ(cx, p->cfg->dir[d]->upload_sem))==NULL)
 					return false;
-				val=STRING_TO_JSVAL(js_str);
-				if(!JS_SetProperty(cx, dirobj, "upload_sem", &val))
+				val.setString(js_str);
+				if(!JS_SetProperty(cx, dirobj, "upload_sem", val))
 					return false;
 
 				if((js_str=JS_NewStringCopyZ(cx, p->cfg->dir[d]->data_dir))==NULL)
 					return false;
-				val=STRING_TO_JSVAL(js_str);
-				if(!JS_SetProperty(cx, dirobj, "data_dir", &val))
+				val.setString(js_str);
+				if(!JS_SetProperty(cx, dirobj, "data_dir", val))
 					return false;
 
-				val=UINT_TO_JSVAL(p->cfg->dir[d]->misc);
-				if(!JS_SetProperty(cx, dirobj, "settings", &val))
+				val.setNumber(p->cfg->dir[d]->misc);
+				if(!JS_SetProperty(cx, dirobj, "settings", val))
 					return false;
 
-				val=INT_TO_JSVAL(p->cfg->dir[d]->seqdev);
-				if(!JS_SetProperty(cx, dirobj, "seqdev", &val))
+				val.setNumber((double)p->cfg->dir[d]->seqdev);
+				if(!JS_SetProperty(cx, dirobj, "seqdev", val))
 					return false;
 
-				val=INT_TO_JSVAL(p->cfg->dir[d]->sort);
-				if(!JS_SetProperty(cx, dirobj, "sort", &val))
+				val.setNumber((double)p->cfg->dir[d]->sort);
+				if(!JS_SetProperty(cx, dirobj, "sort", val))
 					return false;
 
-				val=INT_TO_JSVAL(p->cfg->dir[d]->maxfiles);
-				if(!JS_SetProperty(cx, dirobj, "max_files", &val))
+				val.setNumber((double)p->cfg->dir[d]->maxfiles);
+				if(!JS_SetProperty(cx, dirobj, "max_files", val))
 					return false;
 
-				val=INT_TO_JSVAL(p->cfg->dir[d]->maxage);
-				if(!JS_SetProperty(cx, dirobj, "max_age", &val))
+				val.setNumber((double)p->cfg->dir[d]->maxage);
+				if(!JS_SetProperty(cx, dirobj, "max_age", val))
 					return false;
 
-				val=INT_TO_JSVAL(p->cfg->dir[d]->up_pct);
-				if(!JS_SetProperty(cx, dirobj, "upload_credit_pct", &val))
+				val.setNumber((double)p->cfg->dir[d]->up_pct);
+				if(!JS_SetProperty(cx, dirobj, "upload_credit_pct", val))
 					return false;
 
-				val=INT_TO_JSVAL(p->cfg->dir[d]->dn_pct);
-				if(!JS_SetProperty(cx, dirobj, "download_credit_pct", &val))
+				val.setNumber((double)p->cfg->dir[d]->dn_pct);
+				if(!JS_SetProperty(cx, dirobj, "download_credit_pct", val))
 					return false;
 
 				sprintf(vpath,"/%s/%s/%s"
@@ -451,8 +456,8 @@ bool DLLCALL js_file_area_resolve(JSContext* cx, JS::HandleObject areaobj, JS::H
 					,p->html_index_file);
 				if((js_str=JS_NewStringCopyZ(cx, vpath))==NULL)
 					return false;
-				val=STRING_TO_JSVAL(js_str);
-				if(!JS_SetProperty(cx, dirobj, "link", &val))
+				val.setString(js_str);
+				if(!JS_SetProperty(cx, dirobj, "link", val))
 					return false;
 
 				if(p->user!=NULL 
@@ -463,53 +468,53 @@ bool DLLCALL js_file_area_resolve(JSContext* cx, JS::HandleObject areaobj, JS::H
 				else
 					is_op=FALSE;
 
-				val = BOOLEAN_TO_JSVAL(dir_index >= 0 && lib_index >= 0);
-				if(!JS_SetProperty(cx, dirobj, "can_access", &val))
+				val.setBoolean(dir_index >= 0 && lib_index >= 0);
+				if(!JS_SetProperty(cx, dirobj, "can_access", val))
 					return false;
 
 				if(p->user==NULL 
 					|| ((is_op || p->user->exempt&FLAG('U')
 					|| chk_ar(p->cfg,p->cfg->dir[d]->ul_ar,p->user,p->client))
 					&& !(p->user->rest&FLAG('T')) && !(p->user->rest&FLAG('U'))))
-					val=JSVAL_TRUE;
+					val.setBoolean(true);
 				else
-					val=JSVAL_FALSE;
-				if(!JS_SetProperty(cx, dirobj, "can_upload", &val))
+					val.setBoolean(false);
+				if(!JS_SetProperty(cx, dirobj, "can_upload", val))
 					return false;
 
 				if(p->user==NULL 
 					|| (chk_ar(p->cfg,p->cfg->dir[d]->dl_ar,p->user,p->client)
 					&& !(p->user->rest&FLAG('T')) && !(p->user->rest&FLAG('D'))))
-					val=JSVAL_TRUE;
+					val.setBoolean(true);
 				else
-					val=JSVAL_FALSE;
-				if(!JS_SetProperty(cx, dirobj, "can_download", &val))
+					val.setBoolean(false);
+				if(!JS_SetProperty(cx, dirobj, "can_download", val))
 					return false;
 
 				if(is_download_free(p->cfg,d,p->user,p->client))
-					val=JSVAL_TRUE;
+					val.setBoolean(true);
 				else
-					val=JSVAL_FALSE;
-				if(!JS_SetProperty(cx, dirobj, "is_exempt", &val))
+					val.setBoolean(false);
+				if(!JS_SetProperty(cx, dirobj, "is_exempt", val))
 					return false;
 
 				if(is_op)
-					val=JSVAL_TRUE;
+					val.setBoolean(true);
 				else
-					val=JSVAL_FALSE;
-				if(!JS_SetProperty(cx, dirobj, "is_operator", &val))
+					val.setBoolean(false);
+				if(!JS_SetProperty(cx, dirobj, "is_operator", val))
 					return false;
 
-				val=BOOLEAN_TO_JSVAL(d==p->cfg->lib[l]->offline_dir);
-				if(!JS_SetProperty(cx, dirobj, "is_offline", &val))
+				val.setBoolean(d==p->cfg->lib[l]->offline_dir);
+				if(!JS_SetProperty(cx, dirobj, "is_offline", val))
 					return false;
 
-				val=BOOLEAN_TO_JSVAL(d==p->cfg->upload_dir);
-				if(!JS_SetProperty(cx, dirobj, "is_upload", &val))
+				val.setBoolean(d==p->cfg->upload_dir);
+				if(!JS_SetProperty(cx, dirobj, "is_upload", val))
 					return false;
 
-				val=BOOLEAN_TO_JSVAL(d==p->cfg->sysop_dir);
-				if(!JS_SetProperty(cx, dirobj, "is_sysop", &val))
+				val.setBoolean(d==p->cfg->sysop_dir);
+				if(!JS_SetProperty(cx, dirobj, "is_sysop", val))
 					return false;
 
 #ifdef BUILD_JSDOCS
@@ -533,12 +538,14 @@ bool DLLCALL js_file_area_resolve(JSContext* cx, JS::HandleObject areaobj, JS::H
 	if (name)
 		free(name);
 
+	*resolved = true;
 	return true;
 }
 
 static bool js_file_area_enumerate(JSContext *cx, JS::HandleObject obj)
 {
-	return(js_file_area_resolve(cx, obj, JS::JSID_VOIDHANDLE));
+	bool resolved;
+	return(js_file_area_resolve(cx, obj, JSID_VOIDHANDLE, &resolved));
 }
 
 static void 
@@ -554,26 +561,30 @@ js_file_area_finalize(JSFreeOp *fop, JSObject *obj)
 	JS_SetPrivate(obj,NULL);
 }
 
+static JSClassOps js_file_area_class_ops = {
+	 NULL                   /* addProperty */
+	,NULL                   /* delProperty */
+	,NULL                   /* getProperty */
+	,NULL                   /* setProperty */
+	,js_file_area_enumerate /* enumerate   */
+	,js_file_area_resolve   /* resolve     */
+	,NULL                   /* convert     */
+	,js_file_area_finalize  /* finalize    */
+};
 
 static JSClass js_file_area_class = {
-     "FileArea"				/* name			*/
-    ,JSCLASS_HAS_PRIVATE	/* flags		*/
-	,JS_PropertyStub		/* addProperty	*/
-	,JS_DeletePropertyStub		/* delProperty	*/
-	,JS_PropertyStub		/* getProperty	*/
-	,JS_StrictPropertyStub		/* setProperty	*/
-	,js_file_area_enumerate	/* enumerate	*/
-	,js_file_area_resolve	/* resolve		*/
-	,JS_ConvertStub			/* convert		*/
-	,js_file_area_finalize	/* finalize		*/
+	 "FileArea"              /* name  */
+	,JSCLASS_HAS_PRIVATE     /* flags */
+	,&js_file_area_class_ops /* cOps  */
 };
 
-DLLEXPORT JSObject* DLLCALL js_CreateFileAreaObject(JSContext* cx, JSObject* parent, scfg_t* cfg
-					,user_t* user, client_t* client, char* html_index_file) {
-	JSObject* obj;
+DLLEXPORT JS::HandleObject DLLCALL js_CreateFileAreaObject(JSContext* cx, JS::HandleObject parent, scfg_t* cfg
+					,user_t* user, client_t* client, char* html_index_file)
+{
+	JS::RootedObject obj(cx);
 	struct js_file_area_priv *p;
 
-	obj = JS_DefineObject(cx, parent, "file_area", &js_file_area_class, NULL
+	obj = JS_DefineObject(cx, parent, "file_area", &js_file_area_class
 		,JSPROP_ENUMERATE|JSPROP_READONLY);
 
 	if(obj==NULL)
@@ -587,9 +598,7 @@ DLLEXPORT JSObject* DLLCALL js_CreateFileAreaObject(JSContext* cx, JSObject* par
 	p->cfg = cfg;
 	p->user = user;
 	p->client = client;
-	if (html_index_file == NULL)
-		html_index_file = "";
-	p->html_index_file = strdup(html_index_file);
+	p->html_index_file = strdup(html_index_file ? html_index_file : "");
 
 	JS_SetPrivate(obj, p);