diff --git a/BUILD.gn b/BUILD.gn
index 7e40859..2771377 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -889,18 +889,19 @@
 
   static_library("xfa") {
     sources = [
-      "fxjse/class.cpp",
-      "fxjse/context.cpp",
-      "fxjse/context.h",
-      "fxjse/dynprop.cpp",
-      "fxjse/include/cfxjse_arguments.h",
-      "fxjse/include/cfxjse_class.h",
-      "fxjse/include/cfxjse_value.h",
-      "fxjse/include/fxjse.h",
-      "fxjse/runtime.cpp",
-      "fxjse/runtime.h",
-      "fxjse/scope_inline.h",
-      "fxjse/value.cpp",
+      "fxjs/cfxjse_arguments.cpp",
+      "fxjs/cfxjse_class.cpp",
+      "fxjs/cfxjse_context.cpp",
+      "fxjs/cfxjse_isolatetracker.cpp",
+      "fxjs/cfxjse_isolatetracker.h",
+      "fxjs/cfxjse_runtimedata.cpp",
+      "fxjs/cfxjse_runtimedata.h",
+      "fxjs/cfxjse_value.cpp",
+      "fxjs/include/cfxjse_arguments.h",
+      "fxjs/include/cfxjse_class.h",
+      "fxjs/include/cfxjse_context.h",
+      "fxjs/include/cfxjse_value.h",
+      "fxjs/include/fxjse.h",
       "xfa/fde/cfde_path.cpp",
       "xfa/fde/cfde_path.h",
       "xfa/fde/cfde_txtedtbuf.cpp",
diff --git a/fpdfsdk/javascript/DEPS b/fpdfsdk/javascript/DEPS
index 3adc40c..5fb5728 100644
--- a/fpdfsdk/javascript/DEPS
+++ b/fpdfsdk/javascript/DEPS
@@ -1,5 +1,5 @@
 include_rules = [
   '+core/fdrm/crypto/include',
   '+core/fpdfapi/fpdf_font/include',
-  '+fxjse/include'
+  '+fxjs/include'
 ]
diff --git a/fpdfsdk/javascript/cjs_runtime.cpp b/fpdfsdk/javascript/cjs_runtime.cpp
index 88530f7..7eaf145 100644
--- a/fpdfsdk/javascript/cjs_runtime.cpp
+++ b/fpdfsdk/javascript/cjs_runtime.cpp
@@ -31,7 +31,7 @@
 
 #ifdef PDF_ENABLE_XFA
 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_app.h"
-#include "fxjse/include/cfxjse_value.h"
+#include "fxjs/include/cfxjse_value.h"
 #endif  // PDF_ENABLE_XFA
 
 // static
diff --git a/fpdfsdk/javascript/ijs_runtime.h b/fpdfsdk/javascript/ijs_runtime.h
index b24a2dd..cae465a 100644
--- a/fpdfsdk/javascript/ijs_runtime.h
+++ b/fpdfsdk/javascript/ijs_runtime.h
@@ -11,7 +11,7 @@
 #include "core/fxcrt/include/fx_system.h"
 
 #ifdef PDF_ENABLE_XFA
-#include "fxjse/include/fxjse.h"
+#include "fxjs/include/fxjse.h"
 #endif  // PDF_ENABLE_XFA
 
 class CPDFDoc_Environment;
diff --git a/fxjse/DEPS b/fxjs/DEPS
similarity index 100%
rename from fxjse/DEPS
rename to fxjs/DEPS
diff --git a/fxjs/cfxjse_arguments.cpp b/fxjs/cfxjse_arguments.cpp
new file mode 100644
index 0000000..1ff425d
--- /dev/null
+++ b/fxjs/cfxjse_arguments.cpp
@@ -0,0 +1,56 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fxjs/include/cfxjse_arguments.h"
+
+#include "fxjs/include/cfxjse_context.h"
+#include "fxjs/include/cfxjse_value.h"
+
+v8::Isolate* CFXJSE_Arguments::GetRuntime() const {
+  return m_pRetValue->GetIsolate();
+}
+
+int32_t CFXJSE_Arguments::GetLength() const {
+  return m_pInfo->Length();
+}
+
+std::unique_ptr<CFXJSE_Value> CFXJSE_Arguments::GetValue(int32_t index) const {
+  std::unique_ptr<CFXJSE_Value> lpArgValue(
+      new CFXJSE_Value(v8::Isolate::GetCurrent()));
+  lpArgValue->ForceSetValue((*m_pInfo)[index]);
+  return lpArgValue;
+}
+
+FX_BOOL CFXJSE_Arguments::GetBoolean(int32_t index) const {
+  return (*m_pInfo)[index]->BooleanValue();
+}
+
+int32_t CFXJSE_Arguments::GetInt32(int32_t index) const {
+  return static_cast<int32_t>((*m_pInfo)[index]->NumberValue());
+}
+
+FX_FLOAT CFXJSE_Arguments::GetFloat(int32_t index) const {
+  return static_cast<FX_FLOAT>((*m_pInfo)[index]->NumberValue());
+}
+
+CFX_ByteString CFXJSE_Arguments::GetUTF8String(int32_t index) const {
+  v8::Local<v8::String> hString = (*m_pInfo)[index]->ToString();
+  v8::String::Utf8Value szStringVal(hString);
+  return CFX_ByteString(*szStringVal);
+}
+
+CFXJSE_HostObject* CFXJSE_Arguments::GetObject(int32_t index,
+                                               CFXJSE_Class* pClass) const {
+  v8::Local<v8::Value> hValue = (*m_pInfo)[index];
+  ASSERT(!hValue.IsEmpty());
+  if (!hValue->IsObject())
+    return nullptr;
+  return FXJSE_RetrieveObjectBinding(hValue.As<v8::Object>(), pClass);
+}
+
+CFXJSE_Value* CFXJSE_Arguments::GetReturnValue() {
+  return m_pRetValue;
+}
diff --git a/fxjs/cfxjse_class.cpp b/fxjs/cfxjse_class.cpp
new file mode 100644
index 0000000..de22af7
--- /dev/null
+++ b/fxjs/cfxjse_class.cpp
@@ -0,0 +1,433 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fxjs/include/cfxjse_class.h"
+
+#include "fxjs/include/cfxjse_context.h"
+#include "fxjs/include/cfxjse_value.h"
+
+namespace {
+
+void V8FunctionCallback_Wrapper(
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  const FXJSE_FUNCTION_DESCRIPTOR* lpFunctionInfo =
+      static_cast<FXJSE_FUNCTION_DESCRIPTOR*>(
+          info.Data().As<v8::External>()->Value());
+  if (!lpFunctionInfo)
+    return;
+
+  CFX_ByteStringC szFunctionName(lpFunctionInfo->name);
+  std::unique_ptr<CFXJSE_Value> lpThisValue(
+      new CFXJSE_Value(info.GetIsolate()));
+  lpThisValue->ForceSetValue(info.This());
+  std::unique_ptr<CFXJSE_Value> lpRetValue(new CFXJSE_Value(info.GetIsolate()));
+  CFXJSE_Arguments impl(&info, lpRetValue.get());
+  lpFunctionInfo->callbackProc(lpThisValue.get(), szFunctionName, impl);
+  if (!lpRetValue->DirectGetValue().IsEmpty())
+    info.GetReturnValue().Set(lpRetValue->DirectGetValue());
+}
+
+void V8ClassGlobalConstructorCallback_Wrapper(
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition =
+      static_cast<FXJSE_CLASS_DESCRIPTOR*>(
+          info.Data().As<v8::External>()->Value());
+  if (!lpClassDefinition)
+    return;
+
+  CFX_ByteStringC szFunctionName(lpClassDefinition->name);
+  std::unique_ptr<CFXJSE_Value> lpThisValue(
+      new CFXJSE_Value(info.GetIsolate()));
+  lpThisValue->ForceSetValue(info.This());
+  std::unique_ptr<CFXJSE_Value> lpRetValue(new CFXJSE_Value(info.GetIsolate()));
+  CFXJSE_Arguments impl(&info, lpRetValue.get());
+  lpClassDefinition->constructor(lpThisValue.get(), szFunctionName, impl);
+  if (!lpRetValue->DirectGetValue().IsEmpty())
+    info.GetReturnValue().Set(lpRetValue->DirectGetValue());
+}
+
+void V8GetterCallback_Wrapper(v8::Local<v8::String> property,
+                              const v8::PropertyCallbackInfo<v8::Value>& info) {
+  const FXJSE_PROPERTY_DESCRIPTOR* lpPropertyInfo =
+      static_cast<FXJSE_PROPERTY_DESCRIPTOR*>(
+          info.Data().As<v8::External>()->Value());
+  if (!lpPropertyInfo)
+    return;
+
+  CFX_ByteStringC szPropertyName(lpPropertyInfo->name);
+  std::unique_ptr<CFXJSE_Value> lpThisValue(
+      new CFXJSE_Value(info.GetIsolate()));
+  std::unique_ptr<CFXJSE_Value> lpPropValue(
+      new CFXJSE_Value(info.GetIsolate()));
+  lpThisValue->ForceSetValue(info.This());
+  lpPropertyInfo->getProc(lpThisValue.get(), szPropertyName, lpPropValue.get());
+  info.GetReturnValue().Set(lpPropValue->DirectGetValue());
+}
+
+void V8SetterCallback_Wrapper(v8::Local<v8::String> property,
+                              v8::Local<v8::Value> value,
+                              const v8::PropertyCallbackInfo<void>& info) {
+  const FXJSE_PROPERTY_DESCRIPTOR* lpPropertyInfo =
+      static_cast<FXJSE_PROPERTY_DESCRIPTOR*>(
+          info.Data().As<v8::External>()->Value());
+  if (!lpPropertyInfo)
+    return;
+
+  CFX_ByteStringC szPropertyName(lpPropertyInfo->name);
+  std::unique_ptr<CFXJSE_Value> lpThisValue(
+      new CFXJSE_Value(info.GetIsolate()));
+  std::unique_ptr<CFXJSE_Value> lpPropValue(
+      new CFXJSE_Value(info.GetIsolate()));
+  lpThisValue->ForceSetValue(info.This());
+  lpPropValue->ForceSetValue(value);
+  lpPropertyInfo->setProc(lpThisValue.get(), szPropertyName, lpPropValue.get());
+}
+
+void V8ConstructorCallback_Wrapper(
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  if (!info.IsConstructCall())
+    return;
+
+  const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition =
+      static_cast<FXJSE_CLASS_DESCRIPTOR*>(
+          info.Data().As<v8::External>()->Value());
+  if (!lpClassDefinition)
+    return;
+
+  ASSERT(info.This()->InternalFieldCount());
+  info.This()->SetAlignedPointerInInternalField(0, nullptr);
+}
+
+void Context_GlobalObjToString(
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
+      info.Data().As<v8::External>()->Value());
+  if (!lpClass)
+    return;
+
+  if (info.This() == info.Holder() && lpClass->name) {
+    CFX_ByteString szStringVal;
+    szStringVal.Format("[object %s]", lpClass->name);
+    info.GetReturnValue().Set(v8::String::NewFromUtf8(
+        info.GetIsolate(), szStringVal.c_str(), v8::String::kNormalString,
+        szStringVal.GetLength()));
+    return;
+  }
+  v8::Local<v8::String> local_str =
+      info.This()
+          ->ObjectProtoToString(info.GetIsolate()->GetCurrentContext())
+          .FromMaybe(v8::Local<v8::String>());
+  info.GetReturnValue().Set(local_str);
+}
+
+void DynPropGetterAdapter_MethodCallback(
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  v8::Local<v8::Object> hCallBackInfo = info.Data().As<v8::Object>();
+  FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
+      hCallBackInfo->GetAlignedPointerFromInternalField(0));
+  v8::Local<v8::String> hPropName =
+      hCallBackInfo->GetInternalField(1).As<v8::String>();
+  ASSERT(lpClass && !hPropName.IsEmpty());
+  v8::String::Utf8Value szPropName(hPropName);
+  CFX_ByteStringC szFxPropName = *szPropName;
+  std::unique_ptr<CFXJSE_Value> lpThisValue(
+      new CFXJSE_Value(info.GetIsolate()));
+  lpThisValue->ForceSetValue(info.This());
+  std::unique_ptr<CFXJSE_Value> lpRetValue(new CFXJSE_Value(info.GetIsolate()));
+  CFXJSE_Arguments impl(&info, lpRetValue.get());
+  lpClass->dynMethodCall(lpThisValue.get(), szFxPropName, impl);
+  if (!lpRetValue->DirectGetValue().IsEmpty())
+    info.GetReturnValue().Set(lpRetValue->DirectGetValue());
+}
+
+void DynPropGetterAdapter(const FXJSE_CLASS_DESCRIPTOR* lpClass,
+                          CFXJSE_Value* pObject,
+                          const CFX_ByteStringC& szPropName,
+                          CFXJSE_Value* pValue) {
+  ASSERT(lpClass);
+  int32_t nPropType =
+      lpClass->dynPropTypeGetter == nullptr
+          ? FXJSE_ClassPropType_Property
+          : lpClass->dynPropTypeGetter(pObject, szPropName, FALSE);
+  if (nPropType == FXJSE_ClassPropType_Property) {
+    if (lpClass->dynPropGetter)
+      lpClass->dynPropGetter(pObject, szPropName, pValue);
+  } else if (nPropType == FXJSE_ClassPropType_Method) {
+    if (lpClass->dynMethodCall && pValue) {
+      v8::Isolate* pIsolate = pValue->GetIsolate();
+      v8::HandleScope hscope(pIsolate);
+      v8::Local<v8::ObjectTemplate> hCallBackInfoTemplate =
+          v8::ObjectTemplate::New(pIsolate);
+      hCallBackInfoTemplate->SetInternalFieldCount(2);
+      v8::Local<v8::Object> hCallBackInfo =
+          hCallBackInfoTemplate->NewInstance();
+      hCallBackInfo->SetAlignedPointerInInternalField(
+          0, const_cast<FXJSE_CLASS_DESCRIPTOR*>(lpClass));
+      hCallBackInfo->SetInternalField(
+          1, v8::String::NewFromUtf8(
+                 pIsolate, reinterpret_cast<const char*>(szPropName.raw_str()),
+                 v8::String::kNormalString, szPropName.GetLength()));
+      pValue->ForceSetValue(
+          v8::Function::New(pValue->GetIsolate()->GetCurrentContext(),
+                            DynPropGetterAdapter_MethodCallback, hCallBackInfo,
+                            0, v8::ConstructorBehavior::kThrow)
+              .ToLocalChecked());
+    }
+  }
+}
+
+void DynPropSetterAdapter(const FXJSE_CLASS_DESCRIPTOR* lpClass,
+                          CFXJSE_Value* pObject,
+                          const CFX_ByteStringC& szPropName,
+                          CFXJSE_Value* pValue) {
+  ASSERT(lpClass);
+  int32_t nPropType =
+      lpClass->dynPropTypeGetter == nullptr
+          ? FXJSE_ClassPropType_Property
+          : lpClass->dynPropTypeGetter(pObject, szPropName, FALSE);
+  if (nPropType != FXJSE_ClassPropType_Method) {
+    if (lpClass->dynPropSetter)
+      lpClass->dynPropSetter(pObject, szPropName, pValue);
+  }
+}
+
+FX_BOOL DynPropQueryAdapter(const FXJSE_CLASS_DESCRIPTOR* lpClass,
+                            CFXJSE_Value* pObject,
+                            const CFX_ByteStringC& szPropName) {
+  ASSERT(lpClass);
+  int32_t nPropType =
+      lpClass->dynPropTypeGetter == nullptr
+          ? FXJSE_ClassPropType_Property
+          : lpClass->dynPropTypeGetter(pObject, szPropName, TRUE);
+  return nPropType != FXJSE_ClassPropType_None;
+}
+
+FX_BOOL DynPropDeleterAdapter(const FXJSE_CLASS_DESCRIPTOR* lpClass,
+                              CFXJSE_Value* pObject,
+                              const CFX_ByteStringC& szPropName) {
+  ASSERT(lpClass);
+  int32_t nPropType =
+      lpClass->dynPropTypeGetter == nullptr
+          ? FXJSE_ClassPropType_Property
+          : lpClass->dynPropTypeGetter(pObject, szPropName, FALSE);
+  if (nPropType != FXJSE_ClassPropType_Method) {
+    if (lpClass->dynPropDeleter)
+      return lpClass->dynPropDeleter(pObject, szPropName);
+    return nPropType == FXJSE_ClassPropType_Property ? FALSE : TRUE;
+  }
+  return FALSE;
+}
+
+void NamedPropertyQueryCallback(
+    v8::Local<v8::Name> property,
+    const v8::PropertyCallbackInfo<v8::Integer>& info) {
+  v8::Local<v8::Object> thisObject = info.This();
+  const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
+      info.Data().As<v8::External>()->Value());
+  v8::Isolate* pIsolate = info.GetIsolate();
+  v8::HandleScope scope(pIsolate);
+  v8::String::Utf8Value szPropName(property);
+  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
+  std::unique_ptr<CFXJSE_Value> lpThisValue(
+      new CFXJSE_Value(info.GetIsolate()));
+  lpThisValue->ForceSetValue(thisObject);
+  if (DynPropQueryAdapter(lpClass, lpThisValue.get(), szFxPropName)) {
+    info.GetReturnValue().Set(v8::DontDelete);
+    return;
+  }
+  const int32_t iV8Absent = 64;
+  info.GetReturnValue().Set(iV8Absent);
+}
+
+void NamedPropertyDeleterCallback(
+    v8::Local<v8::Name> property,
+    const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+  v8::Local<v8::Object> thisObject = info.This();
+  const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
+      info.Data().As<v8::External>()->Value());
+  v8::Isolate* pIsolate = info.GetIsolate();
+  v8::HandleScope scope(pIsolate);
+  v8::String::Utf8Value szPropName(property);
+  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
+  std::unique_ptr<CFXJSE_Value> lpThisValue(
+      new CFXJSE_Value(info.GetIsolate()));
+  lpThisValue->ForceSetValue(thisObject);
+  info.GetReturnValue().Set(
+      !!DynPropDeleterAdapter(lpClass, lpThisValue.get(), szFxPropName));
+}
+
+void NamedPropertyGetterCallback(
+    v8::Local<v8::Name> property,
+    const v8::PropertyCallbackInfo<v8::Value>& info) {
+  v8::Local<v8::Object> thisObject = info.This();
+  const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
+      info.Data().As<v8::External>()->Value());
+  v8::String::Utf8Value szPropName(property);
+  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
+  std::unique_ptr<CFXJSE_Value> lpThisValue(
+      new CFXJSE_Value(info.GetIsolate()));
+  lpThisValue->ForceSetValue(thisObject);
+  std::unique_ptr<CFXJSE_Value> lpNewValue(new CFXJSE_Value(info.GetIsolate()));
+  DynPropGetterAdapter(lpClass, lpThisValue.get(), szFxPropName,
+                       lpNewValue.get());
+  info.GetReturnValue().Set(lpNewValue->DirectGetValue());
+}
+
+void NamedPropertySetterCallback(
+    v8::Local<v8::Name> property,
+    v8::Local<v8::Value> value,
+    const v8::PropertyCallbackInfo<v8::Value>& info) {
+  v8::Local<v8::Object> thisObject = info.This();
+  const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
+      info.Data().As<v8::External>()->Value());
+  v8::String::Utf8Value szPropName(property);
+  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
+  std::unique_ptr<CFXJSE_Value> lpThisValue(
+      new CFXJSE_Value(info.GetIsolate()));
+  lpThisValue->ForceSetValue(thisObject);
+
+  CFXJSE_Value* lpNewValue = new CFXJSE_Value(info.GetIsolate());
+  lpNewValue->ForceSetValue(value);
+  DynPropSetterAdapter(lpClass, lpThisValue.get(), szFxPropName, lpNewValue);
+  info.GetReturnValue().Set(value);
+}
+
+void NamedPropertyEnumeratorCallback(
+    const v8::PropertyCallbackInfo<v8::Array>& info) {
+  const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
+      info.Data().As<v8::External>()->Value());
+  v8::Isolate* pIsolate = info.GetIsolate();
+  v8::Local<v8::Array> newArray = v8::Array::New(pIsolate, lpClass->propNum);
+  for (int i = 0; i < lpClass->propNum; i++) {
+    newArray->Set(
+        i, v8::String::NewFromUtf8(pIsolate, lpClass->properties[i].name));
+  }
+  info.GetReturnValue().Set(newArray);
+}
+
+}  // namespace
+
+// static
+CFXJSE_Class* CFXJSE_Class::Create(
+    CFXJSE_Context* lpContext,
+    const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition,
+    FX_BOOL bIsJSGlobal) {
+  if (!lpContext || !lpClassDefinition)
+    return nullptr;
+
+  CFXJSE_Class* pClass =
+      GetClassFromContext(lpContext, lpClassDefinition->name);
+  if (pClass)
+    return pClass;
+
+  v8::Isolate* pIsolate = lpContext->m_pIsolate;
+  pClass = new CFXJSE_Class(lpContext);
+  pClass->m_szClassName = lpClassDefinition->name;
+  pClass->m_lpClassDefinition = lpClassDefinition;
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate);
+  v8::Local<v8::FunctionTemplate> hFunctionTemplate = v8::FunctionTemplate::New(
+      pIsolate, bIsJSGlobal ? 0 : V8ConstructorCallback_Wrapper,
+      v8::External::New(
+          pIsolate, const_cast<FXJSE_CLASS_DESCRIPTOR*>(lpClassDefinition)));
+  hFunctionTemplate->SetClassName(
+      v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name));
+  hFunctionTemplate->InstanceTemplate()->SetInternalFieldCount(1);
+  v8::Local<v8::ObjectTemplate> hObjectTemplate =
+      hFunctionTemplate->InstanceTemplate();
+  SetUpNamedPropHandler(pIsolate, hObjectTemplate, lpClassDefinition);
+
+  if (lpClassDefinition->propNum) {
+    for (int32_t i = 0; i < lpClassDefinition->propNum; i++) {
+      hObjectTemplate->SetNativeDataProperty(
+          v8::String::NewFromUtf8(pIsolate,
+                                  lpClassDefinition->properties[i].name),
+          lpClassDefinition->properties[i].getProc ? V8GetterCallback_Wrapper
+                                                   : nullptr,
+          lpClassDefinition->properties[i].setProc ? V8SetterCallback_Wrapper
+                                                   : nullptr,
+          v8::External::New(pIsolate, const_cast<FXJSE_PROPERTY_DESCRIPTOR*>(
+                                          lpClassDefinition->properties + i)),
+          static_cast<v8::PropertyAttribute>(v8::DontDelete));
+    }
+  }
+  if (lpClassDefinition->methNum) {
+    for (int32_t i = 0; i < lpClassDefinition->methNum; i++) {
+      v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(
+          pIsolate, V8FunctionCallback_Wrapper,
+          v8::External::New(pIsolate, const_cast<FXJSE_FUNCTION_DESCRIPTOR*>(
+                                          lpClassDefinition->methods + i)));
+      fun->RemovePrototype();
+      hObjectTemplate->Set(
+          v8::String::NewFromUtf8(pIsolate, lpClassDefinition->methods[i].name),
+          fun,
+          static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete));
+    }
+  }
+  if (lpClassDefinition->constructor) {
+    if (bIsJSGlobal) {
+      hObjectTemplate->Set(
+          v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name),
+          v8::FunctionTemplate::New(
+              pIsolate, V8ClassGlobalConstructorCallback_Wrapper,
+              v8::External::New(pIsolate, const_cast<FXJSE_CLASS_DESCRIPTOR*>(
+                                              lpClassDefinition))),
+          static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete));
+    } else {
+      v8::Local<v8::Context> hLocalContext =
+          v8::Local<v8::Context>::New(pIsolate, lpContext->m_hContext);
+      FXJSE_GetGlobalObjectFromContext(hLocalContext)
+          ->Set(v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name),
+                v8::Function::New(
+                    pIsolate, V8ClassGlobalConstructorCallback_Wrapper,
+                    v8::External::New(pIsolate,
+                                      const_cast<FXJSE_CLASS_DESCRIPTOR*>(
+                                          lpClassDefinition))));
+    }
+  }
+  if (bIsJSGlobal) {
+    v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(
+        pIsolate, Context_GlobalObjToString,
+        v8::External::New(
+            pIsolate, const_cast<FXJSE_CLASS_DESCRIPTOR*>(lpClassDefinition)));
+    fun->RemovePrototype();
+    hObjectTemplate->Set(v8::String::NewFromUtf8(pIsolate, "toString"), fun);
+  }
+  pClass->m_hTemplate.Reset(lpContext->m_pIsolate, hFunctionTemplate);
+  lpContext->m_rgClasses.push_back(std::unique_ptr<CFXJSE_Class>(pClass));
+  return pClass;
+}
+
+// static
+CFXJSE_Class* CFXJSE_Class::GetClassFromContext(CFXJSE_Context* pContext,
+                                                const CFX_ByteStringC& szName) {
+  for (const auto& pClass : pContext->m_rgClasses) {
+    if (pClass->m_szClassName == szName)
+      return pClass.get();
+  }
+  return nullptr;
+}
+
+// static
+void CFXJSE_Class::SetUpNamedPropHandler(
+    v8::Isolate* pIsolate,
+    v8::Local<v8::ObjectTemplate>& hObjectTemplate,
+    const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition) {
+  v8::NamedPropertyHandlerConfiguration configuration(
+      lpClassDefinition->dynPropGetter ? NamedPropertyGetterCallback : 0,
+      lpClassDefinition->dynPropSetter ? NamedPropertySetterCallback : 0,
+      lpClassDefinition->dynPropTypeGetter ? NamedPropertyQueryCallback : 0,
+      lpClassDefinition->dynPropDeleter ? NamedPropertyDeleterCallback : 0,
+      NamedPropertyEnumeratorCallback,
+      v8::External::New(pIsolate,
+                        const_cast<FXJSE_CLASS_DESCRIPTOR*>(lpClassDefinition)),
+      v8::PropertyHandlerFlags::kNonMasking);
+  hObjectTemplate->SetHandler(configuration);
+}
+
+CFXJSE_Class::CFXJSE_Class(CFXJSE_Context* lpContext)
+    : m_lpClassDefinition(nullptr), m_pContext(lpContext) {}
+
+CFXJSE_Class::~CFXJSE_Class() {}
diff --git a/fxjse/context.cpp b/fxjs/cfxjse_context.cpp
similarity index 81%
rename from fxjse/context.cpp
rename to fxjs/cfxjse_context.cpp
index 9c43830..4b0d0f6 100644
--- a/fxjse/context.cpp
+++ b/fxjs/cfxjse_context.cpp
@@ -1,14 +1,13 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// Copyright 2016 PDFium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "fxjse/context.h"
+#include "fxjs/include/cfxjse_context.h"
 
