diff --git a/tests/framework/instruments/PMUCounter.cpp b/tests/framework/instruments/PMUCounter.cpp
index 7994a15..b962bd9 100644
--- a/tests/framework/instruments/PMUCounter.cpp
+++ b/tests/framework/instruments/PMUCounter.cpp
@@ -23,117 +23,51 @@
  */
 #include "PMUCounter.h"
 
-#define _GNU_SOURCE 1
-#include <asm/unistd.h>
-#include <csignal>
-#include <cstdio>
-#include <cstdlib>
-#include <cstring>
-#include <fcntl.h>
-#include <linux/hw_breakpoint.h>
-#include <linux/perf_event.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#undef _GNU_SOURCE
-
-#include <stdexcept>
-
 namespace arm_compute
 {
 namespace test
 {
 namespace framework
 {
-CycleCounter::CycleCounter()
+std::string PMUCounter::id() const
 {
-    const pid_t pid = getpid();
+    return "PMU Counter";
+}
 
-    struct perf_event_attr perf_config; //NOLINT
-    memset(&perf_config, 0, sizeof(struct perf_event_attr));
+void PMUCounter::start()
+{
+    _pmu_cycles.reset();
+    _pmu_instructions.reset();
+}
 
-    perf_config.config = PERF_COUNT_HW_CPU_CYCLES;
-    perf_config.size   = sizeof(struct perf_event_attr);
-    perf_config.type   = PERF_TYPE_HARDWARE;
-    // The inherit bit specifies that this counter should count events of child
-    // tasks as well as the task specified
-    perf_config.inherit = 1;
-    // Enables saving of event counts on context switch for inherited tasks
-    perf_config.inherit_stat = 1;
-
-    _fd = syscall(__NR_perf_event_open, &perf_config, pid, -1, -1, 0);
-
-    if(_fd < 0)
+void PMUCounter::stop()
+{
+    try
     {
-        throw std::runtime_error("perf_event_open for cycles failed");
+        _cycles = _pmu_cycles.get_value<long long>();
+    }
+    catch(const std::runtime_error &)
+    {
+        _cycles = 0;
+    }
+
+    try
+    {
+        _instructions = _pmu_instructions.get_value<long long>();
+    }
+    catch(const std::runtime_error &)
+    {
+        _instructions = 0;
     }
 }
 
-std::string CycleCounter::id() const
+Instrument::MeasurementsMap PMUCounter::measurements() const
 {
-    return "Cycle Counter";
-}
-
-void CycleCounter::start()
-{
-    ioctl(_fd, PERF_EVENT_IOC_RESET, 0);
-    ioctl(_fd, PERF_EVENT_IOC_ENABLE, 0);
-}
-
-void CycleCounter::stop()
-{
-    ioctl(_fd, PERF_EVENT_IOC_DISABLE, 0);
-    read(_fd, &_cycles, sizeof(_cycles));
-}
-
-Instrument::Measurement CycleCounter::measurement() const
-{
-    return Measurement(_cycles, "cycles");
-}
-
-InstructionCounter::InstructionCounter()
-{
-    const pid_t pid = getpid();
-
-    struct perf_event_attr perf_config; //NOLINT
-    memset(&perf_config, 0, sizeof(struct perf_event_attr));
-
-    perf_config.config = PERF_COUNT_HW_INSTRUCTIONS;
-    perf_config.size   = sizeof(struct perf_event_attr);
-    perf_config.type   = PERF_TYPE_HARDWARE;
-    // The inherit bit specifies that this counter should count events of child
-    // tasks as well as the task specified
-    perf_config.inherit = 1;
-    // Enables saving of event counts on context switch for inherited tasks
-    perf_config.inherit_stat = 1;
-
-    _fd = syscall(__NR_perf_event_open, &perf_config, pid, -1, -1, 0);
-
-    if(_fd < 0)
+    return MeasurementsMap
     {
-        throw std::runtime_error("perf_event_open for instructions failed");
-    }
-}
-
-std::string InstructionCounter::id() const
-{
-    return "Instruction Counter";
-}
-
-void InstructionCounter::start()
-{
-    ioctl(_fd, PERF_EVENT_IOC_RESET, 0);
-    ioctl(_fd, PERF_EVENT_IOC_ENABLE, 0);
-}
-
-void InstructionCounter::stop()
-{
-    ioctl(_fd, PERF_EVENT_IOC_DISABLE, 0);
-    read(_fd, &_instructions, sizeof(_instructions));
-}
-
-Instrument::Measurement InstructionCounter::measurement() const
-{
-    return Measurement(_instructions, "instructions");
+        { "CPU cycles", Measurement(_cycles, "cycles") },
+        { "CPU instructions", Measurement(_instructions, "instructions") },
+    };
 }
 } // namespace framework
 } // namespace test
