Commit f31b902a0a for freeswitch.com

commit f31b902a0ad779bba9a64603a8877ca5fc850c80
Author: Andrey Volk <andywolk@gmail.com>
Date:   Thu Jun 11 01:38:53 2026 +0300

    [mod_v8] Use upstream libnode-dev instead of custom libv8-6.1-dev on Linux. Enable for ARM64 and armhf. (#3052)

diff --git a/.github/workflows/scan-build.yml b/.github/workflows/scan-build.yml
index 5617f3a688..4237a28c4f 100644
--- a/.github/workflows/scan-build.yml
+++ b/.github/workflows/scan-build.yml
@@ -54,7 +54,7 @@ jobs:
         shell: bash
         working-directory: freeswitch
         run: |
-          DEBIAN_FRONTEND=noninteractive apt-get install -y libpcre2-dev libsphinxbase-dev libpocketsphinx-dev
+          DEBIAN_FRONTEND=noninteractive apt-get install -y libpcre2-dev libsphinxbase-dev libpocketsphinx-dev libnode-dev
           ./ci.sh -t scan-build -a configure -c sofia-sip -p "$GITHUB_WORKSPACE/sofia-sip"
           ./ci.sh -t scan-build -a build -c sofia-sip -p "$GITHUB_WORKSPACE/sofia-sip"
           ./ci.sh -t scan-build -a install -c sofia-sip -p "$GITHUB_WORKSPACE/sofia-sip"
diff --git a/configure.ac b/configure.ac
index 5dd7e4b980..f1ef880d53 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1507,21 +1507,60 @@ PKG_CHECK_MODULES([MEMCACHED], [libmemcached >= 0.31],[
   AM_CONDITIONAL([HAVE_MEMCACHED],[false])
 ])

-PKG_CHECK_MODULES([V8FS_STATIC], [v8-6.1_static >= 6.1.298],[
-  AM_CONDITIONAL([HAVE_V8FS],[true])],[
-  PKG_CHECK_MODULES([V8FS_STATIC], [v8fs_static >= 6.1.298],[
-    AM_CONDITIONAL([HAVE_V8FS],[true])],[
-    PKG_CHECK_MODULES([V8FS_STATIC], [v8 >= 6.1.298],[
-      AM_CONDITIONAL([HAVE_V8FS],[true])],[
-      if module_enabled mod_v8; then
-        AC_MSG_ERROR([You need to either install libv8-6.1-dev (>= 6.1.298), libv8fs-dev (>= 6.1.298) or disable mod_v8 in modules.conf])
-      else
-        AC_MSG_RESULT([no])
-        AM_CONDITIONAL([HAVE_V8FS],[false])
-      fi
-    ])
-  ])
-])
+# mod_v8 needs the V8 JavaScript engine, provided by libnode-dev. It ships no
+# pkg-config file, so probe the well known header and library locations.
+AC_ARG_WITH([v8],
+  [AS_HELP_STRING([--with-v8=DIR],
+    [look for the libnode/V8 headers (the directory containing v8.h) in DIR])],
+  [v8_incdir="$withval"], [v8_incdir=""])
+
+have_v8="no"
+
+AC_MSG_CHECKING([for libnode bundled V8 headers])
+V8_INCDIR=""
+for d in "$v8_incdir" /usr/include/nodejs/deps/v8/include /usr/include/node /usr/local/include/node /usr/include/v8 ; do
+  if test -n "$d" && test -f "$d/v8.h" && test -f "$d/libplatform/libplatform.h" ; then
+    V8_INCDIR="$d"; break
+  fi
+done
+if test -n "$V8_INCDIR"; then
+  AC_MSG_RESULT([$V8_INCDIR])
+  AC_LANG_PUSH([C++])
+  v8_save_LIBS="$LIBS"
+  # Prefer the standalone split V8 libraries shipped by libnode-dev; fall
+  # back to the all-in-one libnode if they are not present.
+  AC_MSG_CHECKING([for standalone V8 libraries (-lv8 -lv8_libplatform)])
+  LIBS="-lv8 -lv8_libplatform -lv8_libbase $v8_save_LIBS"
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],
+    [AC_MSG_RESULT([yes]); V8_LIBS="-lv8 -lv8_libplatform -lv8_libbase"],
+    [AC_MSG_RESULT([no])
+     AC_MSG_CHECKING([for all-in-one libnode (-lnode)])
+     LIBS="-lnode $v8_save_LIBS"
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],
+       [AC_MSG_RESULT([yes]); V8_LIBS="-lnode"],
+       [AC_MSG_RESULT([no])])])
+  LIBS="$v8_save_LIBS"
+  AC_LANG_POP([C++])
+  if test -n "$V8_LIBS"; then
+    V8_CFLAGS="-I$V8_INCDIR"
+    have_v8="yes"
+  fi
+else
+  AC_MSG_RESULT([no])
+fi
+
+AC_SUBST([V8_CFLAGS])
+AC_SUBST([V8_LIBS])
+
+if test "x$have_v8" = "xyes"; then
+  AM_CONDITIONAL([HAVE_V8],[true])
+else
+  if module_enabled mod_v8; then
+    AC_MSG_ERROR([mod_v8 is enabled but libnode was not found. Install libnode-dev (Debian/Ubuntu: apt-get install libnode-dev) or disable mod_v8 in modules.conf])
+  else
+    AM_CONDITIONAL([HAVE_V8],[false])
+  fi
+fi

 PKG_CHECK_MODULES([KS], [libks2 >= 2.0.11],[
   AM_CONDITIONAL([HAVE_KS],[true])],[
diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh
index 80996ed4dc..b4f6eb3a57 100755
--- a/debian/bootstrap.sh
+++ b/debian/bootstrap.sh
@@ -51,10 +51,8 @@ avoid_mods=(
   xml_int/mod_xml_ldap
 )
 avoid_mods_armhf=(
-  languages/mod_v8
 )
 avoid_mods_arm64=(
-  languages/mod_v8
 )
 avoid_mods_sid=(
   directories/mod_ldap
diff --git a/debian/control-modules b/debian/control-modules
index 07a7bdc455..c33b873a88 100755
--- a/debian/control-modules
+++ b/debian/control-modules
@@ -540,7 +540,7 @@ Build-Depends-Trixie: python3-dev, python3-setuptools
 Module: languages/mod_v8
 Description: mod_v8
  Adds mod_v8.
-Build-Depends: git, libv8-6.1-dev
+Build-Depends: libnode-dev

 ## mod/loggers

diff --git a/src/mod/languages/mod_v8/Makefile.am b/src/mod/languages/mod_v8/Makefile.am
index 1363d8b2c2..bb14928ae9 100644
--- a/src/mod/languages/mod_v8/Makefile.am
+++ b/src/mod/languages/mod_v8/Makefile.am
@@ -4,12 +4,12 @@ AUTOMAKE_OPTIONS += foreign

 MODNAME=mod_v8

-AM_CFLAGS    += -I. -I./include -I$(switch_srcdir)/src/mod/languages/mod_v8/include $(V8FS_STATIC_CFLAGS)
-AM_CPPFLAGS  += -I. -I./include -I$(switch_srcdir)/src/mod/languages/mod_v8/include $(V8FS_STATIC_CFLAGS) -std=c++11
+AM_CFLAGS    += -I. -I./include -I$(switch_srcdir)/src/mod/languages/mod_v8/include $(V8_CFLAGS)
+AM_CPPFLAGS  += -I. -I./include -I$(switch_srcdir)/src/mod/languages/mod_v8/include $(V8_CFLAGS) -std=c++17
 AM_LDFLAGS   += -avoid-version -module -no-undefined -shared

 AM_LIBADD     = $(switch_builddir)/libfreeswitch.la
-AM_LDFLAGS   += $(V8FS_STATIC_LIBS)
+AM_LDFLAGS   += $(V8_LIBS)

 BUILT_SOURCES = $(V8LIB)

diff --git a/src/mod/languages/mod_v8/include/fsdtmf.hpp b/src/mod/languages/mod_v8/include/fsdtmf.hpp
index c931390cea..0482a8ef0b 100644
--- a/src/mod/languages/mod_v8/include/fsdtmf.hpp
+++ b/src/mod/languages/mod_v8/include/fsdtmf.hpp
@@ -56,7 +56,7 @@ public:

 	/* Methods available from JavaScript */
 	static void *Construct(const v8::FunctionCallbackInfo<v8::Value>& info);
-	static v8::Handle<v8::Object> New(switch_dtmf_t *dtmf, const char *name, JSMain *js);
+	static v8::Local<v8::Object> New(switch_dtmf_t *dtmf, const char *name, JSMain *js);
 	JS_DTMF_GET_PROPERTY_DEF(GetProperty);
 };

diff --git a/src/mod/languages/mod_v8/include/fsevent.hpp b/src/mod/languages/mod_v8/include/fsevent.hpp
index 53336aede2..b289268b2e 100644
--- a/src/mod/languages/mod_v8/include/fsevent.hpp
+++ b/src/mod/languages/mod_v8/include/fsevent.hpp
@@ -67,7 +67,7 @@ public:

 	/* Methods available from JavaScript */
 	static void *Construct(const v8::FunctionCallbackInfo<v8::Value>& info);
-	static v8::Handle<v8::Object> New(switch_event_t *event, const char *name, JSMain *js);
+	static v8::Local<v8::Object> New(switch_event_t *event, const char *name, JSMain *js);
 	JS_EVENT_FUNCTION_DEF(AddHeader);
 	JS_EVENT_FUNCTION_DEF(GetHeader);
 	JS_EVENT_FUNCTION_DEF(IsArrayHeader);
diff --git a/src/mod/languages/mod_v8/include/fsxml.hpp b/src/mod/languages/mod_v8/include/fsxml.hpp
index e831c659ec..b8e81b8352 100644
--- a/src/mod/languages/mod_v8/include/fsxml.hpp
+++ b/src/mod/languages/mod_v8/include/fsxml.hpp
@@ -53,7 +53,7 @@ private:

 	void Init();
 	void InitRootObject();
-	v8::Handle<v8::Value> GetJSObjFromXMLObj(const switch_xml_t xml, const v8::FunctionCallbackInfo<v8::Value>& info);
+	v8::Local<v8::Value> GetJSObjFromXMLObj(const switch_xml_t xml, const v8::FunctionCallbackInfo<v8::Value>& info);
 	void StoreObjectInHash(switch_xml_t xml, FSXML *obj);
 	FSXML *FindObjectInHash(switch_xml_t xml);
 	void DeleteObjectInHash(switch_xml_t xml);
diff --git a/src/mod/languages/mod_v8/include/javascript.hpp b/src/mod/languages/mod_v8/include/javascript.hpp
index 800e5894af..35d30ea570 100644
--- a/src/mod/languages/mod_v8/include/javascript.hpp
+++ b/src/mod/languages/mod_v8/include/javascript.hpp
@@ -33,10 +33,160 @@

 #include <stdint.h>
 #include <v8.h>
+
+/*
+ * --- V8 API compatibility layer ---
+ *
+ * mod_v8 was originally written against the custom static V8 6.1 package. On
+ * modern systems FreeSWITCH builds it against the V8 engine bundled with
+ * upstream libnode-dev (V8 10.x). The two APIs differ in a handful of
+ * mechanical but pervasive ways (MaybeLocal return values, mandatory Isolate*
+ * / Context arguments, a few removed methods). The helpers below hide those
+ * differences so the bulk of the module is shared between both engines.
+ *
+ * Windows keeps building against the old static V8 6.1, so the legacy (#else)
+ * branches must remain valid. The active API is selected purely from
+ * V8_MAJOR_VERSION, so no build-system define is required.
+ */
+#if defined(V8_MAJOR_VERSION) && V8_MAJOR_VERSION >= 7
+#define V8FS_NEW_API 1
+#else
+#define V8FS_NEW_API 0
+#endif
+
 #if defined(V8_MAJOR_VERSION) && V8_MAJOR_VERSION >=5
 #include <libplatform/libplatform.h>
+#if !V8FS_NEW_API
+/* v8-util.h is unused by mod_v8 and is no longer shipped by libnode-dev. */
 #include <v8-util.h>
 #endif
+#endif
+
+/*
+ * The isolate / context currently entered by the running script. mod_v8 only
+ * touches V8 objects while a script is executing (inside an Isolate::Scope and
+ * Context::Scope), where GetCurrent()/GetCurrentContext() are valid.
+ */
+static inline v8::Isolate *js_current_isolate(void)
+{
+	return v8::Isolate::GetCurrent();
+}
+
+static inline v8::Local<v8::Context> js_current_context(void)
+{
+	return v8::Isolate::GetCurrent()->GetCurrentContext();
+}
+
+/*
+ * v8::String::NewFromUtf8() returns a Local on V8 6.1 but a MaybeLocal on
+ * V8 7+. This wrapper always yields a Local<String> and tolerates a NULL str.
+ */
+static inline v8::Local<v8::String> js_new_string(v8::Isolate *isolate, const char *str, int length = -1)
+{
+#if V8FS_NEW_API
+	return v8::String::NewFromUtf8(isolate, str ? str : "", v8::NewStringType::kNormal, length).ToLocalChecked();
+#else
+	return v8::String::NewFromUtf8(isolate, str ? str : "", v8::String::kNormalString, length);
+#endif
+}
+
+/*
+ * v8::String::Utf8Value requires an explicit Isolate* on V8 7+. The single
+ * argument constructor keeps the (very common) call sites unchanged by using
+ * the currently entered isolate.
+ */
+class JsUtf8Value : public v8::String::Utf8Value
+{
+public:
+	explicit JsUtf8Value(v8::Local<v8::Value> obj)
+#if V8FS_NEW_API
+		: v8::String::Utf8Value(v8::Isolate::GetCurrent(), obj) {}
+#else
+		: v8::String::Utf8Value(obj) {}
+#endif
+	JsUtf8Value(v8::Isolate *isolate, v8::Local<v8::Value> obj)
+#if V8FS_NEW_API
+		: v8::String::Utf8Value(isolate, obj) {}
+#else
+		: v8::String::Utf8Value(obj) {}
+#endif
+};
+
+/* v8::Value::BooleanValue lost its no-argument form on V8 7+. */
+static inline bool js_to_bool(v8::Local<v8::Value> val)
+{
+#if V8FS_NEW_API
+	return val->BooleanValue(v8::Isolate::GetCurrent());
+#else
+	return val->BooleanValue();
+#endif
+}
+
+/*
+ * v8::Object::Set() / Get() lost their no-context forms on V8 7+. These run
+ * while the script's context is entered, so the current context is used.
+ */
+static inline void js_obj_set(v8::Local<v8::Object> obj, v8::Local<v8::Value> key, v8::Local<v8::Value> val)
+{
+	obj->Set(js_current_context(), key, val).FromMaybe(false);
+}
+
+static inline v8::Local<v8::Value> js_obj_get(v8::Local<v8::Object> obj, v8::Local<v8::Value> key)
+{
+	return obj->Get(js_current_context(), key).FromMaybe(v8::Local<v8::Value>());
+}
+
+/*
+ * v8::ReturnValue::Set() no longer accepts a Persistent handle on V8 7+;
+ * convert it to a Local first. Local::New(isolate, persistent) is valid on the
+ * old API too, so this helper works for both engines.
+ */
+template <typename T>
+static inline v8::Local<T> js_local(const v8::Persistent<T> &persistent)
+{
+	return v8::Local<T>::New(v8::Isolate::GetCurrent(), persistent);
+}
+
+/* v8::Script::Run() now requires a context and returns a MaybeLocal. */
+static inline v8::Local<v8::Value> js_run_script(v8::Local<v8::Script> script)
+{
+	if (script.IsEmpty()) {
+		return v8::Local<v8::Value>();
+	}
+#if V8FS_NEW_API
+	v8::Local<v8::Value> result;
+	if (!script->Run(js_current_context()).ToLocal(&result)) {
+		return v8::Local<v8::Value>();
+	}
+	return result;
+#else
+	return script->Run();
+#endif
+}
+
+/* v8::Function::Call now requires a context and returns a MaybeLocal. */
+static inline v8::Local<v8::Value> js_call(v8::Local<v8::Function> fn, v8::Local<v8::Value> recv, int argc, v8::Local<v8::Value> *argv)
+{
+#if V8FS_NEW_API
+	v8::Local<v8::Value> result;
+	if (!fn->Call(js_current_context(), recv, argc, argv).ToLocal(&result)) {
+		return v8::Local<v8::Value>();
+	}
+	return result;
+#else
+	return fn->Call(recv, argc, argv);
+#endif
+}
+
+/* v8::StackTrace::GetFrame() requires an Isolate* on V8 7+. */
+static inline v8::Local<v8::StackFrame> js_stack_frame(v8::Local<v8::StackTrace> trace, v8::Isolate *isolate, uint32_t index)
+{
+#if V8FS_NEW_API
+	return trace->GetFrame(isolate, index);
+#else
+	return trace->GetFrame(index);
+#endif
+}

 #include <string>
 #include <vector>
@@ -64,7 +214,7 @@
 		} else {\
 			int line;\
 			char *file = JSMain::GetStackInfo(info.GetIsolate(), &line);\
-			v8::String::Utf8Value str(info.Holder());\
+			JsUtf8Value str(info.Holder());\
 			switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, "mod_v8", line, NULL, SWITCH_LOG_DEBUG, "No valid internal data available for %s when calling %s\n", *str ? *str : "[unknown]", #class_name "::" #method_name "()");\
 			free(file);\
 			info.GetReturnValue().Set(false);\
@@ -83,10 +233,10 @@
 		} else {\
 			int line;\
 			char *file = JSMain::GetStackInfo(info.GetIsolate(), &line);\
-			v8::String::Utf8Value str(info.Holder());\
+			JsUtf8Value str(info.Holder());\
 			switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, "mod_v8", line, NULL, SWITCH_LOG_DEBUG, "No valid internal data available for %s when calling %s\n", *str ? *str : "[unknown]", #class_name "::" #method_name "()");\
 			free(file);\
-			info.GetReturnValue().Set(false);\
+			/* A property setter's ReturnValue is void; V8 7+ rejects Set() on it. */\
 		}\
 	}\
 	void method_name##Impl(v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<void>& info)
@@ -102,7 +252,7 @@
 		} else {\
 			int line;\
 			char *file = JSMain::GetStackInfo(info.GetIsolate(), &line);\
-			v8::String::Utf8Value str(info.Holder());\
+			JsUtf8Value str(info.Holder());\
 			switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, "mod_v8", line, NULL, SWITCH_LOG_DEBUG, "No valid internal data available for %s when calling %s\n", *str ? *str : "[unknown]", #class_name "::" #method_name "()");\
 			free(file);\
 			info.GetReturnValue().Set(false);\
@@ -226,14 +376,14 @@ private:
 	static void CreateInstance(const v8::FunctionCallbackInfo<v8::Value>& args);

 	/* Store a C++ instance to a JS object's private data */
-	static void AddInstance(v8::Isolate *isolate, const v8::Handle<v8::Object>& handle, const v8::Handle<v8::External>& object, bool autoDestroy);
+	static void AddInstance(v8::Isolate *isolate, const v8::Local<v8::Object>& handle, const v8::Local<v8::External>& object, bool autoDestroy);
 public:
 	JSBase(JSMain *owner);
 	JSBase(const v8::FunctionCallbackInfo<v8::Value>& info);
 	virtual ~JSBase(void);

 	/* Returns the JS object related to the C++ instance */
-	v8::Handle<v8::Object> GetJavaScriptObject();
+	v8::Local<v8::Object> GetJavaScriptObject();

 	/* Register a C++ class inside V8 (must be called within a entered isolate, and context) */
 	static void Register(v8::Isolate *isolate, const js_class_definition_t *desc);
@@ -263,7 +413,7 @@ public:
 	}

 	/* Get a JavaScript function from a JavaScript argument (can be either a string or the actual function) */
-	static v8::Handle<v8::Function> GetFunctionFromArg(v8::Isolate *isolate, const v8::Local<v8::Value>& arg);
+	static v8::Local<v8::Function> GetFunctionFromArg(v8::Isolate *isolate, const v8::Local<v8::Value>& arg);

 	/* Default JS setter callback, to be used for read only values */
 	static void DefaultSetProperty(v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<void>& info);
diff --git a/src/mod/languages/mod_v8/mod_v8.cpp b/src/mod/languages/mod_v8/mod_v8.cpp
index 96ac67f2f6..b3b14906e4 100644
--- a/src/mod/languages/mod_v8/mod_v8.cpp
+++ b/src/mod/languages/mod_v8/mod_v8.cpp
@@ -95,6 +95,7 @@
 #include "fseventhandler.hpp"

 #include <set>
+#include <map>

 using namespace std;
 using namespace v8;
@@ -421,9 +422,9 @@ static int env_init(JSMain *js)
 static void v8_error(Isolate* isolate, TryCatch* try_catch)
 {
 	HandleScope handle_scope(isolate);
-	String::Utf8Value exception(try_catch->Exception());
+	JsUtf8Value exception(try_catch->Exception());
 	const char *exception_string = js_safe_str(*exception);
-	Handle<Message> message = try_catch->Message();
+	Local<Message> message = try_catch->Message();
 	const char *msg;
 	string filename = __FILE__;
 	int line = __LINE__;
@@ -437,16 +438,16 @@ static void v8_error(Isolate* isolate, TryCatch* try_catch)
 	}

 	if (!message.IsEmpty()) {
-		String::Utf8Value fname(message->GetScriptResourceName());
+		JsUtf8Value fname(message->GetScriptResourceName());

 		if (*fname) {
 			filename = *fname;
 		}

-		line = message->GetLineNumber();
+		line = message->GetLineNumber(js_current_context()).FromMaybe(0);
 		msg = exception_string;

-		String::Utf8Value sourceline(message->GetSourceLine());
+		JsUtf8Value sourceline(message->GetSourceLine(js_current_context()).ToLocalChecked());
 		if (*sourceline) {
 			text = *sourceline;
 		}
@@ -495,7 +496,7 @@ void perf_log(const char *fmt, ...)

 	switch_mutex_lock(globals.mutex);
 	if (globals.performance_monitor) {
-		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, fmt, ap);
+		switch_log_vprintf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, fmt, ap);
 	}
 	switch_mutex_unlock(globals.mutex);