-#include "fxjse/include/cfxjse_class.h"
-#include "fxjse/include/cfxjse_value.h"
-#include "fxjse/scope_inline.h"
+#include "fxjs/include/cfxjse_class.h"
+#include "fxjs/include/cfxjse_value.h"
 
 namespace {
 
@@ -41,6 +40,34 @@
 
 }  // namespace
 
+// Note, not in the anonymous namespace due to the friend call
+// in cfxjse_context.h
+// TODO(dsinclair): Remove the friending, use public methods.
+class CFXJSE_ScopeUtil_IsolateHandleContext {
+ public:
+  explicit CFXJSE_ScopeUtil_IsolateHandleContext(CFXJSE_Context* pContext)
+      : m_context(pContext),
+        m_parent(pContext->m_pIsolate),
+        m_cscope(v8::Local<v8::Context>::New(pContext->m_pIsolate,
+                                             pContext->m_hContext)) {}
+  v8::Isolate* GetIsolate() { return m_context->m_pIsolate; }
+  v8::Local<v8::Context> GetLocalContext() {
+    return v8::Local<v8::Context>::New(m_context->m_pIsolate,
+                                       m_context->m_hContext);
+  }
+
+ private:
+  CFXJSE_ScopeUtil_IsolateHandleContext(
+      const CFXJSE_ScopeUtil_IsolateHandleContext&) = delete;
+  void operator=(const CFXJSE_ScopeUtil_IsolateHandleContext&) = delete;
+  void* operator new(size_t size) = delete;
+  void operator delete(void*, size_t) = delete;
+
+  CFXJSE_Context* m_context;
+  CFXJSE_ScopeUtil_IsolateHandle m_parent;
+  v8::Context::Scope m_cscope;
+};
+
 v8::Local<v8::Object> FXJSE_GetGlobalObjectFromContext(
     const v8::Local<v8::Context>& hContext) {
   return hContext->Global()->GetPrototype().As<v8::Object>();
@@ -58,27 +85,25 @@
     const v8::Local<v8::Object>& hJSObject,
     CFXJSE_Class* lpClass) {
   ASSERT(!hJSObject.IsEmpty());
-  if (!hJSObject->IsObject()) {
+  if (!hJSObject->IsObject())
     return nullptr;
-  }
+
   v8::Local<v8::Object> hObject = hJSObject;
   if (hObject->InternalFieldCount() == 0) {
     v8::Local<v8::Value> hProtoObject = hObject->GetPrototype();
-    if (hProtoObject.IsEmpty() || !hProtoObject->IsObject()) {
+    if (hProtoObject.IsEmpty() || !hProtoObject->IsObject())
       return nullptr;
-    }
+
     hObject = hProtoObject.As<v8::Object>();
-    if (hObject->InternalFieldCount() == 0) {
+    if (hObject->InternalFieldCount() == 0)
       return nullptr;
-    }
   }
   if (lpClass) {
     v8::Local<v8::FunctionTemplate> hClass =
         v8::Local<v8::FunctionTemplate>::New(
             lpClass->GetContext()->GetRuntime(), lpClass->GetTemplate());
-    if (!hClass->HasInstance(hObject)) {
+    if (!hClass->HasInstance(hObject))
       return nullptr;
-    }
   }
   return static_cast<CFXJSE_HostObject*>(
       hObject->GetAlignedPointerFromInternalField(0));
@@ -94,18 +119,17 @@
       v8::Local<v8::Value> hValue;
       hValue = hException.As<v8::Object>()->Get(
           v8::String::NewFromUtf8(pIsolate, "name"));
-      if (hValue->IsString() || hValue->IsStringObject()) {
+      if (hValue->IsString() || hValue->IsStringObject())
         hReturnValue->Set(0, hValue);
-      } else {
+      else
         hReturnValue->Set(0, v8::String::NewFromUtf8(pIsolate, "Error"));
-      }
+
       hValue = hException.As<v8::Object>()->Get(
           v8::String::NewFromUtf8(pIsolate, "message"));
-      if (hValue->IsString() || hValue->IsStringObject()) {
+      if (hValue->IsString() || hValue->IsStringObject())
         hReturnValue->Set(1, hValue);
-      } else {
+      else
         hReturnValue->Set(1, hMessage->Get());
-      }
     } else {
       hReturnValue->Set(0, v8::String::NewFromUtf8(pIsolate, "Error"));
       hReturnValue->Set(1, hMessage->Get());
@@ -122,13 +146,14 @@
   return hReturnValue;
 }
 
