diff --git a/buildspecs/j9.flags b/buildspecs/j9.flags
index 1fb97701cd9..5dffddd3b0a 100644
--- a/buildspecs/j9.flags
+++ b/buildspecs/j9.flags
@@ -999,14 +999,14 @@ all data is stored in their own region. It additionaly reduces footprint, mainly
DEBUGGING FEATURE. Determines if the interpreter produces debug information at every bytecode.
No full trace available.
-
- Debug mode for tracing uses of updateVMStruct
- No tracing of updateVMStruct helpers
-
Exclusive VM access - Set halt bit in one pass, count responders in another pass
Set and count in a single pass
+
+ Debug mode for tracing uses of updateVMStruct
+ No tracing of updateVMStruct helpers
+
If set, use helper functions in UnsafeAPI to access native memory
diff --git a/runtime/cmake/caches/aix_ppc-64.cmake b/runtime/cmake/caches/aix_ppc-64.cmake
index 313fea30cb0..e23638bc692 100644
--- a/runtime/cmake/caches/aix_ppc-64.cmake
+++ b/runtime/cmake/caches/aix_ppc-64.cmake
@@ -32,6 +32,9 @@ set(OMR_GC_TLH_PREFETCH_FTA OFF CACHE BOOL "")
set(J9VM_PORT_RUNTIME_INSTRUMENTATION ON CACHE BOOL "")
set(J9VM_MODULE_CODEGEN_PPC ON CACHE BOOL "")
set(J9VM_GC_IDLE_HEAP_MANAGER OFF CACHE BOOL "")
+set(J9VM_INTERP_ATOMIC_FREE_JNI ON CACHE BOOL "")
+set(J9VM_INTERP_ATOMIC_FREE_JNI_USES_FLUSH ON CACHE BOOL "")
+set(J9VM_INTERP_TWO_PASS_EXCLUSIVE ON CACHE BOOL "")
set(J9VM_OPT_SWITCH_STACKS_FOR_SIGNAL_HANDLER OFF CACHE BOOL "")
set(J9VM_THR_ASYNC_NAME_UPDATE OFF CACHE BOOL "")
diff --git a/runtime/cmake/caches/linux_ppc-64_le_gcc.cmake b/runtime/cmake/caches/linux_ppc-64_le_gcc.cmake
index d6c3d6fb5eb..af0d8166f42 100644
--- a/runtime/cmake/caches/linux_ppc-64_le_gcc.cmake
+++ b/runtime/cmake/caches/linux_ppc-64_le_gcc.cmake
@@ -35,6 +35,9 @@ set(J9VM_PORT_RUNTIME_INSTRUMENTATION ON CACHE BOOL "")
set(J9VM_MODULE_CODEGEN_PPC ON CACHE BOOL "")
set(J9VM_MODULE_THRTRACE ON CACHE BOOL "")
set(J9VM_GC_IDLE_HEAP_MANAGER OFF CACHE BOOL "")
+set(J9VM_INTERP_ATOMIC_FREE_JNI ON CACHE BOOL "")
+set(J9VM_INTERP_ATOMIC_FREE_JNI_USES_FLUSH ON CACHE BOOL "")
+set(J9VM_INTERP_TWO_PASS_EXCLUSIVE ON CACHE BOOL "")
set(J9VM_OPT_SWITCH_STACKS_FOR_SIGNAL_HANDLER OFF CACHE BOOL "")
set(J9VM_PORT_RUNTIME_INSTRUMENTATION ON CACHE BOOL "")
diff --git a/runtime/cmake/caches/linux_x86-64.cmake b/runtime/cmake/caches/linux_x86-64.cmake
index 42f9f39c00e..7ae5608250f 100644
--- a/runtime/cmake/caches/linux_x86-64.cmake
+++ b/runtime/cmake/caches/linux_x86-64.cmake
@@ -33,6 +33,9 @@ set(J9VM_MODULE_JIT_IA32 ON CACHE BOOL "")
set(J9VM_MODULE_JITRT_IA32 ON CACHE BOOL "")
set(J9VM_MODULE_MASM2GAS ON CACHE BOOL "")
set(J9VM_GC_IDLE_HEAP_MANAGER ON CACHE BOOL "")
+set(J9VM_INTERP_ATOMIC_FREE_JNI ON CACHE BOOL "")
+set(J9VM_INTERP_ATOMIC_FREE_JNI_USES_FLUSH ON CACHE BOOL "")
+set(J9VM_INTERP_TWO_PASS_EXCLUSIVE ON CACHE BOOL "")
set(J9VM_OPT_SWITCH_STACKS_FOR_SIGNAL_HANDLER ON CACHE BOOL "")
set(OMR_GC_IDLE_HEAP_MANAGER ON CACHE BOOL "")
diff --git a/runtime/cmake/caches/osx_x86-64.cmake b/runtime/cmake/caches/osx_x86-64.cmake
index d759e4f9c9c..06f81caea5c 100644
--- a/runtime/cmake/caches/osx_x86-64.cmake
+++ b/runtime/cmake/caches/osx_x86-64.cmake
@@ -34,6 +34,9 @@ set(J9VM_MODULE_JIT_IA32 ON CACHE BOOL "")
set(J9VM_MODULE_JITRT_IA32 ON CACHE BOOL "")
set(J9VM_MODULE_MASM2GAS ON CACHE BOOL "")
set(J9VM_GC_IDLE_HEAP_MANAGER ON CACHE BOOL "")
+set(J9VM_INTERP_ATOMIC_FREE_JNI ON CACHE BOOL "")
+set(J9VM_INTERP_ATOMIC_FREE_JNI_USES_FLUSH ON CACHE BOOL "")
+set(J9VM_INTERP_TWO_PASS_EXCLUSIVE ON CACHE BOOL "")
set(J9VM_OPT_SWITCH_STACKS_FOR_SIGNAL_HANDLER ON CACHE BOOL "")
set(OMR_PORT_NUMA_SUPPORT ON CACHE BOOL "")
diff --git a/runtime/cmake/caches/win_x86-64.cmake b/runtime/cmake/caches/win_x86-64.cmake
index 8995acdfab8..a934bc8e046 100644
--- a/runtime/cmake/caches/win_x86-64.cmake
+++ b/runtime/cmake/caches/win_x86-64.cmake
@@ -27,6 +27,9 @@ set(J9VM_ENV_LITTLE_ENDIAN ON CACHE BOOL "")
set(J9VM_ENV_HAS_FPU OFF CACHE INTERNAL "")
set(OMR_GC_IDLE_HEAP_MANAGER OFF CACHE BOOL "")
set(J9VM_GC_IDLE_HEAP_MANAGER OFF CACHE BOOL "")
+set(J9VM_INTERP_ATOMIC_FREE_JNI ON CACHE BOOL "")
+set(J9VM_INTERP_ATOMIC_FREE_JNI_USES_FLUSH ON CACHE BOOL "")
+set(J9VM_INTERP_TWO_PASS_EXCLUSIVE ON CACHE BOOL "")
set(J9VM_INTERP_USE_UNSAFE_HELPER OFF CACHE BOOL "")
set(J9VM_MODULE_GDB OFF CACHE BOOL "")
set(J9VM_MODULE_GDB_PLUGIN OFF CACHE BOOL "")
diff --git a/runtime/cmake/options.cmake b/runtime/cmake/options.cmake
index 8e022aadd67..e684110d4f7 100644
--- a/runtime/cmake/options.cmake
+++ b/runtime/cmake/options.cmake
@@ -78,6 +78,7 @@ j9vm_shadowed_option(J9VM_GC_VLHGC "Enables the Very Large Heap Garbage Collect
option(J9VM_INTERP_AOT_COMPILE_SUPPORT "Controls if the AOT compilation support is included in the VM")
option(J9VM_INTERP_AOT_RUNTIME_SUPPORT "Controls if the AOT runtime support is included in the VM")
option(J9VM_INTERP_ATOMIC_FREE_JNI "Use the new atomic-free JNI support")
+option(J9VM_INTERP_ATOMIC_FREE_JNI_USES_FLUSH "Atomic free uses FlushProcessWriteBuffers instead of barriers")
option(J9VM_INTERP_BYTECODE_PREVERIFICATION "Does this VM support 1st pass bytecode verification (able to dynamically generate pre-verify data)")
option(J9VM_INTERP_BYTECODE_VERIFICATION "Does this VM support 2nd pass bytecode verification (pre-verify data in .jxe only)")
@@ -105,7 +106,7 @@ option(J9VM_INTERP_ROMABLE_AOT_SUPPORT "ROMable AOT Support for TJ Watson")
option(J9VM_INTERP_TRACING "DEBUGGING FEATURE. Determines if the interpreter produces debug information at every bytecode.")
-
+option(J9VM_INTERP_TWO_PASS_EXCLUSIVE "Exclusive VM access - Set halt bit in one pass, count responders in another pass")
option(J9VM_INTERP_USE_SPLIT_SIDE_TABLES "Use split side tables for handling constant pool entry shared between multiple invoke bytecodes")
option(J9VM_INTERP_USE_UNSAFE_HELPER "If set, use helper functions in UnsafeAPI to access native memory")
diff --git a/runtime/include/j9cfg.h.in b/runtime/include/j9cfg.h.in
index b78f85a9968..ed1e3a66ee3 100644
--- a/runtime/include/j9cfg.h.in
+++ b/runtime/include/j9cfg.h.in
@@ -148,6 +148,7 @@ extern "C" {
#cmakedefine J9VM_INTERP_AOT_COMPILE_SUPPORT
#cmakedefine J9VM_INTERP_AOT_RUNTIME_SUPPORT
#cmakedefine J9VM_INTERP_ATOMIC_FREE_JNI
+#cmakedefine J9VM_INTERP_ATOMIC_FREE_JNI_USES_FLUSH
#cmakedefine J9VM_INTERP_BYTECODE_PREVERIFICATION
#cmakedefine J9VM_INTERP_BYTECODE_VERIFICATION
#cmakedefine J9VM_INTERP_COMPRESSED_OBJECT_HEADER
@@ -173,6 +174,7 @@ extern "C" {
#cmakedefine J9VM_INTERP_SIG_QUIT_THREAD_USES_SEMAPHORES
#cmakedefine J9VM_INTERP_SMALL_MONITOR_SLOT
#cmakedefine J9VM_INTERP_TRACING
+#cmakedefine J9VM_INTERP_TWO_PASS_EXCLUSIVE
#cmakedefine J9VM_INTERP_UPDATE_VMCTRACING
#cmakedefine J9VM_INTERP_USE_SPLIT_SIDE_TABLES
#cmakedefine J9VM_INTERP_USE_UNSAFE_HELPER
diff --git a/runtime/vm/CMakeLists.txt b/runtime/vm/CMakeLists.txt
index 874388abcaf..8c92ef56b45 100644
--- a/runtime/vm/CMakeLists.txt
+++ b/runtime/vm/CMakeLists.txt
@@ -1,5 +1,5 @@
################################################################################
-# Copyright (c) 2017, 2019 IBM Corp. and others
+# Copyright (c) 2017, 2020 IBM Corp. and others
#
# This program and the accompanying materials are made available under
# the terms of the Eclipse Public License 2.0 which accompanies this
@@ -55,6 +55,7 @@ add_library(j9vm SHARED
FastJNI_java_lang_Throwable.cpp
FastJNI_sun_misc_Unsafe.cpp
findmethod.c
+ FlushProcessWriteBuffers.cpp
gphandle.c
growstack.cpp
guardedstorage.c