COMPMID-415: Rename and move tests

The boost validation is now "standalone" in validation_old and builds as
arm_compute_validation_old. The new validation builds now as
arm_compute_validation.

Change-Id: Ib93ba848a25680ac60afb92b461d574a0757150d
Reviewed-on: http://mpd-gerrit.cambridge.arm.com/86187
Tested-by: Kaizen <jeremy.johnson+kaizengerrit@arm.com>
Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
diff --git a/tests/AssetsLibrary.cpp b/tests/AssetsLibrary.cpp
index be565d9..d7c881d 100644
--- a/tests/AssetsLibrary.cpp
+++ b/tests/AssetsLibrary.cpp
@@ -21,10 +21,9 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
+#include "tests/AssetsLibrary.h"
 
 #include "TypePrinter.h"
-#include "UserConfiguration.h"
 #include "Utils.h"
 
 #include "arm_compute/core/ITensor.h"
diff --git a/tests/AssetsLibrary.h b/tests/AssetsLibrary.h
index 2993662..6945aa6 100644
--- a/tests/AssetsLibrary.h
+++ b/tests/AssetsLibrary.h
@@ -34,7 +34,7 @@
 #include "tests/RawTensor.h"
 #include "tests/TensorCache.h"
 #include "tests/Utils.h"
-#include "tests/validation/half.h"
+#include "tests/validation_old/half.h"
 
 #include <algorithm>
 #include <cstddef>
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
deleted file mode 100644
index 70dfd67..0000000
--- a/tests/CMakeLists.txt
+++ /dev/null
@@ -1,85 +0,0 @@
-# Copyright (c) 2017 ARM Limited.
-#
-# SPDX-License-Identifier: MIT
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-cmake_minimum_required (VERSION 3.1)
-project (arm_compute_test)
-
-set(CMAKE_CXX_STANDARD 11)
-set(CMAKE_CXX_STANDARD_REQUIRED ON)
-
-add_library(boost_unit_test_framework STATIC IMPORTED)
-set_target_properties(boost_unit_test_framework PROPERTIES
-    IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/../3rdparty/linux/armv7a/libboost_unit_test_framework.a"
-)
-
-add_library(boost_program_options STATIC IMPORTED)
-set_target_properties(boost_program_options PROPERTIES
-    IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/../3rdparty/linux/armv7a/libboost_program_options.a"
-)
-
-add_library(arm_compute SHARED IMPORTED)
-set_target_properties(arm_compute PROPERTIES
-    IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/../build/libarm_compute.so"
-)
-
-include_directories("${CMAKE_SOURCE_DIR}")
-include_directories("${CMAKE_SOURCE_DIR}/..")
-include_directories("${CMAKE_SOURCE_DIR}/../3rdparty/include/")
-
-# AssetsLibrary
-set(tensor_library_SOURCE_FILES
-    ${CMAKE_SOURCE_DIR}/RawTensor.h
-    ${CMAKE_SOURCE_DIR}/RawTensor.cpp
-    ${CMAKE_SOURCE_DIR}/TensorCache.h
-    ${CMAKE_SOURCE_DIR}/AssetsLibrary.h
-    ${CMAKE_SOURCE_DIR}/AssetsLibrary.cpp
-)
-
-add_library(tensor_library OBJECT
-    ${tensor_library_SOURCE_FILES}
-)
-
-set(arm_compute_test_SOURCE_FILES
-    ${CMAKE_SOURCE_DIR}/BorderModeDataset.h
-    ${CMAKE_SOURCE_DIR}/ConvertPolicyDataset.h
-    ${CMAKE_SOURCE_DIR}/Globals.h
-    ${CMAKE_SOURCE_DIR}/IAccessor.h
-    ${CMAKE_SOURCE_DIR}/ImageDatasets.h
-    ${CMAKE_SOURCE_DIR}/InterpolationPolicyDataset.h
-    ${CMAKE_SOURCE_DIR}/NormalizationTypeDataset.h
-    ${CMAKE_SOURCE_DIR}/ProgramOptions.h
-    ${CMAKE_SOURCE_DIR}/ProgramOptions.cpp
-    ${CMAKE_SOURCE_DIR}/RoundingPolicyDataset.h
-    ${CMAKE_SOURCE_DIR}/ShapeDatasets.h
-    ${CMAKE_SOURCE_DIR}/TypePrinter.h
-    ${CMAKE_SOURCE_DIR}/TypeReader.h
-    ${CMAKE_SOURCE_DIR}/UserConfiguration.h
-    ${CMAKE_SOURCE_DIR}/UserConfiguration.cpp
-    ${CMAKE_SOURCE_DIR}/Utils.h
-    ${CMAKE_SOURCE_DIR}/boost_wrapper.h
-)
-
-add_library(arm_compute_test OBJECT
-    ${arm_compute_test_SOURCE_FILES}
-)
-
-add_subdirectory(validation)
-add_subdirectory(benchmark)
diff --git a/tests/Globals.h b/tests/Globals.h
index d94250b..c4c450c 100644
--- a/tests/Globals.h
+++ b/tests/Globals.h
@@ -24,7 +24,7 @@
 #ifndef __ARM_COMPUTE_TEST_GLOBALS_H__
 #define __ARM_COMPUTE_TEST_GLOBALS_H__
 
-#include "AssetsLibrary.h"
+#include "tests/AssetsLibrary.h"
 
 #include <memory>
 
diff --git a/tests/RawTensor.h b/tests/RawTensor.h
index f1a9af3..fd0ab2b 100644
--- a/tests/RawTensor.h
+++ b/tests/RawTensor.h
@@ -24,7 +24,7 @@
 #ifndef __ARM_COMPUTE_TEST_RAW_TENSOR_H__
 #define __ARM_COMPUTE_TEST_RAW_TENSOR_H__
 
-#include "SimpleTensor.h"
+#include "tests/SimpleTensor.h"
 
 namespace arm_compute
 {
diff --git a/tests/SConscript b/tests/SConscript
index 92a8b59..9be03ad 100644
--- a/tests/SConscript
+++ b/tests/SConscript
@@ -25,6 +25,11 @@
 Import('env')
 Import('vars')
 
+SConscript('./framework/SConscript', duplicate=0)
+
+#FIXME: Remove before release
+SConscript('./validation_old/SConscript', duplicate=0)
+
 # vars is imported from arm_compute:
 variables = [
     #FIXME Remove before release (And remove all references to INTERNAL_ONLY)
@@ -42,75 +47,10 @@
     vars.Add(v)
 
 # Clone the environment to make sure we're not polluting the arm_compute one:
-old_validation_env = env.Clone()
-vars.Update(old_validation_env)
-
-Help(new_options.GenerateHelpText(old_validation_env))
-
-if env['os'] in ['android', 'bare_metal'] or env['standalone']:
-    Import('arm_compute_a')
-    old_validation_env.Append(LIBS = [arm_compute_a])
-    arm_compute_lib = arm_compute_a
-else:
-    Import('arm_compute_so')
-    old_validation_env.Append(LIBS = ["arm_compute"])
-    arm_compute_lib = arm_compute_so
-
-#FIXME Delete before release
-if old_validation_env['internal_only']:
-    old_validation_env.Append(CPPDEFINES=['INTERNAL_ONLY'])
-
-old_validation_env.Append(CPPPATH = [".", "#3rdparty/include"])
-old_validation_env.Append(LIBPATH = ["#3rdparty/%s/%s" % (env['os'], env['arch'])])
-old_validation_env.Append(LIBPATH = ["#build/%s" % env['build_dir']])
-old_validation_env.Append(LIBPATH = ["#build/%s/opencl-1.2-stubs" % env['build_dir']])
-old_validation_env.Append(LIBS = ['boost_program_options'])
-old_validation_env.Append(CXXFLAGS = ['-Wno-missing-field-initializers'])
-old_validation_env.Append(CPPDEFINES=['BOOST'])
-old_validation_env.Append(LIBS = ['boost_unit_test_framework'])
-
-old_files_validation = Glob('*.cpp')
-old_files_validation = [f for f in old_files_validation if "main.cpp" not in os.path.basename(str(f))]
-old_files_validation += Glob('validation/*.cpp')
-
-# Add unit tests
-old_files_validation += Glob('validation/UNIT/*.cpp')
-old_files_validation += Glob('validation/UNIT/*/*.cpp')
-
-if env['opencl']:
-    Import('opencl')
-
-    old_files_validation += Glob('validation/CL/*.cpp')
-    old_files_validation += Glob('validation/CL/*/*.cpp')
-    old_files_validation += Glob('validation/system_tests/CL/*.cpp')
-
-    old_validation_env.Append(LIBS = "OpenCL")
-    old_validation_env.Append(CPPDEFINES=['ARM_COMPUTE_CL'])
-
-if env['neon']:
-    old_files_validation += Glob('validation/NEON/*.cpp')
-    old_files_validation += Glob('validation/NEON/*/*.cpp')
-    old_files_validation += Glob('validation/system_tests/NEON/*.cpp')
-
-if env['os'] == 'android':
-    old_validation_env.Append(LIBS = ["log"])
-
-if old_validation_env['validation_tests']:
-    arm_compute_validation = old_validation_env.Program('arm_compute_validation', old_files_validation)
-    Depends(arm_compute_validation, arm_compute_lib)
-    if env['opencl']:
-        Depends(arm_compute_validation, opencl)
-    Default(arm_compute_validation)
-    Export('arm_compute_validation')
-
-#######################################################################
-# Using new framework
-#######################################################################
-
-# Clone the environment to make sure we're not polluting the arm_compute one:
 test_env = env.Clone()
-# Workaround to build both test systems in parallel
-test_env.VariantDir("new", ".", duplicate=0)
+vars.Update(test_env)
+
+Help(new_options.GenerateHelpText(test_env))
 
 if env['os'] in ['android', 'bare_metal'] or env['standalone']:
     Import("arm_compute_a")
@@ -122,29 +62,25 @@
     arm_compute_lib = arm_compute_so
 
 #FIXME Delete before release
-if old_validation_env['internal_only']:
+if test_env['internal_only']:
     test_env.Append(CPPDEFINES=['INTERNAL_ONLY'])
 
-test_env.Append(CPPPATH = [".", "#3rdparty/include"])
+test_env.Append(CPPPATH = ["#3rdparty/include"])
 test_env.Append(LIBPATH = ["#3rdparty/%s/%s" % (env['os'], env['arch'])])
 test_env.Append(LIBPATH = ["#build/%s" % env['build_dir']])
-test_env.Append(LIBPATH = ["#build/%s/framework" % env['build_dir']])
 test_env.Append(LIBPATH = ["#build/%s/opencl-1.2-stubs" % env['build_dir']])
 
 Import("arm_compute_test_framework")
 test_env.Append(LIBS = arm_compute_test_framework)
 
-common_files = Glob('new/AssetsLibrary.cpp')
-common_files += Glob('new/RawTensor.cpp')
-common_files += Glob('new/main.cpp')
-
+common_files = Glob('*.cpp')
 common_objects = [test_env.StaticObject(f) for f in common_files]
 
-files_benchmark = Glob('new/benchmark_new/*.cpp')
-files_validation = Glob('new/validation_new/*.cpp')
+files_benchmark = Glob('benchmark/*.cpp')
+files_validation = Glob('validation/*.cpp')
 
 # Always compile reference for validation
-files_validation += Glob('new/validation_new/CPP/*.cpp')
+files_validation += Glob('validation/CPP/*.cpp')
 
 if env['opencl']:
     Import('opencl')
@@ -152,25 +88,25 @@
     test_env.Append(CPPDEFINES=['ARM_COMPUTE_CL'])
     test_env.Append(LIBS = ["OpenCL"])
 
-    files_benchmark += Glob('new/benchmark_new/CL/*/*.cpp')
-    files_benchmark += Glob('new/benchmark_new/CL/*.cpp')
+    files_benchmark += Glob('benchmark/CL/*/*.cpp')
+    files_benchmark += Glob('benchmark/CL/*.cpp')
 
-    files_validation += Glob('new/validation_new/CL/*/*.cpp')
-    files_validation += Glob('new/validation_new/CL/*.cpp')
+    files_validation += Glob('validation/CL/*/*.cpp')
+    files_validation += Glob('validation/CL/*.cpp')
 
 if env['neon']:
-    files_benchmark += Glob('new/benchmark_new/NEON/*/*.cpp')
-    files_benchmark += Glob('new/benchmark_new/NEON/*.cpp')
+    files_benchmark += Glob('benchmark/NEON/*/*.cpp')
+    files_benchmark += Glob('benchmark/NEON/*.cpp')
 
-    files_validation += Glob('new/validation_new/NEON/*/*.cpp')
-    files_validation += Glob('new/validation_new/NEON/*.cpp')
+    files_validation += Glob('validation/NEON/*/*.cpp')
+    files_validation += Glob('validation/NEON/*.cpp')
 
 if env['os'] == 'android':
     test_env.Append(LIBS = ["log"])
 else:
     test_env.Append(LIBS = ["rt"])
 
-if old_validation_env['benchmark_tests']:
+if test_env['benchmark_tests']:
     arm_compute_benchmark = test_env.Program('arm_compute_benchmark', files_benchmark + common_objects)
     Depends(arm_compute_benchmark, arm_compute_test_framework)
     Depends(arm_compute_benchmark, arm_compute_lib)
@@ -181,13 +117,13 @@
     Default(arm_compute_benchmark)
     Export('arm_compute_benchmark')
 
-if old_validation_env['validation_tests']:
-    arm_compute_validation_new = test_env.Program('arm_compute_validation_new', files_validation + common_objects)
-    Depends(arm_compute_validation_new, arm_compute_test_framework)
-    Depends(arm_compute_validation_new, arm_compute_lib)
+if test_env['validation_tests']:
+    arm_compute_validation = test_env.Program('arm_compute_validation', files_validation + common_objects)
+    Depends(arm_compute_validation, arm_compute_test_framework)
+    Depends(arm_compute_validation, arm_compute_lib)
 
     if env['opencl']:
-        Depends(arm_compute_validation_new, opencl)
+        Depends(arm_compute_validation, opencl)
 
-    Default(arm_compute_validation_new)
-    Export('arm_compute_validation_new')
+    Default(arm_compute_validation)
+    Export('arm_compute_validation')
diff --git a/tests/Utils.h b/tests/Utils.h
index f1725d7..7af38e5 100644
--- a/tests/Utils.h
+++ b/tests/Utils.h
@@ -31,7 +31,7 @@
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
 #include "support/ToolchainSupport.h"
-#include "tests/validation_new/half.h"
+#include "tests/validation/half.h"
 
 #include <cmath>
 #include <cstddef>
diff --git a/tests/benchmark_new/CL/ActivationLayer.cpp b/tests/benchmark/CL/ActivationLayer.cpp
similarity index 91%
rename from tests/benchmark_new/CL/ActivationLayer.cpp
rename to tests/benchmark/CL/ActivationLayer.cpp
index 4edbc55..50a2004 100644
--- a/tests/benchmark_new/CL/ActivationLayer.cpp
+++ b/tests/benchmark/CL/ActivationLayer.cpp
@@ -26,18 +26,18 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLActivationLayer.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/system_tests/alexnet/AlexNetActivationLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ActivationLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ActivationLayerDataset.h"
-#include "tests/datasets_new/system_tests/lenet5/LeNet5ActivationLayerDataset.h"
-#include "tests/datasets_new/system_tests/squeezenet/SqueezeNetActivationLayerDataset.h"
-#include "tests/datasets_new/system_tests/vgg/vgg16/VGG16ActivationLayerDataset.h"
-#include "tests/datasets_new/system_tests/yolo/v2/YOLOV2ActivationLayerDataset.h"
-#include "tests/fixtures_new/ActivationLayerFixture.h"
+#include "tests/benchmark/fixtures/ActivationLayerFixture.h"
+#include "tests/datasets/system_tests/alexnet/AlexNetActivationLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ActivationLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ActivationLayerDataset.h"
+#include "tests/datasets/system_tests/lenet5/LeNet5ActivationLayerDataset.h"
+#include "tests/datasets/system_tests/squeezenet/SqueezeNetActivationLayerDataset.h"
+#include "tests/datasets/system_tests/vgg/vgg16/VGG16ActivationLayerDataset.h"
+#include "tests/datasets/system_tests/yolo/v2/YOLOV2ActivationLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/CL/BatchNormalizationLayer.cpp b/tests/benchmark/CL/BatchNormalizationLayer.cpp
similarity index 91%
rename from tests/benchmark_new/CL/BatchNormalizationLayer.cpp
rename to tests/benchmark/CL/BatchNormalizationLayer.cpp
index fb08134..b0e36d3 100644
--- a/tests/benchmark_new/CL/BatchNormalizationLayer.cpp
+++ b/tests/benchmark/CL/BatchNormalizationLayer.cpp
@@ -26,13 +26,13 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLBatchNormalizationLayer.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4BatchNormalizationLayerDataset.h"
-#include "tests/datasets_new/system_tests/yolo/v2/YOLOV2BatchNormalizationLayerDataset.h"
-#include "tests/fixtures_new/BatchNormalizationLayerFixture.h"
+#include "tests/benchmark/fixtures/BatchNormalizationLayerFixture.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4BatchNormalizationLayerDataset.h"
+#include "tests/datasets/system_tests/yolo/v2/YOLOV2BatchNormalizationLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/CL/ConvolutionLayer.cpp b/tests/benchmark/CL/ConvolutionLayer.cpp
similarity index 90%
rename from tests/benchmark_new/CL/ConvolutionLayer.cpp
rename to tests/benchmark/CL/ConvolutionLayer.cpp
index 6447004..122e19b 100644
--- a/tests/benchmark_new/CL/ConvolutionLayer.cpp
+++ b/tests/benchmark/CL/ConvolutionLayer.cpp
@@ -26,18 +26,18 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLConvolutionLayer.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/system_tests/alexnet/AlexNetConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/lenet5/LeNet5ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h"
-#include "tests/fixtures_new/ConvolutionLayerFixture.h"
+#include "tests/benchmark/fixtures/ConvolutionLayerFixture.h"
+#include "tests/datasets/system_tests/alexnet/AlexNetConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/lenet5/LeNet5ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/CL/DepthwiseConvolution.cpp b/tests/benchmark/CL/DepthwiseConvolution.cpp
similarity index 90%
rename from tests/benchmark_new/CL/DepthwiseConvolution.cpp
rename to tests/benchmark/CL/DepthwiseConvolution.cpp
index 15c474f..acdc401 100644
--- a/tests/benchmark_new/CL/DepthwiseConvolution.cpp
+++ b/tests/benchmark/CL/DepthwiseConvolution.cpp
@@ -26,12 +26,12 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLDepthwiseConvolution.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/MobileNetDepthwiseConvolutionDataset.h"
-#include "tests/fixtures_new/DepthwiseConvolutionFixture.h"
+#include "tests/benchmark/fixtures/DepthwiseConvolutionFixture.h"
+#include "tests/datasets/MobileNetDepthwiseConvolutionDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/CL/DepthwiseSeparableConvolutionLayer.cpp b/tests/benchmark/CL/DepthwiseSeparableConvolutionLayer.cpp
similarity index 90%
rename from tests/benchmark_new/CL/DepthwiseSeparableConvolutionLayer.cpp
rename to tests/benchmark/CL/DepthwiseSeparableConvolutionLayer.cpp
index 038a2ab..1ab8628 100644
--- a/tests/benchmark_new/CL/DepthwiseSeparableConvolutionLayer.cpp
+++ b/tests/benchmark/CL/DepthwiseSeparableConvolutionLayer.cpp
@@ -26,12 +26,12 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLDepthwiseSeparableConvolutionLayer.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/MobileNetDepthwiseSeparableConvolutionLayerDataset.h"
-#include "tests/fixtures_new/DepthwiseSeparableConvolutionLayerFixture.h"
+#include "tests/benchmark/fixtures/DepthwiseSeparableConvolutionLayerFixture.h"
+#include "tests/datasets/MobileNetDepthwiseSeparableConvolutionLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/CL/DirectConvolutionLayer.cpp b/tests/benchmark/CL/DirectConvolutionLayer.cpp
similarity index 90%
rename from tests/benchmark_new/CL/DirectConvolutionLayer.cpp
rename to tests/benchmark/CL/DirectConvolutionLayer.cpp
index 675739b..15bf808 100644
--- a/tests/benchmark_new/CL/DirectConvolutionLayer.cpp
+++ b/tests/benchmark/CL/DirectConvolutionLayer.cpp
@@ -26,17 +26,17 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLDirectConvolutionLayer.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/system_tests/alexnet/AlexNetConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h"
-#include "tests/fixtures_new/ConvolutionLayerFixture.h"
+#include "tests/benchmark/fixtures/ConvolutionLayerFixture.h"
+#include "tests/datasets/system_tests/alexnet/AlexNetConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/CL/Floor.cpp b/tests/benchmark/CL/Floor.cpp
similarity index 91%
rename from tests/benchmark_new/CL/Floor.cpp
rename to tests/benchmark/CL/Floor.cpp
index cfa9d17..ce8fa48 100644
--- a/tests/benchmark_new/CL/Floor.cpp
+++ b/tests/benchmark/CL/Floor.cpp
@@ -26,12 +26,12 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLFloor.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/fixtures_new/FloorFixture.h"
+#include "tests/benchmark/fixtures/FloorFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/CL/FullyConnectedLayer.cpp b/tests/benchmark/CL/FullyConnectedLayer.cpp
similarity index 91%
rename from tests/benchmark_new/CL/FullyConnectedLayer.cpp
rename to tests/benchmark/CL/FullyConnectedLayer.cpp
index e8f11b6..d41424a 100644
--- a/tests/benchmark_new/CL/FullyConnectedLayer.cpp
+++ b/tests/benchmark/CL/FullyConnectedLayer.cpp
@@ -26,16 +26,16 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLFullyConnectedLayer.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/system_tests/alexnet/AlexNetFullyConnectedLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1FullyConnectedLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4FullyConnectedLayerDataset.h"
-#include "tests/datasets_new/system_tests/lenet5/LeNet5FullyConnectedLayerDataset.h"
-#include "tests/datasets_new/system_tests/vgg/vgg16/VGG16FullyConnectedLayerDataset.h"
-#include "tests/fixtures_new/FullyConnectedLayerFixture.h"
+#include "tests/benchmark/fixtures/FullyConnectedLayerFixture.h"
+#include "tests/datasets/system_tests/alexnet/AlexNetFullyConnectedLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1FullyConnectedLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4FullyConnectedLayerDataset.h"
+#include "tests/datasets/system_tests/lenet5/LeNet5FullyConnectedLayerDataset.h"
+#include "tests/datasets/system_tests/vgg/vgg16/VGG16FullyConnectedLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/CL/GEMM.cpp b/tests/benchmark/CL/GEMM.cpp
similarity index 87%
rename from tests/benchmark_new/CL/GEMM.cpp
rename to tests/benchmark/CL/GEMM.cpp
index 9b35285..3febef5 100644
--- a/tests/benchmark_new/CL/GEMM.cpp
+++ b/tests/benchmark/CL/GEMM.cpp
@@ -25,13 +25,13 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLGEMM.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/MatrixMultiplyGEMMDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1GEMMDataset.h"
-#include "tests/fixtures_new/GEMMFixture.h"
+#include "tests/benchmark/fixtures/GEMMFixture.h"
+#include "tests/datasets/MatrixMultiplyGEMMDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1GEMMDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/CL/NormalizationLayer.cpp b/tests/benchmark/CL/NormalizationLayer.cpp
similarity index 91%
rename from tests/benchmark_new/CL/NormalizationLayer.cpp
rename to tests/benchmark/CL/NormalizationLayer.cpp
index f433172..2035ae3 100644
--- a/tests/benchmark_new/CL/NormalizationLayer.cpp
+++ b/tests/benchmark/CL/NormalizationLayer.cpp
@@ -26,13 +26,13 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLNormalizationLayer.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/system_tests/alexnet/AlexNetNormalizationLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1NormalizationLayerDataset.h"
-#include "tests/fixtures_new/NormalizationLayerFixture.h"
+#include "tests/benchmark/fixtures/NormalizationLayerFixture.h"
+#include "tests/datasets/system_tests/alexnet/AlexNetNormalizationLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1NormalizationLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/CL/PoolingLayer.cpp b/tests/benchmark/CL/PoolingLayer.cpp
similarity index 91%
rename from tests/benchmark_new/CL/PoolingLayer.cpp
rename to tests/benchmark/CL/PoolingLayer.cpp
index 15c98cb..fcc37e9 100644
--- a/tests/benchmark_new/CL/PoolingLayer.cpp
+++ b/tests/benchmark/CL/PoolingLayer.cpp
@@ -26,18 +26,18 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLPoolingLayer.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/system_tests/alexnet/AlexNetPoolingLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1PoolingLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4PoolingLayerDataset.h"
-#include "tests/datasets_new/system_tests/lenet5/LeNet5PoolingLayerDataset.h"
-#include "tests/datasets_new/system_tests/squeezenet/SqueezeNetPoolingLayerDataset.h"
-#include "tests/datasets_new/system_tests/vgg/vgg16/VGG16PoolingLayerDataset.h"
-#include "tests/datasets_new/system_tests/yolo/v2/YOLOV2PoolingLayerDataset.h"
-#include "tests/fixtures_new/PoolingLayerFixture.h"
+#include "tests/benchmark/fixtures/PoolingLayerFixture.h"
+#include "tests/datasets/system_tests/alexnet/AlexNetPoolingLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1PoolingLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4PoolingLayerDataset.h"
+#include "tests/datasets/system_tests/lenet5/LeNet5PoolingLayerDataset.h"
+#include "tests/datasets/system_tests/squeezenet/SqueezeNetPoolingLayerDataset.h"
+#include "tests/datasets/system_tests/vgg/vgg16/VGG16PoolingLayerDataset.h"
+#include "tests/datasets/system_tests/yolo/v2/YOLOV2PoolingLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/CL/ROIPoolingLayer.cpp b/tests/benchmark/CL/ROIPoolingLayer.cpp
similarity index 91%
rename from tests/benchmark_new/CL/ROIPoolingLayer.cpp
rename to tests/benchmark/CL/ROIPoolingLayer.cpp
index 260f4d7..a10134f 100644
--- a/tests/benchmark_new/CL/ROIPoolingLayer.cpp
+++ b/tests/benchmark/CL/ROIPoolingLayer.cpp
@@ -27,13 +27,13 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLROIPoolingLayer.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/CL/CLArrayAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/ROIPoolingLayerDataset.h"
-#include "tests/fixtures_new/ROIPoolingLayerFixture.h"
+#include "tests/benchmark/fixtures/ROIPoolingLayerFixture.h"
+#include "tests/datasets/ROIPoolingLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/CL/SYSTEM/AlexNet.cpp b/tests/benchmark/CL/SYSTEM/AlexNet.cpp
similarity index 94%
rename from tests/benchmark_new/CL/SYSTEM/AlexNet.cpp
rename to tests/benchmark/CL/SYSTEM/AlexNet.cpp
index 4e5e729..fcf8a52 100644
--- a/tests/benchmark_new/CL/SYSTEM/AlexNet.cpp
+++ b/tests/benchmark/CL/SYSTEM/AlexNet.cpp
@@ -33,11 +33,11 @@
 #include "arm_compute/runtime/CL/functions/CLNormalizationLayer.h"
 #include "arm_compute/runtime/CL/functions/CLPoolingLayer.h"
 #include "arm_compute/runtime/CL/functions/CLSoftmaxLayer.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/fixtures_new/AlexNetFixture.h"
+#include "tests/benchmark/fixtures/AlexNetFixture.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/CL/SYSTEM/LeNet5.cpp b/tests/benchmark/CL/SYSTEM/LeNet5.cpp
similarity index 94%
rename from tests/benchmark_new/CL/SYSTEM/LeNet5.cpp
rename to tests/benchmark/CL/SYSTEM/LeNet5.cpp
index 1b500bf..35ebc7d 100644
--- a/tests/benchmark_new/CL/SYSTEM/LeNet5.cpp
+++ b/tests/benchmark/CL/SYSTEM/LeNet5.cpp
@@ -30,11 +30,11 @@
 #include "arm_compute/runtime/CL/functions/CLFullyConnectedLayer.h"
 #include "arm_compute/runtime/CL/functions/CLPoolingLayer.h"
 #include "arm_compute/runtime/CL/functions/CLSoftmaxLayer.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/fixtures_new/LeNet5Fixture.h"
+#include "tests/benchmark/fixtures/LeNet5Fixture.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/NEON/ActivationLayer.cpp b/tests/benchmark/NEON/ActivationLayer.cpp
similarity index 90%
rename from tests/benchmark_new/NEON/ActivationLayer.cpp
rename to tests/benchmark/NEON/ActivationLayer.cpp
index 9083ce9..0b699f2 100644
--- a/tests/benchmark_new/NEON/ActivationLayer.cpp
+++ b/tests/benchmark/NEON/ActivationLayer.cpp
@@ -26,18 +26,18 @@
 #include "arm_compute/runtime/NEON/functions/NEActivationLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/system_tests/alexnet/AlexNetActivationLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ActivationLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ActivationLayerDataset.h"
-#include "tests/datasets_new/system_tests/lenet5/LeNet5ActivationLayerDataset.h"
-#include "tests/datasets_new/system_tests/squeezenet/SqueezeNetActivationLayerDataset.h"
-#include "tests/datasets_new/system_tests/vgg/vgg16/VGG16ActivationLayerDataset.h"
-#include "tests/datasets_new/system_tests/yolo/v2/YOLOV2ActivationLayerDataset.h"
-#include "tests/fixtures_new/ActivationLayerFixture.h"
+#include "tests/benchmark/fixtures/ActivationLayerFixture.h"
+#include "tests/datasets/system_tests/alexnet/AlexNetActivationLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ActivationLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ActivationLayerDataset.h"
+#include "tests/datasets/system_tests/lenet5/LeNet5ActivationLayerDataset.h"
+#include "tests/datasets/system_tests/squeezenet/SqueezeNetActivationLayerDataset.h"
+#include "tests/datasets/system_tests/vgg/vgg16/VGG16ActivationLayerDataset.h"
+#include "tests/datasets/system_tests/yolo/v2/YOLOV2ActivationLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/NEON/BatchNormalizationLayer.cpp b/tests/benchmark/NEON/BatchNormalizationLayer.cpp
similarity index 91%
rename from tests/benchmark_new/NEON/BatchNormalizationLayer.cpp
rename to tests/benchmark/NEON/BatchNormalizationLayer.cpp
index ffc7d4b..1b0d484 100644
--- a/tests/benchmark_new/NEON/BatchNormalizationLayer.cpp
+++ b/tests/benchmark/NEON/BatchNormalizationLayer.cpp
@@ -26,14 +26,14 @@
 #include "arm_compute/runtime/NEON/functions/NEBatchNormalizationLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/TypePrinter.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
-#include "tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4BatchNormalizationLayerDataset.h"
-#include "tests/datasets_new/system_tests/yolo/v2/YOLOV2BatchNormalizationLayerDataset.h"
-#include "tests/fixtures_new/BatchNormalizationLayerFixture.h"
+#include "tests/benchmark/fixtures/BatchNormalizationLayerFixture.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4BatchNormalizationLayerDataset.h"
+#include "tests/datasets/system_tests/yolo/v2/YOLOV2BatchNormalizationLayerDataset.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/NEON/ConvolutionLayer.cpp b/tests/benchmark/NEON/ConvolutionLayer.cpp
similarity index 89%
rename from tests/benchmark_new/NEON/ConvolutionLayer.cpp
rename to tests/benchmark/NEON/ConvolutionLayer.cpp
index 548fe8b..ba68282 100644
--- a/tests/benchmark_new/NEON/ConvolutionLayer.cpp
+++ b/tests/benchmark/NEON/ConvolutionLayer.cpp
@@ -26,18 +26,18 @@
 #include "arm_compute/runtime/NEON/functions/NEConvolutionLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/system_tests/alexnet/AlexNetConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/lenet5/LeNet5ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h"
-#include "tests/fixtures_new/ConvolutionLayerFixture.h"
+#include "tests/benchmark/fixtures/ConvolutionLayerFixture.h"
+#include "tests/datasets/system_tests/alexnet/AlexNetConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/lenet5/LeNet5ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/NEON/DirectConvolutionLayer.cpp b/tests/benchmark/NEON/DirectConvolutionLayer.cpp
similarity index 88%
rename from tests/benchmark_new/NEON/DirectConvolutionLayer.cpp
rename to tests/benchmark/NEON/DirectConvolutionLayer.cpp
index 1233b0c..a9dd4b9 100644
--- a/tests/benchmark_new/NEON/DirectConvolutionLayer.cpp
+++ b/tests/benchmark/NEON/DirectConvolutionLayer.cpp
@@ -26,18 +26,18 @@
 #include "arm_compute/runtime/NEON/functions/NEDirectConvolutionLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/DirectConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/alexnet/AlexNetConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h"
-#include "tests/datasets_new/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h"
-#include "tests/fixtures_new/ConvolutionLayerFixture.h"
+#include "tests/benchmark/fixtures/ConvolutionLayerFixture.h"
+#include "tests/datasets/DirectConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/alexnet/AlexNetConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h"
+#include "tests/datasets/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/NEON/Floor.cpp b/tests/benchmark/NEON/Floor.cpp
similarity index 91%
rename from tests/benchmark_new/NEON/Floor.cpp
rename to tests/benchmark/NEON/Floor.cpp
index ea6a52b..4bc0c05 100644
--- a/tests/benchmark_new/NEON/Floor.cpp
+++ b/tests/benchmark/NEON/Floor.cpp
@@ -26,12 +26,12 @@
 #include "arm_compute/runtime/NEON/functions/NEFloor.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/fixtures_new/FloorFixture.h"
+#include "tests/benchmark/fixtures/FloorFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/NEON/FullyConnectedLayer.cpp b/tests/benchmark/NEON/FullyConnectedLayer.cpp
similarity index 91%
rename from tests/benchmark_new/NEON/FullyConnectedLayer.cpp
rename to tests/benchmark/NEON/FullyConnectedLayer.cpp
index 72a0742..88499b1 100644
--- a/tests/benchmark_new/NEON/FullyConnectedLayer.cpp
+++ b/tests/benchmark/NEON/FullyConnectedLayer.cpp
@@ -26,16 +26,16 @@
 #include "arm_compute/runtime/NEON/functions/NEFullyConnectedLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/system_tests/alexnet/AlexNetFullyConnectedLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1FullyConnectedLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4FullyConnectedLayerDataset.h"
-#include "tests/datasets_new/system_tests/lenet5/LeNet5FullyConnectedLayerDataset.h"
-#include "tests/datasets_new/system_tests/vgg/vgg16/VGG16FullyConnectedLayerDataset.h"
-#include "tests/fixtures_new/FullyConnectedLayerFixture.h"
+#include "tests/benchmark/fixtures/FullyConnectedLayerFixture.h"
+#include "tests/datasets/system_tests/alexnet/AlexNetFullyConnectedLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1FullyConnectedLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4FullyConnectedLayerDataset.h"
+#include "tests/datasets/system_tests/lenet5/LeNet5FullyConnectedLayerDataset.h"
+#include "tests/datasets/system_tests/vgg/vgg16/VGG16FullyConnectedLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/NEON/GEMM.cpp b/tests/benchmark/NEON/GEMM.cpp
similarity index 88%
rename from tests/benchmark_new/NEON/GEMM.cpp
rename to tests/benchmark/NEON/GEMM.cpp
index 59ac432..2c5a726 100644
--- a/tests/benchmark_new/NEON/GEMM.cpp
+++ b/tests/benchmark/NEON/GEMM.cpp
@@ -26,13 +26,13 @@
 #include "arm_compute/runtime/NEON/functions/NEGEMM.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/MatrixMultiplyGEMMDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1GEMMDataset.h"
-#include "tests/fixtures_new/GEMMFixture.h"
+#include "tests/benchmark/fixtures/GEMMFixture.h"
+#include "tests/datasets/MatrixMultiplyGEMMDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1GEMMDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/NEON/NormalizationLayer.cpp b/tests/benchmark/NEON/NormalizationLayer.cpp
similarity index 91%
rename from tests/benchmark_new/NEON/NormalizationLayer.cpp
rename to tests/benchmark/NEON/NormalizationLayer.cpp
index fefcb96..0488795 100644
--- a/tests/benchmark_new/NEON/NormalizationLayer.cpp
+++ b/tests/benchmark/NEON/NormalizationLayer.cpp
@@ -26,13 +26,13 @@
 #include "arm_compute/runtime/NEON/functions/NENormalizationLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/system_tests/alexnet/AlexNetNormalizationLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1NormalizationLayerDataset.h"
-#include "tests/fixtures_new/NormalizationLayerFixture.h"
+#include "tests/benchmark/fixtures/NormalizationLayerFixture.h"
+#include "tests/datasets/system_tests/alexnet/AlexNetNormalizationLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1NormalizationLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/NEON/PoolingLayer.cpp b/tests/benchmark/NEON/PoolingLayer.cpp
similarity index 89%
rename from tests/benchmark_new/NEON/PoolingLayer.cpp
rename to tests/benchmark/NEON/PoolingLayer.cpp
index 59cb127..05a173b 100644
--- a/tests/benchmark_new/NEON/PoolingLayer.cpp
+++ b/tests/benchmark/NEON/PoolingLayer.cpp
@@ -26,18 +26,18 @@
 #include "arm_compute/runtime/NEON/functions/NEPoolingLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/system_tests/alexnet/AlexNetPoolingLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1PoolingLayerDataset.h"
-#include "tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4PoolingLayerDataset.h"
-#include "tests/datasets_new/system_tests/lenet5/LeNet5PoolingLayerDataset.h"
-#include "tests/datasets_new/system_tests/squeezenet/SqueezeNetPoolingLayerDataset.h"
-#include "tests/datasets_new/system_tests/vgg/vgg16/VGG16PoolingLayerDataset.h"
-#include "tests/datasets_new/system_tests/yolo/v2/YOLOV2PoolingLayerDataset.h"
-#include "tests/fixtures_new/PoolingLayerFixture.h"
+#include "tests/benchmark/fixtures/PoolingLayerFixture.h"
+#include "tests/datasets/system_tests/alexnet/AlexNetPoolingLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1PoolingLayerDataset.h"
+#include "tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4PoolingLayerDataset.h"
+#include "tests/datasets/system_tests/lenet5/LeNet5PoolingLayerDataset.h"
+#include "tests/datasets/system_tests/squeezenet/SqueezeNetPoolingLayerDataset.h"
+#include "tests/datasets/system_tests/vgg/vgg16/VGG16PoolingLayerDataset.h"
+#include "tests/datasets/system_tests/yolo/v2/YOLOV2PoolingLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/NEON/ROIPoolingLayer.cpp b/tests/benchmark/NEON/ROIPoolingLayer.cpp
similarity index 91%
rename from tests/benchmark_new/NEON/ROIPoolingLayer.cpp
rename to tests/benchmark/NEON/ROIPoolingLayer.cpp
index e8c5ba3..d3a7e4b 100644
--- a/tests/benchmark_new/NEON/ROIPoolingLayer.cpp
+++ b/tests/benchmark/NEON/ROIPoolingLayer.cpp
@@ -27,13 +27,13 @@
 #include "arm_compute/runtime/NEON/functions/NEROIPoolingLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/NEON/ArrayAccessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/datasets_new/ROIPoolingLayerDataset.h"
-#include "tests/fixtures_new/ROIPoolingLayerFixture.h"
+#include "tests/benchmark/fixtures/ROIPoolingLayerFixture.h"
+#include "tests/datasets/ROIPoolingLayerDataset.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/NEON/SYSTEM/AlexNet.cpp b/tests/benchmark/NEON/SYSTEM/AlexNet.cpp
similarity index 95%
rename from tests/benchmark_new/NEON/SYSTEM/AlexNet.cpp
rename to tests/benchmark/NEON/SYSTEM/AlexNet.cpp
index 5a0cb3c..cd48e5d 100644
--- a/tests/benchmark_new/NEON/SYSTEM/AlexNet.cpp
+++ b/tests/benchmark/NEON/SYSTEM/AlexNet.cpp
@@ -33,11 +33,11 @@
 #include "arm_compute/runtime/SubTensor.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/fixtures_new/AlexNetFixture.h"
+#include "tests/benchmark/fixtures/AlexNetFixture.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/benchmark_new/NEON/SYSTEM/LeNet5.cpp b/tests/benchmark/NEON/SYSTEM/LeNet5.cpp
similarity index 94%
rename from tests/benchmark_new/NEON/SYSTEM/LeNet5.cpp
rename to tests/benchmark/NEON/SYSTEM/LeNet5.cpp
index 2375c52..46ccfc0 100644
--- a/tests/benchmark_new/NEON/SYSTEM/LeNet5.cpp
+++ b/tests/benchmark/NEON/SYSTEM/LeNet5.cpp
@@ -30,11 +30,11 @@
 #include "arm_compute/runtime/NEON/functions/NESoftmaxLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/TypePrinter.h"
-#include "tests/fixtures_new/LeNet5Fixture.h"
+#include "tests/benchmark/fixtures/LeNet5Fixture.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
 
 namespace arm_compute
 {
diff --git a/tests/fixtures_new/ActivationLayerFixture.h b/tests/benchmark/fixtures/ActivationLayerFixture.h
similarity index 98%
rename from tests/fixtures_new/ActivationLayerFixture.h
rename to tests/benchmark/fixtures/ActivationLayerFixture.h
index 5066810..9ded063 100644
--- a/tests/fixtures_new/ActivationLayerFixture.h
+++ b/tests/benchmark/fixtures/ActivationLayerFixture.h
@@ -26,9 +26,9 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Fixture.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
+#include "tests/framework/Fixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/fixtures_new/AlexNetFixture.h b/tests/benchmark/fixtures/AlexNetFixture.h
similarity index 96%
rename from tests/fixtures_new/AlexNetFixture.h
rename to tests/benchmark/fixtures/AlexNetFixture.h
index 0fbc1b7..961f4e8 100644
--- a/tests/fixtures_new/AlexNetFixture.h
+++ b/tests/benchmark/fixtures/AlexNetFixture.h
@@ -24,10 +24,10 @@
 #ifndef ARM_COMPUTE_TEST_ALEXNETFIXTURE
 #define ARM_COMPUTE_TEST_ALEXNETFIXTURE
 
-#include "framework/Fixture.h"
-#include "networks_new/AlexNetNetwork.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Utils.h"
+#include "tests/framework/Fixture.h"
+#include "tests/networks/AlexNetNetwork.h"
 
 namespace arm_compute
 {
diff --git a/tests/fixtures_new/BatchNormalizationLayerFixture.h b/tests/benchmark/fixtures/BatchNormalizationLayerFixture.h
similarity index 98%
rename from tests/fixtures_new/BatchNormalizationLayerFixture.h
rename to tests/benchmark/fixtures/BatchNormalizationLayerFixture.h
index 39c80e5..79dbc76 100644
--- a/tests/fixtures_new/BatchNormalizationLayerFixture.h
+++ b/tests/benchmark/fixtures/BatchNormalizationLayerFixture.h
@@ -26,9 +26,9 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Fixture.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
+#include "tests/framework/Fixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/fixtures_new/ConvolutionLayerFixture.h b/tests/benchmark/fixtures/ConvolutionLayerFixture.h
similarity index 98%
rename from tests/fixtures_new/ConvolutionLayerFixture.h
rename to tests/benchmark/fixtures/ConvolutionLayerFixture.h
index f41cd1d..fd508d4 100644
--- a/tests/fixtures_new/ConvolutionLayerFixture.h
+++ b/tests/benchmark/fixtures/ConvolutionLayerFixture.h
@@ -26,9 +26,9 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Fixture.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
+#include "tests/framework/Fixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/fixtures_new/DepthwiseConvolutionFixture.h b/tests/benchmark/fixtures/DepthwiseConvolutionFixture.h
similarity index 98%
rename from tests/fixtures_new/DepthwiseConvolutionFixture.h
rename to tests/benchmark/fixtures/DepthwiseConvolutionFixture.h
index 8223c21..e080fe2 100644
--- a/tests/fixtures_new/DepthwiseConvolutionFixture.h
+++ b/tests/benchmark/fixtures/DepthwiseConvolutionFixture.h
@@ -26,9 +26,9 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Fixture.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
+#include "tests/framework/Fixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/fixtures_new/DepthwiseSeparableConvolutionLayerFixture.h b/tests/benchmark/fixtures/DepthwiseSeparableConvolutionLayerFixture.h
similarity index 98%
rename from tests/fixtures_new/DepthwiseSeparableConvolutionLayerFixture.h
rename to tests/benchmark/fixtures/DepthwiseSeparableConvolutionLayerFixture.h
index c4ace2b..928b0c7 100644
--- a/tests/fixtures_new/DepthwiseSeparableConvolutionLayerFixture.h
+++ b/tests/benchmark/fixtures/DepthwiseSeparableConvolutionLayerFixture.h
@@ -26,9 +26,9 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Fixture.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
+#include "tests/framework/Fixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/fixtures_new/FloorFixture.h b/tests/benchmark/fixtures/FloorFixture.h
similarity index 98%
rename from tests/fixtures_new/FloorFixture.h
rename to tests/benchmark/fixtures/FloorFixture.h
index 145b623..8de87b8 100644
--- a/tests/fixtures_new/FloorFixture.h
+++ b/tests/benchmark/fixtures/FloorFixture.h
@@ -26,9 +26,9 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Fixture.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
+#include "tests/framework/Fixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/fixtures_new/FullyConnectedLayerFixture.h b/tests/benchmark/fixtures/FullyConnectedLayerFixture.h
similarity index 98%
rename from tests/fixtures_new/FullyConnectedLayerFixture.h
rename to tests/benchmark/fixtures/FullyConnectedLayerFixture.h
index 82ecb39..2d1f233 100644
--- a/tests/fixtures_new/FullyConnectedLayerFixture.h
+++ b/tests/benchmark/fixtures/FullyConnectedLayerFixture.h
@@ -26,9 +26,9 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Fixture.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
+#include "tests/framework/Fixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/fixtures_new/GEMMFixture.h b/tests/benchmark/fixtures/GEMMFixture.h
similarity index 98%
rename from tests/fixtures_new/GEMMFixture.h
rename to tests/benchmark/fixtures/GEMMFixture.h
index 669a91f..0c41c67 100644
--- a/tests/fixtures_new/GEMMFixture.h
+++ b/tests/benchmark/fixtures/GEMMFixture.h
@@ -26,9 +26,9 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Fixture.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
+#include "tests/framework/Fixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/fixtures_new/LeNet5Fixture.h b/tests/benchmark/fixtures/LeNet5Fixture.h
similarity index 96%
rename from tests/fixtures_new/LeNet5Fixture.h
rename to tests/benchmark/fixtures/LeNet5Fixture.h
index 9a2590b..77a09d3 100644
--- a/tests/fixtures_new/LeNet5Fixture.h
+++ b/tests/benchmark/fixtures/LeNet5Fixture.h
@@ -24,10 +24,10 @@
 #ifndef ARM_COMPUTE_TEST_LENET5FIXTURE
 #define ARM_COMPUTE_TEST_LENET5FIXTURE
 
-#include "framework/Fixture.h"
-#include "networks_new/LeNet5Network.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Utils.h"
+#include "tests/framework/Fixture.h"
+#include "tests/networks/LeNet5Network.h"
 
 namespace arm_compute
 {
diff --git a/tests/fixtures_new/NormalizationLayerFixture.h b/tests/benchmark/fixtures/NormalizationLayerFixture.h
similarity index 98%
rename from tests/fixtures_new/NormalizationLayerFixture.h
rename to tests/benchmark/fixtures/NormalizationLayerFixture.h
index 999eed6..41dd8a7 100644
--- a/tests/fixtures_new/NormalizationLayerFixture.h
+++ b/tests/benchmark/fixtures/NormalizationLayerFixture.h
@@ -26,9 +26,9 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Fixture.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
+#include "tests/framework/Fixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/fixtures_new/PoolingLayerFixture.h b/tests/benchmark/fixtures/PoolingLayerFixture.h
similarity index 98%
rename from tests/fixtures_new/PoolingLayerFixture.h
rename to tests/benchmark/fixtures/PoolingLayerFixture.h
index fc9c90a..2060301 100644
--- a/tests/fixtures_new/PoolingLayerFixture.h
+++ b/tests/benchmark/fixtures/PoolingLayerFixture.h
@@ -26,9 +26,9 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Fixture.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
+#include "tests/framework/Fixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/fixtures_new/ROIPoolingLayerFixture.h b/tests/benchmark/fixtures/ROIPoolingLayerFixture.h
similarity index 98%
rename from tests/fixtures_new/ROIPoolingLayerFixture.h
rename to tests/benchmark/fixtures/ROIPoolingLayerFixture.h
index 54dac51..76c2280 100644
--- a/tests/fixtures_new/ROIPoolingLayerFixture.h
+++ b/tests/benchmark/fixtures/ROIPoolingLayerFixture.h
@@ -26,9 +26,9 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Fixture.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
+#include "tests/framework/Fixture.h"
 
 #include <vector>
 
diff --git a/tests/datasets_new/ActivationFunctionsDataset.h b/tests/datasets/ActivationFunctionsDataset.h
similarity index 96%
rename from tests/datasets_new/ActivationFunctionsDataset.h
rename to tests/datasets/ActivationFunctionsDataset.h
index 0a11902..3e4f408 100644
--- a/tests/datasets_new/ActivationFunctionsDataset.h
+++ b/tests/datasets/ActivationFunctionsDataset.h
@@ -25,6 +25,9 @@
 #define __ARM_COMPUTE_TEST_ACTIVATIONFUNCTIONS_DATASET_H__
 
 #include "arm_compute/core/Types.h"
+#include "tests/framework/datasets/ContainerDataset.h"
+
+#include <vector>
 
 namespace arm_compute
 {
diff --git a/tests/datasets_new/BatchNormalizationLayerDataset.h b/tests/datasets/BatchNormalizationLayerDataset.h
similarity index 100%
rename from tests/datasets_new/BatchNormalizationLayerDataset.h
rename to tests/datasets/BatchNormalizationLayerDataset.h
diff --git a/tests/datasets_new/BorderModeDataset.h b/tests/datasets/BorderModeDataset.h
similarity index 95%
rename from tests/datasets_new/BorderModeDataset.h
rename to tests/datasets/BorderModeDataset.h
index b45e783..df024a7 100644
--- a/tests/datasets_new/BorderModeDataset.h
+++ b/tests/datasets/BorderModeDataset.h
@@ -25,6 +25,9 @@
 #define __ARM_COMPUTE_TEST_BORDER_MODE_DATASET_H__
 
 #include "arm_compute/core/Types.h"
+#include "tests/framework/datasets/ContainerDataset.h"
+
+#include <vector>
 
 namespace arm_compute
 {
diff --git a/tests/datasets_new/ConvolutionLayerDataset.h b/tests/datasets/ConvolutionLayerDataset.h
similarity index 100%
rename from tests/datasets_new/ConvolutionLayerDataset.h
rename to tests/datasets/ConvolutionLayerDataset.h
diff --git a/tests/datasets_new/DepthwiseConvolutionDataset.h b/tests/datasets/DepthwiseConvolutionDataset.h
similarity index 100%
rename from tests/datasets_new/DepthwiseConvolutionDataset.h
rename to tests/datasets/DepthwiseConvolutionDataset.h
diff --git a/tests/datasets_new/DepthwiseSeparableConvolutionLayerDataset.h b/tests/datasets/DepthwiseSeparableConvolutionLayerDataset.h
similarity index 100%
rename from tests/datasets_new/DepthwiseSeparableConvolutionLayerDataset.h
rename to tests/datasets/DepthwiseSeparableConvolutionLayerDataset.h
diff --git a/tests/datasets_new/DirectConvolutionLayerDataset.h b/tests/datasets/DirectConvolutionLayerDataset.h
similarity index 97%
rename from tests/datasets_new/DirectConvolutionLayerDataset.h
rename to tests/datasets/DirectConvolutionLayerDataset.h
index 1d7b06c..dca38b5 100644
--- a/tests/datasets_new/DirectConvolutionLayerDataset.h
+++ b/tests/datasets/DirectConvolutionLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_DIRECT_CONVOLUTION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_DIRECT_CONVOLUTION_LAYER_DATASET
 
-#include "tests/datasets_new/ConvolutionLayerDataset.h"
+#include "tests/datasets/ConvolutionLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/FullyConnectedLayerDataset.h b/tests/datasets/FullyConnectedLayerDataset.h
similarity index 100%
rename from tests/datasets_new/FullyConnectedLayerDataset.h
rename to tests/datasets/FullyConnectedLayerDataset.h
diff --git a/tests/datasets_new/GEMMDataset.h b/tests/datasets/GEMMDataset.h
similarity index 100%
rename from tests/datasets_new/GEMMDataset.h
rename to tests/datasets/GEMMDataset.h
diff --git a/tests/datasets_new/InterpolationPolicyDataset.h b/tests/datasets/InterpolationPolicyDataset.h
similarity index 100%
rename from tests/datasets_new/InterpolationPolicyDataset.h
rename to tests/datasets/InterpolationPolicyDataset.h
diff --git a/tests/datasets_new/LargeConvolutionLayerDataset.h b/tests/datasets/LargeConvolutionLayerDataset.h
similarity index 98%
rename from tests/datasets_new/LargeConvolutionLayerDataset.h
rename to tests/datasets/LargeConvolutionLayerDataset.h
index 36692f9..721530a 100644
--- a/tests/datasets_new/LargeConvolutionLayerDataset.h
+++ b/tests/datasets/LargeConvolutionLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_LARGE_CONVOLUTION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_LARGE_CONVOLUTION_LAYER_DATASET
 
-#include "tests/datasets_new/ConvolutionLayerDataset.h"
+#include "tests/datasets/ConvolutionLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/LargeDepthwiseConvolutionDataset.h b/tests/datasets/LargeDepthwiseConvolutionDataset.h
similarity index 97%
rename from tests/datasets_new/LargeDepthwiseConvolutionDataset.h
rename to tests/datasets/LargeDepthwiseConvolutionDataset.h
index 8fd87f7..22b1516 100644
--- a/tests/datasets_new/LargeDepthwiseConvolutionDataset.h
+++ b/tests/datasets/LargeDepthwiseConvolutionDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_LARGE_DEPTHWISE_CONVOLUTION_DATASET
 #define ARM_COMPUTE_TEST_LARGE_DEPTHWISE_CONVOLUTION_DATASET
 
-#include "tests/datasets_new/DepthwiseConvolutionDataset.h"
+#include "tests/datasets/DepthwiseConvolutionDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/LargeGEMMDataset.h b/tests/datasets/LargeGEMMDataset.h
similarity index 97%
rename from tests/datasets_new/LargeGEMMDataset.h
rename to tests/datasets/LargeGEMMDataset.h
index f757ef3..37cdfaa 100644
--- a/tests/datasets_new/LargeGEMMDataset.h
+++ b/tests/datasets/LargeGEMMDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_LARGE_GEMM_DATASET
 #define ARM_COMPUTE_TEST_LARGE_GEMM_DATASET
 
-#include "tests/datasets_new/GEMMDataset.h"
+#include "tests/datasets/GEMMDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/MatrixMultiplyGEMMDataset.h b/tests/datasets/MatrixMultiplyGEMMDataset.h
similarity index 97%
rename from tests/datasets_new/MatrixMultiplyGEMMDataset.h
rename to tests/datasets/MatrixMultiplyGEMMDataset.h
index 3c482cb..771403b 100644
--- a/tests/datasets_new/MatrixMultiplyGEMMDataset.h
+++ b/tests/datasets/MatrixMultiplyGEMMDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_MATRIXMULTIPLY_GEMM_DATASET
 #define ARM_COMPUTE_TEST_MATRIXMULTIPLY_GEMM_DATASET
 
-#include "tests/datasets_new/GEMMDataset.h"
+#include "tests/datasets/GEMMDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/MobileNetDepthwiseConvolutionDataset.h b/tests/datasets/MobileNetDepthwiseConvolutionDataset.h
similarity index 97%
rename from tests/datasets_new/MobileNetDepthwiseConvolutionDataset.h
rename to tests/datasets/MobileNetDepthwiseConvolutionDataset.h
index 377bee6..c417f18 100644
--- a/tests/datasets_new/MobileNetDepthwiseConvolutionDataset.h
+++ b/tests/datasets/MobileNetDepthwiseConvolutionDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_MOBILENET_DEPTHWISE_CONVOLUTION_DATASET
 #define ARM_COMPUTE_TEST_MOBILENET_DEPTHWISE_CONVOLUTION_DATASET
 
-#include "tests/datasets_new/DepthwiseConvolutionDataset.h"
+#include "tests/datasets/DepthwiseConvolutionDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/MobileNetDepthwiseSeparableConvolutionLayerDataset.h b/tests/datasets/MobileNetDepthwiseSeparableConvolutionLayerDataset.h
similarity index 97%
rename from tests/datasets_new/MobileNetDepthwiseSeparableConvolutionLayerDataset.h
rename to tests/datasets/MobileNetDepthwiseSeparableConvolutionLayerDataset.h
index d0d3bb3..c7784c3 100644
--- a/tests/datasets_new/MobileNetDepthwiseSeparableConvolutionLayerDataset.h
+++ b/tests/datasets/MobileNetDepthwiseSeparableConvolutionLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_MOBILENET_DEPTHWISE_SEPARABLE_CONVOLUTION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_MOBILENET_DEPTHWISE_SEPARABLE_CONVOLUTION_LAYER_DATASET
 
-#include "tests/datasets_new/DepthwiseSeparableConvolutionLayerDataset.h"
+#include "tests/datasets/DepthwiseSeparableConvolutionLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/NormalizationTypesDataset.h b/tests/datasets/NormalizationTypesDataset.h
similarity index 95%
rename from tests/datasets_new/NormalizationTypesDataset.h
rename to tests/datasets/NormalizationTypesDataset.h
index 4e087e9..9b218a7 100644
--- a/tests/datasets_new/NormalizationTypesDataset.h
+++ b/tests/datasets/NormalizationTypesDataset.h
@@ -25,6 +25,9 @@
 #define __ARM_COMPUTE_TEST_NORMALIZATION_TYPES_DATASET_H__
 
 #include "arm_compute/core/Types.h"
+#include "tests/framework/datasets/ContainerDataset.h"
+
+#include <vector>
 
 namespace arm_compute
 {
diff --git a/tests/datasets_new/PoolingLayerDataset.h b/tests/datasets/PoolingLayerDataset.h
similarity index 99%
rename from tests/datasets_new/PoolingLayerDataset.h
rename to tests/datasets/PoolingLayerDataset.h
index 8b35ac6..e5e9cd7 100644
--- a/tests/datasets_new/PoolingLayerDataset.h
+++ b/tests/datasets/PoolingLayerDataset.h
@@ -24,10 +24,9 @@
 #ifndef ARM_COMPUTE_TEST_POOLING_LAYER_DATASET
 #define ARM_COMPUTE_TEST_POOLING_LAYER_DATASET
 
-#include "tests/TypePrinter.h"
-
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
+#include "tests/TypePrinter.h"
 
 namespace arm_compute
 {
diff --git a/tests/datasets_new/PoolingTypesDataset.h b/tests/datasets/PoolingTypesDataset.h
similarity index 95%
rename from tests/datasets_new/PoolingTypesDataset.h
rename to tests/datasets/PoolingTypesDataset.h
index 4e4fa26..5ba8aaf 100644
--- a/tests/datasets_new/PoolingTypesDataset.h
+++ b/tests/datasets/PoolingTypesDataset.h
@@ -25,6 +25,9 @@
 #define __ARM_COMPUTE_TEST_POOLING_TYPES_DATASET_H__
 
 #include "arm_compute/core/Types.h"
+#include "tests/framework/datasets/ContainerDataset.h"
+
+#include <vector>
 
 namespace arm_compute
 {
diff --git a/tests/datasets_new/ROIPoolingLayerDataset.h b/tests/datasets/ROIPoolingLayerDataset.h
similarity index 100%
rename from tests/datasets_new/ROIPoolingLayerDataset.h
rename to tests/datasets/ROIPoolingLayerDataset.h
diff --git a/tests/datasets_new/ReductionOperationDataset.h b/tests/datasets/ReductionOperationDataset.h
similarity index 95%
rename from tests/datasets_new/ReductionOperationDataset.h
rename to tests/datasets/ReductionOperationDataset.h
index e46b8b1..ce1bcb8 100644
--- a/tests/datasets_new/ReductionOperationDataset.h
+++ b/tests/datasets/ReductionOperationDataset.h
@@ -26,6 +26,9 @@
 
 #include "arm_compute/core/Types.h"
 #include "tests/TypePrinter.h"
+#include "tests/framework/datasets/ContainerDataset.h"
+
+#include <vector>
 
 namespace arm_compute
 {
diff --git a/tests/datasets_new/ShapeDatasets.h b/tests/datasets/ShapeDatasets.h
similarity index 98%
rename from tests/datasets_new/ShapeDatasets.h
rename to tests/datasets/ShapeDatasets.h
index 477d875..4c449a7 100644
--- a/tests/datasets_new/ShapeDatasets.h
+++ b/tests/datasets/ShapeDatasets.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_SHAPE_DATASETS_H__
 
 #include "arm_compute/core/TensorShape.h"
-#include "framework/datasets/Datasets.h"
+#include "tests/framework/datasets/Datasets.h"
 
 #include <type_traits>
 
diff --git a/tests/datasets_new/SmallConvolutionLayerDataset.h b/tests/datasets/SmallConvolutionLayerDataset.h
similarity index 98%
rename from tests/datasets_new/SmallConvolutionLayerDataset.h
rename to tests/datasets/SmallConvolutionLayerDataset.h
index 59765c4..1a26fa5 100644
--- a/tests/datasets_new/SmallConvolutionLayerDataset.h
+++ b/tests/datasets/SmallConvolutionLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_SMALL_CONVOLUTION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_SMALL_CONVOLUTION_LAYER_DATASET
 
-#include "tests/datasets_new/ConvolutionLayerDataset.h"
+#include "tests/datasets/ConvolutionLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/SmallDepthwiseConvolutionDataset.h b/tests/datasets/SmallDepthwiseConvolutionDataset.h
similarity index 97%
rename from tests/datasets_new/SmallDepthwiseConvolutionDataset.h
rename to tests/datasets/SmallDepthwiseConvolutionDataset.h
index 364673a..17d01fb 100644
--- a/tests/datasets_new/SmallDepthwiseConvolutionDataset.h
+++ b/tests/datasets/SmallDepthwiseConvolutionDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_SMALL_DEPTHWISE_CONVOLUTION_DATASET
 #define ARM_COMPUTE_TEST_SMALL_DEPTHWISE_CONVOLUTION_DATASET
 
-#include "tests/datasets_new/DepthwiseConvolutionDataset.h"
+#include "tests/datasets/DepthwiseConvolutionDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/SmallGEMMDataset.h b/tests/datasets/SmallGEMMDataset.h
similarity index 97%
rename from tests/datasets_new/SmallGEMMDataset.h
rename to tests/datasets/SmallGEMMDataset.h
index 7856ff9..0cc3c3a 100644
--- a/tests/datasets_new/SmallGEMMDataset.h
+++ b/tests/datasets/SmallGEMMDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_SMALL_GEMM_DATASET
 #define ARM_COMPUTE_TEST_SMALL_GEMM_DATASET
 
-#include "tests/datasets_new/GEMMDataset.h"
+#include "tests/datasets/GEMMDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/alexnet/AlexNetActivationLayerDataset.h b/tests/datasets/system_tests/alexnet/AlexNetActivationLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/alexnet/AlexNetActivationLayerDataset.h
rename to tests/datasets/system_tests/alexnet/AlexNetActivationLayerDataset.h
index 7062c2e..4030e97 100644
--- a/tests/datasets_new/system_tests/alexnet/AlexNetActivationLayerDataset.h
+++ b/tests/datasets/system_tests/alexnet/AlexNetActivationLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_ALEXNET_ACTIVATION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_ALEXNET_ACTIVATION_LAYER_DATASET
 
-#include "framework/datasets/Datasets.h"
+#include "tests/framework/datasets/Datasets.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/alexnet/AlexNetConvolutionLayerDataset.h b/tests/datasets/system_tests/alexnet/AlexNetConvolutionLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/alexnet/AlexNetConvolutionLayerDataset.h
rename to tests/datasets/system_tests/alexnet/AlexNetConvolutionLayerDataset.h
index 18421cf..d0b901a 100644
--- a/tests/datasets_new/system_tests/alexnet/AlexNetConvolutionLayerDataset.h
+++ b/tests/datasets/system_tests/alexnet/AlexNetConvolutionLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_ALEXNET_CONVOLUTION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_ALEXNET_CONVOLUTION_LAYER_DATASET
 
-#include "tests/datasets_new/ConvolutionLayerDataset.h"
+#include "tests/datasets/ConvolutionLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/alexnet/AlexNetFullyConnectedLayerDataset.h b/tests/datasets/system_tests/alexnet/AlexNetFullyConnectedLayerDataset.h
similarity index 96%
rename from tests/datasets_new/system_tests/alexnet/AlexNetFullyConnectedLayerDataset.h
rename to tests/datasets/system_tests/alexnet/AlexNetFullyConnectedLayerDataset.h
index 4aa4f4d..50b0f7d 100644
--- a/tests/datasets_new/system_tests/alexnet/AlexNetFullyConnectedLayerDataset.h
+++ b/tests/datasets/system_tests/alexnet/AlexNetFullyConnectedLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_ALEXNET_FULLYCONNECTED_LAYER_DATASET
 #define ARM_COMPUTE_TEST_ALEXNET_FULLYCONNECTED_LAYER_DATASET
 
-#include "tests/datasets_new/FullyConnectedLayerDataset.h"
+#include "tests/datasets/FullyConnectedLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/alexnet/AlexNetNormalizationLayerDataset.h b/tests/datasets/system_tests/alexnet/AlexNetNormalizationLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/alexnet/AlexNetNormalizationLayerDataset.h
rename to tests/datasets/system_tests/alexnet/AlexNetNormalizationLayerDataset.h
index 5714c5c..33b7423 100644
--- a/tests/datasets_new/system_tests/alexnet/AlexNetNormalizationLayerDataset.h
+++ b/tests/datasets/system_tests/alexnet/AlexNetNormalizationLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_ALEXNET_NORMALIZATION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_ALEXNET_NORMALIZATION_LAYER_DATASET
 
-#include "framework/datasets/Datasets.h"
+#include "tests/framework/datasets/Datasets.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/alexnet/AlexNetPoolingLayerDataset.h b/tests/datasets/system_tests/alexnet/AlexNetPoolingLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/alexnet/AlexNetPoolingLayerDataset.h
rename to tests/datasets/system_tests/alexnet/AlexNetPoolingLayerDataset.h
index 714bca0..ab2749b 100644
--- a/tests/datasets_new/system_tests/alexnet/AlexNetPoolingLayerDataset.h
+++ b/tests/datasets/system_tests/alexnet/AlexNetPoolingLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_ALEXNET_POOLING_LAYER_DATASET
 #define ARM_COMPUTE_TEST_ALEXNET_POOLING_LAYER_DATASET
 
-#include "tests/datasets_new/PoolingLayerDataset.h"
+#include "tests/datasets/PoolingLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ActivationLayerDataset.h b/tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ActivationLayerDataset.h
similarity index 98%
rename from tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ActivationLayerDataset.h
rename to tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ActivationLayerDataset.h
index 9f3c38f..dc4ffe4 100644
--- a/tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ActivationLayerDataset.h
+++ b/tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ActivationLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV1_ACTIVATION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV1_ACTIVATION_LAYER_DATASET
 
-#include "framework/datasets/Datasets.h"
+#include "tests/framework/datasets/Datasets.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h b/tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h
similarity index 99%
rename from tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h
rename to tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h
index dfa59ab..a4002d1 100644
--- a/tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h
+++ b/tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1ConvolutionLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV1_CONVOLUTION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV1_CONVOLUTION_LAYER_DATASET
 
-#include "tests/datasets_new/ConvolutionLayerDataset.h"
+#include "tests/datasets/ConvolutionLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1FullyConnectedLayerDataset.h b/tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1FullyConnectedLayerDataset.h
similarity index 96%
rename from tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1FullyConnectedLayerDataset.h
rename to tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1FullyConnectedLayerDataset.h
index 346bb52..80a3473 100644
--- a/tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1FullyConnectedLayerDataset.h
+++ b/tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1FullyConnectedLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV1_FULLYCONNECTED_LAYER_DATASET
 #define ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV1_FULLYCONNECTED_LAYER_DATASET
 
-#include "tests/datasets_new/FullyConnectedLayerDataset.h"
+#include "tests/datasets/FullyConnectedLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1GEMMDataset.h b/tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1GEMMDataset.h
similarity index 99%
rename from tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1GEMMDataset.h
rename to tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1GEMMDataset.h
index 6df3b92..806ca93 100644
--- a/tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1GEMMDataset.h
+++ b/tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1GEMMDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV1_GEMM_DATASET
 #define ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV1_GEMM_DATASET
 
-#include "tests/datasets_new/GEMMDataset.h"
+#include "tests/datasets/GEMMDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1NormalizationLayerDataset.h b/tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1NormalizationLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1NormalizationLayerDataset.h
rename to tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1NormalizationLayerDataset.h
index 4751dcd..d8fd061 100644
--- a/tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1NormalizationLayerDataset.h
+++ b/tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1NormalizationLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV1_NORMALIZATION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV1_NORMALIZATION_LAYER_DATASET
 
-#include "framework/datasets/Datasets.h"
+#include "tests/framework/datasets/Datasets.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1PoolingLayerDataset.h b/tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1PoolingLayerDataset.h
similarity index 98%
rename from tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1PoolingLayerDataset.h
rename to tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1PoolingLayerDataset.h
index 007175c..6164bba 100644
--- a/tests/datasets_new/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1PoolingLayerDataset.h
+++ b/tests/datasets/system_tests/googlenet/inceptionv1/GoogLeNetInceptionV1PoolingLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV1_POOLING_LAYER_DATASET
 #define ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV1_POOLING_LAYER_DATASET
 
-#include "tests/datasets_new/PoolingLayerDataset.h"
+#include "tests/datasets/PoolingLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ActivationLayerDataset.h b/tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ActivationLayerDataset.h
similarity index 99%
rename from tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ActivationLayerDataset.h
rename to tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ActivationLayerDataset.h
index d93b548..2d58639 100644
--- a/tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ActivationLayerDataset.h
+++ b/tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ActivationLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV4_ACTIVATION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV4_ACTIVATION_LAYER_DATASET
 
-#include "framework/datasets/Datasets.h"
+#include "tests/framework/datasets/Datasets.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4BatchNormalizationLayerDataset.h b/tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4BatchNormalizationLayerDataset.h
similarity index 98%
rename from tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4BatchNormalizationLayerDataset.h
rename to tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4BatchNormalizationLayerDataset.h
index 53bbca4..d96410f 100644
--- a/tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4BatchNormalizationLayerDataset.h
+++ b/tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4BatchNormalizationLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV4_BATCHNORMALIZATION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV4_BATCHNORMALIZATION_LAYER_DATASET
 
-#include "tests/datasets_new/BatchNormalizationLayerDataset.h"
+#include "tests/datasets/BatchNormalizationLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h b/tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h
similarity index 99%
rename from tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h
rename to tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h
index fe0d15a..a050d3d 100644
--- a/tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h
+++ b/tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4ConvolutionLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV4_CONVOLUTION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV4_CONVOLUTION_LAYER_DATASET
 
-#include "tests/datasets_new/ConvolutionLayerDataset.h"
+#include "tests/datasets/ConvolutionLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4FullyConnectedLayerDataset.h b/tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4FullyConnectedLayerDataset.h
similarity index 96%
rename from tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4FullyConnectedLayerDataset.h
rename to tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4FullyConnectedLayerDataset.h
index cf69969..8cf59e8 100644
--- a/tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4FullyConnectedLayerDataset.h
+++ b/tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4FullyConnectedLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV4_FULLYCONNECTED_LAYER_DATASET
 #define ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV4_FULLYCONNECTED_LAYER_DATASET
 
-#include "tests/datasets_new/FullyConnectedLayerDataset.h"
+#include "tests/datasets/FullyConnectedLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4PoolingLayerDataset.h b/tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4PoolingLayerDataset.h
similarity index 98%
rename from tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4PoolingLayerDataset.h
rename to tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4PoolingLayerDataset.h
index f0eb1ea..3b1ee8d 100644
--- a/tests/datasets_new/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4PoolingLayerDataset.h
+++ b/tests/datasets/system_tests/googlenet/inceptionv4/GoogLeNetInceptionV4PoolingLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV4_POOLING_LAYER_DATASET
 #define ARM_COMPUTE_TEST_GOOGLENETINCEPTIONV4_POOLING_LAYER_DATASET
 
-#include "tests/datasets_new/PoolingLayerDataset.h"
+#include "tests/datasets/PoolingLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/lenet5/LeNet5ActivationLayerDataset.h b/tests/datasets/system_tests/lenet5/LeNet5ActivationLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/lenet5/LeNet5ActivationLayerDataset.h
rename to tests/datasets/system_tests/lenet5/LeNet5ActivationLayerDataset.h
index 5d2a36b..4c88cde 100644
--- a/tests/datasets_new/system_tests/lenet5/LeNet5ActivationLayerDataset.h
+++ b/tests/datasets/system_tests/lenet5/LeNet5ActivationLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_LENET5_ACTIVATION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_LENET5_ACTIVATION_LAYER_DATASET
 
-#include "framework/datasets/Datasets.h"
+#include "tests/framework/datasets/Datasets.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/lenet5/LeNet5ConvolutionLayerDataset.h b/tests/datasets/system_tests/lenet5/LeNet5ConvolutionLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/lenet5/LeNet5ConvolutionLayerDataset.h
rename to tests/datasets/system_tests/lenet5/LeNet5ConvolutionLayerDataset.h
index 446a413..e1d3ead 100644
--- a/tests/datasets_new/system_tests/lenet5/LeNet5ConvolutionLayerDataset.h
+++ b/tests/datasets/system_tests/lenet5/LeNet5ConvolutionLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_LENET5_CONVOLUTION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_LENET5_CONVOLUTION_LAYER_DATASET
 
-#include "tests/datasets_new/ConvolutionLayerDataset.h"
+#include "tests/datasets/ConvolutionLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/lenet5/LeNet5FullyConnectedLayerDataset.h b/tests/datasets/system_tests/lenet5/LeNet5FullyConnectedLayerDataset.h
similarity index 96%
rename from tests/datasets_new/system_tests/lenet5/LeNet5FullyConnectedLayerDataset.h
rename to tests/datasets/system_tests/lenet5/LeNet5FullyConnectedLayerDataset.h
index bbbf712..343ecc0 100644
--- a/tests/datasets_new/system_tests/lenet5/LeNet5FullyConnectedLayerDataset.h
+++ b/tests/datasets/system_tests/lenet5/LeNet5FullyConnectedLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_LENET5_FULLYCONNECTED_LAYER_DATASET
 #define ARM_COMPUTE_TEST_LENET5_FULLYCONNECTED_LAYER_DATASET
 
-#include "tests/datasets_new/FullyConnectedLayerDataset.h"
+#include "tests/datasets/FullyConnectedLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/lenet5/LeNet5PoolingLayerDataset.h b/tests/datasets/system_tests/lenet5/LeNet5PoolingLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/lenet5/LeNet5PoolingLayerDataset.h
rename to tests/datasets/system_tests/lenet5/LeNet5PoolingLayerDataset.h
index bc234d8..bc2de7b 100644
--- a/tests/datasets_new/system_tests/lenet5/LeNet5PoolingLayerDataset.h
+++ b/tests/datasets/system_tests/lenet5/LeNet5PoolingLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_LENET5_POOLING_LAYER_DATASET
 #define ARM_COMPUTE_TEST_LENET5_POOLING_LAYER_DATASET
 
-#include "tests/datasets_new/PoolingLayerDataset.h"
+#include "tests/datasets/PoolingLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/squeezenet/SqueezeNetActivationLayerDataset.h b/tests/datasets/system_tests/squeezenet/SqueezeNetActivationLayerDataset.h
similarity index 98%
rename from tests/datasets_new/system_tests/squeezenet/SqueezeNetActivationLayerDataset.h
rename to tests/datasets/system_tests/squeezenet/SqueezeNetActivationLayerDataset.h
index 9cc9973..7644387 100644
--- a/tests/datasets_new/system_tests/squeezenet/SqueezeNetActivationLayerDataset.h
+++ b/tests/datasets/system_tests/squeezenet/SqueezeNetActivationLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_SQUEEZENET_ACTIVATION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_SQUEEZENET_ACTIVATION_LAYER_DATASET
 
-#include "framework/datasets/Datasets.h"
+#include "tests/framework/datasets/Datasets.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h b/tests/datasets/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h
similarity index 98%
rename from tests/datasets_new/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h
rename to tests/datasets/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h
index 07ec6c9..2d447b0 100644
--- a/tests/datasets_new/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h
+++ b/tests/datasets/system_tests/squeezenet/SqueezeNetConvolutionLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_SQUEEZENET_CONVOLUTION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_SQUEEZENET_CONVOLUTION_LAYER_DATASET
 
-#include "tests/datasets_new/ConvolutionLayerDataset.h"
+#include "tests/datasets/ConvolutionLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/squeezenet/SqueezeNetPoolingLayerDataset.h b/tests/datasets/system_tests/squeezenet/SqueezeNetPoolingLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/squeezenet/SqueezeNetPoolingLayerDataset.h
rename to tests/datasets/system_tests/squeezenet/SqueezeNetPoolingLayerDataset.h
index dc443c8..69d04db 100644
--- a/tests/datasets_new/system_tests/squeezenet/SqueezeNetPoolingLayerDataset.h
+++ b/tests/datasets/system_tests/squeezenet/SqueezeNetPoolingLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_SQUEEZENET_POOLING_LAYER_DATASET
 #define ARM_COMPUTE_TEST_SQUEEZENET_POOLING_LAYER_DATASET
 
-#include "tests/datasets_new/PoolingLayerDataset.h"
+#include "tests/datasets/PoolingLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/vgg/vgg16/VGG16ActivationLayerDataset.h b/tests/datasets/system_tests/vgg/vgg16/VGG16ActivationLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/vgg/vgg16/VGG16ActivationLayerDataset.h
rename to tests/datasets/system_tests/vgg/vgg16/VGG16ActivationLayerDataset.h
index 757357f..66301dd 100644
--- a/tests/datasets_new/system_tests/vgg/vgg16/VGG16ActivationLayerDataset.h
+++ b/tests/datasets/system_tests/vgg/vgg16/VGG16ActivationLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_VGG16_ACTIVATION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_VGG16_ACTIVATION_LAYER_DATASET
 
-#include "framework/datasets/Datasets.h"
+#include "tests/framework/datasets/Datasets.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h b/tests/datasets/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h
similarity index 98%
rename from tests/datasets_new/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h
rename to tests/datasets/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h
index 4e5b2a6..36cb5d9 100644
--- a/tests/datasets_new/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h
+++ b/tests/datasets/system_tests/vgg/vgg16/VGG16ConvolutionLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_VGG16_CONVOLUTION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_VGG16_CONVOLUTION_LAYER_DATASET
 
-#include "tests/datasets_new/ConvolutionLayerDataset.h"
+#include "tests/datasets/ConvolutionLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/vgg/vgg16/VGG16FullyConnectedLayerDataset.h b/tests/datasets/system_tests/vgg/vgg16/VGG16FullyConnectedLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/vgg/vgg16/VGG16FullyConnectedLayerDataset.h
rename to tests/datasets/system_tests/vgg/vgg16/VGG16FullyConnectedLayerDataset.h
index 19d22ba..d34dc3f 100644
--- a/tests/datasets_new/system_tests/vgg/vgg16/VGG16FullyConnectedLayerDataset.h
+++ b/tests/datasets/system_tests/vgg/vgg16/VGG16FullyConnectedLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_VGG16_FULLYCONNECTED_LAYER_DATASET
 #define ARM_COMPUTE_TEST_VGG16_FULLYCONNECTED_LAYER_DATASET
 
-#include "tests/datasets_new/FullyConnectedLayerDataset.h"
+#include "tests/datasets/FullyConnectedLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/vgg/vgg16/VGG16PoolingLayerDataset.h b/tests/datasets/system_tests/vgg/vgg16/VGG16PoolingLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/vgg/vgg16/VGG16PoolingLayerDataset.h
rename to tests/datasets/system_tests/vgg/vgg16/VGG16PoolingLayerDataset.h
index fcd9d2f..4db2087 100644
--- a/tests/datasets_new/system_tests/vgg/vgg16/VGG16PoolingLayerDataset.h
+++ b/tests/datasets/system_tests/vgg/vgg16/VGG16PoolingLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_VGG16_POOLING_LAYER_DATASET
 #define ARM_COMPUTE_TEST_VGG16_POOLING_LAYER_DATASET
 
-#include "tests/datasets_new/PoolingLayerDataset.h"
+#include "tests/datasets/PoolingLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/yolo/v2/YOLOV2ActivationLayerDataset.h b/tests/datasets/system_tests/yolo/v2/YOLOV2ActivationLayerDataset.h
similarity index 98%
rename from tests/datasets_new/system_tests/yolo/v2/YOLOV2ActivationLayerDataset.h
rename to tests/datasets/system_tests/yolo/v2/YOLOV2ActivationLayerDataset.h
index 31327fa..8a2cd16 100644
--- a/tests/datasets_new/system_tests/yolo/v2/YOLOV2ActivationLayerDataset.h
+++ b/tests/datasets/system_tests/yolo/v2/YOLOV2ActivationLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_YOLOV2_ACTIVATION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_YOLOV2_ACTIVATION_LAYER_DATASET
 
-#include "framework/datasets/Datasets.h"
+#include "tests/framework/datasets/Datasets.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/yolo/v2/YOLOV2BatchNormalizationLayerDataset.h b/tests/datasets/system_tests/yolo/v2/YOLOV2BatchNormalizationLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/yolo/v2/YOLOV2BatchNormalizationLayerDataset.h
rename to tests/datasets/system_tests/yolo/v2/YOLOV2BatchNormalizationLayerDataset.h
index 8cb69db..cc6a6dc 100644
--- a/tests/datasets_new/system_tests/yolo/v2/YOLOV2BatchNormalizationLayerDataset.h
+++ b/tests/datasets/system_tests/yolo/v2/YOLOV2BatchNormalizationLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_YOLOV2_BATCHNORMALIZATION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_YOLOV2_BATCHNORMALIZATION_LAYER_DATASET
 
-#include "tests/datasets_new/BatchNormalizationLayerDataset.h"
+#include "tests/datasets/BatchNormalizationLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h b/tests/datasets/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h
similarity index 98%
rename from tests/datasets_new/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h
rename to tests/datasets/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h
index ad3c385..41f48b0 100644
--- a/tests/datasets_new/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h
+++ b/tests/datasets/system_tests/yolo/v2/YOLOV2ConvolutionLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_YOLOV2_CONVOLUTION_LAYER_DATASET
 #define ARM_COMPUTE_TEST_YOLOV2_CONVOLUTION_LAYER_DATASET
 
-#include "tests/datasets_new/ConvolutionLayerDataset.h"
+#include "tests/datasets/ConvolutionLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/datasets_new/system_tests/yolo/v2/YOLOV2PoolingLayerDataset.h b/tests/datasets/system_tests/yolo/v2/YOLOV2PoolingLayerDataset.h
similarity index 97%
rename from tests/datasets_new/system_tests/yolo/v2/YOLOV2PoolingLayerDataset.h
rename to tests/datasets/system_tests/yolo/v2/YOLOV2PoolingLayerDataset.h
index 273409d..3763d63 100644
--- a/tests/datasets_new/system_tests/yolo/v2/YOLOV2PoolingLayerDataset.h
+++ b/tests/datasets/system_tests/yolo/v2/YOLOV2PoolingLayerDataset.h
@@ -24,7 +24,7 @@
 #ifndef ARM_COMPUTE_TEST_YOLOV2_POOLING_LAYER_DATASET
 #define ARM_COMPUTE_TEST_YOLOV2_POOLING_LAYER_DATASET
 
-#include "tests/datasets_new/PoolingLayerDataset.h"
+#include "tests/datasets/PoolingLayerDataset.h"
 
 #include "tests/TypePrinter.h"
 
diff --git a/tests/framework/Asserts.h b/tests/framework/Asserts.h
new file mode 100644
index 0000000..b545a9e
--- /dev/null
+++ b/tests/framework/Asserts.h
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_FRAMEWORK_ASSERTS
+#define ARM_COMPUTE_TEST_FRAMEWORK_ASSERTS
+
+#include "Exceptions.h"
+#include "Framework.h"
+
+#include <sstream>
+#include <type_traits>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+// Cast char values to int so that their numeric value are printed.
+inline int make_printable(int8_t value)
+{
+    return value;
+}
+
+inline unsigned int make_printable(uint8_t value)
+{
+    return value;
+}
+
+// Everything else can be printed as its own type.
+template <typename T>
+inline T make_printable(T &&value)
+{
+    return value;
+}
+
+#define ARM_COMPUTE_TEST_INFO(INFO)                                               \
+    {                                                                             \
+        std::stringstream info;                                                   \
+        info << INFO;                                                             \
+        arm_compute::test::framework::Framework::get().add_test_info(info.str()); \
+    }
+
+namespace detail
+{
+#define ARM_COMPUTE_TEST_COMP_FACTORY(SEVERITY, SEVERITY_NAME, COMP, COMP_NAME, ERROR_CALL)                                            \
+    template <typename T, typename U>                                                                                                  \
+    void ARM_COMPUTE_##SEVERITY##_##COMP_NAME##_IMPL(T &&x, U &&y, const std::string &x_str, const std::string &y_str, LogLevel level) \
+    {                                                                                                                                  \
+        if(!(x COMP y))                                                                                                                \
+        {                                                                                                                              \
+            std::stringstream msg;                                                                                                     \
+            msg << #SEVERITY_NAME " '" << x_str << " " #COMP " " << y_str << "' failed. ["                                             \
+                << std::boolalpha << arm_compute::test::framework::make_printable(x)                                                   \
+                << " " #COMP " "                                                                                                       \
+                << std::boolalpha << arm_compute::test::framework::make_printable(y)                                                   \
+                << "]\n";                                                                                                              \
+            arm_compute::test::framework::Framework::get().print_test_info(msg);                                                       \
+            ERROR_CALL                                                                                                                 \
+        }                                                                                                                              \
+        arm_compute::test::framework::Framework::get().clear_test_info();                                                              \
+    }
+
+ARM_COMPUTE_TEST_COMP_FACTORY(EXPECT, Expectation, ==, EQUAL, arm_compute::test::framework::Framework::get().log_failed_expectation(arm_compute::test::framework::TestError(msg.str(), level));)
+ARM_COMPUTE_TEST_COMP_FACTORY(EXPECT, Expectation, !=, NOT_EQUAL, arm_compute::test::framework::Framework::get().log_failed_expectation(arm_compute::test::framework::TestError(msg.str(), level));)
+ARM_COMPUTE_TEST_COMP_FACTORY(ASSERT, Assertion, ==, EQUAL, throw arm_compute::test::framework::TestError(msg.str(), level);)
+ARM_COMPUTE_TEST_COMP_FACTORY(ASSERT, Assertion, !=, NOT_EQUAL, throw arm_compute::test::framework::TestError(msg.str(), level);)
+} // namespace detail
+
+#define ARM_COMPUTE_ASSERT_NOT_EQUAL(X, Y) \
+    arm_compute::test::framework::detail::ARM_COMPUTE_ASSERT_NOT_EQUAL_IMPL(X, Y, #X, #Y, LogLevel::ERRORS)
+
+#define ARM_COMPUTE_ASSERT_EQUAL(X, Y) \
+    arm_compute::test::framework::detail::ARM_COMPUTE_ASSERT_EQUAL_IMPL(X, Y, #X, #Y, LogLevel::ERRORS)
+
+#define ARM_COMPUTE_EXPECT_EQUAL(X, Y, LEVEL) \
+    arm_compute::test::framework::detail::ARM_COMPUTE_EXPECT_EQUAL_IMPL(X, Y, #X, #Y, LEVEL)
+
+#define ARM_COMPUTE_EXPECT_NOT_EQUAL(X, Y, LEVEL) \
+    arm_compute::test::framework::detail::ARM_COMPUTE_EXPECT_NOT_EQUAL_IMPL(X, Y, #X, #Y, LEVEL)
+
+#define ARM_COMPUTE_ASSERT(X)                                                                                         \
+    do                                                                                                                \
+    {                                                                                                                 \
+        const auto &x = X;                                                                                            \
+        if(!x)                                                                                                        \
+        {                                                                                                             \
+            std::stringstream msg;                                                                                    \
+            msg << "Assertion '" #X "' failed.\n";                                                                    \
+            arm_compute::test::framework::Framework::get().print_test_info(msg);                                      \
+            throw arm_compute::test::framework::TestError(msg.str(), arm_compute::test::framework::LogLevel::ERRORS); \
+        }                                                                                                             \
+        arm_compute::test::framework::Framework::get().clear_test_info();                                             \
+    } while(false)
+
+#define ARM_COMPUTE_EXPECT(X, LEVEL)                                                                                                          \
+    do                                                                                                                                        \
+    {                                                                                                                                         \
+        const auto &x = X;                                                                                                                    \
+        if(!x)                                                                                                                                \
+        {                                                                                                                                     \
+            std::stringstream msg;                                                                                                            \
+            msg << "Expectation '" #X "' failed.\n";                                                                                          \
+            arm_compute::test::framework::Framework::get().print_test_info(msg);                                                              \
+            arm_compute::test::framework::Framework::get().log_failed_expectation(arm_compute::test::framework::TestError(msg.str(), LEVEL)); \
+        }                                                                                                                                     \
+        arm_compute::test::framework::Framework::get().clear_test_info();                                                                     \
+    } while(false)
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_FRAMEWORK_ASSERTS */
diff --git a/tests/datasets_new/PoolingTypesDataset.h b/tests/framework/DatasetModes.cpp
similarity index 70%
copy from tests/datasets_new/PoolingTypesDataset.h
copy to tests/framework/DatasetModes.cpp
index 4e4fa26..3f747df 100644
--- a/tests/datasets_new/PoolingTypesDataset.h
+++ b/tests/framework/DatasetModes.cpp
@@ -21,29 +21,36 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#ifndef __ARM_COMPUTE_TEST_POOLING_TYPES_DATASET_H__
-#define __ARM_COMPUTE_TEST_POOLING_TYPES_DATASET_H__
+#include "DatasetModes.h"
 
-#include "arm_compute/core/Types.h"
+#include "Utils.h"
+
+#include <map>
 
 namespace arm_compute
 {
 namespace test
 {
-namespace datasets
+namespace framework
 {
-class PoolingTypes final : public framework::dataset::ContainerDataset<std::vector<PoolingType>>
+DatasetMode dataset_mode_from_name(const std::string &name)
 {
-public:
-    PoolingTypes()
-        : ContainerDataset("PoolType",
+    static const std::map<std::string, DatasetMode> modes =
     {
-        PoolingType::MAX, PoolingType::AVG
-    })
+        { "all", DatasetMode::ALL },
+        { "precommit", DatasetMode::PRECOMMIT },
+        { "nightly", DatasetMode::NIGHTLY },
+    };
+
+    try
     {
+        return modes.at(tolower(name));
     }
-};
-} // namespace datasets
+    catch(const std::out_of_range &)
+    {
+        throw std::invalid_argument(name);
+    }
+}
+} // namespace framework
 } // namespace test
 } // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_NORMALIZATION_TYPES_DATASET_H__ */
diff --git a/tests/framework/DatasetModes.h b/tests/framework/DatasetModes.h
new file mode 100644
index 0000000..27638b0
--- /dev/null
+++ b/tests/framework/DatasetModes.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_DATASET_MODES
+#define ARM_COMPUTE_TEST_DATASET_MODES
+
+#include <istream>
+#include <ostream>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Possible dataset modes. */
+enum class DatasetMode : unsigned int
+{
+    ALL       = ~0U,
+    DISABLED  = 0,
+    PRECOMMIT = 1,
+    NIGHTLY   = 2
+};
+
+inline DatasetMode operator&(DatasetMode t1, DatasetMode t2)
+{
+    using type = std::underlying_type<DatasetMode>::type;
+    return static_cast<DatasetMode>(static_cast<type>(t1) & static_cast<type>(t2));
+}
+
+inline DatasetMode operator|(DatasetMode t1, DatasetMode t2)
+{
+    using type = std::underlying_type<DatasetMode>::type;
+    return static_cast<DatasetMode>(static_cast<type>(t1) | static_cast<type>(t2));
+}
+
+inline DatasetMode &operator|=(DatasetMode &t1, DatasetMode t2)
+{
+    using type = std::underlying_type<DatasetMode>::type;
+    t1         = static_cast<DatasetMode>(static_cast<type>(t1) | static_cast<type>(t2));
+    return t1;
+}
+
+DatasetMode dataset_mode_from_name(const std::string &name);
+
+inline ::std::istream &operator>>(::std::istream &stream, DatasetMode &mode)
+{
+    std::string value;
+    stream >> value;
+    mode = dataset_mode_from_name(value);
+    return stream;
+}
+
+inline ::std::ostream &operator<<(::std::ostream &stream, DatasetMode mode)
+{
+    switch(mode)
+    {
+        case DatasetMode::PRECOMMIT:
+            stream << "PRECOMMIT";
+            break;
+        case DatasetMode::NIGHTLY:
+            stream << "NIGHTLY";
+            break;
+        case DatasetMode::ALL:
+            stream << "ALL";
+            break;
+        default:
+            throw std::invalid_argument("Unsupported dataset mode");
+    }
+
+    return stream;
+}
+
+inline std::string to_string(DatasetMode mode)
+{
+    std::stringstream stream;
+    stream << mode;
+    return stream.str();
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_DATASET_MODES */
diff --git a/tests/framework/Exceptions.cpp b/tests/framework/Exceptions.cpp
new file mode 100644
index 0000000..3d6c65c
--- /dev/null
+++ b/tests/framework/Exceptions.cpp
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "Exceptions.h"
+
+#include "Utils.h"
+
+#include <map>
+#include <sstream>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+LogLevel log_level_from_name(const std::string &name)
+{
+    static const std::map<std::string, LogLevel> levels =
+    {
+        { "none", LogLevel::NONE },
+        { "config", LogLevel::CONFIG },
+        { "tests", LogLevel::TESTS },
+        { "errors", LogLevel::ERRORS },
+        { "debug", LogLevel::DEBUG },
+        { "measurements", LogLevel::MEASUREMENTS },
+        { "all", LogLevel::ALL },
+    };
+
+    try
+    {
+        return levels.at(tolower(name));
+    }
+    catch(const std::out_of_range &)
+    {
+        throw std::invalid_argument(name);
+    }
+}
+
+::std::istream &operator>>(::std::istream &stream, LogLevel &level)
+{
+    std::string value;
+    stream >> value;
+    level = log_level_from_name(value);
+    return stream;
+}
+
+::std::ostream &operator<<(::std::ostream &stream, LogLevel level)
+{
+    switch(level)
+    {
+        case LogLevel::NONE:
+            stream << "NONE";
+            break;
+        case LogLevel::CONFIG:
+            stream << "CONFIG";
+            break;
+        case LogLevel::TESTS:
+            stream << "TESTS";
+            break;
+        case LogLevel::ERRORS:
+            stream << "ERRORS";
+            break;
+        case LogLevel::DEBUG:
+            stream << "DEBUG";
+            break;
+        case LogLevel::MEASUREMENTS:
+            stream << "MEASUREMENTS";
+            break;
+        case LogLevel::ALL:
+            stream << "ALL";
+            break;
+        default:
+            throw std::invalid_argument("Unsupported log level");
+    }
+
+    return stream;
+}
+
+std::string to_string(LogLevel level)
+{
+    std::stringstream stream;
+    stream << level;
+    return stream.str();
+}
+
+TestError::TestError(const std::string &msg, LogLevel level, std::string context)
+    : std::runtime_error{ msg }, _level{ level }, _msg{ msg }, _context{ std::move(context) }, _combined{ "ERROR: " + msg }
+{
+    if(!_context.empty())
+    {
+        _combined += "\nCONTEXT:\n" + _context;
+    }
+}
+
+LogLevel TestError::level() const
+{
+    return _level;
+}
+
+const char *TestError::what() const noexcept
+{
+    return _combined.c_str();
+}
+
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/framework/Exceptions.h b/tests/framework/Exceptions.h
new file mode 100644
index 0000000..edb0ed9
--- /dev/null
+++ b/tests/framework/Exceptions.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_EXCEPTIONS
+#define ARM_COMPUTE_TEST_EXCEPTIONS
+
+#include <istream>
+#include <ostream>
+#include <stdexcept>
+#include <string>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Severity of the information.
+ *
+ * Each category includes the ones above it.
+ *
+ * NONE == Only for filtering. Not used to tag information.
+ * CONFIG == Configuration info.
+ * TESTS == Information about the tests.
+ * ERRORS == Violated assertions/expectations.
+ * DEBUG == More violated assertions/expectations.
+ * MEASUREMENTS == Information about measurements.
+ * ALL == Only for filtering. Not used to tag information.
+ */
+enum class LogLevel
+{
+    NONE,
+    CONFIG,
+    TESTS,
+    ERRORS,
+    DEBUG,
+    MEASUREMENTS,
+    ALL,
+};
+
+LogLevel log_level_from_name(const std::string &name);
+::std::istream &operator>>(::std::istream &stream, LogLevel &level);
+::std::ostream &operator<<(::std::ostream &stream, LogLevel level);
+std::string to_string(LogLevel level);
+
+/** Error class for failures during test execution. */
+class TestError : public std::runtime_error
+{
+public:
+    using std::runtime_error::runtime_error;
+
+    /** Construct error with severity.
+     *
+     * @param[in] msg     Error message.
+     * @param[in] level   Severity level.
+     * @param[in] context Context.
+     */
+    TestError(const std::string &msg, LogLevel level, std::string context = "");
+
+    /** Severity of the error.
+     *
+     * @return Severity.
+     */
+    LogLevel level() const;
+
+    const char *what() const noexcept override;
+
+private:
+    LogLevel    _level{ LogLevel::ERRORS };
+    std::string _msg{};
+    std::string _context{};
+    std::string _combined{};
+};
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_EXCEPTIONS */
diff --git a/tests/dataset/PoolingTypesDataset.h b/tests/framework/Fixture.h
similarity index 62%
copy from tests/dataset/PoolingTypesDataset.h
copy to tests/framework/Fixture.h
index c8e3466..916dcc7 100644
--- a/tests/dataset/PoolingTypesDataset.h
+++ b/tests/framework/Fixture.h
@@ -21,35 +21,43 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#ifndef __ARM_COMPUTE_TEST_DATASET_POOLING_TYPE_DATASET_H__
-#define __ARM_COMPUTE_TEST_DATASET_POOLING_TYPE_DATASET_H__
-
-#include "arm_compute/core/Types.h"
-#include "dataset/GenericDataset.h"
-
-#ifdef BOOST
-#include "boost_wrapper.h"
-#endif /* BOOST */
+#ifndef ARM_COMPUTE_TEST_FIXTURE
+#define ARM_COMPUTE_TEST_FIXTURE
 
 namespace arm_compute
 {
 namespace test
 {
-/** Data set containing all possible pooling types.
+namespace framework
+{
+/** Abstract fixture class.
  *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on all pooling types.
+ * All custom fixtures have to inherit from this class.
  */
-class PoolingTypes final : public GenericDataset<PoolingType, 2>
+class Fixture
 {
 public:
-    PoolingTypes()
-        : GenericDataset{ PoolingType::MAX, PoolingType::AVG }
-    {
-    }
+    /** Setup function.
+     *
+     * This function is only invoked by non-data fixture test cases. Fixture
+     * data test cases implement a setup function with arguments matching the
+     * dataset.
+     *
+     * The function is called before the test case is executed.
+     */
+    void setup() {};
 
-    ~PoolingTypes() = default;
+    /** Teardown function.
+     *
+     * The function is called after the test case finished.
+     */
+    void teardown() {};
+
+protected:
+    Fixture()          = default;
+    virtual ~Fixture() = default;
 };
+} // namespace framework
 } // namespace test
 } // namespace arm_compute
-#endif //__ARM_COMPUTE_TEST_DATASET_POOLING_TYPE_DATASET_H__
+#endif /* ARM_COMPUTE_TEST_FIXTURE */
diff --git a/tests/framework/Framework.cpp b/tests/framework/Framework.cpp
new file mode 100644
index 0000000..315f8eb
--- /dev/null
+++ b/tests/framework/Framework.cpp
@@ -0,0 +1,494 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "Framework.h"
+
+#include "support/ToolchainSupport.h"
+
+#ifdef ARM_COMPUTE_CL
+#include "arm_compute/core/CL/OpenCL.h"
+#include "arm_compute/runtime/CL/CLScheduler.h"
+#endif /* ARM_COMPUTE_CL */
+
+#include <chrono>
+#include <iostream>
+#include <sstream>
+#include <type_traits>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+Framework::Framework()
+{
+    _available_instruments.emplace(InstrumentType::WALL_CLOCK_TIMER, Instrument::make_instrument<WallClockTimer>);
+#ifdef PMU_ENABLED
+    _available_instruments.emplace(InstrumentType::PMU_CYCLE_COUNTER, Instrument::make_instrument<CycleCounter>);
+    _available_instruments.emplace(InstrumentType::PMU_INSTRUCTION_COUNTER, Instrument::make_instrument<InstructionCounter>);
+#endif /* PMU_ENABLED */
+}
+
+std::set<InstrumentType> Framework::available_instruments() const
+{
+    std::set<InstrumentType> types;
+
+    for(const auto &instrument : _available_instruments)
+    {
+        types.emplace(instrument.first);
+    }
+
+    return types;
+}
+
+std::map<TestResult::Status, int> Framework::count_test_results() const
+{
+    std::map<TestResult::Status, int> counts;
+
+    for(const auto &test : _test_results)
+    {
+        ++counts[test.second.status];
+    }
+
+    return counts;
+}
+
+Framework &Framework::get()
+{
+    static Framework instance;
+    return instance;
+}
+
+void Framework::init(const std::vector<InstrumentType> &instruments, int num_iterations, DatasetMode mode, const std::string &name_filter, const std::string &id_filter, LogLevel log_level)
+{
+    _test_filter    = TestFilter(mode, name_filter, id_filter);
+    _num_iterations = num_iterations;
+    _log_level      = log_level;
+
+    _instruments = InstrumentType::NONE;
+
+    for(const auto &instrument : instruments)
+    {
+        _instruments |= instrument;
+    }
+}
+
+std::string Framework::current_suite_name() const
+{
+    return join(_test_suite_name.cbegin(), _test_suite_name.cend(), "/");
+}
+
+void Framework::push_suite(std::string name)
+{
+    _test_suite_name.emplace_back(std::move(name));
+}
+
+void Framework::pop_suite()
+{
+    _test_suite_name.pop_back();
+}
+
+void Framework::add_test_info(std::string info)
+{
+    _test_info.emplace_back(std::move(info));
+}
+
+void Framework::clear_test_info()
+{
+    _test_info.clear();
+}
+
+bool Framework::has_test_info() const
+{
+    return !_test_info.empty();
+}
+
+void Framework::print_test_info(std::ostream &os) const
+{
+    if(!_test_info.empty())
+    {
+        os << "CONTEXT:\n";
+
+        for(const auto &str : _test_info)
+        {
+            os << "    " << str << "\n";
+        }
+    }
+}
+
+void Framework::log_test_start(const TestInfo &info)
+{
+    if(_printer != nullptr && _log_level >= LogLevel::TESTS)
+    {
+        _printer->print_test_header(info);
+    }
+}
+
+void Framework::log_test_skipped(const TestInfo &info)
+{
+    static_cast<void>(info);
+}
+
+void Framework::log_test_end(const TestInfo &info)
+{
+    if(_printer != nullptr)
+    {
+        if(_log_level >= LogLevel::MEASUREMENTS)
+        {
+            _printer->print_measurements(_test_results.at(info).measurements);
+        }
+
+        if(_log_level >= LogLevel::TESTS)
+        {
+            _printer->print_test_footer();
+        }
+    }
+}
+
+void Framework::log_failed_expectation(const TestError &error)
+{
+    if(_log_level >= error.level() && _printer != nullptr)
+    {
+        _printer->print_error(error);
+    }
+
+    if(_current_test_result != nullptr)
+    {
+        _current_test_result->status = TestResult::Status::FAILED;
+    }
+}
+
+int Framework::num_iterations() const
+{
+    return _num_iterations;
+}
+
+void Framework::set_num_iterations(int num_iterations)
+{
+    _num_iterations = num_iterations;
+}
+
+void Framework::set_throw_errors(bool throw_errors)
+{
+    _throw_errors = throw_errors;
+}
+
+bool Framework::throw_errors() const
+{
+    return _throw_errors;
+}
+
+void Framework::set_stop_on_error(bool stop_on_error)
+{
+    _stop_on_error = stop_on_error;
+}
+
+bool Framework::stop_on_error() const
+{
+    return _stop_on_error;
+}
+
+void Framework::run_test(const TestInfo &info, TestCaseFactory &test_factory)
+{
+    if(test_factory.status() == TestCaseFactory::Status::DISABLED)
+    {
+        log_test_skipped(info);
+        set_test_result(info, TestResult(TestResult::Status::DISABLED));
+        return;
+    }
+
+    log_test_start(info);
+
+    Profiler   profiler = get_profiler();
+    TestResult result(TestResult::Status::NOT_RUN);
+
+    _current_test_result = &result;
+
+    if(_log_level >= LogLevel::ERRORS && _printer != nullptr)
+    {
+        _printer->print_errors_header();
+    }
+
+    try
+    {
+        std::unique_ptr<TestCase> test_case = test_factory.make();
+
+        try
+        {
+            test_case->do_setup();
+
+            for(int i = 0; i < _num_iterations; ++i)
+            {
+                profiler.start();
+                test_case->do_run();
+#ifdef ARM_COMPUTE_CL
+                if(opencl_is_available())
+                {
+                    CLScheduler::get().sync();
+                }
+#endif /* ARM_COMPUTE_CL */
+                profiler.stop();
+            }
+
+            test_case->do_teardown();
+
+            // Change status to success if no error has happend
+            if(result.status == TestResult::Status::NOT_RUN)
+            {
+                result.status = TestResult::Status::SUCCESS;
+            }
+        }
+        catch(const TestError &error)
+        {
+            if(_log_level >= error.level() && _printer != nullptr)
+            {
+                _printer->print_error(error);
+            }
+
+            result.status = TestResult::Status::FAILED;
+
+            if(_throw_errors)
+            {
+                throw;
+            }
+        }
+#ifdef ARM_COMPUTE_CL
+        catch(const ::cl::Error &error)
+        {
+            if(_log_level >= LogLevel::ERRORS && _printer != nullptr)
+            {
+                std::stringstream stream;
+                stream << "Error code: " << error.err();
+                _printer->print_error(TestError(error.what(), LogLevel::ERRORS, stream.str()));
+            }
+
+            result.status = TestResult::Status::FAILED;
+
+            if(_throw_errors)
+            {
+                throw;
+            }
+        }
+#endif /* ARM_COMPUTE_CL */
+        catch(const std::exception &error)
+        {
+            if(_log_level >= LogLevel::ERRORS && _printer != nullptr)
+            {
+                _printer->print_error(error);
+            }
+
+            result.status = TestResult::Status::CRASHED;
+
+            if(_throw_errors)
+            {
+                throw;
+            }
+        }
+        catch(...)
+        {
+            if(_log_level >= LogLevel::ERRORS && _printer != nullptr)
+            {
+                _printer->print_error(TestError("Received unknown exception"));
+            }
+
+            result.status = TestResult::Status::CRASHED;
+
+            if(_throw_errors)
+            {
+                throw;
+            }
+        }
+    }
+    catch(const std::exception &error)
+    {
+        if(_log_level >= LogLevel::ERRORS && _printer != nullptr)
+        {
+            _printer->print_error(error);
+        }
+
+        result.status = TestResult::Status::CRASHED;
+
+        if(_throw_errors)
+        {
+            throw;
+        }
+    }
+    catch(...)
+    {
+        if(_log_level >= LogLevel::ERRORS && _printer != nullptr)
+        {
+            _printer->print_error(TestError("Received unknown exception"));
+        }
+
+        result.status = TestResult::Status::CRASHED;
+
+        if(_throw_errors)
+        {
+            throw;
+        }
+    }
+
+    if(_log_level >= LogLevel::ERRORS && _printer != nullptr)
+    {
+        _printer->print_errors_footer();
+    }
+
+    _current_test_result = nullptr;
+
+    if(result.status == TestResult::Status::FAILED)
+    {
+        if(info.status == TestCaseFactory::Status::EXPECTED_FAILURE)
+        {
+            result.status = TestResult::Status::EXPECTED_FAILURE;
+        }
+    }
+
+    if(result.status == TestResult::Status::FAILED || result.status == TestResult::Status::CRASHED)
+    {
+        if(_stop_on_error)
+        {
+            throw std::runtime_error("Abort on first error.");
+        }
+    }
+
+    result.measurements = profiler.measurements();
+
+    set_test_result(info, result);
+    log_test_end(info);
+}
+
+bool Framework::run()
+{
+    // Clear old test results
+    _test_results.clear();
+
+    if(_printer != nullptr && _log_level >= LogLevel::TESTS)
+    {
+        _printer->print_run_header();
+    }
+
+    const std::chrono::time_point<std::chrono::high_resolution_clock> start = std::chrono::high_resolution_clock::now();
+
+    int id = 0;
+
+    for(auto &test_factory : _test_factories)
+    {
+        const std::string test_case_name = test_factory->name();
+        const TestInfo    test_info{ id, test_case_name, test_factory->mode(), test_factory->status() };
+
+        if(_test_filter.is_selected(test_info))
+        {
+            run_test(test_info, *test_factory);
+        }
+
+        ++id;
+    }
+
+    const std::chrono::time_point<std::chrono::high_resolution_clock> end = std::chrono::high_resolution_clock::now();
+
+    if(_printer != nullptr && _log_level >= LogLevel::TESTS)
+    {
+        _printer->print_run_footer();
+    }
+
+    auto runtime = std::chrono::duration_cast<std::chrono::seconds>(end - start);
+    std::map<TestResult::Status, int> results = count_test_results();
+
+    if(_log_level > LogLevel::NONE)
+    {
+        std::cout << "Executed " << _test_results.size() << " test(s) ("
+                  << results[TestResult::Status::SUCCESS] << " passed, "
+                  << results[TestResult::Status::EXPECTED_FAILURE] << " expected failures, "
+                  << results[TestResult::Status::FAILED] << " failed, "
+                  << results[TestResult::Status::CRASHED] << " crashed, "
+                  << results[TestResult::Status::DISABLED] << " disabled) in " << runtime.count() << " second(s)\n";
+    }
+
+    int num_successful_tests = results[TestResult::Status::SUCCESS] + results[TestResult::Status::EXPECTED_FAILURE];
+
+    return (static_cast<unsigned int>(num_successful_tests) == _test_results.size());
+}
+
+void Framework::set_test_result(TestInfo info, TestResult result)
+{
+    _test_results.emplace(std::move(info), std::move(result));
+}
+
+void Framework::print_test_results(Printer &printer) const
+{
+    printer.print_run_header();
+
+    for(const auto &test : _test_results)
+    {
+        printer.print_test_header(test.first);
+        printer.print_measurements(test.second.measurements);
+        printer.print_test_footer();
+    }
+
+    printer.print_run_footer();
+}
+
+Profiler Framework::get_profiler() const
+{
+    Profiler profiler;
+
+    for(const auto &instrument : _available_instruments)
+    {
+        if((instrument.first & _instruments) != InstrumentType::NONE)
+        {
+            profiler.add(instrument.second());
+        }
+    }
+
+    return profiler;
+}
+
+void Framework::set_printer(Printer *printer)
+{
+    _printer = printer;
+}
+
+std::vector<TestInfo> Framework::test_infos() const
+{
+    std::vector<TestInfo> ids;
+
+    int id = 0;
+
+    for(const auto &factory : _test_factories)
+    {
+        TestInfo test_info{ id, factory->name(), factory->mode(), factory->status() };
+
+        if(_test_filter.is_selected(test_info))
+        {
+            ids.emplace_back(std::move(test_info));
+        }
+
+        ++id;
+    }
+
+    return ids;
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/framework/Framework.h b/tests/framework/Framework.h
new file mode 100644
index 0000000..055392c
--- /dev/null
+++ b/tests/framework/Framework.h
@@ -0,0 +1,330 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_FRAMEWORK
+#define ARM_COMPUTE_TEST_FRAMEWORK
+
+#include "DatasetModes.h"
+#include "Exceptions.h"
+#include "Profiler.h"
+#include "TestCase.h"
+#include "TestCaseFactory.h"
+#include "TestFilter.h"
+#include "TestResult.h"
+#include "Utils.h"
+#include "instruments/Instruments.h"
+#include "printers/Printer.h"
+
+#include <algorithm>
+#include <chrono>
+#include <map>
+#include <memory>
+#include <numeric>
+#include <ostream>
+#include <regex>
+#include <set>
+#include <sstream>
+#include <string>
+#include <tuple>
+#include <vector>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Information about a test case.
+ *
+ * A test can be identified either via its id or via its name. Additionally
+ * each test is tagged with the data set mode in which it will be used and
+ * its status.
+ *
+ * @note The mapping between test id and test name is not guaranteed to be
+ * stable. It is subject to change as new test are added.
+ */
+struct TestInfo
+{
+    int                     id;
+    std::string             name;
+    DatasetMode             mode;
+    TestCaseFactory::Status status;
+};
+
+inline bool operator<(const TestInfo &lhs, const TestInfo &rhs)
+{
+    return lhs.id < rhs.id;
+}
+
+/** Main framework class.
+ *
+ * Keeps track of the global state, owns all test cases and collects results.
+ */
+class Framework final
+{
+public:
+    /** Access to the singleton.
+     *
+     * @return Unique instance of the framework class.
+     */
+    static Framework &get();
+
+    /** Supported instrument types for benchmarking.
+     *
+     * @return Set of all available instrument types.
+     */
+    std::set<InstrumentType> available_instruments() const;
+
+    /** Init the framework.
+     *
+     * @see TestFilter::TestFilter for the format of the string to filter ids.
+     *
+     * @param[in] instruments    Instrument types that will be used for benchmarking.
+     * @param[in] num_iterations Number of iterations per test.
+     * @param[in] mode           Dataset mode.
+     * @param[in] name_filter    Regular expression to filter tests by name. Only matching tests will be executed.
+     * @param[in] id_filter      String to match selected test ids. Only matching tests will be executed.
+     * @param[in] log_level      Verbosity of the output.
+     */
+    void init(const std::vector<InstrumentType> &instruments, int num_iterations, DatasetMode mode, const std::string &name_filter, const std::string &id_filter, LogLevel log_level);
+
+    /** Add a new test suite.
+     *
+     * @warning Cannot be used at execution time. It can only be used for
+     * registering test cases.
+     *
+     * @param[in] name Name of the added test suite.
+     *
+     * @return Name of the current test suite.
+     */
+    void push_suite(std::string name);
+
+    /** Remove innermost test suite.
+     *
+     * @warning Cannot be used at execution time. It can only be used for
+     * registering test cases.
+     */
+    void pop_suite();
+
+    /** Add a test case to the framework.
+     *
+     * @param[in] test_name Name of the new test case.
+     * @param[in] mode      Mode in which to include the test.
+     * @param[in] status    Status of the test case.
+     */
+    template <typename T>
+    void add_test_case(std::string test_name, DatasetMode mode, TestCaseFactory::Status status);
+
+    /** Add a data test case to the framework.
+     *
+     * @param[in] test_name   Name of the new test case.
+     * @param[in] mode        Mode in which to include the test.
+     * @param[in] status      Status of the test case.
+     * @param[in] description Description of @p data.
+     * @param[in] data        Data that will be used as input to the test.
+     */
+    template <typename T, typename D>
+    void add_data_test_case(std::string test_name, DatasetMode mode, TestCaseFactory::Status status, std::string description, D &&data);
+
+    /** Add info string for the next expectation/assertion.
+     *
+     * @param[in] info Info string.
+     */
+    void add_test_info(std::string info);
+
+    /** Clear the collected test info. */
+    void clear_test_info();
+
+    /** Check if any info has been registered.
+     *
+     * @return True if there is test info.
+     */
+    bool has_test_info() const;
+
+    /** Print test info.
+     *
+     * @param[out] os Output stream.
+     */
+    void print_test_info(std::ostream &os) const;
+
+    /** Tell the framework that execution of a test starts.
+     *
+     * @param[in] info Test info.
+     */
+    void log_test_start(const TestInfo &info);
+
+    /** Tell the framework that a test case is skipped.
+     *
+     * @param[in] info Test info.
+     */
+    void log_test_skipped(const TestInfo &info);
+
+    /** Tell the framework that a test case finished.
+     *
+     * @param[in] info Test info.
+     */
+    void log_test_end(const TestInfo &info);
+
+    /** Tell the framework that the currently running test case failed a non-fatal expectation.
+     *
+     * @param[in] error Description of the error.
+     */
+    void log_failed_expectation(const TestError &error);
+
+    /** Number of iterations per test case.
+     *
+     * @return Number of iterations per test case.
+     */
+    int num_iterations() const;
+
+    /** Set number of iterations per test case.
+     *
+     * @param[in] num_iterations Number of iterations per test case.
+     */
+    void set_num_iterations(int num_iterations);
+
+    /** Should errors be caught or thrown by the framework.
+     *
+     * @return True if errors are thrown.
+     */
+    bool throw_errors() const;
+
+    /** Set whether errors are caught or thrown by the framework.
+     *
+     * @param[in] throw_errors True if errors should be thrown.
+     */
+    void set_throw_errors(bool throw_errors);
+
+    /** Indicates if test execution is stopped after the first failed test.
+     *
+     * @return True if the execution is going to be aborted after the first failed test.
+     */
+    bool stop_on_error() const;
+
+    /** Set whether to abort execution after the first failed test.
+     *
+     * @param[in] stop_on_error True if execution is going to be aborted after first failed test.
+     */
+    void set_stop_on_error(bool stop_on_error);
+
+    /** Run all enabled test cases.
+     *
+     * @return True if all test cases executed successful.
+     */
+    bool run();
+
+    /** Set the result for an executed test case.
+     *
+     * @param[in] info   Test info.
+     * @param[in] result Execution result.
+     */
+    void set_test_result(TestInfo info, TestResult result);
+
+    /** Use the specified printer to output test results from the last run.
+     *
+     * This method can be used if the test results need to be obtained using a
+     * different printer than the one managed by the framework.
+     *
+     * @param[in] printer Printer used to output results.
+     */
+    void print_test_results(Printer &printer) const;
+
+    /** Factory method to obtain a configured profiler.
+     *
+     * The profiler enables all instruments that have been passed to the @ref
+     * init method.
+     *
+     * @return Configured profiler to collect benchmark results.
+     */
+    Profiler get_profiler() const;
+
+    /** Set the printer used for the output of test results.
+     *
+     * @param[in] printer Pointer to a printer.
+     */
+    void set_printer(Printer *printer);
+
+    /** List of @ref TestInfo's.
+     *
+     * @return Vector with all test ids.
+     */
+    std::vector<TestInfo> test_infos() const;
+
+private:
+    Framework();
+    ~Framework() = default;
+
+    Framework(const Framework &) = delete;
+    Framework &operator=(const Framework &) = delete;
+
+    void run_test(const TestInfo &info, TestCaseFactory &test_factory);
+    std::map<TestResult::Status, int> count_test_results() const;
+
+    /** Returns the current test suite name.
+     *
+     * @warning Cannot be used at execution time to get the test suite of the
+     * currently executed test case. It can only be used for registering test
+     * cases.
+     *
+     * @return Name of the current test suite.
+     */
+    std::string current_suite_name() const;
+
+    std::vector<std::string>                      _test_suite_name{};
+    std::vector<std::unique_ptr<TestCaseFactory>> _test_factories{};
+    std::map<TestInfo, TestResult> _test_results{};
+    int      _num_iterations{ 1 };
+    bool     _throw_errors{ false };
+    bool     _stop_on_error{ false };
+    Printer *_printer{ nullptr };
+
+    using create_function = std::unique_ptr<Instrument>();
+    std::map<InstrumentType, create_function *> _available_instruments{};
+
+    InstrumentType           _instruments{ InstrumentType::NONE };
+    TestFilter               _test_filter{};
+    LogLevel                 _log_level{ LogLevel::ALL };
+    TestResult              *_current_test_result{ nullptr };
+    std::vector<std::string> _test_info{};
+};
+
+template <typename T>
+inline void Framework::add_test_case(std::string test_name, DatasetMode mode, TestCaseFactory::Status status)
+{
+    _test_factories.emplace_back(support::cpp14::make_unique<SimpleTestCaseFactory<T>>(current_suite_name(), std::move(test_name), mode, status));
+}
+
+template <typename T, typename D>
+inline void Framework::add_data_test_case(std::string test_name, DatasetMode mode, TestCaseFactory::Status status, std::string description, D &&data)
+{
+    // WORKAROUND for GCC 4.9
+    // The function should get *it which is tuple but that seems to trigger a
+    // bug in the compiler.
+    auto tmp = std::unique_ptr<DataTestCaseFactory<T, decltype(*std::declval<D>())>>(new DataTestCaseFactory<T, decltype(*std::declval<D>())>(current_suite_name(), std::move(test_name), mode, status,
+                                                                                     std::move(description), *data));
+    _test_factories.emplace_back(std::move(tmp));
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_FRAMEWORK */
diff --git a/tests/framework/Macros.h b/tests/framework/Macros.h
new file mode 100644
index 0000000..7aabb75
--- /dev/null
+++ b/tests/framework/Macros.h
@@ -0,0 +1,260 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_FRAMEWORK_MACROS
+#define ARM_COMPUTE_TEST_FRAMEWORK_MACROS
+
+#include "Framework.h"
+#include "Registrars.h"
+#include "TestCase.h"
+
+//
+// TEST SUITE MACROS
+//
+#define TEST_SUITE(SUITE_NAME)  \
+    namespace SUITE_NAME##Suite \
+    {                           \
+    static arm_compute::test::framework::detail::TestSuiteRegistrar SUITE_NAME##Suite_reg{ #SUITE_NAME };
+
+#define TEST_SUITE_END()                                                       \
+    static arm_compute::test::framework::detail::TestSuiteRegistrar Suite_end; \
+    }
+//
+// TEST SUITE MACROS END
+//
+
+//
+// HELPER MACROS
+//
+
+#define CONCAT(ARG0, ARG1) ARG0##ARG1
+
+#define VARIADIC_SIZE_IMPL(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, size, ...) size
+#define VARIADIC_SIZE(...) VARIADIC_SIZE_IMPL(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
+
+#define JOIN_PARAM1(OP, param) OP(0, param)
+#define JOIN_PARAM2(OP, param, ...) \
+    OP(1, param)                    \
+    , JOIN_PARAM1(OP, __VA_ARGS__)
+#define JOIN_PARAM3(OP, param, ...) \
+    OP(2, param)                    \
+    , JOIN_PARAM2(OP, __VA_ARGS__)
+#define JOIN_PARAM4(OP, param, ...) \
+    OP(3, param)                    \
+    , JOIN_PARAM3(OP, __VA_ARGS__)
+#define JOIN_PARAM5(OP, param, ...) \
+    OP(4, param)                    \
+    , JOIN_PARAM4(OP, __VA_ARGS__)
+#define JOIN_PARAM6(OP, param, ...) \
+    OP(5, param)                    \
+    , JOIN_PARAM5(OP, __VA_ARGS__)
+#define JOIN_PARAM7(OP, param, ...) \
+    OP(6, param)                    \
+    , JOIN_PARAM6(OP, __VA_ARGS__)
+#define JOIN_PARAM8(OP, param, ...) \
+    OP(7, param)                    \
+    , JOIN_PARAM7(OP, __VA_ARGS__)
+#define JOIN_PARAM9(OP, param, ...) \
+    OP(8, param)                    \
+    , JOIN_PARAM8(OP, __VA_ARGS__)
+#define JOIN_PARAM10(OP, param, ...) \
+    OP(9, param)                     \
+    , JOIN_PARAM9(OP, __VA_ARGS__)
+#define JOIN_PARAM(OP, NUM, ...) \
+    CONCAT(JOIN_PARAM, NUM)      \
+    (OP, __VA_ARGS__)
+
+#define MAKE_TYPE_PARAM(i, name) typename T##i
+#define MAKE_ARG_PARAM(i, name) const T##i &name
+#define MAKE_TYPE_PARAMS(...) JOIN_PARAM(MAKE_TYPE_PARAM, VARIADIC_SIZE(__VA_ARGS__), __VA_ARGS__)
+#define MAKE_ARG_PARAMS(...) JOIN_PARAM(MAKE_ARG_PARAM, VARIADIC_SIZE(__VA_ARGS__), __VA_ARGS__)
+
+//
+// TEST CASE MACROS
+//
+#define TEST_CASE_CONSTRUCTOR(TEST_NAME) \
+    TEST_NAME() = default;
+#define DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET)                   \
+    template <typename D>                                                \
+    explicit TEST_NAME(D &&data) : DataTestCase{ std::forward<D>(data) } \
+    {                                                                    \
+    }
+#define FIXTURE_SETUP(FIXTURE) \
+    void do_setup() override   \
+    {                          \
+        FIXTURE::setup();      \
+    }
+#define FIXTURE_DATA_SETUP(FIXTURE)                 \
+    void do_setup() override                        \
+    {                                               \
+        apply(this, &FIXTURE::setup<As...>, _data); \
+    }
+#define FIXTURE_RUN(FIXTURE) \
+    void do_run() override   \
+    {                        \
+        FIXTURE::run();      \
+    }
+#define FIXTURE_TEARDOWN(FIXTURE) \
+    void do_teardown() override   \
+    {                             \
+        FIXTURE::teardown();      \
+    }
+#define TEST_REGISTRAR(TEST_NAME, MODE, STATUS)                                               \
+    static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME> TEST_NAME##_reg \
+    {                                                                                         \
+        #TEST_NAME, MODE, STATUS                                                              \
+    }
+#define DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET)                                                          \
+    static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME<decltype(DATASET)::type>> TEST_NAME##_reg \
+    {                                                                                                                  \
+        #TEST_NAME, MODE, STATUS, DATASET                                                                              \
+    }
+
+#define TEST_CASE_IMPL(TEST_NAME, MODE, STATUS)                     \
+    class TEST_NAME : public arm_compute::test::framework::TestCase \
+    {                                                               \
+    public:                                                     \
+        TEST_CASE_CONSTRUCTOR(TEST_NAME)                            \
+        void do_run() override;                                     \
+    };                                                              \
+    TEST_REGISTRAR(TEST_NAME, MODE, STATUS);                        \
+    void TEST_NAME::do_run()
+
+#define TEST_CASE(TEST_NAME, MODE) \
+    TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
+#define EXPECTED_FAILURE_TEST_CASE(TEST_NAME, MODE) \
+    TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
+#define DISABLED_TEST_CASE(TEST_NAME, MODE) \
+    TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
+
+#define DATA_TEST_CASE_IMPL(TEST_NAME, MODE, STATUS, DATASET, ...)                                                  \
+    template <typename T>                                                                                           \
+    class TEST_NAME;                                                                                                \
+    template <typename... As>                                                                                       \
+    class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type> \
+    {                                                                                                               \
+    public:                                                                                                     \
+        DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET)                                                              \
+        void do_run() override                                                                                      \
+        {                                                                                                           \
+            arm_compute::test::framework::apply(this, &TEST_NAME::run<As...>, _data);                               \
+        }                                                                                                           \
+        template <MAKE_TYPE_PARAMS(__VA_ARGS__)>                                                                    \
+        void run(MAKE_ARG_PARAMS(__VA_ARGS__));                                                                     \
+    };                                                                                                              \
+    DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET);                                                          \
+    template <typename... As>                                                                                       \
+    template <MAKE_TYPE_PARAMS(__VA_ARGS__)>                                                                        \
+    void TEST_NAME<std::tuple<As...>>::run(MAKE_ARG_PARAMS(__VA_ARGS__))
+
+#define DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
+    DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET, __VA_ARGS__)
+#define EXPECTED_FAILURE_DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
+    DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET, __VA_ARGS__)
+#define DISABLED_DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
+    DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET, __VA_ARGS__)
+
+#define FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS)                    \
+    class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
+    {                                                                               \
+    public:                                                                     \
+        TEST_CASE_CONSTRUCTOR(TEST_NAME)                                            \
+        FIXTURE_SETUP(FIXTURE)                                                      \
+        void do_run() override;                                                     \
+        FIXTURE_TEARDOWN(FIXTURE)                                                   \
+    };                                                                              \
+    TEST_REGISTRAR(TEST_NAME, MODE, STATUS);                                        \
+    void TEST_NAME::do_run()
+
+#define FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
+    FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
+#define EXPECTED_FAILURE_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
+    FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
+#define DISABLED_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
+    FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
+
+#define FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS, DATASET)                                                      \
+    template <typename T>                                                                                                           \
+    class TEST_NAME;                                                                                                                \
+    template <typename... As>                                                                                                       \
+    class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
+    {                                                                                                                               \
+    public:                                                                                                                     \
+        DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET)                                                                              \
+        FIXTURE_DATA_SETUP(FIXTURE)                                                                                                 \
+        void do_run() override;                                                                                                     \
+        FIXTURE_TEARDOWN(FIXTURE)                                                                                                   \
+    };                                                                                                                              \
+    DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET);                                                                          \
+    template <typename... As>                                                                                                       \
+    void TEST_NAME<std::tuple<As...>>::do_run()
+
+#define FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
+    FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
+#define EXPECTED_FAILURE_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
+    FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
+#define DISABLED_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
+    FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET)
+
+#define REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS)           \
+    class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
+    {                                                                               \
+    public:                                                                     \
+        TEST_CASE_CONSTRUCTOR(TEST_NAME)                                            \
+        FIXTURE_SETUP(FIXTURE)                                                      \
+        FIXTURE_RUN(FIXTURE)                                                        \
+        FIXTURE_TEARDOWN(FIXTURE)                                                   \
+    };                                                                              \
+    TEST_REGISTRAR(TEST_NAME, MODE, STATUS)
+
+#define REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
+    REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
+#define EXPECTED_FAILURE_REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
+    REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
+#define DISABLED_REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
+    REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
+
+#define REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS, DATASET)                                             \
+    template <typename T>                                                                                                           \
+    class TEST_NAME;                                                                                                                \
+    template <typename... As>                                                                                                       \
+    class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
+    {                                                                                                                               \
+    public:                                                                                                                     \
+        DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET)                                                                              \
+        FIXTURE_DATA_SETUP(FIXTURE)                                                                                                 \
+        FIXTURE_RUN(FIXTURE)                                                                                                        \
+        FIXTURE_TEARDOWN(FIXTURE)                                                                                                   \
+    };                                                                                                                              \
+    DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET)
+
+#define REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
+    REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
+#define EXPECTED_FAILURE_REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
+    REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
+#define DISABLED_REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
+    REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET)
+//
+// TEST CASE MACROS END
+//
+#endif /* ARM_COMPUTE_TEST_FRAMEWORK_MACROS */
diff --git a/tests/validation_new/CPP/Floor.cpp b/tests/framework/Profiler.cpp
similarity index 65%
copy from tests/validation_new/CPP/Floor.cpp
copy to tests/framework/Profiler.cpp
index aed4fec..76de9a8 100644
--- a/tests/validation_new/CPP/Floor.cpp
+++ b/tests/framework/Profiler.cpp
@@ -21,37 +21,47 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "Floor.h"
+#include "Profiler.h"
 
-#include "tests/validation_new/Helpers.h"
-
-#include <cmath>
+#include <iostream>
+#include <utility>
 
 namespace arm_compute
 {
 namespace test
 {
-namespace validation
+namespace framework
 {
-namespace reference
+void Profiler::add(std::unique_ptr<Instrument> instrument)
 {
-template <typename T>
-SimpleTensor<T> floor_layer(const SimpleTensor<T> &src)
-{
-    // Create reference
-    SimpleTensor<T> dst{ src.shape(), src.data_type() };
-
-    // Compute reference
-    for(int i = 0; i < src.num_elements(); ++i)
-    {
-        dst[i] = std::floor(src[i]);
-    }
-
-    return dst;
+    _instruments.emplace_back(std::move(instrument));
 }
 
-template SimpleTensor<float> floor_layer(const SimpleTensor<float> &src);
-} // namespace reference
-} // namespace validation
+void Profiler::start()
+{
+    for(auto &instrument : _instruments)
+    {
+        instrument->start();
+    }
+}
+
+void Profiler::stop()
+{
+    for(auto &instrument : _instruments)
+    {
+        instrument->stop();
+    }
+
+    for(const auto &instrument : _instruments)
+    {
+        _measurements[instrument->id()].push_back(instrument->measurement());
+    }
+}
+
+const Profiler::MeasurementsMap &Profiler::measurements() const
+{
+    return _measurements;
+}
+} // namespace framework
 } // namespace test
 } // namespace arm_compute
diff --git a/tests/framework/Profiler.h b/tests/framework/Profiler.h
new file mode 100644
index 0000000..1454c0f
--- /dev/null
+++ b/tests/framework/Profiler.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_PROFILER
+#define ARM_COMPUTE_TEST_PROFILER
+
+#include "instruments/Instrument.h"
+
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Profiler class to collect benchmark numbers.
+ *
+ * A profiler manages multiple instruments that can collect different types of benchmarking numbers.
+ */
+class Profiler
+{
+public:
+    /** Mapping from instrument ids to their measurements. */
+    using MeasurementsMap = std::map<std::string, std::vector<Instrument::Measurement>>;
+
+    /** Add @p instrument to the performance monitor.
+     *
+     * All added instruments will be used when @ref start or @ref stop are
+     * called to make measurements.
+     *
+     * @param[in] instrument Instrument to be used to measure performance.
+     */
+    void add(std::unique_ptr<Instrument> instrument);
+
+    /** Start all added instruments to measure performance. */
+    void start();
+
+    /** Stop all added instruments. */
+    void stop();
+
+    /** Return measurements for all instruments. */
+    const MeasurementsMap &measurements() const;
+
+private:
+    std::vector<std::unique_ptr<Instrument>> _instruments{};
+    MeasurementsMap                          _measurements{};
+};
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_PROFILER */
diff --git a/tests/framework/Registrars.h b/tests/framework/Registrars.h
new file mode 100644
index 0000000..ca23edf
--- /dev/null
+++ b/tests/framework/Registrars.h
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_FRAMEWORK_REGISTRARS
+#define ARM_COMPUTE_TEST_FRAMEWORK_REGISTRARS
+
+#include "DatasetModes.h"
+#include "Framework.h"
+
+#include <string>
+#include <utility>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+namespace detail
+{
+/** Helper class to statically register a test case. */
+template <typename T>
+class TestCaseRegistrar final
+{
+public:
+    /** Add a new test case with the given name to the framework.
+     *
+     * @param[in] test_name Name of the test case.
+     * @param[in] mode      Mode in which the test should be activated.
+     * @param[in] status    Status of the test case.
+     */
+    TestCaseRegistrar(std::string test_name, DatasetMode mode, TestCaseFactory::Status status);
+
+    /** Add a new data test case with the given name to the framework.
+     *
+     * @param[in] test_name Name of the test case.
+     * @param[in] mode      Mode in which the test should be activated.
+     * @param[in] status    Status of the test case.
+     * @param[in] dataset   Dataset used as input for the test case.
+     */
+    template <typename D>
+    TestCaseRegistrar(std::string test_name, DatasetMode mode, TestCaseFactory::Status status, D &&dataset);
+};
+
+/** Helper class to statically begin and end a test suite. */
+class TestSuiteRegistrar final
+{
+public:
+    /** Remove the last added test suite from the framework. */
+    TestSuiteRegistrar();
+
+    /** Add a new test suite with the given name to the framework.
+     *
+     * @param[in] name Name of the test suite.
+     */
+    TestSuiteRegistrar(std::string name);
+};
+
+template <typename T>
+inline TestCaseRegistrar<T>::TestCaseRegistrar(std::string test_name, DatasetMode mode, TestCaseFactory::Status status)
+{
+    Framework::get().add_test_case<T>(std::move(test_name), mode, status);
+}
+
+template <typename T>
+template <typename D>
+inline TestCaseRegistrar<T>::TestCaseRegistrar(std::string test_name, DatasetMode mode, TestCaseFactory::Status status, D &&dataset)
+{
+    auto it = dataset.begin();
+
+    for(int i = 0; i < dataset.size(); ++i, ++it)
+    {
+        // WORKAROUND for GCC 4.9
+        // The last argument should be *it to pass just the data and not the
+        // iterator.
+        Framework::get().add_data_test_case<T>(test_name, mode, status, it.description(), it);
+    }
+}
+
+inline TestSuiteRegistrar::TestSuiteRegistrar()
+{
+    Framework::get().pop_suite();
+}
+
+inline TestSuiteRegistrar::TestSuiteRegistrar(std::string name)
+{
+    Framework::get().push_suite(std::move(name));
+}
+} // namespace detail
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_FRAMEWORK_REGISTRARS */
diff --git a/tests/framework/SConscript b/tests/framework/SConscript
new file mode 100644
index 0000000..3663251
--- /dev/null
+++ b/tests/framework/SConscript
@@ -0,0 +1,71 @@
+# Copyright (c) 2017 ARM Limited.
+#
+# SPDX-License-Identifier: MIT
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+import SCons
+import os.path
+
+Import('env')
+Import('vars')
+
+# vars is imported from arm_compute:
+variables = [
+    BoolVariable("pmu", "Enable PMU counters", False)
+]
+
+# We need a separate set of Variables for the Help message (Otherwise the global variables will get displayed twice)
+new_options = Variables('scons')
+
+for v in variables:
+    new_options.Add(v)
+    vars.Add(v)
+
+# Clone the environment to make sure we're not polluting the arm_compute one:
+framework_env = env.Clone()
+vars.Update(framework_env)
+
+Help(new_options.GenerateHelpText(framework_env))
+
+if env['os'] == 'android' and framework_env['pmu']:
+    print("pmu=1 is not supported for os=android")
+    Exit(1)
+
+if(env['opencl']):
+    framework_env.Append(CPPDEFINES=['ARM_COMPUTE_CL'])
+
+framework_env.Append(CPPPATH = ["."])
+framework_env.Append(CPPFLAGS=['-Wno-overloaded-virtual'])
+
+files = Glob('*.cpp')
+files += Glob('command_line/*.cpp')
+files += Glob('printers/*.cpp')
+files += Glob('datasets/*.cpp')
+files += Glob('instruments/*.cpp')
+
+if not framework_env['pmu']:
+    # Remove PMU files
+    files = [f for f in files if "PMU" not in os.path.basename(str(f))]
+else:
+    framework_env.Append(CPPDEFINES = ['PMU_ENABLED'])
+
+arm_compute_test_framework = framework_env.StaticLibrary('arm_compute_test_framework', files)
+
+Default(arm_compute_test_framework)
+Export('arm_compute_test_framework')
diff --git a/tests/validation_new/CPP/Floor.cpp b/tests/framework/TestCase.h
similarity index 65%
copy from tests/validation_new/CPP/Floor.cpp
copy to tests/framework/TestCase.h
index aed4fec..dbb9312 100644
--- a/tests/validation_new/CPP/Floor.cpp
+++ b/tests/framework/TestCase.h
@@ -21,37 +21,50 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "Floor.h"
+#ifndef ARM_COMPUTE_TEST_TESTCASE
+#define ARM_COMPUTE_TEST_TESTCASE
 
-#include "tests/validation_new/Helpers.h"
-
-#include <cmath>
+#include <string>
+#include <utility>
 
 namespace arm_compute
 {
 namespace test
 {
-namespace validation
+namespace framework
 {
-namespace reference
+/** Abstract test case class.
+ *
+ * All test cases have to inherit from this class.
+ */
+class TestCase
 {
-template <typename T>
-SimpleTensor<T> floor_layer(const SimpleTensor<T> &src)
-{
-    // Create reference
-    SimpleTensor<T> dst{ src.shape(), src.data_type() };
+public:
+    virtual void do_setup() {};
+    virtual void do_run() {};
+    virtual void do_teardown() {};
 
-    // Compute reference
-    for(int i = 0; i < src.num_elements(); ++i)
+    /** Default destructor. */
+    virtual ~TestCase() = default;
+
+protected:
+    TestCase() = default;
+
+    friend class TestCaseFactory;
+};
+
+template <typename T>
+class DataTestCase : public TestCase
+{
+protected:
+    explicit DataTestCase(T data)
+        : _data{ std::move(data) }
     {
-        dst[i] = std::floor(src[i]);
     }
 
-    return dst;
-}
-
-template SimpleTensor<float> floor_layer(const SimpleTensor<float> &src);
-} // namespace reference
-} // namespace validation
+    T _data;
+};
+} // namespace framework
 } // namespace test
 } // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_TESTCASE */
diff --git a/tests/framework/TestCaseFactory.h b/tests/framework/TestCaseFactory.h
new file mode 100644
index 0000000..b8c8cdb
--- /dev/null
+++ b/tests/framework/TestCaseFactory.h
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_TEST_CASE_FACTORY
+#define ARM_COMPUTE_TEST_TEST_CASE_FACTORY
+
+#include "DatasetModes.h"
+#include "TestCase.h"
+#include "support/ToolchainSupport.h"
+
+#include <memory>
+#include <string>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Abstract factory class to create test cases. */
+class TestCaseFactory
+{
+public:
+    /** Test case status.
+     *
+     * ACTIVE == Test is run and result is validated. Failure on failed validation.
+     * EXPECTED_FAILURE == Test is run and result is validated. Failure on successful validation.
+     * DISABLED == Test is not run.
+     */
+    enum class Status
+    {
+        ACTIVE,
+        EXPECTED_FAILURE,
+        DISABLED
+    };
+
+    /** Constructor.
+     *
+     * @param[in] suite_name  Name of the test suite to which the test case has been added.
+     * @param[in] name        Name of the test case.
+     * @param[in] mode        Datset mode of the test case.
+     * @param[in] status      Status of the test case.
+     * @param[in] description Description of data arguments.
+     */
+    TestCaseFactory(std::string suite_name, std::string name, DatasetMode mode, Status status, std::string description = "");
+
+    /** Default destructor. */
+    virtual ~TestCaseFactory() = default;
+
+    /** Name of the test case.
+     *
+     * @return Name of the test case.
+     */
+    std::string name() const;
+
+    /** Get the mode for which test case will be enabled.
+     *
+     * @return Dataset mode of the test case.
+     */
+    DatasetMode mode() const;
+
+    /** Get the status of the test case.
+     *
+     * @return Status of the test case.
+     */
+    Status status() const;
+
+    /** Factory function to create the test case
+     *
+     * @return Unique pointer to a newly created test case.
+     */
+    virtual std::unique_ptr<TestCase> make() const = 0;
+
+private:
+    const std::string _suite_name;
+    const std::string _test_name;
+    const std::string _data_description;
+    const DatasetMode _mode{ DatasetMode::ALL };
+    const Status      _status{ Status::ACTIVE };
+};
+
+/** Implementation of a test case factory to create non-data test cases. */
+template <typename T>
+class SimpleTestCaseFactory final : public TestCaseFactory
+{
+public:
+    /** Default constructor. */
+    using TestCaseFactory::TestCaseFactory;
+
+    std::unique_ptr<TestCase> make() const override;
+};
+
+template <typename T, typename D>
+class DataTestCaseFactory final : public TestCaseFactory
+{
+public:
+    /** Constructor.
+     *
+     * @param[in] suite_name  Name of the test suite to which the test case has been added.
+     * @param[in] test_name   Name of the test case.
+     * @param[in] mode        Mode in which the test case is enabled.
+     * @param[in] status      Status of the test case.
+     * @param[in] description Description of data arguments.
+     * @param[in] data        Input data for the test case.
+     */
+    DataTestCaseFactory(std::string suite_name, std::string test_name, DatasetMode mode, Status status, std::string description, const D &data);
+
+    std::unique_ptr<TestCase> make() const override;
+
+private:
+    D _data;
+};
+
+inline TestCaseFactory::TestCaseFactory(std::string suite_name, std::string test_name, DatasetMode mode, Status status, std::string description)
+    : _suite_name{ std::move(suite_name) }, _test_name{ std::move(test_name) }, _data_description{ std::move(description) }, _mode{ mode }, _status{ status }
+
+{
+}
+
+inline std::string TestCaseFactory::name() const
+{
+    std::string name = _suite_name + "/" + _test_name;
+
+    if(!_data_description.empty())
+    {
+        name += "@" + _data_description;
+    }
+
+    return name;
+}
+
+inline DatasetMode TestCaseFactory::mode() const
+{
+    return _mode;
+}
+
+inline TestCaseFactory::Status TestCaseFactory::status() const
+{
+    return _status;
+}
+
+inline ::std::ostream &operator<<(::std::ostream &stream, TestCaseFactory::Status status)
+{
+    switch(status)
+    {
+        case TestCaseFactory::Status::ACTIVE:
+            stream << "ACTIVE";
+            break;
+        case TestCaseFactory::Status::EXPECTED_FAILURE:
+            stream << "EXPECTED_FAILURE";
+            break;
+        case TestCaseFactory::Status::DISABLED:
+            stream << "DISABLED";
+            break;
+        default:
+            throw std::invalid_argument("Unsupported test case factory status");
+    }
+
+    return stream;
+}
+
+template <typename T>
+inline std::unique_ptr<TestCase> SimpleTestCaseFactory<T>::make() const
+{
+    return support::cpp14::make_unique<T>();
+}
+
+template <typename T, typename D>
+inline DataTestCaseFactory<T, D>::DataTestCaseFactory(std::string suite_name, std::string test_name, DatasetMode mode, Status status, std::string description, const D &data)
+    : TestCaseFactory{ std::move(suite_name), std::move(test_name), mode, status, std::move(description) }, _data{ data }
+{
+}
+
+template <typename T, typename D>
+inline std::unique_ptr<TestCase> DataTestCaseFactory<T, D>::make() const
+{
+    return support::cpp14::make_unique<T>(_data);
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_TEST_CASE_FACTORY */
diff --git a/tests/framework/TestFilter.cpp b/tests/framework/TestFilter.cpp
new file mode 100644
index 0000000..0af40c1
--- /dev/null
+++ b/tests/framework/TestFilter.cpp
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "TestFilter.h"
+
+#include "Framework.h"
+#include "support/ToolchainSupport.h"
+
+#include <sstream>
+#include <string>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+TestFilter::TestFilter(DatasetMode mode, const std::string &name_filter, const std::string &id_filter)
+    : _dataset_mode{ mode }, _name_filter{ name_filter }, _id_filter{ parse_id_filter(id_filter) }
+{
+}
+
+bool TestFilter::is_selected(const TestInfo &info) const
+{
+    if((info.mode & _dataset_mode) == DatasetMode::DISABLED)
+    {
+        return false;
+    }
+
+    if(!std::regex_search(info.name, _name_filter))
+    {
+        return false;
+    }
+
+    if(!_id_filter.empty())
+    {
+        bool found = false;
+
+        for(const auto range : _id_filter)
+        {
+            if(range.first <= info.id && info.id <= range.second)
+            {
+                found = true;
+                break;
+            }
+        }
+
+        if(!found)
+        {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+TestFilter::Ranges TestFilter::parse_id_filter(const std::string &id_filter) const
+{
+    Ranges      ranges;
+    std::string str;
+    bool        in_range = false;
+    int         value    = 0;
+    int         start    = 0;
+    int         end      = std::numeric_limits<int>::max();
+
+    std::stringstream stream(id_filter);
+
+    // Get first value
+    std::getline(stream, str, ',');
+
+    if(stream.fail())
+    {
+        return ranges;
+    }
+
+    if(str.find("...") != std::string::npos)
+    {
+        in_range = true;
+    }
+    else
+    {
+        start = support::cpp11::stoi(str);
+        end   = start;
+    }
+
+    while(!stream.eof())
+    {
+        std::getline(stream, str, ',');
+
+        if(stream.fail())
+        {
+            break;
+        }
+
+        if(str.find("...") != std::string::npos)
+        {
+            end      = std::numeric_limits<int>::max();
+            in_range = true;
+        }
+        else
+        {
+            value = support::cpp11::stoi(str);
+
+            if(in_range || end == value - 1)
+            {
+                end      = value;
+                in_range = false;
+            }
+            else
+            {
+                ranges.emplace_back(start, end);
+                start = value;
+                end   = start;
+            }
+        }
+    }
+
+    ranges.emplace_back(start, end);
+    return ranges;
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/framework/TestFilter.h b/tests/framework/TestFilter.h
new file mode 100644
index 0000000..f64e73a
--- /dev/null
+++ b/tests/framework/TestFilter.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_TESTFILTER
+#define ARM_COMPUTE_TEST_TESTFILTER
+
+#include "DatasetModes.h"
+
+#include <regex>
+#include <utility>
+#include <vector>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+struct TestInfo;
+
+/** Test filter class.
+ *
+ * Stores information about which test cases are selected for execution. Based
+ * on test name and test id.
+ */
+class TestFilter final
+{
+public:
+    /** Default constructor. All tests selected. */
+    TestFilter() = default;
+
+    /** Constructor.
+     *
+     * The id_filter string has be a comma separated list of test ids. ... can
+     * be used to include a range of tests. For instance, "..., 15" means all
+     * test up to and including 15, "3, 6, ..., 10" means tests 3 and 6 to 10,
+     * and "15, ..." means test 15 and all following.
+     *
+     * @param[in] mode        Dataset mode.
+     * @param[in] name_filter Regular expression to filter tests by name. Only matching tests will be executed.
+     * @param[in] id_filter   String to match selected test ids. Only matching tests will be executed.
+     */
+    TestFilter(DatasetMode mode, const std::string &name_filter, const std::string &id_filter);
+
+    /** Check if a test case is selected to be executed.
+     *
+     * @param[in] info Test case info.
+     *
+     * @return True if the test case is selected to be executed.
+     */
+    bool is_selected(const TestInfo &info) const;
+
+private:
+    using Ranges = std::vector<std::pair<int, int>>;
+    Ranges parse_id_filter(const std::string &id_filter) const;
+
+    DatasetMode _dataset_mode{ DatasetMode::ALL };
+    std::regex  _name_filter{ ".*" };
+    Ranges      _id_filter{};
+};
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_TESTFILTER */
diff --git a/tests/framework/TestResult.h b/tests/framework/TestResult.h
new file mode 100644
index 0000000..e71ef95
--- /dev/null
+++ b/tests/framework/TestResult.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_TESTRESULT
+#define ARM_COMPUTE_TEST_TESTRESULT
+
+#include "Profiler.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Class to store results of a test.
+ *
+ * Currently the execution status and profiling information are stored.
+ */
+struct TestResult
+{
+    /** Execution status of a test. */
+    enum class Status
+    {
+        NOT_RUN,
+        SUCCESS,
+        EXPECTED_FAILURE,
+        FAILED,
+        CRASHED,
+        DISABLED
+    };
+
+    /** Default constructor. */
+    TestResult() = default;
+
+    /** Initialise the result with a status.
+     *
+     * @param[in] status Execution status.
+     */
+    TestResult(Status status)
+        : status{ status }
+    {
+    }
+
+    /** Initialise the result with a status and profiling information.
+     *
+     * @param[in] status       Execution status.
+     * @param[in] measurements Profiling information.
+     */
+    TestResult(Status status, const Profiler::MeasurementsMap &measurements)
+        : status{ status }, measurements{ measurements }
+    {
+    }
+
+    Status                    status{ Status::NOT_RUN }; //< Execution status
+    Profiler::MeasurementsMap measurements{};            //< Profiling information
+};
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_TESTRESULT */
diff --git a/tests/framework/Utils.h b/tests/framework/Utils.h
new file mode 100644
index 0000000..a9fe0dc
--- /dev/null
+++ b/tests/framework/Utils.h
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_UTILS
+#define ARM_COMPUTE_TEST_UTILS
+
+#include "support/ToolchainSupport.h"
+
+#include <algorithm>
+#include <cmath>
+#include <cstddef>
+#include <limits>
+#include <memory>
+#include <numeric>
+#include <sstream>
+#include <string>
+#include <type_traits>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** @cond */
+namespace detail
+{
+template <int...>
+struct sequence
+{
+};
+
+template <int N, int... Ns>
+struct sequence_generator;
+
+template <int... Ns>
+struct sequence_generator<0, Ns...>
+{
+    using type = sequence<Ns...>;
+};
+
+template <int N, int... Ns>
+struct sequence_generator : sequence_generator < N - 1, N - 1, Ns... >
+{
+};
+
+template <int N>
+using sequence_t = typename sequence_generator<N>::type;
+/** @endcond */
+
+template <typename O, typename F, typename... As, int... S>
+void apply_impl(O *obj, F &&func, const std::tuple<As...> &args, detail::sequence<S...>)
+{
+    (obj->*func)(std::get<S>(args)...);
+}
+} // namespace
+
+template <typename O, typename F, typename... As>
+void apply(O *obj, F &&func, const std::tuple<As...> &args)
+{
+    detail::apply_impl(obj, std::forward<F>(func), args, detail::sequence_t<sizeof...(As)>());
+}
+
+/** Helper function to concatenate multiple strings.
+ *
+ * @param[in] first     Iterator pointing to the first element to be concatenated.
+ * @param[in] last      Iterator pointing behind the last element to be concatenated.
+ * @param[in] separator String used to join the elements.
+ *
+ * @return String containing all elements joined by @p separator.
+ */
+template <typename T, typename std::enable_if<std::is_same<typename T::value_type, std::string>::value, int>::type = 0>
+std::string join(T first, T last, const std::string &separator)
+{
+    return std::accumulate(std::next(first), last, *first, [&separator](const std::string & base, const std::string & suffix)
+    {
+        return base + separator + suffix;
+    });
+}
+
+/** Helper function to concatenate multiple values.
+ *
+ * All values are converted to std::string using the provided operation before
+ * being joined.
+ *
+ * The signature of op has to be equivalent to
+ * std::string op(const T::value_type &val).
+ *
+ * @param[in] first     Iterator pointing to the first element to be concatenated.
+ * @param[in] last      Iterator pointing behind the last element to be concatenated.
+ * @param[in] separator String used to join the elements.
+ * @param[in] op        Conversion function.
+ *
+ * @return String containing all elements joined by @p separator.
+ */
+template <typename T, typename UnaryOp>
+std::string join(T &&first, T &&last, const std::string &separator, UnaryOp &&op)
+{
+    return std::accumulate(std::next(first), last, op(*first), [&separator, &op](const std::string & base, const typename T::value_type & suffix)
+    {
+        return base + separator + op(suffix);
+    });
+}
+
+/** Helper function to concatenate multiple values.
+ *
+ * All values are converted to std::string using std::to_string before being joined.
+ *
+ * @param[in] first     Iterator pointing to the first element to be concatenated.
+ * @param[in] last      Iterator pointing behind the last element to be concatenated.
+ * @param[in] separator String used to join the elements.
+ *
+ * @return String containing all elements joined by @p separator.
+ */
+template <typename T, typename std::enable_if<std::is_arithmetic<typename T::value_type>::value, int>::type = 0>
+std::string join(T && first, T && last, const std::string &separator)
+{
+    return join(std::forward<T>(first), std::forward<T>(last), separator, support::cpp11::to_string);
+}
+
+/** Convert string to lower case.
+ *
+ * @param[in] string To be converted string.
+ *
+ * @return Lower case string.
+ */
+inline std::string tolower(std::string string)
+{
+    std::transform(string.begin(), string.end(), string.begin(), [](unsigned char c)
+    {
+        return std::tolower(c);
+    });
+    return string;
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_UTILS */
diff --git a/tests/validation/CL/CLFixture.cpp b/tests/framework/command_line/CommandLineOptions.h
similarity index 80%
copy from tests/validation/CL/CLFixture.cpp
copy to tests/framework/command_line/CommandLineOptions.h
index 38e52c3..cb4b794 100644
--- a/tests/validation/CL/CLFixture.cpp
+++ b/tests/framework/command_line/CommandLineOptions.h
@@ -21,12 +21,13 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "validation/CL/CLFixture.h"
+#ifndef ARM_COMPUTE_TEST_COMMANDLINEOPTIONS
+#define ARM_COMPUTE_TEST_COMMANDLINEOPTIONS
 
-#include "boost_wrapper.h"
+#include "EnumListOption.h"
+#include "EnumOption.h"
+#include "ListOption.h"
+#include "Option.h"
+#include "ToggleOption.h"
 
-using namespace arm_compute;
-using namespace arm_compute::test;
-using namespace arm_compute::test::validation;
-
-BOOST_GLOBAL_FIXTURE(CLFixture);
+#endif /* ARM_COMPUTE_TEST_COMMANDLINEOPTIONS */
diff --git a/tests/framework/command_line/CommandLineParser.cpp b/tests/framework/command_line/CommandLineParser.cpp
new file mode 100644
index 0000000..228b18d
--- /dev/null
+++ b/tests/framework/command_line/CommandLineParser.cpp
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "CommandLineParser.h"
+
+#include <iostream>
+#include <regex>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+void CommandLineParser::parse(int argc, char **argv)
+{
+    const std::regex option_regex{ "--((?:no-)?)([^=]+)(?:=(.*))?" };
+
+    const auto set_option = [&](const std::string & option, const std::string & name, const std::string & value)
+    {
+        if(_options.find(name) == _options.end())
+        {
+            _unknown_options.push_back(option);
+            return;
+        }
+
+        const bool success = _options[name]->parse(value);
+
+        if(!success)
+        {
+            _invalid_options.push_back(option);
+        }
+    };
+
+    unsigned int positional_index = 0;
+
+    for(int i = 1; i < argc; ++i)
+    {
+        const std::string option{ argv[i] };
+        std::smatch       option_matches;
+
+        if(std::regex_match(option, option_matches, option_regex))
+        {
+            // Boolean option
+            if(option_matches.str(3).empty())
+            {
+                set_option(option, option_matches.str(2), option_matches.str(1).empty() ? "true" : "false");
+            }
+            else
+            {
+                // Can't have "no-" and a value
+                if(!option_matches.str(1).empty())
+                {
+                    _invalid_options.emplace_back(option);
+                }
+                else
+                {
+                    set_option(option, option_matches.str(2), option_matches.str(3));
+                }
+            }
+        }
+        else
+        {
+            if(positional_index >= _positional_options.size())
+            {
+                _invalid_options.push_back(option);
+            }
+            else
+            {
+                _positional_options[positional_index]->parse(option);
+                ++positional_index;
+            }
+        }
+    }
+}
+
+bool CommandLineParser::validate() const
+{
+    bool is_valid = true;
+
+    for(const auto &option : _options)
+    {
+        if(option.second->is_required() && !option.second->is_set())
+        {
+            is_valid = false;
+            std::cerr << "ERROR: Option '" << option.second->name() << "' is required but not given!\n";
+        }
+    }
+
+    for(const auto &option : _positional_options)
+    {
+        if(option->is_required() && !option->is_set())
+        {
+            is_valid = false;
+            std::cerr << "ERROR: Option '" << option->name() << "' is required but not given!\n";
+        }
+    }
+
+    for(const auto &option : _unknown_options)
+    {
+        std::cerr << "WARNING: Skipping unknown option '" << option << "'!\n";
+    }
+
+    for(const auto &option : _invalid_options)
+    {
+        std::cerr << "WARNING: Skipping invalid option '" << option << "'!\n";
+    }
+
+    return is_valid;
+}
+
+void CommandLineParser::print_help(const std::string &program_name) const
+{
+    std::cout << "usage: " << program_name << " \n";
+
+    for(const auto &option : _options)
+    {
+        std::cout << option.second->help() << "\n";
+    }
+
+    for(const auto &option : _positional_options)
+    {
+        //FIXME: Print help string as well
+        std::cout << option->name() << "\n";
+    }
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/framework/command_line/CommandLineParser.h b/tests/framework/command_line/CommandLineParser.h
new file mode 100644
index 0000000..adb5214
--- /dev/null
+++ b/tests/framework/command_line/CommandLineParser.h
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_COMMANDLINEPARSER
+#define ARM_COMPUTE_TEST_COMMANDLINEPARSER
+
+#include "../Utils.h"
+#include "Option.h"
+
+#include <map>
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Class to parse command line arguments. */
+class CommandLineParser final
+{
+public:
+    /** Default constructor. */
+    CommandLineParser() = default;
+
+    /** Function to add a new option to the parser.
+     *
+     * @param[in] name Name of the option. Will be available under --name=VALUE.
+     * @param[in] args Option specific configuration arguments.
+     *
+     * @return Pointer to the option. The option is owned by the parser.
+     */
+    template <typename T, typename... As>
+    T *add_option(const std::string &name, As &&... args);
+
+    /** Function to add a new positional argument to the parser.
+     *
+     * @param[in] args Option specific configuration arguments.
+     *
+     * @return Pointer to the option. The option is owned by the parser.
+     */
+    template <typename T, typename... As>
+    T *add_positional_option(As &&... args);
+
+    /** Parses the command line arguments and updates the options accordingly.
+     *
+     * @param[in] argc Number of arguments.
+     * @param[in] argv Arguments.
+     */
+    void parse(int argc, char **argv);
+
+    /** Validates the previously parsed command line arguments.
+     *
+     * Validation fails if not all required options are provided. Additionally
+     * warnings are generated for options that have illegal values or unknown
+     * options.
+     *
+     * @return True if all required options have been provided.
+     */
+    bool validate() const;
+
+    /** Prints a help message for all configured options.
+     *
+     * @param[in] program_name Name of the program to be used in the help message.
+     */
+    void print_help(const std::string &program_name) const;
+
+private:
+    using OptionsMap              = std::map<std::string, std::unique_ptr<Option>>;
+    using PositionalOptionsVector = std::vector<std::unique_ptr<Option>>;
+
+    OptionsMap               _options{};
+    PositionalOptionsVector  _positional_options{};
+    std::vector<std::string> _unknown_options{};
+    std::vector<std::string> _invalid_options{};
+};
+
+template <typename T, typename... As>
+inline T *CommandLineParser::add_option(const std::string &name, As &&... args)
+{
+    auto result = _options.emplace(name, support::cpp14::make_unique<T>(name, std::forward<As>(args)...));
+    return static_cast<T *>(result.first->second.get());
+}
+
+template <typename T, typename... As>
+inline T *CommandLineParser::add_positional_option(As &&... args)
+{
+    _positional_options.emplace_back(support::cpp14::make_unique<T>(std::forward<As>(args)...));
+    return static_cast<T *>(_positional_options.back().get());
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_COMMANDLINEPARSER */
diff --git a/tests/framework/command_line/EnumListOption.h b/tests/framework/command_line/EnumListOption.h
new file mode 100644
index 0000000..d19bfbd
--- /dev/null
+++ b/tests/framework/command_line/EnumListOption.h
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_ENUMLISTOPTION
+#define ARM_COMPUTE_TEST_ENUMLISTOPTION
+
+#include "Option.h"
+
+#include <initializer_list>
+#include <set>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Implementation of an option that accepts any number of values from a fixed set. */
+template <typename T>
+class EnumListOption : public Option
+{
+public:
+    /** Construct option with allowed values.
+     *
+     * @param[in] name           Name of the option.
+     * @param[in] allowed_values Set of allowed values for the option.
+     */
+    EnumListOption(std::string name, std::set<T> allowed_values);
+
+    /** Construct option with allowed values, a fixed number of accepted values and default values for the option.
+     *
+     * @param[in] name           Name of the option.
+     * @param[in] allowed_values Set of allowed values for the option.
+     * @param[in] default_values Default values.
+     */
+    EnumListOption(std::string name, std::set<T> allowed_values, std::initializer_list<T> &&default_values);
+
+    bool parse(std::string value) override;
+    std::string           help() const override;
+    const std::vector<T> &value() const;
+
+private:
+    std::vector<T> _values{};
+    std::set<T>    _allowed_values{};
+};
+
+template <typename T>
+inline EnumListOption<T>::EnumListOption(std::string name, std::set<T> allowed_values)
+    : Option{ std::move(name) }, _allowed_values{ std::move(allowed_values) }
+{
+}
+
+template <typename T>
+inline EnumListOption<T>::EnumListOption(std::string name, std::set<T> allowed_values, std::initializer_list<T> &&default_values)
+    : Option{ std::move(name), false, true }, _values{ std::forward<std::initializer_list<T>>(default_values) }, _allowed_values{ std::move(allowed_values) }
+{
+}
+
+template <typename T>
+bool EnumListOption<T>::parse(std::string value)
+{
+    // Remove default values
+    _values.clear();
+    _is_set = true;
+
+    try
+    {
+        std::stringstream stream{ value };
+        std::string       item;
+
+        while(!std::getline(stream, item, ',').fail())
+        {
+            std::stringstream item_stream(item);
+            T                 typed_value{};
+
+            item_stream >> typed_value;
+
+            if(!item_stream.fail())
+            {
+                if(_allowed_values.count(typed_value) == 0)
+                {
+                    _values.clear();
+                    return false;
+                }
+
+                _values.emplace_back(typed_value);
+            }
+
+            _is_set = _is_set && !item_stream.fail();
+        }
+
+        return _is_set;
+    }
+    catch(const std::invalid_argument &)
+    {
+        return false;
+    }
+}
+
+template <typename T>
+std::string EnumListOption<T>::help() const
+{
+    std::stringstream msg;
+    msg << "--" + name() + "={";
+
+    for(const auto &value : _allowed_values)
+    {
+        msg << value << ",";
+    }
+
+    msg << "}[,{...}[,...]] - " << _help;
+
+    return msg.str();
+}
+
+template <typename T>
+inline const std::vector<T> &EnumListOption<T>::value() const
+{
+    return _values;
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_ENUMLISTOPTION */
diff --git a/tests/framework/command_line/EnumOption.h b/tests/framework/command_line/EnumOption.h
new file mode 100644
index 0000000..1abba77
--- /dev/null
+++ b/tests/framework/command_line/EnumOption.h
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_ENUMOPTION
+#define ARM_COMPUTE_TEST_ENUMOPTION
+
+#include "SimpleOption.h"
+
+#include <set>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Implementation of a simple option that accepts a value from a fixed set. */
+template <typename T>
+class EnumOption : public SimpleOption<T>
+{
+public:
+    /** Construct option with allowed values.
+     *
+     * @param[in] name           Name of the option.
+     * @param[in] allowed_values Set of allowed values for the option.
+     */
+    EnumOption(std::string name, std::set<T> allowed_values);
+
+    /** Construct option with allowed values, a fixed number of accepted values and default values for the option.
+     *
+     * @param[in] name           Name of the option.
+     * @param[in] allowed_values Set of allowed values for the option.
+     * @param[in] default_value  Default value.
+     */
+    EnumOption(std::string name, std::set<T> allowed_values, T default_value);
+
+    bool parse(std::string value) override;
+    std::string help() const override;
+    const T    &value() const;
+
+private:
+    std::set<T> _allowed_values{};
+};
+
+template <typename T>
+inline EnumOption<T>::EnumOption(std::string name, std::set<T> allowed_values)
+    : SimpleOption<T>{ std::move(name) }, _allowed_values{ std::move(allowed_values) }
+{
+}
+
+template <typename T>
+inline EnumOption<T>::EnumOption(std::string name, std::set<T> allowed_values, T default_value)
+    : SimpleOption<T>{ std::move(name), std::move(default_value) }, _allowed_values{ std::move(allowed_values) }
+{
+}
+
+template <typename T>
+bool EnumOption<T>::parse(std::string value)
+{
+    try
+    {
+        std::stringstream stream{ value };
+        T                 typed_value{};
+
+        stream >> typed_value;
+
+        if(!stream.fail())
+        {
+            if(_allowed_values.count(typed_value) == 0)
+            {
+                return false;
+            }
+
+            this->_value  = std::move(typed_value);
+            this->_is_set = true;
+            return true;
+        }
+
+        return false;
+    }
+    catch(const std::invalid_argument &)
+    {
+        return false;
+    }
+}
+
+template <typename T>
+std::string EnumOption<T>::help() const
+{
+    std::stringstream msg;
+    msg << "--" + this->name() + "={";
+
+    for(const auto &value : _allowed_values)
+    {
+        msg << value << ",";
+    }
+
+    msg << "} - " << this->_help;
+
+    return msg.str();
+}
+
+template <typename T>
+inline const T &EnumOption<T>::value() const
+{
+    return this->_value;
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_ENUMOPTION */
diff --git a/tests/framework/command_line/ListOption.h b/tests/framework/command_line/ListOption.h
new file mode 100644
index 0000000..8b1bb3d
--- /dev/null
+++ b/tests/framework/command_line/ListOption.h
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_LISTOPTION
+#define ARM_COMPUTE_TEST_LISTOPTION
+
+#include "Option.h"
+
+#include <initializer_list>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Implementation of an option that accepts any number of values. */
+template <typename T>
+class ListOption : public Option
+{
+public:
+    using Option::Option;
+
+    /** Construct the option with the given default values.
+     *
+     * @param[in] name           Name of the option.
+     * @param[in] default_values Default values.
+     */
+    ListOption(std::string name, std::initializer_list<T> &&default_values);
+
+    bool parse(std::string value) override;
+    std::string           help() const override;
+    const std::vector<T> &value() const;
+
+private:
+    std::vector<T> _values{};
+};
+
+template <typename T>
+inline ListOption<T>::ListOption(std::string name, std::initializer_list<T> &&default_values)
+    : Option{ std::move(name), false, true }, _values{ std::forward<std::initializer_list<T>>(default_values) }
+{
+}
+
+template <typename T>
+bool ListOption<T>::parse(std::string value)
+{
+    _is_set = true;
+
+    try
+    {
+        std::stringstream stream{ value };
+        std::string       item;
+
+        while(!std::getline(stream, item, ',').fail())
+        {
+            std::stringstream item_stream(item);
+            T                 typed_value{};
+
+            item_stream >> typed_value;
+
+            if(!item_stream.fail())
+            {
+                _values.emplace_back(typed_value);
+            }
+
+            _is_set = _is_set && !item_stream.fail();
+        }
+
+        return _is_set;
+    }
+    catch(const std::invalid_argument &)
+    {
+        return false;
+    }
+}
+
+template <typename T>
+inline std::string ListOption<T>::help() const
+{
+    return "--" + name() + "=VALUE[,VALUE[,...]] - " + _help;
+}
+
+template <typename T>
+inline const std::vector<T> &ListOption<T>::value() const
+{
+    return _values;
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_LISTOPTION */
diff --git a/tests/validation_new/CPP/Floor.cpp b/tests/framework/command_line/Option.cpp
similarity index 67%
copy from tests/validation_new/CPP/Floor.cpp
copy to tests/framework/command_line/Option.cpp
index aed4fec..d60c35a 100644
--- a/tests/validation_new/CPP/Floor.cpp
+++ b/tests/framework/command_line/Option.cpp
@@ -21,37 +21,48 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "Floor.h"
-
-#include "tests/validation_new/Helpers.h"
-
-#include <cmath>
+#include "Option.h"
 
 namespace arm_compute
 {
 namespace test
 {
-namespace validation
+namespace framework
 {
-namespace reference
+Option::Option(std::string name)
+    : _name{ std::move(name) }
 {
-template <typename T>
-SimpleTensor<T> floor_layer(const SimpleTensor<T> &src)
-{
-    // Create reference
-    SimpleTensor<T> dst{ src.shape(), src.data_type() };
-
-    // Compute reference
-    for(int i = 0; i < src.num_elements(); ++i)
-    {
-        dst[i] = std::floor(src[i]);
-    }
-
-    return dst;
 }
 
-template SimpleTensor<float> floor_layer(const SimpleTensor<float> &src);
-} // namespace reference
-} // namespace validation
+Option::Option(std::string name, bool is_required, bool is_set)
+    : _name{ std::move(name) }, _is_required{ is_required }, _is_set{ is_set }
+{
+}
+
+std::string Option::name() const
+{
+    return _name;
+}
+
+void Option::set_required(bool is_required)
+{
+    _is_required = is_required;
+}
+
+void Option::set_help(std::string help)
+{
+    _help = std::move(help);
+}
+
+bool Option::is_required() const
+{
+    return _is_required;
+}
+
+bool Option::is_set() const
+{
+    return _is_set;
+}
+} // namespace framework
 } // namespace test
 } // namespace arm_compute
diff --git a/tests/framework/command_line/Option.h b/tests/framework/command_line/Option.h
new file mode 100644
index 0000000..25cf492
--- /dev/null
+++ b/tests/framework/command_line/Option.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_OPTIONBASE
+#define ARM_COMPUTE_TEST_OPTIONBASE
+
+#include <string>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Abstract base class for a command line option. */
+class Option
+{
+public:
+    /** Constructor.
+     *
+     * @param[in] name Name of the option.
+     */
+    Option(std::string name);
+
+    /** Constructor.
+     *
+     * @param[in] name        Name of the option.
+     * @param[in] is_required Is the option required?
+     * @param[in] is_set      Has a value been assigned to the option?
+     */
+    Option(std::string name, bool is_required, bool is_set);
+
+    /** Default destructor. */
+    virtual ~Option() = default;
+
+    /** Parses the given string.
+     *
+     * @param[in] value String representation as passed on the command line.
+     *
+     * @return True if the value could be parsed by the specific subclass.
+     */
+    virtual bool parse(std::string value) = 0;
+
+    /** Help message for the option.
+     *
+     * @return String representing the help message for the specific subclass.
+     */
+    virtual std::string help() const = 0;
+
+    /** Name of the option.
+     *
+     * @return Name of the option.
+     */
+    std::string name() const;
+
+    /** Set whether the option is required.
+     *
+     * @param[in] is_required Pass true if the option is required.
+     */
+    void set_required(bool is_required);
+
+    /** Set the help message for the option.
+     *
+     * @param[in] help Option specific help message.
+     */
+    void set_help(std::string help);
+
+    /** Is the option required?
+     *
+     * @return True if the option is required.
+     */
+    bool is_required() const;
+
+    /** Has a value been assigned to the option?
+     *
+     * @return True if a value has been set.
+     */
+    bool is_set() const;
+
+protected:
+    std::string _name;
+    bool        _is_required{ false };
+    bool        _is_set{ false };
+    std::string _help{};
+};
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_OPTIONBASE */
diff --git a/tests/framework/command_line/SimpleOption.h b/tests/framework/command_line/SimpleOption.h
new file mode 100644
index 0000000..e6e8045
--- /dev/null
+++ b/tests/framework/command_line/SimpleOption.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_SIMPLEOPTION
+#define ARM_COMPUTE_TEST_SIMPLEOPTION
+
+#include "Option.h"
+
+#include <sstream>
+#include <stdexcept>
+#include <string>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Implementation of an option that accepts a single value. */
+template <typename T>
+class SimpleOption : public Option
+{
+public:
+    using Option::Option;
+
+    /** Construct the option with the given default value.
+     *
+     * @param[in] name          Name of the option.
+     * @param[in] default_value Default value.
+     */
+    SimpleOption(std::string name, T default_value);
+
+    bool parse(std::string value) override;
+    std::string help() const override;
+    const T    &value() const;
+
+protected:
+    T _value{};
+};
+
+template <typename T>
+inline SimpleOption<T>::SimpleOption(std::string name, T default_value)
+    : Option{ std::move(name), false, true }, _value{ std::move(default_value) }
+{
+}
+
+template <typename T>
+bool SimpleOption<T>::parse(std::string value)
+{
+    try
+    {
+        std::stringstream stream{ std::move(value) };
+        stream >> _value;
+        _is_set = !stream.fail();
+        return _is_set;
+    }
+    catch(const std::invalid_argument &)
+    {
+        return false;
+    }
+}
+
+template <>
+inline bool SimpleOption<std::string>::parse(std::string value)
+{
+    _value  = std::move(value);
+    _is_set = true;
+    return true;
+}
+
+template <typename T>
+inline std::string SimpleOption<T>::help() const
+{
+    return "--" + name() + "=VALUE - " + _help;
+}
+
+template <typename T>
+inline const T &SimpleOption<T>::value() const
+{
+    return _value;
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_SIMPLEOPTION */
diff --git a/tests/validation_new/CPP/Floor.cpp b/tests/framework/command_line/ToggleOption.cpp
similarity index 69%
copy from tests/validation_new/CPP/Floor.cpp
copy to tests/framework/command_line/ToggleOption.cpp
index aed4fec..df5b1f8 100644
--- a/tests/validation_new/CPP/Floor.cpp
+++ b/tests/framework/command_line/ToggleOption.cpp
@@ -21,37 +21,44 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "Floor.h"
+#include "ToggleOption.h"
 
-#include "tests/validation_new/Helpers.h"
-
-#include <cmath>
+#include <utility>
 
 namespace arm_compute
 {
 namespace test
 {
-namespace validation
+namespace framework
 {
-namespace reference
+ToggleOption::ToggleOption(std::string name, bool default_value)
+    : SimpleOption<bool>
 {
-template <typename T>
-SimpleTensor<T> floor_layer(const SimpleTensor<T> &src)
+    std::move(name), default_value
+}
 {
-    // Create reference
-    SimpleTensor<T> dst{ src.shape(), src.data_type() };
-
-    // Compute reference
-    for(int i = 0; i < src.num_elements(); ++i)
-    {
-        dst[i] = std::floor(src[i]);
-    }
-
-    return dst;
 }
 
-template SimpleTensor<float> floor_layer(const SimpleTensor<float> &src);
-} // namespace reference
-} // namespace validation
+bool ToggleOption::parse(std::string value)
+{
+    if(value == "true")
+    {
+        _value  = true;
+        _is_set = true;
+    }
+    else if(value == "false")
+    {
+        _value  = false;
+        _is_set = true;
+    }
+
+    return _is_set;
+}
+
+std::string ToggleOption::help() const
+{
+    return "--" + name() + ", --no-" + name() + " - " + _help;
+}
+} // namespace framework
 } // namespace test
 } // namespace arm_compute
diff --git a/tests/datasets_new/PoolingTypesDataset.h b/tests/framework/command_line/ToggleOption.h
similarity index 64%
copy from tests/datasets_new/PoolingTypesDataset.h
copy to tests/framework/command_line/ToggleOption.h
index 4e4fa26..c440c0e 100644
--- a/tests/datasets_new/PoolingTypesDataset.h
+++ b/tests/framework/command_line/ToggleOption.h
@@ -21,29 +21,36 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#ifndef __ARM_COMPUTE_TEST_POOLING_TYPES_DATASET_H__
-#define __ARM_COMPUTE_TEST_POOLING_TYPES_DATASET_H__
+#ifndef ARM_COMPUTE_TEST_TOGGLEOPTION
+#define ARM_COMPUTE_TEST_TOGGLEOPTION
 
-#include "arm_compute/core/Types.h"
+#include "SimpleOption.h"
+
+#include <string>
 
 namespace arm_compute
 {
 namespace test
 {
-namespace datasets
+namespace framework
 {
-class PoolingTypes final : public framework::dataset::ContainerDataset<std::vector<PoolingType>>
+/** Implementation of an option that can be either true or false. */
+class ToggleOption : public SimpleOption<bool>
 {
 public:
-    PoolingTypes()
-        : ContainerDataset("PoolType",
-    {
-        PoolingType::MAX, PoolingType::AVG
-    })
-    {
-    }
+    using SimpleOption::SimpleOption;
+
+    /** Construct the option with the given default value.
+     *
+     * @param[in] name          Name of the option.
+     * @param[in] default_value Default value.
+     */
+    ToggleOption(std::string name, bool default_value);
+
+    bool parse(std::string value) override;
+    std::string help() const override;
 };
-} // namespace datasets
+} // namespace framework
 } // namespace test
 } // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_NORMALIZATION_TYPES_DATASET_H__ */
+#endif /* ARM_COMPUTE_TEST_TOGGLEOPTION */
diff --git a/tests/framework/datasets/CartesianProductDataset.h b/tests/framework/datasets/CartesianProductDataset.h
new file mode 100644
index 0000000..f6e45dd
--- /dev/null
+++ b/tests/framework/datasets/CartesianProductDataset.h
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_DATASET_CARTESIAN_PRODUCT
+#define ARM_COMPUTE_TEST_DATASET_CARTESIAN_PRODUCT
+
+#include "Dataset.h"
+
+#include <string>
+#include <tuple>
+#include <utility>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+namespace dataset
+{
+/** Implementation of a dataset representing all combinations of values of the input datasets.
+ *
+ * For example, for the inputs {1, 2} and {3, 4} this dataset virtually
+ * represents the values {(1, 3), (1, 4), (2, 3), (2, 4)}.
+ */
+template <typename T, typename U>
+class CartesianProductDataset : public Dataset
+{
+private:
+    using T_noref    = typename std::remove_reference<T>::type;
+    using U_noref    = typename std::remove_reference<U>::type;
+    using iter1_type = typename T_noref::iterator;
+    using iter2_type = typename U_noref::iterator;
+
+public:
+    /** Construct dataset from the given datasets.
+     *
+     * @param[in] dataset1 First dataset.
+     * @param[in] dataset2 Second dataset.
+     */
+    CartesianProductDataset(T &&dataset1, U &&dataset2)
+        : _dataset1{ std::forward<T>(dataset1) },
+          _dataset2{ std::forward<U>(dataset2) }
+    {
+    }
+
+    CartesianProductDataset(CartesianProductDataset &&) = default;
+
+    /** Type of the dataset. */
+    using type = decltype(std::tuple_cat(*std::declval<iter1_type>(), *std::declval<iter2_type>()));
+
+    /** Iterator for the dataset. */
+    struct iterator
+    {
+        iterator(const T_noref *dataset1, const U_noref *dataset2)
+            : _iter1{ dataset1->begin() },
+              _dataset2{ dataset2 },
+              _iter2{ dataset2->begin() }
+        {
+        }
+
+        iterator(const iterator &) = default;
+        iterator &operator=(const iterator &) = default;
+        iterator(iterator &&)                 = default;
+        iterator &operator=(iterator &&) = default;
+
+        ~iterator() = default;
+
+        std::string description() const
+        {
+            return _iter1.description() + ":" + _iter2.description();
+        }
+
+        CartesianProductDataset::type operator*() const
+        {
+            return std::tuple_cat(*_iter1, *_iter2);
+        }
+
+        iterator &operator++()
+        {
+            ++_second_pos;
+
+            if(_second_pos < _dataset2->size())
+            {
+                ++_iter2;
+            }
+            else
+            {
+                _second_pos = 0;
+                _iter2      = _dataset2->begin();
+
+                ++_iter1;
+            }
+
+            return *this;
+        }
+
+    private:
+        iter1_type     _iter1;
+        const U_noref *_dataset2;
+        iter2_type     _iter2;
+        int            _first_pos{ 0 };
+        int            _second_pos{ 0 };
+    };
+
+    /** Iterator pointing at the begin of the dataset.
+     *
+     * @return Iterator for the dataset.
+     */
+    iterator begin() const
+    {
+        return iterator(&_dataset1, &_dataset2);
+    }
+
+    /** Size of the dataset.
+     *
+     * @return Number of values in the dataset.
+     */
+    int size() const
+    {
+        return _dataset1.size() * _dataset2.size();
+    }
+
+private:
+    T _dataset1;
+    U _dataset2;
+};
+
+/** Helper function to create a @ref CartesianProductDataset.
+ *
+ * @param[in] dataset1 First dataset.
+ * @param[in] dataset2 Second dataset.
+ *
+ * @return A grid dataset.
+ */
+template <typename T, typename U>
+CartesianProductDataset<T, U> combine(T &&dataset1, U &&dataset2)
+{
+    return CartesianProductDataset<T, U>(std::forward<T>(dataset1), std::forward<U>(dataset2));
+}
+} // namespace dataset
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_DATASET_CARTESIAN_PRODUCT */
diff --git a/tests/framework/datasets/ContainerDataset.h b/tests/framework/datasets/ContainerDataset.h
new file mode 100644
index 0000000..bdca97c
--- /dev/null
+++ b/tests/framework/datasets/ContainerDataset.h
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_DATASET_CONTAINER
+#define ARM_COMPUTE_TEST_DATASET_CONTAINER
+
+#include "Dataset.h"
+#include "support/ToolchainSupport.h"
+
+#include <string>
+#include <tuple>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+namespace dataset
+{
+/** Base case. Nothing is a container. */
+template <typename T>
+struct is_container : public std::false_type
+{
+};
+
+/** Vector is considered a container. */
+template <typename V, typename A>
+struct is_container<std::vector<V, A>> : public std::true_type
+{
+};
+
+/** Implementation of a dataset created from a container. */
+template <typename T>
+class ContainerDataset : public NamedDataset
+{
+private:
+    using container_value_type     = typename T::value_type;
+    using container_const_iterator = typename T::const_iterator;
+
+public:
+    /** Construct dataset with given name and values from the container.
+     *
+     * @param[in] name      Description of the values.
+     * @param[in] container Values for the dataset.
+     */
+    ContainerDataset(std::string name, T &&container)
+        : NamedDataset{ std::move(name) }, _container(std::forward<T>(container))
+    {
+    }
+
+    ContainerDataset(ContainerDataset &&) = default;
+
+    /** Type of the dataset. */
+    using type = std::tuple<container_value_type>;
+
+    /** Iterator for the dataset. */
+    struct iterator
+    {
+        iterator(std::string name, container_const_iterator iterator)
+            : _name{ name }, _iterator{ iterator }
+        {
+        }
+
+        std::string description() const
+        {
+            using support::cpp11::to_string;
+            return _name + "=" + to_string(*_iterator);
+        }
+
+        ContainerDataset::type operator*() const
+        {
+            return std::make_tuple(*_iterator);
+        }
+
+        iterator &operator++()
+        {
+            ++_iterator;
+            return *this;
+        }
+
+    private:
+        std::string              _name;
+        container_const_iterator _iterator;
+    };
+
+    /** Iterator pointing at the begin of the dataset.
+     *
+     * @return Iterator for the dataset.
+     */
+    iterator begin() const
+    {
+        return iterator(name(), _container.cbegin());
+    }
+
+    /** Size of the dataset.
+     *
+     * @return Number of values in the dataset.
+     */
+    int size() const
+    {
+        return _container.size();
+    }
+
+private:
+    T _container;
+};
+
+/** Helper function to create a @ref ContainerDataset.
+ *
+ * @param[in] name   Name of the dataset.
+ * @param[in] values Container.
+ *
+ * @return A container dataset.
+ */
+template <typename T>
+typename std::enable_if<is_container<T>::value, ContainerDataset<T>>::type make(std::string name, T &&values)
+{
+    return ContainerDataset<T>(std::move(name), std::forward<T>(values));
+}
+} // namespace dataset
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_DATASET_CONTAINER */
diff --git a/tests/framework/datasets/Dataset.h b/tests/framework/datasets/Dataset.h
new file mode 100644
index 0000000..d916730
--- /dev/null
+++ b/tests/framework/datasets/Dataset.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_DATASET
+#define ARM_COMPUTE_TEST_DATASET
+
+#include <string>
+#include <utility>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+namespace dataset
+{
+/** Abstract dataset base class. */
+class Dataset
+{
+protected:
+    Dataset()  = default;
+    ~Dataset() = default;
+
+public:
+    Dataset(Dataset &&) = default;
+};
+
+/** Abstract implementation of a named dataset.
+ *
+ * The name should describe the values of the dataset.
+ */
+class NamedDataset : public Dataset
+{
+protected:
+    /** Construct the dataset with the given name.
+     *
+     * @param[in] name Description of the values.
+     */
+    explicit NamedDataset(std::string name)
+        : _name{ std::move(name) }
+    {
+    }
+
+    ~NamedDataset() = default;
+
+public:
+    NamedDataset(NamedDataset &&) = default;
+
+    /** Return name of the dataset.
+     *
+     * @return Description of the values.
+     */
+    std::string name() const
+    {
+        return _name;
+    }
+
+protected:
+    const std::string _name;
+};
+} // namespace dataset
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_DATASET */
diff --git a/tests/validation/CL/CLFixture.cpp b/tests/framework/datasets/Datasets.h
similarity index 77%
copy from tests/validation/CL/CLFixture.cpp
copy to tests/framework/datasets/Datasets.h
index 38e52c3..c0e5822 100644
--- a/tests/validation/CL/CLFixture.cpp
+++ b/tests/framework/datasets/Datasets.h
@@ -21,12 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "validation/CL/CLFixture.h"
+#ifndef ARM_COMPUTE_TEST_DATASETS
+#define ARM_COMPUTE_TEST_DATASETS
 
-#include "boost_wrapper.h"
+#include "CartesianProductDataset.h"
+#include "ContainerDataset.h"
+#include "InitializerListDataset.h"
+#include "JoinDataset.h"
+#include "RangeDataset.h"
+#include "SingletonDataset.h"
+#include "ZipDataset.h"
 
-using namespace arm_compute;
-using namespace arm_compute::test;
-using namespace arm_compute::test::validation;
-
-BOOST_GLOBAL_FIXTURE(CLFixture);
+#endif /* ARM_COMPUTE_TEST_DATASETS */
diff --git a/tests/framework/datasets/InitializerListDataset.h b/tests/framework/datasets/InitializerListDataset.h
new file mode 100644
index 0000000..7d32234
--- /dev/null
+++ b/tests/framework/datasets/InitializerListDataset.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_DATASET_LIST
+#define ARM_COMPUTE_TEST_DATASET_LIST
+
+#include "Dataset.h"
+#include "support/ToolchainSupport.h"
+
+#include <initializer_list>
+#include <string>
+#include <tuple>
+#include <utility>
+#include <vector>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+namespace dataset
+{
+/** Implementation of a dataset created from an initializer list. */
+template <typename T>
+class InitializerListDataset final : public NamedDataset
+{
+private:
+    using data_const_iterator = typename std::vector<T>::const_iterator;
+
+public:
+    /** Construct dataset with given name and values from the container.
+     *
+     * @param[in] name Description of the values.
+     * @param[in] list Values for the dataset.
+     */
+    InitializerListDataset(std::string name, std::initializer_list<T> &&list)
+        : NamedDataset{ std::move(name) }, _data(std::forward<std::initializer_list<T>>(list))
+    {
+    }
+
+    InitializerListDataset(InitializerListDataset &&) = default;
+
+    /** Type of the dataset. */
+    using type = std::tuple<T>;
+
+    /** Iterator for the dataset. */
+    struct iterator
+    {
+        iterator(std::string name, data_const_iterator iterator)
+            : _name{ name }, _iterator{ iterator }
+        {
+        }
+
+        std::string description() const
+        {
+            using support::cpp11::to_string;
+            return _name + "=" + to_string(*_iterator);
+        }
+
+        InitializerListDataset::type operator*() const
+        {
+            return std::make_tuple(*_iterator);
+        }
+
+        iterator &operator++()
+        {
+            ++_iterator;
+            return *this;
+        }
+
+    private:
+        std::string         _name;
+        data_const_iterator _iterator;
+    };
+
+    /** Iterator pointing at the begin of the dataset.
+     *
+     * @return Iterator for the dataset.
+     */
+    iterator begin() const
+    {
+        return iterator(name(), _data.cbegin());
+    }
+
+    /** Size of the dataset.
+     *
+     * @return Number of values in the dataset.
+     */
+    int size() const
+    {
+        return _data.size();
+    }
+
+private:
+    std::vector<T> _data;
+};
+
+/** Helper function to create an @ref InitializerListDataset.
+ *
+ * @param[in] name Name of the dataset.
+ * @param[in] list Initializer list.
+ *
+ * @return An initializer list dataset.
+ */
+template <typename T>
+InitializerListDataset<T> make(std::string name, std::initializer_list<T> &&list)
+{
+    return InitializerListDataset<T>(std::move(name), std::forward<std::initializer_list<T>>(list));
+}
+} // namespace dataset
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_DATASET_LIST */
diff --git a/tests/framework/datasets/JoinDataset.h b/tests/framework/datasets/JoinDataset.h
new file mode 100644
index 0000000..eded6e0
--- /dev/null
+++ b/tests/framework/datasets/JoinDataset.h
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_DATASET_JOIN
+#define ARM_COMPUTE_TEST_DATASET_JOIN
+
+#include "Dataset.h"
+
+#include <string>
+#include <tuple>
+#include <utility>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+namespace dataset
+{
+/** Implementation of a dataset representing the concatenation of the input datasets.
+ *
+ * For example, for the inputs {1, 2} and {3, 4} this dataset virtually
+ * represents the values {1, 2, 3, 4}.
+ */
+template <typename T, typename U>
+class JoinDataset : public Dataset
+{
+private:
+    using iter1_type = typename T::iterator;
+    using iter2_type = typename U::iterator;
+
+public:
+    /** Construct dataset from the given datasets.
+     *
+     * @param[in] dataset1 First dataset.
+     * @param[in] dataset2 Second dataset.
+     */
+    JoinDataset(T &&dataset1, U &&dataset2)
+        : _dataset1{ std::forward<T>(dataset1) },
+          _dataset2{ std::forward<U>(dataset2) }
+    {
+    }
+
+    JoinDataset(JoinDataset &&) = default;
+
+    /** Type of the dataset. */
+    using type = typename T::type;
+
+    /** Iterator for the dataset. */
+    struct iterator
+    {
+        iterator(const T *dataset1, const U *dataset2)
+            : _iter1{ dataset1->begin() }, _iter2{ dataset2->begin() }, _first_size{ dataset1->size() }
+        {
+        }
+
+        std::string description() const
+        {
+            return _first_size > 0 ? _iter1.description() : _iter2.description();
+        }
+
+        JoinDataset::type operator*() const
+        {
+            return _first_size > 0 ? *_iter1 : *_iter2;
+        }
+
+        iterator &operator++()
+        {
+            if(_first_size > 0)
+            {
+                --_first_size;
+                ++_iter1;
+            }
+            else
+            {
+                ++_iter2;
+            }
+
+            return *this;
+        }
+
+    private:
+        iter1_type _iter1;
+        iter2_type _iter2;
+        int        _first_size;
+    };
+
+    /** Iterator pointing at the begin of the dataset.
+     *
+     * @return Iterator for the dataset.
+     */
+    iterator begin() const
+    {
+        return iterator(&_dataset1, &_dataset2);
+    }
+
+    /** Size of the dataset.
+     *
+     * @return Number of values in the dataset.
+     */
+    int size() const
+    {
+        return _dataset1.size() + _dataset2.size();
+    }
+
+private:
+    T _dataset1;
+    U _dataset2;
+};
+
+/** Helper function to create a @ref JoinDataset.
+ *
+ * @param[in] dataset1 First dataset.
+ * @param[in] dataset2 Second dataset.
+ *
+ * @return A join dataset.
+ */
+template <typename T, typename U>
+JoinDataset<T, U> concat(T &&dataset1, U &&dataset2)
+{
+    return JoinDataset<T, U>(std::forward<T>(dataset1), std::forward<U>(dataset2));
+}
+} // namespace dataset
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_DATASET_JOIN */
diff --git a/tests/framework/datasets/RangeDataset.h b/tests/framework/datasets/RangeDataset.h
new file mode 100644
index 0000000..637abe0
--- /dev/null
+++ b/tests/framework/datasets/RangeDataset.h
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_DATASET_RANGE
+#define ARM_COMPUTE_TEST_DATASET_RANGE
+
+#include "Dataset.h"
+#include "support/ToolchainSupport.h"
+
+#include <string>
+#include <tuple>
+#include <type_traits>
+#include <utility>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+namespace dataset
+{
+/** Implementation of a dataset created from a range of values.
+ *
+ * The range is inclusive of the first value but exclusive of the last, i.e. [start, end).
+ */
+template <typename T>
+class RangeDataset final : public NamedDataset
+{
+public:
+    /** Construct dataset with given name and values in the specified range.
+     *
+     * @param[in] name  Description of the values.
+     * @param[in] start Begin of the range.
+     * @param[in] end   End of the range.
+     * @param[in] step  Step size.
+     */
+    RangeDataset(std::string name, T start, T end, T step = 1)
+        : NamedDataset{ std::move(name) }, _start{ start }, _end{ end }, _step{ step }
+    {
+    }
+
+    RangeDataset(RangeDataset &&) = default;
+
+    /** Type of the dataset. */
+    using type = std::tuple<T>;
+
+    /** Iterator for the dataset. */
+    struct iterator
+    {
+        iterator(std::string name, T start, T step)
+            : _name{ name }, _value{ start }, _step{ step }
+        {
+        }
+
+        std::string description() const
+        {
+            using support::cpp11::to_string;
+            return _name + "=" + to_string(_value);
+        }
+
+        RangeDataset::type operator*() const
+        {
+            return std::make_tuple(_value);
+        }
+
+        iterator &operator++()
+        {
+            _value += _step;
+            return *this;
+        }
+
+    private:
+        std::string _name;
+        T           _value;
+        T           _step;
+    };
+
+    /** Iterator pointing at the begin of the dataset.
+     *
+     * @return Iterator for the dataset.
+     */
+    iterator begin() const
+    {
+        return iterator(name(), _start, _step);
+    }
+
+    /** Size of the dataset.
+     *
+     * @return Number of values in the dataset.
+     */
+    int size() const
+    {
+        return (_end - _start) / std::abs(_step);
+    }
+
+private:
+    T _start;
+    T _end;
+    T _step;
+};
+
+/** Helper function to create a @ref RangeDataset.
+ *
+ * @param[in] name  Name of the dataset.
+ * @param[in] start Begin of the range.
+ * @param[in] end   End of the range.
+ * @param[in] step  Step size.
+ *
+ * @return A range dataset.
+ */
+template <typename T>
+RangeDataset<T> make(std::string name, T start, T end, T step = 1)
+{
+    return RangeDataset<T>(std::move(name), start, end, step);
+}
+} // namespace dataset
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_DATASET_RANGE */
diff --git a/tests/framework/datasets/SingletonDataset.h b/tests/framework/datasets/SingletonDataset.h
new file mode 100644
index 0000000..1acb576
--- /dev/null
+++ b/tests/framework/datasets/SingletonDataset.h
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_DATASET_SINGLETON
+#define ARM_COMPUTE_TEST_DATASET_SINGLETON
+
+#include "ContainerDataset.h"
+#include "Dataset.h"
+#include "support/ToolchainSupport.h"
+
+#include <string>
+#include <tuple>
+#include <type_traits>
+#include <utility>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+namespace dataset
+{
+/** Implementation of a dataset holding a single value. */
+template <typename T>
+class SingletonDataset : public NamedDataset
+{
+public:
+    /** Construct dataset with given name and value.
+     *
+     * @param[in] name  Description of the value.
+     * @param[in] value Value for the dataset.
+     */
+    SingletonDataset(std::string name, T &&value)
+        : NamedDataset{ std::move(name) }, _value{ std::forward<T>(value) }
+    {
+    }
+
+    SingletonDataset(SingletonDataset &&) = default;
+
+    /** Type of the dataset. */
+    using type = std::tuple<T>;
+
+    /** Iterator for the dataset. */
+    struct iterator
+    {
+        iterator(std::string name, const T *value)
+            : _name{ name }, _value{ value }
+        {
+        }
+
+        ~iterator() = default;
+
+        iterator(const iterator &) = default;
+        iterator &operator=(const iterator &) = default;
+        iterator(iterator &&)                 = default;
+        iterator &operator=(iterator &&) = default;
+
+        std::string description() const
+        {
+            using support::cpp11::to_string;
+            return _name + "=" + to_string(*_value);
+        }
+
+        SingletonDataset::type operator*() const
+        {
+            return std::make_tuple(*_value);
+        }
+
+        iterator &operator++()
+        {
+            return *this;
+        }
+
+    private:
+        std::string _name;
+        const T    *_value;
+    };
+
+    /** Iterator pointing at the begin of the dataset.
+     *
+     * @return Iterator for the dataset.
+     */
+    iterator begin() const
+    {
+        return iterator(name(), &_value);
+    }
+
+    /** Size of the dataset.
+     *
+     * @return Number of values in the dataset.
+     */
+    int size() const
+    {
+        return 1;
+    }
+
+private:
+    T _value;
+};
+
+/** Helper function to create a @ref SingletonDataset.
+ *
+ * @param[in] name  Name of the dataset.
+ * @param[in] value Value.
+ *
+ * @return A singleton dataset.
+ */
+template <typename T>
+typename std::enable_if < !is_container<T>::value, SingletonDataset<T >>::type make(std::string name, T &&value)
+{
+    return SingletonDataset<T>(std::move(name), std::forward<T>(value));
+}
+} // namespace dataset
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_DATASET_SINGLETON */
diff --git a/tests/framework/datasets/ZipDataset.h b/tests/framework/datasets/ZipDataset.h
new file mode 100644
index 0000000..b95b720
--- /dev/null
+++ b/tests/framework/datasets/ZipDataset.h
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_DATASET_ZIP
+#define ARM_COMPUTE_TEST_DATASET_ZIP
+
+#include "Dataset.h"
+
+#include <string>
+#include <tuple>
+#include <utility>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+namespace dataset
+{
+/** Implementation of a dataset representing pairs of values of the input datasets.
+ *
+ * For example, for the inputs {1, 2} and {3, 4} this dataset virtually
+ * represents the values {(1, 3), (1, 4)}.
+ */
+template <typename T, typename U>
+class ZipDataset : public Dataset
+{
+private:
+    using iter1_type = typename T::iterator;
+    using iter2_type = typename U::iterator;
+
+public:
+    /** Construct dataset from the given datasets.
+     *
+     * @param[in] dataset1 First dataset.
+     * @param[in] dataset2 Second dataset.
+     */
+    ZipDataset(T &&dataset1, U &&dataset2)
+        : _dataset1{ std::forward<T>(dataset1) },
+          _dataset2{ std::forward<U>(dataset2) }
+    {
+    }
+
+    ZipDataset(ZipDataset &&) = default;
+
+    /** Type of the dataset. */
+    using type = decltype(std::tuple_cat(*std::declval<iter1_type>(), *std::declval<iter2_type>()));
+
+    /** Iterator for the dataset. */
+    struct iterator
+    {
+        iterator(iter1_type iter1, iter2_type iter2)
+            : _iter1{ std::move(iter1) }, _iter2{ std::move(iter2) }
+        {
+        }
+
+        std::string description() const
+        {
+            return _iter1.description() + ":" + _iter2.description();
+        }
+
+        ZipDataset::type operator*() const
+        {
+            return std::tuple_cat(*_iter1, *_iter2);
+        }
+
+        iterator &operator++()
+        {
+            ++_iter1;
+            ++_iter2;
+            return *this;
+        }
+
+    private:
+        iter1_type _iter1;
+        iter2_type _iter2;
+    };
+
+    /** Iterator pointing at the begin of the dataset.
+     *
+     * @return Iterator for the dataset.
+     */
+    iterator begin() const
+    {
+        return iterator(_dataset1.begin(), _dataset2.begin());
+    }
+
+    /** Size of the dataset.
+     *
+     * @return Number of values in the dataset.
+     */
+    int size() const
+    {
+        return std::min(_dataset1.size(), _dataset2.size());
+    }
+
+private:
+    T _dataset1;
+    U _dataset2;
+};
+
+/** Helper function to create a @ref ZipDataset.
+ *
+ * @param[in] dataset1 First dataset.
+ * @param[in] dataset2 Second dataset.
+ *
+ * @return A zip dataset.
+ */
+template <typename T, typename U>
+ZipDataset<T, U> zip(T &&dataset1, U &&dataset2)
+{
+    return ZipDataset<T, U>(std::forward<T>(dataset1), std::forward<U>(dataset2));
+}
+} // namespace dataset
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_DATASET_ZIP */
diff --git a/tests/framework/instruments/Instrument.h b/tests/framework/instruments/Instrument.h
new file mode 100644
index 0000000..895a647
--- /dev/null
+++ b/tests/framework/instruments/Instrument.h
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_INSTRUMENT
+#define ARM_COMPUTE_TEST_INSTRUMENT
+
+#include "../Utils.h"
+
+#include <memory>
+#include <ostream>
+#include <string>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Interface for classes that can be used to measure performance. */
+class Instrument
+{
+public:
+    /** Helper function to create an instrument of the given type.
+     *
+     * @return Instance of an instrument of the given type.
+     */
+    template <typename T>
+    static std::unique_ptr<Instrument> make_instrument();
+
+    /** Struct representing measurement consisting of value and unit. */
+    struct Measurement final
+    {
+        Measurement(double value, std::string unit)
+            : value{ value }, unit{ std::move(unit) }
+        {
+        }
+
+        friend std::ostream &operator<<(std::ostream &os, const Measurement &measurement);
+
+        double      value;
+        std::string unit;
+    };
+
+    Instrument()                   = default;
+    Instrument(const Instrument &) = default;
+    Instrument(Instrument &&)      = default;
+    Instrument &operator=(const Instrument &) = default;
+    Instrument &operator=(Instrument &&) = default;
+    virtual ~Instrument()                = default;
+
+    /** Identifier for the instrument */
+    virtual std::string id() const = 0;
+
+    /** Start measuring. */
+    virtual void start() = 0;
+
+    /** Stop measuring. */
+    virtual void stop() = 0;
+
+    /** Return the latest measurement. */
+    virtual Measurement measurement() const = 0;
+};
+
+inline std::ostream &operator<<(std::ostream &os, const Instrument::Measurement &measurement)
+{
+    os << measurement.value << measurement.unit;
+    return os;
+}
+
+template <typename T>
+inline std::unique_ptr<Instrument> Instrument::make_instrument()
+{
+    return support::cpp14::make_unique<T>();
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_INSTRUMENT */
diff --git a/tests/validation_new/CPP/Floor.cpp b/tests/framework/instruments/Instruments.cpp
similarity index 64%
copy from tests/validation_new/CPP/Floor.cpp
copy to tests/framework/instruments/Instruments.cpp
index aed4fec..797a724 100644
--- a/tests/validation_new/CPP/Floor.cpp
+++ b/tests/framework/instruments/Instruments.cpp
@@ -21,37 +21,39 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "Floor.h"
+#include "Instruments.h"
 
-#include "tests/validation_new/Helpers.h"
+#include "../Utils.h"
 
-#include <cmath>
+#include <map>
+#include <stdexcept>
 
 namespace arm_compute
 {
 namespace test
 {
-namespace validation
+namespace framework
 {
-namespace reference
+InstrumentType instrument_type_from_name(const std::string &name)
 {
-template <typename T>
-SimpleTensor<T> floor_layer(const SimpleTensor<T> &src)
-{
-    // Create reference
-    SimpleTensor<T> dst{ src.shape(), src.data_type() };
-
-    // Compute reference
-    for(int i = 0; i < src.num_elements(); ++i)
+    static const std::map<std::string, InstrumentType> types =
     {
-        dst[i] = std::floor(src[i]);
+        { "all", InstrumentType::ALL },
+        { "none", InstrumentType::NONE },
+        { "wall_clock", InstrumentType::WALL_CLOCK_TIMER },
+        { "cycles", InstrumentType::PMU_CYCLE_COUNTER },
+        { "instructions", InstrumentType::PMU_INSTRUCTION_COUNTER },
+    };
+
+    try
+    {
+        return types.at(tolower(name));
     }
-
-    return dst;
+    catch(const std::out_of_range &)
+    {
+        throw std::invalid_argument(name);
+    }
 }
-
-template SimpleTensor<float> floor_layer(const SimpleTensor<float> &src);
-} // namespace reference
-} // namespace validation
+} // namespace framework
 } // namespace test
 } // namespace arm_compute
diff --git a/tests/framework/instruments/Instruments.h b/tests/framework/instruments/Instruments.h
new file mode 100644
index 0000000..034fa16
--- /dev/null
+++ b/tests/framework/instruments/Instruments.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_INSTRUMENTS
+#define ARM_COMPUTE_TEST_INSTRUMENTS
+
+#include "PMUCounter.h"
+#include "WallClockTimer.h"
+
+#include <sstream>
+#include <string>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+enum class InstrumentType : unsigned int
+{
+    ALL                     = ~0U,
+    NONE                    = 0,
+    WALL_CLOCK_TIMER        = 1,
+    PMU_CYCLE_COUNTER       = 2,
+    PMU_INSTRUCTION_COUNTER = 4
+};
+
+InstrumentType instrument_type_from_name(const std::string &name);
+
+inline InstrumentType operator&(InstrumentType t1, InstrumentType t2)
+{
+    using type = std::underlying_type<InstrumentType>::type;
+    return static_cast<InstrumentType>(static_cast<type>(t1) & static_cast<type>(t2));
+}
+
+inline InstrumentType operator|(InstrumentType t1, InstrumentType t2)
+{
+    using type = std::underlying_type<InstrumentType>::type;
+    return static_cast<InstrumentType>(static_cast<type>(t1) | static_cast<type>(t2));
+}
+
+inline InstrumentType &operator|=(InstrumentType &t1, InstrumentType t2)
+{
+    using type = std::underlying_type<InstrumentType>::type;
+    t1         = static_cast<InstrumentType>(static_cast<type>(t1) | static_cast<type>(t2));
+    return t1;
+}
+
+inline ::std::stringstream &operator>>(::std::stringstream &stream, InstrumentType &instrument)
+{
+    std::string value;
+    stream >> value;
+    instrument = instrument_type_from_name(value);
+    return stream;
+}
+
+inline ::std::stringstream &operator<<(::std::stringstream &stream, InstrumentType instrument)
+{
+    switch(instrument)
+    {
+        case InstrumentType::WALL_CLOCK_TIMER:
+            stream << "WALL_CLOCK_TIMER";
+            break;
+        case InstrumentType::PMU_CYCLE_COUNTER:
+            stream << "PMU_CYCLE_COUNTER";
+            break;
+        case InstrumentType::PMU_INSTRUCTION_COUNTER:
+            stream << "PMU_INSTRUCTION_COUNTER";
+            break;
+        case InstrumentType::ALL:
+            stream << "ALL";
+            break;
+        case InstrumentType::NONE:
+            stream << "NONE";
+            break;
+        default:
+            throw std::invalid_argument("Unsupported instrument type");
+    }
+
+    return stream;
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_INSTRUMENTS */
diff --git a/tests/framework/instruments/PMUCounter.cpp b/tests/framework/instruments/PMUCounter.cpp
new file mode 100644
index 0000000..7994a15
--- /dev/null
+++ b/tests/framework/instruments/PMUCounter.cpp
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#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()
+{
+    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_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)
+    {
+        throw std::runtime_error("perf_event_open for cycles failed");
+    }
+}
+
+std::string CycleCounter::id() 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)
+    {
+        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");
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/framework/instruments/PMUCounter.h b/tests/framework/instruments/PMUCounter.h
new file mode 100644
index 0000000..f407be6
--- /dev/null
+++ b/tests/framework/instruments/PMUCounter.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_PMU_COUNTER
+#define ARM_COMPUTE_TEST_PMU_COUNTER
+
+#include "Instrument.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Implementation of an instrument to count CPU cycles. */
+class CycleCounter : public Instrument
+{
+public:
+    /** Initialise the cycle counter. */
+    CycleCounter();
+
+    std::string id() const override;
+    void        start() override;
+    void        stop() override;
+    Measurement measurement() const override;
+
+private:
+    long      _fd{ -1 };
+    long long _cycles{ 0 };
+};
+
+/** Implementation of an instrument to count executed CPU instructions. */
+class InstructionCounter : public Instrument
+{
+public:
+    /** Initialise the instruction counter. */
+    InstructionCounter();
+
+    std::string id() const override;
+    void        start() override;
+    void        stop() override;
+    Measurement measurement() const override;
+
+private:
+    long      _fd{ -1 };
+    long long _instructions{ 0 };
+};
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_PMU_COUNTER */
diff --git a/tests/validation_new/CPP/Floor.cpp b/tests/framework/instruments/WallClockTimer.cpp
similarity index 68%
copy from tests/validation_new/CPP/Floor.cpp
copy to tests/framework/instruments/WallClockTimer.cpp
index aed4fec..37db0c7 100644
--- a/tests/validation_new/CPP/Floor.cpp
+++ b/tests/framework/instruments/WallClockTimer.cpp
@@ -21,37 +21,37 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "Floor.h"
+#include "WallClockTimer.h"
 
-#include "tests/validation_new/Helpers.h"
-
-#include <cmath>
+#include "../Framework.h"
+#include "../Utils.h"
 
 namespace arm_compute
 {
 namespace test
 {
-namespace validation
+namespace framework
 {
-namespace reference
+std::string WallClockTimer::id() const
 {
-template <typename T>
-SimpleTensor<T> floor_layer(const SimpleTensor<T> &src)
-{
-    // Create reference
-    SimpleTensor<T> dst{ src.shape(), src.data_type() };
-
-    // Compute reference
-    for(int i = 0; i < src.num_elements(); ++i)
-    {
-        dst[i] = std::floor(src[i]);
-    }
-
-    return dst;
+    return "Wall clock";
 }
 
-template SimpleTensor<float> floor_layer(const SimpleTensor<float> &src);
-} // namespace reference
-} // namespace validation
+void WallClockTimer::start()
+{
+    _start = std::chrono::high_resolution_clock::now();
+}
+
+void WallClockTimer::stop()
+{
+    _stop = std::chrono::high_resolution_clock::now();
+}
+
+Instrument::Measurement WallClockTimer::measurement() const
+{
+    const auto delta = std::chrono::duration_cast<std::chrono::microseconds>(_stop - _start);
+    return Instrument::Measurement(delta.count(), "us");
+}
+} // namespace framework
 } // namespace test
 } // namespace arm_compute
diff --git a/tests/validation_new/CPP/Floor.cpp b/tests/framework/instruments/WallClockTimer.h
similarity index 65%
copy from tests/validation_new/CPP/Floor.cpp
copy to tests/framework/instruments/WallClockTimer.h
index aed4fec..b7c390f 100644
--- a/tests/validation_new/CPP/Floor.cpp
+++ b/tests/framework/instruments/WallClockTimer.h
@@ -21,37 +21,33 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "Floor.h"
+#ifndef ARM_COMPUTE_TEST_WALL_CLOCK_TIMER
+#define ARM_COMPUTE_TEST_WALL_CLOCK_TIMER
 
-#include "tests/validation_new/Helpers.h"
+#include "Instrument.h"
 
-#include <cmath>
+#include <chrono>
 
 namespace arm_compute
 {
 namespace test
 {
-namespace validation
+namespace framework
 {
-namespace reference
+/** Implementation of an instrument to measure elapsed wall-clock time in milliseconds. */
+class WallClockTimer : public Instrument
 {
-template <typename T>
-SimpleTensor<T> floor_layer(const SimpleTensor<T> &src)
-{
-    // Create reference
-    SimpleTensor<T> dst{ src.shape(), src.data_type() };
+public:
+    std::string id() const override;
+    void        start() override;
+    void        stop() override;
+    Measurement measurement() const override;
 
-    // Compute reference
-    for(int i = 0; i < src.num_elements(); ++i)
-    {
-        dst[i] = std::floor(src[i]);
-    }
-
-    return dst;
-}
-
-template SimpleTensor<float> floor_layer(const SimpleTensor<float> &src);
-} // namespace reference
-} // namespace validation
+private:
+    std::chrono::high_resolution_clock::time_point _start{};
+    std::chrono::high_resolution_clock::time_point _stop{};
+};
+} // namespace framework
 } // namespace test
 } // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_WALL_CLOCK_TIMER */
diff --git a/tests/framework/printers/JSONPrinter.cpp b/tests/framework/printers/JSONPrinter.cpp
new file mode 100644
index 0000000..5b30389
--- /dev/null
+++ b/tests/framework/printers/JSONPrinter.cpp
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "JSONPrinter.h"
+
+#include "tests/framework/Framework.h"
+
+#include <algorithm>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+void JSONPrinter::print_separator(bool &flag)
+{
+    if(flag)
+    {
+        flag = false;
+    }
+    else
+    {
+        *_stream << ",";
+    }
+}
+
+void JSONPrinter::print_entry(const std::string &name, const std::string &value)
+{
+    print_separator(_first_entry);
+
+    *_stream << R"(")" << name << R"(" : ")" << value << R"(")";
+}
+
+void JSONPrinter::print_global_header()
+{
+    *_stream << "{";
+}
+
+void JSONPrinter::print_global_footer()
+{
+    *_stream << "}\n";
+}
+
+void JSONPrinter::print_run_header()
+{
+    print_separator(_first_entry);
+
+    *_stream << R"("tests" : {)";
+}
+
+void JSONPrinter::print_run_footer()
+{
+    *_stream << "}";
+}
+
+void JSONPrinter::print_test_header(const TestInfo &info)
+{
+    print_separator(_first_test);
+
+    _first_test_entry = true;
+    *_stream << R"(")" << info.name << R"(" : {)";
+}
+
+void JSONPrinter::print_test_footer()
+{
+    *_stream << "}";
+}
+
+void JSONPrinter::print_errors_header()
+{
+    print_separator(_first_test_entry);
+
+    _first_error = true;
+    *_stream << R"("errors" : [)";
+}
+
+void JSONPrinter::print_errors_footer()
+{
+    *_stream << "]";
+}
+
+void JSONPrinter::print_error(const std::exception &error)
+{
+    std::stringstream error_log;
+    error_log.str(error.what());
+
+    for(std::string line; !std::getline(error_log, line).fail();)
+    {
+        print_separator(_first_error);
+
+        *_stream << R"(")" << line << R"(")";
+    }
+}
+
+void JSONPrinter::print_measurements(const Profiler::MeasurementsMap &measurements)
+{
+    print_separator(_first_test_entry);
+
+    *_stream << R"("measurements" : {)";
+
+    for(auto i_it = measurements.cbegin(), i_end = measurements.cend(); i_it != i_end;)
+    {
+        *_stream << R"(")" << i_it->first << R"(" : {)";
+
+        auto add_measurements = [](double a, const Instrument::Measurement & b)
+        {
+            return a + b.value;
+        };
+
+        auto cmp_measurements = [](const Instrument::Measurement & a, const Instrument::Measurement & b)
+        {
+            return a.value < b.value;
+        };
+
+        double     sum_values    = std::accumulate(i_it->second.cbegin(), i_it->second.cend(), 0., add_measurements);
+        int        num_values    = i_it->second.size();
+        const auto minmax_values = std::minmax_element(i_it->second.begin(), i_it->second.end(), cmp_measurements);
+
+        if(num_values > 2)
+        {
+            sum_values -= minmax_values.first->value + minmax_values.second->value;
+            num_values -= 2;
+        }
+
+        auto measurement_to_string = [](const Instrument::Measurement & measurement)
+        {
+            return support::cpp11::to_string(measurement.value);
+        };
+
+        *_stream << R"("avg" : )" << (sum_values / num_values) << ",";
+        *_stream << R"("min" : )" << minmax_values.first->value << ",";
+        *_stream << R"("max" : )" << minmax_values.second->value << ",";
+        *_stream << R"("raw" : [)" << join(i_it->second.begin(), i_it->second.end(), ",", measurement_to_string) << "],";
+        *_stream << R"("unit" : ")" << minmax_values.first->unit << R"(")";
+        *_stream << "}";
+
+        if(++i_it != i_end)
+        {
+            *_stream << ",";
+        }
+    }
+
+    *_stream << "}";
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/framework/printers/JSONPrinter.h b/tests/framework/printers/JSONPrinter.h
new file mode 100644
index 0000000..14c8b35
--- /dev/null
+++ b/tests/framework/printers/JSONPrinter.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_JSONPRINTER
+#define ARM_COMPUTE_TEST_JSONPRINTER
+
+#include "Printer.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Implementation of a @ref Printer that produces JSON output. */
+class JSONPrinter : public Printer
+{
+public:
+    using Printer::Printer;
+
+    void print_entry(const std::string &name, const std::string &value) override;
+    void print_global_header() override;
+    void print_global_footer() override;
+    void print_run_header() override;
+    void print_run_footer() override;
+    void print_test_header(const TestInfo &info) override;
+    void print_test_footer() override;
+    void print_errors_header() override;
+    void print_errors_footer() override;
+    void print_error(const std::exception &error) override;
+    void print_measurements(const Profiler::MeasurementsMap &measurements) override;
+
+private:
+    void print_separator(bool &flag);
+
+    bool _first_entry{ true };
+    bool _first_test{ true };
+    bool _first_test_entry{ true };
+    bool _first_error{ true };
+};
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_JSONPRINTER */
diff --git a/tests/framework/printers/PrettyPrinter.cpp b/tests/framework/printers/PrettyPrinter.cpp
new file mode 100644
index 0000000..ec32e52
--- /dev/null
+++ b/tests/framework/printers/PrettyPrinter.cpp
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "PrettyPrinter.h"
+
+#include "tests/framework/Framework.h"
+
+#include <algorithm>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+std::string PrettyPrinter::begin_color(const std::string &color) const
+{
+    if(!_color_output)
+    {
+        return "";
+    }
+
+    return "\033[0;3" + color + "m";
+}
+
+std::string PrettyPrinter::end_color() const
+{
+    if(!_color_output)
+    {
+        return "";
+    }
+
+    return "\033[m";
+}
+
+void PrettyPrinter::set_color_output(bool color_output)
+{
+    _color_output = color_output;
+}
+
+void PrettyPrinter::print_entry(const std::string &name, const std::string &value)
+{
+    *_stream << begin_color("4") << name << " = " << value << end_color() << "\n";
+}
+
+void PrettyPrinter::print_global_header()
+{
+}
+
+void PrettyPrinter::print_global_footer()
+{
+}
+
+void PrettyPrinter::print_run_header()
+{
+}
+
+void PrettyPrinter::print_run_footer()
+{
+}
+
+void PrettyPrinter::print_test_header(const TestInfo &info)
+{
+    *_stream << begin_color("2") << "Running [" << info.id << "] '" << info.name << "'" << end_color() << "\n";
+}
+
+void PrettyPrinter::print_test_footer()
+{
+}
+
+void PrettyPrinter::print_errors_header()
+{
+}
+
+void PrettyPrinter::print_errors_footer()
+{
+}
+
+void PrettyPrinter::print_error(const std::exception &error)
+{
+    *_stream << begin_color("1") << "ERROR: " << error.what() << end_color() << "\n";
+}
+
+void PrettyPrinter::print_measurements(const Profiler::MeasurementsMap &measurements)
+{
+    for(const auto &instrument : measurements)
+    {
+        *_stream << begin_color("3") << "  " << instrument.first << ":";
+
+        auto add_measurements = [](double a, const Instrument::Measurement & b)
+        {
+            return a + b.value;
+        };
+
+        auto cmp_measurements = [](const Instrument::Measurement & a, const Instrument::Measurement & b)
+        {
+            return a.value < b.value;
+        };
+
+        double     sum_values    = std::accumulate(instrument.second.begin(), instrument.second.end(), 0., add_measurements);
+        int        num_values    = instrument.second.size();
+        const auto minmax_values = std::minmax_element(instrument.second.begin(), instrument.second.end(), cmp_measurements);
+
+        if(num_values > 2)
+        {
+            sum_values -= minmax_values.first->value + minmax_values.second->value;
+            num_values -= 2;
+        }
+
+        Instrument::Measurement avg{ sum_values / num_values, minmax_values.first->unit };
+
+        *_stream << "    ";
+        *_stream << "AVG=" << avg << ", ";
+        *_stream << "MIN=" << *minmax_values.first << ", ";
+        *_stream << "MAX=" << *minmax_values.second << end_color() << "\n";
+    }
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/framework/printers/PrettyPrinter.h b/tests/framework/printers/PrettyPrinter.h
new file mode 100644
index 0000000..fa7b7b2
--- /dev/null
+++ b/tests/framework/printers/PrettyPrinter.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_PRETTYPRINTER
+#define ARM_COMPUTE_TEST_PRETTYPRINTER
+
+#include "Printer.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+/** Implementation of a @ref Printer that produces human readable output. */
+class PrettyPrinter : public Printer
+{
+public:
+    using Printer::Printer;
+
+    /** Set if the output is colored.
+     *
+     * @param[in] color_output True if the output is colored.
+     */
+    void set_color_output(bool color_output);
+
+    void print_entry(const std::string &name, const std::string &value) override;
+    void print_global_header() override;
+    void print_global_footer() override;
+    void print_run_header() override;
+    void print_run_footer() override;
+    void print_test_header(const TestInfo &info) override;
+    void print_test_footer() override;
+    void print_errors_header() override;
+    void print_errors_footer() override;
+    void print_error(const std::exception &error) override;
+    void print_measurements(const Profiler::MeasurementsMap &measurements) override;
+
+private:
+    std::string begin_color(const std::string &color) const;
+    std::string end_color() const;
+
+    bool _color_output{ true };
+};
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+
+#endif /* ARM_COMPUTE_TEST_PRETTYPRINTER */
diff --git a/tests/validation_new/CPP/Floor.h b/tests/framework/printers/Printer.cpp
similarity index 76%
copy from tests/validation_new/CPP/Floor.h
copy to tests/framework/printers/Printer.cpp
index 30b8118..e034c2e 100644
--- a/tests/validation_new/CPP/Floor.h
+++ b/tests/framework/printers/Printer.cpp
@@ -21,24 +21,28 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#ifndef __ARM_COMPUTE_TEST_FLOOR_H__
-#define __ARM_COMPUTE_TEST_FLOOR_H__
-
-#include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "Printer.h"
 
 namespace arm_compute
 {
 namespace test
 {
-namespace validation
+namespace framework
 {
-namespace reference
+Printer::Printer(std::ostream &stream)
+    : _stream{ &stream }
 {
-template <typename T>
-SimpleTensor<T> floor_layer(const SimpleTensor<T> &src);
-} // namespace reference
-} // namespace validation
+}
+
+void Printer::print(const std::string &str)
+{
+    *_stream << str;
+}
+
+void Printer::set_stream(std::ostream &stream)
+{
+    _stream = &stream;
+}
+} // namespace framework
 } // namespace test
 } // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_FLOOR_H__ */
diff --git a/tests/framework/printers/Printer.h b/tests/framework/printers/Printer.h
new file mode 100644
index 0000000..198d84d
--- /dev/null
+++ b/tests/framework/printers/Printer.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_PRINTER
+#define ARM_COMPUTE_TEST_PRINTER
+
+#include "tests/framework/Profiler.h"
+
+#include <fstream>
+#include <iostream>
+#include <ostream>
+#include <stdexcept>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+struct TestInfo;
+
+/** Abstract printer class used by the @ref Framework to present output. */
+class Printer
+{
+public:
+    /** Default constructor.
+     *
+     * Prints values to std::cout.
+     * */
+    Printer() = default;
+
+    /** Construct printer with given output stream.
+     *
+     * @param[out] stream Output stream.
+     */
+    Printer(std::ostream &stream);
+
+    Printer(const Printer &) = delete;
+    Printer &operator=(const Printer &) = delete;
+    Printer(Printer &&)                 = default;
+    Printer &operator=(Printer &&) = default;
+
+    virtual ~Printer() = default;
+
+    /** Print given string.
+     *
+     * @param[in] str String.
+     */
+    void print(const std::string &str);
+
+    /** Print an entry consisting of a (name, value) pair.
+     *
+     * @param[in] name  Description of the value.
+     * @param[in] value Value.
+     */
+    virtual void print_entry(const std::string &name, const std::string &value) = 0;
+
+    /** Print global header. */
+    virtual void print_global_header() = 0;
+
+    /** Print global footer. */
+    virtual void print_global_footer() = 0;
+
+    /** Print header before running all tests. */
+    virtual void print_run_header() = 0;
+
+    /** Print footer after running all tests. */
+    virtual void print_run_footer() = 0;
+
+    /** Print header before a test.
+     *
+     * @param[in] info Test info.
+     */
+    virtual void print_test_header(const TestInfo &info) = 0;
+
+    /** Print footer after a test. */
+    virtual void print_test_footer() = 0;
+
+    /** Print header before errors. */
+    virtual void print_errors_header() = 0;
+
+    /** Print footer after errors. */
+    virtual void print_errors_footer() = 0;
+
+    /** Print test error.
+     *
+     * @param[in] error Description of the error.
+     */
+    virtual void print_error(const std::exception &error) = 0;
+
+    /** Print measurements for a test.
+     *
+     * @param[in] measurements Measurements as collected by a @ref Profiler.
+     */
+    virtual void print_measurements(const Profiler::MeasurementsMap &measurements) = 0;
+
+    /** Set the output stream.
+     *
+     * @param[out] stream Output stream.
+     */
+    void set_stream(std::ostream &stream);
+
+protected:
+    std::ostream *_stream{ &std::cout };
+};
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_PRINTER */
diff --git a/tests/datasets_new/PoolingTypesDataset.h b/tests/framework/printers/Printers.cpp
similarity index 70%
copy from tests/datasets_new/PoolingTypesDataset.h
copy to tests/framework/printers/Printers.cpp
index 4e4fa26..6e11b63 100644
--- a/tests/datasets_new/PoolingTypesDataset.h
+++ b/tests/framework/printers/Printers.cpp
@@ -21,29 +21,37 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#ifndef __ARM_COMPUTE_TEST_POOLING_TYPES_DATASET_H__
-#define __ARM_COMPUTE_TEST_POOLING_TYPES_DATASET_H__
+#include "Printers.h"
 
-#include "arm_compute/core/Types.h"
+#include "../Utils.h"
+
+#include <map>
+#include <stdexcept>
 
 namespace arm_compute
 {
 namespace test
 {
-namespace datasets
+namespace framework
 {
-class PoolingTypes final : public framework::dataset::ContainerDataset<std::vector<PoolingType>>
+LogFormat log_format_from_name(const std::string &name)
 {
-public:
-    PoolingTypes()
-        : ContainerDataset("PoolType",
+    static const std::map<std::string, LogFormat> formats =
     {
-        PoolingType::MAX, PoolingType::AVG
-    })
+        { "pretty", LogFormat::PRETTY },
+        { "none", LogFormat::NONE },
+        { "json", LogFormat::JSON },
+    };
+
+    try
     {
+        return formats.at(tolower(name));
     }
-};
-} // namespace datasets
+    catch(const std::out_of_range &)
+    {
+        throw std::invalid_argument(name);
+    }
+}
+} // namespace framework
 } // namespace test
 } // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_NORMALIZATION_TYPES_DATASET_H__ */
diff --git a/tests/framework/printers/Printers.h b/tests/framework/printers/Printers.h
new file mode 100644
index 0000000..53867e2
--- /dev/null
+++ b/tests/framework/printers/Printers.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_PRINTERS
+#define ARM_COMPUTE_TEST_PRINTERS
+
+#include "JSONPrinter.h"
+#include "PrettyPrinter.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace framework
+{
+enum class LogFormat
+{
+    NONE,
+    JSON,
+    PRETTY
+};
+
+LogFormat log_format_from_name(const std::string &name);
+
+inline ::std::stringstream &operator>>(::std::stringstream &stream, LogFormat &format)
+{
+    std::string value;
+    stream >> value;
+    format = log_format_from_name(value);
+    return stream;
+}
+
+inline ::std::stringstream &operator<<(::std::stringstream &stream, LogFormat format)
+{
+    switch(format)
+    {
+        case LogFormat::PRETTY:
+            stream << "PRETTY";
+            break;
+        case LogFormat::NONE:
+            stream << "NONE";
+            break;
+        case LogFormat::JSON:
+            stream << "JSON";
+            break;
+        default:
+            throw std::invalid_argument("Unsupported log format");
+    }
+
+    return stream;
+}
+} // namespace framework
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_PRINTERS */
diff --git a/tests/main.cpp b/tests/main.cpp
index 0b01185..9cd2895 100644
--- a/tests/main.cpp
+++ b/tests/main.cpp
@@ -21,16 +21,16 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "framework/DatasetModes.h"
-#include "framework/Exceptions.h"
-#include "framework/Framework.h"
-#include "framework/Macros.h"
-#include "framework/command_line/CommandLineOptions.h"
-#include "framework/command_line/CommandLineParser.h"
-#include "framework/instruments/Instruments.h"
-#include "framework/printers/Printers.h"
 #include "support/ToolchainSupport.h"
 #include "tests/AssetsLibrary.h"
+#include "tests/framework/DatasetModes.h"
+#include "tests/framework/Exceptions.h"
+#include "tests/framework/Framework.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/command_line/CommandLineOptions.h"
+#include "tests/framework/command_line/CommandLineParser.h"
+#include "tests/framework/instruments/Instruments.h"
+#include "tests/framework/printers/Printers.h"
 
 #ifdef ARM_COMPUTE_CL
 #include "arm_compute/runtime/CL/CLScheduler.h"
diff --git a/tests/networks_new/AlexNetNetwork.h b/tests/networks/AlexNetNetwork.h
similarity index 99%
rename from tests/networks_new/AlexNetNetwork.h
rename to tests/networks/AlexNetNetwork.h
index 11171d6..d41e1b6 100644
--- a/tests/networks_new/AlexNetNetwork.h
+++ b/tests/networks/AlexNetNetwork.h
@@ -26,9 +26,9 @@
 
 #include "arm_compute/runtime/Tensor.h"
 
-#include "AssetsLibrary.h"
-#include "Globals.h"
-#include "Utils.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/Utils.h"
 
 #include <memory>
 
diff --git a/tests/networks_new/LeNet5Network.h b/tests/networks/LeNet5Network.h
similarity index 98%
rename from tests/networks_new/LeNet5Network.h
rename to tests/networks/LeNet5Network.h
index 33cb59b..ed7ac18 100644
--- a/tests/networks_new/LeNet5Network.h
+++ b/tests/networks/LeNet5Network.h
@@ -24,9 +24,9 @@
 #ifndef __ARM_COMPUTE_TEST_MODEL_OBJECTS_LENET5_H__
 #define __ARM_COMPUTE_TEST_MODEL_OBJECTS_LENET5_H__
 
-#include "AssetsLibrary.h"
-#include "Globals.h"
-#include "Utils.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/Utils.h"
 
 #include <memory>
 
diff --git a/tests/validation_new/CL/ActivationLayer.cpp b/tests/validation/CL/ActivationLayer.cpp
similarity index 96%
rename from tests/validation_new/CL/ActivationLayer.cpp
rename to tests/validation/CL/ActivationLayer.cpp
index c8fddc7..097fb63 100644
--- a/tests/validation_new/CL/ActivationLayer.cpp
+++ b/tests/validation/CL/ActivationLayer.cpp
@@ -25,16 +25,16 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLActivationLayer.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ActivationFunctionsDataset.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/ActivationLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/ActivationFunctionsDataset.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/ActivationLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/BitwiseAnd.cpp b/tests/validation/CL/BitwiseAnd.cpp
similarity index 93%
rename from tests/validation_new/CL/BitwiseAnd.cpp
rename to tests/validation/CL/BitwiseAnd.cpp
index af40812..3e458a4 100644
--- a/tests/validation_new/CL/BitwiseAnd.cpp
+++ b/tests/validation/CL/BitwiseAnd.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/CL/functions/CLBitwiseAnd.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/BitwiseAndFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/BitwiseAndFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/BitwiseNot.cpp b/tests/validation/CL/BitwiseNot.cpp
similarity index 92%
rename from tests/validation_new/CL/BitwiseNot.cpp
rename to tests/validation/CL/BitwiseNot.cpp
index e95619f..376bde9 100644
--- a/tests/validation_new/CL/BitwiseNot.cpp
+++ b/tests/validation/CL/BitwiseNot.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/CL/functions/CLBitwiseNot.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/BitwiseNotFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/BitwiseNotFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/BitwiseOr.cpp b/tests/validation/CL/BitwiseOr.cpp
similarity index 93%
rename from tests/validation_new/CL/BitwiseOr.cpp
rename to tests/validation/CL/BitwiseOr.cpp
index 15964ee..ecff0be 100644
--- a/tests/validation_new/CL/BitwiseOr.cpp
+++ b/tests/validation/CL/BitwiseOr.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/CL/functions/CLBitwiseOr.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/BitwiseOrFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/BitwiseOrFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/BitwiseXor.cpp b/tests/validation/CL/BitwiseXor.cpp
similarity index 93%
rename from tests/validation_new/CL/BitwiseXor.cpp
rename to tests/validation/CL/BitwiseXor.cpp
index 8e88522..3104894 100644
--- a/tests/validation_new/CL/BitwiseXor.cpp
+++ b/tests/validation/CL/BitwiseXor.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/CL/functions/CLBitwiseXor.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/BitwiseXorFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/BitwiseXorFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation/CL/CMakeLists.txt b/tests/validation/CL/CMakeLists.txt
deleted file mode 100644
index f4477f6..0000000
--- a/tests/validation/CL/CMakeLists.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright (c) 2017 ARM Limited.
-#
-# SPDX-License-Identifier: MIT
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-cmake_minimum_required (VERSION 3.1)
-
-include_directories(${CMAKE_SOURCE_DIR}/../include)
-
-set(arm_compute_test_validation_OPENCL_SOURCE_FILES
-    ${CMAKE_SOURCE_DIR}/CL/CLAccessor.h
-    ${CMAKE_CURRENT_SOURCE_DIR}/CLFixture.h
-    ${CMAKE_CURRENT_SOURCE_DIR}/CLFixture.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/ActivationLayer.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/BitwiseAnd.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Box3x3.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/ConvolutionLayer.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/DepthConvert.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/FillBorder.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/FixedPoint/FixedPoint_QS8.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/FullyConnectedLayer.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Gaussian3x3.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Gaussian5x5.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/GEMM.cpp
-`   ${CMAKE_CURRENT_SOURCE_DIR}/IntegralImage.cpp
-`   ${CMAKE_CURRENT_SOURCE_DIR}/NonLinearFilter.cpp
-`   ${CMAKE_CURRENT_SOURCE_DIR}/PoolingLayer.cpp
-`   ${CMAKE_CURRENT_SOURCE_DIR}/ROIPoolingLayer.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Sobel3x3.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Sobel5x5.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/SoftmaxLayer.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Threshold.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/DirectConvolutionLayer.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/MeanStdDev.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/HarrisCorners.cpp
-)
-
-add_library(arm_compute_test_validation_OPENCL OBJECT
-    ${arm_compute_test_validation_OPENCL_SOURCE_FILES}
-)
-
-set(arm_compute_test_validation_TARGET_OBJECTS
-    ${arm_compute_test_validation_TARGET_OBJECTS}
-    $<TARGET_OBJECTS:arm_compute_test_validation_OPENCL>
-    PARENT_SCOPE
-)
-
-set(arm_compute_test_validation_TARGET_LIBRARIES
-    ${arm_compute_test_validation_TARGET_LIBRARIES}
-    OpenCL
-    PARENT_SCOPE
-)
diff --git a/tests/validation_new/CL/ConvolutionLayer.cpp b/tests/validation/CL/ConvolutionLayer.cpp
similarity index 95%
rename from tests/validation_new/CL/ConvolutionLayer.cpp
rename to tests/validation/CL/ConvolutionLayer.cpp
index 9703e0b..d712384 100644
--- a/tests/validation_new/CL/ConvolutionLayer.cpp
+++ b/tests/validation/CL/ConvolutionLayer.cpp
@@ -25,16 +25,16 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLConvolutionLayer.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/LargeConvolutionLayerDataset.h"
-#include "tests/datasets_new/SmallConvolutionLayerDataset.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/ConvolutionLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/LargeConvolutionLayerDataset.h"
+#include "tests/datasets/SmallConvolutionLayerDataset.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/ConvolutionLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/DepthConcatenateLayer.cpp b/tests/validation/CL/DepthConcatenateLayer.cpp
similarity index 94%
rename from tests/validation_new/CL/DepthConcatenateLayer.cpp
rename to tests/validation/CL/DepthConcatenateLayer.cpp
index ff64e23..a8ef1c3 100644
--- a/tests/validation_new/CL/DepthConcatenateLayer.cpp
+++ b/tests/validation/CL/DepthConcatenateLayer.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLDepthConcatenate.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/DepthConcatenateLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/DepthConcatenateLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/DepthwiseConvolution.cpp b/tests/validation/CL/DepthwiseConvolution.cpp
similarity index 87%
rename from tests/validation_new/CL/DepthwiseConvolution.cpp
rename to tests/validation/CL/DepthwiseConvolution.cpp
index 3fda275..ccee960 100644
--- a/tests/validation_new/CL/DepthwiseConvolution.cpp
+++ b/tests/validation/CL/DepthwiseConvolution.cpp
@@ -25,15 +25,15 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLDepthwiseConvolution.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/LargeDepthwiseConvolutionDataset.h"
-#include "tests/datasets_new/SmallDepthwiseConvolutionDataset.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/DepthwiseConvolutionFixture.h"
+#include "tests/datasets/LargeDepthwiseConvolutionDataset.h"
+#include "tests/datasets/SmallDepthwiseConvolutionDataset.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/DepthwiseConvolutionFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/DepthwiseSeparableConvolutionLayer.cpp b/tests/validation/CL/DepthwiseSeparableConvolutionLayer.cpp
similarity index 87%
rename from tests/validation_new/CL/DepthwiseSeparableConvolutionLayer.cpp
rename to tests/validation/CL/DepthwiseSeparableConvolutionLayer.cpp
index e577f5a..4fac9b2 100644
--- a/tests/validation_new/CL/DepthwiseSeparableConvolutionLayer.cpp
+++ b/tests/validation/CL/DepthwiseSeparableConvolutionLayer.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLDepthwiseSeparableConvolutionLayer.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/MobileNetDepthwiseSeparableConvolutionLayerDataset.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/DepthwiseSeparableConvolutionLayerFixture.h"
+#include "tests/datasets/MobileNetDepthwiseSeparableConvolutionLayerDataset.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/DepthwiseSeparableConvolutionLayerFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/DirectConvolutionLayer.cpp b/tests/validation/CL/DirectConvolutionLayer.cpp
similarity index 95%
rename from tests/validation_new/CL/DirectConvolutionLayer.cpp
rename to tests/validation/CL/DirectConvolutionLayer.cpp
index 1c698ac..d2d2cd1 100644
--- a/tests/validation_new/CL/DirectConvolutionLayer.cpp
+++ b/tests/validation/CL/DirectConvolutionLayer.cpp
@@ -25,15 +25,15 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLDirectConvolutionLayer.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/DirectConvolutionLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/DirectConvolutionLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/Floor.cpp b/tests/validation/CL/Floor.cpp
similarity index 89%
rename from tests/validation_new/CL/Floor.cpp
rename to tests/validation/CL/Floor.cpp
index 461a914..81495e8 100644
--- a/tests/validation_new/CL/Floor.cpp
+++ b/tests/validation/CL/Floor.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLFloor.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/FloorFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/FloorFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/FullyConnectedLayer.cpp b/tests/validation/CL/FullyConnectedLayer.cpp
similarity index 96%
rename from tests/validation_new/CL/FullyConnectedLayer.cpp
rename to tests/validation/CL/FullyConnectedLayer.cpp
index e43997c..7a8734b 100644
--- a/tests/validation_new/CL/FullyConnectedLayer.cpp
+++ b/tests/validation/CL/FullyConnectedLayer.cpp
@@ -25,15 +25,15 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLFullyConnectedLayer.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/FullyConnectedLayerDataset.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/FullyConnectedLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/FullyConnectedLayerDataset.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/FullyConnectedLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/GEMM.cpp b/tests/validation/CL/GEMM.cpp
similarity index 95%
rename from tests/validation_new/CL/GEMM.cpp
rename to tests/validation/CL/GEMM.cpp
index 7da5da3..6b2b2b4 100644
--- a/tests/validation_new/CL/GEMM.cpp
+++ b/tests/validation/CL/GEMM.cpp
@@ -25,16 +25,16 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLGEMM.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/LargeGEMMDataset.h"
-#include "tests/datasets_new/SmallGEMMDataset.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/GEMMFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/LargeGEMMDataset.h"
+#include "tests/datasets/SmallGEMMDataset.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/GEMMFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/L2Normalize.cpp b/tests/validation/CL/L2Normalize.cpp
similarity index 90%
rename from tests/validation_new/CL/L2Normalize.cpp
rename to tests/validation/CL/L2Normalize.cpp
index d7882a8..bd9bf17 100644
--- a/tests/validation_new/CL/L2Normalize.cpp
+++ b/tests/validation/CL/L2Normalize.cpp
@@ -25,15 +25,15 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLL2Normalize.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/L2NormalizeFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/L2NormalizeFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/MeanStdDev.cpp b/tests/validation/CL/MeanStdDev.cpp
similarity index 94%
rename from tests/validation_new/CL/MeanStdDev.cpp
rename to tests/validation/CL/MeanStdDev.cpp
index 494e100..ff8a087 100644
--- a/tests/validation_new/CL/MeanStdDev.cpp
+++ b/tests/validation/CL/MeanStdDev.cpp
@@ -22,12 +22,12 @@
  * SOFTWARE.
  */
 #include "arm_compute/runtime/CL/functions/CLMeanStdDev.h"
-#include "framework/Macros.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/MeanStdDevFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Macros.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/MeanStdDevFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/NormalizationLayer.cpp b/tests/validation/CL/NormalizationLayer.cpp
similarity index 93%
rename from tests/validation_new/CL/NormalizationLayer.cpp
rename to tests/validation/CL/NormalizationLayer.cpp
index 37e77f36..4d14649 100644
--- a/tests/validation_new/CL/NormalizationLayer.cpp
+++ b/tests/validation/CL/NormalizationLayer.cpp
@@ -25,16 +25,16 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLNormalizationLayer.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/NormalizationTypesDataset.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/NormalizationLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/NormalizationTypesDataset.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/NormalizationLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/PoolingLayer.cpp b/tests/validation/CL/PoolingLayer.cpp
similarity index 95%
rename from tests/validation_new/CL/PoolingLayer.cpp
rename to tests/validation/CL/PoolingLayer.cpp
index d38a3b2..24380cb 100644
--- a/tests/validation_new/CL/PoolingLayer.cpp
+++ b/tests/validation/CL/PoolingLayer.cpp
@@ -25,16 +25,16 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLPoolingLayer.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/PoolingTypesDataset.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/PoolingLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/PoolingTypesDataset.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/PoolingLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/ReductionOperation.cpp b/tests/validation/CL/ReductionOperation.cpp
similarity index 88%
rename from tests/validation_new/CL/ReductionOperation.cpp
rename to tests/validation/CL/ReductionOperation.cpp
index af49d73..5896add 100644
--- a/tests/validation_new/CL/ReductionOperation.cpp
+++ b/tests/validation/CL/ReductionOperation.cpp
@@ -25,16 +25,16 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLReductionOperation.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ReductionOperationDataset.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/ReductionOperationFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/ReductionOperationDataset.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/ReductionOperationFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/Scale.cpp b/tests/validation/CL/Scale.cpp
similarity index 94%
rename from tests/validation_new/CL/Scale.cpp
rename to tests/validation/CL/Scale.cpp
index e28555a..d5866fa 100644
--- a/tests/validation_new/CL/Scale.cpp
+++ b/tests/validation/CL/Scale.cpp
@@ -26,16 +26,16 @@
 #include "arm_compute/runtime/CL/functions/CLScale.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/BorderModeDataset.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Helpers.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/ScaleFixture.h"
+#include "tests/datasets/BorderModeDataset.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Helpers.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/ScaleFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CL/SoftmaxLayer.cpp b/tests/validation/CL/SoftmaxLayer.cpp
similarity index 95%
rename from tests/validation_new/CL/SoftmaxLayer.cpp
rename to tests/validation/CL/SoftmaxLayer.cpp
index d13236a..c4a9970 100644
--- a/tests/validation_new/CL/SoftmaxLayer.cpp
+++ b/tests/validation/CL/SoftmaxLayer.cpp
@@ -25,15 +25,15 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLSoftmaxLayer.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/SoftmaxLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/SoftmaxLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation/CMakeLists.txt b/tests/validation/CMakeLists.txt
deleted file mode 100644
index 3d8f566..0000000
--- a/tests/validation/CMakeLists.txt
+++ /dev/null
@@ -1,96 +0,0 @@
-# Copyright (c) 2017 ARM Limited.
-#
-# SPDX-License-Identifier: MIT
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-cmake_minimum_required (VERSION 3.1)
-
-add_library(openvx SHARED IMPORTED)
-set_target_properties(openvx PROPERTIES
-    IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/../3rdparty/linux/armv7a/libopenvx.so"
-)
-
-add_library(vxu SHARED IMPORTED)
-set_target_properties(vxu PROPERTIES
-    IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/../3rdparty/linux/armv7a/libvxu.so"
-)
-
-add_library(OpenCL SHARED IMPORTED)
-set_target_properties(OpenCL PROPERTIES
-    IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/../build/opencl-1.2-stubs/libOpenCL.so"
-    IMPORTED_NO_SONAME 1
-)
-
-add_definitions(-DBOOST)
-
-set(ARM_COMPUTE_TARGETS_TO_VALIDATE "all" CACHE STRING "Semicolon-separated list of targets to include in validation.")
-
-set(ARM_COMPUTE_ALL_TARGETS
-    NEON
-    CL
-    UNIT
-    VX
-)
-
-if(ARM_COMPUTE_TARGETS_TO_VALIDATE STREQUAL "all")
-    set(ARM_COMPUTE_TARGETS_TO_VALIDATE ${ARM_COMPUTE_ALL_TARGETS})
-endif()
-
-list(REMOVE_DUPLICATES ARM_COMPUTE_TARGETS_TO_VALIDATE)
-
-foreach(TARGET ${ARM_COMPUTE_TARGETS_TO_VALIDATE})
-    list(FIND ARM_COMPUTE_ALL_TARGETS ${TARGET} idx)
-
-    if(${idx} LESS 0)
-        message(FATAL_ERROR "The target '${TARGET}' does not exist. It should be one of\n${ARM_COMPUTE_ALL_TARGETS}")
-    else()
-        add_subdirectory(${TARGET})
-    endif()
-endforeach()
-
-set(arm_compute_test_validation_SOURCE_FILES
-    ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Datasets.h
-    ${CMAKE_CURRENT_SOURCE_DIR}/Reference.h
-    ${CMAKE_CURRENT_SOURCE_DIR}/Reference.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/ReferenceCPP.h
-    ${CMAKE_CURRENT_SOURCE_DIR}/ReferenceCPP.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Validation.h
-    ${CMAKE_CURRENT_SOURCE_DIR}/Validation.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/ValidationProgramOptions.h
-    ${CMAKE_CURRENT_SOURCE_DIR}/ValidationUserConfiguration.h
-)
-
-add_library(arm_compute_test_validation OBJECT
-    ${arm_compute_test_validation_SOURCE_FILES}
-)
-
-add_executable(arm_compute_validation
-    $<TARGET_OBJECTS:arm_compute_test_validation>
-    ${arm_compute_test_validation_TARGET_OBJECTS}
-    $<TARGET_OBJECTS:tensor_library>
-    $<TARGET_OBJECTS:arm_compute_test>
-)
-
-target_link_libraries(arm_compute_validation
-    boost_unit_test_framework
-    boost_program_options
-    arm_compute
-    ${arm_compute_test_validation_TARGET_LIBRARIES}
-)
diff --git a/tests/validation_new/CPP/ActivationLayer.cpp b/tests/validation/CPP/ActivationLayer.cpp
similarity index 97%
rename from tests/validation_new/CPP/ActivationLayer.cpp
rename to tests/validation/CPP/ActivationLayer.cpp
index 052c3aa..fa393be 100644
--- a/tests/validation_new/CPP/ActivationLayer.cpp
+++ b/tests/validation/CPP/ActivationLayer.cpp
@@ -23,9 +23,9 @@
  */
 #include "ActivationLayer.h"
 
-#include "tests/validation_new/FixedPoint.h"
-#include "tests/validation_new/Helpers.h"
-#include "tests/validation_new/half.h"
+#include "tests/validation/FixedPoint.h"
+#include "tests/validation/Helpers.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/ActivationLayer.h b/tests/validation/CPP/ActivationLayer.h
similarity index 97%
rename from tests/validation_new/CPP/ActivationLayer.h
rename to tests/validation/CPP/ActivationLayer.h
index 3f10a2f..09f602f 100644
--- a/tests/validation_new/CPP/ActivationLayer.h
+++ b/tests/validation/CPP/ActivationLayer.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_ACTIVATION_LAYER_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/BitwiseAnd.cpp b/tests/validation/CPP/BitwiseAnd.cpp
similarity index 100%
rename from tests/validation_new/CPP/BitwiseAnd.cpp
rename to tests/validation/CPP/BitwiseAnd.cpp
diff --git a/tests/validation_new/CPP/BitwiseAnd.h b/tests/validation/CPP/BitwiseAnd.h
similarity index 100%
rename from tests/validation_new/CPP/BitwiseAnd.h
rename to tests/validation/CPP/BitwiseAnd.h
diff --git a/tests/validation_new/CPP/BitwiseNot.cpp b/tests/validation/CPP/BitwiseNot.cpp
similarity index 100%
rename from tests/validation_new/CPP/BitwiseNot.cpp
rename to tests/validation/CPP/BitwiseNot.cpp
diff --git a/tests/validation_new/CPP/BitwiseNot.h b/tests/validation/CPP/BitwiseNot.h
similarity index 100%
rename from tests/validation_new/CPP/BitwiseNot.h
rename to tests/validation/CPP/BitwiseNot.h
diff --git a/tests/validation_new/CPP/BitwiseOr.cpp b/tests/validation/CPP/BitwiseOr.cpp
similarity index 100%
rename from tests/validation_new/CPP/BitwiseOr.cpp
rename to tests/validation/CPP/BitwiseOr.cpp
diff --git a/tests/validation_new/CPP/BitwiseOr.h b/tests/validation/CPP/BitwiseOr.h
similarity index 100%
rename from tests/validation_new/CPP/BitwiseOr.h
rename to tests/validation/CPP/BitwiseOr.h
diff --git a/tests/validation_new/CPP/BitwiseXor.cpp b/tests/validation/CPP/BitwiseXor.cpp
similarity index 100%
rename from tests/validation_new/CPP/BitwiseXor.cpp
rename to tests/validation/CPP/BitwiseXor.cpp
diff --git a/tests/validation_new/CPP/BitwiseXor.h b/tests/validation/CPP/BitwiseXor.h
similarity index 100%
rename from tests/validation_new/CPP/BitwiseXor.h
rename to tests/validation/CPP/BitwiseXor.h
diff --git a/tests/validation_new/CPP/ConvolutionLayer.cpp b/tests/validation/CPP/ConvolutionLayer.cpp
similarity index 98%
rename from tests/validation_new/CPP/ConvolutionLayer.cpp
rename to tests/validation/CPP/ConvolutionLayer.cpp
index a24621a..1824ada 100644
--- a/tests/validation_new/CPP/ConvolutionLayer.cpp
+++ b/tests/validation/CPP/ConvolutionLayer.cpp
@@ -23,9 +23,9 @@
  */
 #include "ConvolutionLayer.h"
 
-#include "tests/validation_new/FixedPoint.h"
-#include "tests/validation_new/Helpers.h"
-#include "tests/validation_new/half.h"
+#include "tests/validation/FixedPoint.h"
+#include "tests/validation/Helpers.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/ConvolutionLayer.h b/tests/validation/CPP/ConvolutionLayer.h
similarity index 97%
rename from tests/validation_new/CPP/ConvolutionLayer.h
rename to tests/validation/CPP/ConvolutionLayer.h
index a7c9e08..117e846 100644
--- a/tests/validation_new/CPP/ConvolutionLayer.h
+++ b/tests/validation/CPP/ConvolutionLayer.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_CONVOLUTION_LAYER_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/DepthConcatenateLayer.cpp b/tests/validation/CPP/DepthConcatenateLayer.cpp
similarity index 96%
rename from tests/validation_new/CPP/DepthConcatenateLayer.cpp
rename to tests/validation/CPP/DepthConcatenateLayer.cpp
index c54c6c8..139d26f 100644
--- a/tests/validation_new/CPP/DepthConcatenateLayer.cpp
+++ b/tests/validation/CPP/DepthConcatenateLayer.cpp
@@ -23,9 +23,9 @@
  */
 #include "DepthConcatenateLayer.h"
 
-#include "tests/validation_new/FixedPoint.h"
-#include "tests/validation_new/Helpers.h"
-#include "tests/validation_new/half.h"
+#include "tests/validation/FixedPoint.h"
+#include "tests/validation/Helpers.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/DepthConcatenateLayer.h b/tests/validation/CPP/DepthConcatenateLayer.h
similarity index 100%
rename from tests/validation_new/CPP/DepthConcatenateLayer.h
rename to tests/validation/CPP/DepthConcatenateLayer.h
diff --git a/tests/validation_new/CPP/DepthwiseConvolution.cpp b/tests/validation/CPP/DepthwiseConvolution.cpp
similarity index 97%
rename from tests/validation_new/CPP/DepthwiseConvolution.cpp
rename to tests/validation/CPP/DepthwiseConvolution.cpp
index 8c5cec5..ebca333 100644
--- a/tests/validation_new/CPP/DepthwiseConvolution.cpp
+++ b/tests/validation/CPP/DepthwiseConvolution.cpp
@@ -26,8 +26,8 @@
 #include "ConvolutionLayer.h"
 #include "Utils.h"
 
-#include "tests/validation_new/Helpers.h"
-#include "tests/validation_new/half.h"
+#include "tests/validation/Helpers.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/DepthwiseConvolution.h b/tests/validation/CPP/DepthwiseConvolution.h
similarity index 97%
rename from tests/validation_new/CPP/DepthwiseConvolution.h
rename to tests/validation/CPP/DepthwiseConvolution.h
index 4a92620..6be80fc 100644
--- a/tests/validation_new/CPP/DepthwiseConvolution.h
+++ b/tests/validation/CPP/DepthwiseConvolution.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_DEPTHWISE_CONVOLUTION_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/DepthwiseSeparableConvolutionLayer.cpp b/tests/validation/CPP/DepthwiseSeparableConvolutionLayer.cpp
similarity index 96%
rename from tests/validation_new/CPP/DepthwiseSeparableConvolutionLayer.cpp
rename to tests/validation/CPP/DepthwiseSeparableConvolutionLayer.cpp
index eba0a19..7020a85 100644
--- a/tests/validation_new/CPP/DepthwiseSeparableConvolutionLayer.cpp
+++ b/tests/validation/CPP/DepthwiseSeparableConvolutionLayer.cpp
@@ -28,8 +28,8 @@
 #include "ConvolutionLayer.h"
 #include "Utils.h"
 
-#include "tests/validation_new/Helpers.h"
-#include "tests/validation_new/half.h"
+#include "tests/validation/Helpers.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/DepthwiseSeparableConvolutionLayer.h b/tests/validation/CPP/DepthwiseSeparableConvolutionLayer.h
similarity index 97%
rename from tests/validation_new/CPP/DepthwiseSeparableConvolutionLayer.h
rename to tests/validation/CPP/DepthwiseSeparableConvolutionLayer.h
index 0c9f118..71cd013 100644
--- a/tests/validation_new/CPP/DepthwiseSeparableConvolutionLayer.h
+++ b/tests/validation/CPP/DepthwiseSeparableConvolutionLayer.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_DEPTHWISE_SEPARABLE_CONVOLUTION_LAYER_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/DequantizationLayer.cpp b/tests/validation/CPP/DequantizationLayer.cpp
similarity index 100%
rename from tests/validation_new/CPP/DequantizationLayer.cpp
rename to tests/validation/CPP/DequantizationLayer.cpp
diff --git a/tests/validation_new/CPP/DequantizationLayer.h b/tests/validation/CPP/DequantizationLayer.h
similarity index 97%
rename from tests/validation_new/CPP/DequantizationLayer.h
rename to tests/validation/CPP/DequantizationLayer.h
index 33592b8..3aae338 100644
--- a/tests/validation_new/CPP/DequantizationLayer.h
+++ b/tests/validation/CPP/DequantizationLayer.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_DEQUANTIZATION_LAYER_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/Floor.cpp b/tests/validation/CPP/Floor.cpp
similarity index 97%
rename from tests/validation_new/CPP/Floor.cpp
rename to tests/validation/CPP/Floor.cpp
index aed4fec..1c73944 100644
--- a/tests/validation_new/CPP/Floor.cpp
+++ b/tests/validation/CPP/Floor.cpp
@@ -23,7 +23,7 @@
  */
 #include "Floor.h"
 
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 #include <cmath>
 
diff --git a/tests/validation_new/CPP/Floor.h b/tests/validation/CPP/Floor.h
similarity index 97%
rename from tests/validation_new/CPP/Floor.h
rename to tests/validation/CPP/Floor.h
index 30b8118..d95ee30 100644
--- a/tests/validation_new/CPP/Floor.h
+++ b/tests/validation/CPP/Floor.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_FLOOR_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/FullyConnectedLayer.cpp b/tests/validation/CPP/FullyConnectedLayer.cpp
similarity index 98%
rename from tests/validation_new/CPP/FullyConnectedLayer.cpp
rename to tests/validation/CPP/FullyConnectedLayer.cpp
index 7852dab..a146535 100644
--- a/tests/validation_new/CPP/FullyConnectedLayer.cpp
+++ b/tests/validation/CPP/FullyConnectedLayer.cpp
@@ -23,8 +23,8 @@
  */
 #include "FullyConnectedLayer.h"
 
-#include "tests/validation_new/FixedPoint.h"
-#include "tests/validation_new/half.h"
+#include "tests/validation/FixedPoint.h"
+#include "tests/validation/half.h"
 
 #include <numeric>
 
diff --git a/tests/validation_new/CPP/FullyConnectedLayer.h b/tests/validation/CPP/FullyConnectedLayer.h
similarity index 97%
rename from tests/validation_new/CPP/FullyConnectedLayer.h
rename to tests/validation/CPP/FullyConnectedLayer.h
index 5d62179..05c570a 100644
--- a/tests/validation_new/CPP/FullyConnectedLayer.h
+++ b/tests/validation/CPP/FullyConnectedLayer.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_FULLY_CONNECTED_LAYER_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/GEMM.cpp b/tests/validation/CPP/GEMM.cpp
similarity index 97%
rename from tests/validation_new/CPP/GEMM.cpp
rename to tests/validation/CPP/GEMM.cpp
index 424633f..9b66597 100644
--- a/tests/validation_new/CPP/GEMM.cpp
+++ b/tests/validation/CPP/GEMM.cpp
@@ -23,8 +23,8 @@
  */
 #include "GEMM.h"
 
-#include "tests/validation_new/FixedPoint.h"
-#include "tests/validation_new/half.h"
+#include "tests/validation/FixedPoint.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/GEMM.h b/tests/validation/CPP/GEMM.h
similarity index 97%
rename from tests/validation_new/CPP/GEMM.h
rename to tests/validation/CPP/GEMM.h
index 7fea2a9..cda792b 100644
--- a/tests/validation_new/CPP/GEMM.h
+++ b/tests/validation/CPP/GEMM.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_GEMM_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/L2Normalize.cpp b/tests/validation/CPP/L2Normalize.cpp
similarity index 98%
rename from tests/validation_new/CPP/L2Normalize.cpp
rename to tests/validation/CPP/L2Normalize.cpp
index f423702..4fb4d57 100644
--- a/tests/validation_new/CPP/L2Normalize.cpp
+++ b/tests/validation/CPP/L2Normalize.cpp
@@ -24,7 +24,7 @@
 #include "L2Normalize.h"
 #include "ReductionOperation.h"
 
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 #include <algorithm>
 #include <cmath>
diff --git a/tests/validation_new/CPP/L2Normalize.h b/tests/validation/CPP/L2Normalize.h
similarity index 97%
rename from tests/validation_new/CPP/L2Normalize.h
rename to tests/validation/CPP/L2Normalize.h
index da36a73..1db3ae6 100644
--- a/tests/validation_new/CPP/L2Normalize.h
+++ b/tests/validation/CPP/L2Normalize.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_L2NORMALIZE_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/MeanStdDev.cpp b/tests/validation/CPP/MeanStdDev.cpp
similarity index 100%
rename from tests/validation_new/CPP/MeanStdDev.cpp
rename to tests/validation/CPP/MeanStdDev.cpp
diff --git a/tests/validation_new/CPP/MeanStdDev.h b/tests/validation/CPP/MeanStdDev.h
similarity index 100%
rename from tests/validation_new/CPP/MeanStdDev.h
rename to tests/validation/CPP/MeanStdDev.h
diff --git a/tests/validation_new/CPP/NormalizationLayer.cpp b/tests/validation/CPP/NormalizationLayer.cpp
similarity index 98%
rename from tests/validation_new/CPP/NormalizationLayer.cpp
rename to tests/validation/CPP/NormalizationLayer.cpp
index a8818d8..3c6f5e1 100644
--- a/tests/validation_new/CPP/NormalizationLayer.cpp
+++ b/tests/validation/CPP/NormalizationLayer.cpp
@@ -23,8 +23,8 @@
  */
 #include "NormalizationLayer.h"
 
-#include "tests/validation_new/FixedPoint.h"
-#include "tests/validation_new/half.h"
+#include "tests/validation/FixedPoint.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/NormalizationLayer.h b/tests/validation/CPP/NormalizationLayer.h
similarity index 97%
rename from tests/validation_new/CPP/NormalizationLayer.h
rename to tests/validation/CPP/NormalizationLayer.h
index bdd8754..3f624ff 100644
--- a/tests/validation_new/CPP/NormalizationLayer.h
+++ b/tests/validation/CPP/NormalizationLayer.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_NORMALIZATION_LAYER_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/PoolingLayer.cpp b/tests/validation/CPP/PoolingLayer.cpp
similarity index 98%
rename from tests/validation_new/CPP/PoolingLayer.cpp
rename to tests/validation/CPP/PoolingLayer.cpp
index 5464885..c4425ca 100644
--- a/tests/validation_new/CPP/PoolingLayer.cpp
+++ b/tests/validation/CPP/PoolingLayer.cpp
@@ -23,8 +23,8 @@
  */
 #include "PoolingLayer.h"
 
-#include "tests/validation_new/FixedPoint.h"
-#include "tests/validation_new/half.h"
+#include "tests/validation/FixedPoint.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/PoolingLayer.h b/tests/validation/CPP/PoolingLayer.h
similarity index 97%
rename from tests/validation_new/CPP/PoolingLayer.h
rename to tests/validation/CPP/PoolingLayer.h
index 0935fb0..334054a 100644
--- a/tests/validation_new/CPP/PoolingLayer.h
+++ b/tests/validation/CPP/PoolingLayer.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_POOLING_LAYER_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/QuantizationLayer.cpp b/tests/validation/CPP/QuantizationLayer.cpp
similarity index 100%
rename from tests/validation_new/CPP/QuantizationLayer.cpp
rename to tests/validation/CPP/QuantizationLayer.cpp
diff --git a/tests/validation_new/CPP/QuantizationLayer.h b/tests/validation/CPP/QuantizationLayer.h
similarity index 97%
rename from tests/validation_new/CPP/QuantizationLayer.h
rename to tests/validation/CPP/QuantizationLayer.h
index c696ab0..7c5572c 100644
--- a/tests/validation_new/CPP/QuantizationLayer.h
+++ b/tests/validation/CPP/QuantizationLayer.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_QUANTIZATION_LAYER_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/ReductionOperation.cpp b/tests/validation/CPP/ReductionOperation.cpp
similarity index 98%
rename from tests/validation_new/CPP/ReductionOperation.cpp
rename to tests/validation/CPP/ReductionOperation.cpp
index f4c5c21..acfcc09 100644
--- a/tests/validation_new/CPP/ReductionOperation.cpp
+++ b/tests/validation/CPP/ReductionOperation.cpp
@@ -23,7 +23,7 @@
  */
 #include "ReductionOperation.h"
 
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 #include <algorithm>
 #include <cmath>
diff --git a/tests/validation_new/CPP/ReductionOperation.h b/tests/validation/CPP/ReductionOperation.h
similarity index 97%
rename from tests/validation_new/CPP/ReductionOperation.h
rename to tests/validation/CPP/ReductionOperation.h
index 500a816..6da6436 100644
--- a/tests/validation_new/CPP/ReductionOperation.h
+++ b/tests/validation/CPP/ReductionOperation.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_REDUCTION_OPERATION_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/Scale.cpp b/tests/validation/CPP/Scale.cpp
similarity index 100%
rename from tests/validation_new/CPP/Scale.cpp
rename to tests/validation/CPP/Scale.cpp
diff --git a/tests/validation_new/CPP/Scale.h b/tests/validation/CPP/Scale.h
similarity index 100%
rename from tests/validation_new/CPP/Scale.h
rename to tests/validation/CPP/Scale.h
diff --git a/tests/validation_new/CPP/SoftmaxLayer.cpp b/tests/validation/CPP/SoftmaxLayer.cpp
similarity index 97%
rename from tests/validation_new/CPP/SoftmaxLayer.cpp
rename to tests/validation/CPP/SoftmaxLayer.cpp
index 8c2cda8..4fe87d0 100644
--- a/tests/validation_new/CPP/SoftmaxLayer.cpp
+++ b/tests/validation/CPP/SoftmaxLayer.cpp
@@ -23,8 +23,8 @@
  */
 #include "SoftmaxLayer.h"
 
-#include "tests/validation_new/FixedPoint.h"
-#include "tests/validation_new/half.h"
+#include "tests/validation/FixedPoint.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/SoftmaxLayer.h b/tests/validation/CPP/SoftmaxLayer.h
similarity index 97%
rename from tests/validation_new/CPP/SoftmaxLayer.h
rename to tests/validation/CPP/SoftmaxLayer.h
index cc52f3c..ab79bc4 100644
--- a/tests/validation_new/CPP/SoftmaxLayer.h
+++ b/tests/validation/CPP/SoftmaxLayer.h
@@ -25,7 +25,7 @@
 #define __ARM_COMPUTE_TEST_SOFTMAX_LAYER_H__
 
 #include "tests/SimpleTensor.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/Utils.cpp b/tests/validation/CPP/Utils.cpp
similarity index 97%
rename from tests/validation_new/CPP/Utils.cpp
rename to tests/validation/CPP/Utils.cpp
index c89807b..05443ea 100644
--- a/tests/validation_new/CPP/Utils.cpp
+++ b/tests/validation/CPP/Utils.cpp
@@ -23,8 +23,8 @@
  */
 #include "Utils.h"
 
-#include "tests/validation_new/Helpers.h"
-#include "tests/validation_new/half.h"
+#include "tests/validation/Helpers.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/CPP/Utils.h b/tests/validation/CPP/Utils.h
similarity index 95%
rename from tests/validation_new/CPP/Utils.h
rename to tests/validation/CPP/Utils.h
index 4e3deb4..5e9ec82 100644
--- a/tests/validation_new/CPP/Utils.h
+++ b/tests/validation/CPP/Utils.h
@@ -28,8 +28,6 @@
 #include "tests/Globals.h"
 #include "tests/ILutAccessor.h"
 #include "tests/Types.h"
-#include "tests/validation/ValidationUserConfiguration.h"
-#include "tests/validation/half.h"
 
 #include <array>
 #include <random>
diff --git a/tests/validation/FixedPoint.h b/tests/validation/FixedPoint.h
index 12ffcdf..9691e2a 100644
--- a/tests/validation/FixedPoint.h
+++ b/tests/validation/FixedPoint.h
@@ -24,8 +24,8 @@
 #ifndef __ARM_COMPUTE_TEST_VALIDATION_FIXEDPOINT_H__
 #define __ARM_COMPUTE_TEST_VALIDATION_FIXEDPOINT_H__
 
-#include "Utils.h"
 #include "support/ToolchainSupport.h"
+#include "tests/Utils.h"
 
 #include <cassert>
 #include <cstdint>
@@ -63,6 +63,8 @@
 template <> struct promote<int32_t> { using type = int64_t; };
 template <> struct promote<uint64_t> { using type = uint64_t; };
 template <> struct promote<int64_t> { using type = int64_t; };
+template <typename T>
+using promote_t = typename promote<T>::type;
 // clang-format on
 // *INDENT-ON*
 }
@@ -88,10 +90,6 @@
     // Static Checks
     static_assert(std::is_integral<T>::value, "Type is not an integer");
 
-    // Friends
-    friend struct detail::functions;
-    friend struct detail::constant_expr<T>;
-
     /** Constructor (from different fixed point type)
      *
      * @param[in] val Fixed point
@@ -387,7 +385,7 @@
     template <typename T>
     static bool signbit(fixed_point<T> x)
     {
-        return ((x._value >> std::numeric_limits<T>::digits) != 0);
+        return ((x.raw() >> std::numeric_limits<T>::digits) != 0);
     }
     /** Checks if two fixed point numbers are equal
      *
@@ -399,10 +397,10 @@
     template <typename T>
     static bool isequal(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
+        uint8_t p = std::min(x.precision(), y.precision());
         x.rescale(p);
         y.rescale(p);
-        return (x._value == y._value);
+        return (x.raw() == y.raw());
     }
     /** Checks if two fixed point number are not equal
      *
@@ -426,10 +424,10 @@
     template <typename T>
     static bool isgreater(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
+        uint8_t p = std::min(x.precision(), y.precision());
         x.rescale(p);
         y.rescale(p);
-        return (x._value > y._value);
+        return (x.raw() > y.raw());
     }
     /** Checks if one fixed point is greater or equal than the other
      *
@@ -441,10 +439,10 @@
     template <typename T>
     static bool isgreaterequal(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
+        uint8_t p = std::min(x.precision(), y.precision());
         x.rescale(p);
         y.rescale(p);
-        return (x._value >= y._value);
+        return (x.raw() >= y.raw());
     }
     /** Checks if one fixed point is less than the other
      *
@@ -456,10 +454,10 @@
     template <typename T>
     static bool isless(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
+        uint8_t p = std::min(x.precision(), y.precision());
         x.rescale(p);
         y.rescale(p);
-        return (x._value < y._value);
+        return (x.raw() < y.raw());
     }
     /** Checks if one fixed point is less or equal than the other
      *
@@ -471,10 +469,10 @@
     template <typename T>
     static bool islessequal(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
+        uint8_t p = std::min(x.precision(), y.precision());
         x.rescale(p);
         y.rescale(p);
-        return (x._value <= y._value);
+        return (x.raw() <= y.raw());
     }
     /** Checks if one fixed point is less or greater than the other
      *
@@ -499,7 +497,7 @@
     template <typename T>
     static fixed_point<T> clamp(fixed_point<T> x, T min, T max)
     {
-        return fixed_point<T>(constant_expr<T>::clamp(x._value, min, max), x._fixed_point_position, true);
+        return fixed_point<T>(constant_expr<T>::clamp(x.raw(), min, max), x.precision(), true);
     }
     /** Negate number
      *
@@ -511,12 +509,12 @@
     static fixed_point<T> negate(fixed_point<T> x)
     {
         using promoted_T = typename traits::promote<T>::type;
-        promoted_T val   = -x._value;
+        promoted_T val   = -x.raw();
         if(OP == OverflowPolicy::SATURATE)
         {
             val = constant_expr<T>::saturate_cast(val);
         }
-        return fixed_point<T>(static_cast<T>(val), x._fixed_point_position, true);
+        return fixed_point<T>(static_cast<T>(val), x.precision(), true);
     }
     /** Perform addition among two fixed point numbers
      *
@@ -528,19 +526,19 @@
     template <OverflowPolicy OP = OverflowPolicy::SATURATE, typename T>
     static fixed_point<T> add(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
+        uint8_t p = std::min(x.precision(), y.precision());
         x.rescale(p);
         y.rescale(p);
         if(OP == OverflowPolicy::SATURATE)
         {
             using type = typename traits::promote<T>::type;
-            type val   = static_cast<type>(x._value) + static_cast<type>(y._value);
+            type val   = static_cast<type>(x.raw()) + static_cast<type>(y.raw());
             val        = constant_expr<T>::saturate_cast(val);
             return fixed_point<T>(static_cast<T>(val), p, true);
         }
         else
         {
-            return fixed_point<T>(x._value + y._value, p, true);
+            return fixed_point<T>(x.raw() + y.raw(), p, true);
         }
     }
     /** Perform subtraction among two fixed point numbers
@@ -553,19 +551,19 @@
     template <OverflowPolicy OP = OverflowPolicy::SATURATE, typename T>
     static fixed_point<T> sub(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
+        uint8_t p = std::min(x.precision(), y.precision());
         x.rescale(p);
         y.rescale(p);
         if(OP == OverflowPolicy::SATURATE)
         {
             using type = typename traits::promote<T>::type;
-            type val   = static_cast<type>(x._value) - static_cast<type>(y._value);
+            type val   = static_cast<type>(x.raw()) - static_cast<type>(y.raw());
             val        = constant_expr<T>::saturate_cast(val);
             return fixed_point<T>(static_cast<T>(val), p, true);
         }
         else
         {
-            return fixed_point<T>(x._value - y._value, p, true);
+            return fixed_point<T>(x.raw() - y.raw(), p, true);
         }
     }
     /** Perform multiplication among two fixed point numbers
@@ -579,10 +577,10 @@
     static fixed_point<T> mul(fixed_point<T> x, fixed_point<T> y)
     {
         using promoted_T        = typename traits::promote<T>::type;
-        uint8_t    p_min        = std::min(x._fixed_point_position, y._fixed_point_position);
-        uint8_t    p_max        = std::max(x._fixed_point_position, y._fixed_point_position);
+        uint8_t    p_min        = std::min(x.precision(), y.precision());
+        uint8_t    p_max        = std::max(x.precision(), y.precision());
         promoted_T round_factor = (1 << (p_max - 1));
-        promoted_T val          = ((static_cast<promoted_T>(x._value) * static_cast<promoted_T>(y._value)) + round_factor) >> p_max;
+        promoted_T val          = ((static_cast<promoted_T>(x.raw()) * static_cast<promoted_T>(y.raw())) + round_factor) >> p_max;
         if(OP == OverflowPolicy::SATURATE)
         {
             val = constant_expr<T>::saturate_cast(val);
@@ -600,11 +598,11 @@
     static fixed_point<T> div(fixed_point<T> x, fixed_point<T> y)
     {
         using promoted_T = typename traits::promote<T>::type;
-        uint8_t    p     = std::min(x._fixed_point_position, y._fixed_point_position);
-        promoted_T denom = static_cast<promoted_T>(y._value);
+        uint8_t    p     = std::min(x.precision(), y.precision());
+        promoted_T denom = static_cast<promoted_T>(y.raw());
         if(denom != 0)
         {
-            promoted_T val = (static_cast<promoted_T>(x._value) << std::max(x._fixed_point_position, y._fixed_point_position)) / denom;
+            promoted_T val = (static_cast<promoted_T>(x.raw()) << std::max(x.precision(), y.precision())) / denom;
             if(OP == OverflowPolicy::SATURATE)
             {
                 val = constant_expr<T>::saturate_cast(val);
@@ -613,7 +611,7 @@
         }
         else
         {
-            T val = (x._value < 0) ? std::numeric_limits<T>::min() : std::numeric_limits<T>::max();
+            T val = (x.raw() < 0) ? std::numeric_limits<T>::min() : std::numeric_limits<T>::max();
             return fixed_point<T>(val, p, true);
         }
     }
@@ -628,12 +626,12 @@
     static fixed_point<T> shift_left(fixed_point<T> x, size_t shift)
     {
         using promoted_T = typename traits::promote<T>::type;
-        promoted_T val   = static_cast<promoted_T>(x._value) << shift;
+        promoted_T val   = static_cast<promoted_T>(x.raw()) << shift;
         if(OP == OverflowPolicy::SATURATE)
         {
             val = constant_expr<T>::saturate_cast(val);
         }
-        return fixed_point<T>(static_cast<T>(val), x._fixed_point_position, true);
+        return fixed_point<T>(static_cast<T>(val), x.precision(), true);
     }
     /** Shift right
      *
@@ -645,7 +643,7 @@
     template <typename T>
     static fixed_point<T> shift_right(fixed_point<T> x, size_t shift)
     {
-        return fixed_point<T>(x._value >> shift, x._fixed_point_position, true);
+        return fixed_point<T>(x.raw() >> shift, x.precision(), true);
     }
     /** Calculate absolute value
      *
@@ -657,8 +655,8 @@
     static fixed_point<T> abs(fixed_point<T> x)
     {
         using promoted_T = typename traits::promote<T>::type;
-        T val            = (x._value < 0) ? constant_expr<T>::saturate_cast(-static_cast<promoted_T>(x._value)) : x._value;
-        return fixed_point<T>(val, x._fixed_point_position, true);
+        T val            = (x.raw() < 0) ? constant_expr<T>::saturate_cast(-static_cast<promoted_T>(x.raw())) : x.raw();
+        return fixed_point<T>(val, x.precision(), true);
     }
     /** Calculate the logarithm of a fixed point number
      *
@@ -669,7 +667,7 @@
     template <typename T>
     static fixed_point<T> log(fixed_point<T> x)
     {
-        uint8_t p         = x._fixed_point_position;
+        uint8_t p         = x.precision();
         auto    const_one = fixed_point<T>(static_cast<T>(1), p);
 
         // Logarithm of 1 is zero and logarithm of negative values is not defined in R, so return 0.
@@ -684,7 +682,7 @@
         }
 
         // Remove even powers of 2
-        T shift_val = 31 - __builtin_clz(x._value >> p);
+        T shift_val = 31 - __builtin_clz(x.raw() >> p);
         x           = shift_right(x, shift_val);
         x           = sub(x, const_one);
 
@@ -716,7 +714,7 @@
     template <typename T>
     static fixed_point<T> exp(fixed_point<T> x)
     {
-        uint8_t p = x._fixed_point_position;
+        uint8_t p = x.precision();
         // Constants
         auto const_one = fixed_point<T>(1, p);
         auto ln2       = fixed_point<T>(0.6931471, p);
@@ -726,7 +724,7 @@
         auto C         = fixed_point<T>(0.1763723, p);
         auto D         = fixed_point<T>(0.0435108, p);
 
-        T scaled_int_part = detail::constant_expr<T>::to_int(mul(x, inv_ln2)._value, p);
+        T scaled_int_part = detail::constant_expr<T>::to_int(mul(x, inv_ln2).raw(), p);
 
         // Polynomial expansion
         auto frac_part = sub(x, mul(ln2, fixed_point<T>(scaled_int_part, p)));
@@ -753,8 +751,8 @@
     template <typename T>
     static fixed_point<T> inv_sqrt(fixed_point<T> x)
     {
-        const uint8_t p     = x._fixed_point_position;
-        int8_t        shift = std::numeric_limits<T>::digits - (p + detail::clz(x._value));
+        const uint8_t p     = x.precision();
+        int8_t        shift = std::numeric_limits<T>::digits - (p + detail::clz(x.raw()));
 
         shift += std::numeric_limits<T>::is_signed ? 1 : 0;
 
@@ -784,7 +782,7 @@
     template <typename T>
     static fixed_point<T> tanh(fixed_point<T> x)
     {
-        uint8_t p = x._fixed_point_position;
+        uint8_t p = x.precision();
         // Constants
         auto const_one = fixed_point<T>(1, p);
         auto const_two = fixed_point<T>(2, p);
diff --git a/tests/validation_new/Helpers.cpp b/tests/validation/Helpers.cpp
similarity index 97%
rename from tests/validation_new/Helpers.cpp
rename to tests/validation/Helpers.cpp
index c65966b..d3bcbbd 100644
--- a/tests/validation_new/Helpers.cpp
+++ b/tests/validation/Helpers.cpp
@@ -21,7 +21,7 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "tests/validation_new/Helpers.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation/Helpers.h b/tests/validation/Helpers.h
index 19a0c41..3095916 100644
--- a/tests/validation/Helpers.h
+++ b/tests/validation/Helpers.h
@@ -25,18 +25,12 @@
 #define __ARM_COMPUTE_TEST_VALIDATION_HELPERS_H__
 
 #include "arm_compute/core/Types.h"
-#include "tests/Globals.h"
-#include "tests/ILutAccessor.h"
-#include "tests/Types.h"
-#include "tests/validation/ValidationUserConfiguration.h"
+#include "arm_compute/core/Utils.h"
 #include "tests/validation/half.h"
 
-#include <array>
-#include <cstring>
 #include <random>
 #include <type_traits>
 #include <utility>
-#include <vector>
 
 namespace arm_compute
 {
@@ -44,158 +38,95 @@
 {
 namespace validation
 {
-/** Helper function to fill one or more tensors with the uniform distribution with int values.
- *
- * @param[in]     dist          Distribution to be used to get the values for the tensor.
- * @param[in]     seeds         List of seeds to be used to fill each tensor.
- * @param[in,out] tensor        Tensor to be initialized with the values of the distribution.
- * @param[in,out] other_tensors (Optional) One or more tensors to be filled.
- *
- */
-template <typename D, typename T, typename... Ts>
-void fill_tensors(D &&dist, std::initializer_list<int> seeds, T &&tensor, Ts &&... other_tensors)
+template <typename T>
+struct is_floating_point : public std::is_floating_point<T>
 {
-    const std::array < T, 1 + sizeof...(Ts) > tensors{ { std::forward<T>(tensor), std::forward<Ts>(other_tensors)... } };
-    std::vector<int> vs(seeds);
-    ARM_COMPUTE_ERROR_ON(vs.size() != tensors.size());
-    int k = 0;
-    for(auto tp : tensors)
-    {
-        library->fill(*tp, std::forward<D>(dist), vs[k++]);
-    }
-}
+};
+
+template <>
+struct is_floating_point<half_float::half> : public std::true_type
+{
+};
 
 /** Helper function to get the testing range for each activation layer.
  *
  * @param[in] activation           Activation function to test.
- * @param[in] fixed_point_position (Optional) Number of bits for the fractional part. Defaults to 1.
+ * @param[in] data_type            Data type.
+ * @param[in] fixed_point_position Number of bits for the fractional part. Defaults to 1.
  *
  * @return A pair containing the lower upper testing bounds for a given function.
  */
 template <typename T>
-inline std::pair<T, T> get_activation_layer_test_bounds(ActivationLayerInfo::ActivationFunction activation, int fixed_point_position = 1)
+std::pair<T, T> get_activation_layer_test_bounds(ActivationLayerInfo::ActivationFunction activation, DataType data_type, int fixed_point_position = 0)
 {
-    bool is_float = std::is_same<T, float>::value;
-    is_float      = is_float || std::is_same<T, half_float::half>::value;
-
     std::pair<T, T> bounds;
 
-    // Set initial values
-    if(is_float)
+    switch(data_type)
     {
-        bounds = std::make_pair(-255.f, 255.f);
-    }
-    else
-    {
-        bounds = std::make_pair(std::numeric_limits<T>::lowest(), std::numeric_limits<T>::max());
-    }
-
-    // Reduce testing ranges
-    switch(activation)
-    {
-        case ActivationLayerInfo::ActivationFunction::LOGISTIC:
-        case ActivationLayerInfo::ActivationFunction::SOFT_RELU:
-            // Reduce range as exponent overflows
-            if(is_float)
-            {
-                bounds.first  = -40.f;
-                bounds.second = 40.f;
-            }
-            else
-            {
-                bounds.first  = -(1 << (fixed_point_position));
-                bounds.second = 1 << (fixed_point_position);
-            }
-            break;
-        case ActivationLayerInfo::ActivationFunction::TANH:
-            // Reduce range as exponent overflows
-            if(!is_float)
-            {
-                bounds.first  = -(1 << (fixed_point_position));
-                bounds.second = 1 << (fixed_point_position);
-            }
-            break;
-        case ActivationLayerInfo::ActivationFunction::SQRT:
-            // Reduce range as sqrt should take a non-negative number
-            bounds.first = (is_float) ? 0 : 1;
-            break;
-        default:
-            break;
-    }
-    return bounds;
-}
-/** Helper function to get the testing range for batch normalization layer.
- *
- * @param[in] fixed_point_position (Optional) Number of bits for the fractional part. Defaults to 1.
- *
- * @return A pair containing the lower upper testing bounds.
- */
-template <typename T>
-std::pair<T, T> get_batchnormalization_layer_test_bounds(int fixed_point_position = 1)
-{
-    bool is_float = std::is_floating_point<T>::value;
-    std::pair<T, T> bounds;
-
-    // Set initial values
-    if(is_float)
-    {
-        bounds = std::make_pair(-1.f, 1.f);
-    }
-    else
-    {
-        bounds = std::make_pair(1, 1 << (fixed_point_position));
-    }
-
-    return bounds;
-}
-
-/** Fill mask with the corresponding given pattern.
- *
- * @param[in,out] mask    Mask to be filled according to pattern
- * @param[in]     cols    Columns (width) of mask
- * @param[in]     rows    Rows (height) of mask
- * @param[in]     pattern Pattern to fill the mask according to
- */
-inline void fill_mask_from_pattern(uint8_t *mask, int cols, int rows, MatrixPattern pattern)
-{
-    unsigned int                v = 0;
-    std::mt19937                gen(user_config.seed.get());
-    std::bernoulli_distribution dist(0.5);
-
-    for(int r = 0; r < rows; ++r)
-    {
-        for(int c = 0; c < cols; ++c, ++v)
+        case DataType::F16:
         {
-            uint8_t val = 0;
+            using namespace half_float::literal;
 
-            switch(pattern)
+            switch(activation)
             {
-                case MatrixPattern::BOX:
-                    val = 255;
+                case ActivationLayerInfo::ActivationFunction::SQUARE:
+                case ActivationLayerInfo::ActivationFunction::LOGISTIC:
+                case ActivationLayerInfo::ActivationFunction::SOFT_RELU:
+                    // Reduce range as exponent overflows
+                    bounds = std::make_pair(-10._h, 10._h);
                     break;
-                case MatrixPattern::CROSS:
-                    val = ((r == (rows / 2)) || (c == (cols / 2))) ? 255 : 0;
-                    break;
-                case MatrixPattern::DISK:
-                    val = (((r - rows / 2.0f + 0.5f) * (r - rows / 2.0f + 0.5f)) / ((rows / 2.0f) * (rows / 2.0f)) + ((c - cols / 2.0f + 0.5f) * (c - cols / 2.0f + 0.5f)) / ((cols / 2.0f) *
-                            (cols / 2.0f))) <= 1.0f ? 255 : 0;
-                    break;
-                case MatrixPattern::OTHER:
-                    val = (dist(gen) ? 0 : 255);
+                case ActivationLayerInfo::ActivationFunction::SQRT:
+                    // Reduce range as sqrt should take a non-negative number
+                    bounds = std::make_pair(0._h, 255._h);
                     break;
                 default:
-                    return;
+                    bounds = std::make_pair(-255._h, 255._h);
+                    break;
             }
-
-            mask[v] = val;
+            break;
         }
+        case DataType::F32:
+            switch(activation)
+            {
+                case ActivationLayerInfo::ActivationFunction::LOGISTIC:
+                case ActivationLayerInfo::ActivationFunction::SOFT_RELU:
+                    // Reduce range as exponent overflows
+                    bounds = std::make_pair(-40.f, 40.f);
+                    break;
+                case ActivationLayerInfo::ActivationFunction::SQRT:
+                    // Reduce range as sqrt should take a non-negative number
+                    bounds = std::make_pair(0.f, 255.f);
+                    break;
+                default:
+                    bounds = std::make_pair(-255.f, 255.f);
+                    break;
+            }
+            break;
+        case DataType::QS8:
+        case DataType::QS16:
+            switch(activation)
+            {
+                case ActivationLayerInfo::ActivationFunction::LOGISTIC:
+                case ActivationLayerInfo::ActivationFunction::SOFT_RELU:
+                case ActivationLayerInfo::ActivationFunction::TANH:
+                    // Reduce range as exponent overflows
+                    bounds = std::make_pair(-(1 << fixed_point_position), 1 << fixed_point_position);
+                    break;
+                case ActivationLayerInfo::ActivationFunction::SQRT:
+                    // Reduce range as sqrt should take a non-negative number
+                    // Can't be zero either as inv_sqrt is used in NEON.
+                    bounds = std::make_pair(1, std::numeric_limits<T>::max());
+                    break;
+                default:
+                    bounds = std::make_pair(std::numeric_limits<T>::lowest(), std::numeric_limits<T>::max());
+                    break;
+            }
+            break;
+        default:
+            ARM_COMPUTE_ERROR("Unsupported data type");
     }
 
-    if(pattern == MatrixPattern::OTHER)
-    {
-        std::uniform_int_distribution<uint8_t> distribution_u8(0, ((cols * rows) - 1));
-        mask[distribution_u8(gen)] = 255;
-    }
+    return bounds;
 }
 
 /** Calculate output tensor shape give a vector of input tensor to concatenate
@@ -204,69 +135,7 @@
  *
  * @return The shape of output concatenated tensor.
  */
-inline TensorShape calculate_depth_concatenate_shape(std::vector<TensorShape> input_shapes)
-{
-    TensorShape out_shape = input_shapes.at(0);
-
-    unsigned int max_x = 0;
-    unsigned int max_y = 0;
-    unsigned int depth = 0;
-
-    for(auto const &shape : input_shapes)
-    {
-        max_x = std::max<unsigned int>(shape.x(), max_x);
-        max_y = std::max<unsigned int>(shape.y(), max_y);
-        depth += shape.z();
-    }
-
-    out_shape.set(0, max_x);
-    out_shape.set(1, max_y);
-    out_shape.set(2, depth);
-
-    return out_shape;
-}
-
-/** Fill matrix random.
- *
- * @param[in,out] matrix Matrix
- * @param[in]     cols   Columns (width) of matrix
- * @param[in]     rows   Rows (height) of matrix
- */
-template <std::size_t SIZE>
-inline void fill_warp_matrix(std::array<float, SIZE> &matrix, int cols, int rows)
-{
-    std::mt19937                          gen(user_config.seed.get());
-    std::uniform_real_distribution<float> dist(-1, 1);
-
-    for(int v = 0, r = 0; r < rows; ++r)
-    {
-        for(int c = 0; c < cols; ++c, ++v)
-        {
-            matrix[v] = dist(gen);
-        }
-    }
-    if(SIZE == 9)
-    {
-        matrix[(cols * rows) - 1] = 1;
-    }
-}
-
-/** Helper function to fill the Lut random by a ILutAccessor.
- *
- * @param[in,out] table Accessor at the Lut.
- *
- */
-template <typename T>
-void fill_lookuptable(T &&table)
-{
-    std::mt19937                                          generator(user_config.seed.get());
-    std::uniform_int_distribution<typename T::value_type> distribution(std::numeric_limits<typename T::value_type>::min(), std::numeric_limits<typename T::value_type>::max());
-
-    for(int i = std::numeric_limits<typename T::value_type>::min(); i <= std::numeric_limits<typename T::value_type>::max(); i++)
-    {
-        table[i] = distribution(generator);
-    }
-}
+TensorShape calculate_depth_concatenate_shape(const std::vector<TensorShape> &input_shapes);
 } // namespace validation
 } // namespace test
 } // namespace arm_compute
diff --git a/tests/validation_new/NEON/ActivationLayer.cpp b/tests/validation/NEON/ActivationLayer.cpp
similarity index 96%
rename from tests/validation_new/NEON/ActivationLayer.cpp
rename to tests/validation/NEON/ActivationLayer.cpp
index bc2fe60..1c6811f 100644
--- a/tests/validation_new/NEON/ActivationLayer.cpp
+++ b/tests/validation/NEON/ActivationLayer.cpp
@@ -25,16 +25,16 @@
 #include "arm_compute/runtime/NEON/functions/NEActivationLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ActivationFunctionsDataset.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/ActivationLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/ActivationFunctionsDataset.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/ActivationLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/BitwiseAnd.cpp b/tests/validation/NEON/BitwiseAnd.cpp
similarity index 93%
rename from tests/validation_new/NEON/BitwiseAnd.cpp
rename to tests/validation/NEON/BitwiseAnd.cpp
index 5e6f900..179413e 100644
--- a/tests/validation_new/NEON/BitwiseAnd.cpp
+++ b/tests/validation/NEON/BitwiseAnd.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/NEON/functions/NEBitwiseAnd.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/BitwiseAndFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/BitwiseAndFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/BitwiseNot.cpp b/tests/validation/NEON/BitwiseNot.cpp
similarity index 92%
rename from tests/validation_new/NEON/BitwiseNot.cpp
rename to tests/validation/NEON/BitwiseNot.cpp
index 3725379..c438a57 100644
--- a/tests/validation_new/NEON/BitwiseNot.cpp
+++ b/tests/validation/NEON/BitwiseNot.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/NEON/functions/NEBitwiseNot.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/BitwiseNotFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/BitwiseNotFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/BitwiseOr.cpp b/tests/validation/NEON/BitwiseOr.cpp
similarity index 93%
rename from tests/validation_new/NEON/BitwiseOr.cpp
rename to tests/validation/NEON/BitwiseOr.cpp
index 84ddf8e..0e4cdbe 100644
--- a/tests/validation_new/NEON/BitwiseOr.cpp
+++ b/tests/validation/NEON/BitwiseOr.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/NEON/functions/NEBitwiseOr.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/BitwiseOrFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/BitwiseOrFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/BitwiseXor.cpp b/tests/validation/NEON/BitwiseXor.cpp
similarity index 93%
rename from tests/validation_new/NEON/BitwiseXor.cpp
rename to tests/validation/NEON/BitwiseXor.cpp
index 5a5a650..70363c0 100644
--- a/tests/validation_new/NEON/BitwiseXor.cpp
+++ b/tests/validation/NEON/BitwiseXor.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/NEON/functions/NEBitwiseXor.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/BitwiseXorFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/BitwiseXorFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation/NEON/CMakeLists.txt b/tests/validation/NEON/CMakeLists.txt
deleted file mode 100644
index bf07d27..0000000
--- a/tests/validation/NEON/CMakeLists.txt
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright (c) 2017 ARM Limited.
-#
-# SPDX-License-Identifier: MIT
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-cmake_minimum_required (VERSION 3.1)
-
-set(arm_compute_test_validation_NEON_SOURCE_FILES
-    ${CMAKE_SOURCE_DIR}/NEON/Helper.h
-    ${CMAKE_SOURCE_DIR}/NEON/Accessor.h
-    ${CMAKE_CURRENT_SOURCE_DIR}/AbsoluteDifference.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Accumulate.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/AccumulateSquared.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/AccumulateWeighted.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/ArithmeticAddition.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/ArithmeticSubtraction.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/BatchNormalizationLayer.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/BitwiseAnd.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/BitwiseNot.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/BitwiseOr.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/BitwiseXor.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Box3x3.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/ConvolutionLayer.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/DirectConvolutionLayer.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/DepthConvert.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/FillBorder.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Fixedpoint/Exp_QS8.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Fixedpoint/Invsqrt_QS8.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Fixedpoint/Log_QS8.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Fixedpoint/Reciprocal_QS8.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/FullyConnectedLayer.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Gaussian3x3.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/GEMM.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/HarrisCorners.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/IntegralImage.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/NormalizationLayer.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/PixelWiseMultiplication.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/MeanStdDev.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Pooling/PoolingLayer.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Sobel3x3.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Sobel5x5.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/SoftmaxLayer.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Threshold.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/MinMaxLocation.cpp
-)
-
-add_library(arm_compute_test_validation_NEON OBJECT
-    ${arm_compute_test_validation_NEON_SOURCE_FILES}
-)
-
-set(arm_compute_test_validation_TARGET_OBJECTS
-    ${arm_compute_test_validation_TARGET_OBJECTS}
-    $<TARGET_OBJECTS:arm_compute_test_validation_NEON>
-    PARENT_SCOPE
-)
diff --git a/tests/validation_new/NEON/ConvolutionLayer.cpp b/tests/validation/NEON/ConvolutionLayer.cpp
similarity index 95%
rename from tests/validation_new/NEON/ConvolutionLayer.cpp
rename to tests/validation/NEON/ConvolutionLayer.cpp
index 1efff02..7a3306d 100644
--- a/tests/validation_new/NEON/ConvolutionLayer.cpp
+++ b/tests/validation/NEON/ConvolutionLayer.cpp
@@ -25,16 +25,16 @@
 #include "arm_compute/runtime/NEON/functions/NEConvolutionLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/LargeConvolutionLayerDataset.h"
-#include "tests/datasets_new/SmallConvolutionLayerDataset.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/ConvolutionLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/LargeConvolutionLayerDataset.h"
+#include "tests/datasets/SmallConvolutionLayerDataset.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/ConvolutionLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/DepthConcatenateLayer.cpp b/tests/validation/NEON/DepthConcatenateLayer.cpp
similarity index 94%
rename from tests/validation_new/NEON/DepthConcatenateLayer.cpp
rename to tests/validation/NEON/DepthConcatenateLayer.cpp
index d6400d2..19a41ee 100644
--- a/tests/validation_new/NEON/DepthConcatenateLayer.cpp
+++ b/tests/validation/NEON/DepthConcatenateLayer.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/NEON/functions/NEDepthConcatenate.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/DepthConcatenateLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/DepthConcatenateLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/DequantizationLayer.cpp b/tests/validation/NEON/DequantizationLayer.cpp
similarity index 92%
rename from tests/validation_new/NEON/DequantizationLayer.cpp
rename to tests/validation/NEON/DequantizationLayer.cpp
index 8b67a14..22d56ab 100644
--- a/tests/validation_new/NEON/DequantizationLayer.cpp
+++ b/tests/validation/NEON/DequantizationLayer.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/NEON/functions/NEDequantizationLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/DequantizationLayerFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/DequantizationLayerFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/DirectConvolutionLayer.cpp b/tests/validation/NEON/DirectConvolutionLayer.cpp
similarity index 95%
rename from tests/validation_new/NEON/DirectConvolutionLayer.cpp
rename to tests/validation/NEON/DirectConvolutionLayer.cpp
index 68cbe54..6211d31 100644
--- a/tests/validation_new/NEON/DirectConvolutionLayer.cpp
+++ b/tests/validation/NEON/DirectConvolutionLayer.cpp
@@ -25,15 +25,15 @@
 #include "arm_compute/runtime/NEON/functions/NEDirectConvolutionLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/DirectConvolutionLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/DirectConvolutionLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/Floor.cpp b/tests/validation/NEON/Floor.cpp
similarity index 89%
rename from tests/validation_new/NEON/Floor.cpp
rename to tests/validation/NEON/Floor.cpp
index e100c30..ea16e0b 100644
--- a/tests/validation_new/NEON/Floor.cpp
+++ b/tests/validation/NEON/Floor.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/NEON/functions/NEFloor.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/FloorFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/FloorFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/FullyConnectedLayer.cpp b/tests/validation/NEON/FullyConnectedLayer.cpp
similarity index 96%
rename from tests/validation_new/NEON/FullyConnectedLayer.cpp
rename to tests/validation/NEON/FullyConnectedLayer.cpp
index e859fb3..55f8da9 100644
--- a/tests/validation_new/NEON/FullyConnectedLayer.cpp
+++ b/tests/validation/NEON/FullyConnectedLayer.cpp
@@ -25,15 +25,15 @@
 #include "arm_compute/runtime/NEON/functions/NEFullyConnectedLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/FullyConnectedLayerDataset.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/FullyConnectedLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/FullyConnectedLayerDataset.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/FullyConnectedLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/GEMM.cpp b/tests/validation/NEON/GEMM.cpp
similarity index 95%
rename from tests/validation_new/NEON/GEMM.cpp
rename to tests/validation/NEON/GEMM.cpp
index 453b183..05db3bb 100644
--- a/tests/validation_new/NEON/GEMM.cpp
+++ b/tests/validation/NEON/GEMM.cpp
@@ -25,16 +25,16 @@
 #include "arm_compute/runtime/NEON/functions/NEGEMM.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/LargeGEMMDataset.h"
-#include "tests/datasets_new/SmallGEMMDataset.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/GEMMFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/LargeGEMMDataset.h"
+#include "tests/datasets/SmallGEMMDataset.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/GEMMFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/L2Normalize.cpp b/tests/validation/NEON/L2Normalize.cpp
similarity index 90%
rename from tests/validation_new/NEON/L2Normalize.cpp
rename to tests/validation/NEON/L2Normalize.cpp
index 20804d2..4f94c15 100644
--- a/tests/validation_new/NEON/L2Normalize.cpp
+++ b/tests/validation/NEON/L2Normalize.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/NEON/functions/NEL2Normalize.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/L2NormalizeFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/L2NormalizeFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/MeanStdDev.cpp b/tests/validation/NEON/MeanStdDev.cpp
similarity index 94%
rename from tests/validation_new/NEON/MeanStdDev.cpp
rename to tests/validation/NEON/MeanStdDev.cpp
index 6214261..42d8879 100644
--- a/tests/validation_new/NEON/MeanStdDev.cpp
+++ b/tests/validation/NEON/MeanStdDev.cpp
@@ -22,12 +22,12 @@
  * SOFTWARE.
  */
 #include "arm_compute/runtime/NEON/functions/NEMeanStdDev.h"
-#include "framework/Macros.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/MeanStdDevFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Macros.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/MeanStdDevFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/NormalizationLayer.cpp b/tests/validation/NEON/NormalizationLayer.cpp
similarity index 93%
rename from tests/validation_new/NEON/NormalizationLayer.cpp
rename to tests/validation/NEON/NormalizationLayer.cpp
index 1da2ed0..5d792e9 100644
--- a/tests/validation_new/NEON/NormalizationLayer.cpp
+++ b/tests/validation/NEON/NormalizationLayer.cpp
@@ -25,16 +25,16 @@
 #include "arm_compute/runtime/NEON/functions/NENormalizationLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/NormalizationTypesDataset.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/NormalizationLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/NormalizationTypesDataset.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/NormalizationLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/PoolingLayer.cpp b/tests/validation/NEON/PoolingLayer.cpp
similarity index 95%
rename from tests/validation_new/NEON/PoolingLayer.cpp
rename to tests/validation/NEON/PoolingLayer.cpp
index 20fce3d..ac5a28b 100644
--- a/tests/validation_new/NEON/PoolingLayer.cpp
+++ b/tests/validation/NEON/PoolingLayer.cpp
@@ -25,16 +25,16 @@
 #include "arm_compute/runtime/NEON/functions/NEPoolingLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/PoolingTypesDataset.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/PoolingLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/PoolingTypesDataset.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/PoolingLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/QuantizationLayer.cpp b/tests/validation/NEON/QuantizationLayer.cpp
similarity index 92%
rename from tests/validation_new/NEON/QuantizationLayer.cpp
rename to tests/validation/NEON/QuantizationLayer.cpp
index 8b2acd6..5c2fab4 100644
--- a/tests/validation_new/NEON/QuantizationLayer.cpp
+++ b/tests/validation/NEON/QuantizationLayer.cpp
@@ -25,14 +25,14 @@
 #include "arm_compute/runtime/NEON/functions/NEQuantizationLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/QuantizationLayerFixture.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/QuantizationLayerFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/ReductionOperation.cpp b/tests/validation/NEON/ReductionOperation.cpp
similarity index 89%
rename from tests/validation_new/NEON/ReductionOperation.cpp
rename to tests/validation/NEON/ReductionOperation.cpp
index 4048af0..4ea71a6 100644
--- a/tests/validation_new/NEON/ReductionOperation.cpp
+++ b/tests/validation/NEON/ReductionOperation.cpp
@@ -25,15 +25,15 @@
 #include "arm_compute/runtime/NEON/functions/NEReductionOperation.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ReductionOperationDataset.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/ReductionOperationFixture.h"
+#include "tests/datasets/ReductionOperationDataset.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/ReductionOperationFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/Scale.cpp b/tests/validation/NEON/Scale.cpp
similarity index 93%
rename from tests/validation_new/NEON/Scale.cpp
rename to tests/validation/NEON/Scale.cpp
index 1036f98..2fbd7c7 100644
--- a/tests/validation_new/NEON/Scale.cpp
+++ b/tests/validation/NEON/Scale.cpp
@@ -26,17 +26,17 @@
 #include "arm_compute/runtime/NEON/functions/NEScale.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/BorderModeDataset.h"
-#include "tests/datasets_new/InterpolationPolicyDataset.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Helpers.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/ScaleFixture.h"
+#include "tests/datasets/BorderModeDataset.h"
+#include "tests/datasets/InterpolationPolicyDataset.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Helpers.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/ScaleFixture.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/NEON/SoftmaxLayer.cpp b/tests/validation/NEON/SoftmaxLayer.cpp
similarity index 95%
rename from tests/validation_new/NEON/SoftmaxLayer.cpp
rename to tests/validation/NEON/SoftmaxLayer.cpp
index 337ee29..36f1881 100644
--- a/tests/validation_new/NEON/SoftmaxLayer.cpp
+++ b/tests/validation/NEON/SoftmaxLayer.cpp
@@ -25,15 +25,15 @@
 #include "arm_compute/runtime/NEON/functions/NESoftmaxLayer.h"
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
-#include "framework/Asserts.h"
-#include "framework/Macros.h"
-#include "framework/datasets/Datasets.h"
 #include "tests/NEON/Accessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets_new/ShapeDatasets.h"
-#include "tests/validation_new/Validation.h"
-#include "tests/validation_new/fixtures/SoftmaxLayerFixture.h"
-#include "tests/validation_new/half.h"
+#include "tests/datasets/ShapeDatasets.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Macros.h"
+#include "tests/framework/datasets/Datasets.h"
+#include "tests/validation/Validation.h"
+#include "tests/validation/fixtures/SoftmaxLayerFixture.h"
+#include "tests/validation/half.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation/UNIT/CMakeLists.txt b/tests/validation/UNIT/CMakeLists.txt
deleted file mode 100644
index a0603f1..0000000
--- a/tests/validation/UNIT/CMakeLists.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (c) 2017 ARM Limited.
-#
-# SPDX-License-Identifier: MIT
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-cmake_minimum_required (VERSION 3.1)
-
-set(arm_compute_test_validation_UNIT_SOURCE_FILES
-    ${CMAKE_CURRENT_SOURCE_DIR}/TensorInfo.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/Utils.cpp
-)
-
-add_library(arm_compute_test_validation_UNIT OBJECT
-    ${arm_compute_test_validation_UNIT_SOURCE_FILES}
-)
-
-set(arm_compute_test_validation_TARGET_OBJECTS
-    ${arm_compute_test_validation_TARGET_OBJECTS}
-    $<TARGET_OBJECTS:arm_compute_test_validation_UNIT>
-    PARENT_SCOPE
-)
diff --git a/tests/validation/Validation.cpp b/tests/validation/Validation.cpp
index d321e63..fec7c10 100644
--- a/tests/validation/Validation.cpp
+++ b/tests/validation/Validation.cpp
@@ -25,22 +25,14 @@
 
 #include "arm_compute/core/Coordinates.h"
 #include "arm_compute/core/Error.h"
-#include "arm_compute/core/FixedPoint.h"
-#include "arm_compute/core/IArray.h"
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/runtime/Tensor.h"
-#include "tests/IAccessor.h"
-#include "tests/RawTensor.h"
-#include "tests/TypePrinter.h"
-#include "tests/Utils.h"
 #include "tests/validation/half.h"
 
 #include <array>
 #include <cmath>
 #include <cstddef>
 #include <cstdint>
-#include <iomanip>
-#include <vector>
 
 namespace arm_compute
 {
@@ -99,39 +91,6 @@
     }
 }
 
-bool is_equal(double target, double ref, double max_absolute_error = std::numeric_limits<double>::epsilon(), double max_relative_error = 0.0001f)
-{
-    if(!std::isfinite(target) || !std::isfinite(ref))
-    {
-        return false;
-    }
-
-    // No need further check if they are equal
-    if(ref == target)
-    {
-        return true;
-    }
-
-    // Need this check for the situation when the two values close to zero but have different sign
-    if(std::abs(std::abs(ref) - std::abs(target)) <= max_absolute_error)
-    {
-        return true;
-    }
-
-    double relative_error = 0;
-
-    if(std::abs(target) > std::abs(ref))
-    {
-        relative_error = std::abs((target - ref) / target);
-    }
-    else
-    {
-        relative_error = std::abs((ref - target) / ref);
-    }
-
-    return relative_error <= max_relative_error;
-}
-
 void check_border_element(const IAccessor &tensor, const Coordinates &id,
                           const BorderMode &border_mode, const void *border_value,
                           int64_t &num_elements, int64_t &num_mismatches)
@@ -142,7 +101,25 @@
     if(border_mode == BorderMode::REPLICATE)
     {
         Coordinates border_id{ id };
-        border_id.set(1, 0);
+
+        if(id.x() < 0)
+        {
+            border_id.set(0, 0);
+        }
+        else if(static_cast<size_t>(id.x()) >= tensor.shape().x())
+        {
+            border_id.set(0, tensor.shape().x() - 1);
+        }
+
+        if(id.y() < 0)
+        {
+            border_id.set(1, 0);
+        }
+        else if(static_cast<size_t>(id.y()) >= tensor.shape().y())
+        {
+            border_id.set(1, tensor.shape().y() - 1);
+        }
+
         border_value = tensor(border_id);
     }
 
@@ -151,160 +128,51 @@
     {
         const size_t channel_offset = channel * channel_size;
         const double target         = get_double_data(ptr + channel_offset, tensor.data_type());
-        const double ref            = get_double_data(static_cast<const uint8_t *>(border_value) + channel_offset, tensor.data_type());
-        const bool   equal          = is_equal(target, ref);
+        const double reference      = get_double_data(static_cast<const uint8_t *>(border_value) + channel_offset, tensor.data_type());
 
-        BOOST_TEST_INFO("id = " << id);
-        BOOST_TEST_INFO("channel = " << channel);
-        BOOST_TEST_INFO("reference = " << std::setprecision(5) << ref);
-        BOOST_TEST_INFO("target = " << std::setprecision(5) << target);
-        BOOST_TEST_WARN(equal);
-
-        if(!equal)
+        if(!compare<AbsoluteTolerance<double>, double>(target, reference))
         {
+            ARM_COMPUTE_TEST_INFO("id = " << id);
+            ARM_COMPUTE_TEST_INFO("channel = " << channel);
+            ARM_COMPUTE_TEST_INFO("target = " << std::setprecision(5) << target);
+            ARM_COMPUTE_TEST_INFO("reference = " << std::setprecision(5) << reference);
+            ARM_COMPUTE_EXPECT_EQUAL(target, reference, framework::LogLevel::DEBUG);
+
             ++num_mismatches;
         }
 
         ++num_elements;
     }
 }
-
-void check_single_element(const Coordinates &id, const IAccessor &tensor, const RawTensor &reference, float tolerance_value,
-                          uint64_t wrap_range, int min_channels, size_t channel_size, int64_t &num_mismatches, int64_t &num_elements)
-{
-    const auto ptr     = static_cast<const uint8_t *>(tensor(id));
-    const auto ref_ptr = static_cast<const uint8_t *>(reference(id));
-
-    // Iterate over all channels within one element
-    for(int channel = 0; channel < min_channels; ++channel)
-    {
-        const size_t channel_offset = channel * channel_size;
-        const double target         = get_double_data(ptr + channel_offset, reference.data_type());
-        const double ref            = get_double_data(ref_ptr + channel_offset, reference.data_type());
-        bool         equal          = is_equal(target, ref, tolerance_value);
-
-        if(wrap_range != 0 && !equal)
-        {
-            equal = is_equal(target, ref, wrap_range - tolerance_value);
-        }
-
-        if(!equal)
-        {
-            BOOST_TEST_INFO("id = " << id);
-            BOOST_TEST_INFO("channel = " << channel);
-            BOOST_TEST_INFO("reference = " << std::setprecision(5) << ref);
-            BOOST_TEST_INFO("target = " << std::setprecision(5) << target);
-            BOOST_TEST_WARN(equal);
-            ++num_mismatches;
-        }
-        ++num_elements;
-    }
-}
 } // namespace
 
 void validate(const arm_compute::ValidRegion &region, const arm_compute::ValidRegion &reference)
 {
-    BOOST_TEST(region.anchor.num_dimensions() == reference.anchor.num_dimensions());
-    BOOST_TEST(region.shape.num_dimensions() == reference.shape.num_dimensions());
+    ARM_COMPUTE_EXPECT_EQUAL(region.anchor.num_dimensions(), reference.anchor.num_dimensions(), framework::LogLevel::ERRORS);
+    ARM_COMPUTE_EXPECT_EQUAL(region.shape.num_dimensions(), reference.shape.num_dimensions(), framework::LogLevel::ERRORS);
 
     for(unsigned int d = 0; d < region.anchor.num_dimensions(); ++d)
     {
-        BOOST_TEST(region.anchor[d] == reference.anchor[d]);
+        ARM_COMPUTE_EXPECT_EQUAL(region.anchor[d], reference.anchor[d], framework::LogLevel::ERRORS);
     }
 
     for(unsigned int d = 0; d < region.shape.num_dimensions(); ++d)
     {
-        BOOST_TEST(region.shape[d] == reference.shape[d]);
+        ARM_COMPUTE_EXPECT_EQUAL(region.shape[d], reference.shape[d], framework::LogLevel::ERRORS);
     }
 }
 
 void validate(const arm_compute::PaddingSize &padding, const arm_compute::PaddingSize &reference)
 {
-    BOOST_TEST(padding.top == reference.top);
-    BOOST_TEST(padding.right == reference.right);
-    BOOST_TEST(padding.bottom == reference.bottom);
-    BOOST_TEST(padding.left == reference.left);
-}
-
-void validate(const IAccessor &tensor, const RawTensor &reference, float tolerance_value, float tolerance_number, uint64_t wrap_range)
-{
-    // Validate with valid region covering the entire shape
-    validate(tensor, reference, shape_to_valid_region(tensor.shape()), tolerance_value, tolerance_number, wrap_range);
-}
-
-void validate(const IAccessor &tensor, const RawTensor &reference, const ValidRegion &valid_region, float tolerance_value, float tolerance_number, uint64_t wrap_range)
-{
-    int64_t num_mismatches = 0;
-    int64_t num_elements   = 0;
-
-    BOOST_TEST(tensor.element_size() == reference.element_size());
-    BOOST_TEST(tensor.format() == reference.format());
-    BOOST_TEST(tensor.data_type() == reference.data_type());
-    BOOST_TEST(tensor.num_channels() == reference.num_channels());
-    BOOST_TEST(compare_dimensions(tensor.shape(), reference.shape()));
-
-    const int    min_elements = std::min(tensor.num_elements(), reference.num_elements());
-    const int    min_channels = std::min(tensor.num_channels(), reference.num_channels());
-    const size_t channel_size = element_size_from_data_type(reference.data_type());
-
-    // Iterate over all elements within valid region, e.g. U8, S16, RGB888, ...
-    for(int element_idx = 0; element_idx < min_elements; ++element_idx)
-    {
-        const Coordinates id = index2coord(reference.shape(), element_idx);
-        if(is_in_valid_region(valid_region, id))
-        {
-            check_single_element(id, tensor, reference, tolerance_value, wrap_range, min_channels, channel_size, num_mismatches, num_elements);
-        }
-    }
-
-    const int64_t absolute_tolerance_number = tolerance_number * num_elements;
-    const float   percent_mismatches        = static_cast<float>(num_mismatches) / num_elements * 100.f;
-
-    BOOST_TEST(num_mismatches <= absolute_tolerance_number,
-               num_mismatches << " values (" << std::setprecision(2) << percent_mismatches
-               << "%) mismatched (maximum tolerated " << std::setprecision(2) << tolerance_number << "%)");
-}
-
-void validate(const IAccessor &tensor, const RawTensor &reference, const RawTensor &valid_mask, float tolerance_value, float tolerance_number, uint64_t wrap_range)
-{
-    int64_t num_mismatches = 0;
-    int64_t num_elements   = 0;
-
-    BOOST_TEST(tensor.element_size() == reference.element_size());
-    BOOST_TEST(tensor.format() == reference.format());
-    BOOST_TEST(tensor.data_type() == reference.data_type());
-    BOOST_TEST(tensor.num_channels() == reference.num_channels());
-    BOOST_TEST(compare_dimensions(tensor.shape(), reference.shape()));
-
-    const int    min_elements = std::min(tensor.num_elements(), reference.num_elements());
-    const int    min_channels = std::min(tensor.num_channels(), reference.num_channels());
-    const size_t channel_size = element_size_from_data_type(reference.data_type());
-
-    // Iterate over all elements within valid region, e.g. U8, S16, RGB888, ...
-    for(int element_idx = 0; element_idx < min_elements; ++element_idx)
-    {
-        const Coordinates id = index2coord(reference.shape(), element_idx);
-        if(valid_mask[element_idx] == 1)
-        {
-            check_single_element(id, tensor, reference, tolerance_value, wrap_range, min_channels, channel_size, num_mismatches, num_elements);
-        }
-        else
-        {
-            ++num_elements;
-        }
-    }
-
-    const int64_t absolute_tolerance_number = tolerance_number * num_elements;
-    const float   percent_mismatches        = static_cast<float>(num_mismatches) / num_elements * 100.f;
-
-    BOOST_TEST(num_mismatches <= absolute_tolerance_number,
-               num_mismatches << " values (" << std::setprecision(2) << percent_mismatches
-               << "%) mismatched (maximum tolerated " << std::setprecision(2) << tolerance_number << "%)");
+    ARM_COMPUTE_EXPECT_EQUAL(padding.top, reference.top, framework::LogLevel::ERRORS);
+    ARM_COMPUTE_EXPECT_EQUAL(padding.right, reference.right, framework::LogLevel::ERRORS);
+    ARM_COMPUTE_EXPECT_EQUAL(padding.bottom, reference.bottom, framework::LogLevel::ERRORS);
+    ARM_COMPUTE_EXPECT_EQUAL(padding.left, reference.left, framework::LogLevel::ERRORS);
 }
 
 void validate(const IAccessor &tensor, const void *reference_value)
 {
-    BOOST_TEST_REQUIRE((reference_value != nullptr));
+    ARM_COMPUTE_ASSERT(reference_value != nullptr);
 
     int64_t      num_mismatches = 0;
     int64_t      num_elements   = 0;
@@ -322,17 +190,16 @@
         {
             const size_t channel_offset = channel * channel_size;
             const double target         = get_double_data(ptr + channel_offset, tensor.data_type());
-            const double ref            = get_double_data(reference_value, tensor.data_type());
-            const bool   equal          = is_equal(target, ref);
+            const double reference      = get_double_data(reference_value, tensor.data_type());
 
-            BOOST_TEST_INFO("id = " << id);
-            BOOST_TEST_INFO("channel = " << channel);
-            BOOST_TEST_INFO("reference = " << std::setprecision(5) << ref);
-            BOOST_TEST_INFO("target = " << std::setprecision(5) << target);
-            BOOST_TEST_WARN(equal);
-
-            if(!equal)
+            if(!compare<AbsoluteTolerance<double>, double>(target, reference))
             {
+                ARM_COMPUTE_TEST_INFO("id = " << id);
+                ARM_COMPUTE_TEST_INFO("channel = " << channel);
+                ARM_COMPUTE_TEST_INFO("target = " << std::setprecision(5) << target);
+                ARM_COMPUTE_TEST_INFO("reference = " << std::setprecision(5) << reference);
+                ARM_COMPUTE_EXPECT_EQUAL(target, reference, framework::LogLevel::DEBUG);
+
                 ++num_mismatches;
             }
 
@@ -340,10 +207,13 @@
         }
     }
 
-    const float percent_mismatches = static_cast<float>(num_mismatches) / num_elements * 100.f;
+    if(num_elements > 0)
+    {
+        const float percent_mismatches = static_cast<float>(num_mismatches) / num_elements * 100.f;
 
-    BOOST_TEST(num_mismatches == 0,
-               num_mismatches << " values (" << std::setprecision(2) << percent_mismatches << "%) mismatched");
+        ARM_COMPUTE_TEST_INFO(num_mismatches << " values (" << std::fixed << std::setprecision(2) << percent_mismatches << "%) mismatched");
+        ARM_COMPUTE_EXPECT_EQUAL(num_mismatches, 0, framework::LogLevel::ERRORS);
+    }
 }
 
 void validate(const IAccessor &tensor, BorderSize border_size, const BorderMode &border_mode, const void *border_value)
@@ -354,7 +224,7 @@
     }
     else if(border_mode == BorderMode::CONSTANT)
     {
-        BOOST_TEST((border_value != nullptr));
+        ARM_COMPUTE_ASSERT(border_value != nullptr);
     }
 
     int64_t   num_mismatches = 0;
@@ -414,64 +284,24 @@
         }
     }
 
-    const float percent_mismatches = static_cast<float>(num_mismatches) / num_elements * 100.f;
+    if(num_elements > 0)
+    {
+        const float percent_mismatches = static_cast<float>(num_mismatches) / num_elements * 100.f;
 
-    BOOST_TEST(num_mismatches == 0,
-               num_mismatches << " values (" << std::setprecision(2) << percent_mismatches << "%) mismatched");
+        ARM_COMPUTE_TEST_INFO(num_mismatches << " values (" << std::fixed << std::setprecision(2) << percent_mismatches << "%) mismatched");
+        ARM_COMPUTE_EXPECT_EQUAL(num_mismatches, 0, framework::LogLevel::ERRORS);
+    }
 }
 
 void validate(std::vector<unsigned int> classified_labels, std::vector<unsigned int> expected_labels)
 {
-    ARM_COMPUTE_UNUSED(classified_labels);
-    ARM_COMPUTE_UNUSED(expected_labels);
-    BOOST_TEST(expected_labels.size() != 0);
-    BOOST_TEST(classified_labels.size() == expected_labels.size());
+    ARM_COMPUTE_EXPECT_EQUAL(classified_labels.size(), expected_labels.size(), framework::LogLevel::ERRORS);
 
     for(unsigned int i = 0; i < expected_labels.size(); ++i)
     {
-        BOOST_TEST(classified_labels[i] == expected_labels[i]);
+        ARM_COMPUTE_EXPECT_EQUAL(classified_labels[i], expected_labels[i], framework::LogLevel::ERRORS);
     }
 }
-
-void validate(float target, float ref, float tolerance_abs_error, float tolerance_relative_error)
-{
-    const bool equal = is_equal(target, ref, tolerance_abs_error, tolerance_relative_error);
-
-    BOOST_TEST_INFO("reference = " << std::setprecision(5) << ref);
-    BOOST_TEST_INFO("target = " << std::setprecision(5) << target);
-    BOOST_TEST(equal);
-}
-
-void validate(IArray<KeyPoint> &target, IArray<KeyPoint> &ref, int64_t tolerance)
-{
-    int64_t num_mismatches = 0;
-
-    BOOST_TEST_WARN(target.num_values() == ref.num_values());
-
-    for(size_t i = 0; i < target.num_values(); ++i)
-    {
-        KeyPoint *ref_val = std::find_if(ref.buffer(), ref.buffer() + ref.num_values(), [&target, i](KeyPoint key)
-        {
-            return key.x == target.at(i).x && key.y == target.at(i).y;
-        });
-
-        const KeyPoint &key = target.at(i);
-
-        if((ref_val == ref.buffer() + ref.num_values()) || !(is_equal(key.strength, ref_val->strength) && is_equal(key.scale, ref_val->scale) && is_equal(key.orientation, ref_val->orientation)
-                                                             && is_equal(key.tracking_status, ref_val->tracking_status) && is_equal(key.error, ref_val->error)))
-        {
-            ++num_mismatches;
-
-            BOOST_TEST_WARN(is_equal(key.strength, ref_val->strength));
-            BOOST_TEST_WARN(is_equal(key.scale, ref_val->scale));
-            BOOST_TEST_WARN(is_equal(key.orientation, ref_val->orientation));
-            BOOST_TEST_WARN(is_equal(key.tracking_status, ref_val->tracking_status));
-            BOOST_TEST_WARN(is_equal(key.error, ref_val->error));
-        }
-    }
-
-    BOOST_TEST(num_mismatches <= tolerance);
-}
 } // namespace validation
 } // namespace test
 } // namespace arm_compute
diff --git a/tests/validation/Validation.h b/tests/validation/Validation.h
index 5701331..db95e06 100644
--- a/tests/validation/Validation.h
+++ b/tests/validation/Validation.h
@@ -21,44 +21,123 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#ifndef __ARM_COMPUTE_TEST_REFERENCE_VALIDATION_H__
-#define __ARM_COMPUTE_TEST_REFERENCE_VALIDATION_H__
+#ifndef __ARM_COMPUTE_TEST_VALIDATION_H__
+#define __ARM_COMPUTE_TEST_VALIDATION_H__
 
+#include "arm_compute/core/FixedPoint.h"
 #include "arm_compute/core/Types.h"
-#include "arm_compute/runtime/Array.h"
-#include "tests/RawTensor.h"
+#include "tests/IAccessor.h"
+#include "tests/SimpleTensor.h"
+#include "tests/TypePrinter.h"
+#include "tests/Utils.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Exceptions.h"
 
-#include "boost_wrapper.h"
-
+#include <iomanip>
+#include <ios>
 #include <vector>
 
 namespace arm_compute
 {
-class Tensor;
-
 namespace test
 {
-class IAccessor;
-
 namespace validation
 {
+/** Class reprensenting an absolute tolerance value. */
 template <typename T>
-boost::test_tools::predicate_result compare_dimensions(const Dimensions<T> &dimensions1, const Dimensions<T> &dimensions2)
+class AbsoluteTolerance
+{
+public:
+    /** Underlying type. */
+    using value_type = T;
+
+    /* Default constructor.
+     *
+     * Initialises the tolerance to 0.
+     */
+    AbsoluteTolerance() = default;
+
+    /** Constructor.
+     *
+     * @param[in] value Absolute tolerance value.
+     */
+    explicit constexpr AbsoluteTolerance(T value)
+        : _value{ value }
+    {
+    }
+
+    /** Implicit conversion to the underlying type. */
+    constexpr operator T() const
+    {
+        return _value;
+    }
+
+private:
+    T _value{ std::numeric_limits<T>::epsilon() };
+};
+
+/** Class reprensenting a relative tolerance value. */
+class RelativeTolerance
+{
+public:
+    /** Underlying type. */
+    using value_type = double;
+
+    /* Default constructor.
+     *
+     * Initialises the tolerance to 0.
+     */
+    RelativeTolerance() = default;
+
+    /** Constructor.
+     *
+     * @param[in] value Relative tolerance value.
+     */
+    explicit constexpr RelativeTolerance(value_type value)
+        : _value{ value }
+    {
+    }
+
+    /** Implicit conversion to the underlying type. */
+    constexpr operator value_type() const
+    {
+        return _value;
+    }
+
+private:
+    value_type _value{ 0 };
+};
+
+/** Print AbsoluteTolerance type. */
+template <typename T>
+inline ::std::ostream &operator<<(::std::ostream &os, const AbsoluteTolerance<T> &tolerance)
+{
+    os << static_cast<typename AbsoluteTolerance<T>::value_type>(tolerance);
+
+    return os;
+}
+
+/** Print RelativeTolerance type. */
+inline ::std::ostream &operator<<(::std::ostream &os, const RelativeTolerance &tolerance)
+{
+    os << static_cast<typename RelativeTolerance::value_type>(tolerance);
+
+    return os;
+}
+
+template <typename T>
+bool compare_dimensions(const Dimensions<T> &dimensions1, const Dimensions<T> &dimensions2)
 {
     if(dimensions1.num_dimensions() != dimensions2.num_dimensions())
     {
-        boost::test_tools::predicate_result result(false);
-        result.message() << "Different dimensionality [" << dimensions1.num_dimensions() << "!=" << dimensions2.num_dimensions() << "]";
-        return result;
+        return false;
     }
 
     for(unsigned int i = 0; i < dimensions1.num_dimensions(); ++i)
     {
         if(dimensions1[i] != dimensions2[i])
         {
-            boost::test_tools::predicate_result result(false);
-            result.message() << "Mismatch in dimension " << i << " [" << dimensions1[i] << "!=" << dimensions2[i] << "]";
-            return result;
+            return false;
         }
     }
 
@@ -89,7 +168,8 @@
  * reference tensor and test tensor is multiple of wrap_range), but such errors would be detected by
  * other test cases.
  */
-void validate(const IAccessor &tensor, const RawTensor &reference, float tolerance_value = 0.f, float tolerance_number = 0.f, uint64_t wrap_range = 0);
+template <typename T, typename U = AbsoluteTolerance<T>>
+void validate(const IAccessor &tensor, const SimpleTensor<T> &reference, U tolerance_value = U(), float tolerance_number = 0.f);
 
 /** Validate tensors with valid region.
  *
@@ -101,19 +181,8 @@
  * reference tensor and test tensor is multiple of wrap_range), but such errors would be detected by
  * other test cases.
  */
-void validate(const IAccessor &tensor, const RawTensor &reference, const ValidRegion &valid_region, float tolerance_value = 0.f, float tolerance_number = 0.f, uint64_t wrap_range = 0);
-
-/** Validate tensors with valid mask.
- *
- * - Dimensionality has to be the same.
- * - All values have to match.
- *
- * @note: wrap_range allows cases where reference tensor rounds up to the wrapping point, causing it to wrap around to
- * zero while the test tensor stays at wrapping point to pass. This may permit true erroneous cases (difference between
- * reference tensor and test tensor is multiple of wrap_range), but such errors would be detected by
- * other test cases.
- */
-void validate(const IAccessor &tensor, const RawTensor &reference, const RawTensor &valid_mask, float tolerance_value = 0.f, float tolerance_number = 0.f, uint64_t wrap_range = 0);
+template <typename T, typename U = AbsoluteTolerance<T>>
+void validate(const IAccessor &tensor, const SimpleTensor<T> &reference, const ValidRegion &valid_region, U tolerance_value = U(), float tolerance_number = 0.f);
 
 /** Validate tensors against constant value.
  *
@@ -139,54 +208,143 @@
  *
  * - All values should match
  */
-void validate(float target, float ref, float tolerance_abs_error = std::numeric_limits<float>::epsilon(), float tolerance_relative_error = 0.0001f);
+template <typename T, typename U>
+void validate(T target, T reference, U tolerance = AbsoluteTolerance<T>());
 
-/** Validate min max location.
- *
- * - All values should match
- */
 template <typename T>
-void validate_min_max_loc(T min, T ref_min, T max, T ref_max,
-                          IArray<Coordinates2D> &min_loc, IArray<Coordinates2D> &ref_min_loc, IArray<Coordinates2D> &max_loc, IArray<Coordinates2D> &ref_max_loc,
-                          uint32_t min_count, uint32_t ref_min_count, uint32_t max_count, uint32_t ref_max_count)
+struct compare_base
 {
-    BOOST_TEST(min == ref_min);
-    BOOST_TEST(max == ref_max);
-
-    BOOST_TEST(min_count == min_loc.num_values());
-    BOOST_TEST(max_count == max_loc.num_values());
-    BOOST_TEST(ref_min_count == ref_min_loc.num_values());
-    BOOST_TEST(ref_max_count == ref_max_loc.num_values());
-
-    BOOST_TEST(min_count == ref_min_count);
-    BOOST_TEST(max_count == ref_max_count);
-
-    for(uint32_t i = 0; i < min_count; i++)
+    compare_base(typename T::value_type target, typename T::value_type reference, T tolerance = T(0))
+        : _target{ target }, _reference{ reference }, _tolerance{ tolerance }
     {
-        Coordinates2D *same_coords = std::find_if(ref_min_loc.buffer(), ref_min_loc.buffer() + min_count, [&min_loc, i](Coordinates2D coord)
-        {
-            return coord.x == min_loc.at(i).x && coord.y == min_loc.at(i).y;
-        });
-
-        BOOST_TEST(same_coords != ref_min_loc.buffer() + min_count);
     }
 
-    for(uint32_t i = 0; i < max_count; i++)
-    {
-        Coordinates2D *same_coords = std::find_if(ref_max_loc.buffer(), ref_max_loc.buffer() + max_count, [&max_loc, i](Coordinates2D coord)
-        {
-            return coord.x == max_loc.at(i).x && coord.y == max_loc.at(i).y;
-        });
+    typename T::value_type _target{};
+    typename T::value_type _reference{};
+    T                      _tolerance{};
+};
 
-        BOOST_TEST(same_coords != ref_max_loc.buffer() + max_count);
+template <typename T, typename U>
+struct compare;
+
+template <typename U>
+struct compare<AbsoluteTolerance<U>, U> : public compare_base<AbsoluteTolerance<U>>
+{
+    using compare_base<AbsoluteTolerance<U>>::compare_base;
+
+    operator bool() const
+    {
+        if(!std::isfinite(this->_target) || !std::isfinite(this->_reference))
+        {
+            return false;
+        }
+        else if(this->_target == this->_reference)
+        {
+            return true;
+        }
+
+        return static_cast<U>(std::abs(this->_target - this->_reference)) <= static_cast<U>(this->_tolerance);
+    }
+};
+
+template <typename U>
+struct compare<RelativeTolerance, U> : public compare_base<RelativeTolerance>
+{
+    using compare_base<RelativeTolerance>::compare_base;
+
+    operator bool() const
+    {
+        if(!std::isfinite(_target) || !std::isfinite(_reference))
+        {
+            return false;
+        }
+        else if(_target == _reference)
+        {
+            return true;
+        }
+
+        const double relative_change = std::abs(static_cast<double>(_target - _reference)) / _reference;
+
+        return relative_change <= _tolerance;
+    }
+};
+
+template <typename T, typename U>
+void validate(const IAccessor &tensor, const SimpleTensor<T> &reference, U tolerance_value, float tolerance_number)
+{
+    // Validate with valid region covering the entire shape
+    validate(tensor, reference, shape_to_valid_region(tensor.shape()), tolerance_value, tolerance_number);
+}
+
+template <typename T, typename U>
+void validate(const IAccessor &tensor, const SimpleTensor<T> &reference, const ValidRegion &valid_region, U tolerance_value, float tolerance_number)
+{
+    int64_t num_mismatches = 0;
+    int64_t num_elements   = 0;
+
+    ARM_COMPUTE_EXPECT_EQUAL(tensor.element_size(), reference.element_size(), framework::LogLevel::ERRORS);
+    ARM_COMPUTE_EXPECT_EQUAL(tensor.data_type(), reference.data_type(), framework::LogLevel::ERRORS);
+
+    if(reference.format() != Format::UNKNOWN)
+    {
+        ARM_COMPUTE_EXPECT_EQUAL(tensor.format(), reference.format(), framework::LogLevel::ERRORS);
+    }
+
+    ARM_COMPUTE_EXPECT_EQUAL(tensor.num_channels(), reference.num_channels(), framework::LogLevel::ERRORS);
+    ARM_COMPUTE_EXPECT(compare_dimensions(tensor.shape(), reference.shape()), framework::LogLevel::ERRORS);
+
+    const int min_elements = std::min(tensor.num_elements(), reference.num_elements());
+    const int min_channels = std::min(tensor.num_channels(), reference.num_channels());
+
+    // Iterate over all elements within valid region, e.g. U8, S16, RGB888, ...
+    for(int element_idx = 0; element_idx < min_elements; ++element_idx)
+    {
+        const Coordinates id = index2coord(reference.shape(), element_idx);
+
+        if(is_in_valid_region(valid_region, id))
+        {
+            // Iterate over all channels within one element
+            for(int c = 0; c < min_channels; ++c)
+            {
+                const T &target_value    = reinterpret_cast<const T *>(tensor(id))[c];
+                const T &reference_value = reinterpret_cast<const T *>(reference(id))[c];
+
+                if(!compare<U, typename U::value_type>(target_value, reference_value, tolerance_value))
+                {
+                    ARM_COMPUTE_TEST_INFO("id = " << id);
+                    ARM_COMPUTE_TEST_INFO("channel = " << c);
+                    ARM_COMPUTE_TEST_INFO("target = " << std::setprecision(5) << framework::make_printable(target_value));
+                    ARM_COMPUTE_TEST_INFO("reference = " << std::setprecision(5) << framework::make_printable(reference_value));
+                    ARM_COMPUTE_TEST_INFO("tolerance = " << std::setprecision(5) << framework::make_printable(static_cast<typename U::value_type>(tolerance_value)));
+                    ARM_COMPUTE_EXPECT_EQUAL(target_value, reference_value, framework::LogLevel::DEBUG);
+
+                    ++num_mismatches;
+                }
+
+                ++num_elements;
+            }
+        }
+    }
+
+    if(num_elements > 0)
+    {
+        const int64_t absolute_tolerance_number = tolerance_number * num_elements;
+        const float   percent_mismatches        = static_cast<float>(num_mismatches) / num_elements * 100.f;
+
+        ARM_COMPUTE_TEST_INFO(num_mismatches << " values (" << std::fixed << std::setprecision(2) << percent_mismatches
+                              << "%) mismatched (maximum tolerated " << std::setprecision(2) << tolerance_number << "%)");
+        ARM_COMPUTE_EXPECT(num_mismatches <= absolute_tolerance_number, framework::LogLevel::ERRORS);
     }
 }
 
-/** Validate KeyPoint arrays.
- *
- * - All values should match
- */
-void validate(IArray<KeyPoint> &target, IArray<KeyPoint> &ref, int64_t tolerance = 0);
+template <typename T, typename U>
+void validate(T target, T reference, U tolerance)
+{
+    ARM_COMPUTE_TEST_INFO("reference = " << std::setprecision(5) << framework::make_printable(reference));
+    ARM_COMPUTE_TEST_INFO("target = " << std::setprecision(5) << framework::make_printable(target));
+    ARM_COMPUTE_TEST_INFO("tolerance = " << std::setprecision(5) << framework::make_printable(static_cast<typename U::value_type>(tolerance)));
+    ARM_COMPUTE_EXPECT((compare<U, typename U::value_type>(target, reference, tolerance)), framework::LogLevel::ERRORS);
+}
 } // namespace validation
 } // namespace test
 } // namespace arm_compute
diff --git a/tests/validation_new/fixtures/ActivationLayerFixture.h b/tests/validation/fixtures/ActivationLayerFixture.h
similarity index 96%
rename from tests/validation_new/fixtures/ActivationLayerFixture.h
rename to tests/validation/fixtures/ActivationLayerFixture.h
index bf0e7ba..384e63b 100644
--- a/tests/validation_new/fixtures/ActivationLayerFixture.h
+++ b/tests/validation/fixtures/ActivationLayerFixture.h
@@ -26,13 +26,13 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/ActivationLayer.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/ActivationLayer.h"
+#include "tests/validation/Helpers.h"
 
 #include <random>
 
diff --git a/tests/validation_new/fixtures/BitwiseAndFixture.h b/tests/validation/fixtures/BitwiseAndFixture.h
similarity index 96%
rename from tests/validation_new/fixtures/BitwiseAndFixture.h
rename to tests/validation/fixtures/BitwiseAndFixture.h
index 1769ecd..0dfff86 100644
--- a/tests/validation_new/fixtures/BitwiseAndFixture.h
+++ b/tests/validation/fixtures/BitwiseAndFixture.h
@@ -26,12 +26,12 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/BitwiseAnd.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/BitwiseAnd.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/fixtures/BitwiseNotFixture.h b/tests/validation/fixtures/BitwiseNotFixture.h
similarity index 96%
rename from tests/validation_new/fixtures/BitwiseNotFixture.h
rename to tests/validation/fixtures/BitwiseNotFixture.h
index 5954c86..e5bf699 100644
--- a/tests/validation_new/fixtures/BitwiseNotFixture.h
+++ b/tests/validation/fixtures/BitwiseNotFixture.h
@@ -26,12 +26,12 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/BitwiseNot.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/BitwiseNot.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/fixtures/BitwiseOrFixture.h b/tests/validation/fixtures/BitwiseOrFixture.h
similarity index 96%
rename from tests/validation_new/fixtures/BitwiseOrFixture.h
rename to tests/validation/fixtures/BitwiseOrFixture.h
index b39b46e..d61e767 100644
--- a/tests/validation_new/fixtures/BitwiseOrFixture.h
+++ b/tests/validation/fixtures/BitwiseOrFixture.h
@@ -26,12 +26,12 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/BitwiseOr.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/BitwiseOr.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/fixtures/BitwiseXorFixture.h b/tests/validation/fixtures/BitwiseXorFixture.h
similarity index 96%
rename from tests/validation_new/fixtures/BitwiseXorFixture.h
rename to tests/validation/fixtures/BitwiseXorFixture.h
index 1dfbf1f..16fa8c0 100644
--- a/tests/validation_new/fixtures/BitwiseXorFixture.h
+++ b/tests/validation/fixtures/BitwiseXorFixture.h
@@ -26,12 +26,12 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/BitwiseXor.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/BitwiseXor.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/fixtures/ConvolutionLayerFixture.h b/tests/validation/fixtures/ConvolutionLayerFixture.h
similarity index 97%
rename from tests/validation_new/fixtures/ConvolutionLayerFixture.h
rename to tests/validation/fixtures/ConvolutionLayerFixture.h
index 25a53d0..87b11ac 100644
--- a/tests/validation_new/fixtures/ConvolutionLayerFixture.h
+++ b/tests/validation/fixtures/ConvolutionLayerFixture.h
@@ -26,13 +26,13 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/ConvolutionLayer.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/ConvolutionLayer.h"
+#include "tests/validation/Helpers.h"
 
 #include <random>
 
diff --git a/tests/validation_new/fixtures/DepthConcatenateLayerFixture.h b/tests/validation/fixtures/DepthConcatenateLayerFixture.h
similarity index 96%
rename from tests/validation_new/fixtures/DepthConcatenateLayerFixture.h
rename to tests/validation/fixtures/DepthConcatenateLayerFixture.h
index 601758f..2a2e96e 100644
--- a/tests/validation_new/fixtures/DepthConcatenateLayerFixture.h
+++ b/tests/validation/fixtures/DepthConcatenateLayerFixture.h
@@ -26,13 +26,13 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/DepthConcatenateLayer.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/DepthConcatenateLayer.h"
+#include "tests/validation/Helpers.h"
 
 #include <random>
 
diff --git a/tests/validation_new/fixtures/DepthwiseConvolutionFixture.h b/tests/validation/fixtures/DepthwiseConvolutionFixture.h
similarity index 96%
rename from tests/validation_new/fixtures/DepthwiseConvolutionFixture.h
rename to tests/validation/fixtures/DepthwiseConvolutionFixture.h
index b745c7e..462c0f8 100644
--- a/tests/validation_new/fixtures/DepthwiseConvolutionFixture.h
+++ b/tests/validation/fixtures/DepthwiseConvolutionFixture.h
@@ -26,13 +26,13 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/DepthwiseConvolution.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/DepthwiseConvolution.h"
+#include "tests/validation/Helpers.h"
 
 #include <random>
 
diff --git a/tests/validation_new/fixtures/DepthwiseSeparableConvolutionLayerFixture.h b/tests/validation/fixtures/DepthwiseSeparableConvolutionLayerFixture.h
similarity index 97%
rename from tests/validation_new/fixtures/DepthwiseSeparableConvolutionLayerFixture.h
rename to tests/validation/fixtures/DepthwiseSeparableConvolutionLayerFixture.h
index c2578a9..e8f6854 100644
--- a/tests/validation_new/fixtures/DepthwiseSeparableConvolutionLayerFixture.h
+++ b/tests/validation/fixtures/DepthwiseSeparableConvolutionLayerFixture.h
@@ -26,13 +26,13 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/DepthwiseSeparableConvolutionLayer.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/DepthwiseSeparableConvolutionLayer.h"
+#include "tests/validation/Helpers.h"
 
 #include <random>
 
diff --git a/tests/validation_new/fixtures/DequantizationLayerFixture.h b/tests/validation/fixtures/DequantizationLayerFixture.h
similarity index 97%
rename from tests/validation_new/fixtures/DequantizationLayerFixture.h
rename to tests/validation/fixtures/DequantizationLayerFixture.h
index 35c536d..7543eb2 100644
--- a/tests/validation_new/fixtures/DequantizationLayerFixture.h
+++ b/tests/validation/fixtures/DequantizationLayerFixture.h
@@ -27,12 +27,12 @@
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
 #include "arm_compute/runtime/Tensor.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/DequantizationLayer.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/DequantizationLayer.h"
 
 #include <random>
 
diff --git a/tests/validation_new/fixtures/DirectConvolutionLayerFixture.h b/tests/validation/fixtures/DirectConvolutionLayerFixture.h
similarity index 94%
rename from tests/validation_new/fixtures/DirectConvolutionLayerFixture.h
rename to tests/validation/fixtures/DirectConvolutionLayerFixture.h
index 0d138b4..6ffebce 100644
--- a/tests/validation_new/fixtures/DirectConvolutionLayerFixture.h
+++ b/tests/validation/fixtures/DirectConvolutionLayerFixture.h
@@ -23,14 +23,14 @@
  */
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/ConvolutionLayer.h"
-#include "tests/validation_new/Helpers.h"
-#include "tests/validation_new/fixtures/ConvolutionLayerFixture.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/ConvolutionLayer.h"
+#include "tests/validation/Helpers.h"
+#include "tests/validation/fixtures/ConvolutionLayerFixture.h"
 
 #include <random>
 
diff --git a/tests/validation_new/fixtures/FloorFixture.h b/tests/validation/fixtures/FloorFixture.h
similarity index 96%
rename from tests/validation_new/fixtures/FloorFixture.h
rename to tests/validation/fixtures/FloorFixture.h
index ab4c5c7..3f94841 100644
--- a/tests/validation_new/fixtures/FloorFixture.h
+++ b/tests/validation/fixtures/FloorFixture.h
@@ -27,12 +27,12 @@
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
 #include "arm_compute/runtime/Tensor.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/Floor.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/Floor.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/fixtures/FullyConnectedLayerFixture.h b/tests/validation/fixtures/FullyConnectedLayerFixture.h
similarity index 98%
rename from tests/validation_new/fixtures/FullyConnectedLayerFixture.h
rename to tests/validation/fixtures/FullyConnectedLayerFixture.h
index 0953b0b..d4d68f1 100644
--- a/tests/validation_new/fixtures/FullyConnectedLayerFixture.h
+++ b/tests/validation/fixtures/FullyConnectedLayerFixture.h
@@ -27,14 +27,14 @@
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
 #include "arm_compute/core/Utils.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
 #include "tests/RawTensor.h"
-#include "tests/validation_new/CPP/FullyConnectedLayer.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/FullyConnectedLayer.h"
+#include "tests/validation/Helpers.h"
 
 #include <random>
 
diff --git a/tests/validation_new/fixtures/GEMMFixture.h b/tests/validation/fixtures/GEMMFixture.h
similarity index 97%
rename from tests/validation_new/fixtures/GEMMFixture.h
rename to tests/validation/fixtures/GEMMFixture.h
index a6ab518..923a29c 100644
--- a/tests/validation_new/fixtures/GEMMFixture.h
+++ b/tests/validation/fixtures/GEMMFixture.h
@@ -26,13 +26,13 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/GEMM.h"
-#include "tests/validation_new/Helpers.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/GEMM.h"
+#include "tests/validation/Helpers.h"
 
 #include <random>
 
diff --git a/tests/validation_new/fixtures/L2NormalizeFixture.h b/tests/validation/fixtures/L2NormalizeFixture.h
similarity index 96%
rename from tests/validation_new/fixtures/L2NormalizeFixture.h
rename to tests/validation/fixtures/L2NormalizeFixture.h
index 5102b93..e611393 100644
--- a/tests/validation_new/fixtures/L2NormalizeFixture.h
+++ b/tests/validation/fixtures/L2NormalizeFixture.h
@@ -27,12 +27,12 @@
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
 #include "arm_compute/runtime/Tensor.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/L2Normalize.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/L2Normalize.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/fixtures/MeanStdDevFixture.h b/tests/validation/fixtures/MeanStdDevFixture.h
similarity index 96%
rename from tests/validation_new/fixtures/MeanStdDevFixture.h
rename to tests/validation/fixtures/MeanStdDevFixture.h
index 65622fc..37f538b 100644
--- a/tests/validation_new/fixtures/MeanStdDevFixture.h
+++ b/tests/validation/fixtures/MeanStdDevFixture.h
@@ -24,10 +24,10 @@
 #ifndef ARM_COMPUTE_TEST_MEAN_STD_DEV_FIXTURE
 #define ARM_COMPUTE_TEST_MEAN_STD_DEV_FIXTURE
 
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/Globals.h"
-#include "tests/validation_new/CPP/MeanStdDev.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/MeanStdDev.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/fixtures/NormalizationLayerFixture.h b/tests/validation/fixtures/NormalizationLayerFixture.h
similarity index 97%
rename from tests/validation_new/fixtures/NormalizationLayerFixture.h
rename to tests/validation/fixtures/NormalizationLayerFixture.h
index 0444054..696d14f 100644
--- a/tests/validation_new/fixtures/NormalizationLayerFixture.h
+++ b/tests/validation/fixtures/NormalizationLayerFixture.h
@@ -27,12 +27,12 @@
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
 #include "arm_compute/runtime/Tensor.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/NormalizationLayer.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/NormalizationLayer.h"
 
 #include <random>
 
diff --git a/tests/validation_new/fixtures/PoolingLayerFixture.h b/tests/validation/fixtures/PoolingLayerFixture.h
similarity index 97%
rename from tests/validation_new/fixtures/PoolingLayerFixture.h
rename to tests/validation/fixtures/PoolingLayerFixture.h
index c0c818f..5ce4aa6 100644
--- a/tests/validation_new/fixtures/PoolingLayerFixture.h
+++ b/tests/validation/fixtures/PoolingLayerFixture.h
@@ -27,12 +27,12 @@
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
 #include "arm_compute/runtime/Tensor.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/PoolingLayer.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/PoolingLayer.h"
 
 #include <random>
 
diff --git a/tests/validation_new/fixtures/QuantizationLayerFixture.h b/tests/validation/fixtures/QuantizationLayerFixture.h
similarity index 96%
rename from tests/validation_new/fixtures/QuantizationLayerFixture.h
rename to tests/validation/fixtures/QuantizationLayerFixture.h
index 469fd5f..83ee049 100644
--- a/tests/validation_new/fixtures/QuantizationLayerFixture.h
+++ b/tests/validation/fixtures/QuantizationLayerFixture.h
@@ -27,12 +27,12 @@
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
 #include "arm_compute/runtime/Tensor.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/QuantizationLayer.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/QuantizationLayer.h"
 
 #include <random>
 
diff --git a/tests/validation_new/fixtures/ReductionOperationFixture.h b/tests/validation/fixtures/ReductionOperationFixture.h
similarity index 96%
rename from tests/validation_new/fixtures/ReductionOperationFixture.h
rename to tests/validation/fixtures/ReductionOperationFixture.h
index 416aadf..7c871ae 100644
--- a/tests/validation_new/fixtures/ReductionOperationFixture.h
+++ b/tests/validation/fixtures/ReductionOperationFixture.h
@@ -27,12 +27,12 @@
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
 #include "arm_compute/runtime/Tensor.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/ReductionOperation.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/ReductionOperation.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/fixtures/ScaleFixture.h b/tests/validation/fixtures/ScaleFixture.h
similarity index 97%
rename from tests/validation_new/fixtures/ScaleFixture.h
rename to tests/validation/fixtures/ScaleFixture.h
index 74dc0d6..53bb0f2 100644
--- a/tests/validation_new/fixtures/ScaleFixture.h
+++ b/tests/validation/fixtures/ScaleFixture.h
@@ -26,12 +26,12 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/Scale.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/Scale.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation_new/fixtures/SoftmaxLayerFixture.h b/tests/validation/fixtures/SoftmaxLayerFixture.h
similarity index 97%
rename from tests/validation_new/fixtures/SoftmaxLayerFixture.h
rename to tests/validation/fixtures/SoftmaxLayerFixture.h
index c6f3d22..9c8f044 100644
--- a/tests/validation_new/fixtures/SoftmaxLayerFixture.h
+++ b/tests/validation/fixtures/SoftmaxLayerFixture.h
@@ -27,12 +27,12 @@
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
 #include "arm_compute/runtime/Tensor.h"
-#include "framework/Asserts.h"
-#include "framework/Fixture.h"
 #include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/IAccessor.h"
-#include "tests/validation_new/CPP/SoftmaxLayer.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/SoftmaxLayer.h"
 
 #include <random>
 
diff --git a/tests/validation/half.h b/tests/validation/half.h
index d8aa341..0ca620c 100644
--- a/tests/validation/half.h
+++ b/tests/validation/half.h
@@ -34,4 +34,5 @@
 #define HALF_ROUND_TIES_TO_EVEN 1
 
 #include "half/half.hpp"
+
 #endif /* __ARM_COMPUTE_TEST_HALF_H__ */
diff --git a/tests/validation_new/Helpers.h b/tests/validation_new/Helpers.h
deleted file mode 100644
index 3095916..0000000
--- a/tests/validation_new/Helpers.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (c) 2017 ARM Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#ifndef __ARM_COMPUTE_TEST_VALIDATION_HELPERS_H__
-#define __ARM_COMPUTE_TEST_VALIDATION_HELPERS_H__
-
-#include "arm_compute/core/Types.h"
-#include "arm_compute/core/Utils.h"
-#include "tests/validation/half.h"
-
-#include <random>
-#include <type_traits>
-#include <utility>
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-template <typename T>
-struct is_floating_point : public std::is_floating_point<T>
-{
-};
-
-template <>
-struct is_floating_point<half_float::half> : public std::true_type
-{
-};
-
-/** Helper function to get the testing range for each activation layer.
- *
- * @param[in] activation           Activation function to test.
- * @param[in] data_type            Data type.
- * @param[in] fixed_point_position Number of bits for the fractional part. Defaults to 1.
- *
- * @return A pair containing the lower upper testing bounds for a given function.
- */
-template <typename T>
-std::pair<T, T> get_activation_layer_test_bounds(ActivationLayerInfo::ActivationFunction activation, DataType data_type, int fixed_point_position = 0)
-{
-    std::pair<T, T> bounds;
-
-    switch(data_type)
-    {
-        case DataType::F16:
-        {
-            using namespace half_float::literal;
-
-            switch(activation)
-            {
-                case ActivationLayerInfo::ActivationFunction::SQUARE:
-                case ActivationLayerInfo::ActivationFunction::LOGISTIC:
-                case ActivationLayerInfo::ActivationFunction::SOFT_RELU:
-                    // Reduce range as exponent overflows
-                    bounds = std::make_pair(-10._h, 10._h);
-                    break;
-                case ActivationLayerInfo::ActivationFunction::SQRT:
-                    // Reduce range as sqrt should take a non-negative number
-                    bounds = std::make_pair(0._h, 255._h);
-                    break;
-                default:
-                    bounds = std::make_pair(-255._h, 255._h);
-                    break;
-            }
-            break;
-        }
-        case DataType::F32:
-            switch(activation)
-            {
-                case ActivationLayerInfo::ActivationFunction::LOGISTIC:
-                case ActivationLayerInfo::ActivationFunction::SOFT_RELU:
-                    // Reduce range as exponent overflows
-                    bounds = std::make_pair(-40.f, 40.f);
-                    break;
-                case ActivationLayerInfo::ActivationFunction::SQRT:
-                    // Reduce range as sqrt should take a non-negative number
-                    bounds = std::make_pair(0.f, 255.f);
-                    break;
-                default:
-                    bounds = std::make_pair(-255.f, 255.f);
-                    break;
-            }
-            break;
-        case DataType::QS8:
-        case DataType::QS16:
-            switch(activation)
-            {
-                case ActivationLayerInfo::ActivationFunction::LOGISTIC:
-                case ActivationLayerInfo::ActivationFunction::SOFT_RELU:
-                case ActivationLayerInfo::ActivationFunction::TANH:
-                    // Reduce range as exponent overflows
-                    bounds = std::make_pair(-(1 << fixed_point_position), 1 << fixed_point_position);
-                    break;
-                case ActivationLayerInfo::ActivationFunction::SQRT:
-                    // Reduce range as sqrt should take a non-negative number
-                    // Can't be zero either as inv_sqrt is used in NEON.
-                    bounds = std::make_pair(1, std::numeric_limits<T>::max());
-                    break;
-                default:
-                    bounds = std::make_pair(std::numeric_limits<T>::lowest(), std::numeric_limits<T>::max());
-                    break;
-            }
-            break;
-        default:
-            ARM_COMPUTE_ERROR("Unsupported data type");
-    }
-
-    return bounds;
-}
-
-/** Calculate output tensor shape give a vector of input tensor to concatenate
- *
- * @param[in] input_shapes Shapes of the tensors to concatenate across depth.
- *
- * @return The shape of output concatenated tensor.
- */
-TensorShape calculate_depth_concatenate_shape(const std::vector<TensorShape> &input_shapes);
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_VALIDATION_HELPERS_H__ */
diff --git a/tests/validation_new/Validation.cpp b/tests/validation_new/Validation.cpp
deleted file mode 100644
index fec7c10..0000000
--- a/tests/validation_new/Validation.cpp
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Copyright (c) 2017 ARM Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "Validation.h"
-
-#include "arm_compute/core/Coordinates.h"
-#include "arm_compute/core/Error.h"
-#include "arm_compute/core/TensorShape.h"
-#include "arm_compute/runtime/Tensor.h"
-#include "tests/validation/half.h"
-
-#include <array>
-#include <cmath>
-#include <cstddef>
-#include <cstdint>
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-namespace
-{
-/** Get the data from *ptr after casting according to @p data_type and then convert the data to double.
- *
- * @param[in] ptr       Pointer to value.
- * @param[in] data_type Data type of both values.
- *
- * @return The data from the ptr after converted to double.
- */
-double get_double_data(const void *ptr, DataType data_type)
-{
-    if(ptr == nullptr)
-    {
-        ARM_COMPUTE_ERROR("Can't dereference a null pointer!");
-    }
-
-    switch(data_type)
-    {
-        case DataType::U8:
-            return *reinterpret_cast<const uint8_t *>(ptr);
-        case DataType::S8:
-            return *reinterpret_cast<const int8_t *>(ptr);
-        case DataType::QS8:
-            return *reinterpret_cast<const qint8_t *>(ptr);
-        case DataType::U16:
-            return *reinterpret_cast<const uint16_t *>(ptr);
-        case DataType::S16:
-            return *reinterpret_cast<const int16_t *>(ptr);
-        case DataType::QS16:
-            return *reinterpret_cast<const qint16_t *>(ptr);
-        case DataType::U32:
-            return *reinterpret_cast<const uint32_t *>(ptr);
-        case DataType::S32:
-            return *reinterpret_cast<const int32_t *>(ptr);
-        case DataType::U64:
-            return *reinterpret_cast<const uint64_t *>(ptr);
-        case DataType::S64:
-            return *reinterpret_cast<const int64_t *>(ptr);
-        case DataType::F16:
-            return *reinterpret_cast<const half_float::half *>(ptr);
-        case DataType::F32:
-            return *reinterpret_cast<const float *>(ptr);
-        case DataType::F64:
-            return *reinterpret_cast<const double *>(ptr);
-        case DataType::SIZET:
-            return *reinterpret_cast<const size_t *>(ptr);
-        default:
-            ARM_COMPUTE_ERROR("NOT SUPPORTED!");
-    }
-}
-
-void check_border_element(const IAccessor &tensor, const Coordinates &id,
-                          const BorderMode &border_mode, const void *border_value,
-                          int64_t &num_elements, int64_t &num_mismatches)
-{
-    const size_t channel_size = element_size_from_data_type(tensor.data_type());
-    const auto   ptr          = static_cast<const uint8_t *>(tensor(id));
-
-    if(border_mode == BorderMode::REPLICATE)
-    {
-        Coordinates border_id{ id };
-
-        if(id.x() < 0)
-        {
-            border_id.set(0, 0);
-        }
-        else if(static_cast<size_t>(id.x()) >= tensor.shape().x())
-        {
-            border_id.set(0, tensor.shape().x() - 1);
-        }
-
-        if(id.y() < 0)
-        {
-            border_id.set(1, 0);
-        }
-        else if(static_cast<size_t>(id.y()) >= tensor.shape().y())
-        {
-            border_id.set(1, tensor.shape().y() - 1);
-        }
-
-        border_value = tensor(border_id);
-    }
-
-    // Iterate over all channels within one element
-    for(int channel = 0; channel < tensor.num_channels(); ++channel)
-    {
-        const size_t channel_offset = channel * channel_size;
-        const double target         = get_double_data(ptr + channel_offset, tensor.data_type());
-        const double reference      = get_double_data(static_cast<const uint8_t *>(border_value) + channel_offset, tensor.data_type());
-
-        if(!compare<AbsoluteTolerance<double>, double>(target, reference))
-        {
-            ARM_COMPUTE_TEST_INFO("id = " << id);
-            ARM_COMPUTE_TEST_INFO("channel = " << channel);
-            ARM_COMPUTE_TEST_INFO("target = " << std::setprecision(5) << target);
-            ARM_COMPUTE_TEST_INFO("reference = " << std::setprecision(5) << reference);
-            ARM_COMPUTE_EXPECT_EQUAL(target, reference, framework::LogLevel::DEBUG);
-
-            ++num_mismatches;
-        }
-
-        ++num_elements;
-    }
-}
-} // namespace
-
-void validate(const arm_compute::ValidRegion &region, const arm_compute::ValidRegion &reference)
-{
-    ARM_COMPUTE_EXPECT_EQUAL(region.anchor.num_dimensions(), reference.anchor.num_dimensions(), framework::LogLevel::ERRORS);
-    ARM_COMPUTE_EXPECT_EQUAL(region.shape.num_dimensions(), reference.shape.num_dimensions(), framework::LogLevel::ERRORS);
-
-    for(unsigned int d = 0; d < region.anchor.num_dimensions(); ++d)
-    {
-        ARM_COMPUTE_EXPECT_EQUAL(region.anchor[d], reference.anchor[d], framework::LogLevel::ERRORS);
-    }
-
-    for(unsigned int d = 0; d < region.shape.num_dimensions(); ++d)
-    {
-        ARM_COMPUTE_EXPECT_EQUAL(region.shape[d], reference.shape[d], framework::LogLevel::ERRORS);
-    }
-}
-
-void validate(const arm_compute::PaddingSize &padding, const arm_compute::PaddingSize &reference)
-{
-    ARM_COMPUTE_EXPECT_EQUAL(padding.top, reference.top, framework::LogLevel::ERRORS);
-    ARM_COMPUTE_EXPECT_EQUAL(padding.right, reference.right, framework::LogLevel::ERRORS);
-    ARM_COMPUTE_EXPECT_EQUAL(padding.bottom, reference.bottom, framework::LogLevel::ERRORS);
-    ARM_COMPUTE_EXPECT_EQUAL(padding.left, reference.left, framework::LogLevel::ERRORS);
-}
-
-void validate(const IAccessor &tensor, const void *reference_value)
-{
-    ARM_COMPUTE_ASSERT(reference_value != nullptr);
-
-    int64_t      num_mismatches = 0;
-    int64_t      num_elements   = 0;
-    const size_t channel_size   = element_size_from_data_type(tensor.data_type());
-
-    // Iterate over all elements, e.g. U8, S16, RGB888, ...
-    for(int element_idx = 0; element_idx < tensor.num_elements(); ++element_idx)
-    {
-        const Coordinates id = index2coord(tensor.shape(), element_idx);
-
-        const auto ptr = static_cast<const uint8_t *>(tensor(id));
-
-        // Iterate over all channels within one element
-        for(int channel = 0; channel < tensor.num_channels(); ++channel)
-        {
-            const size_t channel_offset = channel * channel_size;
-            const double target         = get_double_data(ptr + channel_offset, tensor.data_type());
-            const double reference      = get_double_data(reference_value, tensor.data_type());
-
-            if(!compare<AbsoluteTolerance<double>, double>(target, reference))
-            {
-                ARM_COMPUTE_TEST_INFO("id = " << id);
-                ARM_COMPUTE_TEST_INFO("channel = " << channel);
-                ARM_COMPUTE_TEST_INFO("target = " << std::setprecision(5) << target);
-                ARM_COMPUTE_TEST_INFO("reference = " << std::setprecision(5) << reference);
-                ARM_COMPUTE_EXPECT_EQUAL(target, reference, framework::LogLevel::DEBUG);
-
-                ++num_mismatches;
-            }
-
-            ++num_elements;
-        }
-    }
-
-    if(num_elements > 0)
-    {
-        const float percent_mismatches = static_cast<float>(num_mismatches) / num_elements * 100.f;
-
-        ARM_COMPUTE_TEST_INFO(num_mismatches << " values (" << std::fixed << std::setprecision(2) << percent_mismatches << "%) mismatched");
-        ARM_COMPUTE_EXPECT_EQUAL(num_mismatches, 0, framework::LogLevel::ERRORS);
-    }
-}
-
-void validate(const IAccessor &tensor, BorderSize border_size, const BorderMode &border_mode, const void *border_value)
-{
-    if(border_mode == BorderMode::UNDEFINED)
-    {
-        return;
-    }
-    else if(border_mode == BorderMode::CONSTANT)
-    {
-        ARM_COMPUTE_ASSERT(border_value != nullptr);
-    }
-
-    int64_t   num_mismatches = 0;
-    int64_t   num_elements   = 0;
-    const int slice_size     = tensor.shape()[0] * tensor.shape()[1];
-
-    for(int element_idx = 0; element_idx < tensor.num_elements(); element_idx += slice_size)
-    {
-        Coordinates id = index2coord(tensor.shape(), element_idx);
-
-        // Top border
-        for(int y = -border_size.top; y < 0; ++y)
-        {
-            id.set(1, y);
-
-            for(int x = -border_size.left; x < static_cast<int>(tensor.shape()[0]) + static_cast<int>(border_size.right); ++x)
-            {
-                id.set(0, x);
-
-                check_border_element(tensor, id, border_mode, border_value, num_elements, num_mismatches);
-            }
-        }
-
-        // Bottom border
-        for(int y = tensor.shape()[1]; y < static_cast<int>(tensor.shape()[1]) + static_cast<int>(border_size.bottom); ++y)
-        {
-            id.set(1, y);
-
-            for(int x = -border_size.left; x < static_cast<int>(tensor.shape()[0]) + static_cast<int>(border_size.right); ++x)
-            {
-                id.set(0, x);
-
-                check_border_element(tensor, id, border_mode, border_value, num_elements, num_mismatches);
-            }
-        }
-
-        // Left/right border
-        for(int y = 0; y < static_cast<int>(tensor.shape()[1]); ++y)
-        {
-            id.set(1, y);
-
-            // Left border
-            for(int x = -border_size.left; x < 0; ++x)
-            {
-                id.set(0, x);
-
-                check_border_element(tensor, id, border_mode, border_value, num_elements, num_mismatches);
-            }
-
-            // Right border
-            for(int x = tensor.shape()[0]; x < static_cast<int>(tensor.shape()[0]) + static_cast<int>(border_size.right); ++x)
-            {
-                id.set(0, x);
-
-                check_border_element(tensor, id, border_mode, border_value, num_elements, num_mismatches);
-            }
-        }
-    }
-
-    if(num_elements > 0)
-    {
-        const float percent_mismatches = static_cast<float>(num_mismatches) / num_elements * 100.f;
-
-        ARM_COMPUTE_TEST_INFO(num_mismatches << " values (" << std::fixed << std::setprecision(2) << percent_mismatches << "%) mismatched");
-        ARM_COMPUTE_EXPECT_EQUAL(num_mismatches, 0, framework::LogLevel::ERRORS);
-    }
-}
-
-void validate(std::vector<unsigned int> classified_labels, std::vector<unsigned int> expected_labels)
-{
-    ARM_COMPUTE_EXPECT_EQUAL(classified_labels.size(), expected_labels.size(), framework::LogLevel::ERRORS);
-
-    for(unsigned int i = 0; i < expected_labels.size(); ++i)
-    {
-        ARM_COMPUTE_EXPECT_EQUAL(classified_labels[i], expected_labels[i], framework::LogLevel::ERRORS);
-    }
-}
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
diff --git a/tests/validation_new/Validation.h b/tests/validation_new/Validation.h
deleted file mode 100644
index d3c3541..0000000
--- a/tests/validation_new/Validation.h
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright (c) 2017 ARM Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#ifndef __ARM_COMPUTE_TEST_VALIDATION_H__
-#define __ARM_COMPUTE_TEST_VALIDATION_H__
-
-#include "SimpleTensor.h"
-#include "arm_compute/core/FixedPoint.h"
-#include "arm_compute/core/Types.h"
-#include "framework/Asserts.h"
-#include "framework/Exceptions.h"
-#include "tests/IAccessor.h"
-#include "tests/TypePrinter.h"
-#include "tests/Utils.h"
-
-#include <iomanip>
-#include <ios>
-#include <vector>
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-/** Class reprensenting an absolute tolerance value. */
-template <typename T>
-class AbsoluteTolerance
-{
-public:
-    /** Underlying type. */
-    using value_type = T;
-
-    /* Default constructor.
-     *
-     * Initialises the tolerance to 0.
-     */
-    AbsoluteTolerance() = default;
-
-    /** Constructor.
-     *
-     * @param[in] value Absolute tolerance value.
-     */
-    explicit constexpr AbsoluteTolerance(T value)
-        : _value{ value }
-    {
-    }
-
-    /** Implicit conversion to the underlying type. */
-    constexpr operator T() const
-    {
-        return _value;
-    }
-
-private:
-    T _value{ std::numeric_limits<T>::epsilon() };
-};
-
-/** Class reprensenting a relative tolerance value. */
-class RelativeTolerance
-{
-public:
-    /** Underlying type. */
-    using value_type = double;
-
-    /* Default constructor.
-     *
-     * Initialises the tolerance to 0.
-     */
-    RelativeTolerance() = default;
-
-    /** Constructor.
-     *
-     * @param[in] value Relative tolerance value.
-     */
-    explicit constexpr RelativeTolerance(value_type value)
-        : _value{ value }
-    {
-    }
-
-    /** Implicit conversion to the underlying type. */
-    constexpr operator value_type() const
-    {
-        return _value;
-    }
-
-private:
-    value_type _value{ 0 };
-};
-
-/** Print AbsoluteTolerance type. */
-template <typename T>
-inline ::std::ostream &operator<<(::std::ostream &os, const AbsoluteTolerance<T> &tolerance)
-{
-    os << static_cast<typename AbsoluteTolerance<T>::value_type>(tolerance);
-
-    return os;
-}
-
-/** Print RelativeTolerance type. */
-inline ::std::ostream &operator<<(::std::ostream &os, const RelativeTolerance &tolerance)
-{
-    os << static_cast<typename RelativeTolerance::value_type>(tolerance);
-
-    return os;
-}
-
-template <typename T>
-bool compare_dimensions(const Dimensions<T> &dimensions1, const Dimensions<T> &dimensions2)
-{
-    if(dimensions1.num_dimensions() != dimensions2.num_dimensions())
-    {
-        return false;
-    }
-
-    for(unsigned int i = 0; i < dimensions1.num_dimensions(); ++i)
-    {
-        if(dimensions1[i] != dimensions2[i])
-        {
-            return false;
-        }
-    }
-
-    return true;
-}
-
-/** Validate valid regions.
- *
- * - Dimensionality has to be the same.
- * - Anchors have to match.
- * - Shapes have to match.
- */
-void validate(const arm_compute::ValidRegion &region, const arm_compute::ValidRegion &reference);
-
-/** Validate padding.
- *
- * Padding on all sides has to be the same.
- */
-void validate(const arm_compute::PaddingSize &padding, const arm_compute::PaddingSize &reference);
-
-/** Validate tensors.
- *
- * - Dimensionality has to be the same.
- * - All values have to match.
- *
- * @note: wrap_range allows cases where reference tensor rounds up to the wrapping point, causing it to wrap around to
- * zero while the test tensor stays at wrapping point to pass. This may permit true erroneous cases (difference between
- * reference tensor and test tensor is multiple of wrap_range), but such errors would be detected by
- * other test cases.
- */
-template <typename T, typename U = AbsoluteTolerance<T>>
-void validate(const IAccessor &tensor, const SimpleTensor<T> &reference, U tolerance_value = U(), float tolerance_number = 0.f);
-
-/** Validate tensors with valid region.
- *
- * - Dimensionality has to be the same.
- * - All values have to match.
- *
- * @note: wrap_range allows cases where reference tensor rounds up to the wrapping point, causing it to wrap around to
- * zero while the test tensor stays at wrapping point to pass. This may permit true erroneous cases (difference between
- * reference tensor and test tensor is multiple of wrap_range), but such errors would be detected by
- * other test cases.
- */
-template <typename T, typename U = AbsoluteTolerance<T>>
-void validate(const IAccessor &tensor, const SimpleTensor<T> &reference, const ValidRegion &valid_region, U tolerance_value = U(), float tolerance_number = 0.f);
-
-/** Validate tensors against constant value.
- *
- * - All values have to match.
- */
-void validate(const IAccessor &tensor, const void *reference_value);
-
-/** Validate border against a constant value.
- *
- * - All border values have to match the specified value if mode is CONSTANT.
- * - All border values have to be replicated if mode is REPLICATE.
- * - Nothing is validated for mode UNDEFINED.
- */
-void validate(const IAccessor &tensor, BorderSize border_size, const BorderMode &border_mode, const void *border_value);
-
-/** Validate classified labels against expected ones.
- *
- * - All values should match
- */
-void validate(std::vector<unsigned int> classified_labels, std::vector<unsigned int> expected_labels);
-
-/** Validate float value.
- *
- * - All values should match
- */
-template <typename T, typename U>
-void validate(T target, T reference, U tolerance = AbsoluteTolerance<T>());
-
-template <typename T>
-struct compare_base
-{
-    compare_base(typename T::value_type target, typename T::value_type reference, T tolerance = T(0))
-        : _target{ target }, _reference{ reference }, _tolerance{ tolerance }
-    {
-    }
-
-    typename T::value_type _target{};
-    typename T::value_type _reference{};
-    T                      _tolerance{};
-};
-
-template <typename T, typename U>
-struct compare;
-
-template <typename U>
-struct compare<AbsoluteTolerance<U>, U> : public compare_base<AbsoluteTolerance<U>>
-{
-    using compare_base<AbsoluteTolerance<U>>::compare_base;
-
-    operator bool() const
-    {
-        if(!std::isfinite(this->_target) || !std::isfinite(this->_reference))
-        {
-            return false;
-        }
-        else if(this->_target == this->_reference)
-        {
-            return true;
-        }
-
-        return static_cast<U>(std::abs(this->_target - this->_reference)) <= static_cast<U>(this->_tolerance);
-    }
-};
-
-template <typename U>
-struct compare<RelativeTolerance, U> : public compare_base<RelativeTolerance>
-{
-    using compare_base<RelativeTolerance>::compare_base;
-
-    operator bool() const
-    {
-        if(!std::isfinite(_target) || !std::isfinite(_reference))
-        {
-            return false;
-        }
-        else if(_target == _reference)
-        {
-            return true;
-        }
-
-        const double relative_change = std::abs(static_cast<double>(_target - _reference)) / _reference;
-
-        return relative_change <= _tolerance;
-    }
-};
-
-template <typename T, typename U>
-void validate(const IAccessor &tensor, const SimpleTensor<T> &reference, U tolerance_value, float tolerance_number)
-{
-    // Validate with valid region covering the entire shape
-    validate(tensor, reference, shape_to_valid_region(tensor.shape()), tolerance_value, tolerance_number);
-}
-
-template <typename T, typename U>
-void validate(const IAccessor &tensor, const SimpleTensor<T> &reference, const ValidRegion &valid_region, U tolerance_value, float tolerance_number)
-{
-    int64_t num_mismatches = 0;
-    int64_t num_elements   = 0;
-
-    ARM_COMPUTE_EXPECT_EQUAL(tensor.element_size(), reference.element_size(), framework::LogLevel::ERRORS);
-    ARM_COMPUTE_EXPECT_EQUAL(tensor.data_type(), reference.data_type(), framework::LogLevel::ERRORS);
-
-    if(reference.format() != Format::UNKNOWN)
-    {
-        ARM_COMPUTE_EXPECT_EQUAL(tensor.format(), reference.format(), framework::LogLevel::ERRORS);
-    }
-
-    ARM_COMPUTE_EXPECT_EQUAL(tensor.num_channels(), reference.num_channels(), framework::LogLevel::ERRORS);
-    ARM_COMPUTE_EXPECT(compare_dimensions(tensor.shape(), reference.shape()), framework::LogLevel::ERRORS);
-
-    const int min_elements = std::min(tensor.num_elements(), reference.num_elements());
-    const int min_channels = std::min(tensor.num_channels(), reference.num_channels());
-
-    // Iterate over all elements within valid region, e.g. U8, S16, RGB888, ...
-    for(int element_idx = 0; element_idx < min_elements; ++element_idx)
-    {
-        const Coordinates id = index2coord(reference.shape(), element_idx);
-
-        if(is_in_valid_region(valid_region, id))
-        {
-            // Iterate over all channels within one element
-            for(int c = 0; c < min_channels; ++c)
-            {
-                const T &target_value    = reinterpret_cast<const T *>(tensor(id))[c];
-                const T &reference_value = reinterpret_cast<const T *>(reference(id))[c];
-
-                if(!compare<U, typename U::value_type>(target_value, reference_value, tolerance_value))
-                {
-                    ARM_COMPUTE_TEST_INFO("id = " << id);
-                    ARM_COMPUTE_TEST_INFO("channel = " << c);
-                    ARM_COMPUTE_TEST_INFO("target = " << std::setprecision(5) << framework::make_printable(target_value));
-                    ARM_COMPUTE_TEST_INFO("reference = " << std::setprecision(5) << framework::make_printable(reference_value));
-                    ARM_COMPUTE_TEST_INFO("tolerance = " << std::setprecision(5) << framework::make_printable(static_cast<typename U::value_type>(tolerance_value)));
-                    ARM_COMPUTE_EXPECT_EQUAL(target_value, reference_value, framework::LogLevel::DEBUG);
-
-                    ++num_mismatches;
-                }
-
-                ++num_elements;
-            }
-        }
-    }
-
-    if(num_elements > 0)
-    {
-        const int64_t absolute_tolerance_number = tolerance_number * num_elements;
-        const float   percent_mismatches        = static_cast<float>(num_mismatches) / num_elements * 100.f;
-
-        ARM_COMPUTE_TEST_INFO(num_mismatches << " values (" << std::fixed << std::setprecision(2) << percent_mismatches
-                              << "%) mismatched (maximum tolerated " << std::setprecision(2) << tolerance_number << "%)");
-        ARM_COMPUTE_EXPECT(num_mismatches <= absolute_tolerance_number, framework::LogLevel::ERRORS);
-    }
-}
-
-template <typename T, typename U>
-void validate(T target, T reference, U tolerance)
-{
-    ARM_COMPUTE_TEST_INFO("reference = " << std::setprecision(5) << framework::make_printable(reference));
-    ARM_COMPUTE_TEST_INFO("target = " << std::setprecision(5) << framework::make_printable(target));
-    ARM_COMPUTE_TEST_INFO("tolerance = " << std::setprecision(5) << framework::make_printable(static_cast<typename U::value_type>(tolerance)));
-    ARM_COMPUTE_EXPECT((compare<U, typename U::value_type>(target, reference, tolerance)), framework::LogLevel::ERRORS);
-}
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_REFERENCE_VALIDATION_H__ */
diff --git a/tests/validation_old/AssetsLibrary.cpp b/tests/validation_old/AssetsLibrary.cpp
new file mode 100644
index 0000000..d7c881d
--- /dev/null
+++ b/tests/validation_old/AssetsLibrary.cpp
@@ -0,0 +1,447 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "tests/AssetsLibrary.h"
+
+#include "TypePrinter.h"
+#include "Utils.h"
+
+#include "arm_compute/core/ITensor.h"
+
+#include <cctype>
+#include <fstream>
+#include <limits>
+#include <map>
+#include <mutex>
+#include <sstream>
+#include <stdexcept>
+#include <tuple>
+#include <unordered_map>
+#include <utility>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace
+{
+template <typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
+void rgb_to_luminance(const RawTensor &src, RawTensor &dst)
+{
+    const size_t min_size = std::min(src.size(), dst.size());
+
+    for(size_t i = 0, j = 0; i < min_size; i += 3, ++j)
+    {
+        reinterpret_cast<T *>(dst.data())[j] = 0.2126f * src.data()[i + 0] + 0.7152f * src.data()[i + 1] + 0.0722f * src.data()[i + 2];
+    }
+}
+
+void extract_r_from_rgb(const RawTensor &src, RawTensor &dst)
+{
+    const size_t min_size = std::min(src.size(), dst.size());
+
+    for(size_t i = 0, j = 0; i < min_size; i += 3, ++j)
+    {
+        dst.data()[j] = src.data()[i];
+    }
+}
+
+void extract_g_from_rgb(const RawTensor &src, RawTensor &dst)
+{
+    const size_t min_size = std::min(src.size(), dst.size());
+
+    for(size_t i = 1, j = 0; i < min_size; i += 3, ++j)
+    {
+        dst.data()[j] = src.data()[i];
+    }
+}
+
+void discard_comments(std::ifstream &fs)
+{
+    while(fs.peek() == '#')
+    {
+        fs.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+    }
+}
+
+void discard_comments_and_spaces(std::ifstream &fs)
+{
+    while(true)
+    {
+        discard_comments(fs);
+
+        if(isspace(fs.peek()) == 0)
+        {
+            break;
+        }
+
+        fs.ignore(1);
+    }
+}
+
+std::tuple<unsigned int, unsigned int, int> parse_ppm_header(std::ifstream &fs)
+{
+    // Check the PPM magic number is valid
+    std::array<char, 2> magic_number{ { 0 } };
+    fs >> magic_number[0] >> magic_number[1];
+
+    if(magic_number[0] != 'P' || magic_number[1] != '6')
+    {
+        throw std::runtime_error("Only raw PPM format is suported");
+    }
+
+    discard_comments_and_spaces(fs);
+
+    unsigned int width = 0;
+    fs >> width;
+
+    discard_comments_and_spaces(fs);
+
+    unsigned int height = 0;
+    fs >> height;
+
+    discard_comments_and_spaces(fs);
+
+    int max_value = 0;
+    fs >> max_value;
+
+    if(!fs.good())
+    {
+        throw std::runtime_error("Cannot read image dimensions");
+    }
+
+    if(max_value != 255)
+    {
+        throw std::runtime_error("RawTensor doesn't have 8-bit values");
+    }
+
+    discard_comments(fs);
+
+    if(isspace(fs.peek()) == 0)
+    {
+        throw std::runtime_error("Invalid PPM header");
+    }
+
+    fs.ignore(1);
+
+    return std::make_tuple(width, height, max_value);
+}
+
+RawTensor load_ppm(const std::string &path)
+{
+    std::ifstream file(path, std::ios::in | std::ios::binary);
+
+    if(!file.good())
+    {
+        throw std::runtime_error("Could not load PPM image: " + path);
+    }
+
+    unsigned int width  = 0;
+    unsigned int height = 0;
+
+    std::tie(width, height, std::ignore) = parse_ppm_header(file);
+
+    RawTensor raw(TensorShape(width, height), Format::RGB888);
+
+    // Check if the file is large enough to fill the image
+    const size_t current_position = file.tellg();
+    file.seekg(0, std::ios_base::end);
+    const size_t end_position = file.tellg();
+    file.seekg(current_position, std::ios_base::beg);
+
+    if((end_position - current_position) < raw.size())
+    {
+        throw std::runtime_error("Not enough data in file");
+    }
+
+    file.read(reinterpret_cast<std::fstream::char_type *>(raw.data()), raw.size());
+
+    if(!file.good())
+    {
+        throw std::runtime_error("Failure while reading image buffer");
+    }
+
+    return raw;
+}
+} // namespace
+
+AssetsLibrary::AssetsLibrary(std::string path, std::random_device::result_type seed) //NOLINT
+    : _library_path(std::move(path)),
+      _seed{ seed }
+{
+}
+
+std::random_device::result_type AssetsLibrary::seed() const
+{
+    return _seed;
+}
+
+void AssetsLibrary::fill(RawTensor &raw, const std::string &name, Format format) const
+{
+    //FIXME: Should be done by swapping cached buffers
+    const RawTensor &src = get(name, format);
+    std::copy_n(src.data(), raw.size(), raw.data());
+}
+
+void AssetsLibrary::fill(RawTensor &raw, const std::string &name, Channel channel) const
+{
+    fill(raw, name, get_format_for_channel(channel), channel);
+}
+
+void AssetsLibrary::fill(RawTensor &raw, const std::string &name, Format format, Channel channel) const
+{
+    const RawTensor &src = get(name, format, channel);
+    std::copy_n(src.data(), raw.size(), raw.data());
+}
+
+const AssetsLibrary::Loader &AssetsLibrary::get_loader(const std::string &extension) const
+{
+    static std::unordered_map<std::string, Loader> loaders =
+    {
+        { "ppm", load_ppm }
+    };
+
+    const auto it = loaders.find(extension);
+
+    if(it != loaders.end())
+    {
+        return it->second;
+    }
+    else
+    {
+        throw std::invalid_argument("Cannot load image with extension '" + extension + "'");
+    }
+}
+
+const AssetsLibrary::Converter &AssetsLibrary::get_converter(Format src, Format dst) const
+{
+    static std::map<std::pair<Format, Format>, Converter> converters =
+    {
+        { std::make_pair(Format::RGB888, Format::U8), rgb_to_luminance<uint8_t> },
+        { std::make_pair(Format::RGB888, Format::U16), rgb_to_luminance<uint16_t> },
+        { std::make_pair(Format::RGB888, Format::S16), rgb_to_luminance<int16_t> },
+        { std::make_pair(Format::RGB888, Format::U32), rgb_to_luminance<uint32_t> }
+    };
+
+    const auto it = converters.find(std::make_pair(src, dst));
+
+    if(it != converters.end())
+    {
+        return it->second;
+    }
+    else
+    {
+        std::stringstream msg;
+        msg << "Cannot convert from format '" << src << "' to format '" << dst << "'\n";
+        throw std::invalid_argument(msg.str());
+    }
+}
+
+const AssetsLibrary::Converter &AssetsLibrary::get_converter(DataType src, Format dst) const
+{
+    static std::map<std::pair<DataType, Format>, Converter> converters = {};
+
+    const auto it = converters.find(std::make_pair(src, dst));
+
+    if(it != converters.end())
+    {
+        return it->second;
+    }
+    else
+    {
+        std::stringstream msg;
+        msg << "Cannot convert from data type '" << src << "' to format '" << dst << "'\n";
+        throw std::invalid_argument(msg.str());
+    }
+}
+
+const AssetsLibrary::Converter &AssetsLibrary::get_converter(DataType src, DataType dst) const
+{
+    static std::map<std::pair<DataType, DataType>, Converter> converters = {};
+
+    const auto it = converters.find(std::make_pair(src, dst));
+
+    if(it != converters.end())
+    {
+        return it->second;
+    }
+    else
+    {
+        std::stringstream msg;
+        msg << "Cannot convert from data type '" << src << "' to data type '" << dst << "'\n";
+        throw std::invalid_argument(msg.str());
+    }
+}
+
+const AssetsLibrary::Converter &AssetsLibrary::get_converter(Format src, DataType dst) const
+{
+    static std::map<std::pair<Format, DataType>, Converter> converters = {};
+
+    const auto it = converters.find(std::make_pair(src, dst));
+
+    if(it != converters.end())
+    {
+        return it->second;
+    }
+    else
+    {
+        std::stringstream msg;
+        msg << "Cannot convert from format '" << src << "' to data type '" << dst << "'\n";
+        throw std::invalid_argument(msg.str());
+    }
+}
+
+const AssetsLibrary::Extractor &AssetsLibrary::get_extractor(Format format, Channel channel) const
+{
+    static std::map<std::pair<Format, Channel>, Extractor> extractors =
+    {
+        { std::make_pair(Format::RGB888, Channel::R), extract_r_from_rgb },
+        { std::make_pair(Format::RGB888, Channel::G), extract_g_from_rgb }
+    };
+
+    const auto it = extractors.find(std::make_pair(format, channel));
+
+    if(it != extractors.end())
+    {
+        return it->second;
+    }
+    else
+    {
+        std::stringstream msg;
+        msg << "Cannot extract channel '" << channel << "' from format '" << format << "'\n";
+        throw std::invalid_argument(msg.str());
+    }
+}
+
+RawTensor AssetsLibrary::load_image(const std::string &name) const
+{
+#ifdef _WIN32
+    const std::string image_path = ("\\images\\");
+#else  /* _WIN32 */
+    const std::string image_path = ("/images/");
+#endif /* _WIN32 */
+
+    const std::string path      = _library_path + image_path + name;
+    const std::string extension = path.substr(path.find_last_of('.') + 1);
+    return (*get_loader(extension))(path);
+}
+
+const RawTensor &AssetsLibrary::find_or_create_raw_tensor(const std::string &name, Format format) const
+{
+    std::lock_guard<std::mutex> guard(_format_lock);
+
+    const RawTensor *ptr = _cache.find(std::make_tuple(name, format));
+
+    if(ptr != nullptr)
+    {
+        return *ptr;
+    }
+
+    RawTensor raw = load_image(name);
+
+    if(raw.format() != format)
+    {
+        //FIXME: Remove unnecessary copy
+        RawTensor dst(raw.shape(), format);
+        (*get_converter(raw.format(), format))(raw, dst);
+        raw = std::move(dst);
+    }
+
+    return _cache.add(std::make_tuple(name, format), std::move(raw));
+}
+
+const RawTensor &AssetsLibrary::find_or_create_raw_tensor(const std::string &name, Format format, Channel channel) const
+{
+    std::lock_guard<std::mutex> guard(_channel_lock);
+
+    const RawTensor *ptr = _cache.find(std::make_tuple(name, format, channel));
+
+    if(ptr != nullptr)
+    {
+        return *ptr;
+    }
+
+    const RawTensor &src = get(name, format);
+    //FIXME: Need to change shape to match channel
+    RawTensor dst(src.shape(), get_channel_format(channel));
+
+    (*get_extractor(format, channel))(src, dst);
+
+    return _cache.add(std::make_tuple(name, format, channel), std::move(dst));
+}
+
+TensorShape AssetsLibrary::get_image_shape(const std::string &name)
+{
+    return load_image(name).shape();
+}
+
+const RawTensor &AssetsLibrary::get(const std::string &name) const
+{
+    //FIXME: Format should be derived from the image name. Not be fixed to RGB.
+    return find_or_create_raw_tensor(name, Format::RGB888);
+}
+
+RawTensor AssetsLibrary::get(const std::string &name)
+{
+    //FIXME: Format should be derived from the image name. Not be fixed to RGB.
+    return RawTensor(find_or_create_raw_tensor(name, Format::RGB888));
+}
+
+RawTensor AssetsLibrary::get(const std::string &name, DataType data_type, int num_channels) const
+{
+    const RawTensor &raw = get(name);
+
+    return RawTensor(raw.shape(), data_type, num_channels);
+}
+
+const RawTensor &AssetsLibrary::get(const std::string &name, Format format) const
+{
+    return find_or_create_raw_tensor(name, format);
+}
+
+RawTensor AssetsLibrary::get(const std::string &name, Format format)
+{
+    return RawTensor(find_or_create_raw_tensor(name, format));
+}
+
+const RawTensor &AssetsLibrary::get(const std::string &name, Channel channel) const
+{
+    return get(name, get_format_for_channel(channel), channel);
+}
+
+RawTensor AssetsLibrary::get(const std::string &name, Channel channel)
+{
+    return RawTensor(get(name, get_format_for_channel(channel), channel));
+}
+
+const RawTensor &AssetsLibrary::get(const std::string &name, Format format, Channel channel) const
+{
+    return find_or_create_raw_tensor(name, format, channel);
+}
+
+RawTensor AssetsLibrary::get(const std::string &name, Format format, Channel channel)
+{
+    return RawTensor(find_or_create_raw_tensor(name, format, channel));
+}
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/validation_old/AssetsLibrary.h b/tests/validation_old/AssetsLibrary.h
new file mode 100644
index 0000000..6945aa6
--- /dev/null
+++ b/tests/validation_old/AssetsLibrary.h
@@ -0,0 +1,674 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __ARM_COMPUTE_TEST_TENSOR_LIBRARY_H__
+#define __ARM_COMPUTE_TEST_TENSOR_LIBRARY_H__
+
+#include "arm_compute/core/Coordinates.h"
+#include "arm_compute/core/Error.h"
+#include "arm_compute/core/Helpers.h"
+#include "arm_compute/core/TensorInfo.h"
+#include "arm_compute/core/TensorShape.h"
+#include "arm_compute/core/Types.h"
+#include "arm_compute/core/Window.h"
+#include "tests/RawTensor.h"
+#include "tests/TensorCache.h"
+#include "tests/Utils.h"
+#include "tests/validation_old/half.h"
+
+#include <algorithm>
+#include <cstddef>
+#include <fstream>
+#include <random>
+#include <string>
+#include <type_traits>
+
+namespace arm_compute
+{
+namespace test
+{
+/** Factory class to create and fill tensors.
+ *
+ * Allows to initialise tensors from loaded images or by specifying the shape
+ * explicitly. Furthermore, provides methods to fill tensors with the content of
+ * loaded images or with random values.
+ */
+class AssetsLibrary final
+{
+public:
+    /** Initialises the library with a @p path to the image directory.
+     * Furthermore, sets the seed for the random generator to @p seed.
+     *
+     * @param[in] path Path to load images from.
+     * @param[in] seed Seed used to initialise the random number generator.
+     */
+    AssetsLibrary(std::string path, std::random_device::result_type seed);
+
+    /** Seed that is used to fill tensors with random values. */
+    std::random_device::result_type seed() const;
+
+    /** Provides a tensor shape for the specified image.
+     *
+     * @param[in] name Image file used to look up the raw tensor.
+     */
+    TensorShape get_image_shape(const std::string &name);
+
+    /** Provides a contant raw tensor for the specified image.
+     *
+     * @param[in] name Image file used to look up the raw tensor.
+     */
+    const RawTensor &get(const std::string &name) const;
+
+    /** Provides a raw tensor for the specified image.
+     *
+     * @param[in] name Image file used to look up the raw tensor.
+     */
+    RawTensor get(const std::string &name);
+
+    /** Creates an uninitialised raw tensor with the given @p data_type and @p
+     * num_channels. The shape is derived from the specified image.
+     *
+     * @param[in] name         Image file used to initialise the tensor.
+     * @param[in] data_type    Data type used to initialise the tensor.
+     * @param[in] num_channels Number of channels used to initialise the tensor.
+     */
+    RawTensor get(const std::string &name, DataType data_type, int num_channels = 1) const;
+
+    /** Provides a contant raw tensor for the specified image after it has been
+     * converted to @p format.
+     *
+     * @param[in] name   Image file used to look up the raw tensor.
+     * @param[in] format Format used to look up the raw tensor.
+     */
+    const RawTensor &get(const std::string &name, Format format) const;
+
+    /** Provides a raw tensor for the specified image after it has been
+     * converted to @p format.
+     *
+     * @param[in] name   Image file used to look up the raw tensor.
+     * @param[in] format Format used to look up the raw tensor.
+     */
+    RawTensor get(const std::string &name, Format format);
+
+    /** Provides a contant raw tensor for the specified channel after it has
+     * been extracted form the given image.
+     *
+     * @param[in] name    Image file used to look up the raw tensor.
+     * @param[in] channel Channel used to look up the raw tensor.
+     *
+     * @note The channel has to be unambiguous so that the format can be
+     *       inferred automatically.
+     */
+    const RawTensor &get(const std::string &name, Channel channel) const;
+
+    /** Provides a raw tensor for the specified channel after it has been
+     * extracted form the given image.
+     *
+     * @param[in] name    Image file used to look up the raw tensor.
+     * @param[in] channel Channel used to look up the raw tensor.
+     *
+     * @note The channel has to be unambiguous so that the format can be
+     *       inferred automatically.
+     */
+    RawTensor get(const std::string &name, Channel channel);
+
+    /** Provides a constant raw tensor for the specified channel after it has
+     * been extracted form the given image formatted to @p format.
+     *
+     * @param[in] name    Image file used to look up the raw tensor.
+     * @param[in] format  Format used to look up the raw tensor.
+     * @param[in] channel Channel used to look up the raw tensor.
+     */
+    const RawTensor &get(const std::string &name, Format format, Channel channel) const;
+
+    /** Provides a raw tensor for the specified channel after it has been
+     * extracted form the given image formatted to @p format.
+     *
+     * @param[in] name    Image file used to look up the raw tensor.
+     * @param[in] format  Format used to look up the raw tensor.
+     * @param[in] channel Channel used to look up the raw tensor.
+     */
+    RawTensor get(const std::string &name, Format format, Channel channel);
+
+    /** Puts garbage values all around the tensor for testing purposes
+     *
+     * @param[in, out] tensor       To be filled tensor.
+     * @param[in]      distribution Distribution used to fill the tensor's surroundings.
+     * @param[in]      seed_offset  The offset will be added to the global seed before initialising the random generator.
+     */
+    template <typename T, typename D>
+    void fill_borders_with_garbage(T &&tensor, D &&distribution, std::random_device::result_type seed_offset) const;
+
+    /** Fills the specified @p tensor with random values drawn from @p
+     * distribution.
+     *
+     * @param[in, out] tensor       To be filled tensor.
+     * @param[in]      distribution Distribution used to fill the tensor.
+     * @param[in]      seed_offset  The offset will be added to the global seed before initialising the random generator.
+     *
+     * @note The @p distribution has to provide operator(Generator &) which
+     *       will be used to draw samples.
+     */
+    template <typename T, typename D>
+    void fill(T &&tensor, D &&distribution, std::random_device::result_type seed_offset) const;
+
+    /** Fills the specified @p raw tensor with random values drawn from @p
+     * distribution.
+     *
+     * @param[in, out] raw          To be filled raw.
+     * @param[in]      distribution Distribution used to fill the tensor.
+     * @param[in]      seed_offset  The offset will be added to the global seed before initialising the random generator.
+     *
+     * @note The @p distribution has to provide operator(Generator &) which
+     *       will be used to draw samples.
+     */
+    template <typename D>
+    void fill(RawTensor &raw, D &&distribution, std::random_device::result_type seed_offset) const;
+
+    /** Fills the specified @p tensor with the content of the specified image
+     * converted to the given format.
+     *
+     * @param[in, out] tensor To be filled tensor.
+     * @param[in]      name   Image file used to fill the tensor.
+     * @param[in]      format Format of the image used to fill the tensor.
+     *
+     * @warning No check is performed that the specified format actually
+     *          matches the format of the tensor.
+     */
+    template <typename T>
+    void fill(T &&tensor, const std::string &name, Format format) const;
+
+    /** Fills the raw tensor with the content of the specified image
+     * converted to the given format.
+     *
+     * @param[in, out] raw    To be filled raw tensor.
+     * @param[in]      name   Image file used to fill the tensor.
+     * @param[in]      format Format of the image used to fill the tensor.
+     *
+     * @warning No check is performed that the specified format actually
+     *          matches the format of the tensor.
+     */
+    void fill(RawTensor &raw, const std::string &name, Format format) const;
+
+    /** Fills the specified @p tensor with the content of the specified channel
+     * extracted from the given image.
+     *
+     * @param[in, out] tensor  To be filled tensor.
+     * @param[in]      name    Image file used to fill the tensor.
+     * @param[in]      channel Channel of the image used to fill the tensor.
+     *
+     * @note The channel has to be unambiguous so that the format can be
+     *       inferred automatically.
+     *
+     * @warning No check is performed that the specified format actually
+     *          matches the format of the tensor.
+     */
+    template <typename T>
+    void fill(T &&tensor, const std::string &name, Channel channel) const;
+
+    /** Fills the raw tensor with the content of the specified channel
+     * extracted from the given image.
+     *
+     * @param[in, out] raw     To be filled raw tensor.
+     * @param[in]      name    Image file used to fill the tensor.
+     * @param[in]      channel Channel of the image used to fill the tensor.
+     *
+     * @note The channel has to be unambiguous so that the format can be
+     *       inferred automatically.
+     *
+     * @warning No check is performed that the specified format actually
+     *          matches the format of the tensor.
+     */
+    void fill(RawTensor &raw, const std::string &name, Channel channel) const;
+
+    /** Fills the specified @p tensor with the content of the specified channel
+     * extracted from the given image after it has been converted to the given
+     * format.
+     *
+     * @param[in, out] tensor  To be filled tensor.
+     * @param[in]      name    Image file used to fill the tensor.
+     * @param[in]      format  Format of the image used to fill the tensor.
+     * @param[in]      channel Channel of the image used to fill the tensor.
+     *
+     * @warning No check is performed that the specified format actually
+     *          matches the format of the tensor.
+     */
+    template <typename T>
+    void fill(T &&tensor, const std::string &name, Format format, Channel channel) const;
+
+    /** Fills the raw tensor with the content of the specified channel
+     * extracted from the given image after it has been converted to the given
+     * format.
+     *
+     * @param[in, out] raw     To be filled raw tensor.
+     * @param[in]      name    Image file used to fill the tensor.
+     * @param[in]      format  Format of the image used to fill the tensor.
+     * @param[in]      channel Channel of the image used to fill the tensor.
+     *
+     * @warning No check is performed that the specified format actually
+     *          matches the format of the tensor.
+     */
+    void fill(RawTensor &raw, const std::string &name, Format format, Channel channel) const;
+
+    /** Fill a tensor with uniform distribution across the range of its type
+     *
+     * @param[in, out] tensor      To be filled tensor.
+     * @param[in]      seed_offset The offset will be added to the global seed before initialising the random generator.
+     */
+    template <typename T>
+    void fill_tensor_uniform(T &&tensor, std::random_device::result_type seed_offset) const;
+
+    /** Fill a tensor with uniform distribution across the a specified range
+     *
+     * @param[in, out] tensor      To be filled tensor.
+     * @param[in]      seed_offset The offset will be added to the global seed before initialising the random generator.
+     * @param[in]      low         lowest value in the range (inclusive)
+     * @param[in]      high        highest value in the range (inclusive)
+     *
+     * @note    @p low and @p high must be of the same type as the data type of @p tensor
+     */
+    template <typename T, typename D>
+    void fill_tensor_uniform(T &&tensor, std::random_device::result_type seed_offset, D low, D high) const;
+
+    /** Fills the specified @p tensor with data loaded from binary in specified path.
+     *
+     * @param[in, out] tensor To be filled tensor.
+     * @param[in]      name   Data file.
+     */
+    template <typename T>
+    void fill_layer_data(T &&tensor, std::string name) const;
+
+private:
+    // Function prototype to convert between image formats.
+    using Converter = void (*)(const RawTensor &src, RawTensor &dst);
+    // Function prototype to extract a channel from an image.
+    using Extractor = void (*)(const RawTensor &src, RawTensor &dst);
+    // Function prototype to load an image file.
+    using Loader = RawTensor (*)(const std::string &path);
+
+    const Converter &get_converter(Format src, Format dst) const;
+    const Converter &get_converter(DataType src, Format dst) const;
+    const Converter &get_converter(Format src, DataType dst) const;
+    const Converter &get_converter(DataType src, DataType dst) const;
+    const Extractor &get_extractor(Format format, Channel) const;
+    const Loader &get_loader(const std::string &extension) const;
+
+    /** Creates a raw tensor from the specified image.
+     *
+     * @param[in] name To be loaded image file.
+     *
+     * @note If use_single_image is true @p name is ignored and the user image
+     *       is loaded instead.
+     */
+    RawTensor load_image(const std::string &name) const;
+
+    /** Provides a raw tensor for the specified image and format.
+     *
+     * @param[in] name   Image file used to look up the raw tensor.
+     * @param[in] format Format used to look up the raw tensor.
+     *
+     * If the tensor has already been requested before the cached version will
+     * be returned. Otherwise the tensor will be added to the cache.
+     *
+     * @note If use_single_image is true @p name is ignored and the user image
+     *       is loaded instead.
+     */
+    const RawTensor &find_or_create_raw_tensor(const std::string &name, Format format) const;
+
+    /** Provides a raw tensor for the specified image, format and channel.
+     *
+     * @param[in] name    Image file used to look up the raw tensor.
+     * @param[in] format  Format used to look up the raw tensor.
+     * @param[in] channel Channel used to look up the raw tensor.
+     *
+     * If the tensor has already been requested before the cached version will
+     * be returned. Otherwise the tensor will be added to the cache.
+     *
+     * @note If use_single_image is true @p name is ignored and the user image
+     *       is loaded instead.
+     */
+    const RawTensor &find_or_create_raw_tensor(const std::string &name, Format format, Channel channel) const;
+
+    mutable TensorCache             _cache{};
+    mutable std::mutex              _format_lock{};
+    mutable std::mutex              _channel_lock{};
+    const std::string               _library_path;
+    std::random_device::result_type _seed;
+};
+
+template <typename T, typename D>
+void AssetsLibrary::fill_borders_with_garbage(T &&tensor, D &&distribution, std::random_device::result_type seed_offset) const
+{
+    const PaddingSize padding_size = tensor.padding();
+
+    Window window;
+    window.set(0, Window::Dimension(-padding_size.left, tensor.shape()[0] + padding_size.right, 1));
+    window.set(1, Window::Dimension(-padding_size.top, tensor.shape()[1] + padding_size.bottom, 1));
+
+    std::mt19937 gen(_seed);
+
+    execute_window_loop(window, [&](const Coordinates & id)
+    {
+        TensorShape shape = tensor.shape();
+
+        // If outside of valid region
+        if(id.x() < 0 || id.x() >= static_cast<int>(shape.x()) || id.y() < 0 || id.y() >= static_cast<int>(shape.y()))
+        {
+            using ResultType         = typename std::remove_reference<D>::type::result_type;
+            const ResultType value   = distribution(gen);
+            void *const      out_ptr = tensor(id);
+            store_value_with_data_type(out_ptr, value, tensor.data_type());
+        }
+    });
+}
+
+template <typename T, typename D>
+void AssetsLibrary::fill(T &&tensor, D &&distribution, std::random_device::result_type seed_offset) const
+{
+    Window window;
+    for(unsigned int d = 0; d < tensor.shape().num_dimensions(); ++d)
+    {
+        window.set(d, Window::Dimension(0, tensor.shape()[d], 1));
+    }
+
+    std::mt19937 gen(_seed + seed_offset);
+
+    //FIXME: Replace with normal loop
+    execute_window_loop(window, [&](const Coordinates & id)
+    {
+        using ResultType         = typename std::remove_reference<D>::type::result_type;
+        const ResultType value   = distribution(gen);
+        void *const      out_ptr = tensor(id);
+        store_value_with_data_type(out_ptr, value, tensor.data_type());
+    });
+
+    fill_borders_with_garbage(tensor, distribution, seed_offset);
+}
+
+template <typename D>
+void AssetsLibrary::fill(RawTensor &raw, D &&distribution, std::random_device::result_type seed_offset) const
+{
+    std::mt19937 gen(_seed + seed_offset);
+
+    for(size_t offset = 0; offset < raw.size(); offset += raw.element_size())
+    {
+        using ResultType       = typename std::remove_reference<D>::type::result_type;
+        const ResultType value = distribution(gen);
+        store_value_with_data_type(raw.data() + offset, value, raw.data_type());
+    }
+}
+
+template <typename T>
+void AssetsLibrary::fill(T &&tensor, const std::string &name, Format format) const
+{
+    const RawTensor &raw = get(name, format);
+
+    for(size_t offset = 0; offset < raw.size(); offset += raw.element_size())
+    {
+        const Coordinates id = index2coord(raw.shape(), offset / raw.element_size());
+
+        const RawTensor::value_type *const raw_ptr = raw.data() + offset;
+        const auto                         out_ptr = static_cast<RawTensor::value_type *>(tensor(id));
+        std::copy_n(raw_ptr, raw.element_size(), out_ptr);
+    }
+}
+
+template <typename T>
+void AssetsLibrary::fill(T &&tensor, const std::string &name, Channel channel) const
+{
+    fill(std::forward<T>(tensor), name, get_format_for_channel(channel), channel);
+}
+
+template <typename T>
+void AssetsLibrary::fill(T &&tensor, const std::string &name, Format format, Channel channel) const
+{
+    const RawTensor &raw = get(name, format, channel);
+
+    for(size_t offset = 0; offset < raw.size(); offset += raw.element_size())
+    {
+        const Coordinates id = index2coord(raw.shape(), offset / raw.element_size());
+
+        const RawTensor::value_type *const raw_ptr = raw.data() + offset;
+        const auto                         out_ptr = static_cast<RawTensor::value_type *>(tensor(id));
+        std::copy_n(raw_ptr, raw.element_size(), out_ptr);
+    }
+}
+
+template <typename T>
+void AssetsLibrary::fill_tensor_uniform(T &&tensor, std::random_device::result_type seed_offset) const
+{
+    switch(tensor.data_type())
+    {
+        case DataType::U8:
+        {
+            std::uniform_int_distribution<uint8_t> distribution_u8(std::numeric_limits<uint8_t>::lowest(), std::numeric_limits<uint8_t>::max());
+            fill(tensor, distribution_u8, seed_offset);
+            break;
+        }
+        case DataType::S8:
+        case DataType::QS8:
+        {
+            std::uniform_int_distribution<int8_t> distribution_s8(std::numeric_limits<int8_t>::lowest(), std::numeric_limits<int8_t>::max());
+            fill(tensor, distribution_s8, seed_offset);
+            break;
+        }
+        case DataType::U16:
+        {
+            std::uniform_int_distribution<uint16_t> distribution_u16(std::numeric_limits<uint16_t>::lowest(), std::numeric_limits<uint16_t>::max());
+            fill(tensor, distribution_u16, seed_offset);
+            break;
+        }
+        case DataType::S16:
+        case DataType::QS16:
+        {
+            std::uniform_int_distribution<int16_t> distribution_s16(std::numeric_limits<int16_t>::lowest(), std::numeric_limits<int16_t>::max());
+            fill(tensor, distribution_s16, seed_offset);
+            break;
+        }
+        case DataType::U32:
+        {
+            std::uniform_int_distribution<uint32_t> distribution_u32(std::numeric_limits<uint32_t>::lowest(), std::numeric_limits<uint32_t>::max());
+            fill(tensor, distribution_u32, seed_offset);
+            break;
+        }
+        case DataType::S32:
+        {
+            std::uniform_int_distribution<int32_t> distribution_s32(std::numeric_limits<int32_t>::lowest(), std::numeric_limits<int32_t>::max());
+            fill(tensor, distribution_s32, seed_offset);
+            break;
+        }
+        case DataType::U64:
+        {
+            std::uniform_int_distribution<uint64_t> distribution_u64(std::numeric_limits<uint64_t>::lowest(), std::numeric_limits<uint64_t>::max());
+            fill(tensor, distribution_u64, seed_offset);
+            break;
+        }
+        case DataType::S64:
+        {
+            std::uniform_int_distribution<int64_t> distribution_s64(std::numeric_limits<int64_t>::lowest(), std::numeric_limits<int64_t>::max());
+            fill(tensor, distribution_s64, seed_offset);
+            break;
+        }
+        case DataType::F16:
+        {
+            // It doesn't make sense to check [-inf, inf], so hard code it to a big number
+            std::uniform_real_distribution<float> distribution_f16(-100.f, 100.f);
+            fill(tensor, distribution_f16, seed_offset);
+            break;
+        }
+        case DataType::F32:
+        {
+            // It doesn't make sense to check [-inf, inf], so hard code it to a big number
+            std::uniform_real_distribution<float> distribution_f32(-1000.f, 1000.f);
+            fill(tensor, distribution_f32, seed_offset);
+            break;
+        }
+        case DataType::F64:
+        {
+            // It doesn't make sense to check [-inf, inf], so hard code it to a big number
+            std::uniform_real_distribution<double> distribution_f64(-1000.f, 1000.f);
+            fill(tensor, distribution_f64, seed_offset);
+            break;
+        }
+        case DataType::SIZET:
+        {
+            std::uniform_int_distribution<size_t> distribution_sizet(std::numeric_limits<size_t>::lowest(), std::numeric_limits<size_t>::max());
+            fill(tensor, distribution_sizet, seed_offset);
+            break;
+        }
+        default:
+            ARM_COMPUTE_ERROR("NOT SUPPORTED!");
+    }
+}
+
+template <typename T, typename D>
+void AssetsLibrary::fill_tensor_uniform(T &&tensor, std::random_device::result_type seed_offset, D low, D high) const
+{
+    switch(tensor.data_type())
+    {
+        case DataType::U8:
+        {
+            ARM_COMPUTE_ERROR_ON(!(std::is_same<uint8_t, D>::value));
+            std::uniform_int_distribution<uint8_t> distribution_u8(low, high);
+            fill(tensor, distribution_u8, seed_offset);
+            break;
+        }
+        case DataType::S8:
+        case DataType::QS8:
+        {
+            ARM_COMPUTE_ERROR_ON(!(std::is_same<int8_t, D>::value));
+            std::uniform_int_distribution<int8_t> distribution_s8(low, high);
+            fill(tensor, distribution_s8, seed_offset);
+            break;
+        }
+        case DataType::U16:
+        {
+            ARM_COMPUTE_ERROR_ON(!(std::is_same<uint16_t, D>::value));
+            std::uniform_int_distribution<uint16_t> distribution_u16(low, high);
+            fill(tensor, distribution_u16, seed_offset);
+            break;
+        }
+        case DataType::S16:
+        case DataType::QS16:
+        {
+            ARM_COMPUTE_ERROR_ON(!(std::is_same<int16_t, D>::value));
+            std::uniform_int_distribution<int16_t> distribution_s16(low, high);
+            fill(tensor, distribution_s16, seed_offset);
+            break;
+        }
+        case DataType::U32:
+        {
+            ARM_COMPUTE_ERROR_ON(!(std::is_same<uint32_t, D>::value));
+            std::uniform_int_distribution<uint32_t> distribution_u32(low, high);
+            fill(tensor, distribution_u32, seed_offset);
+            break;
+        }
+        case DataType::S32:
+        {
+            ARM_COMPUTE_ERROR_ON(!(std::is_same<int32_t, D>::value));
+            std::uniform_int_distribution<int32_t> distribution_s32(low, high);
+            fill(tensor, distribution_s32, seed_offset);
+            break;
+        }
+        case DataType::U64:
+        {
+            ARM_COMPUTE_ERROR_ON(!(std::is_same<uint64_t, D>::value));
+            std::uniform_int_distribution<uint64_t> distribution_u64(low, high);
+            fill(tensor, distribution_u64, seed_offset);
+            break;
+        }
+        case DataType::S64:
+        {
+            ARM_COMPUTE_ERROR_ON(!(std::is_same<int64_t, D>::value));
+            std::uniform_int_distribution<int64_t> distribution_s64(low, high);
+            fill(tensor, distribution_s64, seed_offset);
+            break;
+        }
+        case DataType::F16:
+        {
+            std::uniform_real_distribution<float> distribution_f16(low, high);
+            fill(tensor, distribution_f16, seed_offset);
+            break;
+        }
+        case DataType::F32:
+        {
+            ARM_COMPUTE_ERROR_ON(!(std::is_same<float, D>::value));
+            std::uniform_real_distribution<float> distribution_f32(low, high);
+            fill(tensor, distribution_f32, seed_offset);
+            break;
+        }
+        case DataType::F64:
+        {
+            ARM_COMPUTE_ERROR_ON(!(std::is_same<double, D>::value));
+            std::uniform_real_distribution<double> distribution_f64(low, high);
+            fill(tensor, distribution_f64, seed_offset);
+            break;
+        }
+        case DataType::SIZET:
+        {
+            ARM_COMPUTE_ERROR_ON(!(std::is_same<size_t, D>::value));
+            std::uniform_int_distribution<size_t> distribution_sizet(low, high);
+            fill(tensor, distribution_sizet, seed_offset);
+            break;
+        }
+        default:
+            ARM_COMPUTE_ERROR("NOT SUPPORTED!");
+    }
+}
+
+template <typename T>
+void AssetsLibrary::fill_layer_data(T &&tensor, std::string name) const
+{
+#ifdef _WIN32
+    const std::string path_separator("\\");
+#else  /* _WIN32 */
+    const std::string path_separator("/");
+#endif /* _WIN32 */
+
+    const std::string path = _library_path + path_separator + name;
+
+    // Open file
+    std::ifstream file(path, std::ios::in | std::ios::binary);
+    if(!file.good())
+    {
+        throw std::runtime_error("Could not load binary data: " + path);
+    }
+
+    Window window;
+    for(unsigned int d = 0; d < tensor.shape().num_dimensions(); ++d)
+    {
+        window.set(d, Window::Dimension(0, tensor.shape()[d], 1));
+    }
+
+    //FIXME : Replace with normal loop
+    execute_window_loop(window, [&](const Coordinates & id)
+    {
+        float val;
+        file.read(reinterpret_cast<char *>(&val), sizeof(float));
+        void *const out_ptr = tensor(id);
+        store_value_with_data_type(out_ptr, val, tensor.data_type());
+    });
+}
+} // namespace test
+} // namespace arm_compute
+#endif /* __ARM_COMPUTE_TEST_TENSOR_LIBRARY_H__ */
diff --git a/tests/validation/CL/ArithmeticAddition.cpp b/tests/validation_old/CL/ArithmeticAddition.cpp
similarity index 98%
rename from tests/validation/CL/ArithmeticAddition.cpp
rename to tests/validation_old/CL/ArithmeticAddition.cpp
index fc1bf59..8e67bf3 100644
--- a/tests/validation/CL/ArithmeticAddition.cpp
+++ b/tests/validation_old/CL/ArithmeticAddition.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
+#include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -37,7 +37,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/ArithmeticSubtraction.cpp b/tests/validation_old/CL/ArithmeticSubtraction.cpp
similarity index 97%
rename from tests/validation/CL/ArithmeticSubtraction.cpp
rename to tests/validation_old/CL/ArithmeticSubtraction.cpp
index 086281c..522ee7b 100644
--- a/tests/validation/CL/ArithmeticSubtraction.cpp
+++ b/tests/validation_old/CL/ArithmeticSubtraction.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
+#include "tests/AssetsLibrary.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -37,7 +37,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/BatchNormalizationLayer.cpp b/tests/validation_old/CL/BatchNormalizationLayer.cpp
similarity index 96%
rename from tests/validation/CL/BatchNormalizationLayer.cpp
rename to tests/validation_old/CL/BatchNormalizationLayer.cpp
index abcc619..75c9a58 100644
--- a/tests/validation/CL/BatchNormalizationLayer.cpp
+++ b/tests/validation_old/CL/BatchNormalizationLayer.cpp
@@ -21,16 +21,16 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "dataset/BatchNormalizationLayerDataset.h"
-#include "tests/validation/Helpers.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Helpers.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/dataset/BatchNormalizationLayerDataset.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
diff --git a/tests/validation/CL/Box3x3.cpp b/tests/validation_old/CL/Box3x3.cpp
similarity index 94%
rename from tests/validation/CL/Box3x3.cpp
rename to tests/validation_old/CL/Box3x3.cpp
index f2df5e6..3eacb48 100644
--- a/tests/validation/CL/Box3x3.cpp
+++ b/tests/validation_old/CL/Box3x3.cpp
@@ -21,16 +21,16 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -38,7 +38,7 @@
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLBox3x3.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/CLFixture.cpp b/tests/validation_old/CL/CLFixture.cpp
similarity index 92%
rename from tests/validation/CL/CLFixture.cpp
rename to tests/validation_old/CL/CLFixture.cpp
index 38e52c3..aacaeb3 100644
--- a/tests/validation/CL/CLFixture.cpp
+++ b/tests/validation_old/CL/CLFixture.cpp
@@ -21,9 +21,9 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "validation/CL/CLFixture.h"
+#include "tests/validation_old/CL/CLFixture.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 using namespace arm_compute;
 using namespace arm_compute::test;
diff --git a/tests/validation/CL/CLFixture.h b/tests/validation_old/CL/CLFixture.h
similarity index 100%
rename from tests/validation/CL/CLFixture.h
rename to tests/validation_old/CL/CLFixture.h
diff --git a/tests/validation/CL/DepthConvert.cpp b/tests/validation_old/CL/DepthConvert.cpp
similarity index 98%
rename from tests/validation/CL/DepthConvert.cpp
rename to tests/validation_old/CL/DepthConvert.cpp
index 57a21e8..994a032 100644
--- a/tests/validation/CL/DepthConvert.cpp
+++ b/tests/validation_old/CL/DepthConvert.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -37,7 +37,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/FillBorder.cpp b/tests/validation_old/CL/FillBorder.cpp
similarity index 93%
rename from tests/validation/CL/FillBorder.cpp
rename to tests/validation_old/CL/FillBorder.cpp
index dc522c5..ed47a1e 100644
--- a/tests/validation/CL/FillBorder.cpp
+++ b/tests/validation_old/CL/FillBorder.cpp
@@ -21,13 +21,13 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/CL/kernels/CLFillBorderKernel.h"
 #include "arm_compute/core/Helpers.h"
@@ -36,7 +36,7 @@
 #include "arm_compute/runtime/CL/CLTensor.h"
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/FixedPoint/FixedPoint_QS8.cpp b/tests/validation_old/CL/FixedPoint/FixedPoint_QS8.cpp
similarity index 97%
rename from tests/validation/CL/FixedPoint/FixedPoint_QS8.cpp
rename to tests/validation_old/CL/FixedPoint/FixedPoint_QS8.cpp
index d4ccc2b..3721fb5 100644
--- a/tests/validation/CL/FixedPoint/FixedPoint_QS8.cpp
+++ b/tests/validation_old/CL/FixedPoint/FixedPoint_QS8.cpp
@@ -21,14 +21,14 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/CL/CLKernelLibrary.h"
 #include "arm_compute/core/CL/ICLKernel.h"
@@ -43,7 +43,7 @@
 
 #include "arm_compute/core/CL/ICLTensor.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/Gaussian3x3.cpp b/tests/validation_old/CL/Gaussian3x3.cpp
similarity index 94%
rename from tests/validation/CL/Gaussian3x3.cpp
rename to tests/validation_old/CL/Gaussian3x3.cpp
index 2ef077c..27f4833 100644
--- a/tests/validation/CL/Gaussian3x3.cpp
+++ b/tests/validation_old/CL/Gaussian3x3.cpp
@@ -21,16 +21,16 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -38,7 +38,7 @@
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLGaussian3x3.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/Gaussian5x5.cpp b/tests/validation_old/CL/Gaussian5x5.cpp
similarity index 94%
rename from tests/validation/CL/Gaussian5x5.cpp
rename to tests/validation_old/CL/Gaussian5x5.cpp
index fb21ed0..c187426 100644
--- a/tests/validation/CL/Gaussian5x5.cpp
+++ b/tests/validation_old/CL/Gaussian5x5.cpp
@@ -21,16 +21,16 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -38,7 +38,7 @@
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLGaussian5x5.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/HarrisCorners.cpp b/tests/validation_old/CL/HarrisCorners.cpp
similarity index 96%
rename from tests/validation/CL/HarrisCorners.cpp
rename to tests/validation_old/CL/HarrisCorners.cpp
index 6370c4d..2c73679 100644
--- a/tests/validation/CL/HarrisCorners.cpp
+++ b/tests/validation_old/CL/HarrisCorners.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -39,7 +39,7 @@
 #include "arm_compute/runtime/TensorAllocator.h"
 
 #include "PaddingCalculator.h"
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/IntegralImage.cpp b/tests/validation_old/CL/IntegralImage.cpp
similarity index 94%
rename from tests/validation/CL/IntegralImage.cpp
rename to tests/validation_old/CL/IntegralImage.cpp
index dc325a1..ea15b90 100644
--- a/tests/validation/CL/IntegralImage.cpp
+++ b/tests/validation_old/CL/IntegralImage.cpp
@@ -22,15 +22,15 @@
  * SOFTWARE.
  */
 
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -38,7 +38,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/MinMaxLocation.cpp b/tests/validation_old/CL/MinMaxLocation.cpp
similarity index 97%
rename from tests/validation/CL/MinMaxLocation.cpp
rename to tests/validation_old/CL/MinMaxLocation.cpp
index 5f8be43..8824215 100644
--- a/tests/validation/CL/MinMaxLocation.cpp
+++ b/tests/validation_old/CL/MinMaxLocation.cpp
@@ -22,14 +22,14 @@
  * SOFTWARE.
  */
 
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -38,7 +38,7 @@
 #include "arm_compute/runtime/TensorAllocator.h"
 
 #include "PaddingCalculator.h"
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/NonLinearFilter.cpp b/tests/validation_old/CL/NonLinearFilter.cpp
similarity index 95%
rename from tests/validation/CL/NonLinearFilter.cpp
rename to tests/validation_old/CL/NonLinearFilter.cpp
index f453f27..0132f7d 100644
--- a/tests/validation/CL/NonLinearFilter.cpp
+++ b/tests/validation_old/CL/NonLinearFilter.cpp
@@ -21,17 +21,17 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Helpers.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Helpers.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -39,7 +39,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/PixelWiseMultiplication.cpp b/tests/validation_old/CL/PixelWiseMultiplication.cpp
similarity index 97%
rename from tests/validation/CL/PixelWiseMultiplication.cpp
rename to tests/validation_old/CL/PixelWiseMultiplication.cpp
index 375c77d..f003298 100644
--- a/tests/validation/CL/PixelWiseMultiplication.cpp
+++ b/tests/validation_old/CL/PixelWiseMultiplication.cpp
@@ -25,9 +25,9 @@
 #include "TypePrinter.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/runtime/CL/functions/CLPixelWiseMultiplication.h"
 
diff --git a/tests/validation/CL/ROIPoolingLayer.cpp b/tests/validation_old/CL/ROIPoolingLayer.cpp
similarity index 94%
rename from tests/validation/CL/ROIPoolingLayer.cpp
rename to tests/validation_old/CL/ROIPoolingLayer.cpp
index 19d7903..edd1ccc 100644
--- a/tests/validation/CL/ROIPoolingLayer.cpp
+++ b/tests/validation_old/CL/ROIPoolingLayer.cpp
@@ -28,10 +28,10 @@
 #include "arm_compute/runtime/CL/functions/CLROIPoolingLayer.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include <random>
 #include <vector>
diff --git a/tests/validation/CL/Sobel3x3.cpp b/tests/validation_old/CL/Sobel3x3.cpp
similarity index 95%
rename from tests/validation/CL/Sobel3x3.cpp
rename to tests/validation_old/CL/Sobel3x3.cpp
index 9e32a3d..a4c779c 100644
--- a/tests/validation/CL/Sobel3x3.cpp
+++ b/tests/validation_old/CL/Sobel3x3.cpp
@@ -22,16 +22,16 @@
  * SOFTWARE.
  */
 
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -40,7 +40,7 @@
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLSobel3x3.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/Sobel5x5.cpp b/tests/validation_old/CL/Sobel5x5.cpp
similarity index 95%
rename from tests/validation/CL/Sobel5x5.cpp
rename to tests/validation_old/CL/Sobel5x5.cpp
index a7c971a..7e5dec1 100644
--- a/tests/validation/CL/Sobel5x5.cpp
+++ b/tests/validation_old/CL/Sobel5x5.cpp
@@ -22,16 +22,16 @@
  * SOFTWARE.
  */
 
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -40,7 +40,7 @@
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLSobel5x5.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/TableLookup.cpp b/tests/validation_old/CL/TableLookup.cpp
similarity index 96%
rename from tests/validation/CL/TableLookup.cpp
rename to tests/validation_old/CL/TableLookup.cpp
index 40e847f..26c3868 100644
--- a/tests/validation/CL/TableLookup.cpp
+++ b/tests/validation_old/CL/TableLookup.cpp
@@ -21,18 +21,18 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
 #include "CL/CLLutAccessor.h"
-#include "Globals.h"
 #include "PaddingCalculator.h"
 #include "RawLutAccessor.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Helpers.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Helpers.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -40,7 +40,7 @@
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLTableLookup.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <map>
 #include <random>
diff --git a/tests/validation/CL/Threshold.cpp b/tests/validation_old/CL/Threshold.cpp
similarity index 94%
rename from tests/validation/CL/Threshold.cpp
rename to tests/validation_old/CL/Threshold.cpp
index a2e7b7b..74ddd68 100644
--- a/tests/validation/CL/Threshold.cpp
+++ b/tests/validation_old/CL/Threshold.cpp
@@ -21,16 +21,16 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "dataset/ThresholdDataset.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/dataset/ThresholdDataset.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -38,7 +38,7 @@
 #include "arm_compute/runtime/CL/CLTensorAllocator.h"
 #include "arm_compute/runtime/CL/functions/CLThreshold.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/CL/WarpPerspective.cpp b/tests/validation_old/CL/WarpPerspective.cpp
similarity index 95%
rename from tests/validation/CL/WarpPerspective.cpp
rename to tests/validation_old/CL/WarpPerspective.cpp
index 260b22b..6252361 100644
--- a/tests/validation/CL/WarpPerspective.cpp
+++ b/tests/validation_old/CL/WarpPerspective.cpp
@@ -21,17 +21,17 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
 #include "CL/CLAccessor.h"
-#include "Globals.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Helpers.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Helpers.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -39,7 +39,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/Datasets.h b/tests/validation_old/Datasets.h
similarity index 83%
rename from tests/validation/Datasets.h
rename to tests/validation_old/Datasets.h
index 15e1b09..464fffd 100644
--- a/tests/validation/Datasets.h
+++ b/tests/validation_old/Datasets.h
@@ -24,25 +24,25 @@
 #ifndef __ARM_COMPUTE_TEST_VALIDATION_DATASETS_H__
 #define __ARM_COMPUTE_TEST_VALIDATION_DATASETS_H__
 
-#include "dataset/ActivationFunctionDataset.h"
-#include "dataset/BatchNormalizationLayerDataset.h"
-#include "dataset/BorderModeDataset.h"
-#include "dataset/ConvertPolicyDataset.h"
-#include "dataset/ConvolutionLayerDataset.h"
-#include "dataset/DataTypeDatasets.h"
-#include "dataset/FullyConnectedLayerDataset.h"
-#include "dataset/GEMMDataset.h"
-#include "dataset/ImageDatasets.h"
-#include "dataset/InterpolationPolicyDataset.h"
-#include "dataset/MatrixPatternDataset.h"
-#include "dataset/NonLinearFilterFunctionDataset.h"
-#include "dataset/NormalizationTypeDataset.h"
-#include "dataset/PoolingTypesDataset.h"
-#include "dataset/RoundingPolicyDataset.h"
-#include "dataset/ShapeDatasets.h"
-#include "dataset/ThresholdDataset.h"
+#include "tests/validation_old/dataset/ActivationFunctionDataset.h"
+#include "tests/validation_old/dataset/BatchNormalizationLayerDataset.h"
+#include "tests/validation_old/dataset/BorderModeDataset.h"
+#include "tests/validation_old/dataset/ConvertPolicyDataset.h"
+#include "tests/validation_old/dataset/ConvolutionLayerDataset.h"
+#include "tests/validation_old/dataset/DataTypeDatasets.h"
+#include "tests/validation_old/dataset/FullyConnectedLayerDataset.h"
+#include "tests/validation_old/dataset/GEMMDataset.h"
+#include "tests/validation_old/dataset/ImageDatasets.h"
+#include "tests/validation_old/dataset/InterpolationPolicyDataset.h"
+#include "tests/validation_old/dataset/MatrixPatternDataset.h"
+#include "tests/validation_old/dataset/NonLinearFilterFunctionDataset.h"
+#include "tests/validation_old/dataset/NormalizationTypeDataset.h"
+#include "tests/validation_old/dataset/PoolingTypesDataset.h"
+#include "tests/validation_old/dataset/RoundingPolicyDataset.h"
+#include "tests/validation_old/dataset/ShapeDatasets.h"
+#include "tests/validation_old/dataset/ThresholdDataset.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 using namespace boost::unit_test::data::monomorphic;
 
diff --git a/tests/validation_new/FixedPoint.h b/tests/validation_old/FixedPoint.h
similarity index 90%
rename from tests/validation_new/FixedPoint.h
rename to tests/validation_old/FixedPoint.h
index 61d791c..12ffcdf 100644
--- a/tests/validation_new/FixedPoint.h
+++ b/tests/validation_old/FixedPoint.h
@@ -63,8 +63,6 @@
 template <> struct promote<int32_t> { using type = int64_t; };
 template <> struct promote<uint64_t> { using type = uint64_t; };
 template <> struct promote<int64_t> { using type = int64_t; };
-template <typename T>
-using promote_t = typename promote<T>::type;
 // clang-format on
 // *INDENT-ON*
 }
@@ -90,6 +88,10 @@
     // Static Checks
     static_assert(std::is_integral<T>::value, "Type is not an integer");
 
+    // Friends
+    friend struct detail::functions;
+    friend struct detail::constant_expr<T>;
+
     /** Constructor (from different fixed point type)
      *
      * @param[in] val Fixed point
@@ -385,7 +387,7 @@
     template <typename T>
     static bool signbit(fixed_point<T> x)
     {
-        return ((x.raw() >> std::numeric_limits<T>::digits) != 0);
+        return ((x._value >> std::numeric_limits<T>::digits) != 0);
     }
     /** Checks if two fixed point numbers are equal
      *
@@ -397,10 +399,10 @@
     template <typename T>
     static bool isequal(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x.precision(), y.precision());
+        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
         x.rescale(p);
         y.rescale(p);
-        return (x.raw() == y.raw());
+        return (x._value == y._value);
     }
     /** Checks if two fixed point number are not equal
      *
@@ -424,10 +426,10 @@
     template <typename T>
     static bool isgreater(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x.precision(), y.precision());
+        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
         x.rescale(p);
         y.rescale(p);
-        return (x.raw() > y.raw());
+        return (x._value > y._value);
     }
     /** Checks if one fixed point is greater or equal than the other
      *
@@ -439,10 +441,10 @@
     template <typename T>
     static bool isgreaterequal(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x.precision(), y.precision());
+        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
         x.rescale(p);
         y.rescale(p);
-        return (x.raw() >= y.raw());
+        return (x._value >= y._value);
     }
     /** Checks if one fixed point is less than the other
      *
@@ -454,10 +456,10 @@
     template <typename T>
     static bool isless(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x.precision(), y.precision());
+        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
         x.rescale(p);
         y.rescale(p);
-        return (x.raw() < y.raw());
+        return (x._value < y._value);
     }
     /** Checks if one fixed point is less or equal than the other
      *
@@ -469,10 +471,10 @@
     template <typename T>
     static bool islessequal(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x.precision(), y.precision());
+        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
         x.rescale(p);
         y.rescale(p);
-        return (x.raw() <= y.raw());
+        return (x._value <= y._value);
     }
     /** Checks if one fixed point is less or greater than the other
      *
@@ -497,7 +499,7 @@
     template <typename T>
     static fixed_point<T> clamp(fixed_point<T> x, T min, T max)
     {
-        return fixed_point<T>(constant_expr<T>::clamp(x.raw(), min, max), x.precision(), true);
+        return fixed_point<T>(constant_expr<T>::clamp(x._value, min, max), x._fixed_point_position, true);
     }
     /** Negate number
      *
@@ -509,12 +511,12 @@
     static fixed_point<T> negate(fixed_point<T> x)
     {
         using promoted_T = typename traits::promote<T>::type;
-        promoted_T val   = -x.raw();
+        promoted_T val   = -x._value;
         if(OP == OverflowPolicy::SATURATE)
         {
             val = constant_expr<T>::saturate_cast(val);
         }
-        return fixed_point<T>(static_cast<T>(val), x.precision(), true);
+        return fixed_point<T>(static_cast<T>(val), x._fixed_point_position, true);
     }
     /** Perform addition among two fixed point numbers
      *
@@ -526,19 +528,19 @@
     template <OverflowPolicy OP = OverflowPolicy::SATURATE, typename T>
     static fixed_point<T> add(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x.precision(), y.precision());
+        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
         x.rescale(p);
         y.rescale(p);
         if(OP == OverflowPolicy::SATURATE)
         {
             using type = typename traits::promote<T>::type;
-            type val   = static_cast<type>(x.raw()) + static_cast<type>(y.raw());
+            type val   = static_cast<type>(x._value) + static_cast<type>(y._value);
             val        = constant_expr<T>::saturate_cast(val);
             return fixed_point<T>(static_cast<T>(val), p, true);
         }
         else
         {
-            return fixed_point<T>(x.raw() + y.raw(), p, true);
+            return fixed_point<T>(x._value + y._value, p, true);
         }
     }
     /** Perform subtraction among two fixed point numbers
@@ -551,19 +553,19 @@
     template <OverflowPolicy OP = OverflowPolicy::SATURATE, typename T>
     static fixed_point<T> sub(fixed_point<T> x, fixed_point<T> y)
     {
-        uint8_t p = std::min(x.precision(), y.precision());
+        uint8_t p = std::min(x._fixed_point_position, y._fixed_point_position);
         x.rescale(p);
         y.rescale(p);
         if(OP == OverflowPolicy::SATURATE)
         {
             using type = typename traits::promote<T>::type;
-            type val   = static_cast<type>(x.raw()) - static_cast<type>(y.raw());
+            type val   = static_cast<type>(x._value) - static_cast<type>(y._value);
             val        = constant_expr<T>::saturate_cast(val);
             return fixed_point<T>(static_cast<T>(val), p, true);
         }
         else
         {
-            return fixed_point<T>(x.raw() - y.raw(), p, true);
+            return fixed_point<T>(x._value - y._value, p, true);
         }
     }
     /** Perform multiplication among two fixed point numbers
@@ -577,10 +579,10 @@
     static fixed_point<T> mul(fixed_point<T> x, fixed_point<T> y)
     {
         using promoted_T        = typename traits::promote<T>::type;
-        uint8_t    p_min        = std::min(x.precision(), y.precision());
-        uint8_t    p_max        = std::max(x.precision(), y.precision());
+        uint8_t    p_min        = std::min(x._fixed_point_position, y._fixed_point_position);
+        uint8_t    p_max        = std::max(x._fixed_point_position, y._fixed_point_position);
         promoted_T round_factor = (1 << (p_max - 1));
-        promoted_T val          = ((static_cast<promoted_T>(x.raw()) * static_cast<promoted_T>(y.raw())) + round_factor) >> p_max;
+        promoted_T val          = ((static_cast<promoted_T>(x._value) * static_cast<promoted_T>(y._value)) + round_factor) >> p_max;
         if(OP == OverflowPolicy::SATURATE)
         {
             val = constant_expr<T>::saturate_cast(val);
@@ -598,11 +600,11 @@
     static fixed_point<T> div(fixed_point<T> x, fixed_point<T> y)
     {
         using promoted_T = typename traits::promote<T>::type;
-        uint8_t    p     = std::min(x.precision(), y.precision());
-        promoted_T denom = static_cast<promoted_T>(y.raw());
+        uint8_t    p     = std::min(x._fixed_point_position, y._fixed_point_position);
+        promoted_T denom = static_cast<promoted_T>(y._value);
         if(denom != 0)
         {
-            promoted_T val = (static_cast<promoted_T>(x.raw()) << std::max(x.precision(), y.precision())) / denom;
+            promoted_T val = (static_cast<promoted_T>(x._value) << std::max(x._fixed_point_position, y._fixed_point_position)) / denom;
             if(OP == OverflowPolicy::SATURATE)
             {
                 val = constant_expr<T>::saturate_cast(val);
@@ -611,7 +613,7 @@
         }
         else
         {
-            T val = (x.raw() < 0) ? std::numeric_limits<T>::min() : std::numeric_limits<T>::max();
+            T val = (x._value < 0) ? std::numeric_limits<T>::min() : std::numeric_limits<T>::max();
             return fixed_point<T>(val, p, true);
         }
     }
@@ -626,12 +628,12 @@
     static fixed_point<T> shift_left(fixed_point<T> x, size_t shift)
     {
         using promoted_T = typename traits::promote<T>::type;
-        promoted_T val   = static_cast<promoted_T>(x.raw()) << shift;
+        promoted_T val   = static_cast<promoted_T>(x._value) << shift;
         if(OP == OverflowPolicy::SATURATE)
         {
             val = constant_expr<T>::saturate_cast(val);
         }
-        return fixed_point<T>(static_cast<T>(val), x.precision(), true);
+        return fixed_point<T>(static_cast<T>(val), x._fixed_point_position, true);
     }
     /** Shift right
      *
@@ -643,7 +645,7 @@
     template <typename T>
     static fixed_point<T> shift_right(fixed_point<T> x, size_t shift)
     {
-        return fixed_point<T>(x.raw() >> shift, x.precision(), true);
+        return fixed_point<T>(x._value >> shift, x._fixed_point_position, true);
     }
     /** Calculate absolute value
      *
@@ -655,8 +657,8 @@
     static fixed_point<T> abs(fixed_point<T> x)
     {
         using promoted_T = typename traits::promote<T>::type;
-        T val            = (x.raw() < 0) ? constant_expr<T>::saturate_cast(-static_cast<promoted_T>(x.raw())) : x.raw();
-        return fixed_point<T>(val, x.precision(), true);
+        T val            = (x._value < 0) ? constant_expr<T>::saturate_cast(-static_cast<promoted_T>(x._value)) : x._value;
+        return fixed_point<T>(val, x._fixed_point_position, true);
     }
     /** Calculate the logarithm of a fixed point number
      *
@@ -667,7 +669,7 @@
     template <typename T>
     static fixed_point<T> log(fixed_point<T> x)
     {
-        uint8_t p         = x.precision();
+        uint8_t p         = x._fixed_point_position;
         auto    const_one = fixed_point<T>(static_cast<T>(1), p);
 
         // Logarithm of 1 is zero and logarithm of negative values is not defined in R, so return 0.
@@ -682,7 +684,7 @@
         }
 
         // Remove even powers of 2
-        T shift_val = 31 - __builtin_clz(x.raw() >> p);
+        T shift_val = 31 - __builtin_clz(x._value >> p);
         x           = shift_right(x, shift_val);
         x           = sub(x, const_one);
 
@@ -714,7 +716,7 @@
     template <typename T>
     static fixed_point<T> exp(fixed_point<T> x)
     {
-        uint8_t p = x.precision();
+        uint8_t p = x._fixed_point_position;
         // Constants
         auto const_one = fixed_point<T>(1, p);
         auto ln2       = fixed_point<T>(0.6931471, p);
@@ -724,7 +726,7 @@
         auto C         = fixed_point<T>(0.1763723, p);
         auto D         = fixed_point<T>(0.0435108, p);
 
-        T scaled_int_part = detail::constant_expr<T>::to_int(mul(x, inv_ln2).raw(), p);
+        T scaled_int_part = detail::constant_expr<T>::to_int(mul(x, inv_ln2)._value, p);
 
         // Polynomial expansion
         auto frac_part = sub(x, mul(ln2, fixed_point<T>(scaled_int_part, p)));
@@ -751,8 +753,8 @@
     template <typename T>
     static fixed_point<T> inv_sqrt(fixed_point<T> x)
     {
-        const uint8_t p     = x.precision();
-        int8_t        shift = std::numeric_limits<T>::digits - (p + detail::clz(x.raw()));
+        const uint8_t p     = x._fixed_point_position;
+        int8_t        shift = std::numeric_limits<T>::digits - (p + detail::clz(x._value));
 
         shift += std::numeric_limits<T>::is_signed ? 1 : 0;
 
@@ -782,7 +784,7 @@
     template <typename T>
     static fixed_point<T> tanh(fixed_point<T> x)
     {
-        uint8_t p = x.precision();
+        uint8_t p = x._fixed_point_position;
         // Constants
         auto const_one = fixed_point<T>(1, p);
         auto const_two = fixed_point<T>(2, p);
diff --git a/tests/validation_old/Helpers.h b/tests/validation_old/Helpers.h
new file mode 100644
index 0000000..e109ede
--- /dev/null
+++ b/tests/validation_old/Helpers.h
@@ -0,0 +1,273 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __ARM_COMPUTE_TEST_VALIDATION_HELPERS_H__
+#define __ARM_COMPUTE_TEST_VALIDATION_HELPERS_H__
+
+#include "arm_compute/core/Types.h"
+#include "tests/Globals.h"
+#include "tests/ILutAccessor.h"
+#include "tests/Types.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
+#include "tests/validation_old/half.h"
+
+#include <array>
+#include <cstring>
+#include <random>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+/** Helper function to fill one or more tensors with the uniform distribution with int values.
+ *
+ * @param[in]     dist          Distribution to be used to get the values for the tensor.
+ * @param[in]     seeds         List of seeds to be used to fill each tensor.
+ * @param[in,out] tensor        Tensor to be initialized with the values of the distribution.
+ * @param[in,out] other_tensors (Optional) One or more tensors to be filled.
+ *
+ */
+template <typename D, typename T, typename... Ts>
+void fill_tensors(D &&dist, std::initializer_list<int> seeds, T &&tensor, Ts &&... other_tensors)
+{
+    const std::array < T, 1 + sizeof...(Ts) > tensors{ { std::forward<T>(tensor), std::forward<Ts>(other_tensors)... } };
+    std::vector<int> vs(seeds);
+    ARM_COMPUTE_ERROR_ON(vs.size() != tensors.size());
+    int k = 0;
+    for(auto tp : tensors)
+    {
+        library->fill(*tp, std::forward<D>(dist), vs[k++]);
+    }
+}
+
+/** Helper function to get the testing range for each activation layer.
+ *
+ * @param[in] activation           Activation function to test.
+ * @param[in] fixed_point_position (Optional) Number of bits for the fractional part. Defaults to 1.
+ *
+ * @return A pair containing the lower upper testing bounds for a given function.
+ */
+template <typename T>
+inline std::pair<T, T> get_activation_layer_test_bounds(ActivationLayerInfo::ActivationFunction activation, int fixed_point_position = 1)
+{
+    bool is_float = std::is_same<T, float>::value;
+    is_float      = is_float || std::is_same<T, half_float::half>::value;
+
+    std::pair<T, T> bounds;
+
+    // Set initial values
+    if(is_float)
+    {
+        bounds = std::make_pair(-255.f, 255.f);
+    }
+    else
+    {
+        bounds = std::make_pair(std::numeric_limits<T>::lowest(), std::numeric_limits<T>::max());
+    }
+
+    // Reduce testing ranges
+    switch(activation)
+    {
+        case ActivationLayerInfo::ActivationFunction::LOGISTIC:
+        case ActivationLayerInfo::ActivationFunction::SOFT_RELU:
+            // Reduce range as exponent overflows
+            if(is_float)
+            {
+                bounds.first  = -40.f;
+                bounds.second = 40.f;
+            }
+            else
+            {
+                bounds.first  = -(1 << (fixed_point_position));
+                bounds.second = 1 << (fixed_point_position);
+            }
+            break;
+        case ActivationLayerInfo::ActivationFunction::TANH:
+            // Reduce range as exponent overflows
+            if(!is_float)
+            {
+                bounds.first  = -(1 << (fixed_point_position));
+                bounds.second = 1 << (fixed_point_position);
+            }
+            break;
+        case ActivationLayerInfo::ActivationFunction::SQRT:
+            // Reduce range as sqrt should take a non-negative number
+            bounds.first = (is_float) ? 0 : 1;
+            break;
+        default:
+            break;
+    }
+    return bounds;
+}
+/** Helper function to get the testing range for batch normalization layer.
+ *
+ * @param[in] fixed_point_position (Optional) Number of bits for the fractional part. Defaults to 1.
+ *
+ * @return A pair containing the lower upper testing bounds.
+ */
+template <typename T>
+std::pair<T, T> get_batchnormalization_layer_test_bounds(int fixed_point_position = 1)
+{
+    bool is_float = std::is_floating_point<T>::value;
+    std::pair<T, T> bounds;
+
+    // Set initial values
+    if(is_float)
+    {
+        bounds = std::make_pair(-1.f, 1.f);
+    }
+    else
+    {
+        bounds = std::make_pair(1, 1 << (fixed_point_position));
+    }
+
+    return bounds;
+}
+
+/** Fill mask with the corresponding given pattern.
+ *
+ * @param[in,out] mask    Mask to be filled according to pattern
+ * @param[in]     cols    Columns (width) of mask
+ * @param[in]     rows    Rows (height) of mask
+ * @param[in]     pattern Pattern to fill the mask according to
+ */
+inline void fill_mask_from_pattern(uint8_t *mask, int cols, int rows, MatrixPattern pattern)
+{
+    unsigned int                v = 0;
+    std::mt19937                gen(user_config.seed.get());
+    std::bernoulli_distribution dist(0.5);
+
+    for(int r = 0; r < rows; ++r)
+    {
+        for(int c = 0; c < cols; ++c, ++v)
+        {
+            uint8_t val = 0;
+
+            switch(pattern)
+            {
+                case MatrixPattern::BOX:
+                    val = 255;
+                    break;
+                case MatrixPattern::CROSS:
+                    val = ((r == (rows / 2)) || (c == (cols / 2))) ? 255 : 0;
+                    break;
+                case MatrixPattern::DISK:
+                    val = (((r - rows / 2.0f + 0.5f) * (r - rows / 2.0f + 0.5f)) / ((rows / 2.0f) * (rows / 2.0f)) + ((c - cols / 2.0f + 0.5f) * (c - cols / 2.0f + 0.5f)) / ((cols / 2.0f) *
+                            (cols / 2.0f))) <= 1.0f ? 255 : 0;
+                    break;
+                case MatrixPattern::OTHER:
+                    val = (dist(gen) ? 0 : 255);
+                    break;
+                default:
+                    return;
+            }
+
+            mask[v] = val;
+        }
+    }
+
+    if(pattern == MatrixPattern::OTHER)
+    {
+        std::uniform_int_distribution<uint8_t> distribution_u8(0, ((cols * rows) - 1));
+        mask[distribution_u8(gen)] = 255;
+    }
+}
+
+/** Calculate output tensor shape give a vector of input tensor to concatenate
+ *
+ * @param[in] input_shapes Shapes of the tensors to concatenate across depth.
+ *
+ * @return The shape of output concatenated tensor.
+ */
+inline TensorShape calculate_depth_concatenate_shape(std::vector<TensorShape> input_shapes)
+{
+    TensorShape out_shape = input_shapes.at(0);
+
+    unsigned int max_x = 0;
+    unsigned int max_y = 0;
+    unsigned int depth = 0;
+
+    for(auto const &shape : input_shapes)
+    {
+        max_x = std::max<unsigned int>(shape.x(), max_x);
+        max_y = std::max<unsigned int>(shape.y(), max_y);
+        depth += shape.z();
+    }
+
+    out_shape.set(0, max_x);
+    out_shape.set(1, max_y);
+    out_shape.set(2, depth);
+
+    return out_shape;
+}
+
+/** Fill matrix random.
+ *
+ * @param[in,out] matrix Matrix
+ * @param[in]     cols   Columns (width) of matrix
+ * @param[in]     rows   Rows (height) of matrix
+ */
+template <std::size_t SIZE>
+inline void fill_warp_matrix(std::array<float, SIZE> &matrix, int cols, int rows)
+{
+    std::mt19937                          gen(user_config.seed.get());
+    std::uniform_real_distribution<float> dist(-1, 1);
+
+    for(int v = 0, r = 0; r < rows; ++r)
+    {
+        for(int c = 0; c < cols; ++c, ++v)
+        {
+            matrix[v] = dist(gen);
+        }
+    }
+    if(SIZE == 9)
+    {
+        matrix[(cols * rows) - 1] = 1;
+    }
+}
+
+/** Helper function to fill the Lut random by a ILutAccessor.
+ *
+ * @param[in,out] table Accessor at the Lut.
+ *
+ */
+template <typename T>
+void fill_lookuptable(T &&table)
+{
+    std::mt19937                                          generator(user_config.seed.get());
+    std::uniform_int_distribution<typename T::value_type> distribution(std::numeric_limits<typename T::value_type>::min(), std::numeric_limits<typename T::value_type>::max());
+
+    for(int i = std::numeric_limits<typename T::value_type>::min(); i <= std::numeric_limits<typename T::value_type>::max(); i++)
+    {
+        table[i] = distribution(generator);
+    }
+}
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
+#endif /* __ARM_COMPUTE_TEST_VALIDATION_HELPERS_H__ */
diff --git a/tests/validation/NEON/AbsoluteDifference.cpp b/tests/validation_old/NEON/AbsoluteDifference.cpp
similarity index 96%
rename from tests/validation/NEON/AbsoluteDifference.cpp
rename to tests/validation_old/NEON/AbsoluteDifference.cpp
index 1aee95e..aa866ff 100644
--- a/tests/validation/NEON/AbsoluteDifference.cpp
+++ b/tests/validation_old/NEON/AbsoluteDifference.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -37,7 +37,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/Accumulate.cpp b/tests/validation_old/NEON/Accumulate.cpp
similarity index 94%
rename from tests/validation/NEON/Accumulate.cpp
rename to tests/validation_old/NEON/Accumulate.cpp
index 7e8a850..eb680a3 100644
--- a/tests/validation/NEON/Accumulate.cpp
+++ b/tests/validation_old/NEON/Accumulate.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -37,7 +37,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/AccumulateSquared.cpp b/tests/validation_old/NEON/AccumulateSquared.cpp
similarity index 94%
rename from tests/validation/NEON/AccumulateSquared.cpp
rename to tests/validation_old/NEON/AccumulateSquared.cpp
index 8390842..29b5edf 100644
--- a/tests/validation/NEON/AccumulateSquared.cpp
+++ b/tests/validation_old/NEON/AccumulateSquared.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -37,7 +37,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/AccumulateWeighted.cpp b/tests/validation_old/NEON/AccumulateWeighted.cpp
similarity index 94%
rename from tests/validation/NEON/AccumulateWeighted.cpp
rename to tests/validation_old/NEON/AccumulateWeighted.cpp
index ea71959..c59c1ed 100644
--- a/tests/validation/NEON/AccumulateWeighted.cpp
+++ b/tests/validation_old/NEON/AccumulateWeighted.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -37,7 +37,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/ArithmeticAddition.cpp b/tests/validation_old/NEON/ArithmeticAddition.cpp
similarity index 97%
rename from tests/validation/NEON/ArithmeticAddition.cpp
rename to tests/validation_old/NEON/ArithmeticAddition.cpp
index 952dcd2..490f124 100644
--- a/tests/validation/NEON/ArithmeticAddition.cpp
+++ b/tests/validation_old/NEON/ArithmeticAddition.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -37,7 +37,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/ArithmeticSubtraction.cpp b/tests/validation_old/NEON/ArithmeticSubtraction.cpp
similarity index 97%
rename from tests/validation/NEON/ArithmeticSubtraction.cpp
rename to tests/validation_old/NEON/ArithmeticSubtraction.cpp
index b95bc05..86aa124 100644
--- a/tests/validation/NEON/ArithmeticSubtraction.cpp
+++ b/tests/validation_old/NEON/ArithmeticSubtraction.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -37,7 +37,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/BatchNormalizationLayer.cpp b/tests/validation_old/NEON/BatchNormalizationLayer.cpp
similarity index 97%
rename from tests/validation/NEON/BatchNormalizationLayer.cpp
rename to tests/validation_old/NEON/BatchNormalizationLayer.cpp
index 9898beb..d98f99a 100644
--- a/tests/validation/NEON/BatchNormalizationLayer.cpp
+++ b/tests/validation_old/NEON/BatchNormalizationLayer.cpp
@@ -23,14 +23,14 @@
  */
 #include "NEON/Accessor.h"
 #include "TypePrinter.h"
-#include "dataset/BatchNormalizationLayerDataset.h"
 #include "tests/Globals.h"
 #include "tests/NEON/Helper.h"
 #include "tests/Utils.h"
-#include "tests/validation/Helpers.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Helpers.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/dataset/BatchNormalizationLayerDataset.h"
 
 #include "arm_compute/runtime/NEON/functions/NEBatchNormalizationLayer.h"
 
diff --git a/tests/validation/NEON/Box3x3.cpp b/tests/validation_old/NEON/Box3x3.cpp
similarity index 94%
rename from tests/validation/NEON/Box3x3.cpp
rename to tests/validation_old/NEON/Box3x3.cpp
index 579b2c8..708b7de 100644
--- a/tests/validation/NEON/Box3x3.cpp
+++ b/tests/validation_old/NEON/Box3x3.cpp
@@ -21,16 +21,16 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -39,7 +39,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/DepthConvert.cpp b/tests/validation_old/NEON/DepthConvert.cpp
similarity index 98%
rename from tests/validation/NEON/DepthConvert.cpp
rename to tests/validation_old/NEON/DepthConvert.cpp
index 0b7a175..48a2b6d 100644
--- a/tests/validation/NEON/DepthConvert.cpp
+++ b/tests/validation_old/NEON/DepthConvert.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -37,7 +37,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/FillBorder.cpp b/tests/validation_old/NEON/FillBorder.cpp
similarity index 93%
rename from tests/validation/NEON/FillBorder.cpp
rename to tests/validation_old/NEON/FillBorder.cpp
index ef2c1ff..ad703d9 100644
--- a/tests/validation/NEON/FillBorder.cpp
+++ b/tests/validation_old/NEON/FillBorder.cpp
@@ -21,13 +21,13 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/NEON/kernels/NEFillBorderKernel.h"
@@ -35,7 +35,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/Fixedpoint/Exp_QS16.cpp b/tests/validation_old/NEON/Fixedpoint/Exp_QS16.cpp
similarity index 94%
rename from tests/validation/NEON/Fixedpoint/Exp_QS16.cpp
rename to tests/validation_old/NEON/Fixedpoint/Exp_QS16.cpp
index dc8603c..6611587 100644
--- a/tests/validation/NEON/Fixedpoint/Exp_QS16.cpp
+++ b/tests/validation_old/NEON/Fixedpoint/Exp_QS16.cpp
@@ -21,14 +21,14 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/ReferenceCPP.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/ReferenceCPP.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/NEON/NEFixedPoint.h"
@@ -36,7 +36,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/Fixedpoint/Exp_QS8.cpp b/tests/validation_old/NEON/Fixedpoint/Exp_QS8.cpp
similarity index 94%
rename from tests/validation/NEON/Fixedpoint/Exp_QS8.cpp
rename to tests/validation_old/NEON/Fixedpoint/Exp_QS8.cpp
index dae01db..9e8096f 100644
--- a/tests/validation/NEON/Fixedpoint/Exp_QS8.cpp
+++ b/tests/validation_old/NEON/Fixedpoint/Exp_QS8.cpp
@@ -21,14 +21,14 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/ReferenceCPP.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/ReferenceCPP.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/NEON/NEFixedPoint.h"
@@ -36,7 +36,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/Fixedpoint/Invsqrt_QS16.cpp b/tests/validation_old/NEON/Fixedpoint/Invsqrt_QS16.cpp
similarity index 94%
rename from tests/validation/NEON/Fixedpoint/Invsqrt_QS16.cpp
rename to tests/validation_old/NEON/Fixedpoint/Invsqrt_QS16.cpp
index 4306a9a..f56707a 100644
--- a/tests/validation/NEON/Fixedpoint/Invsqrt_QS16.cpp
+++ b/tests/validation_old/NEON/Fixedpoint/Invsqrt_QS16.cpp
@@ -21,14 +21,14 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/ReferenceCPP.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/ReferenceCPP.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/NEON/NEFixedPoint.h"
@@ -36,7 +36,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/Fixedpoint/Invsqrt_QS8.cpp b/tests/validation_old/NEON/Fixedpoint/Invsqrt_QS8.cpp
similarity index 94%
rename from tests/validation/NEON/Fixedpoint/Invsqrt_QS8.cpp
rename to tests/validation_old/NEON/Fixedpoint/Invsqrt_QS8.cpp
index 1a2acaf..fb33fd4 100644
--- a/tests/validation/NEON/Fixedpoint/Invsqrt_QS8.cpp
+++ b/tests/validation_old/NEON/Fixedpoint/Invsqrt_QS8.cpp
@@ -21,14 +21,14 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/ReferenceCPP.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/ReferenceCPP.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/NEON/NEFixedPoint.h"
@@ -36,7 +36,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/Fixedpoint/Log_QS16.cpp b/tests/validation_old/NEON/Fixedpoint/Log_QS16.cpp
similarity index 94%
rename from tests/validation/NEON/Fixedpoint/Log_QS16.cpp
rename to tests/validation_old/NEON/Fixedpoint/Log_QS16.cpp
index 71582d8..6485b20 100644
--- a/tests/validation/NEON/Fixedpoint/Log_QS16.cpp
+++ b/tests/validation_old/NEON/Fixedpoint/Log_QS16.cpp
@@ -21,14 +21,14 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/ReferenceCPP.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/ReferenceCPP.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/NEON/NEFixedPoint.h"
@@ -36,7 +36,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/Fixedpoint/Log_QS8.cpp b/tests/validation_old/NEON/Fixedpoint/Log_QS8.cpp
similarity index 94%
rename from tests/validation/NEON/Fixedpoint/Log_QS8.cpp
rename to tests/validation_old/NEON/Fixedpoint/Log_QS8.cpp
index cc74d12..21012c5 100644
--- a/tests/validation/NEON/Fixedpoint/Log_QS8.cpp
+++ b/tests/validation_old/NEON/Fixedpoint/Log_QS8.cpp
@@ -21,14 +21,14 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/ReferenceCPP.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/ReferenceCPP.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/NEON/NEFixedPoint.h"
@@ -36,7 +36,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/Fixedpoint/Reciprocal_QS16.cpp b/tests/validation_old/NEON/Fixedpoint/Reciprocal_QS16.cpp
similarity index 94%
rename from tests/validation/NEON/Fixedpoint/Reciprocal_QS16.cpp
rename to tests/validation_old/NEON/Fixedpoint/Reciprocal_QS16.cpp
index 2081948..5630a33 100644
--- a/tests/validation/NEON/Fixedpoint/Reciprocal_QS16.cpp
+++ b/tests/validation_old/NEON/Fixedpoint/Reciprocal_QS16.cpp
@@ -21,14 +21,14 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/ReferenceCPP.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/ReferenceCPP.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/NEON/NEFixedPoint.h"
@@ -36,7 +36,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/Fixedpoint/Reciprocal_QS8.cpp b/tests/validation_old/NEON/Fixedpoint/Reciprocal_QS8.cpp
similarity index 94%
rename from tests/validation/NEON/Fixedpoint/Reciprocal_QS8.cpp
rename to tests/validation_old/NEON/Fixedpoint/Reciprocal_QS8.cpp
index 4b808ce..23f98ac 100644
--- a/tests/validation/NEON/Fixedpoint/Reciprocal_QS8.cpp
+++ b/tests/validation_old/NEON/Fixedpoint/Reciprocal_QS8.cpp
@@ -21,14 +21,14 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/ReferenceCPP.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/ReferenceCPP.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/NEON/NEFixedPoint.h"
@@ -36,7 +36,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/Gaussian3x3.cpp b/tests/validation_old/NEON/Gaussian3x3.cpp
similarity index 94%
rename from tests/validation/NEON/Gaussian3x3.cpp
rename to tests/validation_old/NEON/Gaussian3x3.cpp
index b7f9150..becd919 100644
--- a/tests/validation/NEON/Gaussian3x3.cpp
+++ b/tests/validation_old/NEON/Gaussian3x3.cpp
@@ -21,16 +21,16 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -39,7 +39,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/Gaussian5x5.cpp b/tests/validation_old/NEON/Gaussian5x5.cpp
similarity index 94%
rename from tests/validation/NEON/Gaussian5x5.cpp
rename to tests/validation_old/NEON/Gaussian5x5.cpp
index 7727340..240285a 100644
--- a/tests/validation/NEON/Gaussian5x5.cpp
+++ b/tests/validation_old/NEON/Gaussian5x5.cpp
@@ -21,16 +21,16 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -39,7 +39,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/HarrisCorners.cpp b/tests/validation_old/NEON/HarrisCorners.cpp
similarity index 96%
rename from tests/validation/NEON/HarrisCorners.cpp
rename to tests/validation_old/NEON/HarrisCorners.cpp
index 6793e21..809e61c 100644
--- a/tests/validation/NEON/HarrisCorners.cpp
+++ b/tests/validation_old/NEON/HarrisCorners.cpp
@@ -21,16 +21,16 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "NEON/Helper.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -39,7 +39,7 @@
 #include "arm_compute/runtime/TensorAllocator.h"
 
 #include "PaddingCalculator.h"
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/IntegralImage.cpp b/tests/validation_old/NEON/IntegralImage.cpp
similarity index 94%
rename from tests/validation/NEON/IntegralImage.cpp
rename to tests/validation_old/NEON/IntegralImage.cpp
index d5ad33e..69654b2 100644
--- a/tests/validation/NEON/IntegralImage.cpp
+++ b/tests/validation_old/NEON/IntegralImage.cpp
@@ -22,15 +22,15 @@
  * SOFTWARE.
  */
 
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -38,7 +38,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/MinMaxLocation.cpp b/tests/validation_old/NEON/MinMaxLocation.cpp
similarity index 96%
rename from tests/validation/NEON/MinMaxLocation.cpp
rename to tests/validation_old/NEON/MinMaxLocation.cpp
index a467172..c41745a 100644
--- a/tests/validation/NEON/MinMaxLocation.cpp
+++ b/tests/validation_old/NEON/MinMaxLocation.cpp
@@ -22,16 +22,16 @@
  * SOFTWARE.
  */
 
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "NEON/Helper.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -39,7 +39,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/NonLinearFilter.cpp b/tests/validation_old/NEON/NonLinearFilter.cpp
similarity index 95%
rename from tests/validation/NEON/NonLinearFilter.cpp
rename to tests/validation_old/NEON/NonLinearFilter.cpp
index ff0a8e7..acc90a4 100644
--- a/tests/validation/NEON/NonLinearFilter.cpp
+++ b/tests/validation_old/NEON/NonLinearFilter.cpp
@@ -21,17 +21,17 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Helpers.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Helpers.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -39,7 +39,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/PixelWiseMultiplication.cpp b/tests/validation_old/NEON/PixelWiseMultiplication.cpp
similarity index 98%
rename from tests/validation/NEON/PixelWiseMultiplication.cpp
rename to tests/validation_old/NEON/PixelWiseMultiplication.cpp
index f809448..60eb82e 100644
--- a/tests/validation/NEON/PixelWiseMultiplication.cpp
+++ b/tests/validation_old/NEON/PixelWiseMultiplication.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -37,7 +37,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/ROIPoolingLayer.cpp b/tests/validation_old/NEON/ROIPoolingLayer.cpp
similarity index 94%
rename from tests/validation/NEON/ROIPoolingLayer.cpp
rename to tests/validation_old/NEON/ROIPoolingLayer.cpp
index 523885d..2046beb 100644
--- a/tests/validation/NEON/ROIPoolingLayer.cpp
+++ b/tests/validation_old/NEON/ROIPoolingLayer.cpp
@@ -27,10 +27,10 @@
 #include "arm_compute/runtime/NEON/functions/NEROIPoolingLayer.h"
 #include "tests/Globals.h"
 #include "tests/Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include <random>
 #include <vector>
diff --git a/tests/validation/NEON/Sobel3x3.cpp b/tests/validation_old/NEON/Sobel3x3.cpp
similarity index 95%
rename from tests/validation/NEON/Sobel3x3.cpp
rename to tests/validation_old/NEON/Sobel3x3.cpp
index 74a3144..cb249e1 100644
--- a/tests/validation/NEON/Sobel3x3.cpp
+++ b/tests/validation_old/NEON/Sobel3x3.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -38,7 +38,7 @@
 #include "arm_compute/runtime/TensorAllocator.h"
 
 #include "PaddingCalculator.h"
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/Sobel5x5.cpp b/tests/validation_old/NEON/Sobel5x5.cpp
similarity index 95%
rename from tests/validation/NEON/Sobel5x5.cpp
rename to tests/validation_old/NEON/Sobel5x5.cpp
index d4d48f6..2f26e62 100644
--- a/tests/validation/NEON/Sobel5x5.cpp
+++ b/tests/validation_old/NEON/Sobel5x5.cpp
@@ -22,16 +22,16 @@
  * SOFTWARE.
  */
 
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -39,7 +39,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/TableLookup.cpp b/tests/validation_old/NEON/TableLookup.cpp
similarity index 96%
rename from tests/validation/NEON/TableLookup.cpp
rename to tests/validation_old/NEON/TableLookup.cpp
index 70b767e..f134e5d 100644
--- a/tests/validation/NEON/TableLookup.cpp
+++ b/tests/validation_old/NEON/TableLookup.cpp
@@ -21,8 +21,6 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "NEON/Helper.h"
 #include "NEON/LutAccessor.h"
@@ -30,10 +28,12 @@
 #include "RawLutAccessor.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Helpers.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Helpers.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -41,7 +41,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/Threshold.cpp b/tests/validation_old/NEON/Threshold.cpp
similarity index 94%
rename from tests/validation/NEON/Threshold.cpp
rename to tests/validation_old/NEON/Threshold.cpp
index f5382d4..d56ec5e 100644
--- a/tests/validation/NEON/Threshold.cpp
+++ b/tests/validation_old/NEON/Threshold.cpp
@@ -21,16 +21,16 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "dataset/ThresholdDataset.h"
-#include "validation/Datasets.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/dataset/ThresholdDataset.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -38,7 +38,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/validation/NEON/WarpPerspective.cpp b/tests/validation_old/NEON/WarpPerspective.cpp
similarity index 95%
rename from tests/validation/NEON/WarpPerspective.cpp
rename to tests/validation_old/NEON/WarpPerspective.cpp
index 2c102ea..5a15591 100644
--- a/tests/validation/NEON/WarpPerspective.cpp
+++ b/tests/validation_old/NEON/WarpPerspective.cpp
@@ -21,17 +21,17 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "NEON/Accessor.h"
 #include "PaddingCalculator.h"
 #include "TypePrinter.h"
 #include "Utils.h"
-#include "validation/Datasets.h"
-#include "validation/Helpers.h"
-#include "validation/Reference.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Datasets.h"
+#include "tests/validation_old/Helpers.h"
+#include "tests/validation_old/Reference.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/core/Types.h"
@@ -39,7 +39,7 @@
 #include "arm_compute/runtime/Tensor.h"
 #include "arm_compute/runtime/TensorAllocator.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <random>
 #include <string>
diff --git a/tests/ProgramOptions.cpp b/tests/validation_old/ProgramOptions.cpp
similarity index 100%
rename from tests/ProgramOptions.cpp
rename to tests/validation_old/ProgramOptions.cpp
diff --git a/tests/ProgramOptions.h b/tests/validation_old/ProgramOptions.h
similarity index 100%
rename from tests/ProgramOptions.h
rename to tests/validation_old/ProgramOptions.h
diff --git a/tests/validation_old/RawTensor.cpp b/tests/validation_old/RawTensor.cpp
new file mode 100644
index 0000000..bc2747d
--- /dev/null
+++ b/tests/validation_old/RawTensor.cpp
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "RawTensor.h"
+
+namespace arm_compute
+{
+namespace test
+{
+RawTensor::RawTensor(TensorShape shape, Format format, int fixed_point_position)
+    : SimpleTensor(shape, format, fixed_point_position)
+{
+    _buffer = support::cpp14::make_unique<uint8_t[]>(SimpleTensor::num_elements() * SimpleTensor::num_channels() * SimpleTensor::element_size());
+}
+
+RawTensor::RawTensor(TensorShape shape, DataType data_type, int num_channels, int fixed_point_position)
+    : SimpleTensor(shape, data_type, num_channels, fixed_point_position)
+{
+    _buffer = support::cpp14::make_unique<uint8_t[]>(SimpleTensor::num_elements() * SimpleTensor::num_channels() * SimpleTensor::element_size());
+}
+
+RawTensor::RawTensor(const RawTensor &tensor)
+    : SimpleTensor(tensor.shape(), tensor.data_type(), tensor.num_channels(), tensor.fixed_point_position())
+{
+    _format = tensor.format();
+    _buffer = support::cpp14::make_unique<uint8_t[]>(num_elements() * num_channels() * element_size());
+    std::copy_n(tensor.data(), num_elements() * num_channels() * element_size(), _buffer.get());
+}
+
+RawTensor &RawTensor::operator=(RawTensor tensor)
+{
+    swap(*this, tensor);
+
+    return *this;
+}
+
+const void *RawTensor::operator()(const Coordinates &coord) const
+{
+    return _buffer.get() + coord2index(_shape, coord) * element_size();
+}
+
+void *RawTensor::operator()(const Coordinates &coord)
+{
+    return _buffer.get() + coord2index(_shape, coord) * element_size();
+}
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/validation_old/RawTensor.h b/tests/validation_old/RawTensor.h
new file mode 100644
index 0000000..fd0ab2b
--- /dev/null
+++ b/tests/validation_old/RawTensor.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __ARM_COMPUTE_TEST_RAW_TENSOR_H__
+#define __ARM_COMPUTE_TEST_RAW_TENSOR_H__
+
+#include "tests/SimpleTensor.h"
+
+namespace arm_compute
+{
+namespace test
+{
+/** Subclass of SimpleTensor using uint8_t as value type.
+ *
+ * Access operations (except for operator[]) will be based on the data type to
+ * copy the right number of elements.
+ */
+class RawTensor : public SimpleTensor<uint8_t>
+{
+public:
+    /** Create an uninitialised tensor of the given @p shape and @p format.
+     *
+     * @param[in] shape                Shape of the new raw tensor.
+     * @param[in] format               Format of the new raw tensor.
+     * @param[in] fixed_point_position (Optional) Number of bits for the fractional part of the fixed point numbers
+     */
+    RawTensor(TensorShape shape, Format format, int fixed_point_position = 0);
+
+    /** Create an uninitialised tensor of the given @p shape and @p data type.
+     *
+     * @param[in] shape                Shape of the new raw tensor.
+     * @param[in] data_type            Data type of the new raw tensor.
+     * @param[in] num_channels         (Optional) Number of channels (default = 1).
+     * @param[in] fixed_point_position (Optional) Number of bits for the fractional part of the fixed point numbers (default = 0).
+     */
+    RawTensor(TensorShape shape, DataType data_type, int num_channels = 1, int fixed_point_position = 0);
+
+    /** Create a deep copy of the given @p tensor.
+     *
+     * @param[in] tensor To be copied tensor.
+     */
+    RawTensor(const RawTensor &tensor);
+
+    RawTensor &operator     =(RawTensor tensor);
+    RawTensor(RawTensor &&) = default;
+    ~RawTensor()            = default;
+
+    /** Read only access to the specified element.
+     *
+     * @param[in] coord Coordinates of the desired element.
+     *
+     * @return A pointer to the desired element.
+     */
+    const void *operator()(const Coordinates &coord) const override;
+
+    /** Access to the specified element.
+     *
+     * @param[in] coord Coordinates of the desired element.
+     *
+     * @return A pointer to the desired element.
+     */
+    void *operator()(const Coordinates &coord) override;
+};
+} // namespace test
+} // namespace arm_compute
+#endif /* __ARM_COMPUTE_TEST_RAW_TENSOR_H__ */
diff --git a/tests/validation/Reference.cpp b/tests/validation_old/Reference.cpp
similarity index 99%
rename from tests/validation/Reference.cpp
rename to tests/validation_old/Reference.cpp
index a621fea..9099820 100644
--- a/tests/validation/Reference.cpp
+++ b/tests/validation_old/Reference.cpp
@@ -23,11 +23,11 @@
  */
 #include "Reference.h"
 
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "Helpers.h"
 #include "ReferenceCPP.h"
-#include "validation/Helpers.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/validation_old/Helpers.h"
 
 #include <random>
 #include <vector>
diff --git a/tests/validation/Reference.h b/tests/validation_old/Reference.h
similarity index 100%
rename from tests/validation/Reference.h
rename to tests/validation_old/Reference.h
diff --git a/tests/validation/ReferenceCPP.cpp b/tests/validation_old/ReferenceCPP.cpp
similarity index 99%
rename from tests/validation/ReferenceCPP.cpp
rename to tests/validation_old/ReferenceCPP.cpp
index 029f658..31c170a 100644
--- a/tests/validation/ReferenceCPP.cpp
+++ b/tests/validation_old/ReferenceCPP.cpp
@@ -34,7 +34,7 @@
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/runtime/Tensor.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <algorithm>
 #include <functional>
diff --git a/tests/validation/ReferenceCPP.h b/tests/validation_old/ReferenceCPP.h
similarity index 100%
rename from tests/validation/ReferenceCPP.h
rename to tests/validation_old/ReferenceCPP.h
diff --git a/tests/validation_old/SConscript b/tests/validation_old/SConscript
new file mode 100644
index 0000000..fdf8e7f
--- /dev/null
+++ b/tests/validation_old/SConscript
@@ -0,0 +1,119 @@
+# Copyright (c) 2017 ARM Limited.
+#
+# SPDX-License-Identifier: MIT
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+import SCons
+import os.path
+
+Import('env')
+Import('vars')
+
+# vars is imported from arm_compute:
+variables = [
+    #FIXME: Remove before release!
+    BoolVariable("openvx", "Enable OpenVX support in tests", False),
+    BoolVariable("openblas", "Enable OpenBLAS support in tests", False),
+    #FIXME Remove before release (And remove all references to INTERNAL_ONLY)
+    BoolVariable("internal_only", "Enable ARM internal only tests", True),
+    BoolVariable("pmu", "Enable PMU counters", False),
+    BoolVariable("validation_tests", "Build validation test programs", True),
+    BoolVariable("benchmark_tests", "Build benchmark test programs", True)
+]
+
+# We need a separate set of Variables for the Help message (Otherwise the global variables will get displayed twice)
+new_options = Variables('scons')
+
+for v in variables:
+    new_options.Add(v)
+    vars.Add(v)
+
+# Clone the environment to make sure we're not polluting the arm_compute one:
+old_validation_env = env.Clone()
+vars.Update(old_validation_env)
+
+Help(new_options.GenerateHelpText(old_validation_env))
+
+if old_validation_env['openblas']:
+    if env['os'] == 'bare_metal':
+        print("OpenBLAS is not supported on bare metal")
+        Exit(1)
+    old_validation_env.Append(CPPDEFINES = ['USE_OPENBLAS'])
+    old_validation_env.Append(LIBS = ['openblas', 'pthread'])
+
+if env['os'] in ['android', 'bare_metal'] or env['standalone']:
+    Import('arm_compute_a')
+    old_validation_env.Append(LIBS = [arm_compute_a])
+    arm_compute_lib = arm_compute_a
+else:
+    Import('arm_compute_so')
+    old_validation_env.Append(LIBS = ["arm_compute"])
+    arm_compute_lib = arm_compute_so
+
+#FIXME Delete before release
+if old_validation_env['internal_only']:
+    old_validation_env.Append(CPPDEFINES=['INTERNAL_ONLY'])
+
+old_validation_env.Append(CPPPATH = [".", "#tests", "#3rdparty/include"])
+old_validation_env.Append(LIBPATH = ["#3rdparty/%s/%s" % (env['os'], env['arch'])])
+old_validation_env.Append(LIBPATH = ["#build/%s" % env['build_dir']])
+old_validation_env.Append(LIBPATH = ["#build/%s/opencl-1.2-stubs" % env['build_dir']])
+old_validation_env.Append(LIBS = ['boost_program_options'])
+old_validation_env.Append(CXXFLAGS = ['-Wno-missing-field-initializers'])
+old_validation_env.Append(CPPDEFINES=['BOOST'])
+old_validation_env.Append(LIBS = ['boost_unit_test_framework'])
+
+old_files_validation = Glob('*.cpp')
+
+# Add unit tests
+old_files_validation += Glob('UNIT/*.cpp')
+old_files_validation += Glob('UNIT/*/*.cpp')
+
+if env['opencl']:
+    Import('opencl')
+
+    old_files_validation += Glob('CL/*.cpp')
+    old_files_validation += Glob('CL/*/*.cpp')
+    old_files_validation += Glob('system_tests/CL/*.cpp')
+
+    old_validation_env.Append(LIBS = "OpenCL")
+    old_validation_env.Append(CPPDEFINES=['ARM_COMPUTE_CL'])
+
+#FIXME Remove before release
+if old_validation_env['openvx']:
+    old_files_validation += Glob('VX/*.cpp')
+    old_files_validation += Glob('VX/*/*.cpp')
+
+    old_validation_env.Append(LIBS = ['openvx', 'vxu'])
+
+if env['neon']:
+    old_files_validation += Glob('NEON/*.cpp')
+    old_files_validation += Glob('NEON/*/*.cpp')
+    old_files_validation += Glob('system_tests/NEON/*.cpp')
+
+if env['os'] == 'android':
+    old_validation_env.Append(LIBS = ["log"])
+
+if old_validation_env['validation_tests']:
+    arm_compute_validation_old = old_validation_env.Program('arm_compute_validation_old', old_files_validation)
+    Depends(arm_compute_validation_old, arm_compute_lib)
+    if env['opencl']:
+        Depends(arm_compute_validation_old, opencl)
+    Default(arm_compute_validation_old)
+    Export('arm_compute_validation_old')
diff --git a/tests/validation/Tensor.h b/tests/validation_old/Tensor.h
similarity index 100%
rename from tests/validation/Tensor.h
rename to tests/validation_old/Tensor.h
diff --git a/tests/validation/TensorFactory.h b/tests/validation_old/TensorFactory.h
similarity index 97%
rename from tests/validation/TensorFactory.h
rename to tests/validation_old/TensorFactory.h
index a3bb5f9..3f5b960 100644
--- a/tests/validation/TensorFactory.h
+++ b/tests/validation_old/TensorFactory.h
@@ -26,10 +26,10 @@
 
 #include "arm_compute/core/Error.h"
 #include "tests/RawTensor.h"
-#include "tests/validation/Tensor.h"
-#include "tests/validation/half.h"
+#include "tests/validation_old/Tensor.h"
+#include "tests/validation_old/half.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation/TensorOperations.h b/tests/validation_old/TensorOperations.h
similarity index 99%
rename from tests/validation/TensorOperations.h
rename to tests/validation_old/TensorOperations.h
index b9ffa49..48661bb 100644
--- a/tests/validation/TensorOperations.h
+++ b/tests/validation_old/TensorOperations.h
@@ -30,10 +30,10 @@
 #include "support/ToolchainSupport.h"
 #include "tests/Types.h"
 #include "tests/Utils.h"
-#include "tests/validation/FixedPoint.h"
-#include "tests/validation/Tensor.h"
-#include "tests/validation/ValidationUserConfiguration.h"
-#include "tests/validation/half.h"
+#include "tests/validation_old/FixedPoint.h"
+#include "tests/validation_old/Tensor.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
+#include "tests/validation_old/half.h"
 
 #include <algorithm>
 #include <array>
diff --git a/tests/validation/TensorVisitors.h b/tests/validation_old/TensorVisitors.h
similarity index 99%
rename from tests/validation/TensorVisitors.h
rename to tests/validation_old/TensorVisitors.h
index a15d2ad..6e5f8c3 100644
--- a/tests/validation/TensorVisitors.h
+++ b/tests/validation_old/TensorVisitors.h
@@ -30,7 +30,7 @@
 #include "arm_compute/core/Helpers.h"
 #include "arm_compute/runtime/Lut.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <algorithm>
 #include <map>
diff --git a/tests/validation/UNIT/FixedPoint.cpp b/tests/validation_old/UNIT/FixedPoint.cpp
similarity index 96%
rename from tests/validation/UNIT/FixedPoint.cpp
rename to tests/validation_old/UNIT/FixedPoint.cpp
index 00cab9e..53fef97 100644
--- a/tests/validation/UNIT/FixedPoint.cpp
+++ b/tests/validation_old/UNIT/FixedPoint.cpp
@@ -21,15 +21,15 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "validation/FixedPoint.h"
+#include "tests/validation_old/FixedPoint.h"
 
 #include "TypePrinter.h"
 #include "Utils.h"
 #include "support/ToolchainSupport.h"
-#include "validation/Validation.h"
-#include "validation/ValidationUserConfiguration.h"
+#include "tests/validation_old/Validation.h"
+#include "tests/validation_old/ValidationUserConfiguration.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <fstream>
 #include <vector>
diff --git a/tests/validation/UNIT/TensorInfo.cpp b/tests/validation_old/UNIT/TensorInfo.cpp
similarity index 97%
rename from tests/validation/UNIT/TensorInfo.cpp
rename to tests/validation_old/UNIT/TensorInfo.cpp
index c74cfeb..f2a3acf 100644
--- a/tests/validation/UNIT/TensorInfo.cpp
+++ b/tests/validation_old/UNIT/TensorInfo.cpp
@@ -22,12 +22,12 @@
  * SOFTWARE.
  */
 #include "TypePrinter.h"
-#include "validation/Validation.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/TensorInfo.h"
 #include "arm_compute/core/Types.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 using namespace arm_compute;
 using namespace arm_compute::test;
diff --git a/tests/validation/UNIT/TensorShape.cpp b/tests/validation_old/UNIT/TensorShape.cpp
similarity index 96%
rename from tests/validation/UNIT/TensorShape.cpp
rename to tests/validation_old/UNIT/TensorShape.cpp
index 4c1ef68..dc75b93 100644
--- a/tests/validation/UNIT/TensorShape.cpp
+++ b/tests/validation_old/UNIT/TensorShape.cpp
@@ -22,11 +22,11 @@
  * SOFTWARE.
  */
 #include "TypePrinter.h"
-#include "validation/Validation.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/core/TensorShape.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 using namespace arm_compute;
 using namespace arm_compute::test;
diff --git a/tests/validation/UNIT/Utils.cpp b/tests/validation_old/UNIT/Utils.cpp
similarity index 97%
rename from tests/validation/UNIT/Utils.cpp
rename to tests/validation_old/UNIT/Utils.cpp
index e28ca19..b302bf2 100644
--- a/tests/validation/UNIT/Utils.cpp
+++ b/tests/validation_old/UNIT/Utils.cpp
@@ -24,9 +24,9 @@
 #include "Utils.h"
 
 #include "TypePrinter.h"
-#include "validation/Validation.h"
+#include "tests/validation_old/Validation.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <stdexcept>
 
diff --git a/tests/UserConfiguration.cpp b/tests/validation_old/UserConfiguration.cpp
similarity index 100%
rename from tests/UserConfiguration.cpp
rename to tests/validation_old/UserConfiguration.cpp
diff --git a/tests/UserConfiguration.h b/tests/validation_old/UserConfiguration.h
similarity index 100%
rename from tests/UserConfiguration.h
rename to tests/validation_old/UserConfiguration.h
diff --git a/tests/validation_old/Validation.cpp b/tests/validation_old/Validation.cpp
new file mode 100644
index 0000000..8f173ba
--- /dev/null
+++ b/tests/validation_old/Validation.cpp
@@ -0,0 +1,477 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "Validation.h"
+
+#include "arm_compute/core/Coordinates.h"
+#include "arm_compute/core/Error.h"
+#include "arm_compute/core/FixedPoint.h"
+#include "arm_compute/core/IArray.h"
+#include "arm_compute/core/TensorShape.h"
+#include "arm_compute/runtime/Tensor.h"
+#include "tests/IAccessor.h"
+#include "tests/RawTensor.h"
+#include "tests/TypePrinter.h"
+#include "tests/Utils.h"
+#include "tests/validation_old/half.h"
+
+#include <array>
+#include <cmath>
+#include <cstddef>
+#include <cstdint>
+#include <iomanip>
+#include <vector>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+namespace
+{
+/** Get the data from *ptr after casting according to @p data_type and then convert the data to double.
+ *
+ * @param[in] ptr       Pointer to value.
+ * @param[in] data_type Data type of both values.
+ *
+ * @return The data from the ptr after converted to double.
+ */
+double get_double_data(const void *ptr, DataType data_type)
+{
+    if(ptr == nullptr)
+    {
+        ARM_COMPUTE_ERROR("Can't dereference a null pointer!");
+    }
+
+    switch(data_type)
+    {
+        case DataType::U8:
+            return *reinterpret_cast<const uint8_t *>(ptr);
+        case DataType::S8:
+            return *reinterpret_cast<const int8_t *>(ptr);
+        case DataType::QS8:
+            return *reinterpret_cast<const qint8_t *>(ptr);
+        case DataType::U16:
+            return *reinterpret_cast<const uint16_t *>(ptr);
+        case DataType::S16:
+            return *reinterpret_cast<const int16_t *>(ptr);
+        case DataType::QS16:
+            return *reinterpret_cast<const qint16_t *>(ptr);
+        case DataType::U32:
+            return *reinterpret_cast<const uint32_t *>(ptr);
+        case DataType::S32:
+            return *reinterpret_cast<const int32_t *>(ptr);
+        case DataType::U64:
+            return *reinterpret_cast<const uint64_t *>(ptr);
+        case DataType::S64:
+            return *reinterpret_cast<const int64_t *>(ptr);
+        case DataType::F16:
+            return *reinterpret_cast<const half_float::half *>(ptr);
+        case DataType::F32:
+            return *reinterpret_cast<const float *>(ptr);
+        case DataType::F64:
+            return *reinterpret_cast<const double *>(ptr);
+        case DataType::SIZET:
+            return *reinterpret_cast<const size_t *>(ptr);
+        default:
+            ARM_COMPUTE_ERROR("NOT SUPPORTED!");
+    }
+}
+
+bool is_equal(double target, double ref, double max_absolute_error = std::numeric_limits<double>::epsilon(), double max_relative_error = 0.0001f)
+{
+    if(!std::isfinite(target) || !std::isfinite(ref))
+    {
+        return false;
+    }
+
+    // No need further check if they are equal
+    if(ref == target)
+    {
+        return true;
+    }
+
+    // Need this check for the situation when the two values close to zero but have different sign
+    if(std::abs(std::abs(ref) - std::abs(target)) <= max_absolute_error)
+    {
+        return true;
+    }
+
+    double relative_error = 0;
+
+    if(std::abs(target) > std::abs(ref))
+    {
+        relative_error = std::abs((target - ref) / target);
+    }
+    else
+    {
+        relative_error = std::abs((ref - target) / ref);
+    }
+
+    return relative_error <= max_relative_error;
+}
+
+void check_border_element(const IAccessor &tensor, const Coordinates &id,
+                          const BorderMode &border_mode, const void *border_value,
+                          int64_t &num_elements, int64_t &num_mismatches)
+{
+    const size_t channel_size = element_size_from_data_type(tensor.data_type());
+    const auto   ptr          = static_cast<const uint8_t *>(tensor(id));
+
+    if(border_mode == BorderMode::REPLICATE)
+    {
+        Coordinates border_id{ id };
+        border_id.set(1, 0);
+        border_value = tensor(border_id);
+    }
+
+    // Iterate over all channels within one element
+    for(int channel = 0; channel < tensor.num_channels(); ++channel)
+    {
+        const size_t channel_offset = channel * channel_size;
+        const double target         = get_double_data(ptr + channel_offset, tensor.data_type());
+        const double ref            = get_double_data(static_cast<const uint8_t *>(border_value) + channel_offset, tensor.data_type());
+        const bool   equal          = is_equal(target, ref);
+
+        BOOST_TEST_INFO("id = " << id);
+        BOOST_TEST_INFO("channel = " << channel);
+        BOOST_TEST_INFO("reference = " << std::setprecision(5) << ref);
+        BOOST_TEST_INFO("target = " << std::setprecision(5) << target);
+        BOOST_TEST_WARN(equal);
+
+        if(!equal)
+        {
+            ++num_mismatches;
+        }
+
+        ++num_elements;
+    }
+}
+
+void check_single_element(const Coordinates &id, const IAccessor &tensor, const RawTensor &reference, float tolerance_value,
+                          uint64_t wrap_range, int min_channels, size_t channel_size, int64_t &num_mismatches, int64_t &num_elements)
+{
+    const auto ptr     = static_cast<const uint8_t *>(tensor(id));
+    const auto ref_ptr = static_cast<const uint8_t *>(reference(id));
+
+    // Iterate over all channels within one element
+    for(int channel = 0; channel < min_channels; ++channel)
+    {
+        const size_t channel_offset = channel * channel_size;
+        const double target         = get_double_data(ptr + channel_offset, reference.data_type());
+        const double ref            = get_double_data(ref_ptr + channel_offset, reference.data_type());
+        bool         equal          = is_equal(target, ref, tolerance_value);
+
+        if(wrap_range != 0 && !equal)
+        {
+            equal = is_equal(target, ref, wrap_range - tolerance_value);
+        }
+
+        if(!equal)
+        {
+            BOOST_TEST_INFO("id = " << id);
+            BOOST_TEST_INFO("channel = " << channel);
+            BOOST_TEST_INFO("reference = " << std::setprecision(5) << ref);
+            BOOST_TEST_INFO("target = " << std::setprecision(5) << target);
+            BOOST_TEST_WARN(equal);
+            ++num_mismatches;
+        }
+        ++num_elements;
+    }
+}
+} // namespace
+
+void validate(const arm_compute::ValidRegion &region, const arm_compute::ValidRegion &reference)
+{
+    BOOST_TEST(region.anchor.num_dimensions() == reference.anchor.num_dimensions());
+    BOOST_TEST(region.shape.num_dimensions() == reference.shape.num_dimensions());
+
+    for(unsigned int d = 0; d < region.anchor.num_dimensions(); ++d)
+    {
+        BOOST_TEST(region.anchor[d] == reference.anchor[d]);
+    }
+
+    for(unsigned int d = 0; d < region.shape.num_dimensions(); ++d)
+    {
+        BOOST_TEST(region.shape[d] == reference.shape[d]);
+    }
+}
+
+void validate(const arm_compute::PaddingSize &padding, const arm_compute::PaddingSize &reference)
+{
+    BOOST_TEST(padding.top == reference.top);
+    BOOST_TEST(padding.right == reference.right);
+    BOOST_TEST(padding.bottom == reference.bottom);
+    BOOST_TEST(padding.left == reference.left);
+}
+
+void validate(const IAccessor &tensor, const RawTensor &reference, float tolerance_value, float tolerance_number, uint64_t wrap_range)
+{
+    // Validate with valid region covering the entire shape
+    validate(tensor, reference, shape_to_valid_region(tensor.shape()), tolerance_value, tolerance_number, wrap_range);
+}
+
+void validate(const IAccessor &tensor, const RawTensor &reference, const ValidRegion &valid_region, float tolerance_value, float tolerance_number, uint64_t wrap_range)
+{
+    int64_t num_mismatches = 0;
+    int64_t num_elements   = 0;
+
+    BOOST_TEST(tensor.element_size() == reference.element_size());
+    BOOST_TEST(tensor.format() == reference.format());
+    BOOST_TEST(tensor.data_type() == reference.data_type());
+    BOOST_TEST(tensor.num_channels() == reference.num_channels());
+    BOOST_TEST(compare_dimensions(tensor.shape(), reference.shape()));
+
+    const int    min_elements = std::min(tensor.num_elements(), reference.num_elements());
+    const int    min_channels = std::min(tensor.num_channels(), reference.num_channels());
+    const size_t channel_size = element_size_from_data_type(reference.data_type());
+
+    // Iterate over all elements within valid region, e.g. U8, S16, RGB888, ...
+    for(int element_idx = 0; element_idx < min_elements; ++element_idx)
+    {
+        const Coordinates id = index2coord(reference.shape(), element_idx);
+        if(is_in_valid_region(valid_region, id))
+        {
+            check_single_element(id, tensor, reference, tolerance_value, wrap_range, min_channels, channel_size, num_mismatches, num_elements);
+        }
+    }
+
+    const int64_t absolute_tolerance_number = tolerance_number * num_elements;
+    const float   percent_mismatches        = static_cast<float>(num_mismatches) / num_elements * 100.f;
+
+    BOOST_TEST(num_mismatches <= absolute_tolerance_number,
+               num_mismatches << " values (" << std::setprecision(2) << percent_mismatches
+               << "%) mismatched (maximum tolerated " << std::setprecision(2) << tolerance_number << "%)");
+}
+
+void validate(const IAccessor &tensor, const RawTensor &reference, const RawTensor &valid_mask, float tolerance_value, float tolerance_number, uint64_t wrap_range)
+{
+    int64_t num_mismatches = 0;
+    int64_t num_elements   = 0;
+
+    BOOST_TEST(tensor.element_size() == reference.element_size());
+    BOOST_TEST(tensor.format() == reference.format());
+    BOOST_TEST(tensor.data_type() == reference.data_type());
+    BOOST_TEST(tensor.num_channels() == reference.num_channels());
+    BOOST_TEST(compare_dimensions(tensor.shape(), reference.shape()));
+
+    const int    min_elements = std::min(tensor.num_elements(), reference.num_elements());
+    const int    min_channels = std::min(tensor.num_channels(), reference.num_channels());
+    const size_t channel_size = element_size_from_data_type(reference.data_type());
+
+    // Iterate over all elements within valid region, e.g. U8, S16, RGB888, ...
+    for(int element_idx = 0; element_idx < min_elements; ++element_idx)
+    {
+        const Coordinates id = index2coord(reference.shape(), element_idx);
+        if(valid_mask[element_idx] == 1)
+        {
+            check_single_element(id, tensor, reference, tolerance_value, wrap_range, min_channels, channel_size, num_mismatches, num_elements);
+        }
+        else
+        {
+            ++num_elements;
+        }
+    }
+
+    const int64_t absolute_tolerance_number = tolerance_number * num_elements;
+    const float   percent_mismatches        = static_cast<float>(num_mismatches) / num_elements * 100.f;
+
+    BOOST_TEST(num_mismatches <= absolute_tolerance_number,
+               num_mismatches << " values (" << std::setprecision(2) << percent_mismatches
+               << "%) mismatched (maximum tolerated " << std::setprecision(2) << tolerance_number << "%)");
+}
+
+void validate(const IAccessor &tensor, const void *reference_value)
+{
+    BOOST_TEST_REQUIRE((reference_value != nullptr));
+
+    int64_t      num_mismatches = 0;
+    int64_t      num_elements   = 0;
+    const size_t channel_size   = element_size_from_data_type(tensor.data_type());
+
+    // Iterate over all elements, e.g. U8, S16, RGB888, ...
+    for(int element_idx = 0; element_idx < tensor.num_elements(); ++element_idx)
+    {
+        const Coordinates id = index2coord(tensor.shape(), element_idx);
+
+        const auto ptr = static_cast<const uint8_t *>(tensor(id));
+
+        // Iterate over all channels within one element
+        for(int channel = 0; channel < tensor.num_channels(); ++channel)
+        {
+            const size_t channel_offset = channel * channel_size;
+            const double target         = get_double_data(ptr + channel_offset, tensor.data_type());
+            const double ref            = get_double_data(reference_value, tensor.data_type());
+            const bool   equal          = is_equal(target, ref);
+
+            BOOST_TEST_INFO("id = " << id);
+            BOOST_TEST_INFO("channel = " << channel);
+            BOOST_TEST_INFO("reference = " << std::setprecision(5) << ref);
+            BOOST_TEST_INFO("target = " << std::setprecision(5) << target);
+            BOOST_TEST_WARN(equal);
+
+            if(!equal)
+            {
+                ++num_mismatches;
+            }
+
+            ++num_elements;
+        }
+    }
+
+    const float percent_mismatches = static_cast<float>(num_mismatches) / num_elements * 100.f;
+
+    BOOST_TEST(num_mismatches == 0,
+               num_mismatches << " values (" << std::setprecision(2) << percent_mismatches << "%) mismatched");
+}
+
+void validate(const IAccessor &tensor, BorderSize border_size, const BorderMode &border_mode, const void *border_value)
+{
+    if(border_mode == BorderMode::UNDEFINED)
+    {
+        return;
+    }
+    else if(border_mode == BorderMode::CONSTANT)
+    {
+        BOOST_TEST((border_value != nullptr));
+    }
+
+    int64_t   num_mismatches = 0;
+    int64_t   num_elements   = 0;
+    const int slice_size     = tensor.shape()[0] * tensor.shape()[1];
+
+    for(int element_idx = 0; element_idx < tensor.num_elements(); element_idx += slice_size)
+    {
+        Coordinates id = index2coord(tensor.shape(), element_idx);
+
+        // Top border
+        for(int y = -border_size.top; y < 0; ++y)
+        {
+            id.set(1, y);
+
+            for(int x = -border_size.left; x < static_cast<int>(tensor.shape()[0]) + static_cast<int>(border_size.right); ++x)
+            {
+                id.set(0, x);
+
+                check_border_element(tensor, id, border_mode, border_value, num_elements, num_mismatches);
+            }
+        }
+
+        // Bottom border
+        for(int y = tensor.shape()[1]; y < static_cast<int>(tensor.shape()[1]) + static_cast<int>(border_size.bottom); ++y)
+        {
+            id.set(1, y);
+
+            for(int x = -border_size.left; x < static_cast<int>(tensor.shape()[0]) + static_cast<int>(border_size.right); ++x)
+            {
+                id.set(0, x);
+
+                check_border_element(tensor, id, border_mode, border_value, num_elements, num_mismatches);
+            }
+        }
+
+        // Left/right border
+        for(int y = 0; y < static_cast<int>(tensor.shape()[1]); ++y)
+        {
+            id.set(1, y);
+
+            // Left border
+            for(int x = -border_size.left; x < 0; ++x)
+            {
+                id.set(0, x);
+
+                check_border_element(tensor, id, border_mode, border_value, num_elements, num_mismatches);
+            }
+
+            // Right border
+            for(int x = tensor.shape()[0]; x < static_cast<int>(tensor.shape()[0]) + static_cast<int>(border_size.right); ++x)
+            {
+                id.set(0, x);
+
+                check_border_element(tensor, id, border_mode, border_value, num_elements, num_mismatches);
+            }
+        }
+    }
+
+    const float percent_mismatches = static_cast<float>(num_mismatches) / num_elements * 100.f;
+
+    BOOST_TEST(num_mismatches == 0,
+               num_mismatches << " values (" << std::setprecision(2) << percent_mismatches << "%) mismatched");
+}
+
+void validate(std::vector<unsigned int> classified_labels, std::vector<unsigned int> expected_labels)
+{
+    ARM_COMPUTE_UNUSED(classified_labels);
+    ARM_COMPUTE_UNUSED(expected_labels);
+    BOOST_TEST(expected_labels.size() != 0);
+    BOOST_TEST(classified_labels.size() == expected_labels.size());
+
+    for(unsigned int i = 0; i < expected_labels.size(); ++i)
+    {
+        BOOST_TEST(classified_labels[i] == expected_labels[i]);
+    }
+}
+
+void validate(float target, float ref, float tolerance_abs_error, float tolerance_relative_error)
+{
+    const bool equal = is_equal(target, ref, tolerance_abs_error, tolerance_relative_error);
+
+    BOOST_TEST_INFO("reference = " << std::setprecision(5) << ref);
+    BOOST_TEST_INFO("target = " << std::setprecision(5) << target);
+    BOOST_TEST(equal);
+}
+
+void validate(IArray<KeyPoint> &target, IArray<KeyPoint> &ref, int64_t tolerance)
+{
+    int64_t num_mismatches = 0;
+
+    BOOST_TEST_WARN(target.num_values() == ref.num_values());
+
+    for(size_t i = 0; i < target.num_values(); ++i)
+    {
+        KeyPoint *ref_val = std::find_if(ref.buffer(), ref.buffer() + ref.num_values(), [&target, i](KeyPoint key)
+        {
+            return key.x == target.at(i).x && key.y == target.at(i).y;
+        });
+
+        const KeyPoint &key = target.at(i);
+
+        if((ref_val == ref.buffer() + ref.num_values()) || !(is_equal(key.strength, ref_val->strength) && is_equal(key.scale, ref_val->scale) && is_equal(key.orientation, ref_val->orientation)
+                                                             && is_equal(key.tracking_status, ref_val->tracking_status) && is_equal(key.error, ref_val->error)))
+        {
+            ++num_mismatches;
+
+            BOOST_TEST_WARN(is_equal(key.strength, ref_val->strength));
+            BOOST_TEST_WARN(is_equal(key.scale, ref_val->scale));
+            BOOST_TEST_WARN(is_equal(key.orientation, ref_val->orientation));
+            BOOST_TEST_WARN(is_equal(key.tracking_status, ref_val->tracking_status));
+            BOOST_TEST_WARN(is_equal(key.error, ref_val->error));
+        }
+    }
+
+    BOOST_TEST(num_mismatches <= tolerance);
+}
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/validation_old/Validation.h b/tests/validation_old/Validation.h
new file mode 100644
index 0000000..4c8752b
--- /dev/null
+++ b/tests/validation_old/Validation.h
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __ARM_COMPUTE_TEST_REFERENCE_VALIDATION_H__
+#define __ARM_COMPUTE_TEST_REFERENCE_VALIDATION_H__
+
+#include "arm_compute/core/Types.h"
+#include "arm_compute/runtime/Array.h"
+#include "tests/RawTensor.h"
+
+#include "tests/validation_old/boost_wrapper.h"
+
+#include <vector>
+
+namespace arm_compute
+{
+class Tensor;
+
+namespace test
+{
+class IAccessor;
+
+namespace validation
+{
+template <typename T>
+boost::test_tools::predicate_result compare_dimensions(const Dimensions<T> &dimensions1, const Dimensions<T> &dimensions2)
+{
+    if(dimensions1.num_dimensions() != dimensions2.num_dimensions())
+    {
+        boost::test_tools::predicate_result result(false);
+        result.message() << "Different dimensionality [" << dimensions1.num_dimensions() << "!=" << dimensions2.num_dimensions() << "]";
+        return result;
+    }
+
+    for(unsigned int i = 0; i < dimensions1.num_dimensions(); ++i)
+    {
+        if(dimensions1[i] != dimensions2[i])
+        {
+            boost::test_tools::predicate_result result(false);
+            result.message() << "Mismatch in dimension " << i << " [" << dimensions1[i] << "!=" << dimensions2[i] << "]";
+            return result;
+        }
+    }
+
+    return true;
+}
+
+/** Validate valid regions.
+ *
+ * - Dimensionality has to be the same.
+ * - Anchors have to match.
+ * - Shapes have to match.
+ */
+void validate(const arm_compute::ValidRegion &region, const arm_compute::ValidRegion &reference);
+
+/** Validate padding.
+ *
+ * Padding on all sides has to be the same.
+ */
+void validate(const arm_compute::PaddingSize &padding, const arm_compute::PaddingSize &reference);
+
+/** Validate tensors.
+ *
+ * - Dimensionality has to be the same.
+ * - All values have to match.
+ *
+ * @note: wrap_range allows cases where reference tensor rounds up to the wrapping point, causing it to wrap around to
+ * zero while the test tensor stays at wrapping point to pass. This may permit true erroneous cases (difference between
+ * reference tensor and test tensor is multiple of wrap_range), but such errors would be detected by
+ * other test cases.
+ */
+void validate(const IAccessor &tensor, const RawTensor &reference, float tolerance_value = 0.f, float tolerance_number = 0.f, uint64_t wrap_range = 0);
+
+/** Validate tensors with valid region.
+ *
+ * - Dimensionality has to be the same.
+ * - All values have to match.
+ *
+ * @note: wrap_range allows cases where reference tensor rounds up to the wrapping point, causing it to wrap around to
+ * zero while the test tensor stays at wrapping point to pass. This may permit true erroneous cases (difference between
+ * reference tensor and test tensor is multiple of wrap_range), but such errors would be detected by
+ * other test cases.
+ */
+void validate(const IAccessor &tensor, const RawTensor &reference, const ValidRegion &valid_region, float tolerance_value = 0.f, float tolerance_number = 0.f, uint64_t wrap_range = 0);
+
+/** Validate tensors with valid mask.
+ *
+ * - Dimensionality has to be the same.
+ * - All values have to match.
+ *
+ * @note: wrap_range allows cases where reference tensor rounds up to the wrapping point, causing it to wrap around to
+ * zero while the test tensor stays at wrapping point to pass. This may permit true erroneous cases (difference between
+ * reference tensor and test tensor is multiple of wrap_range), but such errors would be detected by
+ * other test cases.
+ */
+void validate(const IAccessor &tensor, const RawTensor &reference, const RawTensor &valid_mask, float tolerance_value = 0.f, float tolerance_number = 0.f, uint64_t wrap_range = 0);
+
+/** Validate tensors against constant value.
+ *
+ * - All values have to match.
+ */
+void validate(const IAccessor &tensor, const void *reference_value);
+
+/** Validate border against a constant value.
+ *
+ * - All border values have to match the specified value if mode is CONSTANT.
+ * - All border values have to be replicated if mode is REPLICATE.
+ * - Nothing is validated for mode UNDEFINED.
+ */
+void validate(const IAccessor &tensor, BorderSize border_size, const BorderMode &border_mode, const void *border_value);
+
+/** Validate classified labels against expected ones.
+ *
+ * - All values should match
+ */
+void validate(std::vector<unsigned int> classified_labels, std::vector<unsigned int> expected_labels);
+
+/** Validate float value.
+ *
+ * - All values should match
+ */
+void validate(float target, float ref, float tolerance_abs_error = std::numeric_limits<float>::epsilon(), float tolerance_relative_error = 0.0001f);
+
+/** Validate min max location.
+ *
+ * - All values should match
+ */
+template <typename T>
+void validate_min_max_loc(T min, T ref_min, T max, T ref_max,
+                          IArray<Coordinates2D> &min_loc, IArray<Coordinates2D> &ref_min_loc, IArray<Coordinates2D> &max_loc, IArray<Coordinates2D> &ref_max_loc,
+                          uint32_t min_count, uint32_t ref_min_count, uint32_t max_count, uint32_t ref_max_count)
+{
+    BOOST_TEST(min == ref_min);
+    BOOST_TEST(max == ref_max);
+
+    BOOST_TEST(min_count == min_loc.num_values());
+    BOOST_TEST(max_count == max_loc.num_values());
+    BOOST_TEST(ref_min_count == ref_min_loc.num_values());
+    BOOST_TEST(ref_max_count == ref_max_loc.num_values());
+
+    BOOST_TEST(min_count == ref_min_count);
+    BOOST_TEST(max_count == ref_max_count);
+
+    for(uint32_t i = 0; i < min_count; i++)
+    {
+        Coordinates2D *same_coords = std::find_if(ref_min_loc.buffer(), ref_min_loc.buffer() + min_count, [&min_loc, i](Coordinates2D coord)
+        {
+            return coord.x == min_loc.at(i).x && coord.y == min_loc.at(i).y;
+        });
+
+        BOOST_TEST(same_coords != ref_min_loc.buffer() + min_count);
+    }
+
+    for(uint32_t i = 0; i < max_count; i++)
+    {
+        Coordinates2D *same_coords = std::find_if(ref_max_loc.buffer(), ref_max_loc.buffer() + max_count, [&max_loc, i](Coordinates2D coord)
+        {
+            return coord.x == max_loc.at(i).x && coord.y == max_loc.at(i).y;
+        });
+
+        BOOST_TEST(same_coords != ref_max_loc.buffer() + max_count);
+    }
+}
+
+/** Validate KeyPoint arrays.
+ *
+ * - All values should match
+ */
+void validate(IArray<KeyPoint> &target, IArray<KeyPoint> &ref, int64_t tolerance = 0);
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
+#endif /* __ARM_COMPUTE_TEST_REFERENCE_VALIDATION_H__ */
diff --git a/tests/validation/ValidationProgramOptions.cpp b/tests/validation_old/ValidationProgramOptions.cpp
similarity index 100%
rename from tests/validation/ValidationProgramOptions.cpp
rename to tests/validation_old/ValidationProgramOptions.cpp
diff --git a/tests/validation/ValidationProgramOptions.h b/tests/validation_old/ValidationProgramOptions.h
similarity index 100%
rename from tests/validation/ValidationProgramOptions.h
rename to tests/validation_old/ValidationProgramOptions.h
diff --git a/tests/validation/ValidationUserConfiguration.h b/tests/validation_old/ValidationUserConfiguration.h
similarity index 100%
rename from tests/validation/ValidationUserConfiguration.h
rename to tests/validation_old/ValidationUserConfiguration.h
diff --git a/tests/boost_wrapper.h b/tests/validation_old/boost_wrapper.h
similarity index 100%
rename from tests/boost_wrapper.h
rename to tests/validation_old/boost_wrapper.h
diff --git a/tests/dataset/ActivationFunctionDataset.h b/tests/validation_old/dataset/ActivationFunctionDataset.h
similarity index 95%
rename from tests/dataset/ActivationFunctionDataset.h
rename to tests/validation_old/dataset/ActivationFunctionDataset.h
index e6c1965..b72cffb 100644
--- a/tests/dataset/ActivationFunctionDataset.h
+++ b/tests/validation_old/dataset/ActivationFunctionDataset.h
@@ -25,10 +25,10 @@
 #define __ARM_COMPUTE_TEST_DATASET_ACTIVATION_FUNCTION_DATASET_H__
 
 #include "arm_compute/core/Types.h"
-#include "dataset/GenericDataset.h"
+#include "tests/validation_old/dataset/GenericDataset.h"
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/ActivationLayerDataset.h b/tests/validation_old/dataset/ActivationLayerDataset.h
similarity index 98%
rename from tests/dataset/ActivationLayerDataset.h
rename to tests/validation_old/dataset/ActivationLayerDataset.h
index ef6f382..ead52a2 100644
--- a/tests/dataset/ActivationLayerDataset.h
+++ b/tests/validation_old/dataset/ActivationLayerDataset.h
@@ -28,13 +28,13 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "dataset/GenericDataset.h"
+#include "tests/validation_old/dataset/GenericDataset.h"
 
 #include <sstream>
 #include <type_traits>
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/BatchNormalizationLayerDataset.h b/tests/validation_old/dataset/BatchNormalizationLayerDataset.h
similarity index 96%
rename from tests/dataset/BatchNormalizationLayerDataset.h
rename to tests/validation_old/dataset/BatchNormalizationLayerDataset.h
index f1ba212..ca1e3b6 100644
--- a/tests/dataset/BatchNormalizationLayerDataset.h
+++ b/tests/validation_old/dataset/BatchNormalizationLayerDataset.h
@@ -28,13 +28,13 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "dataset/GenericDataset.h"
+#include "tests/validation_old/dataset/GenericDataset.h"
 
 #include <ostream>
 #include <sstream>
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/BorderModeDataset.h b/tests/validation_old/dataset/BorderModeDataset.h
similarity index 97%
rename from tests/dataset/BorderModeDataset.h
rename to tests/validation_old/dataset/BorderModeDataset.h
index debf7bd..d1eb48d 100644
--- a/tests/dataset/BorderModeDataset.h
+++ b/tests/validation_old/dataset/BorderModeDataset.h
@@ -27,7 +27,7 @@
 #include "arm_compute/core/Types.h"
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 #include <array>
diff --git a/tests/dataset/ConvertPolicyDataset.h b/tests/validation_old/dataset/ConvertPolicyDataset.h
similarity index 97%
rename from tests/dataset/ConvertPolicyDataset.h
rename to tests/validation_old/dataset/ConvertPolicyDataset.h
index bca033e..591b7ad 100644
--- a/tests/dataset/ConvertPolicyDataset.h
+++ b/tests/validation_old/dataset/ConvertPolicyDataset.h
@@ -29,7 +29,7 @@
 #include <type_traits>
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/ConvolutionLayerDataset.h b/tests/validation_old/dataset/ConvolutionLayerDataset.h
similarity index 98%
rename from tests/dataset/ConvolutionLayerDataset.h
rename to tests/validation_old/dataset/ConvolutionLayerDataset.h
index 3d8ec4a..4fcba8d 100644
--- a/tests/dataset/ConvolutionLayerDataset.h
+++ b/tests/validation_old/dataset/ConvolutionLayerDataset.h
@@ -27,14 +27,14 @@
 #include "TypePrinter.h"
 
 #include "arm_compute/core/TensorShape.h"
-#include "dataset/GenericDataset.h"
-#include "dataset/ShapeDatasets.h"
+#include "tests/validation_old/dataset/GenericDataset.h"
+#include "tests/validation_old/dataset/ShapeDatasets.h"
 
 #include <sstream>
 #include <type_traits>
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/DataTypeDatasets.h b/tests/validation_old/dataset/DataTypeDatasets.h
similarity index 98%
rename from tests/dataset/DataTypeDatasets.h
rename to tests/validation_old/dataset/DataTypeDatasets.h
index 5f31371..34fc782 100644
--- a/tests/dataset/DataTypeDatasets.h
+++ b/tests/validation_old/dataset/DataTypeDatasets.h
@@ -27,7 +27,7 @@
 #include "arm_compute/core/Types.h"
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/FullyConnectedLayerDataset.h b/tests/validation_old/dataset/FullyConnectedLayerDataset.h
similarity index 97%
rename from tests/dataset/FullyConnectedLayerDataset.h
rename to tests/validation_old/dataset/FullyConnectedLayerDataset.h
index cf43a63..3564560 100644
--- a/tests/dataset/FullyConnectedLayerDataset.h
+++ b/tests/validation_old/dataset/FullyConnectedLayerDataset.h
@@ -27,13 +27,13 @@
 #include "TypePrinter.h"
 
 #include "arm_compute/core/TensorShape.h"
-#include "dataset/GenericDataset.h"
+#include "tests/validation_old/dataset/GenericDataset.h"
 
 #include <sstream>
 #include <type_traits>
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/GEMMDataset.h b/tests/validation_old/dataset/GEMMDataset.h
similarity index 98%
rename from tests/dataset/GEMMDataset.h
rename to tests/validation_old/dataset/GEMMDataset.h
index ce05557..5250827 100644
--- a/tests/dataset/GEMMDataset.h
+++ b/tests/validation_old/dataset/GEMMDataset.h
@@ -28,7 +28,7 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "dataset/GenericDataset.h"
+#include "tests/validation_old/dataset/GenericDataset.h"
 
 #include <ostream>
 #include <sstream>
@@ -37,7 +37,7 @@
 #include <type_traits>
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/GenericDataset.h b/tests/validation_old/dataset/GenericDataset.h
similarity index 97%
rename from tests/dataset/GenericDataset.h
rename to tests/validation_old/dataset/GenericDataset.h
index 48754fc..d2c9f2d 100644
--- a/tests/dataset/GenericDataset.h
+++ b/tests/validation_old/dataset/GenericDataset.h
@@ -30,7 +30,7 @@
 #include <type_traits>
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/ImageDatasets.h b/tests/validation_old/dataset/ImageDatasets.h
similarity index 98%
rename from tests/dataset/ImageDatasets.h
rename to tests/validation_old/dataset/ImageDatasets.h
index 6aa25cf..7fcd067 100644
--- a/tests/dataset/ImageDatasets.h
+++ b/tests/validation_old/dataset/ImageDatasets.h
@@ -28,7 +28,7 @@
 #include <type_traits>
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/InterpolationPolicyDataset.h b/tests/validation_old/dataset/InterpolationPolicyDataset.h
similarity index 97%
rename from tests/dataset/InterpolationPolicyDataset.h
rename to tests/validation_old/dataset/InterpolationPolicyDataset.h
index 0f3184c..64cc9bf 100644
--- a/tests/dataset/InterpolationPolicyDataset.h
+++ b/tests/validation_old/dataset/InterpolationPolicyDataset.h
@@ -27,7 +27,7 @@
 #include "arm_compute/core/Types.h"
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/MatrixPatternDataset.h b/tests/validation_old/dataset/MatrixPatternDataset.h
similarity index 97%
rename from tests/dataset/MatrixPatternDataset.h
rename to tests/validation_old/dataset/MatrixPatternDataset.h
index 050c4d9..7d7d365 100644
--- a/tests/dataset/MatrixPatternDataset.h
+++ b/tests/validation_old/dataset/MatrixPatternDataset.h
@@ -27,7 +27,7 @@
 #include "arm_compute/core/Types.h"
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 #include <array>
diff --git a/tests/dataset/NonLinearFilterFunctionDataset.h b/tests/validation_old/dataset/NonLinearFilterFunctionDataset.h
similarity index 97%
rename from tests/dataset/NonLinearFilterFunctionDataset.h
rename to tests/validation_old/dataset/NonLinearFilterFunctionDataset.h
index a2db323..c961c84 100644
--- a/tests/dataset/NonLinearFilterFunctionDataset.h
+++ b/tests/validation_old/dataset/NonLinearFilterFunctionDataset.h
@@ -27,7 +27,7 @@
 #include "arm_compute/core/Types.h"
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 #include <array>
diff --git a/tests/dataset/NormalizationLayerDataset.h b/tests/validation_old/dataset/NormalizationLayerDataset.h
similarity index 96%
rename from tests/dataset/NormalizationLayerDataset.h
rename to tests/validation_old/dataset/NormalizationLayerDataset.h
index fc56694..cd3c14d 100644
--- a/tests/dataset/NormalizationLayerDataset.h
+++ b/tests/validation_old/dataset/NormalizationLayerDataset.h
@@ -28,13 +28,13 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "dataset/GenericDataset.h"
+#include "tests/validation_old/dataset/GenericDataset.h"
 
 #include <sstream>
 #include <type_traits>
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/NormalizationTypeDataset.h b/tests/validation_old/dataset/NormalizationTypeDataset.h
similarity index 97%
rename from tests/dataset/NormalizationTypeDataset.h
rename to tests/validation_old/dataset/NormalizationTypeDataset.h
index 756772e..2a89dbe 100644
--- a/tests/dataset/NormalizationTypeDataset.h
+++ b/tests/validation_old/dataset/NormalizationTypeDataset.h
@@ -27,7 +27,7 @@
 #include "arm_compute/core/Types.h"
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/PoolingLayerDataset.h b/tests/validation_old/dataset/PoolingLayerDataset.h
similarity index 97%
rename from tests/dataset/PoolingLayerDataset.h
rename to tests/validation_old/dataset/PoolingLayerDataset.h
index ee3e6dc..6895ae4 100644
--- a/tests/dataset/PoolingLayerDataset.h
+++ b/tests/validation_old/dataset/PoolingLayerDataset.h
@@ -28,12 +28,12 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "dataset/GenericDataset.h"
+#include "tests/validation_old/dataset/GenericDataset.h"
 
 #include <type_traits>
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/PoolingTypesDataset.h b/tests/validation_old/dataset/PoolingTypesDataset.h
similarity index 94%
rename from tests/dataset/PoolingTypesDataset.h
rename to tests/validation_old/dataset/PoolingTypesDataset.h
index c8e3466..a826df3 100644
--- a/tests/dataset/PoolingTypesDataset.h
+++ b/tests/validation_old/dataset/PoolingTypesDataset.h
@@ -25,10 +25,10 @@
 #define __ARM_COMPUTE_TEST_DATASET_POOLING_TYPE_DATASET_H__
 
 #include "arm_compute/core/Types.h"
-#include "dataset/GenericDataset.h"
+#include "tests/validation_old/dataset/GenericDataset.h"
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/RoundingPolicyDataset.h b/tests/validation_old/dataset/RoundingPolicyDataset.h
similarity index 97%
rename from tests/dataset/RoundingPolicyDataset.h
rename to tests/validation_old/dataset/RoundingPolicyDataset.h
index 0e7c7ba..af946b4 100644
--- a/tests/dataset/RoundingPolicyDataset.h
+++ b/tests/validation_old/dataset/RoundingPolicyDataset.h
@@ -29,7 +29,7 @@
 #include <type_traits>
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/ShapeDatasets.h b/tests/validation_old/dataset/ShapeDatasets.h
similarity index 98%
rename from tests/dataset/ShapeDatasets.h
rename to tests/validation_old/dataset/ShapeDatasets.h
index ccdfc9a..3c986ab 100644
--- a/tests/dataset/ShapeDatasets.h
+++ b/tests/validation_old/dataset/ShapeDatasets.h
@@ -29,7 +29,7 @@
 #include <type_traits>
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/dataset/ThresholdDataset.h b/tests/validation_old/dataset/ThresholdDataset.h
similarity index 96%
rename from tests/dataset/ThresholdDataset.h
rename to tests/validation_old/dataset/ThresholdDataset.h
index e5a1e37..74d0b9c 100644
--- a/tests/dataset/ThresholdDataset.h
+++ b/tests/validation_old/dataset/ThresholdDataset.h
@@ -28,7 +28,7 @@
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
-#include "dataset/GenericDataset.h"
+#include "tests/validation_old/dataset/GenericDataset.h"
 
 #include <ostream>
 #include <sstream>
@@ -37,7 +37,7 @@
 #include <type_traits>
 
 #ifdef BOOST
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 #endif /* BOOST */
 
 namespace arm_compute
diff --git a/tests/validation_new/half.h b/tests/validation_old/half.h
similarity index 99%
rename from tests/validation_new/half.h
rename to tests/validation_old/half.h
index 0ca620c..d8aa341 100644
--- a/tests/validation_new/half.h
+++ b/tests/validation_old/half.h
@@ -34,5 +34,4 @@
 #define HALF_ROUND_TIES_TO_EVEN 1
 
 #include "half/half.hpp"
-
 #endif /* __ARM_COMPUTE_TEST_HALF_H__ */
diff --git a/tests/validation/main.cpp b/tests/validation_old/main.cpp
similarity index 96%
rename from tests/validation/main.cpp
rename to tests/validation_old/main.cpp
index a6c02ed..9f15c3a 100644
--- a/tests/validation/main.cpp
+++ b/tests/validation_old/main.cpp
@@ -23,16 +23,16 @@
  */
 #define BOOST_TEST_ALTERNATIVE_INIT_API
 
-#include "AssetsLibrary.h"
-#include "Globals.h"
 #include "Utils.h"
 #include "ValidationProgramOptions.h"
 #include "ValidationUserConfiguration.h"
 #include "support/ToolchainSupport.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
 
 #include "arm_compute/runtime/Scheduler.h"
 
-#include "boost_wrapper.h"
+#include "tests/validation_old/boost_wrapper.h"
 
 #include <iostream>
 #include <memory>
diff --git a/tests/model_objects/AlexNet.h b/tests/validation_old/model_objects/AlexNet.h
similarity index 100%
rename from tests/model_objects/AlexNet.h
rename to tests/validation_old/model_objects/AlexNet.h
diff --git a/tests/model_objects/LeNet5.h b/tests/validation_old/model_objects/LeNet5.h
similarity index 100%
rename from tests/model_objects/LeNet5.h
rename to tests/validation_old/model_objects/LeNet5.h
diff --git a/tests/validation/system_tests/CL/AlexNet.cpp b/tests/validation_old/system_tests/CL/AlexNet.cpp
similarity index 97%
rename from tests/validation/system_tests/CL/AlexNet.cpp
rename to tests/validation_old/system_tests/CL/AlexNet.cpp
index 2b1d31f..b403b6e 100644
--- a/tests/validation/system_tests/CL/AlexNet.cpp
+++ b/tests/validation_old/system_tests/CL/AlexNet.cpp
@@ -46,7 +46,7 @@
  * SOFTWARE.
  */
 #include "CL/CLAccessor.h"
-#include "validation/Validation.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/runtime/CL/CLSubTensor.h"
 #include "arm_compute/runtime/CL/functions/CLActivationLayer.h"
@@ -56,7 +56,7 @@
 #include "arm_compute/runtime/CL/functions/CLPoolingLayer.h"
 #include "arm_compute/runtime/CL/functions/CLSoftmaxLayer.h"
 
-#include "model_objects/AlexNet.h"
+#include "tests/validation_old/model_objects/AlexNet.h"
 
 #include <array>
 
diff --git a/tests/validation/system_tests/CL/LeNet5.cpp b/tests/validation_old/system_tests/CL/LeNet5.cpp
similarity index 97%
rename from tests/validation/system_tests/CL/LeNet5.cpp
rename to tests/validation_old/system_tests/CL/LeNet5.cpp
index 4b3d969..0f34dd1 100644
--- a/tests/validation/system_tests/CL/LeNet5.cpp
+++ b/tests/validation_old/system_tests/CL/LeNet5.cpp
@@ -46,7 +46,7 @@
  * SOFTWARE.
  */
 #include "CL/CLAccessor.h"
-#include "validation/Validation.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/runtime/CL/functions/CLActivationLayer.h"
 #include "arm_compute/runtime/CL/functions/CLConvolutionLayer.h"
@@ -54,7 +54,7 @@
 #include "arm_compute/runtime/CL/functions/CLPoolingLayer.h"
 #include "arm_compute/runtime/CL/functions/CLSoftmaxLayer.h"
 
-#include "model_objects/LeNet5.h"
+#include "tests/validation_old/model_objects/LeNet5.h"
 
 using namespace arm_compute;
 using namespace arm_compute::test;
diff --git a/tests/validation/system_tests/NEON/AlexNet.cpp b/tests/validation_old/system_tests/NEON/AlexNet.cpp
similarity index 97%
rename from tests/validation/system_tests/NEON/AlexNet.cpp
rename to tests/validation_old/system_tests/NEON/AlexNet.cpp
index 20a612f..9697cf3 100644
--- a/tests/validation/system_tests/NEON/AlexNet.cpp
+++ b/tests/validation_old/system_tests/NEON/AlexNet.cpp
@@ -46,7 +46,7 @@
  * SOFTWARE.
  */
 #include "NEON/Accessor.h"
-#include "validation/Validation.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/runtime/NEON/functions/NEActivationLayer.h"
 #include "arm_compute/runtime/NEON/functions/NEConvolutionLayer.h"
@@ -56,7 +56,7 @@
 #include "arm_compute/runtime/NEON/functions/NESoftmaxLayer.h"
 #include "arm_compute/runtime/SubTensor.h"
 
-#include "model_objects/AlexNet.h"
+#include "tests/validation_old/model_objects/AlexNet.h"
 
 #include <array>
 
diff --git a/tests/validation/system_tests/NEON/LeNet5.cpp b/tests/validation_old/system_tests/NEON/LeNet5.cpp
similarity index 97%
rename from tests/validation/system_tests/NEON/LeNet5.cpp
rename to tests/validation_old/system_tests/NEON/LeNet5.cpp
index c745613..916df98 100644
--- a/tests/validation/system_tests/NEON/LeNet5.cpp
+++ b/tests/validation_old/system_tests/NEON/LeNet5.cpp
@@ -46,7 +46,7 @@
  * SOFTWARE.
  */
 #include "NEON/Accessor.h"
-#include "validation/Validation.h"
+#include "tests/validation_old/Validation.h"
 
 #include "arm_compute/runtime/NEON/functions/NEActivationLayer.h"
 #include "arm_compute/runtime/NEON/functions/NEConvolutionLayer.h"
@@ -54,7 +54,7 @@
 #include "arm_compute/runtime/NEON/functions/NEPoolingLayer.h"
 #include "arm_compute/runtime/NEON/functions/NESoftmaxLayer.h"
 
-#include "model_objects/LeNet5.h"
+#include "tests/validation_old/model_objects/LeNet5.h"
 
 using namespace arm_compute;
 using namespace arm_compute::test;