diff --git a/testing/adios2/engine/EngineWriteReadTest.cpp b/testing/adios2/engine/EngineWriteReadTest.cpp
deleted file mode 100644
index b6ced9212d9528bb0c03850148b1a8e723440197..0000000000000000000000000000000000000000
--- a/testing/adios2/engine/EngineWriteReadTest.cpp
+++ /dev/null
@@ -1,168 +0,0 @@
-#include "EngineWriteReadTest.h"
-
-#include <cstdint>
-
-#include <array>
-#include <iostream>
-#include <stdexcept>
-
-#include <adios2.h>
-
-#include <gtest/gtest.h>
-
-EngineWriteReadTestBase::EngineWriteReadTestBase(std::string engineName,
-                                                 std::string fileName)
-: m_EngineName(engineName), m_FileName(fileName), m_Method(nullptr)
-{
-}
-
-void EngineWriteReadTestBase::SetUp()
-{
-    m_adios = std::unique_ptr<adios::ADIOS>(
-        new adios::ADIOS(adios::Verbose::WARN, true));
-}
-
-void EngineWriteReadTestBase::TearDown() { m_adios.reset(); }
-
-void EngineWriteReadTestBase::SetUpWrite()
-{
-    m_Method = &m_adios->DeclareMethod("TestMethod");
-    m_Method->SetEngine(m_EngineName);
-    m_Method->AddTransport("File");
-    m_Engine = m_adios->Open(m_FileName, "w", *m_Method);
-    ASSERT_NE(m_Engine, nullptr);
-}
-
-void EngineWriteReadTestBase::TearDownWrite()
-{
-    m_Method = nullptr;
-    m_Engine->Close();
-    m_Engine.reset();
-}
-
-void EngineWriteReadTestBase::WriteStep(size_t step)
-{
-    auto &var_i8 = m_adios->GetVariable<char>("i8");
-    auto &var_i16 = m_adios->GetVariable<short>("i16");
-    auto &var_i32 = m_adios->GetVariable<int>("i32");
-    auto &var_i64 = m_adios->GetVariable<long>("i64");
-    auto &var_u8 = m_adios->GetVariable<unsigned char>("u8");
-    auto &var_u16 = m_adios->GetVariable<unsigned short>("u16");
-    auto &var_u32 = m_adios->GetVariable<unsigned int>("u32");
-    auto &var_u64 = m_adios->GetVariable<unsigned long>("u64");
-    auto &var_r32 = m_adios->GetVariable<float>("r32");
-    auto &var_r64 = m_adios->GetVariable<double>("r64");
-
-    m_Engine->Write(var_i8, m_DataI8.cbegin() + step);
-    m_Engine->Write(var_i16, m_DataI16.cbegin() + step);
-    m_Engine->Write(var_i32, m_DataI32.cbegin() + step);
-    m_Engine->Write(var_i64, m_DataI64.cbegin() + step);
-    m_Engine->Write(var_u8, m_DataU8.cbegin() + step);
-    m_Engine->Write(var_u16, m_DataU16.cbegin() + step);
-    m_Engine->Write(var_u32, m_DataU32.cbegin() + step);
-    m_Engine->Write(var_u64, m_DataU64.cbegin() + step);
-    m_Engine->Write(var_r32, m_DataR32.cbegin() + step);
-    m_Engine->Write(var_r64, m_DataR64.cbegin() + step);
-}
-
-void EngineWriteReadTestBase::Write3Steps()
-{
-    for (size_t t = 0; t < 3; ++t)
-    {
-        WriteStep(t);
-        m_Engine->Advance();
-    }
-}
-
-void EngineWriteReadTestBase::WriteRead()
-{
-    Declare();
-    SetUpWrite();
-    Write3Steps();
-    TearDownWrite();
-}
-
-//******************************************************************************
-// 1D test data
-//******************************************************************************
-
-void EngineWriteRead1DTest::Declare()
-{
-    auto &var_i8 = m_adios->DefineVariable<char>("i8", adios::Dims{8});
-    auto &var_i16 = m_adios->DefineVariable<short>("i16", adios::Dims{8});
-    auto &var_i32 = m_adios->DefineVariable<int>("i32", adios::Dims{8});
-    auto &var_i64 = m_adios->DefineVariable<long>("i64", adios::Dims{8});
-    auto &var_u8 = m_adios->DefineVariable<unsigned char>("u8", adios::Dims{8});
-    auto &var_u16 =
-        m_adios->DefineVariable<unsigned short>("u16", adios::Dims{8});
-    auto &var_u32 =
-        m_adios->DefineVariable<unsigned int>("u32", adios::Dims{8});
-    auto &var_u64 =
-        m_adios->DefineVariable<unsigned long>("u64", adios::Dims{8});
-    auto &var_r32 = m_adios->DefineVariable<float>("r32", adios::Dims{8});
-    auto &var_r64 = m_adios->DefineVariable<double>("r64", adios::Dims{8});
-}
-
-//******************************************************************************
-// 2D 2x4 test data
-//******************************************************************************
-
-void EngineWriteRead2D2x4Test::Declare()
-{
-    auto &var_i8 = m_adios->DefineVariable<char>("i8", adios::Dims{2, 4});
-    auto &var_i16 = m_adios->DefineVariable<short>("i16", adios::Dims{2, 4});
-    auto &var_i32 = m_adios->DefineVariable<int>("i32", adios::Dims{2, 4});
-    auto &var_i64 = m_adios->DefineVariable<long>("i64", adios::Dims{2, 4});
-    auto &var_u8 =
-        m_adios->DefineVariable<unsigned char>("u8", adios::Dims{2, 4});
-    auto &var_u16 =
-        m_adios->DefineVariable<unsigned short>("u16", adios::Dims{2, 4});
-    auto &var_u32 =
-        m_adios->DefineVariable<unsigned int>("u32", adios::Dims{2, 4});
-    auto &var_u64 =
-        m_adios->DefineVariable<unsigned long>("u64", adios::Dims{2, 4});
-    auto &var_r32 = m_adios->DefineVariable<float>("r32", adios::Dims{2, 4});
-    auto &var_r64 = m_adios->DefineVariable<double>("r64", adios::Dims{2, 4});
-}
-
-//******************************************************************************
-// 2D 4x2 test data
-//******************************************************************************
-
-void EngineWriteRead2D4x2Test::Declare()
-{
-    auto &var_i8 = m_adios->DefineVariable<char>("i8", adios::Dims{4, 2});
-    auto &var_i16 = m_adios->DefineVariable<short>("i16", adios::Dims{4, 2});
-    auto &var_i32 = m_adios->DefineVariable<int>("i32", adios::Dims{4, 2});
-    auto &var_i64 = m_adios->DefineVariable<long>("i64", adios::Dims{4, 2});
-    auto &var_u8 =
-        m_adios->DefineVariable<unsigned char>("u8", adios::Dims{4, 2});
-    auto &var_u16 =
-        m_adios->DefineVariable<unsigned short>("u16", adios::Dims{4, 2});
-    auto &var_u32 =
-        m_adios->DefineVariable<unsigned int>("u32", adios::Dims{4, 2});
-    auto &var_u64 =
-        m_adios->DefineVariable<unsigned long>("u64", adios::Dims{4, 2});
-    auto &var_r32 = m_adios->DefineVariable<float>("r32", adios::Dims{4, 2});
-    auto &var_r64 = m_adios->DefineVariable<double>("r64", adios::Dims{4, 2});
-}
-
-//******************************************************************************
-// main
-//******************************************************************************
-
-int main(int argc, char **argv)
-{
-#ifdef ADIOS2_HAVE_MPI
-    MPI_Init(nullptr, nullptr);
-#endif
-
-    ::testing::InitGoogleTest(&argc, argv);
-    int result = RUN_ALL_TESTS();
-
-#ifdef ADIOS2_HAVE_MPI
-    MPI_Finalize();
-#endif
-
-    return result;
-}
diff --git a/testing/adios2/engine/EngineWriteReadTest.h b/testing/adios2/engine/EngineWriteReadTest.h
deleted file mode 100644
index 1027930546cb5fffc4c011b5a622a2b2968bd9d7..0000000000000000000000000000000000000000
--- a/testing/adios2/engine/EngineWriteReadTest.h
+++ /dev/null
@@ -1,104 +0,0 @@
-#include <cstdint>
-
-#include <array>
-#include <iostream>
-#include <stdexcept>
-
-#include <adios2.h>
-
-#include <gtest/gtest.h>
-
-class EngineWriteReadTestBase : public ::testing::Test
-{
-public:
-    EngineWriteReadTestBase(std::string engineName, std::string fileName);
-
-protected:
-    std::unique_ptr<adios::ADIOS> m_adios;
-    std::string m_EngineName;
-    std::string m_FileName;
-
-    // To be created by child class SetUp()
-    adios::Method *m_Method;
-    std::shared_ptr<adios::Engine> m_Engine;
-
-    // Create and destroy the manager class
-    virtual void SetUp();
-    virtual void TearDown();
-
-    // Open and close files
-    virtual void SetUpWrite();
-    virtual void TearDownWrite();
-
-    // Shared test functions
-    virtual void Declare() = 0;
-    void WriteStep(size_t step);
-    void Write3Steps();
-    void WriteRead();
-
-    //*************************************************************************
-    // Test Data
-    //*************************************************************************
-
-    // Test data for each type.  Make sure our values exceed the range of the
-    // previous size to make sure we all bytes for each element
-    std::array<char, 10> m_DataI8 = {{0, 1, -2, 3, -4, 5, -6, 7, -8, 9}};
-    std::array<int16_t, 10> m_DataI16 = {
-        {512, 513, -510, 515, -508, 517, -506, 519, -504, 521}};
-    std::array<int32_t, 10> m_DataI32 = {{131072, 131073, -131070, 131075,
-                                          -131068, 131077, -131066, 131079,
-                                          -131064, 131081}};
-    std::array<int64_t, 10> m_DataI64 = {
-        {8589934592, 8589934593, -8589934590, 8589934595, -8589934588,
-         8589934597, -8589934586, 8589934599, -8589934584, 8589934601}};
-    std::array<unsigned char, 10> m_DataU8 = {
-        {128, 129, 130, 131, 132, 133, 134, 135, 136, 137}};
-    std::array<uint16_t, 10> m_DataU16 = {
-        {32768, 32769, 32770, 32771, 32772, 32773, 32774, 32775, 32776, 32777}};
-    std::array<uint32_t, 10> m_DataU32 = {
-        {2147483648, 2147483649, 2147483650, 2147483651, 2147483652, 2147483653,
-         2147483654, 2147483655, 2147483656, 2147483657}};
-    std::array<uint64_t, 10> m_DataU64 = {
-        {9223372036854775808UL, 9223372036854775809UL, 9223372036854775810UL,
-         9223372036854775811UL, 9223372036854775812UL, 9223372036854775813UL,
-         9223372036854775814UL, 9223372036854775815UL, 9223372036854775816UL,
-         9223372036854775817UL}};
-    std::array<float, 10> m_DataR32 = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};
-    std::array<double, 10> m_DataR64 = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};
-};
-
-class EngineWriteRead1DTest : public EngineWriteReadTestBase
-{
-public:
-    EngineWriteRead1DTest(std::string engineName, std::string fileName)
-    : EngineWriteReadTestBase(engineName, fileName)
-    {
-    }
-
-protected:
-    virtual void Declare();
-};
-
-class EngineWriteRead2D2x4Test : public EngineWriteReadTestBase
-{
-public:
-    EngineWriteRead2D2x4Test(std::string engineName, std::string fileName)
-    : EngineWriteReadTestBase(engineName, fileName)
-    {
-    }
-
-protected:
-    virtual void Declare();
-};
-
-class EngineWriteRead2D4x2Test : public EngineWriteReadTestBase
-{
-public:
-    EngineWriteRead2D4x2Test(std::string engineName, std::string fileName)
-    : EngineWriteReadTestBase(engineName, fileName)
-    {
-    }
-
-protected:
-    virtual void Declare();
-};
diff --git a/testing/adios2/engine/SmallTestData.h b/testing/adios2/engine/SmallTestData.h
new file mode 100644
index 0000000000000000000000000000000000000000..d7f736582dabc3eedc9c377973461e5578cc1260
--- /dev/null
+++ b/testing/adios2/engine/SmallTestData.h
@@ -0,0 +1,36 @@
+/*
+ * Distributed under the OSI-approved Apache License, Version 2.0.  See
+ * accompanying file Copyright.txt for details.
+ */
+#ifndef TESTING_ADIOS2_ENGINE_SMALLTESTDATA_H_
+#define TESTING_ADIOS2_ENGINE_SMALLTESTDATA_H_
+
+// Test data for each type.  Make sure our values exceed the range of the
+// previous size to make sure we all bytes for each element
+struct SmallTestData
+{
+    std::array<char, 10> I8 = {{0, 1, -2, 3, -4, 5, -6, 7, -8, 9}};
+    std::array<int16_t, 10> I16 = {
+        {512, 513, -510, 515, -508, 517, -506, 519, -504, 521}};
+    std::array<int32_t, 10> I32 = {{131072, 131073, -131070, 131075, -131068,
+                                    131077, -131066, 131079, -131064, 131081}};
+    std::array<int64_t, 10> I64 = {
+        {8589934592, 8589934593, -8589934590, 8589934595, -8589934588,
+         8589934597, -8589934586, 8589934599, -8589934584, 8589934601}};
+    std::array<unsigned char, 10> U8 = {
+        {128, 129, 130, 131, 132, 133, 134, 135, 136, 137}};
+    std::array<uint16_t, 10> U16 = {
+        {32768, 32769, 32770, 32771, 32772, 32773, 32774, 32775, 32776, 32777}};
+    std::array<uint32_t, 10> U32 = {
+        {2147483648, 2147483649, 2147483650, 2147483651, 2147483652, 2147483653,
+         2147483654, 2147483655, 2147483656, 2147483657}};
+    std::array<uint64_t, 10> U64 = {
+        {9223372036854775808UL, 9223372036854775809UL, 9223372036854775810UL,
+         9223372036854775811UL, 9223372036854775812UL, 9223372036854775813UL,
+         9223372036854775814UL, 9223372036854775815UL, 9223372036854775816UL,
+         9223372036854775817UL}};
+    std::array<float, 10> R32 = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};
+    std::array<double, 10> R64 = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};
+};
+
+#endif // TESTING_ADIOS2_ENGINE_SMALLTESTDATA_H_
diff --git a/testing/adios2/engine/adios1/CMakeLists.txt b/testing/adios2/engine/adios1/CMakeLists.txt
index db9c2d1c941198e4ac23dcd2bbac573688d6f44a..f5e94b86bebb2b11bb3e0119eab7d6abd5397f95 100644
--- a/testing/adios2/engine/adios1/CMakeLists.txt
+++ b/testing/adios2/engine/adios1/CMakeLists.txt
@@ -3,9 +3,7 @@
 # accompanying file Copyright.txt for details.
 #------------------------------------------------------------------------------#
 
