--- a/source/adios2/CMakeLists.txt
+++ b/source/adios2/CMakeLists.txt
@@ -127,7 +127,7 @@
     $<BUILD_INTERFACE:${ADIOS2_SOURCE_DIR}/source>
     $<BUILD_INTERFACE:${ADIOS2_BINARY_DIR}/source>
 )
-target_link_libraries(adios2_core PRIVATE adios2sys_interface adios2::thirdparty::pugixml
+target_link_libraries(adios2_core PRIVATE -lkwsys adios2::thirdparty::pugixml
   adios2::thirdparty::yaml-cpp adios2::thirdparty::nlohmann_json adios2::thirdparty::perfstubs-interface)
 target_link_libraries(adios2_core PUBLIC ${CMAKE_THREAD_LIBS_INIT})
 target_compile_features(adios2_core PUBLIC "$<BUILD_INTERFACE:${ADIOS2_CXX11_FEATURES}>")
@@ -151,7 +151,7 @@
     toolkit/format/bp5/BP5Serializer.cpp
     toolkit/format/bp5/BP5Deserializer.cpp  toolkit/format/bp5/BP5Deserializer.tcc
   )
-  target_link_libraries(adios2_core PRIVATE ffs::ffs)
+  target_link_libraries(adios2_core PRIVATE ffs)
 endif()
 
 if(ADIOS2_HAVE_DAOS)
--- a/source/adios2/core/ADIOS.cpp
+++ b/source/adios2/core/ADIOS.cpp
@@ -19,7 +19,7 @@
 #include "adios2/helper/adiosCommDummy.h"
 #include "adios2/helper/adiosFunctions.h" //InquireKey, BroadcastFile
 #include "adios2/operator/OperatorFactory.h"
-#include <adios2sys/SystemTools.hxx>
+#include <kwsys/SystemTools.hxx>
 
 #include <adios2-perfstubs-interface.h>
 
