diff --git a/CMakeLists.txt b/CMakeLists.txt
index d97a54ebea76170261841a63fa885d588f0fef85..fda59429eec07dbc1c47d97474c651f877cb5f9a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -34,6 +34,9 @@ if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
     ${ADIOS2_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
 endif()
 
+# Let windows builds auto-export dll symbols
+set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
+
 #------------------------------------------------------------------------------#
 # Top level options
 #------------------------------------------------------------------------------#
@@ -64,14 +67,15 @@ if(ADIOS2_ENABLE_PIC)
   set(CMAKE_POSITION_INDEPENDENT_CODE ON)
 endif()
 
-adios_option(BZip2   "Enable support for BZip2 transforms" AUTO)
-adios_option(ZFP     "Enable support for ZFP transforms" AUTO)
-adios_option(MPI     "Enable support for MPI" AUTO)
-adios_option(DataMan "Enable support for DataMan" AUTO)
-adios_option(ZeroMQ  "Enable support for ZeroMQ" AUTO)
-adios_option(HDF5    "Enable support for the HDF5 engine" AUTO)
-adios_option(ADIOS1  "Enable support for the ADIOS 1 engine" AUTO)
-adios_option(Python  "Enable support for Python bindings" AUTO)
+adios_option(BZip2     "Enable support for BZip2 transforms" AUTO)
+adios_option(ZFP       "Enable support for ZFP transforms" AUTO)
+adios_option(MPI       "Enable support for MPI" AUTO)
+adios_option(DataMan   "Enable support for DataMan" AUTO)
+adios_option(ZeroMQ    "Enable support for ZeroMQ" AUTO)
+adios_option(HDF5      "Enable support for the HDF5 engine" AUTO)
+adios_option(ADIOS1    "Enable support for the ADIOS 1 engine" AUTO)
+adios_option(Python    "Enable support for Python bindings" AUTO)
+adios_option(SysVShMem "Enable support for SysV Shared Memory IPC on *NIX" AUTO)
 include(${ADIOS2_SOURCE_DIR}/cmake/DetectOptions.cmake)
 
 if(ADIOS2_HAVE_MPI)
@@ -79,7 +83,7 @@ if(ADIOS2_HAVE_MPI)
   add_definitions(-DOMPI_SKIP_MPICXX)
 endif()
 
-GenerateADIOSConfig(MPI ZFP BZip2 ADIOS1 HDF5 DataMan Python)
+GenerateADIOSConfig(MPI ZFP BZip2 ADIOS1 HDF5 DataMan Python SysVShMem)
 install(
   FILES ${ADIOS2_BINARY_DIR}/adios2/ADIOSConfig.h
   DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/adios2
@@ -140,8 +144,8 @@ endif()
 message("    Build Type:   ${CMAKE_BUILD_TYPE}")
 message("    Testing: ${BUILD_TESTING}")
 message("    Build Options:")
-foreach(opt BZip2 ZFP MPI DataMan ZeroMQ HDF5 ADIOS1 Python)
-  message_pad("      ${opt}" 13 label)
+foreach(opt BZip2 ZFP MPI DataMan ZeroMQ HDF5 ADIOS1 Python SysVShMem)
+  message_pad("      ${opt}" 15 label)
   if(${ADIOS2_HAVE_${opt}})
     message("${label}: ON")
   else()
diff --git a/cmake/DetectOptions.cmake b/cmake/DetectOptions.cmake
index 562a6b30f4337e79e7ea3571d02ed40cb61b12b3..29237fcc40c2de892369101077f23c1b880161f3 100644
--- a/cmake/DetectOptions.cmake
+++ b/cmake/DetectOptions.cmake
@@ -106,3 +106,20 @@ if(ADIOS2_USE_Python STREQUAL AUTO)
 elseif(ADIOS2_USE_Python)
   set(ADIOS2_HAVE_Python TRUE)
 endif()
+
+#SysV IPC
+if(ADIOS2_USE_SysVShMem STREQUAL AUTO)
+  if(UNIX)
+    include(CheckSymbolExists)
+	CHECK_SYMBOL_EXISTS(shmget "sys/ipc.h;sys/shm.h" HAVE_shmget)
+	if(HAVE_shmget)
+	  set(ADIOS2_HAVE_SysVShMem ON)
+	else()
+	  set(ADIOS2_HAVE_SysVShMem OFF)
+	endif()
+  else()
+    set(ADIOS2_HAVE_SysVShMem OFF)
+  endif()
+elseif(ADIOS2_USE_SysVShMem)
+  set(ADIOS2_HAVE_SysVShMem)
+endif()
\ No newline at end of file
diff --git a/source/adios2/ADIOSConfig.h.in b/source/adios2/ADIOSConfig.h.in
index 046923c2c464f4397570acf086803232b9b58e89..c917b81a8b1a06b2b43b4844cd1715e70ebff69e 100644
--- a/source/adios2/ADIOSConfig.h.in
+++ b/source/adios2/ADIOSConfig.h.in
@@ -45,4 +45,7 @@
 /* CMake Option: ADIOS_USE_Python=ON */
 #cmakedefine ADIOS2_HAVE_PYTHON
 
+/* CMake Option: ADIOS_USE_SysVShMem=ON */
+#cmakedefine ADIOS2_HAVE_SYSVSHMEM
+
 #endif /* ADIOSCONFIG_H_ */
diff --git a/source/adios2/ADIOSTypes.h b/source/adios2/ADIOSTypes.h
index 458193c719e81c8637f0a7f99a1bc87560fb7021..b689e840c3f55bbd4a309b67d69a6cda456913a1 100644
--- a/source/adios2/ADIOSTypes.h
+++ b/source/adios2/ADIOSTypes.h
@@ -141,7 +141,11 @@ enum class SelectionType
 };
 
 // adios defaults
+#ifdef _WIN32
+const std::string DefaultFileLibrary("stdio");
+#else
 const std::string DefaultFileLibrary("POSIX");
+#endif
 const std::string DefaultTimeUnit("Microseconds");
 constexpr TimeUnit DefaultTimeUnitEnum(TimeUnit::Microseconds);
 
diff --git a/source/adios2/CMakeLists.txt b/source/adios2/CMakeLists.txt
index 7617d7b832cfb79353d1260f2d8c00bf7778e477..651b7bc5985d7417ced44eabca06e5a72f0b0c7a 100644
--- a/source/adios2/CMakeLists.txt
+++ b/source/adios2/CMakeLists.txt
@@ -27,8 +27,7 @@ add_library(adios2
 
   toolkit/capsule/Capsule.cpp
   toolkit/capsule/heap/STLVector.cpp 
-  toolkit/capsule/shmem/ShmSystemV.cpp
-
+ 
   toolkit/format/bp1/BP1Base.cpp toolkit/format/bp1/BP1Base.tcc
   toolkit/format/bp1/BP1Aggregator.cpp
   toolkit/format/bp1/BP1Writer.cpp toolkit/format/bp1/BP1Writer.tcc
@@ -36,7 +35,6 @@ add_library(adios2
   toolkit/profiling/iochrono/Timer.cpp
 
   toolkit/transport/Transport.cpp
-  toolkit/transport/file/FileDescriptor.cpp
   toolkit/transport/file/FilePointer.cpp
   toolkit/transport/file/FileStream.cpp
   
@@ -50,10 +48,19 @@ target_include_directories(adios2
     $<INSTALL_INTERFACE:include>
   PRIVATE ${ADIOS2_SOURCE_DIR}/source
 )
+target_link_libraries(adios2 PRIVATE adios2sys)
 
 find_package(Threads REQUIRED)
 target_link_libraries(adios2 PUBLIC ${CMAKE_THREAD_LIBS_INIT})
 
+if(UNIX)
+  target_sources(adios2 PRIVATE toolkit/transport/file/FileDescriptor.cpp)
+endif()
+
+if(ADIOS2_HAVE_SysVShMem)
+  target_sources(adios2 PRIVATE toolkit/capsule/shmem/ShmSystemV.cpp)
+endif()
+
 if(ADIOS2_HAVE_DataMan)
   target_sources(adios2 PRIVATE
     engine/dataman/DataManReader.cpp
diff --git a/source/adios2/engine/bp/BPFileWriter.cpp b/source/adios2/engine/bp/BPFileWriter.cpp
index f6001622cd7df534bb1bf530e2f0c4c73e90f786..c8e6fcef4b5d0dffbd5e605e9fcca9544eefc0dd 100644
--- a/source/adios2/engine/bp/BPFileWriter.cpp
+++ b/source/adios2/engine/bp/BPFileWriter.cpp
@@ -14,8 +14,6 @@
 #include "adios2/ADIOSMPI.h"
 #include "adios2/core/IO.h"
 #include "adios2/helper/adiosFunctions.h" //CheckIndexRange
-#include "adios2/toolkit/transport/file/FileDescriptor.h"
-#include "adios2/toolkit/transport/file/FilePointer.h"
 #include "adios2/toolkit/transport/file/FileStream.h"
 
 namespace adios2
diff --git a/source/adios2/helper/adiosSystem.cpp b/source/adios2/helper/adiosSystem.cpp
index 24cda3d57021ade4815a96bf3ed38edb26d5cf88..8e0b967c5e0d07b8620c29dce7beadaf8693a2f6 100644
--- a/source/adios2/helper/adiosSystem.cpp
+++ b/source/adios2/helper/adiosSystem.cpp
@@ -9,12 +9,11 @@
  */
 #include "adiosSystem.h"
 
-#include <sys/stat.h>  //stat, mkdir
-#include <sys/types.h> //CreateDirectory
-#include <unistd.h>    //CreateDirectory
+#include <ctime> //std::ctime
 
 #include <chrono> //system_clock, now
-#include <ctime>  //std::ctime
+
+#include <adios2sys/SystemTools.hxx>
 
 #include "adios2/ADIOSMPI.h"
 #include "adios2/ADIOSTypes.h"
@@ -25,44 +24,7 @@ namespace adios2
 
 bool CreateDirectory(const std::string &fullPath) noexcept
 {
-    auto lf_Mkdir = [](const std::string directory, struct stat &st) -> bool {
-        if (stat(directory.c_str(), &st) == -1) // doesn't exist
-        {
-            mkdir(directory.c_str(), 0777);
-            if (stat(directory.c_str(), &st) == -1) // doesn't exist
-            {
-                return false;
-            }
-        }
-        return true;
-    };
-
-    bool directoryExists = false;
-    auto directoryPosition = fullPath.find("/");
-
-    if (fullPath[0] == '/' || fullPath[0] == '.')
-    { // find the second '/'
-        directoryPosition = fullPath.find("/", directoryPosition + 1);
-    }
-
-    struct stat st = {0};
-    if (directoryPosition == fullPath.npos) // no subdirectories
-    {
-        directoryExists = lf_Mkdir(fullPath.c_str(), st);
-    }
-    else
-    {
-        std::string directory(fullPath.substr(0, directoryPosition));
-        lf_Mkdir(directory.c_str(), st);
-
-        while (directoryPosition != fullPath.npos)
-        {
-            directoryPosition = fullPath.find("/", directoryPosition + 1);
-            directory = fullPath.substr(0, directoryPosition);
-            directoryExists = lf_Mkdir(directory.c_str(), st);
-        }
-    }
-    return directoryExists;
+    return adios2sys::SystemTools::MakeDirectory(fullPath);
 }
 
 bool IsLittleEndian() noexcept
diff --git a/source/adios2/toolkit/transportman/TransportMan.cpp b/source/adios2/toolkit/transportman/TransportMan.cpp
index fc7fedc28c5e157527c1d3acad39d8161484128f..efbd4f21dab25948c18477b01b30eeb776312370 100644
--- a/source/adios2/toolkit/transportman/TransportMan.cpp
+++ b/source/adios2/toolkit/transportman/TransportMan.cpp
@@ -15,10 +15,13 @@
 /// \endcond
 
 #include "adios2/helper/adiosFunctions.h" //CreateDirectory
-#include "adios2/toolkit/transport/file/FileDescriptor.h"
 #include "adios2/toolkit/transport/file/FilePointer.h"
 #include "adios2/toolkit/transport/file/FileStream.h"
 
+#ifndef _WIN32
+#include "adios2/toolkit/transport/file/FileDescriptor.h"
+#endif
+
 namespace adios2
 {
 namespace transportman
@@ -204,12 +207,7 @@ void TransportMan::OpenFileTransport(const std::string &fileName,
 {
     auto lf_SetFileTransport = [&](const std::string library,
                                    std::shared_ptr<Transport> &transport) {
-        if (library == "POSIX")
-        {
-            transport = std::make_shared<transport::FileDescriptor>(
-                m_MPIComm, m_DebugMode);
-        }
-        else if (library == "stdio")
+        if (library == "stdio")
         {
             transport = std::make_shared<transport::FilePointer>(m_MPIComm,
                                                                  m_DebugMode);
@@ -219,6 +217,13 @@ void TransportMan::OpenFileTransport(const std::string &fileName,
             transport =
                 std::make_shared<transport::FileStream>(m_MPIComm, m_DebugMode);
         }
+#ifndef _WIN32
+        else if (library == "POSIX")
+        {
+            transport = std::make_shared<transport::FileDescriptor>(
+                m_MPIComm, m_DebugMode);
+        }
+#endif
         else
         {
             if (m_DebugMode)
diff --git a/thirdparty/KWSys/CMakeLists.txt b/thirdparty/KWSys/CMakeLists.txt
index 6faf39f54be3613cb02169029931592dc407094b..62afcc1147e786f747b8918cb51e1692dedb8b99 100644
--- a/thirdparty/KWSys/CMakeLists.txt
+++ b/thirdparty/KWSys/CMakeLists.txt
@@ -1,5 +1,7 @@
 set(KWSYS_NAMESPACE adios2sys)
 set(KWSYS_USE_DynamicLoader ON)
+set(KWSYS_USE_RegularExpression ON)
+set(KWSYS_USE_SystemTools ON)
 set(KWSYS_BUILD_SHARED OFF)
 if(NOT ADIOS2_BUILD_SHARED_LIBS)
   set(KWSYS_INSTALL_EXPORT_NAME adios2)