-add_executable(TestADIOS1WriteRead
-  TestADIOS1WriteRead.cpp
-  ../EngineWriteReadTest.cpp
-)
+add_executable(TestADIOS1WriteRead TestADIOS1WriteRead.cpp)
 target_link_libraries(TestADIOS1WriteRead adios2 gtest)
+
 add_test(NAME adios2::engine::adios1::write_read COMMAND TestADIOS1WriteRead)
diff --git a/testing/adios2/engine/adios1/TestADIOS1WriteRead.cpp b/testing/adios2/engine/adios1/TestADIOS1WriteRead.cpp
index 08b090b6645d992b85c83644dcaf315f20969e88..0bdb08323ece66176537ff16467e952c5b87f1bd 100644
--- a/testing/adios2/engine/adios1/TestADIOS1WriteRead.cpp
+++ b/testing/adios2/engine/adios1/TestADIOS1WriteRead.cpp
@@ -7,45 +7,250 @@
 
 #include <gtest/gtest.h>
 
-#include "../EngineWriteReadTest.h"
+#include "../SmallTestData.h"
 
-class ADIOS1WriteRead1DTest : public EngineWriteRead1DTest
+class ADIOS1WriteReadTest : public ::testing::Test
 {
 public:
-    ADIOS1WriteRead1DTest()
-    : EngineWriteRead1DTest("ADIOS1Writer", "ADIOS1WriteRead1DTest.bp")
-    {
-    }
+    ADIOS1WriteReadTest() = default;
+
+    SmallTestData m_TestData;
 };
 
