diff --git a/fpdfsdk/include/jsapi/fxjs_v8.h b/fpdfsdk/include/jsapi/fxjs_v8.h
index f5d6992..b4dac71 100644
--- a/fpdfsdk/include/jsapi/fxjs_v8.h
+++ b/fpdfsdk/include/jsapi/fxjs_v8.h
@@ -63,7 +63,7 @@
 
 void							JS_InitialRuntime(IJS_Runtime* pJSRuntime,IFXJS_Runtime* pFXRuntime, IFXJS_Context* context, v8::Global<v8::Context>& v8PersistentContext);
 void							JS_ReleaseRuntime(IJS_Runtime* pJSRuntime, v8::Global<v8::Context>& v8PersistentContext);
-void							JS_Initial();
+void							JS_Initial(unsigned int embedderDataSlot);
 void							JS_Release();
 int								JS_Parse(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror);
 int								JS_Execute(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror);
diff --git a/fpdfsdk/src/javascript/JS_Runtime.cpp b/fpdfsdk/src/javascript/JS_Runtime.cpp
index b26f5a2..f21819a 100644
--- a/fpdfsdk/src/javascript/JS_Runtime.cpp
+++ b/fpdfsdk/src/javascript/JS_Runtime.cpp
@@ -35,7 +35,11 @@
 {
 	if (!m_bInit)
 	{
-		JS_Initial();
+		unsigned int embedderDataSlot = 0;
+		if (pApp->GetFormFillInfo()->m_pJsPlatform->version >= 2) {
+			embedderDataSlot = pApp->GetFormFillInfo()->m_pJsPlatform->m_v8EmbedderSlot;
+                }
+		JS_Initial(embedderDataSlot);
 		m_bInit = TRUE;
 	}
 	return new CJS_Runtime(pApp);
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp
index 7adfc26..feed779 100644
--- a/fpdfsdk/src/jsapi/fxjs_v8.cpp
+++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp
@@ -26,6 +26,7 @@
 {
   return *(double*)g_nan;
 }
+static unsigned int g_embedderDataSlot = 0u;
 
 
 class CJS_PrivateData
@@ -79,11 +80,11 @@
 	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
 	v8::Isolate::Scope isolate_scope(isolate);
 	v8::HandleScope handle_scope(isolate);
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray)
 	{
 		pArray = new CFX_PtrArray();
-		isolate->SetData(0, pArray);
+		isolate->SetData(g_embedderDataSlot, pArray);
 	}
 	CJS_ObjDefintion* pObjDef = new CJS_ObjDefintion(isolate, sObjName, eObjType, pConstructor, pDestructor, bApplyNew);
 	pArray->Add(pObjDef);
@@ -99,7 +100,7 @@
 	CFX_WideString ws = CFX_WideString(sMethodName);
 	CFX_ByteString bsMethodName = ws.UTF8Encode();
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return 0;
 
 	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
@@ -119,7 +120,7 @@
 	CFX_WideString ws = CFX_WideString(sPropName);
 	CFX_ByteString bsPropertyName = ws.UTF8Encode();
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return 0;
 
 	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
@@ -136,7 +137,7 @@
 	v8::Isolate::Scope isolate_scope(isolate);
 	v8::HandleScope handle_scope(isolate);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return 0;
 
 	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
@@ -153,7 +154,7 @@
 	v8::Isolate::Scope isolate_scope(isolate);
 	v8::HandleScope handle_scope(isolate);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return 0;
 
 	CFX_WideString ws = CFX_WideString(sConstName);
@@ -173,7 +174,7 @@
 	v8::Isolate::Scope isolate_scope(isolate);
 	v8::HandleScope handle_scope(isolate);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	ASSERT(pArray != NULL);
 	for(int i=0; i<pArray->GetSize(); i++)
 	{
@@ -246,7 +247,7 @@
 	v8::Local<v8::External> ptr = v8::External::New(isolate, pFXRuntime);
 	v8Context->SetEmbedderData(1, ptr);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return;
 
 	for(int i=0; i<pArray->GetSize(); i++)
@@ -290,7 +291,7 @@
 	v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, v8PersistentContext);
 	v8::Context::Scope context_scope(context);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return ;
 
 	for(int i=0; i<pArray->GetSize(); i++)
@@ -306,11 +307,12 @@
 		delete pObjDef;
 	}
 	delete pArray;
-	isolate->SetData(0,NULL);
+	isolate->SetData(g_embedderDataSlot,NULL);
 }
 
-void JS_Initial()
+void JS_Initial(unsigned int embedderDataSlot)
 {
+	g_embedderDataSlot = embedderDataSlot;
 }
 void JS_Release()
 {
@@ -372,7 +374,7 @@
                 return v8::Local<v8::Object>();
 	}
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return v8::Local<v8::Object>();
 
 
@@ -398,7 +400,7 @@
 	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
 	v8::Isolate::Scope isolate_scope(isolate);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return v8::Local<v8::Object>();
 
 	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Local<v8::Object>();
@@ -417,7 +419,7 @@
 	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
 	v8::Isolate::Scope isolate_scope(isolate);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return v8::Local<v8::Object>();
 
 	v8::Local<v8::Context> context = isolate->GetCurrentContext();
@@ -446,7 +448,7 @@
 	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
 	v8::Isolate::Scope isolate_scope(isolate);
 
-	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot);
 	if(!pArray) return -1;
 
 	for(int i=0; i<pArray->GetSize(); i++)
diff --git a/public/fpdf_formfill.h b/public/fpdf_formfill.h
index 1cc5551..22ebc61 100644
--- a/public/fpdf_formfill.h
+++ b/public/fpdf_formfill.h
@@ -231,6 +231,13 @@
     *   pointer to the v8::Isolate to use, or NULL to force PDFium to create one.
     **/
     void*   m_isolate;
+
+    /**
+     *   The embedder data slot to use in the v8::Isolate to store PDFium's
+     *   per-isolate data. The value needs to be between 0 and
+     *   v8::Internals::kNumIsolateDataLots (exclusive).
+     */
+    unsigned int m_v8EmbedderSlot;
 } IPDF_JSPLATFORM;
 
 // Flags for Cursor type