@@ -523,6 +524,7 @@ void LoadScript(MaybeLocal<v8::Script> *v8_script, Isolate *isolate, const char
 	ScriptCompiler::CachedData *cached_data = 0;
 	v8_compiled_script_cache_t *stored_compiled_script_cache = NULL;
 	ScriptCompiler::CompileOptions options;
+	bool produce_cache = false;

 	/*
 		Do not cache if the caching is disabled
@@ -557,30 +559,68 @@ void LoadScript(MaybeLocal<v8::Script> *v8_script, Isolate *isolate, const char

 		}

-		if (!cached_data) options = ScriptCompiler::kProduceCodeCache;
+		if (!cached_data) {
+#if V8FS_NEW_API
+			/* V8 7+ removed kProduceCodeCache; the code cache is created
+			 * explicitly from the compiled script further down. */
+			options = ScriptCompiler::kNoCompileOptions;
+#else
+			options = ScriptCompiler::kProduceCodeCache;
+#endif
+			produce_cache = true;
+		}

 	}

-	ScriptCompiler::Source source(String::NewFromUtf8(isolate, script_data), cached_data);
+	ScriptCompiler::Source source(js_new_string(isolate, script_data), cached_data);
 	*v8_script = ScriptCompiler::Compile(isolate->GetCurrentContext(), &source, options);

 	if (!v8_script->IsEmpty()) {

-		if (options == ScriptCompiler::kProduceCodeCache && !source.GetCachedData()->rejected) {
-			int length = source.GetCachedData()->length;
-			uint8_t* raw_cached_data = new uint8_t[length];
-			v8_compiled_script_cache_t *compiled_script_cache = new v8_compiled_script_cache_t;
-			memcpy(raw_cached_data, source.GetCachedData()->data, static_cast<size_t>(length));
-			compiled_script_cache->data.reset(raw_cached_data, array_deleter<uint8_t>());
-			compiled_script_cache->length = length;
-			compiled_script_cache->compile_time = switch_time_now();
-
-			switch_mutex_lock(globals.compiled_script_hash_mutex);
-			switch_core_hash_insert_destructor(globals.compiled_script_hash, script_file, compiled_script_cache, destructor);
-			switch_mutex_unlock(globals.compiled_script_hash_mutex);
-
-			perf_log("Javascript ['%s'] cache was produced.\n", script_file);
+		if (produce_cache) {
+#if V8FS_NEW_API
+			/* Produce the code cache explicitly from the freshly compiled script. */
+			Local<v8::Script> compiled_script;
+			ScriptCompiler::CachedData *produced = NULL;
+
+			if (v8_script->ToLocal(&compiled_script)) {
+				produced = ScriptCompiler::CreateCodeCache(compiled_script->GetUnboundScript());
+			}
+
+			if (produced) {
+				int length = produced->length;
+				uint8_t* raw_cached_data = new uint8_t[length];
+				v8_compiled_script_cache_t *compiled_script_cache = new v8_compiled_script_cache_t;
+				memcpy(raw_cached_data, produced->data, static_cast<size_t>(length));
+				compiled_script_cache->data.reset(raw_cached_data, array_deleter<uint8_t>());
+				compiled_script_cache->length = length;
+				compiled_script_cache->compile_time = switch_time_now();

+				switch_mutex_lock(globals.compiled_script_hash_mutex);
+				switch_core_hash_insert_destructor(globals.compiled_script_hash, script_file, compiled_script_cache, destructor);
+				switch_mutex_unlock(globals.compiled_script_hash_mutex);
+
+				perf_log("Javascript ['%s'] cache was produced.\n", script_file);
+
+				delete produced;
+			}
+#else
+			if (!source.GetCachedData()->rejected) {
+				int length = source.GetCachedData()->length;
+				uint8_t* raw_cached_data = new uint8_t[length];
+				v8_compiled_script_cache_t *compiled_script_cache = new v8_compiled_script_cache_t;
+				memcpy(raw_cached_data, source.GetCachedData()->data, static_cast<size_t>(length));
+				compiled_script_cache->data.reset(raw_cached_data, array_deleter<uint8_t>());
+				compiled_script_cache->length = length;
+				compiled_script_cache->compile_time = switch_time_now();
+
+				switch_mutex_lock(globals.compiled_script_hash_mutex);
+				switch_core_hash_insert_destructor(globals.compiled_script_hash, script_file, compiled_script_cache, destructor);
+				switch_mutex_unlock(globals.compiled_script_hash_mutex);
+
+				perf_log("Javascript ['%s'] cache was produced.\n", script_file);
+			}
+#endif
 		} else if (options == ScriptCompiler::kConsumeCodeCache) {

 			if (source.GetCachedData()->rejected) {
@@ -665,7 +705,7 @@ static int v8_parse_and_execute(switch_core_session_t *session, const char *inpu
 			switch_mutex_unlock(globals.task_manager_mutex);

 			// New global template
-			Handle<ObjectTemplate> global = ObjectTemplate::New(isolate);
+			Local<ObjectTemplate> global = ObjectTemplate::New(isolate);

 			if (global.IsEmpty()) {
 				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to create JS global object template\n");
@@ -673,7 +713,7 @@ static int v8_parse_and_execute(switch_core_session_t *session, const char *inpu
 				/* Add all global functions */
 				for (size_t i = 0; i < js->GetExtenderFunctions().size(); i++) {
 					js_function_t *proc = js->GetExtenderFunctions()[i];
-					global->Set(String::NewFromUtf8(isolate, proc->name), FunctionTemplate::New(isolate, proc->func));
+					global->Set(js_new_string(isolate, proc->name), FunctionTemplate::New(isolate, proc->func));
 				}

 				// Create a new context.
@@ -721,7 +761,7 @@ static int v8_parse_and_execute(switch_core_session_t *session, const char *inpu
 						obj->RegisterInstance(isolate, "session", true);
 					} else {
 						/* Add a session object as a boolean instead, just to make it safe to check if it exists as expected */
-						context->Global()->Set(String::NewFromUtf8(isolate, "session"), Boolean::New(isolate, false));
+						js_obj_set(context->Global(), js_new_string(isolate, "session"), Boolean::New(isolate, false));
 					}

 					if (v8_event) {
@@ -742,14 +782,14 @@ static int v8_parse_and_execute(switch_core_session_t *session, const char *inpu
 					{
 						/* Add xml handler global variables */

-						Handle<Array> XML_REQUEST = Array::New(isolate, 4);
+						Local<Array> XML_REQUEST = Array::New(isolate, 4);

-						XML_REQUEST->Set(String::NewFromUtf8(isolate, "key_name"), String::NewFromUtf8(isolate, js_safe_str(xml_handler->key_name)));
-						XML_REQUEST->Set(String::NewFromUtf8(isolate, "key_value"), String::NewFromUtf8(isolate, js_safe_str(xml_handler->key_value)));
-						XML_REQUEST->Set(String::NewFromUtf8(isolate, "section"), String::NewFromUtf8(isolate, js_safe_str(xml_handler->section)));
-						XML_REQUEST->Set(String::NewFromUtf8(isolate, "tag_name"), String::NewFromUtf8(isolate, js_safe_str(xml_handler->tag_name)));
+						js_obj_set(XML_REQUEST, js_new_string(isolate, "key_name"), js_new_string(isolate, js_safe_str(xml_handler->key_name)));
+						js_obj_set(XML_REQUEST, js_new_string(isolate, "key_value"), js_new_string(isolate, js_safe_str(xml_handler->key_value)));
+						js_obj_set(XML_REQUEST, js_new_string(isolate, "section"), js_new_string(isolate, js_safe_str(xml_handler->section)));
+						js_obj_set(XML_REQUEST, js_new_string(isolate, "tag_name"), js_new_string(isolate, js_safe_str(xml_handler->tag_name)));

-						context->Global()->Set(String::NewFromUtf8(isolate, "XML_REQUEST"), XML_REQUEST);
+						js_obj_set(context->Global(), js_new_string(isolate, "XML_REQUEST"), XML_REQUEST);

 						if (xml_handler->params) {
 							FSEvent::New(xml_handler->params, "params", js);
@@ -767,10 +807,10 @@ static int v8_parse_and_execute(switch_core_session_t *session, const char *inpu
 						// Add arguments before running script.
 						Local<Array> arguments = Array::New(isolate, argc);
 						for (int y = 0; y < argc; y++) {
-							arguments->Set(Integer::New(isolate, y), String::NewFromUtf8(isolate, argv[y]));
+							js_obj_set(arguments, Integer::New(isolate, y), js_new_string(isolate, argv[y]));
 						}
-						context->Global()->Set(String::NewFromUtf8(isolate, "argv"), arguments);
-						context->Global()->Set(String::NewFromUtf8(isolate, "argc"), Integer::New(isolate, argc));
+						js_obj_set(context->Global(), js_new_string(isolate, "argv"), arguments);
+						js_obj_set(context->Global(), js_new_string(isolate, "argc"), Integer::New(isolate, argc));
 					}

 					const char *script_data = NULL;
@@ -806,7 +846,7 @@ static int v8_parse_and_execute(switch_core_session_t *session, const char *inpu
 						/* Store our base directory in variable 'scriptPath' */
 						char *scriptPath = v8_get_script_path(script_file);
 						if (scriptPath) {
-							context->Global()->Set(String::NewFromUtf8(isolate, "scriptPath"), String::NewFromUtf8(isolate, scriptPath));
+							js_obj_set(context->Global(), js_new_string(isolate, "scriptPath"), js_new_string(isolate, scriptPath));
 							switch_safe_free(scriptPath);
 						}

@@ -819,8 +859,8 @@ static int v8_parse_and_execute(switch_core_session_t *session, const char *inpu
 						LoadScript(&v8_script, isolate, script_data, script_file);
 #else
 						// Create a string containing the JavaScript source code.
-						Handle<String> source = String::NewFromUtf8(isolate, script_data);
-						Handle<Script> v8_script = Script::Compile(source, Local<Value>::New(isolate, String::NewFromUtf8(isolate, script_file)));
+						Local<String> source = js_new_string(isolate, script_data);
+						Local<Script> v8_script = Script::Compile(source, Local<Value>::New(isolate, js_new_string(isolate, script_file)));
 #endif

 						if (try_catch.HasCaught()) {
@@ -835,10 +875,10 @@ static int v8_parse_and_execute(switch_core_session_t *session, const char *inpu
 #endif

 #if defined(V8_MAJOR_VERSION) && V8_MAJOR_VERSION >=5
-							Handle<Value> script_result;
+							Local<Value> script_result;

 							if (!v8_script.IsEmpty()) {
-								script_result = v8_script.ToLocalChecked()->Run();
+								script_result = js_run_script(v8_script.ToLocalChecked());
 							}

 							switch_mutex_lock(globals.mutex);
@@ -849,7 +889,7 @@ static int v8_parse_and_execute(switch_core_session_t *session, const char *inpu
 							}
 							switch_mutex_unlock(globals.mutex);
 #else
-							Handle<Value> result = v8_script->Run();
+							Local<Value> result = js_run_script(v8_script);
 #endif
 							if (try_catch.HasCaught()) {
 								v8_error(isolate, &try_catch);
@@ -861,7 +901,7 @@ static int v8_parse_and_execute(switch_core_session_t *session, const char *inpu

 								if (!script_result.IsEmpty()) {
 									// Return result as string
-									String::Utf8Value ascii(script_result);
+									JsUtf8Value ascii(script_result);
 									if (*ascii) {
 										res = *ascii;
 									}
@@ -869,8 +909,8 @@ static int v8_parse_and_execute(switch_core_session_t *session, const char *inpu

 								if (xml_handler)
 								{
-									Local<Value> value = context->Global()->Get(String::NewFromUtf8(isolate, "XML_STRING"));
-									String::Utf8Value str(value);
+									Local<Value> value = js_obj_get(context->Global(), js_new_string(isolate, "XML_STRING"));
+									JsUtf8Value str(value);
 									if (strcmp(js_safe_str(*str), "undefined"))
 									{
 										xml_handler->XML_STRING = strdup(js_safe_str(*str));
diff --git a/src/mod/languages/mod_v8/mod_v8_skel.cpp b/src/mod/languages/mod_v8/mod_v8_skel.cpp
index 989fdf60ce..11e01da4f1 100644
--- a/src/mod/languages/mod_v8/mod_v8_skel.cpp
+++ b/src/mod/languages/mod_v8/mod_v8_skel.cpp
@@ -95,11 +95,11 @@ void *FSSkel::Construct(const v8::FunctionCallbackInfo<Value>& info)
 	/* Parse input variables */
 	if (info.Length() > 0) {
 		if (!info[0].IsEmpty() && info[0]->IsInt32()) {
-			obj->x = info[0]->Int32Value();
+			obj->x = info[0]->Int32Value(js_current_context()).FromMaybe(0);
 		}

 		if (!info[1].IsEmpty() && info[1]->IsString()) {
-			String::Utf8Value str(info[1]);
+			JsUtf8Value str(info[1]);
 			if (*str) {
 				obj->y = *str;
 			}
@@ -117,19 +117,19 @@ JS_SKEL_GET_PROPERTY_IMPL(GetPropertyX)

 JS_SKEL_SET_PROPERTY_IMPL(SetPropertyX)
 {
-	x = value->Int32Value();
+	x = value->Int32Value(js_current_context()).FromMaybe(0);
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "FSSkel::SetPropertyX to %d\n", x);
 }

 JS_SKEL_GET_PROPERTY_IMPL(GetPropertyY)
 {
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "FSSkel::GetPropertyY (%s)\n", y.c_str());
-	info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), y.c_str()));
+	info.GetReturnValue().Set(js_new_string(info.GetIsolate(), y.c_str()));
 }

 JS_SKEL_SET_PROPERTY_IMPL(SetPropertyY)
 {
-	String::Utf8Value str(value);
+	JsUtf8Value str(value);

 	y = js_safe_str(*str);
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "FSSkel::SetPropertyY to '%s'\n", y.c_str());
@@ -138,7 +138,7 @@ JS_SKEL_SET_PROPERTY_IMPL(SetPropertyY)
 JS_SKEL_GET_PROPERTY_IMPL(GetPropertyZ)
 {
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "FSSkel::GetPropertyZ (z)\n");
-	info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), "z"));
+	info.GetReturnValue().Set(js_new_string(info.GetIsolate(), "z"));
 }

 JS_SKEL_FUNCTION_IMPL(MyFunction)
@@ -149,7 +149,7 @@ JS_SKEL_FUNCTION_IMPL(MyFunction)
 JS_SKEL_FUNCTION_IMPL(MyFunction2)
 {
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "FSSkel::MyFunction2 - will twrow a JavaScript exception\n");
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Error in MyFunction2()"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Error in MyFunction2()"));
 }

 /* Add the JS methods here */
diff --git a/src/mod/languages/mod_v8/src/fscoredb.cpp b/src/mod/languages/mod_v8/src/fscoredb.cpp
index 321677b642..573460dacb 100644
--- a/src/mod/languages/mod_v8/src/fscoredb.cpp
+++ b/src/mod/languages/mod_v8/src/fscoredb.cpp
@@ -75,14 +75,14 @@ void *FSCoreDB::Construct(const v8::FunctionCallbackInfo<Value>& info)
 	switch_core_db_t *db;

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *dbname = js_safe_str(*str);

 		switch_core_new_memory_pool(&pool);

 		if (!(db = switch_core_db_open_file(dbname))) {
 			switch_core_destroy_memory_pool(&pool);
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Cannot Open DB!"));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Cannot Open DB!"));
 			return NULL;
 		}

@@ -94,7 +94,7 @@ void *FSCoreDB::Construct(const v8::FunctionCallbackInfo<Value>& info)
 		return dbo;
 	}

-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 	return NULL;
 }

@@ -110,23 +110,23 @@ int FSCoreDB::Callback(void *pArg, int argc, char **argv, char **columnNames)
 	HandleScope handle_scope(dbo->GetIsolate());

 	if (dbo->_callback.IsEmpty()) {
-		dbo->GetIsolate()->ThrowException(String::NewFromUtf8(dbo->GetIsolate(), "No callback specified"));
+		dbo->GetIsolate()->ThrowException(js_new_string(dbo->GetIsolate(), "No callback specified"));
 		return 0;
 	}

-	Handle<Array> arg = Array::New(dbo->GetIsolate(), argc);
+	Local<Array> arg = Array::New(dbo->GetIsolate(), argc);

 	for (x = 0; x < argc; x++) {
 		if (columnNames[x] && argv[x]) {
-			arg->Set(String::NewFromUtf8(dbo->GetIsolate(), columnNames[x]), String::NewFromUtf8(dbo->GetIsolate(), argv[x]));
+			js_obj_set(arg, js_new_string(dbo->GetIsolate(), columnNames[x]), js_new_string(dbo->GetIsolate(), argv[x]));
 		}
 	}

 	HandleScope scope(dbo->GetIsolate());
-	Handle<Function> func =  Local<Function>::New(dbo->GetIsolate(), dbo->_callback);
-	Handle<Value> jsargv[1] = { arg };
+	Local<Function> func =  Local<Function>::New(dbo->GetIsolate(), dbo->_callback);
+	Local<Value> jsargv[1] = { arg };

-	func->Call(dbo->GetIsolate()->GetCurrentContext()->Global(), 1, jsargv);
+	js_call(func, dbo->GetIsolate()->GetCurrentContext()->Global(), 1, jsargv);

 	return 0;
 }
@@ -143,19 +143,19 @@ JS_COREDB_FUNCTION_IMPL(Exec)
 	info.GetReturnValue().Set(0);

 	if (!_db) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Database is not connected"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Database is not connected"));
 		return;
 	}

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *sql = js_safe_str(*str);
 		char *err = NULL;
 		void *arg = NULL;
 		switch_core_db_callback_func_t cb_func = NULL;

 		if (info.Length() > 1) {
-			Handle<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[1]);
+			Local<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[1]);
 			if (!func.IsEmpty()) {
 				_callback.Reset(info.GetIsolate(), func);
 				cb_func = FSCoreDB::Callback;
@@ -189,7 +189,7 @@ void FSCoreDB::StepEx(const v8::FunctionCallbackInfo<Value>& info, int stepSucce
 	info.GetReturnValue().Set(false);

 	if (!_db) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Database is not connected"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Database is not connected"));
 		return;
 	}

@@ -247,24 +247,24 @@ JS_COREDB_FUNCTION_IMPL(Fetch)
 	int x;

 	if (!_db) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Database is not connected"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Database is not connected"));
 		return;
 	}

 	if (!_stmt) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "No query is active"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "No query is active"));
 		return;
 	}

 	colcount = switch_core_db_column_count(_stmt);
-	Handle<Array> arg = Array::New(info.GetIsolate(), colcount);
+	Local<Array> arg = Array::New(info.GetIsolate(), colcount);

 	for (x = 0; x < colcount; x++) {
 		const char *var = (char *) switch_core_db_column_name(_stmt, x);
 		const char *val = (char *) switch_core_db_column_text(_stmt, x);

 		if (var && val) {
-			arg->Set(String::NewFromUtf8(info.GetIsolate(), var), String::NewFromUtf8(info.GetIsolate(), val));
+			js_obj_set(arg, js_new_string(info.GetIsolate(), var), js_new_string(info.GetIsolate(), val));
 		}
 	}

@@ -278,7 +278,7 @@ JS_COREDB_FUNCTION_IMPL(Prepare)
 	info.GetReturnValue().Set(false);

 	if (!_db) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Database is not connected"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Database is not connected"));
 		return;
 	}

@@ -288,7 +288,7 @@ JS_COREDB_FUNCTION_IMPL(Prepare)
 	}

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *sql = js_safe_str(*str);
 		if (switch_core_db_prepare(_db, sql, -1, &_stmt, 0)) {
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error %s\n", switch_core_db_errmsg(_db));
@@ -307,34 +307,34 @@ JS_COREDB_FUNCTION_IMPL(BindText)
 	info.GetReturnValue().Set(false);

 	if (!_db) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Database is not connected"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Database is not connected"));
 		return;
 	}

 	/* db_prepare() must be called first */
 	if (!_stmt) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "prepare() must be called first"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "prepare() must be called first"));
 		return;
 	}

 	if (info.Length() < 2) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 		return;
 	}

 	/* convert args */
-	param_index = info[0]->Int32Value();
-	String::Utf8Value str(info[1]);
+	param_index = info[0]->Int32Value(js_current_context()).FromMaybe(0);
+	JsUtf8Value str(info[1]);
 	param_value = js_safe_str(*str);
 	if ((param_index < 1) || (param_value.length() == 0)) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 		return;
 	}

 	/* bind param */
 	if (switch_core_db_bind_text(_stmt, param_index, param_value.c_str(), -1, SWITCH_CORE_DB_TRANSIENT)) {
 		char *err = switch_mprintf("Database error %s", switch_core_db_errmsg(_db));
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), err));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), err));
 		free(err);
 		return;
 	} else {
@@ -351,34 +351,34 @@ JS_COREDB_FUNCTION_IMPL(BindInt)
 	info.GetReturnValue().Set(false);

 	if (!_db) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Database is not connected"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Database is not connected"));
 		return;
 	}

 	/* db_prepare() must be called first */
 	if (!_stmt) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "prepare() must be called first"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "prepare() must be called first"));
 		return;
 	}

 	if (info.Length() < 2) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 		return;
 	}

 	/* convert args */