-TEST_F(ADIOS1WriteRead1DTest, WriteReadTest) { WriteRead(); }
+//******************************************************************************
+// 1D 1x8 test data
+//******************************************************************************
+TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS2WriteADIOS1Read1D8)
+{
+    {
+        adios::ADIOS adios(adios::Verbose::WARN, true);
+
+        // Declare 1D variables
+        {
+            auto &var_i8 = adios.DefineVariable<char>("i8", adios::Dims{8});
+            auto &var_i16 = adios.DefineVariable<short>("i16", adios::Dims{8});
+            auto &var_i32 = adios.DefineVariable<int>("i32", adios::Dims{8});
+            auto &var_i64 = adios.DefineVariable<long>("i64", adios::Dims{8});
+            auto &var_u8 =
+                adios.DefineVariable<unsigned char>("u8", adios::Dims{8});
+            auto &var_u16 =
+                adios.DefineVariable<unsigned short>("u16", adios::Dims{8});
+            auto &var_u32 =
+                adios.DefineVariable<unsigned int>("u32", adios::Dims{8});
+            auto &var_u64 =
+                adios.DefineVariable<unsigned long>("u64", adios::Dims{8});
+            auto &var_r32 = adios.DefineVariable<float>("r32", adios::Dims{8});
+            auto &var_r64 = adios.DefineVariable<double>("r64", adios::Dims{8});
+        }
+
+        // Create the ADIOS 1 Engine
+        auto method = adios.DeclareMethod("TestMethod");
+        method.SetEngine("ADIOS1Writer");
+        method.AddTransport("File");
+
+        auto engine =
+            adios.Open("ADIOS2ADIOS2WriteADIOS1Read1D8.bp", "w", method);
+        ASSERT_NE(engine, nullptr);
+
+        for (size_t step = 0; step < 3; ++step)
+        {
+            // Retrieve the variables that previously went out of scope
+            auto &var_i8 = adios.GetVariable<char>("i8");
+            auto &var_i16 = adios.GetVariable<short>("i16");
+            auto &var_i32 = adios.GetVariable<int>("i32");
+            auto &var_i64 = adios.GetVariable<long>("i64");
+            auto &var_u8 = adios.GetVariable<unsigned char>("u8");
+            auto &var_u16 = adios.GetVariable<unsigned short>("u16");
+            auto &var_u32 = adios.GetVariable<unsigned int>("u32");
+            auto &var_u64 = adios.GetVariable<unsigned long>("u64");
+            auto &var_r32 = adios.GetVariable<float>("r32");
+            auto &var_r64 = adios.GetVariable<double>("r64");
+
+            // Write each one
+            engine->Write(var_i8, m_TestData.I8.cbegin() + step);
+            engine->Write(var_i16, m_TestData.I16.cbegin() + step);
+            engine->Write(var_i32, m_TestData.I32.cbegin() + step);
+            engine->Write(var_i64, m_TestData.I64.cbegin() + step);
+            engine->Write(var_u8, m_TestData.U8.cbegin() + step);
+            engine->Write(var_u16, m_TestData.U16.cbegin() + step);
+            engine->Write(var_u32, m_TestData.U32.cbegin() + step);
+            engine->Write(var_u64, m_TestData.U64.cbegin() + step);
+            engine->Write(var_r32, m_TestData.R32.cbegin() + step);
+            engine->Write(var_r64, m_TestData.R64.cbegin() + step);
+
+            // Advance to the next time step
+            engine->Advance();
+        }
+
+        // Close the file
+        engine->Close();
+    }
+}
 
 //******************************************************************************
 // 2D 2x4 test data
 //******************************************************************************
