diff --git a/tests/src/serverTestDataMatching.cpp b/tests/src/serverTestDataMatching.cpp
index 2cdfc4228d64017d5a8ec935e03c1b61f59f7e3d..8df1947e5cc7ac9604b9880c05b7a785d1a540d7 100644
--- a/tests/src/serverTestDataMatching.cpp
+++ b/tests/src/serverTestDataMatching.cpp
@@ -6,65 +6,13 @@
 #include <ChimeraTK/ControlSystemAdapter/Testing/ReferenceTestApplication.h>
 //#include <doocs-server-test-helper/ThreadedDoocsServer.h>
 #include <doocs-server-test-helper/doocsServerTestHelper.h>
-#include <eq_client.h>
+#include <doocs-server-test-helper/ThreadedDoocsServer.h>
 
-#include <vector>
 
 using namespace boost::unit_test_framework;
 using namespace ChimeraTK;
 
-//DOOCS_ADAPTER_DEFAULT_FIXTURE_STATIC_APPLICATION
-static ReferenceTestApplication referenceTestApplication("serverTestDataMatching");
-
-extern int eq_server(int, char**);
-
-struct DoocsLauncher {
-  DoocsLauncher() {
-    // choose random RPC number
-    std::random_device rd;
-    std::uniform_int_distribution<int> dist(620000000, 999999999);
-    rpc_no = std::to_string(dist(rd));
-    // update config file with the RPC number
-    std::string command = "sed -i serverTestDataMatching.conf -e "
-                          "'s/^SVR.RPC_NUMBER:.*$/SVR.RPC_NUMBER: " +
-        rpc_no + "/'";
-    auto rc = std::system(command.c_str());
-    (void)rc;
-
-    // start the server
-    doocsServerThread = std::thread(eq_server, boost::unit_test::framework::master_test_suite().argc,
-        boost::unit_test::framework::master_test_suite().argv);
-    // wait until server has started (both the update thread and the rpc thread)
-    EqCall eq;
-    EqAdr ea;
-    EqData src, dst;
-    ea.adr("doocs://localhost:" + rpc_no + "/F/D/UINT/FROM_DEVICE_SCALAR");
-    while(eq.get(&ea, &src, &dst)) usleep(100000);
-    referenceTestApplication.initialiseManualLoopControl();
-  }
-
-  /**
- * @brief For compatibility with older DOOCS versions declare our own eq_exit
- *
- * Can be removed once a new doocs server version is released.
- */
-  void eq_exit() {
-    auto nativeHandle = doocsServerThread.native_handle();
-    if(nativeHandle != 0) pthread_kill(nativeHandle, SIGTERM);
-  }
-
-  ~DoocsLauncher() {
-    referenceTestApplication.releaseManualLoopControl();
-    eq_exit();
-    doocsServerThread.join();
-  }
-
-  std::thread doocsServerThread;
-  static std::string rpc_no;
-};
-std::string DoocsLauncher::rpc_no;
-
-BOOST_GLOBAL_FIXTURE(DoocsLauncher)
+DOOCS_ADAPTER_DEFAULT_FIXTURE_STATIC_APPLICATION
 
 /**********************************************************************************************************************/
 
@@ -76,12 +24,12 @@ BOOST_GLOBAL_FIXTURE(DoocsLauncher)
 BOOST_AUTO_TEST_CASE(testProcessScalar) {
   std::cout << "testProcessScalar" << std::endl;
 
-  auto appPVmanager = referenceTestApplication.getPVManager();
+  auto appPVmanager = GlobalFixture::referenceTestApplication.getPVManager();
 
   // We need data consistency between macro pulse number and the data
   // Everything from now on will get the same version number, until we manually
   // set a new one.
-  referenceTestApplication.versionNumber = ChimeraTK::VersionNumber();
+  GlobalFixture::referenceTestApplication.versionNumber = ChimeraTK::VersionNumber();
 
   int macroPulseNumber = 12345;
   DoocsServerTestHelper::doocsSet<int>("//UNMAPPED/INT.TO_DEVICE_SCALAR", macroPulseNumber);
@@ -91,7 +39,7 @@ BOOST_AUTO_TEST_CASE(testProcessScalar) {
   DoocsServerTestHelper::doocsSet<unsigned int>("//UINT/TO_DEVICE_SCALAR", expectedUnsignedInt);
   DoocsServerTestHelper::doocsSet<float>("//UNMAPPED/FLOAT.TO_DEVICE_SCALAR", expectedFloat);
 
-  referenceTestApplication.runMainLoopOnce();
+  GlobalFixture::referenceTestApplication.runMainLoopOnce();
 
   CHECK_WITH_TIMEOUT(
       DoocsServerTestHelper::doocsGet<unsigned int>("//UINT/FROM_DEVICE_SCALAR") - expectedUnsignedInt < 1e-6);
@@ -99,17 +47,17 @@ BOOST_AUTO_TEST_CASE(testProcessScalar) {
       DoocsServerTestHelper::doocsGet<float>("//UNMAPPED/FLOAT.FROM_DEVICE_SCALAR") - expectedFloat < 1e-6);
 
   // Send MPN and values with different version numbers
-  referenceTestApplication.versionNumber = ChimeraTK::VersionNumber();
-  referenceTestApplication.runMainLoopOnce();
+  GlobalFixture::referenceTestApplication.versionNumber = ChimeraTK::VersionNumber();
+  GlobalFixture::referenceTestApplication.runMainLoopOnce();
 
-  referenceTestApplication.versionNumber = ChimeraTK::VersionNumber();
+  GlobalFixture::referenceTestApplication.versionNumber = ChimeraTK::VersionNumber();
   auto lastExpectedUnsignedInt = expectedUnsignedInt;
   expectedUnsignedInt = 2U;
   expectedFloat = 2.42f;
   DoocsServerTestHelper::doocsSet<unsigned int>("//UINT/TO_DEVICE_SCALAR", expectedUnsignedInt);
   DoocsServerTestHelper::doocsSet<float>("//UNMAPPED/FLOAT.TO_DEVICE_SCALAR", expectedFloat);
 
-  referenceTestApplication.runMainLoopOnce();
+  GlobalFixture::referenceTestApplication.runMainLoopOnce();
 
   // Unsigned int value must not be updated because it has data matching exact
   // FIXME Better way to check this?
@@ -123,12 +71,12 @@ BOOST_AUTO_TEST_CASE(testProcessScalar) {
       DoocsServerTestHelper::doocsGet<float>("//UNMAPPED/FLOAT.FROM_DEVICE_SCALAR") - expectedFloat < 1e-6);
 
   // Another iteration, now back to consistent version number
-  referenceTestApplication.versionNumber = ChimeraTK::VersionNumber();
+  GlobalFixture::referenceTestApplication.versionNumber = ChimeraTK::VersionNumber();
   ++macroPulseNumber;
   DoocsServerTestHelper::doocsSet<int>("//UNMAPPED/INT.TO_DEVICE_SCALAR", macroPulseNumber);
   expectedFloat = 12.42f;
   DoocsServerTestHelper::doocsSet<float>("//UNMAPPED/FLOAT.TO_DEVICE_SCALAR", expectedFloat);
-  referenceTestApplication.runMainLoopOnce();
+  GlobalFixture::referenceTestApplication.runMainLoopOnce();
   CHECK_WITH_TIMEOUT(
       DoocsServerTestHelper::doocsGet<float>("//UNMAPPED/FLOAT.FROM_DEVICE_SCALAR") - expectedFloat < 1e-6);
 }