diff --git a/examples/heatTransfer/write/CMakeLists.txt b/examples/heatTransfer/write/CMakeLists.txt
index b559584822c58708fe15a99314f5cbf32bc37473..e9f9c3a12288109efa929192d4bb9a60b81c2fbb 100644
--- a/examples/heatTransfer/write/CMakeLists.txt
+++ b/examples/heatTransfer/write/CMakeLists.txt
@@ -15,7 +15,7 @@ if(ADIOS2_HAVE_MPI)
   target_include_directories(heatTransfer_write_adios2
     PRIVATE ${MPI_C_INCLUDE_PATH}
   )
-  target_link_libraries(heatTransfer_write_adios2 adios2 ${MPI_C_LIBRARIES})
+  target_link_libraries(heatTransfer_write_adios2 adios2 ${MPI_C_LIBRARIES} pthread)
   target_compile_definitions(heatTransfer_write_adios2 PRIVATE
    -DDEFAULT_CONFIG=${CMAKE_CURRENT_SOURCE_DIR}/config.xml)
 
@@ -33,7 +33,7 @@ if(ADIOS2_HAVE_MPI)
       PRIVATE ${MPI_C_INCLUDE_PATH}
     )
     target_link_libraries(heatTransfer_write_adios1
-      adios1::adios ${MPI_C_LIBRARIES}
+      adios1::adios ${MPI_C_LIBRARIES} pthread
     )
   endif()
 
@@ -51,7 +51,7 @@ if(ADIOS2_HAVE_MPI)
       PRIVATE ${MPI_C_INCLUDE_PATH} ${HDF5_C_INCLUDE_DIRS}
     )
     target_link_libraries(heatTransfer_write_hdf5
-      ${MPI_C_LIBRARIES} ${HDF5_C_LIBRARIES}
+      ${MPI_C_LIBRARIES} ${HDF5_C_LIBRARIES} pthread
     )
   endif()
 
@@ -70,7 +70,7 @@ if(ADIOS2_HAVE_MPI)
       PRIVATE ${MPI_C_INCLUDE_PATH} ${HDF5_C_INCLUDE_DIRS}
     )
     target_link_libraries(heatTransfer_write_ph5
-      ${MPI_C_LIBRARIES} ${HDF5_C_LIBRARIES}
+      ${MPI_C_LIBRARIES} ${HDF5_C_LIBRARIES} pthread
     )
   endif()
 
@@ -91,7 +91,7 @@ if(ADIOS2_HAVE_MPI)
     #target_link_libraries(heatTransfer_write_a2h5
     #  ${MPI_C_LIBRARIES} 
     #)
-    target_link_libraries(heatTransfer_write_a2h5 PUBLIC adios2)
+    target_link_libraries(heatTransfer_write_a2h5 PUBLIC adios2 pthread)
 
   endif()
 
diff --git a/examples/heatTransfer/write/Settings.cpp b/examples/heatTransfer/write/Settings.cpp
index bb473192c84136344b58b5471e6f442530bb773a..256ea702dbfccf99f0b1c69a71f0847b5fd27a74 100644
--- a/examples/heatTransfer/write/Settings.cpp
+++ b/examples/heatTransfer/write/Settings.cpp
@@ -49,6 +49,24 @@ Settings::Settings(int argc, char *argv[], int rank, int nproc) : rank{rank}
     steps = convertToUint("steps", argv[6]);
     iterations = convertToUint("iterations", argv[7]);
 