-
-class ADIOS1WriteRead2D2x4Test : public EngineWriteRead2D2x4Test
+TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS2WriteADIOS1Read2D2x4)
 {
-public:
-    ADIOS1WriteRead2D2x4Test()
-    : EngineWriteRead2D2x4Test("ADIOS1Writer", "ADIOS1WriteRead2D2x4Test.bp")
     {
-    }
-};
+        adios::ADIOS adios(adios::Verbose::WARN, true);
+
+        // Declare 1D variables
+        {
+            auto &var_i8 = adios.DefineVariable<char>("i8", adios::Dims{2, 4});
+            auto &var_i16 =
+                adios.DefineVariable<short>("i16", adios::Dims{2, 4});
+            auto &var_i32 = adios.DefineVariable<int>("i32", adios::Dims{2, 4});
+            auto &var_i64 =
+                adios.DefineVariable<long>("i64", adios::Dims{2, 4});
+            auto &var_u8 =
+                adios.DefineVariable<unsigned char>("u8", adios::Dims{2, 4});
+            auto &var_u16 =
+                adios.DefineVariable<unsigned short>("u16", adios::Dims{2, 4});
+            auto &var_u32 =
+                adios.DefineVariable<unsigned int>("u32", adios::Dims{2, 4});
+            auto &var_u64 =
+                adios.DefineVariable<unsigned long>("u64", adios::Dims{2, 4});
+            auto &var_r32 =
+                adios.DefineVariable<float>("r32", adios::Dims{2, 4});
+            auto &var_r64 =
+                adios.DefineVariable<double>("r64", adios::Dims{2, 4});
+        }
+
+        // Create the ADIOS 1 Engine
+        auto method = adios.DeclareMethod("TestMethod");
+        method.SetEngine("ADIOS1Writer");
+        method.AddTransport("File");
+
+        auto engine =
+            adios.Open("ADIOS2ADIOS1WriteADIOS1Read2D2x4Test.bp", "w", method);
+        ASSERT_NE(engine, nullptr);
 
-TEST_F(ADIOS1WriteRead2D2x4Test, WriteReadTest) { WriteRead(); }
+        for (size_t step = 0; step < 3; ++step)
+        {
+            // Retrieve the variables that previously went out of scope
+            auto &var_i8 = adios.GetVariable<char>("i8");
+            auto &var_i16 = adios.GetVariable<short>("i16");
+            auto &var_i32 = adios.GetVariable<int>("i32");
+            auto &var_i64 = adios.GetVariable<long>("i64");
+            auto &var_u8 = adios.GetVariable<unsigned char>("u8");
+            auto &var_u16 = adios.GetVariable<unsigned short>("u16");
+            auto &var_u32 = adios.GetVariable<unsigned int>("u32");
+            auto &var_u64 = adios.GetVariable<unsigned long>("u64");
+            auto &var_r32 = adios.GetVariable<float>("r32");
+            auto &var_r64 = adios.GetVariable<double>("r64");
+
+            // Write each one
+            engine->Write(var_i8, m_TestData.I8.cbegin() + step);
+            engine->Write(var_i16, m_TestData.I16.cbegin() + step);
+            engine->Write(var_i32, m_TestData.I32.cbegin() + step);
+            engine->Write(var_i64, m_TestData.I64.cbegin() + step);
+            engine->Write(var_u8, m_TestData.U8.cbegin() + step);
+            engine->Write(var_u16, m_TestData.U16.cbegin() + step);
+            engine->Write(var_u32, m_TestData.U32.cbegin() + step);
+            engine->Write(var_u64, m_TestData.U64.cbegin() + step);
+            engine->Write(var_r32, m_TestData.R32.cbegin() + step);
+            engine->Write(var_r64, m_TestData.R64.cbegin() + step);
+
+            // Advance to the next time step
+            engine->Advance();
+        }
+
+        // Close the file
+        engine->Close();
+    }
+}
 
 //******************************************************************************
 // 2D 4x2 test data
 //******************************************************************************
-
-class ADIOS1WriteRead2D4x2Test : public EngineWriteRead2D4x2Test
+TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS2WriteADIOS1Read2D4x2)
 {
-public:
-    ADIOS1WriteRead2D4x2Test()
-    : EngineWriteRead2D4x2Test("ADIOS1Writer", "ADIOS1WriteRead2D4x2Test.bp")
     {
+        adios::ADIOS adios(adios::Verbose::WARN, true);
+
+        // Declare 1D variables
+        {
+            auto &var_i8 = adios.DefineVariable<char>("i8", adios::Dims{4, 2});
+            auto &var_i16 =
+                adios.DefineVariable<short>("i16", adios::Dims{4, 2});
+            auto &var_i32 = adios.DefineVariable<int>("i32", adios::Dims{4, 2});
+            auto &var_i64 =
+                adios.DefineVariable<long>("i64", adios::Dims{4, 2});
+            auto &var_u8 =
+                adios.DefineVariable<unsigned char>("u8", adios::Dims{4, 2});
+            auto &var_u16 =
+                adios.DefineVariable<unsigned short>("u16", adios::Dims{4, 2});
+            auto &var_u32 =
+                adios.DefineVariable<unsigned int>("u32", adios::Dims{4, 2});
+            auto &var_u64 =
+                adios.DefineVariable<unsigned long>("u64", adios::Dims{4, 2});
+            auto &var_r32 =
+                adios.DefineVariable<float>("r32", adios::Dims{4, 2});
+            auto &var_r64 =
+                adios.DefineVariable<double>("r64", adios::Dims{4, 2});
+        }
+
+        // Create the ADIOS 1 Engine
+        auto method = adios.DeclareMethod("TestMethod");
+        method.SetEngine("ADIOS1Writer");
+        method.AddTransport("File");
+
+        auto engine =
+            adios.Open("ADIOS2ADIOS1WriteADIOS1Read2D4x2Test.bp", "w", method);
+        ASSERT_NE(engine, nullptr);
+
+        for (size_t step = 0; step < 3; ++step)
+        {
+            // Retrieve the variables that previously went out of scope
+            auto &var_i8 = adios.GetVariable<char>("i8");
+            auto &var_i16 = adios.GetVariable<short>("i16");
+            auto &var_i32 = adios.GetVariable<int>("i32");
+            auto &var_i64 = adios.GetVariable<long>("i64");
+            auto &var_u8 = adios.GetVariable<unsigned char>("u8");
+            auto &var_u16 = adios.GetVariable<unsigned short>("u16");
+            auto &var_u32 = adios.GetVariable<unsigned int>("u32");
+            auto &var_u64 = adios.GetVariable<unsigned long>("u64");
+            auto &var_r32 = adios.GetVariable<float>("r32");
+            auto &var_r64 = adios.GetVariable<double>("r64");
+
+            // Write each one
+            engine->Write(var_i8, m_TestData.I8.cbegin() + step);
+            engine->Write(var_i16, m_TestData.I16.cbegin() + step);
+            engine->Write(var_i32, m_TestData.I32.cbegin() + step);
+            engine->Write(var_i64, m_TestData.I64.cbegin() + step);
+            engine->Write(var_u8, m_TestData.U8.cbegin() + step);
+            engine->Write(var_u16, m_TestData.U16.cbegin() + step);
+            engine->Write(var_u32, m_TestData.U32.cbegin() + step);
+            engine->Write(var_u64, m_TestData.U64.cbegin() + step);
+            engine->Write(var_r32, m_TestData.R32.cbegin() + step);
+            engine->Write(var_r64, m_TestData.R64.cbegin() + step);
+
+            // Advance to the next time step
+            engine->Advance();
+        }
+
+        // Close the file
+        engine->Close();
     }
-};
+}
+
+//******************************************************************************
+// main
+//******************************************************************************
+
+int main(int argc, char **argv)
+{
+#ifdef ADIOS2_HAVE_MPI
+    MPI_Init(nullptr, nullptr);
+#endif
+
+    ::testing::InitGoogleTest(&argc, argv);
+    int result = RUN_ALL_TESTS();
+
+#ifdef ADIOS2_HAVE_MPI
+    MPI_Finalize();
+#endif
 
-TEST_F(ADIOS1WriteRead2D4x2Test, WriteReadTest) { WriteRead(); }
+    return result;
+}
diff --git a/testing/adios2/engine/bp/CMakeLists.txt b/testing/adios2/engine/bp/CMakeLists.txt
index 8fd95e9a3268b3bdec403edb38b554e1b3083821..f9a211d6082de094d60fa5d18e2b6c29c13d2cc9 100644
--- a/testing/adios2/engine/bp/CMakeLists.txt
+++ b/testing/adios2/engine/bp/CMakeLists.txt
@@ -3,9 +3,6 @@
 # accompanying file Copyright.txt for details.
 #------------------------------------------------------------------------------#
 