-	param_index = info[0]->Int32Value();
-	param_value = info[1]->Int32Value();
+	param_index = info[0]->Int32Value(js_current_context()).FromMaybe(0);
+	param_value = info[1]->Int32Value(js_current_context()).FromMaybe(0);

 	if (param_index < 1) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 		return;
 	}

 	/* bind param */
 	if (switch_core_db_bind_int(_stmt, param_index, param_value)) {
 		char *err = switch_mprintf("Database error %s", switch_core_db_errmsg(_db));
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), err));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), err));
 		free(err);
 		return;
 	} else {
@@ -390,16 +390,16 @@ JS_COREDB_GET_PROPERTY_IMPL(GetProperty)
 {
 	HandleScope handle_scope(info.GetIsolate());

-	String::Utf8Value str(property);
+	JsUtf8Value str(property);

 	if (!strcmp(js_safe_str(*str), "path")) {
 		if (_dbname) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), _dbname));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), _dbname));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 		}
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Bad property"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Bad property"));
 	}
 }

diff --git a/src/mod/languages/mod_v8/src/fscurl.cpp b/src/mod/languages/mod_v8/src/fscurl.cpp
index e35036b64a..6dc8763909 100644
--- a/src/mod/languages/mod_v8/src/fscurl.cpp
+++ b/src/mod/languages/mod_v8/src/fscurl.cpp
@@ -62,14 +62,14 @@ size_t FSCURL::FileCallback(void *ptr, size_t size, size_t nmemb, void *data)
 	FSCURL *obj = static_cast<FSCURL *>(data);
 	unsigned int realsize = (unsigned int) (size * nmemb);
 	uint32_t argc = 0;
-	Handle<Value> argv[4];
+	Local<Value> argv[4];

 	if (!obj) {
 		return 0;
 	}

 	HandleScope handle_scope(obj->GetIsolate());
-	Handle<Function> func;
+	Local<Function> func;

 	if (!obj->_function.IsEmpty()) {
 		func = Local<Function>::New(obj->GetIsolate(), obj->_function);
@@ -78,15 +78,15 @@ size_t FSCURL::FileCallback(void *ptr, size_t size, size_t nmemb, void *data)
 	if (!func.IsEmpty()) {
 		char *ret;
 		if (ptr) {
-			argv[argc++] = String::NewFromUtf8(obj->GetIsolate(), (char *)ptr);
+			argv[argc++] = js_new_string(obj->GetIsolate(), (char *)ptr);
 		} else {
-			argv[argc++] = String::NewFromUtf8(obj->GetIsolate(), "");
+			argv[argc++] = js_new_string(obj->GetIsolate(), "");
 		}
 		if (!obj->_user_data.IsEmpty()) {
 			argv[argc++] = Local<Value>::New(obj->GetIsolate(), Persistent<Value>::Cast(obj->_user_data));
 		}

-		Handle<Value> res = func->Call(obj->GetIsolate()->GetCurrentContext()->Global(), argc, argv);
+		Local<Value> res = js_call(func, obj->GetIsolate()->GetCurrentContext()->Global(), argc, argv);

 		if (!res.IsEmpty()){
 			obj->_ret.Reset(obj->GetIsolate(), res);
@@ -94,7 +94,7 @@ size_t FSCURL::FileCallback(void *ptr, size_t size, size_t nmemb, void *data)
 			obj->_ret.Reset();
 		}

-		String::Utf8Value str(Local<Value>::New(obj->GetIsolate(), res));
+		JsUtf8Value str(Local<Value>::New(obj->GetIsolate(), res));

 		if ((ret = *str)) {
 			if (!strcmp(ret, "true") || !strcmp(ret, "undefined")) {
@@ -129,12 +129,12 @@ JS_CURL_FUNCTION_IMPL(Run)
 	char ct[80] = "Content-Type: application/x-www-form-urlencoded";

 	if (info.Length() < 2) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 		return;
 	}

-	String::Utf8Value str1(info[0]);
-	String::Utf8Value str2(info[1]);
+	JsUtf8Value str1(info[0]);
+	JsUtf8Value str2(info[1]);

 	method = js_safe_str(*str1);
 	url = js_safe_str(*str2);
@@ -146,23 +146,23 @@ JS_CURL_FUNCTION_IMPL(Run)
 	}

 	if (info.Length() > 2) {
-		String::Utf8Value str3(info[2]);
+		JsUtf8Value str3(info[2]);
 		data = js_safe_str(*str3);
 	}

 	if (info.Length() > 3) {
-		Handle<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[3]);
+		Local<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[3]);
 		if (!func.IsEmpty() && func->IsFunction()) {
 			_function.Reset(info.GetIsolate(), func);
 		}
 	}

 	if (info.Length() > 4) {
-		_user_data.Reset(info.GetIsolate(), Handle<Object>::Cast(info[4]));
+		_user_data.Reset(info.GetIsolate(), Local<Object>::Cast(info[4]));
 	}

 	if (info.Length() > 5) {
-		String::Utf8Value str4(info[5]);
+		JsUtf8Value str4(info[5]);
 		cred = js_safe_str(*str4);
 		if (cred.length() > 0) {
 			switch_curl_easy_setopt(_curl_handle, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
@@ -171,14 +171,14 @@ JS_CURL_FUNCTION_IMPL(Run)
 	}

 	if (info.Length() > 6) {
-		timeout = info[6]->Int32Value();
+		timeout = info[6]->Int32Value(js_current_context()).FromMaybe(0);
 		if (timeout > 0) {
 			switch_curl_easy_setopt(_curl_handle, CURLOPT_TIMEOUT, timeout);
 		}
 	}

 	if (info.Length() > 7) {
-		String::Utf8Value str5(info[7]);
+		JsUtf8Value str5(info[7]);
 		const char *content_type = js_safe_str(*str5);
 		switch_snprintf(ct, sizeof(ct), "Content-Type: %s", content_type);
 	}
@@ -221,7 +221,7 @@ JS_CURL_FUNCTION_IMPL(Run)
 	switch_safe_free(durl);

 	if (!_ret.IsEmpty()) {
-		info.GetReturnValue().Set(_ret);
+		info.GetReturnValue().Set(js_local(_ret));
 		_ret.Reset();
 	}
 }
diff --git a/src/mod/languages/mod_v8/src/fsdbh.cpp b/src/mod/languages/mod_v8/src/fsdbh.cpp
index 16f6b4f7b0..9bd91c0e3b 100644
--- a/src/mod/languages/mod_v8/src/fsdbh.cpp
+++ b/src/mod/languages/mod_v8/src/fsdbh.cpp
@@ -113,22 +113,22 @@ void *FSDBH::Construct(const v8::FunctionCallbackInfo<Value>& info)
 	char *dsn, *username = NULL, *password = NULL;

 	if (info.Length() < 1 || info.Length() > 3) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid parameters"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid parameters"));
 		return NULL;
 	}

-	String::Utf8Value str1(info[0]);
+	JsUtf8Value str1(info[0]);
 	dsn = *str1;

 	if (info.Length() > 1)
 	{
-		String::Utf8Value str2(info[1]);
+		JsUtf8Value str2(info[1]);
 		username = *str2;
 	}

 	if (info.Length() > 2)
 	{
-		String::Utf8Value str3(info[2]);
+		JsUtf8Value str3(info[2]);
 		password = *str3;
 	}

@@ -145,7 +145,7 @@ void *FSDBH::Construct(const v8::FunctionCallbackInfo<Value>& info)
 	}

 	if (!dbh_obj) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Failed to create new DBH instance"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Failed to create new DBH instance"));
 		return NULL;
 	}

@@ -164,23 +164,23 @@ int FSDBH::Callback(void *pArg, int argc, char **argv, char **columnNames)
 	HandleScope handle_scope(dbo->GetIsolate());

 	if (dbo->_callback.IsEmpty()) {
-		dbo->GetIsolate()->ThrowException(String::NewFromUtf8(dbo->GetIsolate(), "No callback specified"));
+		dbo->GetIsolate()->ThrowException(js_new_string(dbo->GetIsolate(), "No callback specified"));
 		return 0;
 	}

-	Handle<Array> arg = Array::New(dbo->GetIsolate(), argc);
+	Local<Array> arg = Array::New(dbo->GetIsolate(), argc);

 	for (x = 0; x < argc; x++) {
 		if (columnNames[x] && argv[x]) {
-			arg->Set(String::NewFromUtf8(dbo->GetIsolate(), columnNames[x]), String::NewFromUtf8(dbo->GetIsolate(), argv[x]));
+			js_obj_set(arg, js_new_string(dbo->GetIsolate(), columnNames[x]), js_new_string(dbo->GetIsolate(), argv[x]));
 		}
 	}

 	HandleScope scope(dbo->GetIsolate());
-	Handle<Function> func = Local<Function>::New(dbo->GetIsolate(), dbo->_callback);
-	Handle<Value> jsargv[1] = { arg };
+	Local<Function> func = Local<Function>::New(dbo->GetIsolate(), dbo->_callback);
+	Local<Value> jsargv[1] = { arg };

-	func->Call(dbo->GetIsolate()->GetCurrentContext()->Global(), 1, jsargv);
+	js_call(func, dbo->GetIsolate()->GetCurrentContext()->Global(), 1, jsargv);

 	return 0;
 }
@@ -193,9 +193,9 @@ void FSDBH::clear_error()
 JS_DBH_FUNCTION_IMPL(last_error)
 {
 	if (err)
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), err));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), err));
 	else
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 	return;
 }

@@ -208,16 +208,16 @@ JS_DBH_FUNCTION_IMPL(query)
 	clear_error();

 	if (info.Length() < 1 || info.Length() > 2) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid parameters"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid parameters"));
 		return info.GetReturnValue().Set(false);
 	}

 	if (!dbh) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Database is not connected"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Database is not connected"));
 		return info.GetReturnValue().Set(false);
 	}

-	String::Utf8Value str(info[0]);
+	JsUtf8Value str(info[0]);
 	const char *sql = js_safe_str(*str);

 	if (zstr(sql)) {
@@ -228,7 +228,7 @@ JS_DBH_FUNCTION_IMPL(query)
 	void *arg = NULL;
 	switch_core_db_callback_func_t cb_func = NULL;

-	Handle<Function> func = Handle<Function>();
+	Local<Function> func = Local<Function>();

 	if (info.Length() > 1)
 	    func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[1]);
@@ -282,18 +282,18 @@ JS_DBH_FUNCTION_IMPL(test_reactive)
 	clear_error();

 	if (info.Length() < 3) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid parameters"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid parameters"));
 		return info.GetReturnValue().Set(false);
 	}

 	if (!dbh) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Database is not connected"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Database is not connected"));
 		return info.GetReturnValue().Set(false);
 	}

-	String::Utf8Value str0(info[0]);
-	String::Utf8Value str1(info[1]);
-	String::Utf8Value str2(info[2]);
+	JsUtf8Value str0(info[0]);
+	JsUtf8Value str1(info[1]);
+	JsUtf8Value str2(info[2]);
 	const char *test_sql = js_safe_str(*str0);
 	const char *drop_sql = js_safe_str(*str1);
 	const char *reactive_sql = js_safe_str(*str2);
@@ -335,13 +335,13 @@ JS_DBH_GET_PROPERTY_IMPL(GetProperty)
 {
 	HandleScope handle_scope(info.GetIsolate());

-	String::Utf8Value str(property);
+	JsUtf8Value str(property);

 	if (!strcmp(js_safe_str(*str), "dsn")) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), _dsn.c_str()));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), _dsn.c_str()));
 	}
 	else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Bad property"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Bad property"));
 	}
 }

diff --git a/src/mod/languages/mod_v8/src/fsdtmf.cpp b/src/mod/languages/mod_v8/src/fsdtmf.cpp
index e3e24416c6..c9cb979aca 100644
--- a/src/mod/languages/mod_v8/src/fsdtmf.cpp
+++ b/src/mod/languages/mod_v8/src/fsdtmf.cpp
@@ -47,7 +47,7 @@ string FSDTMF::GetJSClassName()
 	return js_class_name;
 }

-Handle<Object> FSDTMF::New(switch_dtmf_t *dtmf, const char *name, JSMain *js)
+Local<Object> FSDTMF::New(switch_dtmf_t *dtmf, const char *name, JSMain *js)
 {
 	FSDTMF *obj;
 	switch_dtmf_t *ddtmf;
@@ -63,7 +63,7 @@ Handle<Object> FSDTMF::New(switch_dtmf_t *dtmf, const char *name, JSMain *js)
 		}
 	}

-	return Handle<Object>();
+	return Local<Object>();
 }

 void *FSDTMF::Construct(const v8::FunctionCallbackInfo<Value>& info)
@@ -74,15 +74,15 @@ void *FSDTMF::Construct(const v8::FunctionCallbackInfo<Value>& info)
 	const char *dtmf_char;

 	if (info.Length() <= 0) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid Args"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid Args"));
 		return NULL;
 	}

-	String::Utf8Value str(info[0]);
+	JsUtf8Value str(info[0]);
 	dtmf_char = *str;

 	if (info.Length() > 1) {
-		duration = info[1]->Int32Value();
+		duration = info[1]->Int32Value(js_current_context()).FromMaybe(0);
 		if (duration <= 0) {
 			duration = switch_core_default_dtmf_duration(0);
 		}
@@ -101,7 +101,7 @@ void *FSDTMF::Construct(const v8::FunctionCallbackInfo<Value>& info)
 		return obj;
 	}

-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Memory error"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Memory error"));
 	return NULL;
 }

@@ -115,16 +115,16 @@ JS_DTMF_GET_PROPERTY_IMPL(GetProperty)
 		return;
 	}

-	String::Utf8Value str(property);
+	JsUtf8Value str(property);
 	const char *prop = js_safe_str(*str);

 	if (!strcmp(prop, "digit")) {
 		char tmp[2] = { obj->_dtmf->digit, '\0' };
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), tmp));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), tmp));
 	} else if (!strcmp(prop, "duration")) {
 		info.GetReturnValue().Set(Integer::New(info.GetIsolate(), obj->_dtmf->duration));
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Bad property"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Bad property"));
 	}
 }

diff --git a/src/mod/languages/mod_v8/src/fsevent.cpp b/src/mod/languages/mod_v8/src/fsevent.cpp
index 75bb7daba7..745e238913 100644
--- a/src/mod/languages/mod_v8/src/fsevent.cpp
+++ b/src/mod/languages/mod_v8/src/fsevent.cpp
@@ -87,7 +87,7 @@ switch_event_t **FSEvent::GetEvent()
 	return &_event;
 }

-Handle<Object> FSEvent::New(switch_event_t *event, const char *name, JSMain *js)
+Local<Object> FSEvent::New(switch_event_t *event, const char *name, JSMain *js)
 {
 	FSEvent *obj;

@@ -98,7 +98,7 @@ Handle<Object> FSEvent::New(switch_event_t *event, const char *name, JSMain *js)
 		return obj->GetJavaScriptObject();
 	}

-	return Handle<Object>();
+	return Local<Object>();
 }

 void *FSEvent::Construct(const v8::FunctionCallbackInfo<Value>& info)
@@ -109,13 +109,13 @@ void *FSEvent::Construct(const v8::FunctionCallbackInfo<Value>& info)
 		switch_event_t *event;
 		FSEvent *obj;
 		switch_event_types_t etype;
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *ename = js_safe_str(*str);

 		if ((obj = new FSEvent(info))) {
 			if (switch_name_event(ename, &etype) != SWITCH_STATUS_SUCCESS) {
 				char *err = switch_mprintf("Unknown event %s", ename);
-				info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), err));
+				info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), err));
 				free(err);
 				delete obj;
 				return NULL;
@@ -124,7 +124,7 @@ void *FSEvent::Construct(const v8::FunctionCallbackInfo<Value>& info)
 			if (etype == SWITCH_EVENT_CUSTOM) {
 				string subclass_name;
 				if (info.Length() > 1) {
-					String::Utf8Value str2(info[1]);
+					JsUtf8Value str2(info[1]);
 					if (*str2) {
 						subclass_name = js_safe_str(*str2);
 					}
@@ -133,20 +133,20 @@ void *FSEvent::Construct(const v8::FunctionCallbackInfo<Value>& info)
 				}

 				if (switch_event_create_subclass(&event, etype, subclass_name.c_str()) != SWITCH_STATUS_SUCCESS) {
-					info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Failed to create sub class"));
+					info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Failed to create sub class"));
 					delete obj;
 					return NULL;
 				}
 			} else {
 				if (switch_event_create(&event, etype) != SWITCH_STATUS_SUCCESS) {
-					info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Failed to create event"));
+					info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Failed to create event"));
 					delete obj;
 					return NULL;
 				}
 			}

 			/* Third argument tells if the headers should be unique */
-			if (event && !info[2].IsEmpty() && info[2]->BooleanValue()) {
+			if (event && !info[2].IsEmpty() && js_to_bool(info[2])) {
 				event->flags |= EF_UNIQ_HEADERS;
 			}

@@ -157,7 +157,7 @@ void *FSEvent::Construct(const v8::FunctionCallbackInfo<Value>& info)
 		}
 	}

-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid Args"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid Args"));
 	return NULL;
 }

@@ -171,14 +171,14 @@ JS_EVENT_FUNCTION_IMPL(AddHeader)
 	}

 	if (info.Length() > 1) {
-		String::Utf8Value str1(info[0]);
-		String::Utf8Value str2(info[1]);
+		JsUtf8Value str1(info[0]);
+		JsUtf8Value str2(info[1]);
 		const char *hname = js_safe_str(*str1);
 		const char *hval = js_safe_str(*str2);
 		switch_stack_t stack_kind = SWITCH_STACK_BOTTOM;

 		/* Check if we should push this value to the end of an array */
-		if (!info[2].IsEmpty() && info[2]->BooleanValue()) {
+		if (!info[2].IsEmpty() && js_to_bool(info[2])) {
 			stack_kind = SWITCH_STACK_PUSH;
 		}

@@ -200,14 +200,14 @@ JS_EVENT_FUNCTION_IMPL(GetHeader)
 	}

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *hname = js_safe_str(*str);
 		const char *val = NULL;
 		int idx = -1;

 		/* Check if caller expects to get data from an array */
 		if (info.Length() > 1 && !info[1].IsEmpty()) {
-			idx = info[1]->Int32Value();
+			idx = info[1]->Int32Value(js_current_context()).FromMaybe(0);

 			if (idx < 0 || !IsArray(hname)) {
 				idx = -1;
@@ -224,7 +224,7 @@ JS_EVENT_FUNCTION_IMPL(GetHeader)
 			/* Return null if we fetched and array value that didn't exist (so we know when to exit a loop) */
 			info.GetReturnValue().Set(Null(info.GetIsolate()));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(val)));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(val)));
 		}

 		return;
@@ -241,7 +241,7 @@ JS_EVENT_FUNCTION_IMPL(IsArrayHeader)
 	}

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		info.GetReturnValue().Set(IsArray(js_safe_str(*str)));
 	} else {
 		info.GetReturnValue().Set(false);
@@ -258,7 +258,7 @@ JS_EVENT_FUNCTION_IMPL(AddBody)
 	}

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *body = js_safe_str(*str);
 		switch_event_add_body(_event, "%s", body);
 		info.GetReturnValue().Set(true);
@@ -279,9 +279,9 @@ JS_EVENT_FUNCTION_IMPL(GetBody)
 	}

 	if ((body = switch_event_get_body(_event))) {
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), body));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), body));
 	} else {
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 	}
 }

@@ -296,7 +296,7 @@ JS_EVENT_FUNCTION_IMPL(GetType)
 	}

 	event_name = switch_event_name(_event->event_id);
-	info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(event_name)));
+	info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(event_name)));
 }

 JS_EVENT_FUNCTION_IMPL(Serialize)
@@ -311,7 +311,7 @@ JS_EVENT_FUNCTION_IMPL(Serialize)
 	}

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *arg = js_safe_str(*str);
 		if (!strcasecmp(arg, "xml")) {
 			isxml++;
@@ -325,7 +325,7 @@ JS_EVENT_FUNCTION_IMPL(Serialize)
 		char *xmlstr;
 		if ((xml = switch_event_xmlize(_event, SWITCH_VA_NONE))) {
 			xmlstr = switch_xml_toxml(xml, SWITCH_FALSE);
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(xmlstr)));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(xmlstr)));
 			switch_xml_free(xml);
 			switch_safe_free(xmlstr);
 		} else {
@@ -333,12 +333,12 @@ JS_EVENT_FUNCTION_IMPL(Serialize)
 		}
 	} else if (isjson) {
 		if (switch_event_serialize_json(_event, &buf) == SWITCH_STATUS_SUCCESS) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(buf)));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(buf)));
 			switch_safe_free(buf);
 		}
 	} else {
 		if (switch_event_serialize(_event, &buf, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(buf)));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(buf)));
 			switch_safe_free(buf);
 		}
 	}