+// static
 CFXJSE_Context* CFXJSE_Context::Create(
     v8::Isolate* pIsolate,
     const FXJSE_CLASS_DESCRIPTOR* lpGlobalClass,
     CFXJSE_HostObject* lpGlobalObject) {
   CFXJSE_ScopeUtil_IsolateHandle scope(pIsolate);
   CFXJSE_Context* pContext = new CFXJSE_Context(pIsolate);
-  CFXJSE_Class* lpGlobalClassObj = NULL;
+  CFXJSE_Class* lpGlobalClassObj = nullptr;
   v8::Local<v8::ObjectTemplate> hObjectTemplate;
   if (lpGlobalClass) {
     lpGlobalClassObj = CFXJSE_Class::Create(pContext, lpGlobalClass, TRUE);
@@ -146,7 +171,7 @@
       v8::String::NewFromUtf8(pIsolate, "global", v8::NewStringType::kNormal)
           .ToLocalChecked());
   v8::Local<v8::Context> hNewContext =
-      v8::Context::New(pIsolate, NULL, hObjectTemplate);
+      v8::Context::New(pIsolate, nullptr, hObjectTemplate);
   v8::Local<v8::Context> hRootContext = v8::Local<v8::Context>::New(
       pIsolate, CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext);
   hNewContext->SetSecurityToken(hRootContext->GetSecurityToken());
@@ -184,7 +209,7 @@
   v8::TryCatch trycatch(m_pIsolate);
   v8::Local<v8::String> hScriptString =
       v8::String::NewFromUtf8(m_pIsolate, szScript);
-  if (lpNewThisObject == NULL) {
+  if (!lpNewThisObject) {
     v8::Local<v8::Script> hScript = v8::Script::Compile(hScriptString);
     if (!trycatch.HasCaught()) {
       v8::Local<v8::Value> hValue = hScript->Run();
diff --git a/fxjs/cfxjse_isolatetracker.cpp b/fxjs/cfxjse_isolatetracker.cpp
new file mode 100644
index 0000000..9594df3
--- /dev/null
+++ b/fxjs/cfxjse_isolatetracker.cpp
@@ -0,0 +1,35 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fxjs/cfxjse_isolatetracker.h"
+
+#include <algorithm>
+
+CFXJSE_IsolateTracker::CFXJSE_IsolateTracker() {}
+
+CFXJSE_IsolateTracker::~CFXJSE_IsolateTracker() {}
+
+void CFXJSE_IsolateTracker::Append(v8::Isolate* pIsolate) {
+  m_OwnedIsolates.push_back(pIsolate);
+}
+
+void CFXJSE_IsolateTracker::Remove(
+    v8::Isolate* pIsolate,
+    CFXJSE_IsolateTracker::DisposeCallback lpfnDisposeCallback) {
+  auto it = std::find(m_OwnedIsolates.begin(), m_OwnedIsolates.end(), pIsolate);
+  bool bFound = it != m_OwnedIsolates.end();
+  if (bFound)
+    m_OwnedIsolates.erase(it);
+  lpfnDisposeCallback(pIsolate, bFound);
+}
+
+void CFXJSE_IsolateTracker::RemoveAll(
+    CFXJSE_IsolateTracker::DisposeCallback lpfnDisposeCallback) {
+  for (v8::Isolate* pIsolate : m_OwnedIsolates)
+    lpfnDisposeCallback(pIsolate, true);
+
+  m_OwnedIsolates.clear();
+}
diff --git a/fxjs/cfxjse_isolatetracker.h b/fxjs/cfxjse_isolatetracker.h
new file mode 100644
index 0000000..7558416
--- /dev/null
+++ b/fxjs/cfxjse_isolatetracker.h
@@ -0,0 +1,70 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef FXJS_CFXJSE_ISOLATETRACKER_H_
+#define FXJS_CFXJSE_ISOLATETRACKER_H_
+
+#include <vector>
+
+#include "v8/include/v8.h"
+
+#include "fxjs/cfxjse_runtimedata.h"
+
+class CFXJSE_ScopeUtil_IsolateHandle {
+ public:
+  explicit CFXJSE_ScopeUtil_IsolateHandle(v8::Isolate* pIsolate)
+      : m_isolate(pIsolate), m_iscope(pIsolate), m_hscope(pIsolate) {}
+  v8::Isolate* GetIsolate() { return m_isolate; }
+
+ private:
+  CFXJSE_ScopeUtil_IsolateHandle(const CFXJSE_ScopeUtil_IsolateHandle&) =
+      delete;
+  void operator=(const CFXJSE_ScopeUtil_IsolateHandle&) = delete;
+  void* operator new(size_t size) = delete;
+  void operator delete(void*, size_t) = delete;
+
+  v8::Isolate* m_isolate;
+  v8::Isolate::Scope m_iscope;
+  v8::HandleScope m_hscope;
+};
+
+class CFXJSE_ScopeUtil_IsolateHandleRootContext {
+ public:
+  explicit CFXJSE_ScopeUtil_IsolateHandleRootContext(v8::Isolate* pIsolate)
+      : m_parent(pIsolate),
+        m_cscope(v8::Local<v8::Context>::New(
+            pIsolate,
+            CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext)) {}
+
+ private:
+  CFXJSE_ScopeUtil_IsolateHandleRootContext(
+      const CFXJSE_ScopeUtil_IsolateHandleRootContext&) = delete;
+  void operator=(const CFXJSE_ScopeUtil_IsolateHandleRootContext&) = delete;
+  void* operator new(size_t size) = delete;
+  void operator delete(void*, size_t) = delete;
+
+  CFXJSE_ScopeUtil_IsolateHandle m_parent;
+  v8::Context::Scope m_cscope;
+};
+
+class CFXJSE_IsolateTracker {
+ public:
+  typedef void (*DisposeCallback)(v8::Isolate*, bool bOwnedIsolate);
+
+  CFXJSE_IsolateTracker();
+  ~CFXJSE_IsolateTracker();
+
+  void Append(v8::Isolate* pIsolate);
+  void Remove(v8::Isolate* pIsolate, DisposeCallback lpfnDisposeCallback);
+  void RemoveAll(DisposeCallback lpfnDisposeCallback);
+
+  static CFXJSE_IsolateTracker* g_pInstance;
+
+ protected:
+  std::vector<v8::Isolate*> m_OwnedIsolates;
+};
+
+#endif  // FXJS_CFXJSE_ISOLATETRACKER_H_
diff --git a/fxjse/runtime.cpp b/fxjs/cfxjse_runtimedata.cpp
similarity index 70%
rename from fxjse/runtime.cpp
rename to fxjs/cfxjse_runtimedata.cpp
index b5f2f33..f58f5f8 100644
--- a/fxjse/runtime.cpp
+++ b/fxjs/cfxjse_runtimedata.cpp
@@ -1,15 +1,15 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// Copyright 2016 PDFium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "fxjse/runtime.h"
-
-#include <algorithm>
+#include "fxjs/cfxjse_runtimedata.h"
 
 #include "fpdfsdk/jsapi/include/fxjs_v8.h"
-#include "fxjse/scope_inline.h"
+#include "fxjs/cfxjse_isolatetracker.h"
+
+namespace {
 
 // Duplicates fpdfsdk's cjs_runtime.h, but keeps XFA from depending on it.
 // TODO(tsepez): make a single version of this.
@@ -19,10 +19,21 @@
   void Free(void* data, size_t length) override { free(data); }
 };
 
-static void FXJSE_KillV8() {
+void Runtime_DisposeCallback(v8::Isolate* pIsolate, bool bOwned) {
+  if (FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate)) {
+    delete pData->m_pFXJSERuntimeData;
+    pData->m_pFXJSERuntimeData = nullptr;
+  }
+  if (bOwned)
+    pIsolate->Dispose();
+}
+
+void KillV8() {
   v8::V8::Dispose();
 }
 
+}  // namespace
+
 void FXJSE_Initialize() {
   if (!CFXJSE_IsolateTracker::g_pInstance)
     CFXJSE_IsolateTracker::g_pInstance = new CFXJSE_IsolateTracker;
@@ -32,23 +43,14 @@
     return;
 
   bV8Initialized = TRUE;
-  atexit(FXJSE_KillV8);
-}
-
-static void FXJSE_Runtime_DisposeCallback(v8::Isolate* pIsolate, bool bOwned) {
-  if (FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate)) {
-    delete pData->m_pFXJSERuntimeData;
-    pData->m_pFXJSERuntimeData = nullptr;
-  }
-  if (bOwned)
-    pIsolate->Dispose();
+  atexit(KillV8);
 }
 
 void FXJSE_Finalize() {
   if (!CFXJSE_IsolateTracker::g_pInstance)
     return;
 
-  CFXJSE_IsolateTracker::g_pInstance->RemoveAll(FXJSE_Runtime_DisposeCallback);
+  CFXJSE_IsolateTracker::g_pInstance->RemoveAll(Runtime_DisposeCallback);
   delete CFXJSE_IsolateTracker::g_pInstance;
   CFXJSE_IsolateTracker::g_pInstance = nullptr;
 }
@@ -65,8 +67,7 @@
 void FXJSE_Runtime_Release(v8::Isolate* pIsolate) {
   if (!pIsolate)
     return;
-  CFXJSE_IsolateTracker::g_pInstance->Remove(pIsolate,
-                                             FXJSE_Runtime_DisposeCallback);
+  CFXJSE_IsolateTracker::g_pInstance->Remove(pIsolate, Runtime_DisposeCallback);
 }
 
 CFXJSE_RuntimeData::CFXJSE_RuntimeData(v8::Isolate* pIsolate)
@@ -102,29 +103,3 @@
 }
 
 CFXJSE_IsolateTracker* CFXJSE_IsolateTracker::g_pInstance = nullptr;
-
-CFXJSE_IsolateTracker::CFXJSE_IsolateTracker() {}
-
-CFXJSE_IsolateTracker::~CFXJSE_IsolateTracker() {}
-
-void CFXJSE_IsolateTracker::Append(v8::Isolate* pIsolate) {
-  m_OwnedIsolates.push_back(pIsolate);
-}
-
-void CFXJSE_IsolateTracker::Remove(
-    v8::Isolate* pIsolate,
-    CFXJSE_IsolateTracker::DisposeCallback lpfnDisposeCallback) {
-  auto it = std::find(m_OwnedIsolates.begin(), m_OwnedIsolates.end(), pIsolate);
-  bool bFound = it != m_OwnedIsolates.end();
-  if (bFound)
-    m_OwnedIsolates.erase(it);
-  lpfnDisposeCallback(pIsolate, bFound);
-}
-
-void CFXJSE_IsolateTracker::RemoveAll(
-    CFXJSE_IsolateTracker::DisposeCallback lpfnDisposeCallback) {
-  for (v8::Isolate* pIsolate : m_OwnedIsolates)
-    lpfnDisposeCallback(pIsolate, true);
-
-  m_OwnedIsolates.clear();
-}
diff --git a/fxjs/cfxjse_runtimedata.h b/fxjs/cfxjse_runtimedata.h
new file mode 100644
index 0000000..34f8f32
--- /dev/null
+++ b/fxjs/cfxjse_runtimedata.h
@@ -0,0 +1,34 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef FXJS_CFXJSE_RUNTIMEDATA_H_
+#define FXJS_CFXJSE_RUNTIMEDATA_H_
+
+#include "v8/include/v8.h"
+
+class CFXJSE_RuntimeList;
+
+class CFXJSE_RuntimeData {
+ public:
+  ~CFXJSE_RuntimeData();
+
+  static CFXJSE_RuntimeData* Get(v8::Isolate* pIsolate);
+
+  v8::Isolate* m_pIsolate;
+  v8::Global<v8::FunctionTemplate> m_hRootContextGlobalTemplate;
+  v8::Global<v8::Context> m_hRootContext;
+
+ protected:
+  explicit CFXJSE_RuntimeData(v8::Isolate* pIsolate);
+
+  static CFXJSE_RuntimeData* Create(v8::Isolate* pIsolate);
+
+ private:
+  CFXJSE_RuntimeData(const CFXJSE_RuntimeData&) = delete;
+  CFXJSE_RuntimeData& operator=(const CFXJSE_RuntimeData&) = delete;
+};
+
+#endif  // FXJS_CFXJSE_RUNTIMEDATA_H_
diff --git a/fxjse/value.cpp b/fxjs/cfxjse_value.cpp
similarity index 67%
rename from fxjse/value.cpp
rename to fxjs/cfxjse_value.cpp
index aba6402..b1fc078 100644
--- a/fxjse/value.cpp
+++ b/fxjs/cfxjse_value.cpp
@@ -4,16 +4,16 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "fxjse/include/cfxjse_value.h"
+#include "fxjs/include/cfxjse_value.h"
 
 #include <math.h>
 
-#include "fxjse/context.h"
-#include "fxjse/include/cfxjse_class.h"
+#include "fxjs/include/cfxjse_class.h"
+#include "fxjs/include/cfxjse_context.h"
 
 namespace {
 
-double FXJSE_ftod(FX_FLOAT fNumber) {
+double ftod(FX_FLOAT fNumber) {
   static_assert(sizeof(FX_FLOAT) == 4, "FX_FLOAT of incorrect size");
 
   uint32_t nFloatBits = (uint32_t&)fNumber;
@@ -124,7 +124,7 @@
 
 void CFXJSE_Value::SetFloat(FX_FLOAT fFloat) {
   CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-  v8::Local<v8::Value> pValue = v8::Number::New(m_pIsolate, FXJSE_ftod(fFloat));
+  v8::Local<v8::Value> pValue = v8::Number::New(m_pIsolate, ftod(fFloat));
   m_hValue.Reset(m_pIsolate, pValue);
 }
 
@@ -346,3 +346,174 @@
   }
   return bRetValue;
 }
+
+FX_BOOL CFXJSE_Value::IsUndefined() const {
+  if (m_hValue.IsEmpty())
+    return FALSE;
+
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return hValue->IsUndefined();
+}
+
+FX_BOOL CFXJSE_Value::IsNull() const {
+  if (m_hValue.IsEmpty())
+    return FALSE;
+
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return hValue->IsNull();
+}
+
+FX_BOOL CFXJSE_Value::IsBoolean() const {
+  if (m_hValue.IsEmpty())
+    return FALSE;
+
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return hValue->IsBoolean();
+}
+
+FX_BOOL CFXJSE_Value::IsString() const {
+  if (m_hValue.IsEmpty())
+    return FALSE;
+
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return hValue->IsString();
+}
+
+FX_BOOL CFXJSE_Value::IsNumber() const {
+  if (m_hValue.IsEmpty())
+    return FALSE;
+
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return hValue->IsNumber();
+}
+
+FX_BOOL CFXJSE_Value::IsInteger() const {
+  if (m_hValue.IsEmpty())
+    return FALSE;
+
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return hValue->IsInt32();
+}
+
+FX_BOOL CFXJSE_Value::IsObject() const {
+  if (m_hValue.IsEmpty())
+    return FALSE;
+
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return hValue->IsObject();
+}
+
+FX_BOOL CFXJSE_Value::IsArray() const {
+  if (m_hValue.IsEmpty())
+    return FALSE;
+
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return hValue->IsArray();
+}
+
+FX_BOOL CFXJSE_Value::IsFunction() const {
+  if (m_hValue.IsEmpty())
+    return FALSE;
+
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return hValue->IsFunction();
+}
+
+FX_BOOL CFXJSE_Value::IsDate() const {
+  if (m_hValue.IsEmpty())
+    return FALSE;
+
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return hValue->IsDate();
+}
+
+FX_BOOL CFXJSE_Value::ToBoolean() const {
+  ASSERT(!m_hValue.IsEmpty());
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return static_cast<FX_BOOL>(hValue->BooleanValue());
+}
+
+FX_FLOAT CFXJSE_Value::ToFloat() const {
+  ASSERT(!m_hValue.IsEmpty());
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return static_cast<FX_FLOAT>(hValue->NumberValue());
+}
+
+double CFXJSE_Value::ToDouble() const {
+  ASSERT(!m_hValue.IsEmpty());
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return static_cast<double>(hValue->NumberValue());
+}
+
+int32_t CFXJSE_Value::ToInteger() const {
+  ASSERT(!m_hValue.IsEmpty());
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  return static_cast<int32_t>(hValue->NumberValue());
+}
+
+CFX_ByteString CFXJSE_Value::ToString() const {
+  ASSERT(!m_hValue.IsEmpty());
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  v8::Local<v8::String> hString = hValue->ToString();
+  v8::String::Utf8Value hStringVal(hString);
+  return CFX_ByteString(*hStringVal);
+}
+
+void CFXJSE_Value::SetUndefined() {
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Undefined(m_pIsolate);
+  m_hValue.Reset(m_pIsolate, hValue);
+}
+
+void CFXJSE_Value::SetNull() {
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Null(m_pIsolate);
+  m_hValue.Reset(m_pIsolate, hValue);
+}
+
+void CFXJSE_Value::SetBoolean(FX_BOOL bBoolean) {
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Boolean::New(m_pIsolate, bBoolean != FALSE);
+  m_hValue.Reset(m_pIsolate, hValue);
+}
+
+void CFXJSE_Value::SetInteger(int32_t nInteger) {
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Integer::New(m_pIsolate, nInteger);
+  m_hValue.Reset(m_pIsolate, hValue);
+}
+
+void CFXJSE_Value::SetDouble(double dDouble) {
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Number::New(m_pIsolate, dDouble);
+  m_hValue.Reset(m_pIsolate, hValue);
+}
+
+void CFXJSE_Value::SetString(const CFX_ByteStringC& szString) {
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::String::NewFromUtf8(
+      m_pIsolate, reinterpret_cast<const char*>(szString.raw_str()),
+      v8::String::kNormalString, szString.GetLength());
+  m_hValue.Reset(m_pIsolate, hValue);
+}
+
+void CFXJSE_Value::SetJSObject() {
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Object::New(m_pIsolate);
+  m_hValue.Reset(m_pIsolate, hValue);
+}
diff --git a/fxjse/include/cfxjse_arguments.h b/fxjs/include/cfxjse_arguments.h
similarity index 86%
rename from fxjse/include/cfxjse_arguments.h
rename to fxjs/include/cfxjse_arguments.h
index 0f9bdda..e6c8659 100644
--- a/fxjse/include/cfxjse_arguments.h
+++ b/fxjs/include/cfxjse_arguments.h
@@ -4,12 +4,12 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef FXJSE_INCLUDE_CFXJSE_ARGUMENTS_H_
-#define FXJSE_INCLUDE_CFXJSE_ARGUMENTS_H_
+#ifndef FXJS_INCLUDE_CFXJSE_ARGUMENTS_H_
+#define FXJS_INCLUDE_CFXJSE_ARGUMENTS_H_
 
 #include <memory>
 
-#include "fxjse/include/fxjse.h"
+#include "fxjs/include/fxjse.h"
 
 class CFXJSE_Class;
 
@@ -35,4 +35,4 @@
   CFXJSE_Value* m_pRetValue;
 };
 
-#endif  // FXJSE_INCLUDE_CFXJSE_ARGUMENTS_H_
+#endif  // FXJS_INCLUDE_CFXJSE_ARGUMENTS_H_
diff --git a/fxjse/include/cfxjse_class.h b/fxjs/include/cfxjse_class.h
similarity index 86%
rename from fxjse/include/cfxjse_class.h
rename to fxjs/include/cfxjse_class.h
index b4953d2..13eb1ad 100644
--- a/fxjse/include/cfxjse_class.h
+++ b/fxjs/include/cfxjse_class.h
@@ -4,11 +4,11 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef FXJSE_INCLUDE_CFXJSE_CLASS_H_
-#define FXJSE_INCLUDE_CFXJSE_CLASS_H_
+#ifndef FXJS_INCLUDE_CFXJSE_CLASS_H_
+#define FXJS_INCLUDE_CFXJSE_CLASS_H_
 
-#include "fxjse/include/cfxjse_arguments.h"
-#include "fxjse/include/fxjse.h"
+#include "fxjs/include/cfxjse_arguments.h"
+#include "fxjs/include/fxjse.h"
 #include "v8/include/v8.h"
 
 class CFXJSE_Context;
@@ -16,8 +16,6 @@
 
 class CFXJSE_Class {
  public:
-  ~CFXJSE_Class();
-
   static CFXJSE_Class* Create(CFXJSE_Context* pContext,
                               const FXJSE_CLASS_DESCRIPTOR* lpClassDefintion,
                               FX_BOOL bIsJSGlobal = FALSE);
@@ -28,6 +26,8 @@
       v8::Local<v8::ObjectTemplate>& hObjectTemplate,
       const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition);
 
+  ~CFXJSE_Class();
+
   CFXJSE_Context* GetContext() { return m_pContext; }
   v8::Global<v8::FunctionTemplate>& GetTemplate() { return m_hTemplate; }
 
@@ -42,4 +42,4 @@
   friend class CFXJSE_Value;
 };
 