-add_executable(TestBPWriteRead
-  TestBPWriteRead.cpp
-  ../EngineWriteReadTest.cpp
-)
+add_executable(TestBPWriteRead TestBPWriteRead.cpp)
 target_link_libraries(TestBPWriteRead adios2 gtest)
 add_test(NAME adios2::engine::bp::write_read COMMAND TestBPWriteRead)
diff --git a/testing/adios2/engine/bp/TestBPWriteRead.cpp b/testing/adios2/engine/bp/TestBPWriteRead.cpp
index d401bbe087044a70ffa6195aae43d280efb75f92..f1745cb9c4f90e25ad1220290882cbd6fcc541f3 100644
--- a/testing/adios2/engine/bp/TestBPWriteRead.cpp
+++ b/testing/adios2/engine/bp/TestBPWriteRead.cpp
@@ -7,45 +7,250 @@
 
 #include <gtest/gtest.h>
 
-#include "../EngineWriteReadTest.h"
+#include "../SmallTestData.h"
 
-class BPWriteRead1DTest : public EngineWriteRead1DTest
+class BPWriteReadTest : public ::testing::Test
 {
 public:
-    BPWriteRead1DTest()
-    : EngineWriteRead1DTest("BPFileWriter", "BPWriteRead1DTest.bp")
-    {
-    }
+    BPWriteReadTest() = default;
+
+    SmallTestData m_TestData;
 };
 
-TEST_F(BPWriteRead1DTest, WriteReadTest) { WriteRead(); }
+//******************************************************************************
+// 1D 1x8 test data
+//******************************************************************************
+TEST_F(BPWriteReadTest, ADIOS2ADIOS2WriteADIOS1Read1D8)
+{
+    {
+        adios::ADIOS adios(adios::Verbose::WARN, true);
+
+        // Declare 1D variables
+        {
+            auto &var_i8 = adios.DefineVariable<char>("i8", adios::Dims{8});
+            auto &var_i16 = adios.DefineVariable<short>("i16", adios::Dims{8});
+            auto &var_i32 = adios.DefineVariable<int>("i32", adios::Dims{8});
+            auto &var_i64 = adios.DefineVariable<long>("i64", adios::Dims{8});
+            auto &var_u8 =
+                adios.DefineVariable<unsigned char>("u8", adios::Dims{8});
+            auto &var_u16 =
+                adios.DefineVariable<unsigned short>("u16", adios::Dims{8});
+            auto &var_u32 =
+                adios.DefineVariable<unsigned int>("u32", adios::Dims{8});
+            auto &var_u64 =
+                adios.DefineVariable<unsigned long>("u64", adios::Dims{8});
+            auto &var_r32 = adios.DefineVariable<float>("r32", adios::Dims{8});
+            auto &var_r64 = adios.DefineVariable<double>("r64", adios::Dims{8});
+        }
+
+        // Create the ADIOS 1 Engine
+        auto method = adios.DeclareMethod("TestMethod");
+        method.SetEngine("BPFileWriter");
+        method.AddTransport("File");
+
+        auto engine =
+            adios.Open("ADIOS2ADIOS2WriteADIOS1Read1D8.bp", "w", method);
+        ASSERT_NE(engine, nullptr);
+
+        for (size_t step = 0; step < 3; ++step)
+        {
+            // Retrieve the variables that previously went out of scope
+            auto &var_i8 = adios.GetVariable<char>("i8");
+            auto &var_i16 = adios.GetVariable<short>("i16");
+            auto &var_i32 = adios.GetVariable<int>("i32");
+            auto &var_i64 = adios.GetVariable<long>("i64");
+            auto &var_u8 = adios.GetVariable<unsigned char>("u8");
+            auto &var_u16 = adios.GetVariable<unsigned short>("u16");
+            auto &var_u32 = adios.GetVariable<unsigned int>("u32");
+            auto &var_u64 = adios.GetVariable<unsigned long>("u64");
+            auto &var_r32 = adios.GetVariable<float>("r32");
+            auto &var_r64 = adios.GetVariable<double>("r64");
+
+            // Write each one
+            engine->Write(var_i8, m_TestData.I8.cbegin() + step);
+            engine->Write(var_i16, m_TestData.I16.cbegin() + step);
+            engine->Write(var_i32, m_TestData.I32.cbegin() + step);
+            engine->Write(var_i64, m_TestData.I64.cbegin() + step);
+            engine->Write(var_u8, m_TestData.U8.cbegin() + step);
+            engine->Write(var_u16, m_TestData.U16.cbegin() + step);
+            engine->Write(var_u32, m_TestData.U32.cbegin() + step);
+            engine->Write(var_u64, m_TestData.U64.cbegin() + step);
+            engine->Write(var_r32, m_TestData.R32.cbegin() + step);
+            engine->Write(var_r64, m_TestData.R64.cbegin() + step);
+
+            // Advance to the next time step
+            engine->Advance();
+        }
+
+        // Close the file
+        engine->Close();
+    }
+}
 
 //******************************************************************************
 // 2D 2x4 test data
 //******************************************************************************
-
-class BPWriteRead2D2x4Test : public EngineWriteRead2D2x4Test
+TEST_F(BPWriteReadTest, ADIOS2ADIOS2WriteADIOS1Read2D2x4)
 {
-public:
-    BPWriteRead2D2x4Test()
-    : EngineWriteRead2D2x4Test("BPFileWriter", "BPWriteRead2D2x4Test.bp")
     {
-    }
-};
+        adios::ADIOS adios(adios::Verbose::WARN, true);
+
+        // Declare 1D variables
+        {
+            auto &var_i8 = adios.DefineVariable<char>("i8", adios::Dims{2, 4});
+            auto &var_i16 =
+                adios.DefineVariable<short>("i16", adios::Dims{2, 4});
+            auto &var_i32 = adios.DefineVariable<int>("i32", adios::Dims{2, 4});
+            auto &var_i64 =
+                adios.DefineVariable<long>("i64", adios::Dims{2, 4});
+            auto &var_u8 =
+                adios.DefineVariable<unsigned char>("u8", adios::Dims{2, 4});
+            auto &var_u16 =
+                adios.DefineVariable<unsigned short>("u16", adios::Dims{2, 4});
+            auto &var_u32 =
+                adios.DefineVariable<unsigned int>("u32", adios::Dims{2, 4});
+            auto &var_u64 =
+                adios.DefineVariable<unsigned long>("u64", adios::Dims{2, 4});
+            auto &var_r32 =
+                adios.DefineVariable<float>("r32", adios::Dims{2, 4});
+            auto &var_r64 =
+                adios.DefineVariable<double>("r64", adios::Dims{2, 4});
+        }
+
+        // Create the ADIOS 1 Engine
+        auto method = adios.DeclareMethod("TestMethod");
+        method.SetEngine("BPFileWriter");
+        method.AddTransport("File");
+
+        auto engine =
+            adios.Open("ADIOS2BPWriteADIOS1Read2D2x4Test.bp", "w", method);
+        ASSERT_NE(engine, nullptr);
 