@@ -368,12 +368,12 @@ JS_EVENT_FUNCTION_IMPL(ChatExecute)

 	if (_event) {
 		if (info.Length() > 0) {
-			String::Utf8Value str(info[0]);
+			JsUtf8Value str(info[0]);
 			const char *app = js_safe_str(*str);
 			string arg;

 			if (info.Length() > 1) {
-				String::Utf8Value str2(info[1]);
+				JsUtf8Value str2(info[1]);
 				if (*str2) {
 					arg = js_safe_str(*str2);
 				}
@@ -408,12 +408,12 @@ JS_EVENT_FUNCTION_IMPL_STATIC(Destroy)
 JS_EVENT_GET_PROPERTY_IMPL(GetProperty)
 {
 	HandleScope handle_scope(info.GetIsolate());
-	String::Utf8Value str(property);
+	JsUtf8Value str(property);

 	if (!strcmp(js_safe_str(*str), "ready")) {
 		info.GetReturnValue().Set(_event ? true : false);
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Bad property"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Bad property"));
 	}
 }

diff --git a/src/mod/languages/mod_v8/src/fseventhandler.cpp b/src/mod/languages/mod_v8/src/fseventhandler.cpp
index 8e69d9b842..2fa40bba8f 100644
--- a/src/mod/languages/mod_v8/src/fseventhandler.cpp
+++ b/src/mod/languages/mod_v8/src/fseventhandler.cpp
@@ -178,7 +178,7 @@ void FSEventHandler::DoSubscribe(const v8::FunctionCallbackInfo<v8::Value>& info
 	bool ret = false;

 	for (i = 0; i < info.Length(); i++) {
-		String::Utf8Value str(info[i]);
+		JsUtf8Value str(info[i]);
 		switch_event_types_t etype;

 		if (custom) {
@@ -226,7 +226,7 @@ JS_EVENTHANDLER_FUNCTION_IMPL(UnSubscribe)
 	bool ret = false;

 	for (i = 0; i < info.Length(); i++) {
-		String::Utf8Value str(info[i]);
+		JsUtf8Value str(info[i]);
 		switch_event_types_t etype;

 		if (custom) {
@@ -263,7 +263,7 @@ JS_EVENTHANDLER_FUNCTION_IMPL(DeleteFilter)
 	if (info.Length() < 1) {
 		info.GetReturnValue().Set(false);
 	} else {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *headerName = js_safe_str(*str);

 		if (zstr(headerName)) {
@@ -295,8 +295,8 @@ JS_EVENTHANDLER_FUNCTION_IMPL(AddFilter)
 	if (info.Length() < 2) {
 		info.GetReturnValue().Set(false);
 	} else {
-		String::Utf8Value str1(info[0]);
-		String::Utf8Value str2(info[1]);
+		JsUtf8Value str1(info[0]);
+		JsUtf8Value str2(info[1]);
 		const char *headerName = js_safe_str(*str1);
 		const char *headerVal = js_safe_str(*str2);

@@ -326,7 +326,7 @@ JS_EVENTHANDLER_FUNCTION_IMPL(GetEvent)
 	switch_event_t *pevent = NULL;

 	if (info.Length() > 0 && !info[0].IsEmpty()) {
-		timeout = info[0]->Int32Value();
+		timeout = info[0]->Int32Value(js_current_context()).FromMaybe(0);
 	}

 	if (timeout > 0) {
@@ -359,7 +359,7 @@ JS_EVENTHANDLER_FUNCTION_IMPL(SendEvent)
 		info.GetReturnValue().Set(false);
 	} else {
 		if (!info[0].IsEmpty() && info[0]->IsObject()) {
-			FSEvent *evt = JSBase::GetInstance<FSEvent>(info[0]->ToObject());
+			FSEvent *evt = JSBase::GetInstance<FSEvent>(info[0]->ToObject(js_current_context()).ToLocalChecked());
 			switch_event_t **event;

 			if (!evt || !(event = evt->GetEvent())) {
@@ -370,7 +370,7 @@ JS_EVENTHANDLER_FUNCTION_IMPL(SendEvent)
 				if (info.Length() > 1) {
 					if (!info[1].IsEmpty() && info[1]->IsObject()) {
 						/* The second argument is a session object */
-						FSSession *sess = JSBase::GetInstance<FSSession>(info[1]->ToObject());
+						FSSession *sess = JSBase::GetInstance<FSSession>(info[1]->ToObject(js_current_context()).ToLocalChecked());
 						switch_core_session_t *tmp;

 						if (sess && (tmp = sess->GetSession())) {
@@ -378,7 +378,7 @@ JS_EVENTHANDLER_FUNCTION_IMPL(SendEvent)
 						}
 					} else {
 						/* The second argument is a session uuid string */
-						String::Utf8Value str(info[1]);
+						JsUtf8Value str(info[1]);
 						session_uuid = js_safe_str(*str);
 					}
 				}
@@ -410,7 +410,7 @@ JS_EVENTHANDLER_FUNCTION_IMPL(SendEvent)
 JS_EVENTHANDLER_FUNCTION_IMPL(ExecuteApi)
 {
 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *cmd = js_safe_str(*str);
 		string arg;
 		switch_stream_handle_t stream = { 0 };
@@ -422,17 +422,17 @@ JS_EVENTHANDLER_FUNCTION_IMPL(ExecuteApi)
 		}

 		if (info.Length() > 1) {
-			String::Utf8Value str2(info[1]);
+			JsUtf8Value str2(info[1]);
 			arg = js_safe_str(*str2);
 		}

 		SWITCH_STANDARD_STREAM(stream);
 		switch_api_execute(cmd, arg.c_str(), NULL, &stream);

-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_str_nil((char *) stream.data)));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), switch_str_nil((char *) stream.data)));
 		switch_safe_free(stream.data);
 	} else {
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), "-ERR"));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), "-ERR"));
 	}
 }

@@ -509,16 +509,16 @@ JS_EVENTHANDLER_FUNCTION_IMPL(ExecuteBgApi)
 	int sanity = 2000;

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		cmd = js_safe_str(*str);

 		if (info.Length() > 1) {
-			String::Utf8Value str2(info[1]);
+			JsUtf8Value str2(info[1]);
 			arg = js_safe_str(*str2);
 		}

 		if (info.Length() > 2) {
-			String::Utf8Value str2(info[2]);
+			JsUtf8Value str2(info[2]);
 			jobuuid = js_safe_str(*str2);
 		}
 	} else {
@@ -553,7 +553,7 @@ JS_EVENTHANDLER_FUNCTION_IMPL(ExecuteBgApi)
 		switch_uuid_format(acs->uuid_str, &uuid);
 	}

-	info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), acs->uuid_str));
+	info.GetReturnValue().Set(js_new_string(info.GetIsolate(), acs->uuid_str));

 	switch_thread_create(&thread, thd_attr, api_exec, acs, acs->pool);

diff --git a/src/mod/languages/mod_v8/src/fsfile.cpp b/src/mod/languages/mod_v8/src/fsfile.cpp
index 03ed2fbfea..7e558c98a6 100644
--- a/src/mod/languages/mod_v8/src/fsfile.cpp
+++ b/src/mod/languages/mod_v8/src/fsfile.cpp
@@ -59,197 +59,197 @@ void *FSFile::Construct(const v8::FunctionCallbackInfo<Value>& info)

 JS_FILE_FUNCTION_IMPL(Close)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(CopyTo)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(Flush)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(List)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(MkDir)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(Open)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(Read)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(ReadAll)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(ReadLn)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(Remove)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(RenameTo)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(Seek)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(ToString)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(ToURL)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(Write)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(WriteAll)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_FUNCTION_IMPL(WriteLn)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropCanAppend)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropCanRead)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropCanReplace)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropCanWrite)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropCreationTime)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropExists)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropHasAutoFlush)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropHasRandomAccess)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropIsDirectory)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropIsFile)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropIsNative)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropIsOpen)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropLastModified)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropLength)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropMode)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropName)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropParent)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropPath)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropPosition)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_SET_PROPERTY_IMPL(SetPropPosition)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropSize)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 JS_FILE_GET_PROPERTY_IMPL(GetPropType)
 {
-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Not yet implemented"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Not yet implemented"));
 }

 static const js_function_t file_proc[] = {
diff --git a/src/mod/languages/mod_v8/src/fsfileio.cpp b/src/mod/languages/mod_v8/src/fsfileio.cpp
index 18aeba04db..1e4700516d 100644
--- a/src/mod/languages/mod_v8/src/fsfileio.cpp
+++ b/src/mod/languages/mod_v8/src/fsfileio.cpp
@@ -79,8 +79,8 @@ void *FSFileIO::Construct(const v8::FunctionCallbackInfo<Value>& info)

 	if (info.Length() > 1) {
 		const char *path, *flags_str;
-		String::Utf8Value str1(info[0]);
-		String::Utf8Value str2(info[1]);
+		JsUtf8Value str1(info[0]);
+		JsUtf8Value str2(info[1]);
 		path = js_safe_str(*str1);
 		flags_str = js_safe_str(*str2);

@@ -113,7 +113,7 @@ void *FSFileIO::Construct(const v8::FunctionCallbackInfo<Value>& info)
 		if (switch_file_open(&fd, path, flags, SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE, pool) != SWITCH_STATUS_SUCCESS) {
 			switch_core_destroy_memory_pool(&pool);
 			char *err = switch_mprintf("Cannot Open File: %s", path);
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), err));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), err));
 			free(err);
 			return NULL;
 		}
@@ -127,7 +127,7 @@ void *FSFileIO::Construct(const v8::FunctionCallbackInfo<Value>& info)
 		return fio;
 	}

-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid Args"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid Args"));
 	return NULL;
 }

@@ -143,7 +143,7 @@ JS_FILEIO_FUNCTION_IMPL(Read)
 	}

 	if (info.Length() > 0) {
-		bytes = info[0]->Int32Value();
+		bytes = info[0]->Int32Value(js_current_context()).FromMaybe(0);
 	}

 	if (bytes) {
@@ -169,7 +169,7 @@ JS_FILEIO_FUNCTION_IMPL(GetData)
 	if (!_buflen || !_buf) {
 		info.GetReturnValue().Set(false);
 	} else {
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), _buf));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), _buf));
 	}
 }

@@ -185,7 +185,7 @@ JS_FILEIO_FUNCTION_IMPL(Write)

 	if (info.Length() > 0) {
 		char *data = NULL;
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		data = *str;

 		if (data) {
@@ -201,19 +201,19 @@ JS_FILEIO_FUNCTION_IMPL(Write)
 JS_FILEIO_GET_PROPERTY_IMPL(GetProperty)
 {
 	HandleScope handle_scope(info.GetIsolate());
-	String::Utf8Value str(property);
+	JsUtf8Value str(property);
 	const char *prop = js_safe_str(*str);

 	if (!strcmp(prop, "path")) {
 		if (_path) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), _path));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), _path));
 		} else {
 			info.GetReturnValue().Set(false);
 		}
 	} else if (!strcmp(prop, "open")) {
 		info.GetReturnValue().Set(_fd ? true : false);
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Bad property"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Bad property"));
 	}
 }

diff --git a/src/mod/languages/mod_v8/src/fsglobal.cpp b/src/mod/languages/mod_v8/src/fsglobal.cpp
index c360955687..2cefe9d218 100644
--- a/src/mod/languages/mod_v8/src/fsglobal.cpp
+++ b/src/mod/languages/mod_v8/src/fsglobal.cpp
@@ -100,7 +100,7 @@ size_t FSGlobal::HashCallback(void *ptr, size_t size, size_t nmemb, void *data)
 					*p = '\0';

 				// Add data to hash
-				args->Set(String::NewFromUtf8(config_data->isolate, line), String::NewFromUtf8(config_data->isolate, js_safe_str(val)));
+				js_obj_set(args, js_new_string(config_data->isolate, line), js_new_string(config_data->isolate, js_safe_str(val)));
 			}

 			line = nextline;
@@ -149,14 +149,14 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(FetchURLHash)
 	int saveDepth = 0;

 	if (info.Length() > 0) {
-		String::Utf8Value url(info[0]);
+		JsUtf8Value url(info[0]);

 		if (info.Length() > 1 && info[1]->IsString()) {
 			/* Cast to string */
 			Local<String> str = Local<String>::Cast(info[1]);

 			/* Try to get existing variable */
-			Local<Value> obj = info.GetIsolate()->GetCurrentContext()->Global()->Get(str);
+			Local<Value> obj = js_obj_get(info.GetIsolate()->GetCurrentContext()->Global(), str);

 			if (!obj.IsEmpty() && obj->IsArray()) {
 				/* The existing var is an array, use it */
@@ -164,11 +164,11 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(FetchURLHash)
 			} else if (obj.IsEmpty() || obj->IsUndefined()) {
 				/* No existing var (or an existing that is undefined), create a new one */
 				Local<Array> arguments = Array::New(info.GetIsolate());
-				info.GetIsolate()->GetCurrentContext()->Global()->Set(str, arguments);
+				js_obj_set(info.GetIsolate()->GetCurrentContext()->Global(), str, arguments);
 				config_data.hashObject.Reset(info.GetIsolate(), arguments);
 			} else {
 				/* The var exists, but is wrong type - exit with error */
-				info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Second argument is the name of an existing var of the wrong type"));
+				info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Second argument is the name of an existing var of the wrong type"));

 				return;
 			}
@@ -177,7 +177,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(FetchURLHash)
 			config_data.hashObject.Reset(info.GetIsolate(), Local<Array>::Cast(info[1]));
 		} else if (info.Length() > 1) {
 			/* The var exists, but is wrong type - exit with error */
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Second argument is of the wrong type"));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Second argument is of the wrong type"));

 			return;
 		} else {
@@ -188,7 +188,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(FetchURLHash)

 		curl_handle = switch_curl_easy_init();
 		if (!curl_handle) {
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Failed to initiate curl easy session."));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Failed to initiate curl easy session."));

 			return;
 		}
@@ -213,9 +213,9 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(FetchURLHash)
 		switch_curl_easy_cleanup(curl_handle);

 		/* Return the hash */
-		info.GetReturnValue().Set(config_data.hashObject);
+		info.GetReturnValue().Set(js_local(config_data.hashObject));
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 	}
 }

@@ -229,15 +229,15 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(FetchURLFile)

 	if (info.Length() > 1) {
 		const char *url = NULL, *filename = NULL;
-		String::Utf8Value str1(info[0]);
-		String::Utf8Value str2(info[1]);
+		JsUtf8Value str1(info[0]);
+		JsUtf8Value str2(info[1]);

 		url = js_safe_str(*str1);
 		filename = js_safe_str(*str2);

 		curl_handle = switch_curl_easy_init();
 		if (!curl_handle) {
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Failed to initiate curl easy session."));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Failed to initiate curl easy session."));

 			return;
 		}
@@ -269,7 +269,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(FetchURLFile)

 		switch_curl_easy_cleanup(curl_handle);
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 	}
 }

@@ -285,16 +285,16 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(FetchURL)

 	if (info.Length() >= 1) {
 		const char *url;
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);

 		url = js_safe_str(*str);
 		if (info.Length() > 1) {
-			buffer_size = info[1]->Int32Value();
+			buffer_size = info[1]->Int32Value(js_current_context()).FromMaybe(0);
 		}

 		curl_handle = switch_curl_easy_init();
 		if (!curl_handle) {
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Failed to initiate curl easy session."));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Failed to initiate curl easy session."));

 			return;
 		}
@@ -310,7 +310,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(FetchURL)
 		config_data.bufferDataLength = 0;

 		if (config_data.buffer == NULL) {
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Failed to allocate data buffer."));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Failed to allocate data buffer."));
 			switch_curl_easy_cleanup(curl_handle);

 			return;
@@ -330,7 +330,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(FetchURL)

 		if (code == CURLE_OK) {
 			config_data.buffer[config_data.bufferDataLength] = 0;
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(config_data.buffer)));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(config_data.buffer)));
 		} else {
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Curl returned error %u\n", (unsigned) code);
 			info.GetReturnValue().Set(false);
@@ -338,7 +338,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(FetchURL)

 		free(config_data.buffer);
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 	}
 }

@@ -348,7 +348,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Exit)

 	if (info.Length() > 0) {
 		HandleScope handle_scope(info.GetIsolate());
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);

 		if (*str) {
 			JSMain::ExitScript(info.GetIsolate(), *str);
@@ -374,7 +374,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Log)
 	}

 	if (info.Length() > 1) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);

 		if ((level_str = *str)) {
 			level = switch_log_str2level(level_str);
@@ -383,7 +383,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Log)
 			}
 		}

-		String::Utf8Value str2(info[1]);
+		JsUtf8Value str2(info[1]);
 		if ((msg = *str2) && *msg != '\0') {
 			const char lastchar = msg[strlen(msg)-1];
 			switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, "console_log", line, NULL, level, "%s%s", msg, lastchar != '\n' ? "\n" : "");
@@ -391,7 +391,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Log)
 			return;
 		}
 	} else if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		if ((msg = *str) && *msg != '\0') {
 			const char lastchar = msg[strlen(msg)-1];
 			switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, "console_log", line, NULL, level, "%s%s", msg, lastchar != '\n' ? "\n" : "");
@@ -411,8 +411,8 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(GlobalSet)
 	bool tf = true;

 	if (info.Length() > 1) {
-		String::Utf8Value str1(info[0]);
-		String::Utf8Value str2(info[1]);
+		JsUtf8Value str1(info[0]);
+		JsUtf8Value str2(info[1]);
 		var_name = js_safe_str(*str1);
 		val = js_safe_str(*str2);
 		if (info.Length() == 2) {
@@ -420,7 +420,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(GlobalSet)
 			info.GetReturnValue().Set(true);
 			return;
 		} else {
-			String::Utf8Value str3(info[2]);
+			JsUtf8Value str3(info[2]);
 			val2 = js_safe_str(*str3);
 			if (switch_core_set_var_conditional(var_name, val, val2) != SWITCH_TRUE) {
 				tf = false;
@@ -430,7 +430,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(GlobalSet)
 		}
 	}

-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "var name not supplied!"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "var name not supplied!"));
 }

 JS_GLOBAL_FUNCTION_IMPL_STATIC(GlobalGet)
@@ -441,15 +441,15 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(GlobalGet)
 	char *val = NULL;

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		var_name = js_safe_str(*str);
 		val = switch_core_get_variable_dup(var_name);
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(val)));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(val)));
 		switch_safe_free(val);
 		return;
 	}

-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "var name not supplied!"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "var name not supplied!"));
 }

 JS_GLOBAL_FUNCTION_IMPL_STATIC(Include)
@@ -457,13 +457,13 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Include)
 	JS_CHECK_SCRIPT_STATE();
 	if (info.Length() < 1) {
 		/* Bad arguments, return exception */
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 	} else {
 		/* Try to get the current script path */
 		string scriptPath = "";
-		Handle<Value> val = info.GetIsolate()->GetCurrentContext()->Global()->Get(String::NewFromUtf8(info.GetIsolate(), "scriptPath"));
+		Local<Value> val = js_obj_get(info.GetIsolate()->GetCurrentContext()->Global(), js_new_string(info.GetIsolate(), "scriptPath"));
 		if (!val.IsEmpty() && val->IsString()) {
-			String::Utf8Value tmp(val);
+			JsUtf8Value tmp(val);
 			if (*tmp) {
 				scriptPath = *tmp;
 			}
@@ -472,7 +472,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Include)
 		/* Loop all arguments until we find a valid file */
 		for (int i = 0; i < info.Length(); i++) {
 			HandleScope handle_scope(info.GetIsolate());
-			String::Utf8Value str(info[i]);
+			JsUtf8Value str(info[i]);
 			char *path = NULL;
 			const char *script_name = NULL;

@@ -508,12 +508,12 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Include)
 					if (script.IsEmpty()) {
 						info.GetReturnValue().Set(false);
 					} else {
-						info.GetReturnValue().Set(script.ToLocalChecked()->Run());
+						info.GetReturnValue().Set(js_run_script(script.ToLocalChecked()));
 					}
 #else
-					Handle<String> source = String::NewFromUtf8(info.GetIsolate(), js_file.c_str());
-					Handle<Script> script = Script::Compile(source, info[i]);
-					info.GetReturnValue().Set(script->Run());
+					Local<String> source = js_new_string(info.GetIsolate(), js_file.c_str());
+					Local<Script> script = Script::Compile(source, info[i]);
+					info.GetReturnValue().Set(js_run_script(script));
 #endif
 					switch_safe_free(path);
 					return;
@@ -522,7 +522,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Include)
 			switch_safe_free(path);
 		}

-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Failed to include javascript file"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Failed to include javascript file"));
 	}
 }

@@ -533,13 +533,13 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Sleep)
 	int32_t msec = 0;

 	if (info.Length() > 0) {
-		msec = info[0]->Int32Value();
+		msec = info[0]->Int32Value(js_current_context()).FromMaybe(0);
 	}

 	if (msec) {
 		switch_yield(msec * 1000);
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "No time specified"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "No time specified"));
 	}
 }

@@ -549,7 +549,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Use)
 	HandleScope handle_scope(info.GetIsolate());

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		char *mod_name = *str;

 		if (mod_name) {
@@ -560,12 +560,12 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Use)
 				mp->v8_mod_load(info);
 			} else {
 				char *err = switch_mprintf("Error loading %s", mod_name);
-				info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), err));
+				info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), err));
 				free(err);
 			}
 		}
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 	}
 }

@@ -575,7 +575,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(ApiExecute)
 	HandleScope handle_scope(info.GetIsolate());

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *cmd = js_safe_str(*str);
 		string arg;
 		switch_core_session_t *session = NULL;
@@ -588,13 +588,13 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(ApiExecute)
 		}

 		if (info.Length() > 1) {
-			String::Utf8Value str2(info[1]);
+			JsUtf8Value str2(info[1]);
 			arg = js_safe_str(*str2);
 		}

 		if (info.Length() > 2) {
 			if (!info[2].IsEmpty() && info[2]->IsObject()) {
-				Handle<Object> session_obj = Handle<Object>::Cast(info[2]);
+				Local<Object> session_obj = Local<Object>::Cast(info[2]);
 				FSSession *obj = JSBase::GetInstance<FSSession>(session_obj);
 				if (obj) {
 					session = obj->GetSession();
@@ -605,10 +605,10 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(ApiExecute)
 		SWITCH_STANDARD_STREAM(stream);
 		switch_api_execute(cmd, arg.c_str(), session, &stream);

-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_str_nil((char *) stream.data)));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), switch_str_nil((char *) stream.data)));
 		switch_safe_free(stream.data);
 	} else {
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 	}
 }