-#endif  // FXJSE_INCLUDE_CFXJSE_CLASS_H_
+#endif  // FXJS_INCLUDE_CFXJSE_CLASS_H_
diff --git a/fxjse/context.h b/fxjs/include/cfxjse_context.h
similarity index 89%
rename from fxjse/context.h
rename to fxjs/include/cfxjse_context.h
index 3cc7123..882258f 100644
--- a/fxjse/context.h
+++ b/fxjs/include/cfxjse_context.h
@@ -1,17 +1,17 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// Copyright 2016 PDFium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef FXJSE_CONTEXT_H_
-#define FXJSE_CONTEXT_H_
+#ifndef FXJS_INCLUDE_CFXJSE_CONTEXT_H_
+#define FXJS_INCLUDE_CFXJSE_CONTEXT_H_
 
 #include <memory>
 #include <vector>
 
 #include "core/fxcrt/include/fx_basic.h"
-#include "fxjse/include/fxjse.h"
+#include "fxjs/include/fxjse.h"
 #include "v8/include/v8.h"
 
 class CFXJSE_Class;
@@ -24,6 +24,7 @@
       v8::Isolate* pIsolate,
       const FXJSE_CLASS_DESCRIPTOR* lpGlobalClass = nullptr,
       CFXJSE_HostObject* lpGlobalObject = nullptr);
+
   ~CFXJSE_Context();
 
   v8::Isolate* GetRuntime() { return m_pIsolate; }
@@ -34,17 +35,18 @@
                         CFXJSE_Value* lpNewThisObject = nullptr);
 
  protected:
+  friend class CFXJSE_Class;
+  friend class CFXJSE_ScopeUtil_IsolateHandleContext;
+
   CFXJSE_Context();
   CFXJSE_Context(const CFXJSE_Context&);
   explicit CFXJSE_Context(v8::Isolate* pIsolate);
+
   CFXJSE_Context& operator=(const CFXJSE_Context&);
 
   v8::Global<v8::Context> m_hContext;
   v8::Isolate* m_pIsolate;
   std::vector<std::unique_ptr<CFXJSE_Class>> m_rgClasses;
-
-  friend class CFXJSE_Class;
-  friend class CFXJSE_ScopeUtil_IsolateHandleContext;
 };
 
 v8::Local<v8::Object> FXJSE_CreateReturnValue(v8::Isolate* pIsolate,
@@ -60,4 +62,4 @@
     const v8::Local<v8::Object>& hJSObject,
     CFXJSE_Class* lpClass = nullptr);
 