-TEST_F(BPWriteRead2D2x4Test, WriteReadTest) { WriteRead(); }
+        for (size_t step = 0; step < 3; ++step)
+        {
+            // Retrieve the variables that previously went out of scope
+            auto &var_i8 = adios.GetVariable<char>("i8");
+            auto &var_i16 = adios.GetVariable<short>("i16");
+            auto &var_i32 = adios.GetVariable<int>("i32");
+            auto &var_i64 = adios.GetVariable<long>("i64");
+            auto &var_u8 = adios.GetVariable<unsigned char>("u8");
+            auto &var_u16 = adios.GetVariable<unsigned short>("u16");
+            auto &var_u32 = adios.GetVariable<unsigned int>("u32");
+            auto &var_u64 = adios.GetVariable<unsigned long>("u64");
+            auto &var_r32 = adios.GetVariable<float>("r32");
+            auto &var_r64 = adios.GetVariable<double>("r64");
+
+            // Write each one
+            engine->Write(var_i8, m_TestData.I8.cbegin() + step);
+            engine->Write(var_i16, m_TestData.I16.cbegin() + step);
+            engine->Write(var_i32, m_TestData.I32.cbegin() + step);
+            engine->Write(var_i64, m_TestData.I64.cbegin() + step);
+            engine->Write(var_u8, m_TestData.U8.cbegin() + step);
+            engine->Write(var_u16, m_TestData.U16.cbegin() + step);
+            engine->Write(var_u32, m_TestData.U32.cbegin() + step);
+            engine->Write(var_u64, m_TestData.U64.cbegin() + step);
+            engine->Write(var_r32, m_TestData.R32.cbegin() + step);
+            engine->Write(var_r64, m_TestData.R64.cbegin() + step);
+
+            // Advance to the next time step
+            engine->Advance();
+        }
+
+        // Close the file
+        engine->Close();
+    }
+}
 
 //******************************************************************************
 // 2D 4x2 test data
 //******************************************************************************
-
-class BPWriteRead2D4x2Test : public EngineWriteRead2D4x2Test
+TEST_F(BPWriteReadTest, ADIOS2ADIOS2WriteADIOS1Read2D4x2)
 {
-public:
-    BPWriteRead2D4x2Test()
-    : EngineWriteRead2D4x2Test("BPFileWriter", "BPWriteRead2D4x2Test.bp")
     {
+        adios::ADIOS adios(adios::Verbose::WARN, true);
+
+        // Declare 1D variables
+        {
+            auto &var_i8 = adios.DefineVariable<char>("i8", adios::Dims{4, 2});
+            auto &var_i16 =
+                adios.DefineVariable<short>("i16", adios::Dims{4, 2});
+            auto &var_i32 = adios.DefineVariable<int>("i32", adios::Dims{4, 2});
+            auto &var_i64 =
+                adios.DefineVariable<long>("i64", adios::Dims{4, 2});
+            auto &var_u8 =
+                adios.DefineVariable<unsigned char>("u8", adios::Dims{4, 2});
+            auto &var_u16 =
+                adios.DefineVariable<unsigned short>("u16", adios::Dims{4, 2});
+            auto &var_u32 =
+                adios.DefineVariable<unsigned int>("u32", adios::Dims{4, 2});
+            auto &var_u64 =
+                adios.DefineVariable<unsigned long>("u64", adios::Dims{4, 2});
+            auto &var_r32 =
+                adios.DefineVariable<float>("r32", adios::Dims{4, 2});
+            auto &var_r64 =
+                adios.DefineVariable<double>("r64", adios::Dims{4, 2});
+        }
+
+        // Create the ADIOS 1 Engine
+        auto method = adios.DeclareMethod("TestMethod");
+        method.SetEngine("BPFileWriter");
+        method.AddTransport("File");
+
+        auto engine =
+            adios.Open("ADIOS2BPWriteADIOS1Read2D4x2Test.bp", "w", method);
+        ASSERT_NE(engine, nullptr);
+
+        for (size_t step = 0; step < 3; ++step)
+        {
+            // Retrieve the variables that previously went out of scope
+            auto &var_i8 = adios.GetVariable<char>("i8");
+            auto &var_i16 = adios.GetVariable<short>("i16");
+            auto &var_i32 = adios.GetVariable<int>("i32");
+            auto &var_i64 = adios.GetVariable<long>("i64");
+            auto &var_u8 = adios.GetVariable<unsigned char>("u8");
+            auto &var_u16 = adios.GetVariable<unsigned short>("u16");
+            auto &var_u32 = adios.GetVariable<unsigned int>("u32");
+            auto &var_u64 = adios.GetVariable<unsigned long>("u64");
+            auto &var_r32 = adios.GetVariable<float>("r32");
+            auto &var_r64 = adios.GetVariable<double>("r64");
+
+            // Write each one
+            engine->Write(var_i8, m_TestData.I8.cbegin() + step);
+            engine->Write(var_i16, m_TestData.I16.cbegin() + step);
+            engine->Write(var_i32, m_TestData.I32.cbegin() + step);
+            engine->Write(var_i64, m_TestData.I64.cbegin() + step);
+            engine->Write(var_u8, m_TestData.U8.cbegin() + step);
+            engine->Write(var_u16, m_TestData.U16.cbegin() + step);
+            engine->Write(var_u32, m_TestData.U32.cbegin() + step);
+            engine->Write(var_u64, m_TestData.U64.cbegin() + step);
+            engine->Write(var_r32, m_TestData.R32.cbegin() + step);
+            engine->Write(var_r64, m_TestData.R64.cbegin() + step);
+
+            // Advance to the next time step
+            engine->Advance();
+        }
+
+        // Close the file
+        engine->Close();
     }
-};
+}
+
+//******************************************************************************
+// main
+//******************************************************************************
+
+int main(int argc, char **argv)
+{
+#ifdef ADIOS2_HAVE_MPI
+    MPI_Init(nullptr, nullptr);
+#endif
+
+    ::testing::InitGoogleTest(&argc, argv);
+    int result = RUN_ALL_TESTS();
+
+#ifdef ADIOS2_HAVE_MPI
+    MPI_Finalize();
+#endif
 
-TEST_F(BPWriteRead2D4x2Test, WriteReadTest) { WriteRead(); }
+    return result;
+}
diff --git a/testing/adios2/engine/hdf5/CMakeLists.txt b/testing/adios2/engine/hdf5/CMakeLists.txt
index ec623c6db5a9b83baad0a94e85f77ea4af04691e..b8a4a56c2e32a7e0379f05b6badd7752202ed197 100644
--- a/testing/adios2/engine/hdf5/CMakeLists.txt
+++ b/testing/adios2/engine/hdf5/CMakeLists.txt
@@ -3,9 +3,6 @@
 # accompanying file Copyright.txt for details.
 #------------------------------------------------------------------------------#
 