@@ -53,7 +53,7 @@
 #endif
     if (!configFile.empty())
     {
-        if (!adios2sys::SystemTools::FileExists(configFile))
+        if (!kwsys::SystemTools::FileExists(configFile))
         {
             helper::Throw<std::logic_error>("Core", "ADIOS", "ADIOS",
                                             "config file " + configFile +
--- a/source/adios2/core/IO.cpp
+++ b/source/adios2/core/IO.cpp
@@ -39,7 +39,7 @@
 #include "adios2/helper/adiosComm.h"
 #include "adios2/helper/adiosFunctions.h" //BuildParametersMap
 #include "adios2/helper/adiosString.h"
-#include <adios2sys/SystemTools.hxx> // FileIsDirectory()
+#include <kwsys/SystemTools.hxx> // FileIsDirectory()
 
 #ifdef ADIOS2_HAVE_DATAMAN // external dependencies
 #include "adios2/engine/dataman/DataManReader.h"
@@ -559,13 +559,13 @@
         else if ((mode_to_use == Mode::Read) ||
                  (mode_to_use == Mode::ReadRandomAccess))
         {
-            if (adios2sys::SystemTools::FileIsDirectory(name))
+            if (kwsys::SystemTools::FileIsDirectory(name))
             {
                 char v = helper::BPVersion(name, comm, m_TransportsParameters);
                 engineTypeLC = "bp";
                 engineTypeLC.push_back(v);
             }
-            else if (adios2sys::SystemTools::FileIsDirectory(name + ".tier0"))
+            else if (kwsys::SystemTools::FileIsDirectory(name + ".tier0"))
             {
                 engineTypeLC = "mhs";
             }
--- a/source/adios2/helper/adiosDynamicBinder.cpp
+++ b/source/adios2/helper/adiosDynamicBinder.cpp
@@ -18,8 +18,8 @@
 #include <stdexcept> // for runtime_error
 #include <vector>    // for vector
 
-#include <adios2sys/DynamicLoader.hxx>
-#include <adios2sys/SystemTools.hxx>
+#include <kwsys/DynamicLoader.hxx>
+#include <kwsys/SystemTools.hxx>
 
 namespace adios2
 {
@@ -28,7 +28,7 @@
 
 struct DynamicBinder::Impl
 {
-    adios2sys::DynamicLoader::LibraryHandle m_LibraryHandle;
+    kwsys::DynamicLoader::LibraryHandle m_LibraryHandle;
 };
 
 DynamicBinder::DynamicBinder(std::string libName) : DynamicBinder(libName, "")
@@ -76,14 +76,14 @@
                 // ConvertToOutputPath() will change slashes if we're running on
                 // a Windows system
                 fileName =
-                    adios2sys::SystemTools::ConvertToOutputPath(fileName);
+                    kwsys::SystemTools::ConvertToOutputPath(fileName);
             }
             else
             {
                 fileName = prefix + libName + suffix;
             }
             m_Impl->m_LibraryHandle =
-                adios2sys::DynamicLoader::OpenLibrary(fileName);
+                kwsys::DynamicLoader::OpenLibrary(fileName);
             searchedLibs.push_back(fileName);
             if (m_Impl->m_LibraryHandle)
             {
@@ -110,13 +110,13 @@
 
 DynamicBinder::~DynamicBinder()
 {
-    adios2sys::DynamicLoader::CloseLibrary(m_Impl->m_LibraryHandle);
+    kwsys::DynamicLoader::CloseLibrary(m_Impl->m_LibraryHandle);
 }
 
 DynamicBinder::VoidSymbolPointer
 DynamicBinder::GetSymbol(std::string symbolName)
 {
-    return adios2sys::DynamicLoader::GetSymbolAddress(m_Impl->m_LibraryHandle,
+    return kwsys::DynamicLoader::GetSymbolAddress(m_Impl->m_LibraryHandle,
                                                       symbolName);
 }
 
--- a/source/adios2/helper/adiosPluginManager.cpp
+++ b/source/adios2/helper/adiosPluginManager.cpp
@@ -17,7 +17,7 @@
 #include "adios2/helper/adiosLog.h"
 #include "adios2/helper/adiosString.h"
 
-#include <adios2sys/SystemTools.hxx>
+#include <kwsys/SystemTools.hxx>
 
 #include <memory>
 #include <stdexcept>
@@ -110,13 +110,13 @@
     }
 
     std::string allPluginPaths;
-    adios2sys::SystemTools::GetEnv(pluginEnvVarName, allPluginPaths);
+    kwsys::SystemTools::GetEnv(pluginEnvVarName, allPluginPaths);
     if (allPluginPaths.empty())
     {
         return OpenPlugin(pluginName, pluginLibrary, "");
     }
     auto pathsSplit =
-        adios2sys::SystemTools::SplitString(allPluginPaths, ':', false);
+        kwsys::SystemTools::SplitString(allPluginPaths, ':', false);
 
     bool loaded = false;
     auto pathIt = pathsSplit.begin();
--- a/source/adios2/helper/adiosSystem.cpp
+++ b/source/adios2/helper/adiosSystem.cpp
@@ -13,7 +13,7 @@
 #include <stdexcept> // std::runtime_error, std::exception
 #include <system_error>
 
-#include <adios2sys/SystemTools.hxx>
+#include <kwsys/SystemTools.hxx>
 
 #include "adios2/common/ADIOSTypes.h"
 #include "adios2/helper/adiosComm.h"
@@ -37,7 +37,7 @@
 
 bool CreateDirectory(const std::string &fullPath) noexcept
 {
-    return static_cast<bool>(adios2sys::SystemTools::MakeDirectory(fullPath));
+    return static_cast<bool>(kwsys::SystemTools::MakeDirectory(fullPath));
 }
 
 bool IsLittleEndian() noexcept
@@ -168,7 +168,7 @@
     if (!comm.Rank())
     {
         std::string mmdFileName = name + PathSeparator + "mmd.0";
-        if (adios2sys::SystemTools::PathExists(mmdFileName))
+        if (kwsys::SystemTools::PathExists(mmdFileName))
         {
             version = '5';
         }
--- a/source/adios2/operator/plugin/PluginOperator.cpp
+++ b/source/adios2/operator/plugin/PluginOperator.cpp
@@ -21,7 +21,7 @@
 #include "adios2/helper/adiosPluginManager.h"
 #include "adios2/helper/adiosString.h"
 
-#include <adios2sys/SystemTools.hxx>
+#include <kwsys/SystemTools.hxx>
 
 namespace adios2
 {
--- a/source/utils/bpls/bpls.cpp
+++ b/source/utils/bpls/bpls.cpp
@@ -57,8 +57,8 @@
 
 #include "adios2/helper/adiosString.h" // EndsWith
 #include "adios2/helper/adiosSystem.h" //isHDF5File
-#include <adios2sys/CommandLineArguments.hxx>
-#include <adios2sys/SystemTools.hxx>
+#include <kwsys/CommandLineArguments.hxx>
+#include <kwsys/SystemTools.hxx>
 #include <pugixml.hpp>
 
 namespace adios2
@@ -202,8 +202,8 @@
 bool option_help_was_called = false;
 int optioncb_help(const char *argument, const char *value, void *call_data)
 {
-    // adios2sys::CommandLineArguments *arg =
-    // static_cast<adios2sys::CommandLineArguments *>(call_data);
+    // kwsys::CommandLineArguments *arg =
+    // static_cast<kwsys::CommandLineArguments *>(call_data);
     // printf("%s\n", arg->GetHelp());
     display_help();
     option_help_was_called = true;
@@ -431,7 +431,7 @@
 
 void introspect_file(const char *filename) noexcept
 {
-    if (adios2sys::SystemTools::FileIsDirectory(filename))
+    if (kwsys::SystemTools::FileIsDirectory(filename))
     {
         if (!introspectAsBPDir(filename))
         {
@@ -460,7 +460,7 @@
     }
 }
 
-int process_unused_args(adios2sys::CommandLineArguments &arg)
+int process_unused_args(kwsys::CommandLineArguments &arg)
 {
     int nuargs;
     char **uargs;
@@ -541,9 +541,9 @@
 
     init_globals();
 
-    adios2sys::CommandLineArguments arg;
+    kwsys::CommandLineArguments arg;
     arg.Initialize(argc, argv);
-    typedef adios2sys::CommandLineArguments argT;
+    typedef kwsys::CommandLineArguments argT;
     arg.StoreUnusedArguments(true);
     arg.AddCallback("-v", argT::NO_ARGUMENT, optioncb_verbose, nullptr, "");
     arg.AddCallback("--verbose", argT::NO_ARGUMENT, optioncb_verbose, nullptr,
@@ -1521,7 +1521,7 @@
     if (verbose > 1)
         printf("\nADIOS Open: read header info from %s\n", path);
 
-    if (!adios2sys::SystemTools::FileExists(path))
+    if (!kwsys::SystemTools::FileExists(path))
     {
         fprintf(stderr, "\nError: input path %s does not exist\n", path);
         return 4;
--- a/source/utils/CMakeLists.txt
+++ b/source/utils/CMakeLists.txt
@@ -11,7 +11,7 @@
 
 # BPLS
 add_executable(bpls ./bpls/bpls.cpp)
-target_link_libraries(bpls adios2_core adios2sys adios2::thirdparty::pugixml)
+target_link_libraries(bpls adios2_core -lkwsys adios2::thirdparty::pugixml)
 target_include_directories(bpls PRIVATE ${PROJECT_BINARY_DIR})
 set_property(TARGET bpls PROPERTY OUTPUT_NAME bpls${ADIOS2_EXECUTABLE_SUFFIX})
 install(TARGETS bpls EXPORT adios2
@@ -30,7 +30,7 @@
 
 # BPSPLIT
 #add_executable(bpsplit ./bpsplit/bpsplit.cpp)
-#target_link_libraries(bpsplit adios2::cxx11 adios2sys_interface adios2::thirdparty::pugixml)
+#target_link_libraries(bpsplit adios2::cxx11 -lkwsys adios2::thirdparty::pugixml)
 #install(TARGETS bpsplit EXPORT adios2
 #  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
 #)
--- a/thirdparty/CMakeLists.txt
+++ b/thirdparty/CMakeLists.txt
@@ -33,8 +33,6 @@
 option(ADIOS2_USE_EXTERNAL_YAMLCPP
   "Use an externally supplied yaml-cpp library" "${ADIOS2_USE_EXTERNAL_DEPENDENCIES}")
 
-add_subdirectory(KWSys)
-
 add_subdirectory(perfstubs)
 adios2_add_thirdparty_target(perfstubs-interface perfstubs-interface)
 
--- a/thirdparty/perfstubs/CMakeLists.txt
+++ b/thirdparty/perfstubs/CMakeLists.txt
@@ -1,12 +1,3 @@
-message_start_thirdparty()
-
-if (NOT WIN32 AND BUILD_SHARED_LIBS AND ADIOS2_HAVE_Profiling)
-  set(PERFSTUBS_USE_TIMERS ON CACHE INTERNAL "")
-  add_subdirectory(perfstubs)
-else()
-  set(PERFSTUBS_USE_TIMERS OFF CACHE INTERNAL "")
-endif()
-
 add_library(perfstubs-interface INTERFACE)
 
 configure_file(
@@ -19,7 +10,6 @@
 )
 
 if (PERFSTUBS_USE_TIMERS)
+  find_package(perfstubs REQUIRED)
   target_link_libraries(perfstubs-interface INTERFACE perfstubs)
 endif()
-
-message_end_thirdparty()