@@ -619,37 +619,37 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Email)
 	string to, from, headers, body, file, convert_cmd, convert_ext;

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		to = js_safe_str(*str);
 	}

 	if (info.Length() > 1) {
-		String::Utf8Value str(info[1]);
+		JsUtf8Value str(info[1]);
 		from = js_safe_str(*str);
 	}

 	if (info.Length() > 2) {
-		String::Utf8Value str(info[2]);
+		JsUtf8Value str(info[2]);
 		headers = js_safe_str(*str);
 	}

 	if (info.Length() > 3) {
-		String::Utf8Value str(info[3]);
+		JsUtf8Value str(info[3]);
 		body = js_safe_str(*str);
 	}

 	if (info.Length() > 4) {
-		String::Utf8Value str(info[4]);
+		JsUtf8Value str(info[4]);
 		file = js_safe_str(*str);
 	}

 	if (info.Length() > 5) {
-		String::Utf8Value str(info[5]);
+		JsUtf8Value str(info[5]);
 		convert_cmd = js_safe_str(*str);
 	}

 	if (info.Length() > 6) {
-		String::Utf8Value str(info[6]);
+		JsUtf8Value str(info[6]);
 		convert_ext = js_safe_str(*str);
 	}

@@ -666,8 +666,8 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Bridge)
 	JS_CHECK_SCRIPT_STATE();
 	HandleScope handle_scope(info.GetIsolate());
 	FSSession *jss_a = NULL, *jss_b = NULL;
-	Handle<Object> obj_a;
-	Handle<Object> obj_b;
+	Local<Object> obj_a;
+	Local<Object> obj_b;
 	void *bp = NULL;
 	switch_input_callback_function_t dtmf_func = NULL;
 	FSInputCallbackState cb_state;
@@ -676,34 +676,34 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(Bridge)

 	if (info.Length() > 1) {
 		if (info[0]->IsObject()) {
-			obj_a = Handle<Object>::Cast(info[0]);
+			obj_a = Local<Object>::Cast(info[0]);

 			if (!(jss_a = JSBase::GetInstance<FSSession>(obj_a))) {
-				info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Cannot find session A"));
+				info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Cannot find session A"));
 				return;
 			}
 		}
 		if (info[1]->IsObject()) {
-			obj_b = Handle<Object>::Cast(info[1]);
+			obj_b = Local<Object>::Cast(info[1]);
 			if (!(jss_b = JSBase::GetInstance<FSSession>(obj_b))) {
-				info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Cannot find session B"));
+				info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Cannot find session B"));
 				return;
 			}
 		}
 	}

 	if (!(jss_a && jss_a->GetSession())) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "session A is not ready!"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "session A is not ready!"));
 		return;
 	}

 	if (!(jss_b && jss_b->GetSession())) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "session B is not ready!"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "session B is not ready!"));
 		return;
 	}

 	if (info.Length() > 2) {
-		Handle<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[2]);
+		Local<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[2]);

 		if (!func.IsEmpty()) {
 			cb_state.function.Reset(info.GetIsolate(), func);
@@ -738,7 +738,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(System)
 	info.GetReturnValue().Set(false);

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		cmd = *str;
 		if (cmd) {
 			result = switch_system(cmd, SWITCH_TRUE);
@@ -747,7 +747,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(System)
 		}
 	}

-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 }

 JS_GLOBAL_FUNCTION_IMPL_STATIC(FileDelete)
@@ -759,7 +759,7 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(FileDelete)
 	info.GetReturnValue().Set(false);

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		path = *str;
 		if (path) {
 			if ((switch_file_remove(path, NULL)) == SWITCH_STATUS_SUCCESS) {
@@ -769,20 +769,20 @@ JS_GLOBAL_FUNCTION_IMPL_STATIC(FileDelete)
 		}
 	}

-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 }

 /* Internal Version function accessable from JS - used to get the current V8 version */
 JS_GLOBAL_FUNCTION_IMPL_STATIC(Version)
 {
-	info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), V8::GetVersion()));
+	info.GetReturnValue().Set(js_new_string(info.GetIsolate(), V8::GetVersion()));
 }

 /* TaskId assigned to the script - used to manage the task */
 JS_GLOBAL_FUNCTION_IMPL_STATIC(Id)
 {
 	js_isolate_private_data_t *private_data = (js_isolate_private_data_t*)info.GetIsolate()->GetData(ISOLATE_DATA_PRIVATE);
-	info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), private_data->str_task_id.c_str()));
+	info.GetReturnValue().Set(js_new_string(info.GetIsolate(), private_data->str_task_id.c_str()));
 }

 static const js_function_t fs_proc[] = {
diff --git a/src/mod/languages/mod_v8/src/fsodbc.cpp b/src/mod/languages/mod_v8/src/fsodbc.cpp
index 2b75661c50..4af6f20ca9 100644
--- a/src/mod/languages/mod_v8/src/fsodbc.cpp
+++ b/src/mod/languages/mod_v8/src/fsodbc.cpp
@@ -102,19 +102,19 @@ void *FSODBC::Construct(const v8::FunctionCallbackInfo<Value>& info)
 	int32_t blen = 1024;

 	if (info.Length() < 3) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid parameters"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid parameters"));
 		return NULL;
 	}

-	String::Utf8Value str1(info[0]);
-	String::Utf8Value str2(info[1]);
-	String::Utf8Value str3(info[2]);
+	JsUtf8Value str1(info[0]);
+	JsUtf8Value str2(info[1]);
+	JsUtf8Value str3(info[2]);
 	dsn = *str1;
 	username = *str2;
 	password = *str3;

 	if (info.Length() > 3) {
-		int32_t len = info[3]->Int32Value();
+		int32_t len = info[3]->Int32Value(js_current_context()).FromMaybe(0);

 		if (len > 0) {
 			blen = len;
@@ -134,13 +134,13 @@ void *FSODBC::Construct(const v8::FunctionCallbackInfo<Value>& info)
 	}

 	if (!odbc_obj) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Failed to create new ODBC instance"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Failed to create new ODBC instance"));
 		return NULL;
 	}

 	if (!(odbc_obj->_colbuf = (SQLCHAR *) malloc(blen))) {
 		delete odbc_obj;
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Memory error"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Memory error"));
 		return NULL;
 	}

@@ -169,7 +169,7 @@ JS_ODBC_FUNCTION_IMPL(Execute)
 	const char *sql;
 	bool tf = false;
 	SQLHSTMT local_stmt;
-	String::Utf8Value str(info[0]);
+	JsUtf8Value str(info[0]);

 	if (info.Length() < 1) {
 		goto done;
@@ -201,7 +201,7 @@ JS_ODBC_FUNCTION_IMPL(Exec)
 	HandleScope handle_scope(info.GetIsolate());
 	const char *sql;
 	bool tf = false;
-	String::Utf8Value str(info[0]);
+	JsUtf8Value str(info[0]);

 	if (info.Length() < 1) {
 		goto done;
@@ -307,7 +307,7 @@ JS_ODBC_FUNCTION_IMPL(GetData)
 			goto done;
 		}

-		Handle<Array> arg = Array::New(GetIsolate(), nColumns);
+		Local<Array> arg = Array::New(GetIsolate(), nColumns);

 		for (x = 1; x <= nColumns; x++) {
 			SQLSMALLINT NameLength, DataType, DecimalDigits, Nullable;
@@ -321,9 +321,9 @@ JS_ODBC_FUNCTION_IMPL(GetData)

 			if (name) {
 				if (SQL_NULL_DATA == pcbValue) {
-					arg->Set(String::NewFromUtf8(GetIsolate(), (const char *)name), Null(info.GetIsolate()));
+					js_obj_set(arg, js_new_string(GetIsolate(), (const char *)name), Null(info.GetIsolate()));
 				} else {
-	                arg->Set(String::NewFromUtf8(GetIsolate(), (const char *)name), String::NewFromUtf8(GetIsolate(), data ? (const char *)data : ""));
+	                js_obj_set(arg, js_new_string(GetIsolate(), (const char *)name), js_new_string(GetIsolate(), data ? (const char *)data : ""));
 				}
 			}
 		}
@@ -369,12 +369,12 @@ JS_ODBC_GET_PROPERTY_IMPL(GetProperty)
 {
 	HandleScope handle_scope(info.GetIsolate());

-	String::Utf8Value str(property);
+	JsUtf8Value str(property);

 	if (!strcmp(js_safe_str(*str), "name")) {
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), _dsn.length() > 0 ? _dsn.c_str() : ""));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), _dsn.length() > 0 ? _dsn.c_str() : ""));
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Bad property"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Bad property"));
 	}
 }

diff --git a/src/mod/languages/mod_v8/src/fspcre.cpp b/src/mod/languages/mod_v8/src/fspcre.cpp
index e76cbcbcaa..6b37b732fa 100644
--- a/src/mod/languages/mod_v8/src/fspcre.cpp
+++ b/src/mod/languages/mod_v8/src/fspcre.cpp
@@ -71,8 +71,8 @@ JS_PCRE_FUNCTION_IMPL(Compile)
 	const char *string, *regex_string;

 	if (info.Length() > 1) {
-		String::Utf8Value str1(info[0]);
-		String::Utf8Value str2(info[1]);
+		JsUtf8Value str1(info[0]);
+		JsUtf8Value str2(info[1]);
 		string = js_safe_str(*str1);
 		regex_string = js_safe_str(*str2);
 		switch_regex_match_safe_free(this->_match_data);
@@ -82,7 +82,7 @@ JS_PCRE_FUNCTION_IMPL(Compile)
 		this->_proceed = switch_regex_perform(this->_str, regex_string, &this->_re, &this->_match_data);
 		info.GetReturnValue().Set(this->_proceed ? true : false);
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid args"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid args"));
 	}
 }

@@ -93,34 +93,34 @@ JS_PCRE_FUNCTION_IMPL(Substitute)
 	char *substituted;

 	if (!this->_proceed) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "REGEX is not compiled or has no matches"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "REGEX is not compiled or has no matches"));
 		return;
 	}

 	if (info.Length() > 0) {
 		uint32_t len;
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		subst_string = js_safe_str(*str);
 		len = (uint32_t) (strlen(this->_str) + strlen(subst_string) + 10) * this->_proceed;
 		substituted = (char *)malloc(len);
 		switch_assert(substituted != NULL);
 		switch_perform_substitution(this->_match_data, subst_string, substituted, len);
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), substituted));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), substituted));
 		free(substituted);
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid Args"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid Args"));
 	}
 }

 JS_PCRE_GET_PROPERTY_IMPL(GetProperty)
 {
 	HandleScope handle_scope(info.GetIsolate());
-	String::Utf8Value str(property);
+	JsUtf8Value str(property);

 	if (!strcmp(js_safe_str(*str), "ready")) {
 		info.GetReturnValue().Set(true);
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Bad property"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Bad property"));
 	}
 }

diff --git a/src/mod/languages/mod_v8/src/fsrequest.cpp b/src/mod/languages/mod_v8/src/fsrequest.cpp
index c5bd344c8d..943525f735 100644
--- a/src/mod/languages/mod_v8/src/fsrequest.cpp
+++ b/src/mod/languages/mod_v8/src/fsrequest.cpp
@@ -63,7 +63,7 @@ JS_REQUEST_FUNCTION_IMPL(Write)
 	HandleScope handle_scope(info.GetIsolate());

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		if (*str) this->_stream->write_function(this->_stream, "%s", *str);
 		info.GetReturnValue().Set(true);
 		return;
@@ -77,8 +77,8 @@ JS_REQUEST_FUNCTION_IMPL(AddHeader)
 	HandleScope handle_scope(info.GetIsolate());

 	if (info.Length() > 1) {
-		String::Utf8Value str1(info[0]);
-		String::Utf8Value str2(info[1]);
+		JsUtf8Value str1(info[0]);
+		JsUtf8Value str2(info[1]);
 		const char *hname = js_safe_str(*str1);
 		const char *hval = js_safe_str(*str2);
 		switch_event_add_header_string(this->_stream->param_event, SWITCH_STACK_BOTTOM, hname, hval);
@@ -94,10 +94,10 @@ JS_REQUEST_FUNCTION_IMPL(GetHeader)
 	HandleScope handle_scope(info.GetIsolate());

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *hname = js_safe_str(*str);
 		char *val = switch_event_get_header(this->_stream->param_event, hname);
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(val)));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(val)));
 		return;
 	}

@@ -110,7 +110,7 @@ JS_REQUEST_FUNCTION_IMPL(DumpEnv)
 	string how = "text";

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		how = js_safe_str(*str);
 	}

@@ -119,7 +119,7 @@ JS_REQUEST_FUNCTION_IMPL(DumpEnv)
 		if ((xml = switch_event_xmlize(this->_stream->param_event, SWITCH_VA_NONE))) {
 			char *xmlstr;
 			if ((xmlstr = switch_xml_toxml(xml, SWITCH_FALSE))) {
-				info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), xmlstr));
+				info.GetReturnValue().Set(js_new_string(info.GetIsolate(), xmlstr));
 				switch_safe_free(xmlstr);
 				switch_xml_free(xml);
 				return;
@@ -130,7 +130,7 @@ JS_REQUEST_FUNCTION_IMPL(DumpEnv)
 	} else if (!strcasecmp(how.c_str(), "json")) {
 		char *buf = NULL;
 		if (switch_event_serialize_json(this->_stream->param_event, &buf) == SWITCH_STATUS_SUCCESS) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(buf)));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(buf)));
 			switch_safe_free(buf);
 			return;
 		} else {
@@ -139,7 +139,7 @@ JS_REQUEST_FUNCTION_IMPL(DumpEnv)
 	} else {
 		char *buf = NULL;
 		if (switch_event_serialize(this->_stream->param_event, &buf, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(buf)));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(buf)));
 			switch_safe_free(buf);
 			return;
 		} else {
@@ -153,16 +153,16 @@ JS_REQUEST_FUNCTION_IMPL(DumpEnv)
 JS_REQUEST_GET_PROPERTY_IMPL(GetProperty)
 {
 	HandleScope handle_scope(info.GetIsolate());
-	String::Utf8Value str(property);
+	JsUtf8Value str(property);

 	if (!strcmp(js_safe_str(*str), "command")) {
 		if (this->_cmd) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), this->_cmd));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), this->_cmd));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 		}
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Bad property"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Bad property"));
 	}
 }

diff --git a/src/mod/languages/mod_v8/src/fssession.cpp b/src/mod/languages/mod_v8/src/fssession.cpp
index 2510457175..c055cc3854 100644
--- a/src/mod/languages/mod_v8/src/fssession.cpp
+++ b/src/mod/languages/mod_v8/src/fssession.cpp
@@ -40,19 +40,19 @@ using namespace v8;
 static const char js_class_name[] = "Session";

 #define METHOD_SANITY_CHECK() if (!this->_session) {\
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "No session is active, you must have an active session before calling this method"));\
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "No session is active, you must have an active session before calling this method"));\
 		return;\
 	} else CheckHangupHook(this, NULL)

 #define CHANNEL_SANITY_CHECK() do {\
 		if (!switch_channel_ready(channel)) {\
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Session is not active!"));\
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Session is not active!"));\
 			return;\
 		}\
 		if (!((switch_channel_test_flag(channel, CF_ANSWERED) || switch_channel_test_flag(channel, CF_EARLY_MEDIA)))) {\
 			switch_channel_pre_answer(channel);\
 			if (!((switch_channel_test_flag(channel, CF_ANSWERED) || switch_channel_test_flag(channel, CF_EARLY_MEDIA)))) {\
-				info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Session is not answered!"));\
+				info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Session is not answered!"));\
 				return;\
 			}\
 		}\
@@ -60,14 +60,14 @@ static const char js_class_name[] = "Session";

 #define CHANNEL_SANITY_CHECK_ANSWER() do {\
 		if (!switch_channel_ready(channel)) {\
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Session is not active!"));\
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Session is not active!"));\
 			return;\
 		}\
 	} while (foo == 1)

 #define CHANNEL_MEDIA_SANITY_CHECK() do {\
 		if (!switch_channel_media_ready(channel)) {\
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Session is not in media mode!"));\
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Session is not in media mode!"));\
 			return;\
 		}\
 	} while (foo == 1)