-add_executable(TestHDF5WriteRead
-  TestHDF5WriteRead.cpp
-  ../EngineWriteReadTest.cpp
-)
+add_executable(TestHDF5WriteRead TestHDF5WriteRead.cpp)
 target_link_libraries(TestHDF5WriteRead adios2 gtest)
 add_test(NAME adios2::engine::hdf5::write_read COMMAND TestHDF5WriteRead)
diff --git a/testing/adios2/engine/hdf5/TestHDF5WriteRead.cpp b/testing/adios2/engine/hdf5/TestHDF5WriteRead.cpp
index 8a93394790cbdb6cfaf370b0b01cc1e82d471397..165dcda09eed71e17a50aa9dc8814a63657b2da8 100644
--- a/testing/adios2/engine/hdf5/TestHDF5WriteRead.cpp
+++ b/testing/adios2/engine/hdf5/TestHDF5WriteRead.cpp
@@ -7,45 +7,250 @@
 
 #include <gtest/gtest.h>
 
-#include "../EngineWriteReadTest.h"
+#include "../SmallTestData.h"
 
-class HDF5WriteRead1DTest : public EngineWriteRead1DTest
+class HDF5WriteReadTest : public ::testing::Test
 {
 public:
-    HDF5WriteRead1DTest()
-    : EngineWriteRead1DTest("HDF5Writer", "HDF5WriteRead1DTest.h5")
-    {
-    }
+    HDF5WriteReadTest() = default;
+
+    SmallTestData m_TestData;
 };
 
-TEST_F(HDF5WriteRead1DTest, WriteReadTest) { WriteRead(); }
+//******************************************************************************
+// 1D 1x8 test data
+//******************************************************************************
+TEST_F(HDF5WriteReadTest, ADIOS2ADIOS2WriteADIOS1Read1D8)
+{
+    {
+        adios::ADIOS adios(adios::Verbose::WARN, true);
+
+        // Declare 1D variables
+        {
+            auto &var_i8 = adios.DefineVariable<char>("i8", adios::Dims{8});
+            auto &var_i16 = adios.DefineVariable<short>("i16", adios::Dims{8});
+            auto &var_i32 = adios.DefineVariable<int>("i32", adios::Dims{8});
+            auto &var_i64 = adios.DefineVariable<long>("i64", adios::Dims{8});
+            auto &var_u8 =
+                adios.DefineVariable<unsigned char>("u8", adios::Dims{8});
+            auto &var_u16 =
+                adios.DefineVariable<unsigned short>("u16", adios::Dims{8});
+            auto &var_u32 =
+                adios.DefineVariable<unsigned int>("u32", adios::Dims{8});
+            auto &var_u64 =
+                adios.DefineVariable<unsigned long>("u64", adios::Dims{8});
+            auto &var_r32 = adios.DefineVariable<float>("r32", adios::Dims{8});
+            auto &var_r64 = adios.DefineVariable<double>("r64", adios::Dims{8});
+        }
+
+        // Create the ADIOS 1 Engine
+        auto method = adios.DeclareMethod("TestMethod");
+        method.SetEngine("HDF5Writer");
+        method.AddTransport("File");
+
+        auto engine =
+            adios.Open("ADIOS2ADIOS2WriteADIOS1Read1D8.h5", "w", method);
+        ASSERT_NE(engine, nullptr);
+
+        for (size_t step = 0; step < 3; ++step)
+        {
+            // Retrieve the variables that previously went out of scope
+            auto &var_i8 = adios.GetVariable<char>("i8");
+            auto &var_i16 = adios.GetVariable<short>("i16");
+            auto &var_i32 = adios.GetVariable<int>("i32");
+            auto &var_i64 = adios.GetVariable<long>("i64");
+            auto &var_u8 = adios.GetVariable<unsigned char>("u8");
+            auto &var_u16 = adios.GetVariable<unsigned short>("u16");
+            auto &var_u32 = adios.GetVariable<unsigned int>("u32");
+            auto &var_u64 = adios.GetVariable<unsigned long>("u64");
+            auto &var_r32 = adios.GetVariable<float>("r32");
+            auto &var_r64 = adios.GetVariable<double>("r64");
+
+            // Write each one
+            engine->Write(var_i8, m_TestData.I8.cbegin() + step);
+            engine->Write(var_i16, m_TestData.I16.cbegin() + step);
+            engine->Write(var_i32, m_TestData.I32.cbegin() + step);
+            engine->Write(var_i64, m_TestData.I64.cbegin() + step);
+            engine->Write(var_u8, m_TestData.U8.cbegin() + step);
+            engine->Write(var_u16, m_TestData.U16.cbegin() + step);
+            engine->Write(var_u32, m_TestData.U32.cbegin() + step);
+            engine->Write(var_u64, m_TestData.U64.cbegin() + step);
+            engine->Write(var_r32, m_TestData.R32.cbegin() + step);
+            engine->Write(var_r64, m_TestData.R64.cbegin() + step);
+
+            // Advance to the next time step
+            engine->Advance();
+        }
+
+        // Close the file
+        engine->Close();
+    }
+}
 
 //******************************************************************************
 // 2D 2x4 test data
 //******************************************************************************
-
-class HDF5WriteRead2D2x4Test : public EngineWriteRead2D2x4Test
+TEST_F(HDF5WriteReadTest, ADIOS2ADIOS2WriteADIOS1Read2D2x4)
 {
-public:
-    HDF5WriteRead2D2x4Test()
-    : EngineWriteRead2D2x4Test("HDF5Writer", "HDF5WriteRead2D2x4Test.h5")
     {
-    }
-};
+        adios::ADIOS adios(adios::Verbose::WARN, true);
+
+        // Declare 1D variables
+        {
+            auto &var_i8 = adios.DefineVariable<char>("i8", adios::Dims{2, 4});
+            auto &var_i16 =
+                adios.DefineVariable<short>("i16", adios::Dims{2, 4});
+            auto &var_i32 = adios.DefineVariable<int>("i32", adios::Dims{2, 4});
+            auto &var_i64 =
+                adios.DefineVariable<long>("i64", adios::Dims{2, 4});
+            auto &var_u8 =
+                adios.DefineVariable<unsigned char>("u8", adios::Dims{2, 4});
+            auto &var_u16 =
+                adios.DefineVariable<unsigned short>("u16", adios::Dims{2, 4});
+            auto &var_u32 =
+                adios.DefineVariable<unsigned int>("u32", adios::Dims{2, 4});
+            auto &var_u64 =
+                adios.DefineVariable<unsigned long>("u64", adios::Dims{2, 4});
+            auto &var_r32 =
+                adios.DefineVariable<float>("r32", adios::Dims{2, 4});
+            auto &var_r64 =
+                adios.DefineVariable<double>("r64", adios::Dims{2, 4});
+        }
+
+        // Create the ADIOS 1 Engine
+        auto method = adios.DeclareMethod("TestMethod");
+        method.SetEngine("HDF5Writer");
+        method.AddTransport("File");
+
+        auto engine =
+            adios.Open("ADIOS2HDF5WriteADIOS1Read2D2x4Test.h5", "w", method);
+        ASSERT_NE(engine, nullptr);
 