-#endif  // FXJSE_CONTEXT_H_
+#endif  // FXJS_INCLUDE_CFXJSE_CONTEXT_H_
diff --git a/fxjs/include/cfxjse_value.h b/fxjs/include/cfxjse_value.h
new file mode 100644
index 0000000..7bb2c2d
--- /dev/null
+++ b/fxjs/include/cfxjse_value.h
@@ -0,0 +1,102 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef FXJS_INCLUDE_CFXJSE_VALUE_H_
+#define FXJS_INCLUDE_CFXJSE_VALUE_H_
+
+#include "v8/include/v8.h"
+
+#include "core/fxcrt/include/fx_string.h"
+#include "core/fxcrt/include/fx_system.h"
+#include "fxjs/cfxjse_isolatetracker.h"
+#include "fxjs/cfxjse_runtimedata.h"
+
+class CFXJSE_Class;
+class CFXJSE_HostObject;
+
+class CFXJSE_Value {
+ public:
+  explicit CFXJSE_Value(v8::Isolate* pIsolate);
+  ~CFXJSE_Value();
+
+  FX_BOOL IsUndefined() const;
+  FX_BOOL IsNull() const;
+  FX_BOOL IsBoolean() const;
+  FX_BOOL IsString() const;
+  FX_BOOL IsNumber() const;
+  FX_BOOL IsInteger() const;
+  FX_BOOL IsObject() const;
+  FX_BOOL IsArray() const;
+  FX_BOOL IsFunction() const;
+  FX_BOOL IsDate() const;
+  FX_BOOL ToBoolean() const;
+  FX_FLOAT ToFloat() const;
+  double ToDouble() const;
+  int32_t ToInteger() const;
+  CFX_ByteString ToString() const;
+  CFX_WideString ToWideString() const {
+    return CFX_WideString::FromUTF8(ToString().AsStringC());
+  }
+  CFXJSE_HostObject* ToHostObject(CFXJSE_Class* lpClass) const;
+
+  void SetUndefined();
+  void SetNull();
+  void SetBoolean(FX_BOOL bBoolean);
+  void SetInteger(int32_t nInteger);
+  void SetDouble(double dDouble);
+  void SetString(const CFX_ByteStringC& szString);
+  void SetFloat(FX_FLOAT fFloat);
+  void SetJSObject();
+
+  void SetObject(CFXJSE_HostObject* lpObject, CFXJSE_Class* pClass);
+  void SetHostObject(CFXJSE_HostObject* lpObject, CFXJSE_Class* lpClass);
+  void SetArray(uint32_t uValueCount, CFXJSE_Value** rgValues);
+  void SetDate(double dDouble);
+
+  FX_BOOL GetObjectProperty(const CFX_ByteStringC& szPropName,
+                            CFXJSE_Value* lpPropValue);
+  FX_BOOL SetObjectProperty(const CFX_ByteStringC& szPropName,
+                            CFXJSE_Value* lpPropValue);
+  FX_BOOL GetObjectPropertyByIdx(uint32_t uPropIdx, CFXJSE_Value* lpPropValue);
+  FX_BOOL SetObjectProperty(uint32_t uPropIdx, CFXJSE_Value* lpPropValue);
+  FX_BOOL DeleteObjectProperty(const CFX_ByteStringC& szPropName);
+  FX_BOOL HasObjectOwnProperty(const CFX_ByteStringC& szPropName,
+                               FX_BOOL bUseTypeGetter);
+  FX_BOOL SetObjectOwnProperty(const CFX_ByteStringC& szPropName,
+                               CFXJSE_Value* lpPropValue);
+  FX_BOOL SetFunctionBind(CFXJSE_Value* lpOldFunction, CFXJSE_Value* lpNewThis);
+  FX_BOOL Call(CFXJSE_Value* lpReceiver,
+               CFXJSE_Value* lpRetValue,
+               uint32_t nArgCount,
+               CFXJSE_Value** lpArgs);
+
+  v8::Isolate* GetIsolate() const { return m_pIsolate; }
+  const v8::Global<v8::Value>& DirectGetValue() const { return m_hValue; }
+  void ForceSetValue(v8::Local<v8::Value> hValue) {
+    m_hValue.Reset(m_pIsolate, hValue);
+  }
+  void Assign(const CFXJSE_Value* lpValue) {
+    ASSERT(lpValue);
+    if (lpValue) {
+      m_hValue.Reset(m_pIsolate, lpValue->m_hValue);
+    } else {
+      m_hValue.Reset();
+    }
+  }
+
+ private:
+  friend class CFXJSE_Class;
+  friend class CFXJSE_Context;
+
+  CFXJSE_Value();
+  CFXJSE_Value(const CFXJSE_Value&);
+  CFXJSE_Value& operator=(const CFXJSE_Value&);
+
+  v8::Isolate* m_pIsolate;
+  v8::Global<v8::Value> m_hValue;
+};
+
+#endif  // FXJS_INCLUDE_CFXJSE_VALUE_H_
diff --git a/fxjse/include/fxjse.h b/fxjs/include/fxjse.h
similarity index 95%
rename from fxjse/include/fxjse.h
rename to fxjs/include/fxjse.h
index f9d6a67..79c32b0 100644
--- a/fxjse/include/fxjse.h
+++ b/fxjs/include/fxjse.h
@@ -4,8 +4,8 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef FXJSE_INCLUDE_FXJSE_H_
-#define FXJSE_INCLUDE_FXJSE_H_
+#ifndef FXJS_INCLUDE_FXJSE_H_
+#define FXJS_INCLUDE_FXJSE_H_
 
 #include "core/fxcrt/include/fx_string.h"
 #include "core/fxcrt/include/fx_system.h"
@@ -71,4 +71,4 @@
 
 void FXJSE_ThrowMessage(const CFX_ByteStringC& utf8Message);
 
