diff --git a/source/adios2/CMakeLists.txt b/source/adios2/CMakeLists.txt
index f48e0924efd82bad7899ba61c83a4a8f4bbea8b1..651b7bc5985d7417ced44eabca06e5a72f0b0c7a 100644
--- a/source/adios2/CMakeLists.txt
+++ b/source/adios2/CMakeLists.txt
@@ -48,6 +48,7 @@ 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})
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/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)