-TEST_F(HDF5WriteRead2D2x4Test, WriteReadTest) { WriteRead(); }
+        for (size_t step = 0; step < 3; ++step)
+        {
+            // Retrieve the variables that previously went out of scope
+            auto &var_i8 = adios.GetVariable<char>("i8");
+            auto &var_i16 = adios.GetVariable<short>("i16");
+            auto &var_i32 = adios.GetVariable<int>("i32");
+            auto &var_i64 = adios.GetVariable<long>("i64");
+            auto &var_u8 = adios.GetVariable<unsigned char>("u8");
+            auto &var_u16 = adios.GetVariable<unsigned short>("u16");
+            auto &var_u32 = adios.GetVariable<unsigned int>("u32");
+            auto &var_u64 = adios.GetVariable<unsigned long>("u64");
+            auto &var_r32 = adios.GetVariable<float>("r32");
+            auto &var_r64 = adios.GetVariable<double>("r64");
+
+            // Write each one
+            engine->Write(var_i8, m_TestData.I8.cbegin() + step);
+            engine->Write(var_i16, m_TestData.I16.cbegin() + step);
+            engine->Write(var_i32, m_TestData.I32.cbegin() + step);
+            engine->Write(var_i64, m_TestData.I64.cbegin() + step);
+            engine->Write(var_u8, m_TestData.U8.cbegin() + step);
+            engine->Write(var_u16, m_TestData.U16.cbegin() + step);
+            engine->Write(var_u32, m_TestData.U32.cbegin() + step);
+            engine->Write(var_u64, m_TestData.U64.cbegin() + step);
+            engine->Write(var_r32, m_TestData.R32.cbegin() + step);
+            engine->Write(var_r64, m_TestData.R64.cbegin() + step);
+
+            // Advance to the next time step
+            engine->Advance();
+        }
+
+        // Close the file
+        engine->Close();
+    }
+}
 
 //******************************************************************************
 // 2D 4x2 test data
 //******************************************************************************
-
-class HDF5WriteRead2D4x2Test : public EngineWriteRead2D4x2Test
+TEST_F(HDF5WriteReadTest, ADIOS2ADIOS2WriteADIOS1Read2D4x2)
 {
-public:
-    HDF5WriteRead2D4x2Test()
-    : EngineWriteRead2D4x2Test("HDF5Writer", "HDF5WriteRead2D4x2Test.h5")
     {
+        adios::ADIOS adios(adios::Verbose::WARN, true);
+
+        // Declare 1D variables
+        {
+            auto &var_i8 = adios.DefineVariable<char>("i8", adios::Dims{4, 2});
+            auto &var_i16 =
+                adios.DefineVariable<short>("i16", adios::Dims{4, 2});
+            auto &var_i32 = adios.DefineVariable<int>("i32", adios::Dims{4, 2});
+            auto &var_i64 =
+                adios.DefineVariable<long>("i64", adios::Dims{4, 2});
+            auto &var_u8 =
+                adios.DefineVariable<unsigned char>("u8", adios::Dims{4, 2});
+            auto &var_u16 =
+                adios.DefineVariable<unsigned short>("u16", adios::Dims{4, 2});
+            auto &var_u32 =
+                adios.DefineVariable<unsigned int>("u32", adios::Dims{4, 2});
+            auto &var_u64 =
+                adios.DefineVariable<unsigned long>("u64", adios::Dims{4, 2});
+            auto &var_r32 =
+                adios.DefineVariable<float>("r32", adios::Dims{4, 2});
+            auto &var_r64 =
+                adios.DefineVariable<double>("r64", adios::Dims{4, 2});
+        }
+
+        // Create the ADIOS 1 Engine
+        auto method = adios.DeclareMethod("TestMethod");
+        method.SetEngine("HDF5Writer");
+        method.AddTransport("File");
+
+        auto engine =
+            adios.Open("ADIOS2HDF5WriteADIOS1Read2D4x2Test.h5", "w", method);
+        ASSERT_NE(engine, nullptr);
+
+        for (size_t step = 0; step < 3; ++step)
+        {
+            // Retrieve the variables that previously went out of scope
+            auto &var_i8 = adios.GetVariable<char>("i8");
+            auto &var_i16 = adios.GetVariable<short>("i16");
+            auto &var_i32 = adios.GetVariable<int>("i32");
+            auto &var_i64 = adios.GetVariable<long>("i64");
+            auto &var_u8 = adios.GetVariable<unsigned char>("u8");
+            auto &var_u16 = adios.GetVariable<unsigned short>("u16");
+            auto &var_u32 = adios.GetVariable<unsigned int>("u32");
+            auto &var_u64 = adios.GetVariable<unsigned long>("u64");
+            auto &var_r32 = adios.GetVariable<float>("r32");
+            auto &var_r64 = adios.GetVariable<double>("r64");
+
+            // Write each one
+            engine->Write(var_i8, m_TestData.I8.cbegin() + step);
+            engine->Write(var_i16, m_TestData.I16.cbegin() + step);
+            engine->Write(var_i32, m_TestData.I32.cbegin() + step);
+            engine->Write(var_i64, m_TestData.I64.cbegin() + step);
+            engine->Write(var_u8, m_TestData.U8.cbegin() + step);
+            engine->Write(var_u16, m_TestData.U16.cbegin() + step);
+            engine->Write(var_u32, m_TestData.U32.cbegin() + step);
+            engine->Write(var_u64, m_TestData.U64.cbegin() + step);
+            engine->Write(var_r32, m_TestData.R32.cbegin() + step);
+            engine->Write(var_r64, m_TestData.R64.cbegin() + step);
+
+            // Advance to the next time step
+            engine->Advance();
+        }
+
+        // Close the file
+        engine->Close();
     }
-};
+}
+
+//******************************************************************************
+// main
+//******************************************************************************
+
+int main(int argc, char **argv)
+{
+#ifdef ADIOS2_HAVE_MPI
+    MPI_Init(nullptr, nullptr);
+#endif
+
+    ::testing::InitGoogleTest(&argc, argv);
+    int result = RUN_ALL_TESTS();
+
+#ifdef ADIOS2_HAVE_MPI
+    MPI_Finalize();
+#endif
 
-TEST_F(HDF5WriteRead2D4x2Test, WriteReadTest) { WriteRead(); }
+    return result;
+}