+    if (argc == 9)
+    {
+        const std::string asyncArg(argv[8]);
+        if (asyncArg == "ON" || asyncArg == "on")
+        {
+            async = true;
+        }
+        else if (asyncArg == "OFF" || asyncArg == "off")
+        {
+            // nothing off is default
+        }
+        else
+        {
+            throw std::invalid_argument("ERROR: wrong async argument " +
+                                        asyncArg + " must be on or off\n");
+        }
+    }
+
     if (npx * npy != this->nproc)
     {
         throw std::invalid_argument("N*M must equal the number of processes");
diff --git a/examples/heatTransfer/write/Settings.h b/examples/heatTransfer/write/Settings.h
index 20f83f395ce322b97da39edfff0afdd121c2d9e5..afb30fd29249cefaaf42c21dc03059c9d61fe675 100644
--- a/examples/heatTransfer/write/Settings.h
+++ b/examples/heatTransfer/write/Settings.h
@@ -47,6 +47,9 @@ public:
     int rank_up;
     int rank_down;
 
+    /** true: std::async Write, false (default): sync */
+    bool async = false;
+
     Settings(int argc, char *argv[], int rank, int nproc);
 };
 
diff --git a/examples/heatTransfer/write/main.cpp b/examples/heatTransfer/write/main.cpp
index 657348f1d77654f6792a57c1ea0bbc0da14c8662..c097b245e08c6ba7e1c0f6b757674a972d22e898 100644
--- a/examples/heatTransfer/write/main.cpp
+++ b/examples/heatTransfer/write/main.cpp
@@ -12,6 +12,7 @@
  */
 #include <mpi.h>
 
+#include <future> //std::future, std::async
 #include <iostream>
 #include <memory>
 #include <stdexcept>
@@ -23,15 +24,16 @@
 
 void printUsage()
 {
-    std::cout
-        << "Usage: heatTransfer  output  N  M   nx  ny   steps iterations\n"
-        << "  output: name of output file\n"
-        << "  N:      number of processes in X dimension\n"
-        << "  M:      number of processes in Y dimension\n"
-        << "  nx:     local array size in X dimension per processor\n"
-        << "  ny:     local array size in Y dimension per processor\n"
-        << "  steps:  the total number of steps to output\n"
-        << "  iterations: one step consist of this many iterations\n\n";
+    std::cout << "Usage: heatTransfer  output  N  M   nx  ny   steps "
+                 "iterations async\n"
+              << "  output: name of output file\n"
+              << "  N:      number of processes in X dimension\n"
+              << "  M:      number of processes in Y dimension\n"
+              << "  nx:     local array size in X dimension per processor\n"
+              << "  ny:     local array size in Y dimension per processor\n"
+              << "  steps:  the total number of steps to output\n"
+              << "  iterations: one step consist of this many iterations\n"
+              << "  async: on or off (default) \n\n";
 }
 
 int main(int argc, char *argv[])
@@ -68,7 +70,18 @@ int main(int argc, char *argv[])
         ht.heatEdges();
         ht.exchange(mpiHeatTransferComm);
         // ht.printT("Heated T:", mpiHeatTransferComm);
-        io.write(0, ht, settings, mpiHeatTransferComm);
+
+        std::future<void> futureWrite;
+        if (settings.async)
+        {
+            futureWrite =
+                std::async(std::launch::async, &IO::write, &io, 0, std::ref(ht),
+                           std::ref(settings), mpiHeatTransferComm);
+        }
+        else
+        {
+            io.write(0, ht, settings, mpiHeatTransferComm);
+        }
 
         for (unsigned int t = 1; t <= settings.steps; ++t)
         {
@@ -80,7 +93,22 @@ int main(int argc, char *argv[])
                 ht.exchange(mpiHeatTransferComm);
                 ht.heatEdges();
             }
-            io.write(t, ht, settings, mpiHeatTransferComm);
+
+            if (settings.async)
+            {
+                futureWrite.get();
+                futureWrite = std::async(std::launch::async, &IO::write, &io, t,
+                                         std::ref(ht), std::ref(settings),
+                                         mpiHeatTransferComm);
+            }
+            else
+            {
+                io.write(t, ht, settings, mpiHeatTransferComm);
+            }
+        }
+        if (settings.async)
+        {
+            futureWrite.get();
         }
         MPI_Barrier(mpiHeatTransferComm);