diff --git a/src/sbbs3/exec.cpp b/src/sbbs3/exec.cpp
index 715e0a149435bb2413b05a30ce7a4acb5df704fc..5406fcfba903eae8ba1aa2e55f45f90885716c31 100644
--- a/src/sbbs3/exec.cpp
+++ b/src/sbbs3/exec.cpp
@@ -553,7 +553,7 @@ js_BranchCallback(JSContext *cx, JSScript *script)
 	return(js_CommonBranchCallback(cx,&sbbs->js_branch));
 }
 
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 static JSBool
 js_OperationCallback(JSContext *cx)
 {
@@ -665,7 +665,7 @@ long sbbs_t::js_execfile(const char *cmd, const char* startup_dir, JSObject* sco
 	if(scope==NULL) {
 		js_branch.counter=0;	// Reset loop counter
 
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 		JS_SetOperationCallback(js_cx, js_OperationCallback);
 #else
 		JS_SetBranchCallback(js_cx, js_BranchCallback);
diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c
index efcbae5fbc0a855af5f787db9af48725ff5c9860..b112b5a64b34e97d48fc42646affade68c3b9922 100644
--- a/src/sbbs3/js_global.c
+++ b/src/sbbs3/js_global.c
@@ -166,7 +166,7 @@ static JSBool js_BranchCallback(JSContext *cx, JSScript* script)
 	return js_CommonBranchCallback(cx,&bg->branch);
 }
 
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 static JSBool
 js_OperationCallback(JSContext *cx)
 {
@@ -311,7 +311,7 @@ js_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 
 		/* Set our branch callback (which calls the generic branch callback) */
 		JS_SetContextPrivate(bg->cx, bg);
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 		JS_SetOperationCallback(bg->cx, js_OperationCallback);
 #else
 		JS_SetBranchCallback(bg->cx, js_BranchCallback);
diff --git a/src/sbbs3/js_internal.c b/src/sbbs3/js_internal.c
index cc9ece4ccf86a04e44d6544ea15bd771007102f1..835c2c952bc2a950798559ec04c65a8108f35678 100644
--- a/src/sbbs3/js_internal.c
+++ b/src/sbbs3/js_internal.c
@@ -278,14 +278,14 @@ js_eval(JSContext *parent_cx, JSObject *parent_obj, uintN argc, jsval *argv, jsv
 
 #ifdef EVAL_BRANCH_CALLBACK
 	JS_SetContextPrivate(cx, JS_GetPrivate(parent_cx, parent_obj));
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 	JS_SetOperationCallback(cx, js_OperationCallback);
 #else
 	JS_SetBranchCallback(cx, js_BranchCallback);
 #endif
 #else	/* Use the branch callback from the parent context */
 	JS_SetContextPrivate(cx, JS_GetContextPrivate(parent_cx));
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 	JS_SetOperationCallback(cx, JS_GetOperationCallback(parent_cx));
 #else
 	callback=JS_SetBranchCallback(parent_cx,NULL);
@@ -429,6 +429,23 @@ static JSClass js_internal_class = {
 	,JS_FinalizeStub		/* finalize		*/
 };
 
+#if JS_VERSION >= 185
+char* DLLCALL js_getstring(JSContext *cx, JSString *str)
+{
+	size_t			len;
+	const jschar	*val;
+	char			*ret;
+
+	if(!(val=JS_GetStringCharsAndLength(cx, str, &len)))
+		return NULL;
+	if(!(ret=malloc(len+1))
+		return NULL;
+	memcpy(ret, val, len);
+	ret[len]=0;
+	return ret;
+}
+#endif
+
 void DLLCALL js_EvalOnExit(JSContext *cx, JSObject *obj, js_branch_t* branch)
 {
 	char*	p;
diff --git a/src/sbbs3/js_rtpool.c b/src/sbbs3/js_rtpool.c
index a4df254f78a3123c30a72e68a23ebb8f0ba10ee8..e87650e4a3f2e0c4447644205be5526a99454897 100644
--- a/src/sbbs3/js_rtpool.c
+++ b/src/sbbs3/js_rtpool.c
@@ -129,7 +129,7 @@ void DLLCALL jsrt_Release(JSRuntime *rt)
 
 void DLLCALL jsrt_TriggerAll(void)
 {
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 	int	i;
 	int j;
 	JSContext	*iterp,*cx;
diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c
index 61cdcc27dc91a36b65dc1468dc8b1bb0946a59af..f864482a307780b0edae12acce345b23518a909e 100644
--- a/src/sbbs3/jsexec.c
+++ b/src/sbbs3/jsexec.c
@@ -615,7 +615,7 @@ js_BranchCallback(JSContext *cx, JSScript *script)
     return(js_CommonBranchCallback(cx,&branch));
 }
 
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 static JSBool
 js_OperationCallback(JSContext *cx)
 {
@@ -814,7 +814,7 @@ long js_exec(const char *fname, char** args)
 
 	branch.terminated=&terminated;
 
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 	JS_SetOperationCallback(js_cx, js_OperationCallback);
 #else
 	JS_SetBranchCallback(js_cx, js_BranchCallback);
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index f015b6a5d8f454d9d1fde630ed50fecfa97e59f3..be82d900b84ca87382d28d4cc7fe41c30a889f53 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -105,10 +105,23 @@ extern int	thread_suid_broken;			/* NPTL is no longer broken */
 		#define XP_PC
 		#define XP_WIN
 	#endif
-	#define JS_THREADSAFE	/* Required! */
+#ifndef __cplusplus
+	#include <stdbool.h>
+	#include <inttypes.h>
+#endif
+	#include <jsconfig.h>
+#if JS_VERSION < 185
+	#define JS_THREADSAFE
+#endif
 	#include <jsapi.h>
+#if (JS_VERSION < 185) || (defined __cplusplus)
 	#include <jsprf.h>		/* JS-safe sprintf functions */
 	#include <jsnum.h>		/* JSDOUBLE_IS_NaN() */
+#endif
+#if JS_VERSION >= 185
+	#define JSScript					JSObject
+	#define JS_DestroyScript(cx,script)
+#endif
 
 #endif
 
@@ -1036,6 +1049,7 @@ extern "C" {
 	DLLEXPORT JSBool	DLLCALL js_CommonBranchCallback(JSContext*, js_branch_t*);
 	DLLEXPORT void		DLLCALL js_EvalOnExit(JSContext*, JSObject*, js_branch_t*);
 	DLLEXPORT void		DLLCALL	js_PrepareToExecute(JSContext*, JSObject*, const char *filename, const char* startup_dir);
+	DLLEXPORT char*		DLLCALL js_getstring(JSContext *cx, JSString *str);
 
 	/* js_system.c */
 	DLLEXPORT JSObject* DLLCALL js_CreateSystemObject(JSContext* cx, JSObject* parent
diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index 330eeb3b336dcb55254c96727a311f180af11d4b..259dc6be9664b0dc62041ff9cceac763aad3d0af 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -949,7 +949,7 @@ js_BranchCallback(JSContext *cx, JSScript *script)
 	return js_CommonBranchCallback(cx,&client->branch);
 }
 
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 static JSBool
 js_OperationCallback(JSContext *cx)
 {
@@ -1153,7 +1153,7 @@ static void js_service_thread(void* arg)
 		lprintf(LOG_ERR,"%04d !JavaScript FAILED to compile script (%s)",socket,spath);
 	else  {
 		js_PrepareToExecute(js_cx, js_glob, spath, /* startup_dir */NULL);
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 		JS_SetOperationCallback(js_cx, js_OperationCallback);
 #else
 		JS_SetBranchCallback(js_cx, js_BranchCallback);
@@ -1256,7 +1256,7 @@ static void js_static_service_thread(void* arg)
 		val = BOOLEAN_TO_JSVAL(JS_FALSE);
 		JS_SetProperty(js_cx, js_glob, "logged_in", &val);
 
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 		JS_SetOperationCallback(js_cx, js_OperationCallback);
 #else
 		JS_SetBranchCallback(js_cx, js_BranchCallback);
diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c
index 60533bab3381ade03388c88cd4e328fb9ff9c58b..5866e96813f051483810848de8ba100ec71be71b 100644
--- a/src/sbbs3/websrvr.c
+++ b/src/sbbs3/websrvr.c
@@ -4430,7 +4430,7 @@ js_BranchCallback(JSContext *cx, JSScript *script)
     return(js_CommonBranchCallback(cx,&session->js_branch));
 }
 
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 static JSBool
 js_OperationCallback(JSContext *cx)
 {
@@ -4459,7 +4459,7 @@ js_initcx(http_session_t *session)
 
     JS_SetErrorReporter(js_cx, js_ErrorReporter);
 
-#ifdef USE_JS_OPERATION_CALLBACK
+#if JS_VERSION>180
 	JS_SetOperationCallback(js_cx, js_OperationCallback);
 #else
 	JS_SetBranchCallback(js_cx, js_BranchCallback);