-#endif  // FXJSE_INCLUDE_FXJSE_H_
+#endif  // FXJS_INCLUDE_FXJSE_H_
diff --git a/fxjse/class.cpp b/fxjse/class.cpp
deleted file mode 100644
index a4ed091..0000000
--- a/fxjse/class.cpp
+++ /dev/null
@@ -1,291 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "fxjse/include/cfxjse_class.h"
-
-#include "fxjse/context.h"
-#include "fxjse/include/cfxjse_arguments.h"
-#include "fxjse/include/cfxjse_value.h"
-#include "fxjse/scope_inline.h"
-
-static void FXJSE_V8ConstructorCallback_Wrapper(
-    const v8::FunctionCallbackInfo<v8::Value>& info);
-static void FXJSE_V8FunctionCallback_Wrapper(
-    const v8::FunctionCallbackInfo<v8::Value>& info);
-static void FXJSE_V8GetterCallback_Wrapper(
-    v8::Local<v8::String> property,
-    const v8::PropertyCallbackInfo<v8::Value>& info);
-static void FXJSE_V8SetterCallback_Wrapper(
-    v8::Local<v8::String> property,
-    v8::Local<v8::Value> value,
-    const v8::PropertyCallbackInfo<void>& info);
-
-static void FXJSE_V8FunctionCallback_Wrapper(
-    const v8::FunctionCallbackInfo<v8::Value>& info) {
-  const FXJSE_FUNCTION_DESCRIPTOR* lpFunctionInfo =
-      static_cast<FXJSE_FUNCTION_DESCRIPTOR*>(
-          info.Data().As<v8::External>()->Value());
-  if (!lpFunctionInfo) {
-    return;
-  }
-  CFX_ByteStringC szFunctionName(lpFunctionInfo->name);
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
-  lpThisValue->ForceSetValue(info.This());
-  std::unique_ptr<CFXJSE_Value> lpRetValue(new CFXJSE_Value(info.GetIsolate()));
-  CFXJSE_Arguments impl(&info, lpRetValue.get());
-  lpFunctionInfo->callbackProc(lpThisValue.get(), szFunctionName, impl);
-  if (!lpRetValue->DirectGetValue().IsEmpty()) {
-    info.GetReturnValue().Set(lpRetValue->DirectGetValue());
-  }
-}
-
-static void FXJSE_V8ClassGlobalConstructorCallback_Wrapper(
-    const v8::FunctionCallbackInfo<v8::Value>& info) {
-  const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition =
-      static_cast<FXJSE_CLASS_DESCRIPTOR*>(
-          info.Data().As<v8::External>()->Value());
-  if (!lpClassDefinition) {
-    return;
-  }
-  CFX_ByteStringC szFunctionName(lpClassDefinition->name);
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
-  lpThisValue->ForceSetValue(info.This());
-  std::unique_ptr<CFXJSE_Value> lpRetValue(new CFXJSE_Value(info.GetIsolate()));
-  CFXJSE_Arguments impl(&info, lpRetValue.get());
-  lpClassDefinition->constructor(lpThisValue.get(), szFunctionName, impl);
-  if (!lpRetValue->DirectGetValue().IsEmpty()) {
-    info.GetReturnValue().Set(lpRetValue->DirectGetValue());
-  }
-}
-
-static void FXJSE_V8GetterCallback_Wrapper(
-    v8::Local<v8::String> property,
-    const v8::PropertyCallbackInfo<v8::Value>& info) {
-  const FXJSE_PROPERTY_DESCRIPTOR* lpPropertyInfo =
-      static_cast<FXJSE_PROPERTY_DESCRIPTOR*>(
-          info.Data().As<v8::External>()->Value());
-  if (!lpPropertyInfo) {
-    return;
-  }
-  CFX_ByteStringC szPropertyName(lpPropertyInfo->name);
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
-  std::unique_ptr<CFXJSE_Value> lpPropValue(
-      new CFXJSE_Value(info.GetIsolate()));
-  lpThisValue->ForceSetValue(info.This());
-  lpPropertyInfo->getProc(lpThisValue.get(), szPropertyName, lpPropValue.get());
-  info.GetReturnValue().Set(lpPropValue->DirectGetValue());
-}
-
-static void FXJSE_V8SetterCallback_Wrapper(
-    v8::Local<v8::String> property,
-    v8::Local<v8::Value> value,
-    const v8::PropertyCallbackInfo<void>& info) {
-  const FXJSE_PROPERTY_DESCRIPTOR* lpPropertyInfo =
-      static_cast<FXJSE_PROPERTY_DESCRIPTOR*>(
-          info.Data().As<v8::External>()->Value());
-  if (!lpPropertyInfo) {
-    return;
-  }
-  CFX_ByteStringC szPropertyName(lpPropertyInfo->name);
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
-  std::unique_ptr<CFXJSE_Value> lpPropValue(
-      new CFXJSE_Value(info.GetIsolate()));
-  lpThisValue->ForceSetValue(info.This());
-  lpPropValue->ForceSetValue(value);
-  lpPropertyInfo->setProc(lpThisValue.get(), szPropertyName, lpPropValue.get());
-}
-
-static void FXJSE_V8ConstructorCallback_Wrapper(
-    const v8::FunctionCallbackInfo<v8::Value>& info) {
-  if (!info.IsConstructCall()) {
-    return;
-  }
-  const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition =
-      static_cast<FXJSE_CLASS_DESCRIPTOR*>(
-          info.Data().As<v8::External>()->Value());
-  if (!lpClassDefinition) {
-    return;
-  }
-  ASSERT(info.This()->InternalFieldCount());
-  info.This()->SetAlignedPointerInInternalField(0, NULL);
-}
-
-v8::Isolate* CFXJSE_Arguments::GetRuntime() const {
-  return m_pRetValue->GetIsolate();
-}
-
-int32_t CFXJSE_Arguments::GetLength() const {
-  return m_pInfo->Length();
-}
-
-std::unique_ptr<CFXJSE_Value> CFXJSE_Arguments::GetValue(int32_t index) const {
-  std::unique_ptr<CFXJSE_Value> lpArgValue(
-      new CFXJSE_Value(v8::Isolate::GetCurrent()));
-  lpArgValue->ForceSetValue((*m_pInfo)[index]);
-  return lpArgValue;
-}
-
-FX_BOOL CFXJSE_Arguments::GetBoolean(int32_t index) const {
-  return (*m_pInfo)[index]->BooleanValue();
-}
-
-int32_t CFXJSE_Arguments::GetInt32(int32_t index) const {
-  return static_cast<int32_t>((*m_pInfo)[index]->NumberValue());
-}
-
-FX_FLOAT CFXJSE_Arguments::GetFloat(int32_t index) const {
-  return static_cast<FX_FLOAT>((*m_pInfo)[index]->NumberValue());
-}
-
-CFX_ByteString CFXJSE_Arguments::GetUTF8String(int32_t index) const {
-  v8::Local<v8::String> hString = (*m_pInfo)[index]->ToString();
-  v8::String::Utf8Value szStringVal(hString);
-  return CFX_ByteString(*szStringVal);
-}
-
-CFXJSE_HostObject* CFXJSE_Arguments::GetObject(int32_t index,
-                                               CFXJSE_Class* pClass) const {
-  v8::Local<v8::Value> hValue = (*m_pInfo)[index];
-  ASSERT(!hValue.IsEmpty());
-  if (!hValue->IsObject())
-    return nullptr;
-  return FXJSE_RetrieveObjectBinding(hValue.As<v8::Object>(), pClass);
-}
-
-CFXJSE_Value* CFXJSE_Arguments::GetReturnValue() {
-  return m_pRetValue;
-}
-
-static void FXJSE_Context_GlobalObjToString(
-    const v8::FunctionCallbackInfo<v8::Value>& info) {
-  const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
-      info.Data().As<v8::External>()->Value());
-  if (!lpClass) {
-    return;
-  }
-  if (info.This() == info.Holder() && lpClass->name) {
-    CFX_ByteString szStringVal;
-    szStringVal.Format("[object %s]", lpClass->name);
-    info.GetReturnValue().Set(v8::String::NewFromUtf8(
-        info.GetIsolate(), szStringVal.c_str(), v8::String::kNormalString,
-        szStringVal.GetLength()));
-  } else {
-    v8::Local<v8::String> local_str =
-        info.This()
-            ->ObjectProtoToString(info.GetIsolate()->GetCurrentContext())
-            .FromMaybe(v8::Local<v8::String>());
-    info.GetReturnValue().Set(local_str);
-  }
-}
-
-CFXJSE_Class* CFXJSE_Class::Create(
-    CFXJSE_Context* lpContext,
-    const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition,
-    FX_BOOL bIsJSGlobal) {
-  if (!lpContext || !lpClassDefinition) {
-    return NULL;
-  }
-  CFXJSE_Class* pClass =
-      GetClassFromContext(lpContext, lpClassDefinition->name);
-  if (pClass) {
-    return pClass;
-  }
-  v8::Isolate* pIsolate = lpContext->m_pIsolate;
-  pClass = new CFXJSE_Class(lpContext);
-  pClass->m_szClassName = lpClassDefinition->name;
-  pClass->m_lpClassDefinition = lpClassDefinition;
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate);
-  v8::Local<v8::FunctionTemplate> hFunctionTemplate = v8::FunctionTemplate::New(
-      pIsolate, bIsJSGlobal ? 0 : FXJSE_V8ConstructorCallback_Wrapper,
-      v8::External::New(
-          pIsolate, const_cast<FXJSE_CLASS_DESCRIPTOR*>(lpClassDefinition)));
-  hFunctionTemplate->SetClassName(
-      v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name));
-  hFunctionTemplate->InstanceTemplate()->SetInternalFieldCount(1);
-  v8::Local<v8::ObjectTemplate> hObjectTemplate =
-      hFunctionTemplate->InstanceTemplate();
-  SetUpNamedPropHandler(pIsolate, hObjectTemplate, lpClassDefinition);
-
-  if (lpClassDefinition->propNum) {
-    for (int32_t i = 0; i < lpClassDefinition->propNum; i++) {
-      hObjectTemplate->SetNativeDataProperty(
-          v8::String::NewFromUtf8(pIsolate,
-                                  lpClassDefinition->properties[i].name),
-          lpClassDefinition->properties[i].getProc
-              ? FXJSE_V8GetterCallback_Wrapper
-              : NULL,
-          lpClassDefinition->properties[i].setProc
-              ? FXJSE_V8SetterCallback_Wrapper
-              : NULL,
-          v8::External::New(pIsolate, const_cast<FXJSE_PROPERTY_DESCRIPTOR*>(
-                                          lpClassDefinition->properties + i)),
-          static_cast<v8::PropertyAttribute>(v8::DontDelete));
-    }
-  }
-  if (lpClassDefinition->methNum) {
-    for (int32_t i = 0; i < lpClassDefinition->methNum; i++) {
-      v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(
-          pIsolate, FXJSE_V8FunctionCallback_Wrapper,
-          v8::External::New(pIsolate, const_cast<FXJSE_FUNCTION_DESCRIPTOR*>(
-                                          lpClassDefinition->methods + i)));
-      fun->RemovePrototype();
-      hObjectTemplate->Set(
-          v8::String::NewFromUtf8(pIsolate, lpClassDefinition->methods[i].name),
-          fun,
-          static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete));
-    }
-  }
-  if (lpClassDefinition->constructor) {
-    if (bIsJSGlobal) {
-      hObjectTemplate->Set(
-          v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name),
-          v8::FunctionTemplate::New(
-              pIsolate, FXJSE_V8ClassGlobalConstructorCallback_Wrapper,
-              v8::External::New(pIsolate, const_cast<FXJSE_CLASS_DESCRIPTOR*>(
-                                              lpClassDefinition))),
-          static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete));
-    } else {
-      v8::Local<v8::Context> hLocalContext =
-          v8::Local<v8::Context>::New(pIsolate, lpContext->m_hContext);
-      FXJSE_GetGlobalObjectFromContext(hLocalContext)
-          ->Set(v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name),
-                v8::Function::New(
-                    pIsolate, FXJSE_V8ClassGlobalConstructorCallback_Wrapper,
-                    v8::External::New(pIsolate,
-                                      const_cast<FXJSE_CLASS_DESCRIPTOR*>(
-                                          lpClassDefinition))));
-    }
-  }
-  if (bIsJSGlobal) {
-    v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(
-        pIsolate, FXJSE_Context_GlobalObjToString,
-        v8::External::New(
-            pIsolate, const_cast<FXJSE_CLASS_DESCRIPTOR*>(lpClassDefinition)));
-    fun->RemovePrototype();
-    hObjectTemplate->Set(v8::String::NewFromUtf8(pIsolate, "toString"), fun);
-  }
-  pClass->m_hTemplate.Reset(lpContext->m_pIsolate, hFunctionTemplate);
-  lpContext->m_rgClasses.push_back(std::unique_ptr<CFXJSE_Class>(pClass));
-  return pClass;
-}
-
-CFXJSE_Class::CFXJSE_Class(CFXJSE_Context* lpContext)
-    : m_lpClassDefinition(nullptr), m_pContext(lpContext) {}
-
-CFXJSE_Class::~CFXJSE_Class() {}
-
-CFXJSE_Class* CFXJSE_Class::GetClassFromContext(CFXJSE_Context* pContext,
-                                                const CFX_ByteStringC& szName) {
-  for (const auto& pClass : pContext->m_rgClasses) {
-    if (pClass->m_szClassName == szName)
-      return pClass.get();
-  }
-  return nullptr;
-}
diff --git a/fxjse/dynprop.cpp b/fxjse/dynprop.cpp
deleted file mode 100644
index 836cd5f..0000000
--- a/fxjse/dynprop.cpp
+++ /dev/null
@@ -1,225 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "fxjse/include/cfxjse_arguments.h"
-#include "fxjse/include/cfxjse_class.h"
-#include "fxjse/include/cfxjse_value.h"
-
-static void FXJSE_DynPropGetterAdapter_MethodCallback(
-    const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Local<v8::Object> hCallBackInfo = info.Data().As<v8::Object>();
-  FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
-      hCallBackInfo->GetAlignedPointerFromInternalField(0));
-  v8::Local<v8::String> hPropName =
-      hCallBackInfo->GetInternalField(1).As<v8::String>();
-  ASSERT(lpClass && !hPropName.IsEmpty());
-  v8::String::Utf8Value szPropName(hPropName);
-  CFX_ByteStringC szFxPropName = *szPropName;
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
-  lpThisValue->ForceSetValue(info.This());
-  std::unique_ptr<CFXJSE_Value> lpRetValue(new CFXJSE_Value(info.GetIsolate()));
-  CFXJSE_Arguments impl(&info, lpRetValue.get());
-  lpClass->dynMethodCall(lpThisValue.get(), szFxPropName, impl);
-  if (!lpRetValue->DirectGetValue().IsEmpty()) {
-    info.GetReturnValue().Set(lpRetValue->DirectGetValue());
-  }
-}
-
-static void FXJSE_DynPropGetterAdapter(const FXJSE_CLASS_DESCRIPTOR* lpClass,
-                                       CFXJSE_Value* pObject,
-                                       const CFX_ByteStringC& szPropName,
-                                       CFXJSE_Value* pValue) {
-  ASSERT(lpClass);
-  int32_t nPropType =
-      lpClass->dynPropTypeGetter == nullptr
-          ? FXJSE_ClassPropType_Property
-          : lpClass->dynPropTypeGetter(pObject, szPropName, FALSE);
-  if (nPropType == FXJSE_ClassPropType_Property) {
-    if (lpClass->dynPropGetter) {
-      lpClass->dynPropGetter(pObject, szPropName, pValue);
-    }
-  } else if (nPropType == FXJSE_ClassPropType_Method) {
-    if (lpClass->dynMethodCall && pValue) {
-      v8::Isolate* pIsolate = pValue->GetIsolate();
-      v8::HandleScope hscope(pIsolate);
-      v8::Local<v8::ObjectTemplate> hCallBackInfoTemplate =
-          v8::ObjectTemplate::New(pIsolate);
-      hCallBackInfoTemplate->SetInternalFieldCount(2);
-      v8::Local<v8::Object> hCallBackInfo =
-          hCallBackInfoTemplate->NewInstance();
-      hCallBackInfo->SetAlignedPointerInInternalField(
-          0, const_cast<FXJSE_CLASS_DESCRIPTOR*>(lpClass));
-      hCallBackInfo->SetInternalField(
-          1, v8::String::NewFromUtf8(
-                 pIsolate, reinterpret_cast<const char*>(szPropName.raw_str()),
-                 v8::String::kNormalString, szPropName.GetLength()));
-      pValue->ForceSetValue(
-          v8::Function::New(pValue->GetIsolate()->GetCurrentContext(),
-                            FXJSE_DynPropGetterAdapter_MethodCallback,
-                            hCallBackInfo, 0, v8::ConstructorBehavior::kThrow)
-              .ToLocalChecked());
-    }
-  }
-}
-
-static void FXJSE_DynPropSetterAdapter(const FXJSE_CLASS_DESCRIPTOR* lpClass,
-                                       CFXJSE_Value* pObject,
-                                       const CFX_ByteStringC& szPropName,
-                                       CFXJSE_Value* pValue) {
-  ASSERT(lpClass);
-  int32_t nPropType =
-      lpClass->dynPropTypeGetter == nullptr
-          ? FXJSE_ClassPropType_Property
-          : lpClass->dynPropTypeGetter(pObject, szPropName, FALSE);
-  if (nPropType != FXJSE_ClassPropType_Method) {
-    if (lpClass->dynPropSetter) {
-      lpClass->dynPropSetter(pObject, szPropName, pValue);
-    }
-  }
-}
-
-static FX_BOOL FXJSE_DynPropQueryAdapter(const FXJSE_CLASS_DESCRIPTOR* lpClass,
-                                         CFXJSE_Value* pObject,
-                                         const CFX_ByteStringC& szPropName) {
-  ASSERT(lpClass);
-  int32_t nPropType =
-      lpClass->dynPropTypeGetter == nullptr
-          ? FXJSE_ClassPropType_Property
-          : lpClass->dynPropTypeGetter(pObject, szPropName, TRUE);
-  return nPropType != FXJSE_ClassPropType_None;
-}
-
-static FX_BOOL FXJSE_DynPropDeleterAdapter(
-    const FXJSE_CLASS_DESCRIPTOR* lpClass,
-    CFXJSE_Value* pObject,
-    const CFX_ByteStringC& szPropName) {
-  ASSERT(lpClass);
-  int32_t nPropType =
-      lpClass->dynPropTypeGetter == nullptr
-          ? FXJSE_ClassPropType_Property
-          : lpClass->dynPropTypeGetter(pObject, szPropName, FALSE);
-  if (nPropType != FXJSE_ClassPropType_Method) {
-    if (lpClass->dynPropDeleter) {
-      return lpClass->dynPropDeleter(pObject, szPropName);
-    } else {
-      return nPropType == FXJSE_ClassPropType_Property ? FALSE : TRUE;
-    }
-  }
-  return FALSE;
-}
-
-static void FXJSE_V8_GenericNamedPropertyQueryCallback(
-    v8::Local<v8::Name> property,
-    const v8::PropertyCallbackInfo<v8::Integer>& info) {
-  v8::Local<v8::Object> thisObject = info.This();
-  const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
-      info.Data().As<v8::External>()->Value());
-  v8::Isolate* pIsolate = info.GetIsolate();
-  v8::HandleScope scope(pIsolate);
-  v8::String::Utf8Value szPropName(property);
-  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
-  lpThisValue->ForceSetValue(thisObject);
-  if (FXJSE_DynPropQueryAdapter(lpClass, lpThisValue.get(), szFxPropName)) {
-    info.GetReturnValue().Set(v8::DontDelete);
-  } else {
-    const int32_t iV8Absent = 64;
-    info.GetReturnValue().Set(iV8Absent);
-  }
-}
-
-static void FXJSE_V8_GenericNamedPropertyDeleterCallback(
-    v8::Local<v8::Name> property,
-    const v8::PropertyCallbackInfo<v8::Boolean>& info) {
-  v8::Local<v8::Object> thisObject = info.This();
-  const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
-      info.Data().As<v8::External>()->Value());
-  v8::Isolate* pIsolate = info.GetIsolate();
-  v8::HandleScope scope(pIsolate);
-  v8::String::Utf8Value szPropName(property);
-  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
-  lpThisValue->ForceSetValue(thisObject);
-  info.GetReturnValue().Set(
-      !!FXJSE_DynPropDeleterAdapter(lpClass, lpThisValue.get(), szFxPropName));
-}
-
-static void FXJSE_V8_GenericNamedPropertyGetterCallback(
-    v8::Local<v8::Name> property,
-    const v8::PropertyCallbackInfo<v8::Value>& info) {
-  v8::Local<v8::Object> thisObject = info.This();
-  const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
-      info.Data().As<v8::External>()->Value());
-  v8::String::Utf8Value szPropName(property);
-  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
-  lpThisValue->ForceSetValue(thisObject);
-  std::unique_ptr<CFXJSE_Value> lpNewValue(new CFXJSE_Value(info.GetIsolate()));
-  FXJSE_DynPropGetterAdapter(lpClass, lpThisValue.get(), szFxPropName,
-                             lpNewValue.get());
-  info.GetReturnValue().Set(lpNewValue->DirectGetValue());
-}
-
-static void FXJSE_V8_GenericNamedPropertySetterCallback(
-    v8::Local<v8::Name> property,
-    v8::Local<v8::Value> value,
-    const v8::PropertyCallbackInfo<v8::Value>& info) {
-  v8::Local<v8::Object> thisObject = info.This();
-  const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
-      info.Data().As<v8::External>()->Value());
-  v8::String::Utf8Value szPropName(property);
-  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
-  std::unique_ptr<CFXJSE_Value> lpThisValue(
-      new CFXJSE_Value(info.GetIsolate()));
-  lpThisValue->ForceSetValue(thisObject);
-
-  CFXJSE_Value* lpNewValue = new CFXJSE_Value(info.GetIsolate());
-  lpNewValue->ForceSetValue(value);
-  FXJSE_DynPropSetterAdapter(lpClass, lpThisValue.get(), szFxPropName,
-                             lpNewValue);
-  info.GetReturnValue().Set(value);
-}
-
-static void FXJSE_V8_GenericNamedPropertyEnumeratorCallback(
-    const v8::PropertyCallbackInfo<v8::Array>& info) {
-  const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>(
-      info.Data().As<v8::External>()->Value());
-  v8::Isolate* pIsolate = info.GetIsolate();
-  v8::Local<v8::Array> newArray = v8::Array::New(pIsolate, lpClass->propNum);
-  for (int i = 0; i < lpClass->propNum; i++) {
-    newArray->Set(
-        i, v8::String::NewFromUtf8(pIsolate, lpClass->properties[i].name));
-  }
-  info.GetReturnValue().Set(newArray);
-}
-
-void CFXJSE_Class::SetUpNamedPropHandler(
-    v8::Isolate* pIsolate,
-    v8::Local<v8::ObjectTemplate>& hObjectTemplate,
-    const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition) {
-  v8::NamedPropertyHandlerConfiguration configuration(
-      lpClassDefinition->dynPropGetter
-          ? FXJSE_V8_GenericNamedPropertyGetterCallback
-          : 0,
-      lpClassDefinition->dynPropSetter
-          ? FXJSE_V8_GenericNamedPropertySetterCallback
-          : 0,
-      lpClassDefinition->dynPropTypeGetter
-          ? FXJSE_V8_GenericNamedPropertyQueryCallback
-          : 0,
-      lpClassDefinition->dynPropDeleter
-          ? FXJSE_V8_GenericNamedPropertyDeleterCallback
-          : 0,
-      FXJSE_V8_GenericNamedPropertyEnumeratorCallback,
-      v8::External::New(pIsolate,
-                        const_cast<FXJSE_CLASS_DESCRIPTOR*>(lpClassDefinition)),
-      v8::PropertyHandlerFlags::kNonMasking);
-  hObjectTemplate->SetHandler(configuration);
-}
diff --git a/fxjse/include/cfxjse_value.h b/fxjse/include/cfxjse_value.h
deleted file mode 100644
index 6e14d48..0000000
--- a/fxjse/include/cfxjse_value.h
+++ /dev/null
@@ -1,238 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef FXJSE_INCLUDE_CFXJSE_VALUE_H_
-#define FXJSE_INCLUDE_CFXJSE_VALUE_H_
-
-#include "fxjse/scope_inline.h"
-
-class CFXJSE_Value {
- public:
-  explicit CFXJSE_Value(v8::Isolate* pIsolate);
-  ~CFXJSE_Value();
-
-  FX_BOOL IsUndefined() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsUndefined();
-  }
-  FX_BOOL IsNull() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsNull();
-  }
-  FX_BOOL IsBoolean() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsBoolean();
-  }
-  FX_BOOL IsString() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsString();
-  }
-  FX_BOOL IsNumber() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsNumber();
-  }
-  FX_BOOL IsInteger() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsInt32();
-  }
-  FX_BOOL IsObject() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsObject();
-  }
-  FX_BOOL IsArray() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsArray();
-  }
-  FX_BOOL IsFunction() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsFunction();
-  }
-  FX_BOOL IsDate() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsDate();
-  }
-
-  FX_BOOL ToBoolean() const {
-    ASSERT(!m_hValue.IsEmpty());
-    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return static_cast<FX_BOOL>(hValue->BooleanValue());
-  }
-  FX_FLOAT ToFloat() const {
-    ASSERT(!m_hValue.IsEmpty());
-    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return static_cast<FX_FLOAT>(hValue->NumberValue());
-  }
-  double ToDouble() const {
-    ASSERT(!m_hValue.IsEmpty());
-    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return static_cast<double>(hValue->NumberValue());
-  }
-  int32_t ToInteger() const {
-    ASSERT(!m_hValue.IsEmpty());
-    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return static_cast<int32_t>(hValue->NumberValue());
-  }
-  CFX_ByteString ToString() const {
-    ASSERT(!m_hValue.IsEmpty());
-    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    v8::Local<v8::String> hString = hValue->ToString();
-    v8::String::Utf8Value hStringVal(hString);
-    return CFX_ByteString(*hStringVal);
-  }
-  CFX_WideString ToWideString() const {
-    return CFX_WideString::FromUTF8(ToString().AsStringC());
-  }
-  CFXJSE_HostObject* ToHostObject(CFXJSE_Class* lpClass) const;
-
-  void SetUndefined() {
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue = v8::Undefined(m_pIsolate);
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  void SetNull() {
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue = v8::Null(m_pIsolate);
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  void SetBoolean(FX_BOOL bBoolean) {
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Boolean::New(m_pIsolate, bBoolean != FALSE);
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  void SetInteger(int32_t nInteger) {
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue = v8::Integer::New(m_pIsolate, nInteger);
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  void SetDouble(double dDouble) {
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue = v8::Number::New(m_pIsolate, dDouble);
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  void SetString(const CFX_ByteStringC& szString) {
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue = v8::String::NewFromUtf8(
-        m_pIsolate, reinterpret_cast<const char*>(szString.raw_str()),
-        v8::String::kNormalString, szString.GetLength());
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  void SetFloat(FX_FLOAT fFloat);
-  void SetJSObject() {
-    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-    v8::Local<v8::Value> hValue = v8::Object::New(m_pIsolate);
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-
-  void SetObject(CFXJSE_HostObject* lpObject, CFXJSE_Class* pClass);
-  void SetHostObject(CFXJSE_HostObject* lpObject, CFXJSE_Class* lpClass);
-  void SetArray(uint32_t uValueCount, CFXJSE_Value** rgValues);
-  void SetDate(double dDouble);
-
-  FX_BOOL GetObjectProperty(const CFX_ByteStringC& szPropName,
-                            CFXJSE_Value* lpPropValue);
-  FX_BOOL SetObjectProperty(const CFX_ByteStringC& szPropName,
-                            CFXJSE_Value* lpPropValue);
-  FX_BOOL GetObjectPropertyByIdx(uint32_t uPropIdx, CFXJSE_Value* lpPropValue);
-  FX_BOOL SetObjectProperty(uint32_t uPropIdx, CFXJSE_Value* lpPropValue);
-  FX_BOOL DeleteObjectProperty(const CFX_ByteStringC& szPropName);
-  FX_BOOL HasObjectOwnProperty(const CFX_ByteStringC& szPropName,
-                               FX_BOOL bUseTypeGetter);
-  FX_BOOL SetObjectOwnProperty(const CFX_ByteStringC& szPropName,
-                               CFXJSE_Value* lpPropValue);
-  FX_BOOL SetFunctionBind(CFXJSE_Value* lpOldFunction, CFXJSE_Value* lpNewThis);
-  FX_BOOL Call(CFXJSE_Value* lpReceiver,
-               CFXJSE_Value* lpRetValue,
-               uint32_t nArgCount,
-               CFXJSE_Value** lpArgs);
-
-  v8::Isolate* GetIsolate() const { return m_pIsolate; }
-  const v8::Global<v8::Value>& DirectGetValue() const { return m_hValue; }
-  void ForceSetValue(v8::Local<v8::Value> hValue) {
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  void Assign(const CFXJSE_Value* lpValue) {
-    ASSERT(lpValue);
-    if (lpValue) {
-      m_hValue.Reset(m_pIsolate, lpValue->m_hValue);
-    } else {
-      m_hValue.Reset();
-    }
-  }
-
- private:
-  friend class CFXJSE_Class;
-  friend class CFXJSE_Context;
-
-  CFXJSE_Value();
-  CFXJSE_Value(const CFXJSE_Value&);
-  CFXJSE_Value& operator=(const CFXJSE_Value&);
-
-  v8::Isolate* m_pIsolate;
-  v8::Global<v8::Value> m_hValue;
-};
-
-#endif  // FXJSE_INCLUDE_CFXJSE_VALUE_H_
diff --git a/fxjse/runtime.h b/fxjse/runtime.h
deleted file mode 100644
index ff3be3a..0000000
--- a/fxjse/runtime.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef FXJSE_RUNTIME_H_
-#define FXJSE_RUNTIME_H_
-
-#include <vector>
-
-#include "core/fxcrt/include/fx_basic.h"
-#include "v8/include/v8.h"
-
-class CFXJSE_RuntimeList;
-
-class CFXJSE_RuntimeData {
- public:
-  ~CFXJSE_RuntimeData();
-
-  static CFXJSE_RuntimeData* Get(v8::Isolate* pIsolate);
-
-  v8::Isolate* m_pIsolate;
-  v8::Global<v8::FunctionTemplate> m_hRootContextGlobalTemplate;
-  v8::Global<v8::Context> m_hRootContext;
-
- protected:
-  explicit CFXJSE_RuntimeData(v8::Isolate* pIsolate);
-
-  static CFXJSE_RuntimeData* Create(v8::Isolate* pIsolate);
-
- private:
-  CFXJSE_RuntimeData(const CFXJSE_RuntimeData&) = delete;
-  CFXJSE_RuntimeData& operator=(const CFXJSE_RuntimeData&) = delete;
-};
-
-class CFXJSE_IsolateTracker {
- public:
-  typedef void (*DisposeCallback)(v8::Isolate*, bool bOwnedIsolate);
-
-  CFXJSE_IsolateTracker();
-  ~CFXJSE_IsolateTracker();
-
-  void Append(v8::Isolate* pIsolate);
-  void Remove(v8::Isolate* pIsolate, DisposeCallback lpfnDisposeCallback);
-  void RemoveAll(DisposeCallback lpfnDisposeCallback);
-
-  static CFXJSE_IsolateTracker* g_pInstance;
-
- protected:
-  std::vector<v8::Isolate*> m_OwnedIsolates;
-};
-
-#endif  // FXJSE_RUNTIME_H_
diff --git a/fxjse/scope_inline.h b/fxjse/scope_inline.h
deleted file mode 100644
index 64eb6a7..0000000
--- a/fxjse/scope_inline.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef FXJSE_SCOPE_INLINE_H_
-#define FXJSE_SCOPE_INLINE_H_
-
-#include "fxjse/context.h"
-#include "fxjse/runtime.h"
-
-class CFXJSE_ScopeUtil_IsolateHandle {
- public:
-  explicit CFXJSE_ScopeUtil_IsolateHandle(v8::Isolate* pIsolate)
-      : m_isolate(pIsolate), m_iscope(pIsolate), m_hscope(pIsolate) {}
-  v8::Isolate* GetIsolate() { return m_isolate; }
-
- private:
-  CFXJSE_ScopeUtil_IsolateHandle(const CFXJSE_ScopeUtil_IsolateHandle&) =
-      delete;
-  void operator=(const CFXJSE_ScopeUtil_IsolateHandle&) = delete;
-  void* operator new(size_t size) = delete;
-  void operator delete(void*, size_t) = delete;
-
-  v8::Isolate* m_isolate;
-  v8::Isolate::Scope m_iscope;
-  v8::HandleScope m_hscope;
-};
-
-class CFXJSE_ScopeUtil_IsolateHandleRootContext {
- public:
-  explicit CFXJSE_ScopeUtil_IsolateHandleRootContext(v8::Isolate* pIsolate)
-      : m_parent(pIsolate),
-        m_cscope(v8::Local<v8::Context>::New(
-            pIsolate,
-            CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext)) {}
-
- private:
-  CFXJSE_ScopeUtil_IsolateHandleRootContext(
-      const CFXJSE_ScopeUtil_IsolateHandleRootContext&) = delete;
-  void operator=(const CFXJSE_ScopeUtil_IsolateHandleRootContext&) = delete;
-  void* operator new(size_t size) = delete;
-  void operator delete(void*, size_t) = delete;
-
-  CFXJSE_ScopeUtil_IsolateHandle m_parent;
-  v8::Context::Scope m_cscope;
-};
-
-class CFXJSE_ScopeUtil_IsolateHandleContext {
- public:
-  explicit CFXJSE_ScopeUtil_IsolateHandleContext(CFXJSE_Context* pContext)
-      : m_context(pContext),
-        m_parent(pContext->m_pIsolate),
-        m_cscope(v8::Local<v8::Context>::New(pContext->m_pIsolate,
-                                             pContext->m_hContext)) {}
-  v8::Isolate* GetIsolate() { return m_context->m_pIsolate; }
-  v8::Local<v8::Context> GetLocalContext() {
-    return v8::Local<v8::Context>::New(m_context->m_pIsolate,
-                                       m_context->m_hContext);
-  }
-
- private:
-  CFXJSE_ScopeUtil_IsolateHandleContext(
-      const CFXJSE_ScopeUtil_IsolateHandleContext&) = delete;
-  void operator=(const CFXJSE_ScopeUtil_IsolateHandleContext&) = delete;
-  void* operator new(size_t size) = delete;
-  void operator delete(void*, size_t) = delete;
-
-  CFXJSE_Context* m_context;
-  CFXJSE_ScopeUtil_IsolateHandle m_parent;
-  v8::Context::Scope m_cscope;
-};
-
-#endif  // FXJSE_SCOPE_INLINE_H_
diff --git a/xfa.gyp b/xfa.gyp
index c223ba6..92ae06a 100644
--- a/xfa.gyp
+++ b/xfa.gyp
@@ -37,18 +37,19 @@
         '<(DEPTH)/v8/src/v8.gyp:v8',
       ],
       "sources":[
-        "fxjse/class.cpp",
-        "fxjse/context.cpp",
-        "fxjse/context.h",
-        "fxjse/dynprop.cpp",
-        "fxjse/include/cfxjse_arguments.h",
-        "fxjse/include/cfxjse_class.h",
-        "fxjse/include/cfxjse_value.h",
-        "fxjse/include/fxjse.h",
-        "fxjse/runtime.cpp",
-        "fxjse/runtime.h",
-        "fxjse/scope_inline.h",
-        "fxjse/value.cpp",
+        "fxjs/cfxjse_arguments.cpp",
+        "fxjs/cfxjse_class.cpp",
+        "fxjs/cfxjse_context.cpp",
+        "fxjs/cfxjse_isolatetracker.cpp",
+        "fxjs/cfxjse_isolatetracker.h",
+        "fxjs/cfxjse_runtimedata.cpp",
+        "fxjs/cfxjse_runtimedata.h",
+        "fxjs/cfxjse_value.cpp",
+        "fxjs/include/cfxjse_arguments.h",
+        "fxjs/include/cfxjse_class.h",
+        "fxjs/include/cfxjse_context.h",
+        "fxjs/include/cfxjse_value.h",
+        "fxjs/include/fxjse.h",
         "xfa/fde/cfde_path.cpp",
         "xfa/fde/cfde_path.h",
         "xfa/fde/cfde_txtedtbuf.cpp",
diff --git a/xfa/fxfa/DEPS b/xfa/fxfa/DEPS
index 19fdfab..589b532 100644
--- a/xfa/fxfa/DEPS
+++ b/xfa/fxfa/DEPS
@@ -1,3 +1,3 @@
 include_rules = [
-  '+fxjse/include',
+  '+fxjs/include',
 ]
diff --git a/xfa/fxfa/app/xfa_ffnotify.cpp b/xfa/fxfa/app/xfa_ffnotify.cpp
index d8c32f9..be8268a 100644
--- a/xfa/fxfa/app/xfa_ffnotify.cpp
+++ b/xfa/fxfa/app/xfa_ffnotify.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fxfa/app/xfa_ffnotify.h"
 
-#include "fxjse/include/cfxjse_value.h"
+#include "fxjs/include/cfxjse_value.h"
 #include "xfa/fxfa/app/xfa_ffbarcode.h"
 #include "xfa/fxfa/app/xfa_ffcheckbutton.h"
 #include "xfa/fxfa/app/xfa_ffchoicelist.h"
diff --git a/xfa/fxfa/app/xfa_ffwidgetacc.cpp b/xfa/fxfa/app/xfa_ffwidgetacc.cpp
index dabb316..fec0c20 100644
--- a/xfa/fxfa/app/xfa_ffwidgetacc.cpp
+++ b/xfa/fxfa/app/xfa_ffwidgetacc.cpp
@@ -9,7 +9,7 @@
 #include <algorithm>
 #include <memory>
 
-#include "fxjse/include/cfxjse_value.h"
+#include "fxjs/include/cfxjse_value.h"
 #include "xfa/fde/tto/fde_textout.h"
 #include "xfa/fde/xml/fde_xml_imp.h"
 #include "xfa/fxfa/app/xfa_ffcheckbutton.h"
diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
index 6826094..b5bc675 100644
--- a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
+++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
@@ -9,9 +9,9 @@
 #include <time.h>
 
 #include "core/fxcrt/include/fx_ext.h"
-#include "fxjse/include/cfxjse_arguments.h"
-#include "fxjse/include/cfxjse_class.h"
-#include "fxjse/include/cfxjse_value.h"
+#include "fxjs/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_class.h"
+#include "fxjs/include/cfxjse_value.h"
 #include "xfa/fgas/localization/fgas_locale.h"
 #include "xfa/fxfa/app/xfa_ffnotify.h"
 #include "xfa/fxfa/fm2js/xfa_program.h"
diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.h b/xfa/fxfa/fm2js/xfa_fm2jscontext.h
index 344c4bc..fc98dbb 100644
--- a/xfa/fxfa/fm2js/xfa_fm2jscontext.h
+++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.h
@@ -7,7 +7,8 @@
 #ifndef XFA_FXFA_FM2JS_XFA_FM2JSCONTEXT_H_
 #define XFA_FXFA_FM2JS_XFA_FM2JSCONTEXT_H_
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_context.h"
 #include "xfa/fxfa/parser/xfa_script.h"
 
 class CXFA_FM2JSContext : public CFXJSE_HostObject {
diff --git a/xfa/fxfa/include/fxfa_basic.h b/xfa/fxfa/include/fxfa_basic.h
index 9fe2650..2a37973 100644
--- a/xfa/fxfa/include/fxfa_basic.h
+++ b/xfa/fxfa/include/fxfa_basic.h
@@ -7,8 +7,8 @@
 #ifndef XFA_FXFA_INCLUDE_FXFA_BASIC_H_
 #define XFA_FXFA_INCLUDE_FXFA_BASIC_H_
 
-#include "fxjse/include/cfxjse_arguments.h"
-#include "fxjse/include/fxjse.h"
+#include "fxjs/include/cfxjse_arguments.h"
+#include "fxjs/include/fxjse.h"
 
 class CXFA_Measurement;
 enum class XFA_ObjectType;
diff --git a/xfa/fxfa/parser/cxfa_valuearray.h b/xfa/fxfa/parser/cxfa_valuearray.h
index 3907b4d..4bc59c7 100644
--- a/xfa/fxfa/parser/cxfa_valuearray.h
+++ b/xfa/fxfa/parser/cxfa_valuearray.h
@@ -7,7 +7,7 @@
 #ifndef XFA_FXFA_PARSER_CXFA_VALUEARRAY_H_
 #define XFA_FXFA_PARSER_CXFA_VALUEARRAY_H_
 
-#include "fxjse/include/cfxjse_value.h"
+#include "fxjs/include/cfxjse_value.h"
 #include "xfa/fxfa/include/fxfa.h"
 
 class CXFA_ValueArray : public CFX_ArrayTemplate<CFXJSE_Value*> {
diff --git a/xfa/fxfa/parser/xfa_object.h b/xfa/fxfa/parser/xfa_object.h
index a838b17..268d5c4 100644
--- a/xfa/fxfa/parser/xfa_object.h
+++ b/xfa/fxfa/parser/xfa_object.h
@@ -9,7 +9,7 @@
 
 #include <unordered_set>
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "xfa/fde/xml/fde_xml.h"
 #include "xfa/fxfa/parser/xfa_utils.h"
 
diff --git a/xfa/fxfa/parser/xfa_object_imp.cpp b/xfa/fxfa/parser/xfa_object_imp.cpp
index 871286d..e3d9f6b 100644
--- a/xfa/fxfa/parser/xfa_object_imp.cpp
+++ b/xfa/fxfa/parser/xfa_object_imp.cpp
@@ -9,7 +9,7 @@
 #include <memory>
 
 #include "core/fxcrt/include/fx_ext.h"
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "third_party/base/stl_util.h"
 #include "xfa/fde/xml/fde_xml_imp.h"
 #include "xfa/fgas/crt/fgas_codepage.h"
diff --git a/xfa/fxfa/parser/xfa_script.h b/xfa/fxfa/parser/xfa_script.h
index 020e809..038d2db 100644
--- a/xfa/fxfa/parser/xfa_script.h
+++ b/xfa/fxfa/parser/xfa_script.h
@@ -7,7 +7,7 @@
 #ifndef XFA_FXFA_PARSER_XFA_SCRIPT_H_
 #define XFA_FXFA_PARSER_XFA_SCRIPT_H_
 
-#include "fxjse/include/cfxjse_value.h"
+#include "fxjs/include/cfxjse_value.h"
 #include "xfa/fxfa/include/fxfa.h"
 #include "xfa/fxfa/parser/cxfa_valuearray.h"
 
diff --git a/xfa/fxfa/parser/xfa_script_datawindow.cpp b/xfa/fxfa/parser/xfa_script_datawindow.cpp
index 8e37e00..e953206 100644
--- a/xfa/fxfa/parser/xfa_script_datawindow.cpp
+++ b/xfa/fxfa/parser/xfa_script_datawindow.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fxfa/parser/xfa_script_datawindow.h"
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "xfa/fxfa/parser/xfa_doclayout.h"
 #include "xfa/fxfa/parser/xfa_document.h"
 #include "xfa/fxfa/parser/xfa_localemgr.h"
diff --git a/xfa/fxfa/parser/xfa_script_datawindow.h b/xfa/fxfa/parser/xfa_script_datawindow.h
index 05ecf8d..ea8e6ad 100644
--- a/xfa/fxfa/parser/xfa_script_datawindow.h
+++ b/xfa/fxfa/parser/xfa_script_datawindow.h
@@ -7,7 +7,7 @@
 #ifndef XFA_FXFA_PARSER_XFA_SCRIPT_DATAWINDOW_H_
 #define XFA_FXFA_PARSER_XFA_SCRIPT_DATAWINDOW_H_
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "xfa/fxfa/parser/xfa_object.h"
 
 class CScript_DataWindow : public CXFA_Object {
diff --git a/xfa/fxfa/parser/xfa_script_eventpseudomodel.cpp b/xfa/fxfa/parser/xfa_script_eventpseudomodel.cpp
index ef724e4..507aef3 100644
--- a/xfa/fxfa/parser/xfa_script_eventpseudomodel.cpp
+++ b/xfa/fxfa/parser/xfa_script_eventpseudomodel.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fxfa/parser/xfa_script_eventpseudomodel.h"
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "xfa/fxfa/app/xfa_ffnotify.h"
 #include "xfa/fxfa/include/cxfa_eventparam.h"
 #include "xfa/fxfa/include/xfa_ffwidgethandler.h"
diff --git a/xfa/fxfa/parser/xfa_script_eventpseudomodel.h b/xfa/fxfa/parser/xfa_script_eventpseudomodel.h
index 9eb3912..c52d3ce 100644
--- a/xfa/fxfa/parser/xfa_script_eventpseudomodel.h
+++ b/xfa/fxfa/parser/xfa_script_eventpseudomodel.h
@@ -7,7 +7,7 @@
 #ifndef XFA_FXFA_PARSER_XFA_SCRIPT_EVENTPSEUDOMODEL_H_
 #define XFA_FXFA_PARSER_XFA_SCRIPT_EVENTPSEUDOMODEL_H_
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "xfa/fxfa/parser/xfa_object.h"
 
 enum class XFA_Event {
diff --git a/xfa/fxfa/parser/xfa_script_hostpseudomodel.cpp b/xfa/fxfa/parser/xfa_script_hostpseudomodel.cpp
index 37ed181..8bc7169 100644
--- a/xfa/fxfa/parser/xfa_script_hostpseudomodel.cpp
+++ b/xfa/fxfa/parser/xfa_script_hostpseudomodel.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fxfa/parser/xfa_script_hostpseudomodel.h"
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "xfa/fxfa/app/xfa_ffnotify.h"
 #include "xfa/fxfa/parser/xfa_doclayout.h"
 #include "xfa/fxfa/parser/xfa_document.h"
diff --git a/xfa/fxfa/parser/xfa_script_hostpseudomodel.h b/xfa/fxfa/parser/xfa_script_hostpseudomodel.h
index e131b6f..cabaabc 100644
--- a/xfa/fxfa/parser/xfa_script_hostpseudomodel.h
+++ b/xfa/fxfa/parser/xfa_script_hostpseudomodel.h
@@ -7,7 +7,7 @@
 #ifndef XFA_FXFA_PARSER_XFA_SCRIPT_HOSTPSEUDOMODEL_H_
 #define XFA_FXFA_PARSER_XFA_SCRIPT_HOSTPSEUDOMODEL_H_
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "xfa/fxfa/parser/xfa_document.h"
 #include "xfa/fxfa/parser/xfa_object.h"
 
diff --git a/xfa/fxfa/parser/xfa_script_imp.cpp b/xfa/fxfa/parser/xfa_script_imp.cpp
index 95298e4..e426c1e 100644
--- a/xfa/fxfa/parser/xfa_script_imp.cpp
+++ b/xfa/fxfa/parser/xfa_script_imp.cpp
@@ -7,9 +7,9 @@
 #include "xfa/fxfa/parser/xfa_script_imp.h"
 
 #include "core/fxcrt/include/fx_ext.h"
-#include "fxjse/include/cfxjse_arguments.h"
-#include "fxjse/include/cfxjse_class.h"
-#include "fxjse/include/cfxjse_value.h"
+#include "fxjs/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_class.h"
+#include "fxjs/include/cfxjse_value.h"
 #include "xfa/fxfa/app/xfa_ffnotify.h"
 #include "xfa/fxfa/include/cxfa_eventparam.h"
 #include "xfa/fxfa/parser/xfa_doclayout.h"
diff --git a/xfa/fxfa/parser/xfa_script_imp.h b/xfa/fxfa/parser/xfa_script_imp.h
index c6bb148..5356679 100644
--- a/xfa/fxfa/parser/xfa_script_imp.h
+++ b/xfa/fxfa/parser/xfa_script_imp.h
@@ -11,7 +11,7 @@
 #include <memory>
 #include <vector>
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "xfa/fxfa/fm2js/xfa_fm2jscontext.h"
 #include "xfa/fxfa/include/cxfa_eventparam.h"
 #include "xfa/fxfa/parser/xfa_document.h"
diff --git a/xfa/fxfa/parser/xfa_script_layoutpseudomodel.cpp b/xfa/fxfa/parser/xfa_script_layoutpseudomodel.cpp
index 3567a5a..977b83f 100644
--- a/xfa/fxfa/parser/xfa_script_layoutpseudomodel.cpp
+++ b/xfa/fxfa/parser/xfa_script_layoutpseudomodel.cpp
@@ -8,7 +8,7 @@
 
 #include <set>
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "third_party/base/stl_util.h"
 #include "xfa/fxfa/app/xfa_ffnotify.h"
 #include "xfa/fxfa/parser/xfa_doclayout.h"
diff --git a/xfa/fxfa/parser/xfa_script_layoutpseudomodel.h b/xfa/fxfa/parser/xfa_script_layoutpseudomodel.h
index 0977f32..1e61c42 100644
--- a/xfa/fxfa/parser/xfa_script_layoutpseudomodel.h
+++ b/xfa/fxfa/parser/xfa_script_layoutpseudomodel.h
@@ -7,7 +7,7 @@
 #ifndef XFA_FXFA_PARSER_XFA_SCRIPT_LAYOUTPSEUDOMODEL_H_
 #define XFA_FXFA_PARSER_XFA_SCRIPT_LAYOUTPSEUDOMODEL_H_
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "xfa/fxfa/parser/xfa_doclayout.h"
 #include "xfa/fxfa/parser/xfa_object.h"
 
diff --git a/xfa/fxfa/parser/xfa_script_logpseudomodel.cpp b/xfa/fxfa/parser/xfa_script_logpseudomodel.cpp
index 800a805..57909cd 100644
--- a/xfa/fxfa/parser/xfa_script_logpseudomodel.cpp
+++ b/xfa/fxfa/parser/xfa_script_logpseudomodel.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fxfa/parser/xfa_script_logpseudomodel.h"
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "xfa/fxfa/parser/xfa_doclayout.h"
 #include "xfa/fxfa/parser/xfa_document.h"
 #include "xfa/fxfa/parser/xfa_localemgr.h"
diff --git a/xfa/fxfa/parser/xfa_script_logpseudomodel.h b/xfa/fxfa/parser/xfa_script_logpseudomodel.h
index d344fd5..917bbdc 100644
--- a/xfa/fxfa/parser/xfa_script_logpseudomodel.h
+++ b/xfa/fxfa/parser/xfa_script_logpseudomodel.h
@@ -7,7 +7,7 @@
 #ifndef XFA_FXFA_PARSER_XFA_SCRIPT_LOGPSEUDOMODEL_H_
 #define XFA_FXFA_PARSER_XFA_SCRIPT_LOGPSEUDOMODEL_H_
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "xfa/fxfa/parser/xfa_object.h"
 
 class CScript_LogPseudoModel : public CXFA_Object {
diff --git a/xfa/fxfa/parser/xfa_script_signaturepseudomodel.cpp b/xfa/fxfa/parser/xfa_script_signaturepseudomodel.cpp
index 45c0f7c..0341fc1 100644
--- a/xfa/fxfa/parser/xfa_script_signaturepseudomodel.cpp
+++ b/xfa/fxfa/parser/xfa_script_signaturepseudomodel.cpp
@@ -6,7 +6,7 @@
 
 #include "xfa/fxfa/parser/xfa_script_signaturepseudomodel.h"
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "xfa/fxfa/app/xfa_ffnotify.h"
 #include "xfa/fxfa/parser/xfa_doclayout.h"
 #include "xfa/fxfa/parser/xfa_document.h"
diff --git a/xfa/fxfa/parser/xfa_script_signaturepseudomodel.h b/xfa/fxfa/parser/xfa_script_signaturepseudomodel.h
index 0ced36c..56f5e5d 100644
--- a/xfa/fxfa/parser/xfa_script_signaturepseudomodel.h
+++ b/xfa/fxfa/parser/xfa_script_signaturepseudomodel.h
@@ -7,7 +7,7 @@
 #ifndef XFA_FXFA_PARSER_XFA_SCRIPT_SIGNATUREPSEUDOMODEL_H_
 #define XFA_FXFA_PARSER_XFA_SCRIPT_SIGNATUREPSEUDOMODEL_H_
 
-#include "fxjse/include/cfxjse_arguments.h"
+#include "fxjs/include/cfxjse_arguments.h"
 #include "xfa/fxfa/parser/xfa_object.h"
 
 class CScript_SignaturePseudoModel : public CXFA_Object {