@@ -192,15 +192,15 @@ switch_status_t FSSession::CommonCallback(switch_core_session_t *session, void *
 	FSInputCallbackState *cb_state = (FSInputCallbackState *)buf;
 	switch_event_t *event = NULL;
 	int argc = 0;
-	Handle<Value> argv[4];
-	Handle<Object> Event;
+	Local<Value> argv[4];
+	Local<Object> Event;
 	bool ret = true;
 	switch_status_t status = SWITCH_STATUS_FALSE;

 	/* Session sanity check first */
 	if (!cb_state->session_state || !cb_state->session_state->_session) {
 		if (cb_state->session_state && cb_state->session_state->GetIsolate()) {
-			cb_state->session_state->GetIsolate()->ThrowException(String::NewFromUtf8(cb_state->session_state->GetIsolate(), "No session is active, you must have an active session before calling this method"));
+			cb_state->session_state->GetIsolate()->ThrowException(js_new_string(cb_state->session_state->GetIsolate(), "No session is active, you must have an active session before calling this method"));
 		} else {
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No session is active, you must have an active session before calling this method\n");
 		}
@@ -235,7 +235,7 @@ switch_status_t FSSession::CommonCallback(switch_core_session_t *session, void *
 		if ((event = (switch_event_t *) input)) {
 			Event = FSEvent::New(event, "", cb_state->session_state->GetOwner());
 			if (!Event.IsEmpty()) {
-				argv[argc++] = String::NewFromUtf8(isolate, "event");
+				argv[argc++] = js_new_string(isolate, "event");
 				argv[argc++] = Local<Object>::New(isolate, Event);
 			}
 		}
@@ -250,7 +250,7 @@ switch_status_t FSSession::CommonCallback(switch_core_session_t *session, void *
 			if (dtmf) {
 				Event = FSDTMF::New(dtmf, "", cb_state->session_state->GetOwner());
 				if (!Event.IsEmpty()) {
-					argv[argc++] = String::NewFromUtf8(isolate, "dtmf");
+					argv[argc++] = js_new_string(isolate, "dtmf");
 					argv[argc++] = Local<Object>::New(isolate, Event);
 				} else {
 					goto done;
@@ -268,10 +268,10 @@ switch_status_t FSSession::CommonCallback(switch_core_session_t *session, void *

 	if (ret) {
 		if (!cb_state->function.IsEmpty()) {
-			Handle<Function> func = Local<Function>::New(isolate, cb_state->function);
+			Local<Function> func = Local<Function>::New(isolate, cb_state->function);

 			if (func->IsFunction()) {
-				Handle<Value> res = func->Call(isolate->GetCurrentContext()->Global(), argc, argv);
+				Local<Value> res = js_call(func, isolate->GetCurrentContext()->Global(), argc, argv);

 				if (!res.IsEmpty()) {
 					cb_state->ret.Reset(isolate, res);
@@ -309,8 +309,8 @@ switch_status_t FSSession::StreamInputCallback(switch_core_session_t *session, v
 	}

 	if (!cb_state->ret.IsEmpty()) {
-		Handle<Value> tmp = Local<Value>::New(obj->GetOwner()->GetIsolate(), cb_state->ret);
-		String::Utf8Value str(tmp);
+		Local<Value> tmp = Local<Value>::New(obj->GetOwner()->GetIsolate(), cb_state->ret);
+		JsUtf8Value str(tmp);
 		const char *ret = js_safe_str(*str);

 		if (!strncasecmp(ret, "speed", 5)) {
@@ -420,8 +420,8 @@ switch_status_t FSSession::RecordInputCallback(switch_core_session_t *session, v
 	}

 	if (!cb_state->ret.IsEmpty()) {
-		Handle<Value> tmp = Local<Value>::New(obj->GetOwner()->GetIsolate(), cb_state->ret);
-		String::Utf8Value str(tmp);
+		Local<Value> tmp = Local<Value>::New(obj->GetOwner()->GetIsolate(), cb_state->ret);
+		JsUtf8Value str(tmp);
 		const char *ret = js_safe_str(*str);

 		if (!strcasecmp(ret, "pause")) {
@@ -461,8 +461,8 @@ switch_status_t FSSession::CollectInputCallback(switch_core_session_t *session,
 	}

 	if (!cb_state->ret.IsEmpty()) {
-		Handle<Value> tmp = Local<Value>::New(obj->GetOwner()->GetIsolate(), cb_state->ret);
-		String::Utf8Value str(tmp);
+		Local<Value> tmp = Local<Value>::New(obj->GetOwner()->GetIsolate(), cb_state->ret);
+		JsUtf8Value str(tmp);
 		ret = js_safe_str(*str);

 		if (!strcmp(ret, "true") || !strcmp(ret, "undefined")) {
@@ -525,7 +525,7 @@ JS_SESSION_FUNCTION_IMPL(RecordFile)
 	CHANNEL_MEDIA_SANITY_CHECK();

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		file_name = js_safe_str(*str);
 		if (zstr(file_name.c_str())) {
 			info.GetReturnValue().Set(false);
@@ -534,7 +534,7 @@ JS_SESSION_FUNCTION_IMPL(RecordFile)
 	}

 	if (info.Length() > 1) {
-		Handle<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[1]);
+		Local<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[1]);

 		if (!func.IsEmpty()) {
 			cb_state.session_state = this;
@@ -550,15 +550,15 @@ JS_SESSION_FUNCTION_IMPL(RecordFile)
 		}

 		if (info.Length() > 3) {
-			limit = info[3]->Int32Value();
+			limit = info[3]->Int32Value(js_current_context()).FromMaybe(0);
 		}

 		if (info.Length() > 4) {
-			fh.thresh = info[4]->Int32Value();
+			fh.thresh = info[4]->Int32Value(js_current_context()).FromMaybe(0);
 		}

 		if (info.Length() > 5) {
-			fh.silence_hits = info[5]->Int32Value();
+			fh.silence_hits = info[5]->Int32Value(js_current_context()).FromMaybe(0);
 		}
 	}

@@ -569,7 +569,7 @@ JS_SESSION_FUNCTION_IMPL(RecordFile)
 	args.buflen = len;

 	JS_EXECUTE_LONG_RUNNING_C_CALL_WITH_UNLOCKER(switch_ivr_record_file(this->_session, &fh, file_name.c_str(), &args, limit));
-	info.GetReturnValue().Set(cb_state.ret);
+	info.GetReturnValue().Set(js_local(cb_state.ret));

 	CheckHangupHook(this, &ret);
 	if (!ret) JSMain::ExitScript(info.GetIsolate(), NULL);
@@ -594,7 +594,7 @@ JS_SESSION_FUNCTION_IMPL(CollectInput)
 	CHANNEL_MEDIA_SANITY_CHECK();

 	if (info.Length() > 0) {
-		Handle<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[0]);
+		Local<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[0]);

 		if (!func.IsEmpty()) {
 			cb_state.function.Reset(info.GetIsolate(), func);
@@ -612,10 +612,10 @@ JS_SESSION_FUNCTION_IMPL(CollectInput)
 	}

 	if (info.Length() == 3) {
-		abs_timeout = info[2]->Int32Value();
+		abs_timeout = info[2]->Int32Value(js_current_context()).FromMaybe(0);
 	} else if (info.Length() > 3) {
-		digit_timeout = info[2]->Int32Value();
-		abs_timeout = info[3]->Int32Value();
+		digit_timeout = info[2]->Int32Value(js_current_context()).FromMaybe(0);
+		abs_timeout = info[3]->Int32Value(js_current_context()).FromMaybe(0);
 	}

 	cb_state.ret.Reset(info.GetIsolate(), Boolean::New(info.GetIsolate(), false));
@@ -624,7 +624,7 @@ JS_SESSION_FUNCTION_IMPL(CollectInput)
 	args.buflen = len;

 	JS_EXECUTE_LONG_RUNNING_C_CALL_WITH_UNLOCKER(switch_ivr_collect_digits_callback(this->_session, &args, digit_timeout, abs_timeout));
-	info.GetReturnValue().Set(cb_state.ret);
+	info.GetReturnValue().Set(js_local(cb_state.ret));

 	CheckHangupHook(this, &ret);
 	if (!ret) JSMain::ExitScript(info.GetIsolate(), NULL);
@@ -651,24 +651,24 @@ JS_SESSION_FUNCTION_IMPL(SayPhrase)
 	CHANNEL_MEDIA_SANITY_CHECK();

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		phrase_name = js_safe_str(*str);
 		if (zstr(phrase_name.c_str())) {
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid phrase name"));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid phrase name"));
 			return;
 		}
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 		return;
 	}

 	if (info.Length() > 1) {
-		String::Utf8Value str(info[1]);
+		JsUtf8Value str(info[1]);
 		phrase_data = js_safe_str(*str);
 	}

 	if (info.Length() > 2) {
-		String::Utf8Value str(info[2]);
+		JsUtf8Value str(info[2]);
 		tmp = js_safe_str(*str);
 		if (!zstr(tmp.c_str())) {
 			phrase_lang = std::move(tmp);
@@ -676,7 +676,7 @@ JS_SESSION_FUNCTION_IMPL(SayPhrase)
 	}

 	if (info.Length() > 3) {
-		Handle<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[3]);
+		Local<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[3]);

 		if (!func.IsEmpty()) {
 			cb_state.function.Reset(info.GetIsolate(), func);
@@ -699,7 +699,7 @@ JS_SESSION_FUNCTION_IMPL(SayPhrase)
 	args.buflen = len;

 	JS_EXECUTE_LONG_RUNNING_C_CALL_WITH_UNLOCKER(switch_ivr_phrase_macro(this->_session, phrase_name.c_str(), phrase_data.c_str(), phrase_lang.c_str(), &args));
-	info.GetReturnValue().Set(cb_state.ret);
+	info.GetReturnValue().Set(js_local(cb_state.ret));

 	CheckHangupHook(this, &ret);
 	if (!ret) JSMain::ExitScript(info.GetIsolate(), NULL);
@@ -713,7 +713,7 @@ bool FSSession::CheckHangupHook(FSSession *obj, bool *ret)

 	Isolate *isolate = obj->GetIsolate();
 	HandleScope handle_scope(isolate);
-	Handle<Value> argv[2];
+	Local<Value> argv[2];
 	int argc = 0;
 	bool res = true;
 	string resp;
@@ -723,19 +723,19 @@ bool FSSession::CheckHangupHook(FSSession *obj, bool *ret)
 		argv[argc++] = Local<Object>::New(obj->GetOwner()->GetIsolate(), obj->GetJavaScriptObject());

 		if (obj->_hook_state == CS_HANGUP) {
-			argv[argc++] = String::NewFromUtf8(isolate, "hangup");
+			argv[argc++] = js_new_string(isolate, "hangup");
 		} else {
-			argv[argc++] = String::NewFromUtf8(isolate, "transfer");
+			argv[argc++] = js_new_string(isolate, "transfer");
 		}

 		// Run the hangup hook
-		Handle<Function> func = Local<Function>::New(isolate, obj->_on_hangup);
+		Local<Function> func = Local<Function>::New(isolate, obj->_on_hangup);

 		if (!func.IsEmpty() && func->IsFunction()) {
-			Handle<Value> res = func->Call(isolate->GetCurrentContext()->Global(), argc, argv);
+			Local<Value> res = js_call(func, isolate->GetCurrentContext()->Global(), argc, argv);

 			if (!res.IsEmpty()) {
-				String::Utf8Value str(res);
+				JsUtf8Value str(res);
 				resp = js_safe_str(*str);
 			}
 		}
@@ -785,7 +785,7 @@ JS_SESSION_FUNCTION_IMPL(SetHangupHook)
 		}

 		if (info.Length() > 0) {
-			Handle<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[0]);
+			Local<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[0]);

 			if (!func.IsEmpty()) {
 				this->_on_hangup.Reset(info.GetIsolate(), func);
@@ -819,16 +819,16 @@ JS_SESSION_FUNCTION_IMPL(StreamFile)
 	CHANNEL_MEDIA_SANITY_CHECK();

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		file_name = js_safe_str(*str);
 		if (zstr(file_name.c_str())) {
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid filename"));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid filename"));
 			return;
 		}
 	}

 	if (info.Length() > 1) {
-		Handle<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[1]);
+		Local<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[1]);

 		if (!func.IsEmpty()) {
 			cb_state.function.Reset(info.GetIsolate(), func);
@@ -846,7 +846,7 @@ JS_SESSION_FUNCTION_IMPL(StreamFile)
 	}

 	if (info.Length() > 3) {
-		fh.samples = info[3]->Int32Value();
+		fh.samples = info[3]->Int32Value(js_current_context()).FromMaybe(0);
 	}

 	if ((prebuf = switch_channel_get_variable(channel, "stream_prebuffer"))) {
@@ -862,7 +862,7 @@ JS_SESSION_FUNCTION_IMPL(StreamFile)
 	args.buf = bp;
 	args.buflen = len;
 	JS_EXECUTE_LONG_RUNNING_C_CALL_WITH_UNLOCKER(switch_ivr_play_file(this->_session, &fh, file_name.c_str(), &args));
-	info.GetReturnValue().Set(cb_state.ret);
+	info.GetReturnValue().Set(js_local(cb_state.ret));

 	switch_snprintf(posbuf, sizeof(posbuf), "%u", fh.offset_pos);
 	switch_channel_set_variable(channel, "last_file_position", posbuf);
@@ -890,7 +890,7 @@ JS_SESSION_FUNCTION_IMPL(Sleep)
 	CHANNEL_MEDIA_SANITY_CHECK();

 	if (info.Length() > 0) {
-		ms = info[0]->Int32Value();
+		ms = info[0]->Int32Value(js_current_context()).FromMaybe(0);
 	}

 	if (ms <= 0) {
@@ -898,7 +898,7 @@ JS_SESSION_FUNCTION_IMPL(Sleep)
 	}

 	if (info.Length() > 1) {
-		Handle<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[1]);
+		Local<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[1]);

 		if (!func.IsEmpty()) {
 			cb_state.function.Reset(info.GetIsolate(), func);
@@ -916,7 +916,7 @@ JS_SESSION_FUNCTION_IMPL(Sleep)
 	}

 	if (info.Length() > 2) {
-		sync = info[2]->Int32Value();
+		sync = info[2]->Int32Value(js_current_context()).FromMaybe(0);
 	}

 	cb_state.ret.Reset(info.GetIsolate(), Boolean::New(info.GetIsolate(), false));
@@ -924,7 +924,7 @@ JS_SESSION_FUNCTION_IMPL(Sleep)
 	args.buf = bp;
 	args.buflen = len;
 	JS_EXECUTE_LONG_RUNNING_C_CALL_WITH_UNLOCKER(switch_ivr_sleep(this->_session, ms, (switch_bool_t)sync, &args));
-	info.GetReturnValue().Set(cb_state.ret);
+	info.GetReturnValue().Set(js_local(cb_state.ret));

 	CheckHangupHook(this, &ret);
 	if (!ret) JSMain::ExitScript(info.GetIsolate(), NULL);
@@ -940,8 +940,8 @@ JS_SESSION_FUNCTION_IMPL(SetVariable)

 	if (info.Length() > 1) {
 		const char *var, *val;
-		String::Utf8Value str1(info[0]);
-		String::Utf8Value str2(info[1]);
+		JsUtf8Value str1(info[0]);
+		JsUtf8Value str2(info[1]);

 		var = js_safe_str(*str1);
 		val = *str2;
@@ -962,12 +962,12 @@ JS_SESSION_FUNCTION_IMPL(GetVariable)

 	if (info.Length() > 0) {
 		const char *var, *val;
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);

 		var = js_safe_str(*str);
 		val = switch_channel_get_variable(channel, var);

-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(val)));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(val)));
 	} else {
 		info.GetReturnValue().Set(false);
 	}
@@ -1029,29 +1029,29 @@ JS_SESSION_FUNCTION_IMPL(Speak)
 	CHANNEL_MEDIA_SANITY_CHECK();

 	if (info.Length() < 3) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 		return;
 	}

-	String::Utf8Value str1(info[0]);
-	String::Utf8Value str2(info[1]);
-	String::Utf8Value str3(info[2]);
+	JsUtf8Value str1(info[0]);
+	JsUtf8Value str2(info[1]);
+	JsUtf8Value str3(info[2]);
 	tts_name = js_safe_str(*str1);
 	voice_name = js_safe_str(*str2);
 	text = js_safe_str(*str3);

 	if (zstr(tts_name)) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid TTS Name"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid TTS Name"));
 		return;
 	}

 	if (zstr(text)) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid Text"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid Text"));
 		return;
 	}

 	if (this->_speech && this->_speech->speaking) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Recursive call not allowed"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Recursive call not allowed"));
 		return;
 	}

@@ -1068,13 +1068,13 @@ JS_SESSION_FUNCTION_IMPL(Speak)
 		switch_assert(this->_speech != NULL);
 		if (InitSpeechEngine(tts_name, voice_name) != SWITCH_STATUS_SUCCESS) {
 			this->_speech = NULL;
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Cannot allocate speech engine!"));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Cannot allocate speech engine!"));
 			return;
 		}
 	}

 	if (info.Length() > 3) {
-		Handle<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[3]);
+		Local<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[3]);

 		if (!func.IsEmpty()) {
 			cb_state.function.Reset(info.GetIsolate(), func);
@@ -1103,7 +1103,7 @@ JS_SESSION_FUNCTION_IMPL(Speak)
 		this->_speech->speaking = 0;
 	}

-	info.GetReturnValue().Set(cb_state.ret);
+	info.GetReturnValue().Set(js_local(cb_state.ret));

 	CheckHangupHook(this, &ret);
 	if (!ret) JSMain::ExitScript(info.GetIsolate(), NULL);
@@ -1123,34 +1123,34 @@ JS_SESSION_FUNCTION_IMPL(GetDigits)

 	if (info.Length() > 0) {
 		char term;
-		digits = info[0]->Int32Value();
+		digits = info[0]->Int32Value(js_current_context()).FromMaybe(0);

 		if (digits > sizeof(buf) - 1) {
 			char *err = switch_mprintf("Exceeded max digits of %" SWITCH_SIZE_T_FMT, sizeof(buf) - 1);
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), err));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), err));
 			free(err);
 			return;
 		}

 		if (info.Length() > 1) {
-			String::Utf8Value str(info[1]);
+			JsUtf8Value str(info[1]);
 			terminators = js_safe_str(*str);
 		}

 		if (info.Length() > 2) {
-			timeout = info[2]->Int32Value();
+			timeout = info[2]->Int32Value(js_current_context()).FromMaybe(0);
 		}

 		if (info.Length() > 3) {
-			digit_timeout = info[3]->Int32Value();
+			digit_timeout = info[3]->Int32Value(js_current_context()).FromMaybe(0);
 		}

 		if (info.Length() > 4) {
-			abs_timeout = info[4]->Int32Value();
+			abs_timeout = info[4]->Int32Value(js_current_context()).FromMaybe(0);
 		}

 		switch_ivr_collect_digits_count(this->_session, buf, sizeof(buf), digits, terminators.c_str(), &term, timeout, digit_timeout, abs_timeout);
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), buf));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), buf));
 	}
 }

@@ -1162,7 +1162,7 @@ JS_SESSION_FUNCTION_IMPL(SetAutoHangup)
 	METHOD_SANITY_CHECK();

 	if (info.Length() > 0) {
-		bool tf = info[0]->BooleanValue();
+		bool tf = js_to_bool(info[0]);
 		if (tf) {
 			switch_set_flag(this, S_HUP);
 		} else {
@@ -1210,7 +1210,7 @@ JS_SESSION_FUNCTION_IMPL(GenerateXmlCdr)
 	if (switch_ivr_generate_xml_cdr(this->_session, &cdr) == SWITCH_STATUS_SUCCESS) {
 		char *xml_text;
 		if ((xml_text = switch_xml_toxml(cdr, SWITCH_FALSE))) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), xml_text));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), xml_text));
 		}
 		switch_safe_free(xml_text);
 		switch_xml_free(cdr);
@@ -1260,7 +1260,7 @@ JS_SESSION_FUNCTION_IMPL(WaitForMedia)
 	started = switch_micro_time_now();

 	if (info.Length() > 0) {
-		timeout = info[0]->Int32Value();
+		timeout = info[0]->Int32Value(js_current_context()).FromMaybe(0);
 		if (timeout < 1000) {
 			timeout = 1000;
 		}
@@ -1305,7 +1305,7 @@ JS_SESSION_FUNCTION_IMPL(WaitForAnswer)
 	started = switch_micro_time_now();

 	if (info.Length() > 0) {
-		timeout = info[0]->Int32Value();
+		timeout = info[0]->Int32Value(js_current_context()).FromMaybe(0);
 		if (timeout < 1000) {
 			timeout = 1000;
 		}
@@ -1350,10 +1350,10 @@ JS_SESSION_FUNCTION_IMPL(Detach)
 		if (info.Length() > 0) {
 			if (info[0]->IsInt32()) {
 				int32_t i = 0;
-				i = info[0]->Int32Value();
+				i = info[0]->Int32Value(js_current_context()).FromMaybe(0);
 				cause = (switch_call_cause_t)i;
 			} else {
-				String::Utf8Value str(info[0]);
+				JsUtf8Value str(info[0]);
 				const char *cause_name = js_safe_str(*str);
 				cause = switch_channel_str2cause(cause_name);
 			}
@@ -1383,14 +1383,14 @@ JS_SESSION_FUNCTION_IMPL(Execute)

 	if (info.Length() > 0) {
 		switch_application_interface_t *application_interface;
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *app_name = js_safe_str(*str);
 		string app_arg;

 		METHOD_SANITY_CHECK();

 		if (info.Length() > 1) {
-			String::Utf8Value str2(info[1]);
+			JsUtf8Value str2(info[1]);
 			app_arg = js_safe_str(*str2);
 		}

@@ -1422,7 +1422,7 @@ JS_SESSION_FUNCTION_IMPL(GetEvent)
 	METHOD_SANITY_CHECK();

 	if (switch_core_session_dequeue_event(this->_session, &event, SWITCH_FALSE) == SWITCH_STATUS_SUCCESS) {
-		Handle<Object> Event;
+		Local<Object> Event;
 		FSEvent *evt;

 		if ((evt = new FSEvent(info))) {
@@ -1443,13 +1443,13 @@ JS_SESSION_FUNCTION_IMPL(GetEvent)
 JS_SESSION_FUNCTION_IMPL(SendEvent)
 {
 	HandleScope handle_scope(info.GetIsolate());
-	Handle<Object> Event;
+	Local<Object> Event;
 	FSEvent *eo;

 	METHOD_SANITY_CHECK();

 	if (info.Length() > 0 && info[0]->IsObject()) {
-		Handle<Object> jso = Handle<Object>::Cast(info[0]);
+		Local<Object> jso = Local<Object>::Cast(info[0]);

 		if (!jso.IsEmpty()) {
 			switch_event_t **evt;
@@ -1480,10 +1480,10 @@ JS_SESSION_FUNCTION_IMPL(Hangup)
 	if (switch_channel_up(channel)) {
 		if (info.Length() > 0) {
 			if (info[0]->IsInt32()) {
-				int32_t i = info[0]->Int32Value();
+				int32_t i = info[0]->Int32Value(js_current_context()).FromMaybe(0);
 				cause = (switch_call_cause_t)i;
 			} else {
-				String::Utf8Value str(info[0]);
+				JsUtf8Value str(info[0]);
 				const char *cause_name = js_safe_str(*str);
 				cause = switch_channel_str2cause(cause_name);
 			}
@@ -1512,14 +1512,14 @@ JS_SESSION_GET_PROPERTY_IMPL(GetProperty)
 		caller_profile = switch_channel_get_caller_profile(channel);
 	}

-	String::Utf8Value str(property);
+	JsUtf8Value str(property);
 	const char *prop = js_safe_str(*str);

 	if (!strcmp(prop, "cause")) {
 		if (channel) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_channel_cause2str(switch_channel_get_cause(channel))));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), switch_channel_cause2str(switch_channel_get_cause(channel))));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_channel_cause2str(this->_cause)));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), switch_channel_cause2str(this->_cause)));
 		}
 	} else if (!strcmp(prop, "causecode")) {
 		if (channel) {
@@ -1529,66 +1529,66 @@ JS_SESSION_GET_PROPERTY_IMPL(GetProperty)
 		}
 	} else if (!strcmp(prop, "name")) {
 		if (channel) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_channel_get_name(channel)));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), switch_channel_get_name(channel)));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 		}
 	} else if (!strcmp(prop, "uuid")) {
 		if (channel) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_channel_get_uuid(channel)));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), switch_channel_get_uuid(channel)));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 		}
 	} else if (!strcmp(prop, "state")) {
 		if (channel) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_channel_state_name(switch_channel_get_state(channel))));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), switch_channel_state_name(switch_channel_get_state(channel))));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 		}
 	} else if (!strcmp(prop, "dialplan")) {
 		if (caller_profile) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), caller_profile->dialplan));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), caller_profile->dialplan));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 		}
 	} else if (!strcmp(prop, "caller_id_name")) {
 		if (caller_profile) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), caller_profile->caller_id_name));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), caller_profile->caller_id_name));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 		}
 	} else if (!strcmp(prop, "caller_id_num") || !strcmp(prop, "caller_id_number")) {
 		if (caller_profile) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), caller_profile->caller_id_number));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), caller_profile->caller_id_number));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 		}
 	} else if (!strcmp(prop, "network_addr") || !strcasecmp(prop, "network_address")) {
 		if (caller_profile) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), caller_profile->network_addr));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), caller_profile->network_addr));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 		}
 	} else if (!strcmp(prop, "ani")) {
 		if (caller_profile) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), caller_profile->ani));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), caller_profile->ani));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 		}
 	} else if (!strcmp(prop, "aniii")) {
 		if (caller_profile) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), caller_profile->aniii));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), caller_profile->aniii));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 		}
 	} else if (!strcmp(prop, "destination")) {
 		if (caller_profile) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), caller_profile->destination_number));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), caller_profile->destination_number));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), ""));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), ""));
 		}
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Bad property"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Bad property"));
 	}
 }

@@ -1600,7 +1600,7 @@ void *FSSession::Construct(const v8::FunctionCallbackInfo<Value>& info)
 	switch_assert(session_obj);

 	if (info.Length() > 0) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *uuid = js_safe_str(*str);

 		if (!strchr(uuid, '/')) {
@@ -1610,7 +1610,7 @@ void *FSSession::Construct(const v8::FunctionCallbackInfo<Value>& info)
 			FSSession *old_obj = NULL;

 			if (info.Length() > 1 && info[1]->IsObject()) {
-				old_obj = JSBase::GetInstance<FSSession>(Handle<Object>::Cast(info[1]));
+				old_obj = JSBase::GetInstance<FSSession>(Local<Object>::Cast(info[1]));
 			}
 			if (switch_ivr_originate(old_obj ? old_obj->_session : NULL,
 									 &session_obj->_session, &session_obj->_cause, uuid, 60,
@@ -1619,7 +1619,7 @@ void *FSSession::Construct(const v8::FunctionCallbackInfo<Value>& info)
 			} else {
 				/* This will return the Session object, but with no C++ instance related to it */
 				/* After each call to [new Session("/chan/test")] you should check the property originateCause, which will hold a value if origination failed */
-				info.This()->Set(String::NewFromUtf8(info.GetIsolate(), "originateCause"), String::NewFromUtf8(info.GetIsolate(), switch_channel_cause2str(session_obj->_cause)));
+				js_obj_set(info.This(), js_new_string(info.GetIsolate(), "originateCause"), js_new_string(info.GetIsolate(), switch_channel_cause2str(session_obj->_cause)));
 				delete session_obj;
 				return NULL;
 			}
@@ -1637,8 +1637,8 @@ JS_SESSION_FUNCTION_IMPL(SetCallerdata)
 	if (info.Length() > 1) {
 		const char *var, *val;
 		char **toset = NULL;
-		String::Utf8Value str1(info[0]);
-		String::Utf8Value str2(info[1]);
+		JsUtf8Value str1(info[0]);
+		JsUtf8Value str2(info[1]);
 		var = js_safe_str(*str1);
 		val = js_safe_str(*str2);

@@ -1682,12 +1682,12 @@ JS_SESSION_FUNCTION_IMPL(Originate)
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "This method is deprecated, please use new Session(\"<dial string>\", a_leg) \n");

 	if (this->_session) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "cannot call this method on an initialized session"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "cannot call this method on an initialized session"));
 		return;
 	}

 	if (info.Length() > 1) {
-		Handle<Object> session_obj;
+		Local<Object> session_obj;
 		switch_core_session_t *session = NULL, *peer_session = NULL;
 		switch_caller_profile_t *caller_profile = NULL, *orig_caller_profile = NULL;
 		string dest;
@@ -1707,17 +1707,17 @@ JS_SESSION_FUNCTION_IMPL(Originate)
 		info.GetReturnValue().Set(false);

 		if (info[0]->IsObject()) {
-			session_obj = Handle<Object>::Cast(info[0]);
+			session_obj = Local<Object>::Cast(info[0]);
 			FSSession *old_obj = NULL;
 			if (!session_obj.IsEmpty() && (old_obj = JSBase::GetInstance<FSSession>(session_obj))) {

 				if (old_obj == this) {
-					info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Supplied a_leg session is the same as our session"));
+					info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Supplied a_leg session is the same as our session"));
 					return;
 				}

 				if (!old_obj->_session) {
-					info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Supplied a_leg session is not initilaized!"));
+					info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Supplied a_leg session is not initilaized!"));
 					return;
 				}

@@ -1751,7 +1751,7 @@ JS_SESSION_FUNCTION_IMPL(Originate)
 		if (!zstr(this->_username) && zstr(username))
 			username = this->_username;

-		String::Utf8Value str(info[1]);
+		JsUtf8Value str(info[1]);
 		dest = js_safe_str(*str);

 		if (!dest.c_str() || !strchr(dest.c_str(), '/')) {
@@ -1760,7 +1760,7 @@ JS_SESSION_FUNCTION_IMPL(Originate)
 		}

 		if (info.Length() > 2) {
-			String::Utf8Value strTmp(info[2]);
+			JsUtf8Value strTmp(info[2]);
 			tmp = *strTmp;
 			if (!zstr(tmp)) {
 				to = tmp;
@@ -1769,7 +1769,7 @@ JS_SESSION_FUNCTION_IMPL(Originate)

 		if (switch_core_new_memory_pool(&pool) != SWITCH_STATUS_SUCCESS) {
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "OH OH no pool\n");
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Could not create new pool"));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Could not create new pool"));
 			return;
 		}

@@ -1796,7 +1796,7 @@ JS_SESSION_FUNCTION_IMPL(Bridge)
 {
 	HandleScope handle_scope(info.GetIsolate());
 	FSSession *jss_b = NULL;
-	Handle<Object> obj_b;
+	Local<Object> obj_b;
 	void *bp = NULL;
 	switch_input_callback_function_t dtmf_func = NULL;
 	FSInputCallbackState cb_state;
@@ -1805,27 +1805,27 @@ JS_SESSION_FUNCTION_IMPL(Bridge)

 	if (info.Length() > 0) {
 		if (info[0]->IsObject()) {
-			obj_b = Handle<Object>::Cast(info[0]);
+			obj_b = Local<Object>::Cast(info[0]);

 			if (!(jss_b = JSBase::GetInstance<FSSession>(obj_b))) {
-				info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Cannot find session B"));
+				info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Cannot find session B"));
 				return;
 			}
 		}
 	}

 	if (!_session) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "session A is not ready!"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "session A is not ready!"));
 		return;
 	}

 	if (!(jss_b && jss_b->_session)) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "session B is not ready!"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "session B is not ready!"));
 		return;
 	}

 	if (info.Length() > 1) {
-		Handle<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[1]);
+		Local<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[1]);

 		if (!func.IsEmpty()) {
 			cb_state.function.Reset(info.GetIsolate(), func);
diff --git a/src/mod/languages/mod_v8/src/fssocket.cpp b/src/mod/languages/mod_v8/src/fssocket.cpp
index 40a2fa645f..98af766c0d 100644
--- a/src/mod/languages/mod_v8/src/fssocket.cpp
+++ b/src/mod/languages/mod_v8/src/fssocket.cpp
@@ -76,7 +76,7 @@ void *FSSocket::Construct(const v8::FunctionCallbackInfo<Value>& info)
 	if (ret != SWITCH_STATUS_SUCCESS) {
 		switch_core_destroy_memory_pool(&pool);
 		char *err = switch_mprintf("Failed to create socket, reason: %d", ret);
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), err));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), err));
 		free(err);
 		return NULL;
 	}
@@ -91,19 +91,19 @@ void *FSSocket::Construct(const v8::FunctionCallbackInfo<Value>& info)
 JS_SOCKET_FUNCTION_IMPL(Connect)
 {
 	if (info.Length() == 2) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *host = js_safe_str(*str);
 		int32_t port;
 		switch_sockaddr_t *addr;
 		switch_status_t ret;

-		port = info[1]->Int32Value();
+		port = info[1]->Int32Value(js_current_context()).FromMaybe(0);

 		/* Recreate socket if it has been closed */
 		if (!this->_socket) {
 			if ((ret = switch_socket_create(&this->_socket, AF_INET, SOCK_STREAM, SWITCH_PROTO_TCP, this->_pool)) != SWITCH_STATUS_SUCCESS) {
 				char *err = switch_mprintf("Failed to create socket, reason: %d", ret);
-				info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), err));
+				info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), err));
 				free(err);
 				return;
 			}
@@ -113,7 +113,7 @@ JS_SOCKET_FUNCTION_IMPL(Connect)

 		if (ret != SWITCH_STATUS_SUCCESS) {
 			char *err = switch_mprintf("switch_sockaddr_info_get failed: %d", ret);
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), err));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), err));
 			free(err);
 			return;
 		}
@@ -132,13 +132,13 @@ JS_SOCKET_FUNCTION_IMPL(Connect)
 JS_SOCKET_FUNCTION_IMPL(Send)
 {
 	if (!this->_socket) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Socket is not active"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Socket is not active"));
 		return;
 	}

 	if (info.Length() == 1) {
 		switch_status_t ret;
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		const char *buffer = js_safe_str(*str);
 		switch_size_t len = str.length(); // binary safe version of strlen()
 		ret = switch_socket_send(this->_socket, buffer, &len);
@@ -156,7 +156,7 @@ JS_SOCKET_FUNCTION_IMPL(Send)
 JS_SOCKET_FUNCTION_IMPL(ReadBytes)
 {
 	if (!this->_socket) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Socket is not active"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Socket is not active"));
 		return;
 	}

@@ -165,7 +165,7 @@ JS_SOCKET_FUNCTION_IMPL(ReadBytes)
 		switch_status_t ret;
 		switch_size_t len;

-		bytes_to_read = info[0]->Int32Value();
+		bytes_to_read = info[0]->Int32Value(js_current_context()).FromMaybe(0);
 		len = (switch_size_t) bytes_to_read;

 		if (this->_buffer_size < len) {
@@ -180,7 +180,7 @@ JS_SOCKET_FUNCTION_IMPL(ReadBytes)
 			return;
 		} else {
 			this->_read_buffer[len] = 0;
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(this->_read_buffer)));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(this->_read_buffer)));
 			return;
 		}
 	}
@@ -198,12 +198,12 @@ JS_SOCKET_FUNCTION_IMPL(Read)
 	char tempbuf[2];

 	if (!this->_socket) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Socket is not active"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Socket is not active"));
 		return;
 	}

 	if (info.Length() == 1) {
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		delimiter = js_safe_str(*str);
 	}

@@ -240,7 +240,7 @@ JS_SOCKET_FUNCTION_IMPL(Read)
 		info.GetReturnValue().Set(false);
 	} else {
 		this->_read_buffer[total_length] = 0;
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(this->_read_buffer)));
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(this->_read_buffer)));
 	}
 }

@@ -254,10 +254,10 @@ JS_SOCKET_FUNCTION_IMPL(Close)
 JS_SOCKET_GET_PROPERTY_IMPL(GetProperty)
 {
 	HandleScope handle_scope(info.GetIsolate());
-	String::Utf8Value str(property);
+	JsUtf8Value str(property);

 	if (!this->_socket) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Socket is not active"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Socket is not active"));
 		return;
 	}

@@ -268,9 +268,9 @@ JS_SOCKET_GET_PROPERTY_IMPL(GetProperty)
 		switch_socket_addr_get(&sa, SWITCH_TRUE, this->_socket);

 		if (sa && switch_get_addr(tmp, sizeof(tmp), sa) && !zstr(tmp)) {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), tmp));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), tmp));
 		} else {
-			info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), "unknown"));
+			info.GetReturnValue().Set(js_new_string(info.GetIsolate(), "unknown"));
 		}
 	} else if (!strcmp(js_safe_str(*str), "port")) {
 		switch_sockaddr_t *sa = NULL;
@@ -289,18 +289,18 @@ JS_SOCKET_GET_PROPERTY_IMPL(GetProperty)

 		info.GetReturnValue().Set(Int32::New(info.GetIsolate(), (int32_t)timeout));
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Bad property"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Bad property"));
 	}
 }

 JS_SOCKET_SET_PROPERTY_IMPL(SetPropertyTimeOut)
 {
 	if (!this->_socket) {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Socket is not active"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Socket is not active"));
 		return;
 	}

-	switch_socket_timeout_set(this->_socket, value->Int32Value());
+	switch_socket_timeout_set(this->_socket, value->Int32Value(js_current_context()).FromMaybe(0));
 }

 static const js_function_t socket_methods[] = {
diff --git a/src/mod/languages/mod_v8/src/fsteletone.cpp b/src/mod/languages/mod_v8/src/fsteletone.cpp
index aad8dc4bd8..121acec4bd 100644
--- a/src/mod/languages/mod_v8/src/fsteletone.cpp
+++ b/src/mod/languages/mod_v8/src/fsteletone.cpp
@@ -103,24 +103,24 @@ void *FSTeleTone::Construct(const v8::FunctionCallbackInfo<Value>& info)
 	memset(&read_impl, 0, sizeof(read_impl));

 	if (info.Length() > 0 && info[0]->IsObject()) {
-		Handle<Object> session_obj(Handle<Object>::Cast(info[0]));
+		Local<Object> session_obj(Local<Object>::Cast(info[0]));

 		if (!session_obj.IsEmpty()) {
 			if (!(jss = JSBase::GetInstance<FSSession>(session_obj)) || !jss->GetSession()) {
-				info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Cannot Find Session [1]"));
+				info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Cannot Find Session [1]"));
 				return NULL;
 			}
 		} else {
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Cannot Find Session [2]"));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Cannot Find Session [2]"));
 			return NULL;
 		}
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Missing Session Arg"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Missing Session Arg"));
 		return NULL;
 	}

 	if (info.Length() > 1) {
-		String::Utf8Value str(info[1]);
+		JsUtf8Value str(info[1]);
 		timer_name = js_safe_str(*str);
 	}

@@ -128,7 +128,7 @@ void *FSTeleTone::Construct(const v8::FunctionCallbackInfo<Value>& info)

 	if (!(tto = new FSTeleTone(info))) {
 		switch_core_destroy_memory_pool(&pool);
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Memory Error"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Memory Error"));
 		return NULL;
 	}

@@ -145,7 +145,7 @@ void *FSTeleTone::Construct(const v8::FunctionCallbackInfo<Value>& info)
 	} else {
 		switch_core_destroy_memory_pool(&pool);
 		delete tto;
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Raw codec activation failed"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Raw codec activation failed"));
 		return NULL;
 	}

@@ -174,7 +174,7 @@ JS_TELETONE_FUNCTION_IMPL(AddTone)
 		int x;
 		int nmax = info.Length();
 		const char *map_str;
-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		map_str = js_safe_str(*str);

 		if ( TELETONE_MAX_TONES < nmax ) {
@@ -182,7 +182,7 @@ JS_TELETONE_FUNCTION_IMPL(AddTone)
 		}

 		for (x = 1; x < nmax; x++) {
-			String::Utf8Value fval(info[x]);
+			JsUtf8Value fval(info[x]);
 			if (*fval) {
 				_ts.TONES[(int) *map_str].freqs[x - 1] = strtod(*fval, NULL);
 			}
@@ -190,7 +190,7 @@ JS_TELETONE_FUNCTION_IMPL(AddTone)
 		return;
 	}

-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 }

 JS_TELETONE_FUNCTION_IMPL(OnDTMF)
@@ -203,7 +203,7 @@ JS_TELETONE_FUNCTION_IMPL(OnDTMF)
 	info.GetReturnValue().Set(false);

 	if (info.Length() > 0) {
-		Handle<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[0]);
+		Local<Function> func = JSBase::GetFunctionFromArg(info.GetIsolate(), info[0]);

 		if (!func.IsEmpty()) {
 			_function.Reset(info.GetIsolate(), func);
@@ -229,8 +229,8 @@ JS_TELETONE_FUNCTION_IMPL(Generate)
 		switch_channel_t *channel;

 		if (info.Length() > 1) {
-			if (!info[1]->IsInt32() || !(loops = info[1]->Int32Value())) {
-				info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Cannot get second argument (should be int)"));
+			if (!info[1]->IsInt32() || !(loops = info[1]->Int32Value(js_current_context()).FromMaybe(0))) {
+				info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Cannot get second argument (should be int)"));
 				return;
 			}
 			loops--;
@@ -243,7 +243,7 @@ JS_TELETONE_FUNCTION_IMPL(Generate)
 		_ts.debug = 1;
 		_ts.debug_stream = switch_core_get_console();

-		String::Utf8Value str(info[0]);
+		JsUtf8Value str(info[0]);
 		script = js_safe_str(*str);
 		teletone_run(&_ts, script);

@@ -270,19 +270,19 @@ JS_TELETONE_FUNCTION_IMPL(Generate)
 				if (switch_channel_has_dtmf(channel)) {
 					HandleScope hs(info.GetIsolate());
 					uint32_t aargc = 0;
-					Handle<Value> aargv[4];
+					Local<Value> aargv[4];

 					switch_channel_dequeue_dtmf_string(channel, dtmf, sizeof(dtmf));
-					aargv[aargc++] = String::NewFromUtf8(info.GetIsolate(), dtmf);
+					aargv[aargc++] = js_new_string(info.GetIsolate(), dtmf);

 					if (!_arg.IsEmpty()) {
 						aargv[aargc++] = Local<Value>::New(info.GetIsolate(), _arg);
 					}

-					Handle<Function> func = Local<Function>::New(info.GetIsolate(), _function);
-					Handle<Value> res = func->Call(info.GetIsolate()->GetCurrentContext()->Global(), aargc, aargv);
+					Local<Function> func = Local<Function>::New(info.GetIsolate(), _function);
+					Local<Value> res = js_call(func, info.GetIsolate()->GetCurrentContext()->Global(), aargc, aargv);

-					String::Utf8Value tmp(res);
+					JsUtf8Value tmp(res);
 					ret = js_safe_str(*tmp);

 					if (strcmp(ret, "true") && strcmp(ret, "undefined")) {
@@ -324,12 +324,12 @@ JS_TELETONE_FUNCTION_IMPL(Generate)
 		return;
 	}

-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 }

 JS_TELETONE_GET_PROPERTY_IMPL(GetNameProperty)
 {
-	info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), "TeleTone"));
+	info.GetReturnValue().Set(js_new_string(info.GetIsolate(), "TeleTone"));
 }

 static const js_function_t teletone_methods[] = {
diff --git a/src/mod/languages/mod_v8/src/fsxml.cpp b/src/mod/languages/mod_v8/src/fsxml.cpp
index 1e4fd36057..93de0547da 100644
--- a/src/mod/languages/mod_v8/src/fsxml.cpp
+++ b/src/mod/languages/mod_v8/src/fsxml.cpp
@@ -90,7 +90,7 @@ void FSXML::InitRootObject()

 void *FSXML::Construct(const v8::FunctionCallbackInfo<Value>& info)
 {
-	String::Utf8Value data(info[0]);
+	JsUtf8Value data(info[0]);
 	switch_xml_t xml;

 	if (*data && (xml = switch_xml_parse_str_dynamic(*data, SWITCH_TRUE))) {
@@ -100,7 +100,7 @@ void *FSXML::Construct(const v8::FunctionCallbackInfo<Value>& info)
 		return obj;
 	}

-	info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Bad arguments!"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Bad arguments!"));
 	return NULL;
 	/*
 	var xml = new XML(XML_FS_CONF, fs_config_name_string);
@@ -109,7 +109,7 @@ void *FSXML::Construct(const v8::FunctionCallbackInfo<Value>& info)
 	*/
 }

-Handle<Value> FSXML::GetJSObjFromXMLObj(const switch_xml_t xml, const v8::FunctionCallbackInfo<Value>& info)
+Local<Value> FSXML::GetJSObjFromXMLObj(const switch_xml_t xml, const v8::FunctionCallbackInfo<Value>& info)
 {
 	FSXML *newObj, *rootObj = NULL;

@@ -121,7 +121,7 @@ Handle<Value> FSXML::GetJSObjFromXMLObj(const switch_xml_t xml, const v8::Functi

 	if (!rootObj) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find XML root node\n");
-		return Handle<Value>();
+		return Local<Value>();
 	}

 	/* Try to find an existing object in the hash */
@@ -146,7 +146,7 @@ Handle<Value> FSXML::GetJSObjFromXMLObj(const switch_xml_t xml, const v8::Functi
 	}

 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to create new object - memory error?\n");
-	return Handle<Value>();
+	return Local<Value>();
 }

 void FSXML::StoreObjectInHash(switch_xml_t xml, FSXML *obj)
@@ -218,17 +218,17 @@ void FSXML::DestroyHash()
 JS_XML_FUNCTION_IMPL(GetChild)
 {
 	if (info.Length() > 0) {
-		String::Utf8Value name(info[0]);
+		JsUtf8Value name(info[0]);
 		string attr_name, attr_value;
 		switch_xml_t xml = NULL;

 		/* Check if attribute name/value was provided as well */
 		if (info.Length() > 1) {
-			String::Utf8Value str(info[1]);
+			JsUtf8Value str(info[1]);
 			attr_name = js_safe_str(*str);

 			if (info.Length() > 2) {
-				String::Utf8Value str2(info[2]);
+				JsUtf8Value str2(info[2]);
 				attr_value = js_safe_str(*str2);
 			}
 		}
@@ -242,10 +242,10 @@ JS_XML_FUNCTION_IMPL(GetChild)

 		/* Return the JS object */
 		if (xml) {
-			Handle<Value> jsObj = GetJSObjFromXMLObj(xml, info);
+			Local<Value> jsObj = GetJSObjFromXMLObj(xml, info);

 			if (jsObj.IsEmpty()) {
-				info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Failed!"));
+				info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Failed!"));
 			} else {
 				info.GetReturnValue().Set(jsObj);
 			}
@@ -253,19 +253,19 @@ JS_XML_FUNCTION_IMPL(GetChild)
 			info.GetReturnValue().Set(Null(info.GetIsolate()));
 		}
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 	}
 }

 JS_XML_FUNCTION_IMPL(AddChild)
 {
 	if (info.Length() > 0) {
-		String::Utf8Value name(info[0]);
+		JsUtf8Value name(info[0]);
 		switch_xml_t xml;
 		int offset = 0;

 		if (info.Length() > 1) {
-			offset = info[1]->Int32Value();
+			offset = info[1]->Int32Value(js_current_context()).FromMaybe(0);
 		}

 		/* Add new child */
@@ -273,18 +273,18 @@ JS_XML_FUNCTION_IMPL(AddChild)

 		/* Return the JS object */
 		if (xml) {
-			Handle<Value> jsObj = GetJSObjFromXMLObj(xml, info);
+			Local<Value> jsObj = GetJSObjFromXMLObj(xml, info);

 			if (jsObj.IsEmpty()) {
-				info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Failed!"));
+				info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Failed!"));
 			} else {
 				info.GetReturnValue().Set(jsObj);
 			}
 		} else {
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "XML error"));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "XML error"));
 		}
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 	}
 }

@@ -297,10 +297,10 @@ JS_XML_FUNCTION_IMPL(Next)

 	/* Return the JS object */
 	if (xml) {
-		Handle<Value> jsObj = GetJSObjFromXMLObj(xml, info);
+		Local<Value> jsObj = GetJSObjFromXMLObj(xml, info);

 		if (jsObj.IsEmpty()) {
-			info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Failed!"));
+			info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Failed!"));
 		} else {
 			info.GetReturnValue().Set(jsObj);
 		}
@@ -312,21 +312,21 @@ JS_XML_FUNCTION_IMPL(Next)
 JS_XML_FUNCTION_IMPL(GetAttribute)
 {
 	if (info.Length() > 0) {
-		String::Utf8Value name(info[0]);
-		info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_xml_attr_soft(_xml, js_safe_str(*name))));
+		JsUtf8Value name(info[0]);
+		info.GetReturnValue().Set(js_new_string(info.GetIsolate(), switch_xml_attr_soft(_xml, js_safe_str(*name))));
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 	}
 }

 JS_XML_FUNCTION_IMPL(SetAttribute)
 {
 	if (info.Length() > 0) {
-		String::Utf8Value name(info[0]);
+		JsUtf8Value name(info[0]);
 		string val;

 		if (info.Length() > 1) {
-			String::Utf8Value str(info[1]);
+			JsUtf8Value str(info[1]);
 			val = js_safe_str(*str);
 		}

@@ -336,7 +336,7 @@ JS_XML_FUNCTION_IMPL(SetAttribute)
 			info.GetReturnValue().Set(false);
 		}
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid arguments"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "Invalid arguments"));
 	}
 }

@@ -354,7 +354,7 @@ JS_XML_IMPL_STATIC(Remove)
 		}
 		delete obj;
 	} else {
-		String::Utf8Value str(info.Holder());
+		JsUtf8Value str(info.Holder());
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "No valid internal data available for %s when calling FSXML::Remove()\n", *str ? *str : "[unknown]");
 	}
 }
@@ -373,39 +373,39 @@ JS_XML_FUNCTION_IMPL(Copy)
 		obj->RegisterInstance(info.GetIsolate(), "", true);
 		info.GetReturnValue().Set(obj->GetJavaScriptObject());
 	} else {
-		info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "XML error"));
+		info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "XML error"));
 	}
 }

 JS_XML_FUNCTION_IMPL(Serialize)
 {
 	char *data = switch_xml_toxml(_xml, SWITCH_FALSE);
-	info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(data)));
+	info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(data)));
 	switch_safe_free(data);
 }

 JS_XML_GET_PROPERTY_IMPL(GetNameProperty)
 {
 	const char *data = switch_xml_name(_xml);
-	info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(data)));
+	info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(data)));
 }

 JS_XML_GET_PROPERTY_IMPL(GetDataProperty)
 {
 	const char *data = switch_xml_txt(_xml);
-	info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(data)));
+	info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(data)));
 }

 JS_XML_SET_PROPERTY_IMPL(SetDataProperty)
 {
-	String::Utf8Value str(value);
+	JsUtf8Value str(value);
 	switch_xml_set_txt_d(_xml, js_safe_str(*str));
 }

 JS_XML_GET_PROPERTY_IMPL(GetErrorProperty)
 {
 	const char *data = switch_xml_error(_xml);
-	info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), js_safe_str(data)));
+	info.GetReturnValue().Set(js_new_string(info.GetIsolate(), js_safe_str(data)));
 }

 static const js_function_t xml_methods[] = {
diff --git a/src/mod/languages/mod_v8/src/jsbase.cpp b/src/mod/languages/mod_v8/src/jsbase.cpp
index f3cf8fd57a..85df1715b7 100644
--- a/src/mod/languages/mod_v8/src/jsbase.cpp
+++ b/src/mod/languages/mod_v8/src/jsbase.cpp
@@ -69,8 +69,14 @@ JSBase::~JSBase(void)
 	}

 	/* If the object is still alive inside V8, set the internal field to NULL. But only if we're actually inside a JS context */
-	if (!persistentHandle->IsNearDeath() && !GetIsolate()->GetCurrentContext().IsEmpty() && (!js || !js->GetForcedTermination())) {
-		Handle<Object> jsObj = GetJavaScriptObject();
+	if (
+#if !V8FS_NEW_API
+		/* IsNearDeath() was removed from V8; on the new API the weak callback
+		 * already guarantees we are not racing the collector here. */
+		!persistentHandle->IsNearDeath() &&
+#endif
+		!GetIsolate()->GetCurrentContext().IsEmpty() && (!js || !js->GetForcedTermination())) {
+		Local<Object> jsObj = GetJavaScriptObject();
 		jsObj->SetInternalField(0, Null(GetIsolate()));
 	}

@@ -80,13 +86,13 @@ JSBase::~JSBase(void)
 	delete persistentHandle;
 }

-Handle<Object> JSBase::GetJavaScriptObject()
+Local<Object> JSBase::GetJavaScriptObject()
 {
 	/* Returns the javascript object related to this C++ instance */
 	return Local<Object>::New(GetIsolate(), *persistentHandle);
 }

-void JSBase::AddInstance(Isolate *isolate, const Handle<Object>& handle, const Handle<External>& object, bool autoDestroy)
+void JSBase::AddInstance(Isolate *isolate, const Local<Object>& handle, const Local<External>& object, bool autoDestroy)
 {
 	// Get the actual C++ class pointer
     JSBase *obj = static_cast<JSBase*>(object->Value());
@@ -107,7 +113,11 @@ void JSBase::AddInstance(Isolate *isolate, const Handle<Object>& handle, const H
 #else
 	obj->persistentHandle->SetWeak<JSBase>(obj, WeakCallback);
 #endif
+#if !V8FS_NEW_API
+	/* MarkIndependent() was removed from V8; independence is now the default
+	 * for weak handles, so this call is no longer needed on the new API. */
 	obj->persistentHandle->MarkIndependent();
+#endif
 }

 #if defined(V8_MAJOR_VERSION) && V8_MAJOR_VERSION >=5
@@ -138,25 +148,25 @@ void JSBase::WeakCallback(const WeakCallbackData<Object, JSBase>& data)

 void JSBase::CreateInstance(const v8::FunctionCallbackInfo<Value>& args)
 {
-	Handle<External> external;
+	Local<External> external;
 	bool autoDestroy = true;
 	bool constructorFailed = false;

 	if (!args.IsConstructCall()) {
-		args.GetIsolate()->ThrowException(String::NewFromUtf8(args.GetIsolate(), "Seems you forgot the 'new' operator."));
+		args.GetIsolate()->ThrowException(js_new_string(args.GetIsolate(), "Seems you forgot the 'new' operator."));
 		return;
 	}

 	if (args[0]->IsExternal()) {
 		// The argument is an existing object, just use that.
-		external = Handle<External>::Cast(args[0]);
-		autoDestroy = args[1]->BooleanValue();
+		external = Local<External>::Cast(args[0]);
+		autoDestroy = js_to_bool(args[1]);
 	} else {
 		// Create a new C++ instance
 #if defined(V8_MAJOR_VERSION) && V8_MAJOR_VERSION >=5
-		Handle<External> ex = Handle<External>::Cast(args.Data());
+		Local<External> ex = Local<External>::Cast(args.Data());
 #else
-		Handle<External> ex = Handle<External>::Cast(args.Callee()->GetHiddenValue(String::NewFromUtf8(args.GetIsolate(), "constructor_method")));
+		Local<External> ex = Local<External>::Cast(args.Callee()->GetHiddenValue(js_new_string(args.GetIsolate(), "constructor_method")));
 #endif

 		if (ex->Value()) {
@@ -178,7 +188,7 @@ void JSBase::CreateInstance(const v8::FunctionCallbackInfo<Value>& args)
 		// Return the newly created object
 		args.GetReturnValue().Set(args.This());
 	} else if (!constructorFailed) {
-		args.GetIsolate()->ThrowException(String::NewFromUtf8(args.GetIsolate(), "This class cannot be created from javascript."));
+		args.GetIsolate()->ThrowException(js_new_string(args.GetIsolate(), "This class cannot be created from javascript."));
 	} else {
 		/* Use whatever was set from the constructor */
 	}
@@ -187,13 +197,13 @@ void JSBase::CreateInstance(const v8::FunctionCallbackInfo<Value>& args)
 void JSBase::Register(Isolate *isolate, const js_class_definition_t *desc)
 {
 	// Get the context's global scope (that's where we'll put the constructor)
-	Handle<Object> global = isolate->GetCurrentContext()->Global();
+	Local<Object> global = isolate->GetCurrentContext()->Global();

 	Local<External> data = External::New(isolate, (void *)desc->constructor);

 	// Create function template for our constructor it will call the JSBase::createInstance method
-	Handle<FunctionTemplate> function = FunctionTemplate::New(isolate, JSBase::CreateInstance, data);
-	function->SetClassName(String::NewFromUtf8(isolate, desc->name));
+	Local<FunctionTemplate> function = FunctionTemplate::New(isolate, JSBase::CreateInstance, data);
+	function->SetClassName(js_new_string(isolate, desc->name));

 	// Make room for saving the C++ object reference somewhere
 	function->InstanceTemplate()->SetInternalFieldCount(1);
@@ -201,39 +211,39 @@ void JSBase::Register(Isolate *isolate, const js_class_definition_t *desc)
 	// Add methods to the object
 	for (int i = 0;; i++) {
 		if (!desc->functions[i].func) break;
-		function->InstanceTemplate()->Set(String::NewFromUtf8(isolate, desc->functions[i].name), FunctionTemplate::New(isolate, desc->functions[i].func));
+		function->InstanceTemplate()->Set(js_new_string(isolate, desc->functions[i].name), FunctionTemplate::New(isolate, desc->functions[i].func));
 	}

 	// Add properties to the object
 	for (int i = 0;; i++) {
 		if (!desc->properties[i].get) break;
-		function->InstanceTemplate()->SetAccessor(String::NewFromUtf8(isolate, desc->properties[i].name), desc->properties[i].get, desc->properties[i].set);
+		function->InstanceTemplate()->SetAccessor(js_new_string(isolate, desc->properties[i].name), desc->properties[i].get, desc->properties[i].set);
 	}

 #if defined(V8_MAJOR_VERSION) && V8_MAJOR_VERSION >=5
 #else
-	function->GetFunction()->SetHiddenValue(String::NewFromUtf8(isolate, "constructor_method"), External::New(isolate, (void *)desc->constructor));
+	function->GetFunction(js_current_context()).ToLocalChecked()->SetHiddenValue(js_new_string(isolate, "constructor_method"), External::New(isolate, (void *)desc->constructor));
 #endif

 	// Set the function in the global scope, to make it available
-	global->Set(v8::String::NewFromUtf8(isolate, desc->name), function->GetFunction());
+	js_obj_set(global, js_new_string(isolate, desc->name), function->GetFunction(js_current_context()).ToLocalChecked());
 }

 void JSBase::RegisterInstance(Isolate *isolate, string name, bool autoDestroy)
 {
 	// Get the context's global scope (that's where we'll put the constructor)
 	Local<Context> context = isolate->GetCurrentContext();
-	Handle<Object> global = context->Global();
+	Local<Object> global = context->Global();

-	Local<Function> func = Local<Function>::Cast(global->Get(v8::String::NewFromUtf8(isolate, this->GetJSClassName().c_str())));
+	Local<Function> func = Local<Function>::Cast(js_obj_get(global, js_new_string(isolate, this->GetJSClassName().c_str())));

 	// Add the C++ instance as an argument, so it won't try to create another one.
-	Handle<Value> args[] = { External::New(isolate, this), Boolean::New(isolate, autoDestroy) };
-	Handle<Object> newObj = func->NewInstance(context, 2, args).ToLocalChecked();
+	Local<Value> args[] = { External::New(isolate, this), Boolean::New(isolate, autoDestroy) };
+	Local<Object> newObj = func->NewInstance(context, 2, args).ToLocalChecked();

 	// Add the instance to JavaScript.
 	if (name.size() > 0) {
-		global->Set(String::NewFromUtf8(isolate, name.c_str()), newObj);
+		js_obj_set(global, js_new_string(isolate, name.c_str()), newObj);
 	}
 }

@@ -252,20 +262,20 @@ bool JSBase::GetAutoDestroy()
 	return autoDestroy;
 }

-Handle<Function> JSBase::GetFunctionFromArg(Isolate *isolate, const Local<Value>& arg)
+Local<Function> JSBase::GetFunctionFromArg(Isolate *isolate, const Local<Value>& arg)
 {
-	Handle<Function> func;
+	Local<Function> func;

 	if (!arg.IsEmpty() && arg->IsFunction()) {
 		// Cast the argument directly to a function
-		func = Handle<Function>::Cast(arg);
+		func = Local<Function>::Cast(arg);
 	} else if (!arg.IsEmpty() && arg->IsString()) {
-		Handle<String> tmp = Handle<String>::Cast(arg);
+		Local<String> tmp = Local<String>::Cast(arg);
 		if (!tmp.IsEmpty() && *tmp) {
 			// Fetch the actual function pointer from the global context (by function name)
-			Handle<Value> val = isolate->GetCurrentContext()->Global()->Get(tmp);
+			Local<Value> val = js_obj_get(isolate->GetCurrentContext()->Global(), tmp);
 			if (!val.IsEmpty() && val->IsFunction()) {
-				func = Handle<Function>::Cast(val);
+				func = Local<Function>::Cast(val);
 			}
 		}
 	}
@@ -273,13 +283,13 @@ Handle<Function> JSBase::GetFunctionFromArg(Isolate *isolate, const Local<Value>
 	if (!func.IsEmpty() && func->IsFunction()) {
 		return func;
 	} else {
-		return Handle<Function>();
+		return Local<Function>();
 	}
 }

 void JSBase::DefaultSetProperty(v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<void>& info)
 {
-	info.GetIsolate()->ThrowException(v8::String::NewFromUtf8(info.GetIsolate(), "this property cannot be changed!"));
+	info.GetIsolate()->ThrowException(js_new_string(info.GetIsolate(), "this property cannot be changed!"));
 }

 /* For Emacs:
diff --git a/src/mod/languages/mod_v8/src/jsmain.cpp b/src/mod/languages/mod_v8/src/jsmain.cpp
index 2a02c8737e..93662f68eb 100644
--- a/src/mod/languages/mod_v8/src/jsmain.cpp
+++ b/src/mod/languages/mod_v8/src/jsmain.cpp
@@ -179,25 +179,25 @@ JSMain::~JSMain(void)
 const string JSMain::GetExceptionInfo(Isolate* isolate, TryCatch* try_catch)
 {
 	HandleScope handle_scope(isolate);
-	String::Utf8Value exception(try_catch->Exception());
+	JsUtf8Value exception(try_catch->Exception());
 	const char *exception_string = js_safe_str(*exception);
-	Handle<Message> message = try_catch->Message();
+	Local<Message> message = try_catch->Message();
 	string res;

 	if (message.IsEmpty()) {
 		// V8 didn't provide any extra information about this error; just return the exception.
 		res = exception_string;
 	} else {
-		String::Utf8Value filename(message->GetScriptResourceName());
+		JsUtf8Value filename(message->GetScriptResourceName());
 		const char *filename_string = js_safe_str(*filename);
-		int linenum = message->GetLineNumber();
+		int linenum = message->GetLineNumber(js_current_context()).FromMaybe(0);

 		ostringstream ss;

 		ss << filename_string << ":" << linenum << ": " << exception_string << "\r\n";

 		// Print line of source code.
-		String::Utf8Value sourceline(message->GetSourceLine());
+		JsUtf8Value sourceline(message->GetSourceLine(js_current_context()).ToLocalChecked());
 		const char *sourceline_string = js_safe_str(*sourceline);

 		ss << sourceline_string << "\r\n";
@@ -225,7 +225,7 @@ void JSMain::Include(const v8::FunctionCallbackInfo<Value>& args)
 {
 	for (int i = 0; i < args.Length(); i++) {
 		HandleScope handle_scope(args.GetIsolate());
-		String::Utf8Value str(args[i]);
+		JsUtf8Value str(args[i]);

 		// load_file loads the file with this name into a string
 		string js_file = LoadFileToString(js_safe_str(*str));
@@ -239,12 +239,12 @@ void JSMain::Include(const v8::FunctionCallbackInfo<Value>& args)
 				args.GetReturnValue().Set(false);
 			}
 			else {
-				args.GetReturnValue().Set(script.ToLocalChecked()->Run());
+				args.GetReturnValue().Set(js_run_script(script.ToLocalChecked()));
 			}
 #else
-			Handle<String> source = String::NewFromUtf8(args.GetIsolate(), js_file.c_str());
-			Handle<Script> script = Script::Compile(source, args[i]);
-			args.GetReturnValue().Set(script->Run());
+			Local<String> source = js_new_string(args.GetIsolate(), js_file.c_str());
+			Local<Script> script = Script::Compile(source, args[i]);
+			args.GetReturnValue().Set(js_run_script(script));
 #endif

 			return;
@@ -257,7 +257,7 @@ void JSMain::Include(const v8::FunctionCallbackInfo<Value>& args)
 void JSMain::Log(const v8::FunctionCallbackInfo<Value>& args)
 {
 	HandleScope handle_scope(args.GetIsolate());
-	String::Utf8Value str(args[0]);
+	JsUtf8Value str(args[0]);

 	printf("%s\r\n", js_safe_str(*str));

@@ -287,14 +287,14 @@ const string JSMain::ExecuteString(const string& scriptData, const string& fileN

 			isolate->SetData(0, this);

-			Handle<ObjectTemplate> global = ObjectTemplate::New(isolate);
-			global->Set(String::NewFromUtf8(isolate, "include"), FunctionTemplate::New(isolate, Include));
-			global->Set(String::NewFromUtf8(isolate, "require"), FunctionTemplate::New(isolate, Include));
-			global->Set(String::NewFromUtf8(isolate, "log"), FunctionTemplate::New(isolate, Log));
+			Local<ObjectTemplate> global = ObjectTemplate::New(isolate);
+			global->Set(js_new_string(isolate, "include"), FunctionTemplate::New(isolate, Include));
+			global->Set(js_new_string(isolate, "require"), FunctionTemplate::New(isolate, Include));
+			global->Set(js_new_string(isolate, "log"), FunctionTemplate::New(isolate, Log));

 			for (size_t i = 0; i < extenderFunctions->size(); i++) {
 				js_function_t *proc = (*extenderFunctions)[i];
-				global->Set(String::NewFromUtf8(isolate, proc->name), FunctionTemplate::New(isolate, proc->func));
+				global->Set(js_new_string(isolate, proc->name), FunctionTemplate::New(isolate, proc->func));
 			}

 			// Create a new context.
@@ -327,8 +327,8 @@ const string JSMain::ExecuteString(const string& scriptData, const string& fileN
 			LoadScript(&script, isolate, scriptData.c_str(), fileName.c_str());
 #else
 			// Create a string containing the JavaScript source code.
-			Handle<String> source = String::NewFromUtf8(isolate, scriptData.c_str());
-			Handle<Script> script = Script::Compile(source, Local<Value>::New(isolate, String::NewFromUtf8(isolate, fileName.c_str())));
+			Local<String> source = js_new_string(isolate, scriptData.c_str());
+			Local<Script> script = Script::Compile(source, Local<Value>::New(isolate, js_new_string(isolate, fileName.c_str())));
 #endif

 			if (try_catch.HasCaught()) {
@@ -337,14 +337,14 @@ const string JSMain::ExecuteString(const string& scriptData, const string& fileN
 			} else {
 #if defined(V8_MAJOR_VERSION) && V8_MAJOR_VERSION >=5
 				// Run the script
-				Handle<Value> result;
+				Local<Value> result;

 				if (!script.IsEmpty()) {
-				    result = script.ToLocalChecked()->Run();
+				    result = js_run_script(script.ToLocalChecked());
 				}
 #else
 				// Run the script
-				Handle<Value> result = script->Run();
+				Local<Value> result = js_run_script(script);
 #endif
 				if (try_catch.HasCaught()) {
 					res = JSMain::GetExceptionInfo(isolate, &try_catch);
@@ -356,7 +356,7 @@ const string JSMain::ExecuteString(const string& scriptData, const string& fileN
 					}

 					// return result as string.
-					String::Utf8Value ascii(result);
+					JsUtf8Value ascii(result);
 					if (*ascii) {
 						res = *ascii;
 					}
@@ -444,9 +444,18 @@ Isolate *JSMain::GetIsolate()
 void JSMain::Initialize(v8::Platform **platform)
 {
 	V8::InitializeICUDefaultLocation(SWITCH_GLOBAL_dirs.mod_dir);
+#if !V8FS_NEW_API
+	/* External V8 startup data was removed; modern V8 embeds the snapshot. */
 	V8::InitializeExternalStartupData(SWITCH_GLOBAL_dirs.mod_dir);
+#endif

+#if V8FS_NEW_API
+	/* CreateDefaultPlatform() was replaced by NewDefaultPlatform(), which
+	 * returns an owning unique_ptr; release it into our raw pointer. */
+	*platform = v8::platform::NewDefaultPlatform().release();
+#else
 	*platform = v8::platform::CreateDefaultPlatform();
+#endif
 	V8::InitializePlatform(*platform);
 	V8::Initialize();
 }
@@ -464,7 +473,14 @@ void JSMain::Dispose()
 	v8::Isolate::GetCurrent()->LowMemoryNotification();
 	while (!v8::Isolate::GetCurrent()->IdleNotificationDeadline(0.500)) {}
 	V8::Dispose();
+#if V8_MAJOR_VERSION >= 10
+  /* ShutdownPlatform() became a deprecated alias for DisposePlatform() in
+   * V8 10 and was removed in later releases (e.g. the V8 shipped by Debian
+   * trixie's libnode). DisposePlatform() exists from V8 10 onwards. */
+  V8::DisposePlatform();
+#else
 	V8::ShutdownPlatform();
+#endif
 #else
 	V8::LowMemoryNotification();
 	while (!V8::IdleNotification()) {}
@@ -595,13 +611,13 @@ char *JSMain::GetStackInfo(Isolate *isolate, int *lineNumber)
 	Local<StackTrace> stFile = StackTrace::CurrentStackTrace(isolate, 1, StackTrace::kScriptName);

 	if (!stFile.IsEmpty()) {
-		Local<StackFrame> sf = stFile->GetFrame(0);
+		Local<StackFrame> sf = js_stack_frame(stFile, isolate, 0);

 		if (!sf.IsEmpty()) {
 			Local<String> fn = sf->GetScriptName();

 			if (!fn.IsEmpty()) {
-				String::Utf8Value str(fn);
+				JsUtf8Value str(fn);

 				if (*str) {
 					js_strdup(ret, *str); // We must dup here
@@ -622,7 +638,7 @@ char *JSMain::GetStackInfo(Isolate *isolate, int *lineNumber)
 		Local<StackTrace> stLine = StackTrace::CurrentStackTrace(isolate, 1, StackTrace::kLineNumber);

 		if (!stLine.IsEmpty()) {
-			Local<StackFrame> sf = stLine->GetFrame(0);
+			Local<StackFrame> sf = js_stack_frame(stLine, isolate, 0);

 			if (!sf.IsEmpty()) {
 				*lineNumber = sf->GetLineNumber();