diff --git a/tests/SConscript b/tests/SConscript
index 007a0aa..9c9897e 100644
--- a/tests/SConscript
+++ b/tests/SConscript
@@ -27,10 +27,6 @@
 
 SConscript('./framework/SConscript', duplicate=0)
 
-#FIXME: Remove before release
-if env['internal_only']:
-    SConscript('./validation_old/SConscript', duplicate=0)
-
 # vars is imported from arm_compute:
 variables = [
     BoolVariable("validation_tests", "Build validation test programs", True),
diff --git a/tests/validation/CL/Accumulate.cpp b/tests/validation/CL/Accumulate.cpp
new file mode 100644
index 0000000..2e33540
--- /dev/null
+++ b/tests/validation/CL/Accumulate.cpp
@@ -0,0 +1,189 @@
+/*
+ * 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 "arm_compute/core/Types.h"
+#include "arm_compute/runtime/CL/CLTensor.h"
+#include "arm_compute/runtime/CL/CLTensorAllocator.h"
+#include "arm_compute/runtime/CL/functions/CLAccumulate.h"
+#include "tests/CL/CLAccessor.h"
+#include "tests/PaddingCalculator.h"
+#include "tests/datasets/ConvertPolicyDataset.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/AccumulateFixture.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+namespace
+{
+/** Tolerance value for comparing reference's output against implementation's output for floating point data types */
+constexpr AbsoluteTolerance<float> tolerance(1.0f);
+/** Input data sets **/
+const auto AccumulateU8Dataset  = combine(framework::dataset::make("DataType", DataType::U8), framework::dataset::make("DataType", DataType::U8));
+const auto AccumulateS16Dataset = combine(framework::dataset::make("DataType", DataType::U8), framework::dataset::make("DataType", DataType::S16));
+} // namespace
+TEST_SUITE(CL)
+TEST_SUITE(Accumulate)
+
+TEST_SUITE(U8)
+DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(datasets::SmallShapes(), datasets::LargeShapes()), AccumulateS16Dataset),
+               shape, data_type, output_data_type)
+{
+    // Create tensors
+    CLTensor ref_src = create_tensor<CLTensor>(shape, data_type);
+    CLTensor dst     = create_tensor<CLTensor>(shape, output_data_type);
+
+    // Create and Configure function
+    CLAccumulate accum;
+    accum.configure(&ref_src, &dst);
+
+    // Validate valid region
+    const ValidRegion valid_region = shape_to_valid_region(shape);
+    validate(dst.info()->valid_region(), valid_region);
+
+    // Validate padding
+    const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
+    validate(ref_src.info()->padding(), padding);
+    validate(dst.info()->padding(), padding);
+}
+
+template <typename T1>
+using CLAccumulateFixture = AccumulateValidationFixture<CLTensor, CLAccessor, CLAccumulate, T1, int16_t>;
+
+FIXTURE_DATA_TEST_CASE(RunSmall, CLAccumulateFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::SmallShapes(), AccumulateS16Dataset))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference, tolerance);
+}
+FIXTURE_DATA_TEST_CASE(RunLarge, CLAccumulateFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::LargeShapes(), AccumulateS16Dataset))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference, tolerance);
+}
+
+TEST_SUITE_END()
+TEST_SUITE_END()
+
+TEST_SUITE(AccumulateWeighted)
+
+TEST_SUITE(U8)
+DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(datasets::SmallShapes(), datasets::LargeShapes()), AccumulateU8Dataset),
+               shape, data_type, output_data_type)
+{
+    // Generate a random alpha value
+    std::mt19937                     gen(library->seed());
+    std::uniform_real_distribution<> float_dist(0, 1);
+    const float                      alpha = float_dist(gen);
+
+    // Create tensors
+    CLTensor ref_src = create_tensor<CLTensor>(shape, data_type);
+    CLTensor dst     = create_tensor<CLTensor>(shape, output_data_type);
+
+    // Create and Configure function
+    CLAccumulateWeighted accum_weight;
+    accum_weight.configure(&ref_src, alpha, &dst);
+
+    // Validate valid region
+    const ValidRegion valid_region = shape_to_valid_region(shape);
+    validate(dst.info()->valid_region(), valid_region);
+
+    // Validate padding
+    const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
+    validate(ref_src.info()->padding(), padding);
+    validate(dst.info()->padding(), padding);
+}
+
+template <typename T1>
+using CLAccumulateWeightedFixture = AccumulateWeightedValidationFixture<CLTensor, CLAccessor, CLAccumulateWeighted, T1, uint8_t>;
+
+FIXTURE_DATA_TEST_CASE(RunSmall, CLAccumulateWeightedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::SmallShapes(), AccumulateU8Dataset))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference, tolerance);
+}
+FIXTURE_DATA_TEST_CASE(RunLarge, CLAccumulateWeightedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::LargeShapes(), AccumulateU8Dataset))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference, tolerance);
+}
+
+TEST_SUITE_END()
+TEST_SUITE_END()
+
+TEST_SUITE(AccumulateSquared)
+
+TEST_SUITE(U8)
+DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(datasets::SmallShapes(), datasets::LargeShapes()), AccumulateS16Dataset),
+               shape, data_type, output_data_type)
+{
+    // Generate a random shift value
+    std::mt19937                            gen(library->seed());
+    std::uniform_int_distribution<uint32_t> int_dist(0, 15);
+    const uint32_t                          shift = int_dist(gen);
+
+    // Create tensors
+    CLTensor ref_src = create_tensor<CLTensor>(shape, data_type);
+    CLTensor dst     = create_tensor<CLTensor>(shape, output_data_type);
+
+    // Create and Configure function
+    CLAccumulateSquared accum_square;
+    accum_square.configure(&ref_src, shift, &dst);
+
+    // Validate valid region
+    const ValidRegion valid_region = shape_to_valid_region(shape);
+    validate(dst.info()->valid_region(), valid_region);
+
+    // Validate padding
+    const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
+    validate(ref_src.info()->padding(), padding);
+    validate(dst.info()->padding(), padding);
+}
+
+template <typename T1>
+using CLAccumulateSquaredFixture = AccumulateSquaredValidationFixture<CLTensor, CLAccessor, CLAccumulateSquared, T1, int16_t>;
+
+FIXTURE_DATA_TEST_CASE(RunSmall, CLAccumulateSquaredFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::SmallShapes(), AccumulateS16Dataset))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference, tolerance);
+}
+FIXTURE_DATA_TEST_CASE(RunLarge, CLAccumulateSquaredFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::LargeShapes(), AccumulateS16Dataset))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference, tolerance);
+}
+
+TEST_SUITE_END()
+TEST_SUITE_END()
+
+TEST_SUITE_END()
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/validation/CPP/Accumulate.cpp b/tests/validation/CPP/Accumulate.cpp
new file mode 100644
index 0000000..29a2007
--- /dev/null
+++ b/tests/validation/CPP/Accumulate.cpp
@@ -0,0 +1,103 @@
+/*
+ * 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 "Accumulate.h"
+
+#include "arm_compute/core/Types.h"
+#include "tests/validation/FixedPoint.h"
+#include "tests/validation/Helpers.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+namespace reference
+{
+template <typename T1, typename T2>
+SimpleTensor<T2> accumulate(const SimpleTensor<T1> &src, DataType output_data_type)
+{
+    SimpleTensor<T2> dst{ src.shape(), output_data_type };
+
+    library->fill_tensor_uniform(dst, 1, static_cast<T2>(0), static_cast<T2>(std::numeric_limits<T1>::max()));
+
+    using intermediate_type = typename common_promoted_signed_type<T1, T2>::intermediate_type;
+
+    for(int i = 0; i < src.num_elements(); ++i)
+    {
+        intermediate_type val = static_cast<intermediate_type>(src[i]) + static_cast<intermediate_type>(dst[i]);
+        dst[i]                = saturate_cast<T2>(val);
+    }
+
+    return dst;
+}
+
+template <typename T1, typename T2>
+SimpleTensor<T2> accumulate_weighted(const SimpleTensor<T1> &src, float alpha, DataType output_data_type)
+{
+    ARM_COMPUTE_ERROR_ON_MSG(alpha < 0.f || alpha > 1.f, "Weight (alpha) specified in accumulate_weighted must be within the range [0, 1]");
+
+    SimpleTensor<T2> dst{ src.shape(), output_data_type };
+
+    library->fill_tensor_uniform(dst, 1, static_cast<T2>(0), static_cast<T2>(std::numeric_limits<T1>::max()));
+
+    using intermediate_type = typename common_promoted_signed_type<T1, T2>::intermediate_type;
+
+    for(int i = 0; i < src.num_elements(); ++i)
+    {
+        double val = (1. - static_cast<double>(alpha)) * static_cast<intermediate_type>(dst[i]) + static_cast<double>(alpha) * static_cast<intermediate_type>(src[i]);
+        dst[i]     = static_cast<T2>(val);
+    }
+
+    return dst;
+}
+
+template <typename T1, typename T2>
+SimpleTensor<T2> accumulate_squared(const SimpleTensor<T1> &src, uint32_t shift, DataType output_data_type)
+{
+    ARM_COMPUTE_ERROR_ON_MSG(shift > 15, "Shift in accumulate_squared must be within the range [0, 15]");
+
+    SimpleTensor<T2> dst{ src.shape(), output_data_type };
+
+    library->fill_tensor_uniform(dst, 1, static_cast<T2>(0), static_cast<T2>(std::numeric_limits<T1>::max()));
+
+    using intermediate_type = typename common_promoted_signed_type<T1, T2>::intermediate_type;
+    intermediate_type denom = 1 << shift;
+
+    for(int i = 0; i < src.num_elements(); ++i)
+    {
+        intermediate_type val = static_cast<intermediate_type>(dst[i]) + (static_cast<intermediate_type>(src[i]) * static_cast<intermediate_type>(src[i]) / denom);
+        dst[i]                = saturate_cast<T2>(val);
+    }
+
+    return dst;
+}
+
+template SimpleTensor<int16_t> accumulate(const SimpleTensor<uint8_t> &src, DataType output_data_type);
+template SimpleTensor<uint8_t> accumulate_weighted(const SimpleTensor<uint8_t> &src, float alpha, DataType output_data_type);
+template SimpleTensor<int16_t> accumulate_squared(const SimpleTensor<uint8_t> &src, uint32_t shift, DataType output_data_type);
+} // namespace reference
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/validation_old/ValidationProgramOptions.h b/tests/validation/CPP/Accumulate.h
similarity index 65%
rename from tests/validation_old/ValidationProgramOptions.h
rename to tests/validation/CPP/Accumulate.h
index 6b29b80..faa570b 100644
--- a/tests/validation_old/ValidationProgramOptions.h
+++ b/tests/validation/CPP/Accumulate.h
@@ -21,10 +21,11 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#ifndef __ARM_COMPUTE_TEST_VALIDATION_PROGRAM_OPTIONS_H__
-#define __ARM_COMPUTE_TEST_VALIDATION_PROGRAM_OPTIONS_H__
+#ifndef __ARM_COMPUTE_TEST_ACCUMULATE_H__
+#define __ARM_COMPUTE_TEST_ACCUMULATE_H__
 
-#include "ProgramOptions.h"
+#include "tests/SimpleTensor.h"
+#include "tests/validation/Helpers.h"
 
 namespace arm_compute
 {
@@ -32,14 +33,18 @@
 {
 namespace validation
 {
-/** Subclass of @ref ProgramOptions that adds validation specific options. */
-class ValidationProgramOptions : public ProgramOptions
+namespace reference
 {
-public:
-    /** Defines additonal options. */
-    ValidationProgramOptions();
-};
+template <typename T1, typename T2>
+SimpleTensor<T2> accumulate(const SimpleTensor<T1> &src, DataType output_data_type);
+
+template <typename T1, typename T2>
+SimpleTensor<T2> accumulate_weighted(const SimpleTensor<T1> &src, float alpha, DataType output_data_type);
+
+template <typename T1, typename T2>
+SimpleTensor<T2> accumulate_squared(const SimpleTensor<T1> &src, uint32_t shift, DataType output_data_type);
+} // namespace reference
 } // namespace validation
 } // namespace test
 } // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_VALIDATION_PROGRAM_OPTIONS_H__ */
+#endif /* __ARM_COMPUTE_TEST_ACCUMULATE_H__ */
diff --git a/tests/validation/NEON/Accumulate.cpp b/tests/validation/NEON/Accumulate.cpp
new file mode 100644
index 0000000..cb6894a
--- /dev/null
+++ b/tests/validation/NEON/Accumulate.cpp
@@ -0,0 +1,189 @@
+/*
+ * 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 "arm_compute/core/Types.h"
+#include "arm_compute/runtime/NEON/functions/NEAccumulate.h"
+#include "arm_compute/runtime/Tensor.h"
+#include "arm_compute/runtime/TensorAllocator.h"
+#include "tests/NEON/Accessor.h"
+#include "tests/PaddingCalculator.h"
+#include "tests/datasets/ConvertPolicyDataset.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/AccumulateFixture.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+namespace
+{
+/** Tolerance value for comparing reference's output against implementation's output for floating point data types */
+constexpr AbsoluteTolerance<float> tolerance(1.0f);
+/** Input data sets **/
+const auto AccumulateU8Dataset  = combine(framework::dataset::make("DataType", DataType::U8), framework::dataset::make("DataType", DataType::U8));
+const auto AccumulateS16Dataset = combine(framework::dataset::make("DataType", DataType::U8), framework::dataset::make("DataType", DataType::S16));
+} // namespace
+TEST_SUITE(NEON)
+TEST_SUITE(Accumulate)
+
+TEST_SUITE(U8)
+DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(datasets::SmallShapes(), datasets::LargeShapes()), AccumulateS16Dataset),
+               shape, data_type, output_data_type)
+{
+    // Create tensors
+    Tensor ref_src = create_tensor<Tensor>(shape, data_type);
+    Tensor dst     = create_tensor<Tensor>(shape, output_data_type);
+
+    // Create and Configure function
+    NEAccumulate accum;
+    accum.configure(&ref_src, &dst);
+
+    // Validate valid region
+    const ValidRegion valid_region = shape_to_valid_region(shape);
+    validate(dst.info()->valid_region(), valid_region);
+
+    // Validate padding
+    const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
+    validate(ref_src.info()->padding(), padding);
+    validate(dst.info()->padding(), padding);
+}
+
+template <typename T1>
+using NEAccumulateFixture = AccumulateValidationFixture<Tensor, Accessor, NEAccumulate, T1, int16_t>;
+
+FIXTURE_DATA_TEST_CASE(RunSmall, NEAccumulateFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::SmallShapes(), AccumulateS16Dataset))
+{
+    // Validate output
+    validate(Accessor(_target), _reference, tolerance);
+}
+FIXTURE_DATA_TEST_CASE(RunLarge, NEAccumulateFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::LargeShapes(), AccumulateS16Dataset))
+{
+    // Validate output
+    validate(Accessor(_target), _reference, tolerance);
+}
+
+TEST_SUITE_END()
+TEST_SUITE_END()
+
+TEST_SUITE(AccumulateWeighted)
+
+TEST_SUITE(U8)
+DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(datasets::SmallShapes(), datasets::LargeShapes()), AccumulateU8Dataset),
+               shape, data_type, output_data_type)
+{
+    // Generate a random alpha value
+    std::mt19937                     gen(library->seed());
+    std::uniform_real_distribution<> float_dist(0, 1);
+    const float                      alpha = float_dist(gen);
+
+    // Create tensors
+    Tensor ref_src = create_tensor<Tensor>(shape, data_type);
+    Tensor dst     = create_tensor<Tensor>(shape, output_data_type);
+
+    // Create and Configure function
+    NEAccumulateWeighted accum_weight;
+    accum_weight.configure(&ref_src, alpha, &dst);
+
+    // Validate valid region
+    const ValidRegion valid_region = shape_to_valid_region(shape);
+    validate(dst.info()->valid_region(), valid_region);
+
+    // Validate padding
+    const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
+    validate(ref_src.info()->padding(), padding);
+    validate(dst.info()->padding(), padding);
+}
+
+template <typename T1>
+using NEAccumulateWeightedFixture = AccumulateWeightedValidationFixture<Tensor, Accessor, NEAccumulateWeighted, T1, uint8_t>;
+
+FIXTURE_DATA_TEST_CASE(RunSmall, NEAccumulateWeightedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::SmallShapes(), AccumulateU8Dataset))
+{
+    // Validate output
+    validate(Accessor(_target), _reference, tolerance);
+}
+FIXTURE_DATA_TEST_CASE(RunLarge, NEAccumulateWeightedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::LargeShapes(), AccumulateU8Dataset))
+{
+    // Validate output
+    validate(Accessor(_target), _reference, tolerance);
+}
+
+TEST_SUITE_END()
+TEST_SUITE_END()
+
+TEST_SUITE(AccumulateSquared)
+
+TEST_SUITE(U8)
+DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(datasets::SmallShapes(), datasets::LargeShapes()), AccumulateS16Dataset),
+               shape, data_type, output_data_type)
+{
+    // Generate a random shift value
+    std::mt19937                            gen(library->seed());
+    std::uniform_int_distribution<uint32_t> int_dist(0, 15);
+    const uint32_t                          shift = int_dist(gen);
+
+    // Create tensors
+    Tensor ref_src = create_tensor<Tensor>(shape, data_type);
+    Tensor dst     = create_tensor<Tensor>(shape, output_data_type);
+
+    // Create and Configure function
+    NEAccumulateSquared accum_square;
+    accum_square.configure(&ref_src, shift, &dst);
+
+    // Validate valid region
+    const ValidRegion valid_region = shape_to_valid_region(shape);
+    validate(dst.info()->valid_region(), valid_region);
+
+    // Validate padding
+    const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
+    validate(ref_src.info()->padding(), padding);
+    validate(dst.info()->padding(), padding);
+}
+
+template <typename T1>
+using NEAccumulateSquaredFixture = AccumulateSquaredValidationFixture<Tensor, Accessor, NEAccumulateSquared, T1, int16_t>;
+
+FIXTURE_DATA_TEST_CASE(RunSmall, NEAccumulateSquaredFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::SmallShapes(), AccumulateS16Dataset))
+{
+    // Validate output
+    validate(Accessor(_target), _reference, tolerance);
+}
+FIXTURE_DATA_TEST_CASE(RunLarge, NEAccumulateSquaredFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::LargeShapes(), AccumulateS16Dataset))
+{
+    // Validate output
+    validate(Accessor(_target), _reference, tolerance);
+}
+
+TEST_SUITE_END()
+TEST_SUITE_END()
+
+TEST_SUITE_END()
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/validation/fixtures/AccumulateFixture.h b/tests/validation/fixtures/AccumulateFixture.h
new file mode 100644
index 0000000..3d8ca2d
--- /dev/null
+++ b/tests/validation/fixtures/AccumulateFixture.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_ACCUMULATE_FIXTURE
+#define ARM_COMPUTE_TEST_ACCUMULATE_FIXTURE
+
+#include "arm_compute/core/TensorShape.h"
+#include "arm_compute/core/Types.h"
+#include "tests/AssetsLibrary.h"
+#include "tests/Globals.h"
+#include "tests/IAccessor.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/CPP/Accumulate.h"
+#include "tests/validation/Helpers.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+template <typename TensorType, typename AccessorType, typename FunctionType, typename T1, typename T2>
+class AccumulateBaseValidationFixture : public framework::Fixture
+{
+public:
+    template <typename...>
+    void setup(TensorShape shape, DataType data_type, DataType output_data_type)
+    {
+        _target    = compute_target(shape, data_type, output_data_type);
+        _reference = compute_reference(shape, data_type, output_data_type);
+    }
+
+protected:
+    template <typename U, typename D>
+    void fill(U &&tensor, int i, D max)
+    {
+        library->fill_tensor_uniform(tensor, i, static_cast<D>(0), max);
+    }
+
+    TensorType compute_target(const TensorShape &shape, DataType data_type, DataType output_data_type)
+    {
+        // Create tensors
+        TensorType ref_src = create_tensor<TensorType>(shape, data_type);
+        TensorType dst     = create_tensor<TensorType>(shape, output_data_type);
+
+        // Create and configure function
+        FunctionType accum;
+        accum_conf(accum, ref_src, dst);
+
+        ARM_COMPUTE_EXPECT(ref_src.info()->is_resizable(), framework::LogLevel::ERRORS);
+        ARM_COMPUTE_EXPECT(dst.info()->is_resizable(), framework::LogLevel::ERRORS);
+
+        // Allocate tensors
+        ref_src.allocator()->allocate();
+        dst.allocator()->allocate();
+
+        ARM_COMPUTE_EXPECT(!ref_src.info()->is_resizable(), framework::LogLevel::ERRORS);
+        ARM_COMPUTE_EXPECT(!dst.info()->is_resizable(), framework::LogLevel::ERRORS);
+
+        const T1 max = std::numeric_limits<T1>::max();
+
+        // Fill tensors
+        fill(AccessorType(ref_src), 0, max);
+        fill(AccessorType(dst), 1, static_cast<T2>(max));
+
+        // Compute function
+        accum.run();
+
+        return dst;
+    }
+
+    SimpleTensor<T2> compute_reference(const TensorShape &shape, DataType data_type, DataType output_data_type)
+    {
+        // Create reference
+        SimpleTensor<T1> ref_src{ shape, data_type };
+
+        const T1 max = std::numeric_limits<T1>::max();
+
+        // Fill reference
+        fill(ref_src, 0, max);
+
+        return accum_ref(ref_src, output_data_type);
+    }
+
+    virtual void accum_conf(FunctionType &func, const TensorType &input, TensorType &accum) = 0;
+
+    virtual SimpleTensor<T2> accum_ref(const SimpleTensor<T1> &input, DataType output_data_type) = 0;
+
+    TensorType       _target{};
+    SimpleTensor<T2> _reference{};
+};
+
+template <typename TensorType, typename AccessorType, typename FunctionType, typename T1, typename T2>
+class AccumulateValidationFixture : public AccumulateBaseValidationFixture<TensorType, AccessorType, FunctionType, T1, T2>
+{
+public:
+    template <typename...>
+    void setup(TensorShape shape, DataType data_type, DataType output_data_type)
+    {
+        AccumulateBaseValidationFixture<TensorType, AccessorType, FunctionType, T1, T2>::setup(shape, data_type, output_data_type);
+    }
+
+    virtual void accum_conf(FunctionType &func, const TensorType &input, TensorType &accum) override
+    {
+        func.configure(&input, &accum);
+    }
+
+    virtual SimpleTensor<T2> accum_ref(const SimpleTensor<T1> &input, DataType output_data_type) override
+    {
+        return reference::accumulate<T1, T2>(input, output_data_type);
+    }
+};
+
+template <typename TensorType, typename AccessorType, typename FunctionType, typename T1, typename T2>
+class AccumulateWeightedValidationFixture : public AccumulateBaseValidationFixture<TensorType, AccessorType, FunctionType, T1, T2>
+{
+public:
+    template <typename...>
+    void setup(TensorShape shape, DataType data_type, DataType output_data_type)
+    {
+        std::mt19937                     gen(library->seed());
+        std::uniform_real_distribution<> float_dist(0, 1);
+
+        _alpha = float_dist(gen);
+
+        AccumulateBaseValidationFixture<TensorType, AccessorType, FunctionType, T1, T2>::setup(shape, data_type, output_data_type);
+    }
+
+    virtual void accum_conf(FunctionType &func, const TensorType &input, TensorType &accum) override
+    {
+        func.configure(&input, _alpha, &accum);
+    }
+
+    virtual SimpleTensor<T2> accum_ref(const SimpleTensor<T1> &input, DataType output_data_type) override
+    {
+        return reference::accumulate_weighted<T1, T2>(input, _alpha, output_data_type);
+    }
+
+    float _alpha{ 0.f };
+};
+
+template <typename TensorType, typename AccessorType, typename FunctionType, typename T1, typename T2>
+class AccumulateSquaredValidationFixture : public AccumulateBaseValidationFixture<TensorType, AccessorType, FunctionType, T1, T2>
+{
+public:
+    template <typename...>
+    void setup(TensorShape shape, DataType data_type, DataType output_data_type)
+    {
+        std::mt19937                            gen(library->seed());
+        std::uniform_int_distribution<uint32_t> int_dist(0, 15);
+
+        _shift = int_dist(gen);
+
+        AccumulateBaseValidationFixture<TensorType, AccessorType, FunctionType, T1, T2>::setup(shape, data_type, output_data_type);
+    }
+
+    virtual void accum_conf(FunctionType &func, const TensorType &input, TensorType &accum) override
+    {
+        func.configure(&input, _shift, &accum);
+    }
+
+    virtual SimpleTensor<T2> accum_ref(const SimpleTensor<T1> &input, DataType output_data_type) override
+    {
+        return reference::accumulate_squared<T1, T2>(input, _shift, output_data_type);
+    }
+
+    uint32_t _shift{ 0U };
+};
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_ACCUMULATE_FIXTURE */
diff --git a/tests/validation_old/AssetsLibrary.cpp b/tests/validation_old/AssetsLibrary.cpp
deleted file mode 100644
index 997af27..0000000
--- a/tests/validation_old/AssetsLibrary.cpp
+++ /dev/null
@@ -1,446 +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 "tests/AssetsLibrary.h"
-
-#include "arm_compute/core/ITensor.h"
-#include "tests/Utils.h"
-#include "utils/TypePrinter.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
deleted file mode 100644
index 6945aa6..0000000
--- a/tests/validation_old/AssetsLibrary.h
+++ /dev/null
@@ -1,674 +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_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_old/CL/CLFixture.cpp b/tests/validation_old/CL/CLFixture.cpp
deleted file mode 100644
index aacaeb3..0000000
--- a/tests/validation_old/CL/CLFixture.cpp
+++ /dev/null
@@ -1,32 +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 "tests/validation_old/CL/CLFixture.h"
-
-#include "tests/validation_old/boost_wrapper.h"
-
-using namespace arm_compute;
-using namespace arm_compute::test;
-using namespace arm_compute::test::validation;
-
-BOOST_GLOBAL_FIXTURE(CLFixture);
diff --git a/tests/validation_old/CL/CLFixture.h b/tests/validation_old/CL/CLFixture.h
deleted file mode 100644
index 77538be..0000000
--- a/tests/validation_old/CL/CLFixture.h
+++ /dev/null
@@ -1,45 +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_CL_CLFIXTURE_H__
-#define __ARM_COMPUTE_TEST_VALIDATION_CL_CLFIXTURE_H__
-
-#include "arm_compute/runtime/CL/CLScheduler.h"
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-struct CLFixture
-{
-    CLFixture()
-    {
-        CLScheduler::get().default_init();
-    }
-};
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_VALIDATION_CL_CLFIXTURE_H__ */
diff --git a/tests/validation_old/CL/ROIPoolingLayer.cpp b/tests/validation_old/CL/ROIPoolingLayer.cpp
deleted file mode 100644
index ec804cc..0000000
--- a/tests/validation_old/CL/ROIPoolingLayer.cpp
+++ /dev/null
@@ -1,112 +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 "CL/CLAccessor.h"
-#include "CL/CLArrayAccessor.h"
-#include "arm_compute/runtime/CL/CLArray.h"
-#include "arm_compute/runtime/CL/functions/CLROIPoolingLayer.h"
-#include "tests/Globals.h"
-#include "tests/Utils.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 "utils/TypePrinter.h"
-
-#include <random>
-#include <vector>
-
-using namespace arm_compute;
-using namespace arm_compute::test;
-using namespace arm_compute::test::validation;
-
-namespace
-{
-CLTensor compute_roi_pooling_layer(const TensorShape &shape, DataType dt, const std::vector<ROI> &rois, ROIPoolingLayerInfo pool_info)
-{
-    TensorShape shape_dst;
-    shape_dst.set(0, pool_info.pooled_width());
-    shape_dst.set(1, pool_info.pooled_height());
-    shape_dst.set(2, shape.z());
-    shape_dst.set(3, rois.size());
-
-    // Create tensors
-    CLTensor src = create_tensor<CLTensor>(shape, dt);
-    CLTensor dst = create_tensor<CLTensor>(shape_dst, dt);
-
-    // Create ROI array
-    CLArray<ROI> rois_array(rois.size());
-    fill_array(CLArrayAccessor<ROI>(rois_array), rois);
-
-    // Create and configure function
-    CLROIPoolingLayer roi_pool;
-    roi_pool.configure(&src, &rois_array, &dst, pool_info);
-
-    // Allocate tensors
-    src.allocator()->allocate();
-    dst.allocator()->allocate();
-
-    BOOST_TEST(!src.info()->is_resizable());
-    BOOST_TEST(!dst.info()->is_resizable());
-
-    // Fill tensors
-    std::uniform_real_distribution<> distribution(-1, 1);
-    library->fill(CLAccessor(src), distribution, 0);
-
-    // Compute function
-    roi_pool.run();
-
-    return dst;
-}
-} // namespace
-
-#ifndef DOXYGEN_SKIP_THIS
-BOOST_AUTO_TEST_SUITE(CL)
-BOOST_AUTO_TEST_SUITE(ROIPoolingLayer)
-
-BOOST_AUTO_TEST_SUITE(Float)
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit"))
-BOOST_DATA_TEST_CASE(RunSmall, boost::unit_test::data::make({ DataType::F16, DataType::F32 }) * boost::unit_test::data::make({ 10, 20, 40 }) * boost::unit_test::data::make({ 7, 9 }) *
-                     boost::unit_test::data::make({ 1.f / 8.f, 1.f / 16.f }),
-                     dt, num_rois, roi_pool_size, roi_scale)
-{
-    TensorShape         shape(50U, 47U, 2U, 3U);
-    ROIPoolingLayerInfo pool_info(roi_pool_size, roi_pool_size, roi_scale);
-
-    // Construct ROI vector
-    std::vector<ROI> rois = generate_random_rois(shape, pool_info, num_rois, user_config.seed);
-
-    // Compute function
-    CLTensor dst = compute_roi_pooling_layer(shape, dt, rois, pool_info);
-
-    // Compute reference
-    RawTensor ref_dst = Reference::compute_reference_roi_pooling_layer(shape, dt, rois, pool_info);
-
-    // Validate output
-    validate(CLAccessor(dst), ref_dst);
-}
-BOOST_AUTO_TEST_SUITE_END()
-
-BOOST_AUTO_TEST_SUITE_END()
-BOOST_AUTO_TEST_SUITE_END()
-#endif /* DOXYGEN_SKIP_THIS */
diff --git a/tests/validation_old/Datasets.h b/tests/validation_old/Datasets.h
deleted file mode 100644
index 464fffd..0000000
--- a/tests/validation_old/Datasets.h
+++ /dev/null
@@ -1,264 +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_DATASETS_H__
-#define __ARM_COMPUTE_TEST_VALIDATION_DATASETS_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 "tests/validation_old/boost_wrapper.h"
-
-using namespace boost::unit_test::data::monomorphic;
-
-namespace boost
-{
-namespace unit_test
-{
-namespace data
-{
-namespace monomorphic
-{
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::SmallImages> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::LargeImages> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::SmallShapes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::Small1DShape> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::Small2DShapes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::LargeShapes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::Large2DShapes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::AllDataTypes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::UnsignedDataTypes> : boost::mpl::true_
-{
-};
-
-// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::SignedDataTypes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::FloatDataTypes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::FixedPointDataTypes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::CNNFloatDataTypes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::CNNFixedPointDataTypes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::CNNDataTypes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::ActivationFunctions> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::BorderModes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::ConvertPolicies> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::InterpolationPolicies> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::NormalizationTypes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::RoundingPolicies> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::PoolingTypes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::AlexNetConvolutionLayerDataset> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::AlexNetFullyConnectedLayerDataset> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::DirectConvolutionShapes> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::SmallFullyConnectedLayerDataset> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::LargeFullyConnectedLayerDataset> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::SmallConvolutionLayerDataset> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::SmallGEMMDataset> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::LargeGEMMDataset> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::RandomBatchNormalizationLayerDataset> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::ThresholdDataset> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::NonLinearFilterFunctions> : boost::mpl::true_
-{
-};
-
-/// Register the data set with Boost
-template <>
-struct is_dataset<arm_compute::test::MatrixPatterns> : boost::mpl::true_
-{
-};
-}
-}
-}
-}
-#endif /* __ARM_COMPUTE_TEST_VALIDATION_DATASETS_H__ */
diff --git a/tests/validation_old/FixedPoint.h b/tests/validation_old/FixedPoint.h
deleted file mode 100644
index 8e1f5a4..0000000
--- a/tests/validation_old/FixedPoint.h
+++ /dev/null
@@ -1,986 +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_FIXEDPOINT_H__
-#define __ARM_COMPUTE_TEST_VALIDATION_FIXEDPOINT_H__
-
-#include "support/ToolchainSupport.h"
-#include "tests/Utils.h"
-
-#include <cassert>
-#include <cstdint>
-#include <cstdlib>
-#include <limits>
-#include <string>
-#include <type_traits>
-
-namespace arm_compute
-{
-namespace test
-{
-namespace fixed_point_arithmetic
-{
-namespace detail
-{
-// Forward declare structs
-struct functions;
-template <typename T>
-struct constant_expr;
-}
-
-/** Fixed point traits */
-namespace traits
-{
-// Promote types
-// *INDENT-OFF*
-// clang-format off
-template <typename T> struct promote { };
-template <> struct promote<uint8_t> { using type = uint16_t; };
-template <> struct promote<int8_t> { using type = int16_t; };
-template <> struct promote<uint16_t> { using type = uint32_t; };
-template <> struct promote<int16_t> { using type = int32_t; };
-template <> struct promote<uint32_t> { using type = uint64_t; };
-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; };
-// clang-format on
-// *INDENT-ON*
-}
-
-/** Strongly typed enum class representing the overflow policy */
-enum class OverflowPolicy
-{
-    WRAP,    /**< Wrap policy */
-    SATURATE /**< Saturate policy */
-};
-/** Strongly typed enum class representing the rounding policy */
-enum class RoundingPolicy
-{
-    TO_ZERO,        /**< Round to zero policy */
-    TO_NEAREST_EVEN /**< Round to nearest even policy */
-};
-
-/** Arbitrary fixed-point arithmetic class */
-template <typename T>
-class fixed_point
-{
-public:
-    // 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
-     * @param[in] p   Fixed point precision
-     */
-    template <typename U>
-    fixed_point(fixed_point<U> val, uint8_t p)
-        : _value(0), _fixed_point_position(p)
-    {
-        assert(p > 0 && p < std::numeric_limits<T>::digits);
-        T v = 0;
-
-        if(std::numeric_limits<T>::digits < std::numeric_limits<U>::digits)
-        {
-            val.rescale(p);
-            v = detail::constant_expr<T>::saturate_cast(val.raw());
-        }
-        else
-        {
-            auto v_cast = static_cast<fixed_point<T>>(val);
-            v_cast.rescale(p);
-            v = v_cast.raw();
-        }
-        _value = static_cast<T>(v);
-    }
-    /** Constructor (from integer)
-     *
-     * @param[in] val    Integer value to be represented as fixed point
-     * @param[in] p      Fixed point precision
-     * @param[in] is_raw If true val is a raw fixed point value else an integer
-     */
-    template <typename U, typename = typename std::enable_if<std::is_integral<U>::value>::type>
-    fixed_point(U val, uint8_t p, bool is_raw = false)
-        : _value(val << p), _fixed_point_position(p)
-    {
-        if(is_raw)
-        {
-            _value = val;
-        }
-    }
-    /** Constructor (from float)
-     *
-     * @param[in] val Float value to be represented as fixed point
-     * @param[in] p   Fixed point precision
-     */
-    fixed_point(float val, uint8_t p)
-        : _value(detail::constant_expr<T>::to_fixed(val, p)), _fixed_point_position(p)
-    {
-        assert(p > 0 && p < std::numeric_limits<T>::digits);
-    }
-    /** Constructor (from float string)
-     *
-     * @param[in] str Float string to be represented as fixed point
-     * @param[in] p   Fixed point precision
-     */
-    fixed_point(std::string str, uint8_t p)
-        : _value(detail::constant_expr<T>::to_fixed(support::cpp11::stof(str), p)), _fixed_point_position(p)
-    {
-        assert(p > 0 && p < std::numeric_limits<T>::digits);
-    }
-    /** Default copy constructor */
-    fixed_point &operator=(const fixed_point &) = default;
-    /** Default move constructor */
-    fixed_point &operator=(fixed_point &&) = default;
-    /** Default copy assignment operator */
-    fixed_point(const fixed_point &) = default;
-    /** Default move assignment operator */
-    fixed_point(fixed_point &&) = default;
-
-    /** Float conversion operator
-     *
-     * @return Float representation of fixed point
-     */
-    operator float() const
-    {
-        return detail::constant_expr<T>::to_float(_value, _fixed_point_position);
-    }
-    /** Integer conversion operator
-     *
-     * @return Integer representation of fixed point
-     */
-    template <typename U, typename = typename std::enable_if<std::is_integral<T>::value>::type>
-    operator U() const
-    {
-        return detail::constant_expr<T>::to_int(_value, _fixed_point_position);
-    }
-    /** Convert to different fixed point of different type but same precision
-     *
-     * @note Down-conversion might fail.
-     */
-    template <typename U>
-    operator fixed_point<U>()
-    {
-        U val = static_cast<U>(_value);
-        if(std::numeric_limits<U>::digits < std::numeric_limits<T>::digits)
-        {
-            val = detail::constant_expr<U>::saturate_cast(_value);
-        }
-        return fixed_point<U>(val, _fixed_point_position, true);
-    }
-
-    /** Arithmetic += assignment operator
-     *
-     * @param[in] rhs Fixed point operand
-     *
-     * @return Reference to this fixed point
-     */
-    template <typename U>
-    fixed_point<T> &operator+=(const fixed_point<U> &rhs)
-    {
-        fixed_point<T> val(rhs, _fixed_point_position);
-        _value += val.raw();
-        return *this;
-    }
-    /** Arithmetic -= assignment operator
-     *
-     * @param[in] rhs Fixed point operand
-     *
-     * @return Reference to this fixed point
-     */
-    template <typename U>
-    fixed_point<T> &operator-=(const fixed_point<U> &rhs)
-    {
-        fixed_point<T> val(rhs, _fixed_point_position);
-        _value -= val.raw();
-        return *this;
-    }
-
-    /** Raw value accessor
-     *
-     * @return Raw fixed point value
-     */
-    T raw() const
-    {
-        return _value;
-    }
-    /** Precision accessor
-     *
-     * @return Precision of fixed point
-     */
-    uint8_t precision() const
-    {
-        return _fixed_point_position;
-    }
-    /** Rescale a fixed point to a new precision
-     *
-     * @param[in] p New fixed point precision
-     */
-    void rescale(uint8_t p)
-    {
-        assert(p > 0 && p < std::numeric_limits<T>::digits);
-
-        using promoted_T = typename traits::promote<T>::type;
-        promoted_T val   = _value;
-        if(p > _fixed_point_position)
-        {
-            val <<= (p - _fixed_point_position);
-        }
-        else if(p < _fixed_point_position)
-        {
-            uint8_t pbar = _fixed_point_position - p;
-            val += (pbar != 0) ? (1 << (pbar - 1)) : 0;
-            val >>= pbar;
-        }
-
-        _value                = detail::constant_expr<T>::saturate_cast(val);
-        _fixed_point_position = p;
-    }
-
-private:
-    T       _value;                /**< Fixed point raw value */
-    uint8_t _fixed_point_position; /**< Fixed point precision */
-};
-
-namespace detail
-{
-/** Count the number of leading zero bits in the given value.
- *
- * @param[in] value Input value.
- *
- * @return Number of leading zero bits.
- */
-template <typename T>
-constexpr int clz(T value)
-{
-    using unsigned_T = typename std::make_unsigned<T>::type;
-    // __builtin_clz is available for int. Need to correct reported number to
-    // match the original type.
-    return __builtin_clz(value) - (32 - std::numeric_limits<unsigned_T>::digits);
-}
-
-template <typename T>
-struct constant_expr
-{
-    /** Calculate representation of 1 in fixed point given a fixed point precision
-     *
-     * @param[in] p Fixed point precision
-     *
-     * @return Representation of value 1 in fixed point.
-     */
-    static constexpr T fixed_one(uint8_t p)
-    {
-        return (1 << p);
-    }
-    /** Calculate fixed point precision step given a fixed point precision
-     *
-     * @param[in] p Fixed point precision
-     *
-     * @return Fixed point precision step
-     */
-    static constexpr float fixed_step(uint8_t p)
-    {
-        return (1.0f / static_cast<float>(1 << p));
-    }
-
-    /** Convert a fixed point value to float given its precision.
-     *
-     * @param[in] val Fixed point value
-     * @param[in] p   Fixed point precision
-     *
-     * @return Float representation of the fixed point number
-     */
-    static constexpr float to_float(T val, uint8_t p)
-    {
-        return static_cast<float>(val * fixed_step(p));
-    }
-    /** Convert a fixed point value to integer given its precision.
-     *
-     * @param[in] val Fixed point value
-     * @param[in] p   Fixed point precision
-     *
-     * @return Integer of the fixed point number
-     */
-    static constexpr T to_int(T val, uint8_t p)
-    {
-        return val >> p;
-    }
-    /** Convert a single precision floating point value to a fixed point representation given its precision.
-     *
-     * @param[in] val Floating point value
-     * @param[in] p   Fixed point precision
-     *
-     * @return The raw fixed point representation
-     */
-    static constexpr T to_fixed(float val, uint8_t p)
-    {
-        return static_cast<T>(saturate_cast<float>(val * fixed_one(p) + ((val >= 0) ? 0.5 : -0.5)));
-    }
-    /** Clamp value between two ranges
-     *
-     * @param[in] val Value to clamp
-     * @param[in] min Minimum value to clamp to
-     * @param[in] max Maximum value to clamp to
-     *
-     * @return clamped value
-     */
-    static constexpr T clamp(T val, T min, T max)
-    {
-        return std::min(std::max(val, min), max);
-    }
-    /** Saturate given number
-     *
-     * @param[in] val Value to saturate
-     *
-     * @return Saturated value
-     */
-    template <typename U>
-    static constexpr T saturate_cast(U val)
-    {
-        return static_cast<T>(std::min<U>(std::max<U>(val, static_cast<U>(std::numeric_limits<T>::min())), static_cast<U>(std::numeric_limits<T>::max())));
-    }
-};
-struct functions
-{
-    /** Output stream operator
-     *
-     * @param[in] s Output stream
-     * @param[in] x Fixed point value
-     *
-     * @return Reference output to updated stream
-     */
-    template <typename T, typename U, typename traits>
-    static std::basic_ostream<T, traits> &write(std::basic_ostream<T, traits> &s, fixed_point<U> &x)
-    {
-        return s << static_cast<float>(x);
-    }
-    /** Signbit of a fixed point number.
-     *
-     * @param[in] x Fixed point number
-     *
-     * @return True if negative else false.
-     */
-    template <typename T>
-    static bool signbit(fixed_point<T> x)
-    {
-        return ((x._value >> std::numeric_limits<T>::digits) != 0);
-    }
-    /** Checks if two fixed point numbers are equal
-     *
-     * @param[in] x First fixed point operand
-     * @param[in] y Second fixed point operand
-     *
-     * @return True if fixed points are equal else false
-     */
-    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);
-        x.rescale(p);
-        y.rescale(p);
-        return (x._value == y._value);
-    }
-    /** Checks if two fixed point number are not equal
-     *
-     * @param[in] x First fixed point operand
-     * @param[in] y Second fixed point operand
-     *
-     * @return True if fixed points are not equal else false
-     */
-    template <typename T>
-    static bool isnotequal(fixed_point<T> x, fixed_point<T> y)
-    {
-        return !isequal(x, y);
-    }
-    /** Checks if one fixed point is greater than the other
-     *
-     * @param[in] x First fixed point operand
-     * @param[in] y Second fixed point operand
-     *
-     * @return True if fixed point is greater than other
-     */
-    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);
-        x.rescale(p);
-        y.rescale(p);
-        return (x._value > y._value);
-    }
-    /** Checks if one fixed point is greater or equal than the other
-     *
-     * @param[in] x First fixed point operand
-     * @param[in] y Second fixed point operand
-     *
-     * @return True if fixed point is greater or equal than other
-     */
-    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);
-        x.rescale(p);
-        y.rescale(p);
-        return (x._value >= y._value);
-    }
-    /** Checks if one fixed point is less than the other
-     *
-     * @param[in] x First fixed point operand
-     * @param[in] y Second fixed point operand
-     *
-     * @return True if fixed point is less than other
-     */
-    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);
-        x.rescale(p);
-        y.rescale(p);
-        return (x._value < y._value);
-    }
-    /** Checks if one fixed point is less or equal than the other
-     *
-     * @param[in] x First fixed point operand
-     * @param[in] y Second fixed point operand
-     *
-     * @return True if fixed point is less or equal than other
-     */
-    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);
-        x.rescale(p);
-        y.rescale(p);
-        return (x._value <= y._value);
-    }
-    /** Checks if one fixed point is less or greater than the other
-     *
-     * @param[in] x First fixed point operand
-     * @param[in] y Second fixed point operand
-     *
-     * @return True if fixed point is less or greater than other
-     */
-    template <typename T>
-    static bool islessgreater(fixed_point<T> x, fixed_point<T> y)
-    {
-        return isnotequal(x, y);
-    }
-    /** Clamp fixed point to specific range.
-     *
-     * @param[in] x   Fixed point operand
-     * @param[in] min Minimum value to clamp to
-     * @param[in] max Maximum value to clamp to
-     *
-     * @return Clamped result
-     */
-    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);
-    }
-    /** Negate number
-     *
-     * @param[in] x Fixed point operand
-     *
-     * @return Negated fixed point result
-     */
-    template <OverflowPolicy OP = OverflowPolicy::SATURATE, typename T>
-    static fixed_point<T> negate(fixed_point<T> x)
-    {
-        using promoted_T = typename traits::promote<T>::type;
-        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._fixed_point_position, true);
-    }
-    /** Perform addition among two fixed point numbers
-     *
-     * @param[in] x First fixed point operand
-     * @param[in] y Second fixed point operand
-     *
-     * @return Result fixed point with precision equal to minimum precision of both operands
-     */
-    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);
-        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);
-            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);
-        }
-    }
-    /** Perform subtraction among two fixed point numbers
-     *
-     * @param[in] x First fixed point operand
-     * @param[in] y Second fixed point operand
-     *
-     * @return Result fixed point with precision equal to minimum precision of both operands
-     */
-    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);
-        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);
-            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);
-        }
-    }
-    /** Perform multiplication among two fixed point numbers
-     *
-     * @param[in] x First fixed point operand
-     * @param[in] y Second fixed point operand
-     *
-     * @return Result fixed point with precision equal to minimum precision of both operands
-     */
-    template <OverflowPolicy OP = OverflowPolicy::SATURATE, typename T>
-    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);
-        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;
-        if(OP == OverflowPolicy::SATURATE)
-        {
-            val = constant_expr<T>::saturate_cast(val);
-        }
-        return fixed_point<T>(static_cast<T>(val), p_min, true);
-    }
-    /** Perform division among two fixed point numbers
-     *
-     * @param[in] x First fixed point operand
-     * @param[in] y Second fixed point operand
-     *
-     * @return Result fixed point with precision equal to minimum precision of both operands
-     */
-    template <OverflowPolicy OP = OverflowPolicy::SATURATE, typename T>
-    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);
-        if(denom != 0)
-        {
-            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);
-            }
-            return fixed_point<T>(static_cast<T>(val), p, true);
-        }
-        else
-        {
-            T val = (x._value < 0) ? std::numeric_limits<T>::min() : std::numeric_limits<T>::max();
-            return fixed_point<T>(val, p, true);
-        }
-    }
-    /** Shift left
-     *
-     * @param[in] x     Fixed point operand
-     * @param[in] shift Shift value
-     *
-     * @return Shifted value
-     */
-    template <OverflowPolicy OP = OverflowPolicy::SATURATE, typename T>
-    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;
-        if(OP == OverflowPolicy::SATURATE)
-        {
-            val = constant_expr<T>::saturate_cast(val);
-        }
-        return fixed_point<T>(static_cast<T>(val), x._fixed_point_position, true);
-    }
-    /** Shift right
-     *
-     * @param[in] x     Fixed point operand
-     * @param[in] shift Shift value
-     *
-     * @return Shifted value
-     */
-    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);
-    }
-    /** Calculate absolute value
-     *
-     * @param[in] x Fixed point operand
-     *
-     * @return Absolute value of operand
-     */
-    template <typename T>
-    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);
-    }
-    /** Calculate the logarithm of a fixed point number
-     *
-     * @param[in] x Fixed point operand
-     *
-     * @return Logarithm value of operand
-     */
-    template <typename T>
-    static fixed_point<T> log(fixed_point<T> x)
-    {
-        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.
-        // Also, log(x) == -log(1/x) for 0 < x < 1.
-        if(isequal(x, const_one) || islessequal(x, fixed_point<T>(static_cast<T>(0), p)))
-        {
-            return fixed_point<T>(static_cast<T>(0), p, true);
-        }
-        else if(isless(x, const_one))
-        {
-            return mul(log(div(const_one, x)), fixed_point<T>(-1, p));
-        }
-
-        // Remove even powers of 2
-        T shift_val = 31 - __builtin_clz(x._value >> p);
-        x           = shift_right(x, shift_val);
-        x           = sub(x, const_one);
-
-        // Constants
-        auto ln2 = fixed_point<T>(0.6931471, p);
-        auto A   = fixed_point<T>(1.4384189, p);
-        auto B   = fixed_point<T>(-0.67719, p);
-        auto C   = fixed_point<T>(0.3218538, p);
-        auto D   = fixed_point<T>(-0.0832229, p);
-
-        // Polynomial expansion
-        auto sum = add(mul(x, D), C);
-        sum      = add(mul(x, sum), B);
-        sum      = add(mul(x, sum), A);
-        sum      = mul(x, sum);
-
-        return mul(add(sum, fixed_point<T>(static_cast<T>(shift_val), p)), ln2);
-    }
-    /** Calculate the exponential of a fixed point number.
-     *
-     * exp(x) = exp(floor(x)) * exp(x - floor(x))
-     *        = pow(2, floor(x) / ln(2)) * exp(x - floor(x))
-     *        = exp(x - floor(x)) << (floor(x) / ln(2))
-     *
-     * @param[in] x Fixed point operand
-     *
-     * @return Exponential value of operand
-     */
-    template <typename T>
-    static fixed_point<T> exp(fixed_point<T> x)
-    {
-        uint8_t p = x._fixed_point_position;
-        // Constants
-        auto const_one = fixed_point<T>(1, p);
-        auto ln2       = fixed_point<T>(0.6931471, p);
-        auto inv_ln2   = fixed_point<T>(1.442695, p);
-        auto A         = fixed_point<T>(0.9978546, p);
-        auto B         = fixed_point<T>(0.4994721, p);
-        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);
-
-        // Polynomial expansion
-        auto frac_part = sub(x, mul(ln2, fixed_point<T>(scaled_int_part, p)));
-        auto taylor    = add(mul(frac_part, D), C);
-        taylor         = add(mul(frac_part, taylor), B);
-        taylor         = add(mul(frac_part, taylor), A);
-        taylor         = mul(frac_part, taylor);
-        taylor         = add(taylor, const_one);
-
-        // Saturate value
-        if(static_cast<T>(clz(taylor.raw())) <= scaled_int_part)
-        {
-            return fixed_point<T>(std::numeric_limits<T>::max(), p, true);
-        }
-
-        return (scaled_int_part < 0) ? shift_right(taylor, -scaled_int_part) : shift_left(taylor, scaled_int_part);
-    }
-    /** Calculate the inverse square root of a fixed point number
-     *
-     * @param[in] x Fixed point operand
-     *
-     * @return Inverse square root value of operand
-     */
-    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));
-
-        shift += std::numeric_limits<T>::is_signed ? 1 : 0;
-
-        // Use volatile to restrict compiler optimizations on shift as compiler reports maybe-uninitialized error on Android
-        volatile int8_t *shift_ptr = &shift;
-
-        auto           const_three = fixed_point<T>(3, p);
-        auto           a           = (*shift_ptr < 0) ? shift_left(x, -(shift)) : shift_right(x, shift);
-        fixed_point<T> x2          = a;
-
-        // We need three iterations to find the result for QS8 and five for QS16
-        constexpr int num_iterations = std::is_same<T, int8_t>::value ? 3 : 5;
-        for(int i = 0; i < num_iterations; ++i)
-        {
-            fixed_point<T> three_minus_dx = sub(const_three, mul(a, mul(x2, x2)));
-            x2                            = shift_right(mul(x2, three_minus_dx), 1);
-        }
-
-        return (shift < 0) ? shift_left(x2, (-shift) >> 1) : shift_right(x2, shift >> 1);
-    }
-    /** Calculate the hyperbolic tangent of a fixed point number
-     *
-     * @param[in] x Fixed point operand
-     *
-     * @return Hyperbolic tangent of the operand
-     */
-    template <typename T>
-    static fixed_point<T> tanh(fixed_point<T> x)
-    {
-        uint8_t p = x._fixed_point_position;
-        // Constants
-        auto const_one = fixed_point<T>(1, p);
-        auto const_two = fixed_point<T>(2, p);
-
-        auto exp2x = exp(const_two * x);
-        auto num   = exp2x - const_one;
-        auto den   = exp2x + const_one;
-        auto tanh  = num / den;
-
-        return tanh;
-    }
-    /** Calculate the a-th power of a fixed point number.
-     *
-     *  The power is computed as x^a = e^(log(x) * a)
-     *
-     * @param[in] x Fixed point operand
-     * @param[in] a Fixed point exponent
-     *
-     * @return a-th power of the operand
-     */
-    template <typename T>
-    static fixed_point<T> pow(fixed_point<T> x, fixed_point<T> a)
-    {
-        return exp(log(x) * a);
-    }
-};
-
-template <typename T>
-bool operator==(const fixed_point<T> &lhs, const fixed_point<T> &rhs)
-{
-    return functions::isequal(lhs, rhs);
-}
-template <typename T>
-bool operator!=(const fixed_point<T> &lhs, const fixed_point<T> &rhs)
-{
-    return !operator==(lhs, rhs);
-}
-template <typename T>
-bool operator<(const fixed_point<T> &lhs, const fixed_point<T> &rhs)
-{
-    return functions::isless(lhs, rhs);
-}
-template <typename T>
-bool operator>(const fixed_point<T> &lhs, const fixed_point<T> &rhs)
-{
-    return operator<(rhs, lhs);
-}
-template <typename T>
-bool operator<=(const fixed_point<T> &lhs, const fixed_point<T> &rhs)
-{
-    return !operator>(lhs, rhs);
-}
-template <typename T>
-bool operator>=(const fixed_point<T> &lhs, const fixed_point<T> &rhs)
-{
-    return !operator<(lhs, rhs);
-}
-template <typename T>
-fixed_point<T> operator+(const fixed_point<T> &lhs, const fixed_point<T> &rhs)
-{
-    return functions::add(lhs, rhs);
-}
-template <typename T>
-fixed_point<T> operator-(const fixed_point<T> &lhs, const fixed_point<T> &rhs)
-{
-    return functions::sub(lhs, rhs);
-}
-template <typename T>
-fixed_point<T> operator-(const fixed_point<T> &rhs)
-{
-    return functions::negate(rhs);
-}
-template <typename T>
-fixed_point<T> operator*(fixed_point<T> x, fixed_point<T> y)
-{
-    return functions::mul(x, y);
-}
-template <typename T>
-fixed_point<T> operator/(fixed_point<T> x, fixed_point<T> y)
-{
-    return functions::div(x, y);
-}
-template <typename T>
-fixed_point<T> operator>>(fixed_point<T> x, size_t shift)
-{
-    return functions::shift_right(x, shift);
-}
-template <typename T>
-fixed_point<T> operator<<(fixed_point<T> x, size_t shift)
-{
-    return functions::shift_left(x, shift);
-}
-template <typename T, typename U, typename traits>
-std::basic_ostream<T, traits> &operator<<(std::basic_ostream<T, traits> &s, fixed_point<U> x)
-{
-    return functions::write(s, x);
-}
-template <typename T>
-inline fixed_point<T> min(fixed_point<T> x, fixed_point<T> y)
-{
-    return x > y ? y : x;
-}
-template <typename T>
-inline fixed_point<T> max(fixed_point<T> x, fixed_point<T> y)
-{
-    return x > y ? x : y;
-}
-template <OverflowPolicy OP = OverflowPolicy::SATURATE, typename T>
-inline fixed_point<T> add(fixed_point<T> x, fixed_point<T> y)
-{
-    return functions::add<OP>(x, y);
-}
-template <OverflowPolicy OP = OverflowPolicy::SATURATE, typename T>
-inline fixed_point<T> sub(fixed_point<T> x, fixed_point<T> y)
-{
-    return functions::sub<OP>(x, y);
-}
-template <OverflowPolicy OP = OverflowPolicy::SATURATE, typename T>
-inline fixed_point<T> mul(fixed_point<T> x, fixed_point<T> y)
-{
-    return functions::mul<OP>(x, y);
-}
-template <typename T>
-inline fixed_point<T> div(fixed_point<T> x, fixed_point<T> y)
-{
-    return functions::div(x, y);
-}
-template <typename T>
-inline fixed_point<T> abs(fixed_point<T> x)
-{
-    return functions::abs(x);
-}
-template <typename T>
-inline fixed_point<T> clamp(fixed_point<T> x, T min, T max)
-{
-    return functions::clamp(x, min, max);
-}
-template <typename T>
-inline fixed_point<T> exp(fixed_point<T> x)
-{
-    return functions::exp(x);
-}
-template <typename T>
-inline fixed_point<T> log(fixed_point<T> x)
-{
-    return functions::log(x);
-}
-template <typename T>
-inline fixed_point<T> inv_sqrt(fixed_point<T> x)
-{
-    return functions::inv_sqrt(x);
-}
-template <typename T>
-inline fixed_point<T> tanh(fixed_point<T> x)
-{
-    return functions::tanh(x);
-}
-template <typename T>
-inline fixed_point<T> pow(fixed_point<T> x, fixed_point<T> a)
-{
-    return functions::pow(x, a);
-}
-} // namespace detail
-
-// Expose operators
-using detail::operator==;
-using detail::operator!=;
-using detail::operator<;
-using detail::operator>;
-using detail::operator<=;
-using detail::operator>=;
-using detail::operator+;
-using detail::operator-;
-using detail::operator*;
-using detail::operator/;
-using detail::operator>>;
-using detail::operator<<;
-
-// Expose additional functions
-using detail::min;
-using detail::max;
-using detail::add;
-using detail::sub;
-using detail::mul;
-using detail::div;
-using detail::abs;
-using detail::clamp;
-using detail::exp;
-using detail::log;
-using detail::inv_sqrt;
-using detail::tanh;
-using detail::pow;
-// TODO: floor
-// TODO: ceil
-// TODO: sqrt
-} // namespace fixed_point_arithmetic
-} // namespace test
-} // namespace arm_compute
-#endif /*__ARM_COMPUTE_TEST_VALIDATION_FIXEDPOINT_H__ */
diff --git a/tests/validation_old/Helpers.h b/tests/validation_old/Helpers.h
deleted file mode 100644
index e109ede..0000000
--- a/tests/validation_old/Helpers.h
+++ /dev/null
@@ -1,273 +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 "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_old/NEON/AbsoluteDifference.cpp b/tests/validation_old/NEON/AbsoluteDifference.cpp
deleted file mode 100644
index cde0b46..0000000
--- a/tests/validation_old/NEON/AbsoluteDifference.cpp
+++ /dev/null
@@ -1,200 +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 "NEON/Accessor.h"
-#include "PaddingCalculator.h"
-#include "Utils.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 "utils/TypePrinter.h"
-
-#include "arm_compute/core/Helpers.h"
-#include "arm_compute/core/Types.h"
-#include "arm_compute/runtime/NEON/functions/NEAbsoluteDifference.h"
-#include "arm_compute/runtime/Tensor.h"
-#include "arm_compute/runtime/TensorAllocator.h"
-
-#include "tests/validation_old/boost_wrapper.h"
-
-#include <random>
-#include <string>
-
-using namespace arm_compute;
-using namespace arm_compute::test;
-using namespace arm_compute::test::validation;
-
-namespace
-{
-/** Compute Neon absolute difference function.
- *
- * @param[in] shape  Shape of the input and output tensors.
- * @param[in] dt_in0 Data type of first input tensor.
- * @param[in] dt_in1 Data type of second input tensor.
- * @param[in] dt_out Data type of the output tensor.
- *
- * @return Computed output tensor.
- */
-Tensor compute_absolute_difference(const TensorShape &shape, DataType dt_in0, DataType dt_in1, DataType dt_out)
-{
-    // Create tensors
-    Tensor src1 = create_tensor<Tensor>(shape, dt_in0);
-    Tensor src2 = create_tensor<Tensor>(shape, dt_in1);
-    Tensor dst  = create_tensor<Tensor>(shape, dt_out);
-
-    // Create and configure function
-    NEAbsoluteDifference abs_d;
-    abs_d.configure(&src1, &src2, &dst);
-
-    // Allocate tensors
-    src1.allocator()->allocate();
-    src2.allocator()->allocate();
-    dst.allocator()->allocate();
-
-    BOOST_TEST(!src1.info()->is_resizable());
-    BOOST_TEST(!src2.info()->is_resizable());
-    BOOST_TEST(!dst.info()->is_resizable());
-
-    // Fill tensors
-    library->fill_tensor_uniform(Accessor(src1), 0);
-    library->fill_tensor_uniform(Accessor(src2), 1);
-
-    // Compute function
-    abs_d.run();
-
-    return dst;
-}
-
-void validate_configuration(const Tensor &src1, const Tensor &src2, Tensor &dst, TensorShape shape)
-{
-    BOOST_TEST(src1.info()->is_resizable());
-    BOOST_TEST(src2.info()->is_resizable());
-    BOOST_TEST(dst.info()->is_resizable());
-
-    // Create and configure function
-    NEAbsoluteDifference abs_d;
-    abs_d.configure(&src1, &src2, &dst);
-
-    // Validate valid region
-    const ValidRegion valid_region = shape_to_valid_region(shape);
-    validate(src1.info()->valid_region(), valid_region);
-    validate(src2.info()->valid_region(), valid_region);
-    validate(dst.info()->valid_region(), valid_region);
-
-    // Validate padding
-    const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
-    validate(src1.info()->padding(), padding);
-    validate(src2.info()->padding(), padding);
-    validate(dst.info()->padding(), padding);
-}
-} // namespace
-
-#ifndef DOXYGEN_SKIP_THIS
-BOOST_AUTO_TEST_SUITE(NEON)
-BOOST_AUTO_TEST_SUITE(AbsoluteDifference)
-
-BOOST_AUTO_TEST_SUITE(U8)
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit") * boost::unit_test::label("nightly"))
-BOOST_DATA_TEST_CASE(Configuration, (SmallShapes() + LargeShapes()),
-                     shape)
-{
-    // Create tensors
-    Tensor src1 = create_tensor<Tensor>(shape, DataType::U8);
-    Tensor src2 = create_tensor<Tensor>(shape, DataType::U8);
-    Tensor dst  = create_tensor<Tensor>(shape, DataType::U8);
-
-    validate_configuration(src1, src2, dst, shape);
-}
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit"))
-BOOST_DATA_TEST_CASE(RunSmall, SmallShapes(),
-                     shape)
-{
-    // Compute function
-    Tensor dst = compute_absolute_difference(shape, DataType::U8, DataType::U8, DataType::U8);
-
-    // Compute reference
-    RawTensor ref_dst = Reference::compute_reference_absolute_difference(shape, DataType::U8, DataType::U8, DataType::U8);
-
-    // Validate output
-    validate(Accessor(dst), ref_dst);
-}
-BOOST_TEST_DECORATOR(*boost::unit_test::label("nightly"))
-BOOST_DATA_TEST_CASE(RunLarge, LargeShapes(),
-                     shape)
-{
-    // Compute function
-    Tensor dst = compute_absolute_difference(shape, DataType::U8, DataType::U8, DataType::U8);
-
-    // Compute reference
-    RawTensor ref_dst = Reference::compute_reference_absolute_difference(shape, DataType::U8, DataType::U8, DataType::U8);
-
-    // Validate output
-    validate(Accessor(dst), ref_dst);
-}
-BOOST_AUTO_TEST_SUITE_END()
-
-BOOST_AUTO_TEST_SUITE(S16)
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit") * boost::unit_test::label("nightly"))
-BOOST_DATA_TEST_CASE(Configuration, (SmallShapes() + LargeShapes()) * boost::unit_test::data::make({ DataType::U8, DataType::S16 }),
-                     shape, dt)
-{
-    // Create tensors
-    Tensor src1 = create_tensor<Tensor>(shape, dt);
-    Tensor src2 = create_tensor<Tensor>(shape, DataType::S16);
-    Tensor dst  = create_tensor<Tensor>(shape, DataType::S16);
-
-    validate_configuration(src1, src2, dst, shape);
-}
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit"))
-BOOST_DATA_TEST_CASE(RunSmall, SmallShapes() * boost::unit_test::data::make({ DataType::U8, DataType::S16 }),
-                     shape, dt)
-{
-    // Compute function
-    Tensor dst = compute_absolute_difference(shape, dt, DataType::S16, DataType::S16);
-
-    // Compute reference
-    RawTensor ref_dst = Reference::compute_reference_absolute_difference(shape, dt, DataType::S16, DataType::S16);
-
-    // Validate output
-    validate(Accessor(dst), ref_dst);
-}
-BOOST_TEST_DECORATOR(*boost::unit_test::label("nightly"))
-BOOST_DATA_TEST_CASE(RunLarge, LargeShapes() * boost::unit_test::data::make({ DataType::U8, DataType::S16 }),
-                     shape, dt)
-{
-    // Compute function
-    Tensor dst = compute_absolute_difference(shape, dt, DataType::S16, DataType::S16);
-
-    // Compute reference
-    RawTensor ref_dst = Reference::compute_reference_absolute_difference(shape, dt, DataType::S16, DataType::S16);
-
-    // Validate output
-    validate(Accessor(dst), ref_dst);
-}
-BOOST_AUTO_TEST_SUITE_END()
-
-BOOST_AUTO_TEST_SUITE_END()
-BOOST_AUTO_TEST_SUITE_END()
-#endif /* DOXYGEN_SKIP_THIS */
diff --git a/tests/validation_old/NEON/Accumulate.cpp b/tests/validation_old/NEON/Accumulate.cpp
deleted file mode 100644
index a173338..0000000
--- a/tests/validation_old/NEON/Accumulate.cpp
+++ /dev/null
@@ -1,145 +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 "NEON/Accessor.h"
-#include "PaddingCalculator.h"
-#include "Utils.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 "utils/TypePrinter.h"
-
-#include "arm_compute/core/Helpers.h"
-#include "arm_compute/core/Types.h"
-#include "arm_compute/runtime/NEON/functions/NEAccumulate.h"
-#include "arm_compute/runtime/Tensor.h"
-#include "arm_compute/runtime/TensorAllocator.h"
-
-#include "tests/validation_old/boost_wrapper.h"
-
-#include <random>
-#include <string>
-
-using namespace arm_compute;
-using namespace arm_compute::test;
-using namespace arm_compute::test::validation;
-
-namespace
-{
-/** Compute Neon accumulate function.
- *
- * @param[in] shape Shape of the input and output tensors.
- *
- * @return Computed output tensor.
- */
-Tensor compute_accumulate(const TensorShape &shape)
-{
-    // Create tensors
-    Tensor src = create_tensor<Tensor>(shape, DataType::U8);
-    Tensor dst = create_tensor<Tensor>(shape, DataType::S16);
-
-    // Create and configure function
-    NEAccumulate acc;
-    acc.configure(&src, &dst);
-
-    // Allocate tensors
-    src.allocator()->allocate();
-    dst.allocator()->allocate();
-
-    BOOST_TEST(!src.info()->is_resizable());
-    BOOST_TEST(!dst.info()->is_resizable());
-
-    // Fill tensors
-    library->fill_tensor_uniform(Accessor(src), 0);
-    library->fill_tensor_uniform(Accessor(dst), 1);
-
-    // Compute function
-    acc.run();
-
-    return dst;
-}
-} // namespace
-
-#ifndef DOXYGEN_SKIP_THIS
-BOOST_AUTO_TEST_SUITE(NEON)
-BOOST_AUTO_TEST_SUITE(Accumulate)
-
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit") * boost::unit_test::label("nightly"))
-BOOST_DATA_TEST_CASE(Configuration, (SmallShapes() + LargeShapes()),
-                     shape)
-{
-    // Create tensors
-    Tensor src = create_tensor<Tensor>(shape, DataType::U8);
-    Tensor dst = create_tensor<Tensor>(shape, DataType::S16);
-
-    BOOST_TEST(src.info()->is_resizable());
-    BOOST_TEST(dst.info()->is_resizable());
-
-    // Create and configure function
-    NEAccumulate acc;
-    acc.configure(&src, &dst);
-
-    // Validate valid region
-    const ValidRegion valid_region = shape_to_valid_region(shape);
-    validate(src.info()->valid_region(), valid_region);
-    validate(dst.info()->valid_region(), valid_region);
-
-    // Validate padding
-    const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
-    validate(src.info()->padding(), padding);
-    validate(dst.info()->padding(), padding);
-}
-
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit"))
-BOOST_DATA_TEST_CASE(RunSmall, SmallShapes(),
-                     shape)
-{
-    // Compute function
-    Tensor dst = compute_accumulate(shape);
-
-    // Compute reference
-    RawTensor ref_dst = Reference::compute_reference_accumulate(shape);
-
-    // Validate output
-    validate(Accessor(dst), ref_dst);
-}
-
-BOOST_TEST_DECORATOR(*boost::unit_test::label("nightly"))
-BOOST_DATA_TEST_CASE(RunLarge, LargeShapes(),
-                     shape)
-{
-    // Compute function
-    Tensor dst = compute_accumulate(shape);
-
-    // Compute reference
-    RawTensor ref_dst = Reference::compute_reference_accumulate(shape);
-
-    // Validate output
-    validate(Accessor(dst), ref_dst);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-BOOST_AUTO_TEST_SUITE_END()
-#endif /* DOXYGEN_SKIP_THIS */
diff --git a/tests/validation_old/NEON/AccumulateSquared.cpp b/tests/validation_old/NEON/AccumulateSquared.cpp
deleted file mode 100644
index f4eea7d..0000000
--- a/tests/validation_old/NEON/AccumulateSquared.cpp
+++ /dev/null
@@ -1,146 +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 "NEON/Accessor.h"
-#include "PaddingCalculator.h"
-#include "Utils.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 "utils/TypePrinter.h"
-
-#include "arm_compute/core/Helpers.h"
-#include "arm_compute/core/Types.h"
-#include "arm_compute/runtime/NEON/functions/NEAccumulate.h"
-#include "arm_compute/runtime/Tensor.h"
-#include "arm_compute/runtime/TensorAllocator.h"
-
-#include "tests/validation_old/boost_wrapper.h"
-
-#include <random>
-#include <string>
-
-using namespace arm_compute;
-using namespace arm_compute::test;
-using namespace arm_compute::test::validation;
-
-namespace
-{
-/** Compute Neon accumulate squared function.
- *
- * @param[in] shape Shape of the input and output tensors.
- *
- * @return Computed output tensor.
- */
-Tensor compute_accumulate_squared(const TensorShape &shape, uint32_t shift)
-{
-    // Create tensors
-    Tensor src = create_tensor<Tensor>(shape, DataType::U8);
-    Tensor dst = create_tensor<Tensor>(shape, DataType::S16);
-
-    // Create and configure function
-    NEAccumulateSquared acc;
-    acc.configure(&src, shift, &dst);
-
-    // Allocate tensors
-    src.allocator()->allocate();
-    dst.allocator()->allocate();
-
-    BOOST_TEST(!src.info()->is_resizable());
-    BOOST_TEST(!dst.info()->is_resizable());
-
-    // Fill tensors
-    // dst tensor filled with non-negative values
-    library->fill_tensor_uniform(Accessor(src), 0);
-    library->fill_tensor_uniform(Accessor(dst), 1, static_cast<int16_t>(0), std::numeric_limits<int16_t>::max());
-
-    // Compute function
-    acc.run();
-
-    return dst;
-}
-} // namespace
-
-#ifndef DOXYGEN_SKIP_THIS
-BOOST_AUTO_TEST_SUITE(NEON)
-BOOST_AUTO_TEST_SUITE(AccumulateSquared)
-
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit") * boost::unit_test::label("nightly"))
-BOOST_DATA_TEST_CASE(Configuration, (SmallShapes() + LargeShapes()) * boost::unit_test::data::xrange(0U, 16U),
-                     shape, shift)
-{
-    // Create tensors
-    Tensor src = create_tensor<Tensor>(shape, DataType::U8);
-    Tensor dst = create_tensor<Tensor>(shape, DataType::S16);
-
-    BOOST_TEST(src.info()->is_resizable());
-    BOOST_TEST(dst.info()->is_resizable());
-
-    // Create and configure function
-    NEAccumulateSquared acc;
-    acc.configure(&src, shift, &dst);
-
-    // Validate valid region
-    const ValidRegion valid_region = shape_to_valid_region(shape);
-    validate(src.info()->valid_region(), valid_region);
-    validate(dst.info()->valid_region(), valid_region);
-
-    // Validate padding
-    const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
-    validate(src.info()->padding(), padding);
-    validate(dst.info()->padding(), padding);
-}
-
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit"))
-BOOST_DATA_TEST_CASE(RunSmall, SmallShapes() * boost::unit_test::data::xrange(0U, 16U),
-                     shape, shift)
-{
-    // Compute function
-    Tensor dst = compute_accumulate_squared(shape, shift);
-
-    // Compute reference
-    RawTensor ref_dst = Reference::compute_reference_accumulate_squared(shape, shift);
-
-    // Validate output
-    validate(Accessor(dst), ref_dst);
-}
-
-BOOST_TEST_DECORATOR(*boost::unit_test::label("nightly"))
-BOOST_DATA_TEST_CASE(RunLarge, LargeShapes() * boost::unit_test::data::make({ 0U, 1U, 15U }),
-                     shape, shift)
-{
-    // Compute function
-    Tensor dst = compute_accumulate_squared(shape, shift);
-
-    // Compute reference
-    RawTensor ref_dst = Reference::compute_reference_accumulate_squared(shape, shift);
-
-    // Validate output
-    validate(Accessor(dst), ref_dst);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-BOOST_AUTO_TEST_SUITE_END()
-#endif /* DOXYGEN_SKIP_THIS */
diff --git a/tests/validation_old/NEON/AccumulateWeighted.cpp b/tests/validation_old/NEON/AccumulateWeighted.cpp
deleted file mode 100644
index 758e437..0000000
--- a/tests/validation_old/NEON/AccumulateWeighted.cpp
+++ /dev/null
@@ -1,145 +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 "NEON/Accessor.h"
-#include "PaddingCalculator.h"
-#include "Utils.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 "utils/TypePrinter.h"
-
-#include "arm_compute/core/Helpers.h"
-#include "arm_compute/core/Types.h"
-#include "arm_compute/runtime/NEON/functions/NEAccumulate.h"
-#include "arm_compute/runtime/Tensor.h"
-#include "arm_compute/runtime/TensorAllocator.h"
-
-#include "tests/validation_old/boost_wrapper.h"
-
-#include <random>
-#include <string>
-
-using namespace arm_compute;
-using namespace arm_compute::test;
-using namespace arm_compute::test::validation;
-
-namespace
-{
-/** Compute Neon accumulate weighted function.
- *
- * @param[in] shape Shape of the input and output tensors.
- *
- * @return Computed output tensor.
- */
-Tensor compute_accumulate_weighted(const TensorShape &shape, float alpha)
-{
-    // Create tensors
-    Tensor src = create_tensor<Tensor>(shape, DataType::U8);
-    Tensor dst = create_tensor<Tensor>(shape, DataType::U8);
-
-    // Create and configure function
-    NEAccumulateWeighted acc;
-    acc.configure(&src, alpha, &dst);
-
-    // Allocate tensors
-    src.allocator()->allocate();
-    dst.allocator()->allocate();
-
-    BOOST_TEST(!src.info()->is_resizable());
-    BOOST_TEST(!dst.info()->is_resizable());
-
-    // Fill tensors
-    library->fill_tensor_uniform(Accessor(src), 0);
-    library->fill_tensor_uniform(Accessor(dst), 1);
-
-    // Compute function
-    acc.run();
-
-    return dst;
-}
-} // namespace
-
-#ifndef DOXYGEN_SKIP_THIS
-BOOST_AUTO_TEST_SUITE(NEON)
-BOOST_AUTO_TEST_SUITE(AccumulateWeighted)
-
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit") * boost::unit_test::label("nightly"))
-BOOST_DATA_TEST_CASE(Configuration, (SmallShapes() + LargeShapes()) * boost::unit_test::data::make({ 0.f, 0.5f, 1.f }),
-                     shape, alpha)
-{
-    // Create tensors
-    Tensor src = create_tensor<Tensor>(shape, DataType::U8);
-    Tensor dst = create_tensor<Tensor>(shape, DataType::U8);
-
-    BOOST_TEST(src.info()->is_resizable());
-    BOOST_TEST(dst.info()->is_resizable());
-
-    // Create and configure function
-    NEAccumulateWeighted acc;
-    acc.configure(&src, alpha, &dst);
-
-    // Validate valid region
-    const ValidRegion valid_region = shape_to_valid_region(shape);
-    validate(src.info()->valid_region(), valid_region);
-    validate(dst.info()->valid_region(), valid_region);
-
-    // Validate padding
-    const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
-    validate(src.info()->padding(), padding);
-    validate(dst.info()->padding(), padding);
-}
-
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit"))
-BOOST_DATA_TEST_CASE(RunSmall, SmallShapes() * boost::unit_test::data::make({ 0.f, 0.5f, 1.f }),
-                     shape, alpha)
-{
-    // Compute function
-    Tensor dst = compute_accumulate_weighted(shape, alpha);
-
-    // Compute reference
-    RawTensor ref_dst = Reference::compute_reference_accumulate_weighted(shape, alpha);
-
-    // Validate output
-    validate(Accessor(dst), ref_dst);
-}
-
-BOOST_TEST_DECORATOR(*boost::unit_test::label("nightly"))
-BOOST_DATA_TEST_CASE(RunLarge, LargeShapes() * boost::unit_test::data::make({ 0.f, 0.5f, 1.f }),
-                     shape, alpha)
-{
-    // Compute function
-    Tensor dst = compute_accumulate_weighted(shape, alpha);
-
-    // Compute reference
-    RawTensor ref_dst = Reference::compute_reference_accumulate_weighted(shape, alpha);
-
-    // Validate output
-    validate(Accessor(dst), ref_dst);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-BOOST_AUTO_TEST_SUITE_END()
-#endif /* DOXYGEN_SKIP_THIS */
diff --git a/tests/validation_old/NEON/ROIPoolingLayer.cpp b/tests/validation_old/NEON/ROIPoolingLayer.cpp
deleted file mode 100644
index a8d5637..0000000
--- a/tests/validation_old/NEON/ROIPoolingLayer.cpp
+++ /dev/null
@@ -1,110 +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 "NEON/Accessor.h"
-#include "NEON/ArrayAccessor.h"
-#include "arm_compute/runtime/NEON/functions/NEROIPoolingLayer.h"
-#include "tests/Globals.h"
-#include "tests/Utils.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 "utils/TypePrinter.h"
-
-#include <random>
-#include <vector>
-
-using namespace arm_compute;
-using namespace arm_compute::test;
-using namespace arm_compute::test::validation;
-
-namespace
-{
-Tensor compute_roi_pooling_layer(const TensorShape &shape, DataType dt, const std::vector<ROI> &rois, ROIPoolingLayerInfo pool_info)
-{
-    TensorShape shape_dst;
-    shape_dst.set(0, pool_info.pooled_width());
-    shape_dst.set(1, pool_info.pooled_height());
-    shape_dst.set(2, shape.z());
-    shape_dst.set(3, rois.size());
-
-    // Create tensors
-    Tensor src = create_tensor<Tensor>(shape, dt);
-    Tensor dst = create_tensor<Tensor>(shape_dst, dt);
-
-    // Create ROI array
-    Array<ROI> rois_array(rois.size());
-    fill_array(ArrayAccessor<ROI>(rois_array), rois);
-
-    // Create and configure function
-    NEROIPoolingLayer roi_pool;
-    roi_pool.configure(&src, &rois_array, &dst, pool_info);
-
-    // Allocate tensors
-    src.allocator()->allocate();
-    dst.allocator()->allocate();
-
-    BOOST_TEST(!src.info()->is_resizable());
-    BOOST_TEST(!dst.info()->is_resizable());
-
-    // Fill tensors
-    std::uniform_real_distribution<> distribution(-1, 1);
-    library->fill(Accessor(src), distribution, 0);
-
-    // Compute function
-    roi_pool.run();
-
-    return dst;
-}
-} // namespace
-
-#ifndef DOXYGEN_SKIP_THIS
-BOOST_AUTO_TEST_SUITE(NEON)
-BOOST_AUTO_TEST_SUITE(ROIPoolingLayer)
-
-BOOST_AUTO_TEST_SUITE(Float)
-BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit"))
-BOOST_DATA_TEST_CASE(RunSmall, CNNFloatDataTypes() * boost::unit_test::data::make({ 10, 20, 40 }) * boost::unit_test::data::make({ 7, 9 }) * boost::unit_test::data::make({ 1.f / 8.f, 1.f / 16.f }),
-                     dt, num_rois, roi_pool_size, roi_scale)
-{
-    TensorShape         shape(50U, 47U, 2U, 3U);
-    ROIPoolingLayerInfo pool_info(roi_pool_size, roi_pool_size, roi_scale);
-
-    // Construct ROI vector
-    std::vector<ROI> rois = generate_random_rois(shape, pool_info, num_rois, user_config.seed);
-
-    // Compute function
-    Tensor dst = compute_roi_pooling_layer(shape, dt, rois, pool_info);
-
-    // Compute reference
-    RawTensor ref_dst = Reference::compute_reference_roi_pooling_layer(shape, dt, rois, pool_info);
-
-    // Validate output
-    validate(Accessor(dst), ref_dst);
-}
-BOOST_AUTO_TEST_SUITE_END()
-
-BOOST_AUTO_TEST_SUITE_END()
-BOOST_AUTO_TEST_SUITE_END()
-#endif /* DOXYGEN_SKIP_THIS */
diff --git a/tests/validation_old/ProgramOptions.cpp b/tests/validation_old/ProgramOptions.cpp
deleted file mode 100644
index 96320e8..0000000
--- a/tests/validation_old/ProgramOptions.cpp
+++ /dev/null
@@ -1,87 +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 "ProgramOptions.h"
-
-#include "arm_compute/core/Types.h"
-#include "tests/TypeReader.h"
-#include "utils/TypePrinter.h"
-
-#include <random>
-#include <sstream>
-
-namespace arm_compute
-{
-namespace test
-{
-ProgramOptions::ProgramOptions()
-{
-    boost::program_options::options_description generic("Generic options");
-    generic.add_options()("help", "Print help message")("seed", boost::program_options::value<std::random_device::result_type>()->default_value(std::random_device()()), "Seed for the tensor library");
-
-    _visible.add(generic);
-
-    _hidden.add_options()("path", boost::program_options::value<std::string>(), "Path from where to load the asset/s");
-
-    _positional.add("path", 1);
-}
-
-void ProgramOptions::add_options(const boost::program_options::options_description &options)
-{
-    _visible.add(options);
-}
-
-bool ProgramOptions::wants_help() const
-{
-    return (_vm.count("help") != 0);
-}
-
-std::string ProgramOptions::get_help() const
-{
-    std::stringstream help;
-    help << _visible;
-
-    return help.str();
-}
-
-void ProgramOptions::parse_commandline(int argc, char **argv)
-{
-    boost::program_options::options_description all;
-    all.add(_visible).add(_hidden);
-
-    boost::program_options::store(boost::program_options::command_line_parser(argc, argv)
-                                  .options(all)
-                                  .positional(_positional)
-                                  .allow_unregistered()
-                                  .run(),
-                                  _vm);
-
-    if(_vm.count("help") == 0 && _vm.count("path") == 0)
-    {
-        throw boost::program_options::required_option("PATH");
-    }
-
-    boost::program_options::notify(_vm);
-}
-} // namespace test
-} // namespace arm_compute
diff --git a/tests/validation_old/ProgramOptions.h b/tests/validation_old/ProgramOptions.h
deleted file mode 100644
index 0b28355..0000000
--- a/tests/validation_old/ProgramOptions.h
+++ /dev/null
@@ -1,101 +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_PROGRAM_OPTIONS_H__
-#define __ARM_COMPUTE_TEST_PROGRAM_OPTIONS_H__
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Weffc++"
-#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
-#pragma GCC diagnostic ignored "-Wctor-dtor-privacy"
-#include "boost/program_options.hpp"
-#pragma GCC diagnostic pop
-
-#include <random>
-#include <sstream>
-
-namespace arm_compute
-{
-namespace test
-{
-/** Defines available commandline arguments and allows to parse them. */
-class ProgramOptions
-{
-public:
-    /** Defines available options. */
-    ProgramOptions();
-
-    /** Signals if the --help flag has been passed on the commandline. */
-    bool wants_help() const;
-
-    /** Returns a string describing all available options. */
-    std::string get_help() const;
-
-    /** Parses the given arguments and makes them available via @ref get.
-     *
-     * @param[in] argc Number of command line arguments.
-     * @param[in] argv Pointer to the command line arguments.
-     */
-    void parse_commandline(int argc, char **argv);
-
-    /** Sets @p value if it has been specified on the command line.
-     *
-     * @note The type T has to match the type that has been specified for the
-     *       command line option.
-     *
-     * @param[in]  name  Name of the option to query.
-     * @param[out] value Variable to which the value will be assigned.
-     *
-     * @return True if the value is assigned, false otherwise.
-     */
-    template <typename T>
-    bool get(const std::string &name, T &value) const;
-
-protected:
-    /** Allows subclasses to add more specific options
-     *
-     * @param[in] options Boost object containing options and their descriptions
-     */
-    void add_options(const boost::program_options::options_description &options);
-
-private:
-    boost::program_options::options_description            _hidden{};
-    boost::program_options::options_description            _visible{ "Configuration options" };
-    boost::program_options::positional_options_description _positional{};
-    boost::program_options::variables_map                  _vm{};
-};
-
-template <typename T>
-bool ProgramOptions::get(const std::string &name, T &value) const
-{
-    if(_vm.count(name) != 0)
-    {
-        value = _vm[name].as<T>();
-        return true;
-    }
-
-    return false;
-}
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_PROGRAM_OPTIONS_H__ */
diff --git a/tests/validation_old/RawTensor.cpp b/tests/validation_old/RawTensor.cpp
deleted file mode 100644
index bc2747d..0000000
--- a/tests/validation_old/RawTensor.cpp
+++ /dev/null
@@ -1,67 +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 "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
deleted file mode 100644
index fd0ab2b..0000000
--- a/tests/validation_old/RawTensor.h
+++ /dev/null
@@ -1,86 +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_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_old/Reference.cpp b/tests/validation_old/Reference.cpp
deleted file mode 100644
index c76d429..0000000
--- a/tests/validation_old/Reference.cpp
+++ /dev/null
@@ -1,156 +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 "Reference.h"
-
-#include "Helpers.h"
-#include "ReferenceCPP.h"
-#include "tests/AssetsLibrary.h"
-#include "tests/Globals.h"
-#include "tests/validation_old/Helpers.h"
-
-#include <random>
-#include <vector>
-
-using namespace arm_compute::test;
-
-#ifndef DOXYGEN_SKIP_THIS
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-KeyPointArray Reference::compute_reference_harris_corners(const TensorShape &shape, float threshold, float min_dist, float sensitivity,
-                                                          int32_t gradient_size, int32_t block_size, BorderMode border_mode, uint8_t constant_border_value)
-{
-    // Create reference
-    RawTensor ref_src(shape, Format::U8);
-    RawTensor raw_Gx(shape, (gradient_size == 7) ? Format::S32 : Format::S16);
-    RawTensor raw_Gy(shape, (gradient_size == 7) ? Format::S32 : Format::S16);
-    RawTensor raw_candidates(shape, Format::F32);
-    RawTensor raw_non_maxima(shape, Format::F32);
-
-    KeyPointArray corners(shape.total_size());
-
-    // Fill reference
-    library->fill_tensor_uniform(ref_src, 0);
-
-    // Compute reference
-    ReferenceCPP::harris_corners(ref_src, raw_Gx, raw_Gy, raw_candidates, raw_non_maxima, threshold, min_dist, sensitivity, gradient_size, block_size, corners, border_mode, constant_border_value);
-
-    return corners;
-}
-
-RawTensor Reference::compute_reference_absolute_difference(const TensorShape &shape, DataType dt_in0, DataType dt_in1, DataType dt_out)
-{
-    // Create reference
-    RawTensor ref_src1(shape, dt_in0);
-    RawTensor ref_src2(shape, dt_in1);
-    RawTensor ref_dst(shape, dt_out);
-
-    // Fill reference
-    library->fill_tensor_uniform(ref_src1, 0);
-    library->fill_tensor_uniform(ref_src2, 1);
-
-    // Compute reference
-    ReferenceCPP::absolute_difference(ref_src1, ref_src2, ref_dst);
-
-    return ref_dst;
-}
-
-RawTensor Reference::compute_reference_accumulate(const TensorShape &shape)
-{
-    // Create reference
-    RawTensor ref_src(shape, DataType::U8);
-    RawTensor ref_dst(shape, DataType::S16);
-
-    // Fill reference
-    library->fill_tensor_uniform(ref_src, 0);
-    library->fill_tensor_uniform(ref_dst, 1);
-
-    // Compute reference
-    ReferenceCPP::accumulate(ref_src, ref_dst);
-
-    return ref_dst;
-}
-
-RawTensor Reference::compute_reference_accumulate_squared(const TensorShape &shape, uint32_t shift)
-{
-    // Create reference
-    RawTensor ref_src(shape, DataType::U8);
-    RawTensor ref_dst(shape, DataType::S16);
-
-    // Fill reference
-    // ref_dst tensor filled with non-negative values
-    library->fill_tensor_uniform(ref_src, 0);
-    library->fill_tensor_uniform(ref_dst, 1, static_cast<int16_t>(0), std::numeric_limits<int16_t>::max());
-
-    // Compute reference
-    ReferenceCPP::accumulate_squared(ref_src, ref_dst, shift);
-
-    return ref_dst;
-}
-
-RawTensor Reference::compute_reference_accumulate_weighted(const TensorShape &shape, float alpha)
-{
-    // Create reference
-    RawTensor ref_src(shape, DataType::U8);
-    RawTensor ref_dst(shape, DataType::U8);
-
-    // Fill reference
-    library->fill_tensor_uniform(ref_src, 0);
-    library->fill_tensor_uniform(ref_dst, 1);
-
-    // Compute reference
-    ReferenceCPP::accumulate_weighted(ref_src, ref_dst, alpha);
-
-    return ref_dst;
-}
-
-RawTensor Reference::compute_reference_roi_pooling_layer(const TensorShape &shape, DataType dt, const std::vector<ROI> &rois, const ROIPoolingLayerInfo &pool_info)
-{
-    TensorShape shape_dst;
-    shape_dst.set(0, pool_info.pooled_width());
-    shape_dst.set(1, pool_info.pooled_height());
-    shape_dst.set(2, shape.z());
-    shape_dst.set(3, rois.size());
-
-    // Create reference
-    RawTensor ref_src(shape, dt);
-    RawTensor ref_dst(shape_dst, dt);
-
-    // Fill reference
-    std::uniform_real_distribution<> distribution(-1, 1);
-    library->fill(ref_src, distribution, 0.0);
-
-    // Compute reference
-    ReferenceCPP::roi_pooling_layer(ref_src, ref_dst, rois, pool_info);
-
-    return ref_dst;
-}
-
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
-#endif /* DOXYGEN_SKIP_THIS */
diff --git a/tests/validation_old/Reference.h b/tests/validation_old/Reference.h
deleted file mode 100644
index 7b4043c..0000000
--- a/tests/validation_old/Reference.h
+++ /dev/null
@@ -1,108 +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_REFERENCE_REFERENCE_H__
-#define __ARM_COMPUTE_TEST_REFERENCE_REFERENCE_H__
-
-#include "arm_compute/runtime/Array.h"
-#include "tests/RawTensor.h"
-#include "tests/Types.h"
-
-#include <map>
-#include <vector>
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-/** Interface for reference implementations. */
-class Reference
-{
-public:
-    /** Compute reference Harris corners.
-     *
-     * @param[in] shape                 Shape of input tensor
-     * @param[in] threshold             Minimum threshold with which to eliminate Harris Corner scores (computed using the normalized Sobel kernel).
-     * @param[in] min_dist              Radial Euclidean distance for the euclidean distance stage
-     * @param[in] sensitivity           Sensitivity threshold k from the Harris-Stephens equation
-     * @param[in] gradient_size         The gradient window size to use on the input. The implementation supports 3, 5, and 7
-     * @param[in] block_size            The block window size used to compute the Harris Corner score. The implementation supports 3, 5, and 7.
-     * @param[in] border_mode           Border mode to use
-     * @param[in] constant_border_value Constant value to use for borders if border_mode is set to CONSTANT.
-     *
-     * @return Computed corners' keypoints.
-     */
-    static KeyPointArray compute_reference_harris_corners(const TensorShape &shape, float threshold, float min_dist, float sensitivity,
-                                                          int32_t gradient_size, int32_t block_size, BorderMode border_mode, uint8_t constant_border_value);
-    /** Compute reference absolute difference.
-     *
-     * @param[in] shape  Shape of the input and output tensors.
-     * @param[in] dt_in0 Data type of first input tensor.
-     * @param[in] dt_in1 Data type of second input tensor.
-     * @param[in] dt_out Data type of the output tensor.
-     *
-     * @return Computed raw tensor.
-     */
-    static RawTensor compute_reference_absolute_difference(const TensorShape &shape, DataType dt_in0, DataType dt_in1, DataType dt_out);
-    /** Compute reference accumulate.
-     *
-     * @param[in] shape Shape of the input and output tensors.
-     *
-     * @return Computed raw tensor.
-     */
-    static RawTensor compute_reference_accumulate(const TensorShape &shape);
-    /** Compute reference accumulate.
-     *
-     * @param[in] shape Shape of the input and output tensors.
-     * @param[in] shift A uint32_t value within the range of [0, 15]
-     *
-     * @return Computed raw tensor.
-     */
-    static RawTensor compute_reference_accumulate_squared(const TensorShape &shape, uint32_t shift);
-    /** Compute reference accumulate.
-     *
-     * @param[in] shape Shape of the input and output tensors.
-     * @param[in] alpha A float value within the range of [0, 1]
-     *
-     * @return Computed raw tensor.
-     */
-    static RawTensor compute_reference_accumulate_weighted(const TensorShape &shape, float alpha);
-    /** Compute reference roi pooling layer.
-     *
-     * @param[in] shape     Shape of the input tensor.
-     * @param[in] dt        Data type of input and output tensors.
-     * @param[in] rois      Region of interest vector.
-     * @param[in] pool_info ROI Pooling Layer information.
-     */
-    static RawTensor compute_reference_roi_pooling_layer(const TensorShape &shape, DataType dt, const std::vector<ROI> &rois, const ROIPoolingLayerInfo &pool_info);
-
-protected:
-    Reference()  = default;
-    ~Reference() = default;
-};
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_REFERENCE_REFERENCE_H__ */
diff --git a/tests/validation_old/ReferenceCPP.cpp b/tests/validation_old/ReferenceCPP.cpp
deleted file mode 100644
index 4d6141a..0000000
--- a/tests/validation_old/ReferenceCPP.cpp
+++ /dev/null
@@ -1,152 +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 "ReferenceCPP.h"
-
-#include "TensorFactory.h"
-#include "TensorOperations.h"
-#include "TensorVisitors.h"
-
-#include "arm_compute/core/Coordinates.h"
-#include "arm_compute/core/Error.h"
-#include "arm_compute/core/TensorInfo.h"
-#include "arm_compute/core/TensorShape.h"
-#include "arm_compute/runtime/Tensor.h"
-#include "utils/TypePrinter.h"
-
-#include "tests/validation_old/boost_wrapper.h"
-
-#include <algorithm>
-#include <functional>
-#include <memory>
-#include <numeric>
-#include <vector>
-
-using namespace arm_compute::test::validation::tensor_visitors;
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-// Harris corners
-void ReferenceCPP::harris_corners(RawTensor &src, RawTensor &Gx, RawTensor &Gy, const RawTensor &candidates, const RawTensor &non_maxima, float threshold, float min_dist, float sensitivity,
-                                  int32_t gradient_size, int32_t block_size, KeyPointArray &corners, BorderMode border_mode, uint8_t constant_border_value)
-{
-    ARM_COMPUTE_ERROR_ON(src.data_type() != DataType::U8 || (Gx.data_type() != DataType::S16 && Gx.data_type() != DataType::S32) || (Gy.data_type() != DataType::S16 && Gy.data_type() != DataType::S32)
-                         || candidates.data_type() != DataType::F32 || non_maxima.data_type() != DataType::F32);
-
-    Tensor<uint8_t> s(src.shape(), src.data_type(), src.fixed_point_position(), reinterpret_cast<const uint8_t *>(src.data()));
-    Tensor<float>   c(candidates.shape(), candidates.data_type(), candidates.fixed_point_position(), const_cast<float *>(reinterpret_cast<const float *>(candidates.data())));  // NOLINT
-    Tensor<float>   nm(non_maxima.shape(), non_maxima.data_type(), non_maxima.fixed_point_position(), const_cast<float *>(reinterpret_cast<const float *>(non_maxima.data()))); // NOLINT
-
-    if(gradient_size == 7)
-    {
-        Tensor<int32_t> gx(Gx.shape(), Gx.data_type(), Gx.fixed_point_position(), reinterpret_cast<int32_t *>(Gx.data()));
-        Tensor<int32_t> gy(Gy.shape(), Gy.data_type(), Gy.fixed_point_position(), reinterpret_cast<int32_t *>(Gy.data()));
-        tensor_operations::harris_corners(s, gx, gy, c, nm, threshold, min_dist, sensitivity, gradient_size, block_size, corners, border_mode, constant_border_value);
-    }
-    else
-    {
-        Tensor<int16_t> gx(Gx.shape(), Gx.data_type(), Gx.fixed_point_position(), reinterpret_cast<int16_t *>(Gx.data()));
-        Tensor<int16_t> gy(Gy.shape(), Gy.data_type(), Gy.fixed_point_position(), reinterpret_cast<int16_t *>(Gy.data()));
-        tensor_operations::harris_corners(s, gx, gy, c, nm, threshold, min_dist, sensitivity, gradient_size, block_size, corners, border_mode, constant_border_value);
-    }
-}
-
-// Absolute difference
-void ReferenceCPP::absolute_difference(const RawTensor &src1, const RawTensor &src2, RawTensor &dst)
-{
-    const TensorVariant s1 = TensorFactory::get_tensor(src1);
-    const TensorVariant s2 = TensorFactory::get_tensor(src2);
-    TensorVariant       d  = TensorFactory::get_tensor(dst);
-    boost::apply_visitor(absolute_difference_visitor(), s1, s2, d);
-}
-
-// Integral image
-void ReferenceCPP::integral_image(const RawTensor &src, RawTensor &dst)
-{
-    ARM_COMPUTE_ERROR_ON(src.data_type() != DataType::U8 || dst.data_type() != DataType::U32);
-    const Tensor<uint8_t> s(src.shape(), src.data_type(), src.fixed_point_position(), reinterpret_cast<const uint8_t *>(src.data()));
-    Tensor<uint32_t>      d(dst.shape(), dst.data_type(), dst.fixed_point_position(), reinterpret_cast<uint32_t *>(dst.data()));
-    tensor_operations::integral_image(s, d);
-}
-
-// Accumulate
-void ReferenceCPP::accumulate(const RawTensor &src, RawTensor &dst)
-{
-    ARM_COMPUTE_ERROR_ON(src.data_type() != DataType::U8 || dst.data_type() != DataType::S16);
-    const Tensor<uint8_t> s(src.shape(), src.data_type(), src.fixed_point_position(), reinterpret_cast<const uint8_t *>(src.data()));
-    Tensor<int16_t>       d(dst.shape(), dst.data_type(), dst.fixed_point_position(), reinterpret_cast<int16_t *>(dst.data()));
-    tensor_operations::accumulate(s, d);
-}
-
-// Accumulate squared
-void ReferenceCPP::accumulate_squared(const RawTensor &src, RawTensor &dst, uint32_t shift)
-{
-    ARM_COMPUTE_ERROR_ON(src.data_type() != DataType::U8 || dst.data_type() != DataType::S16);
-    const Tensor<uint8_t> s(src.shape(), src.data_type(), src.fixed_point_position(), reinterpret_cast<const uint8_t *>(src.data()));
-    Tensor<int16_t>       d(dst.shape(), dst.data_type(), dst.fixed_point_position(), reinterpret_cast<int16_t *>(dst.data()));
-    tensor_operations::accumulate_squared(s, d, shift);
-}
-
-// Accumulate weighted
-void ReferenceCPP::accumulate_weighted(const RawTensor &src, RawTensor &dst, float alpha)
-{
-    ARM_COMPUTE_ERROR_ON(src.data_type() != DataType::U8 || dst.data_type() != DataType::U8);
-    const Tensor<uint8_t> s(src.shape(), src.data_type(), src.fixed_point_position(), reinterpret_cast<const uint8_t *>(src.data()));
-    Tensor<uint8_t>       d(dst.shape(), dst.data_type(), dst.fixed_point_position(), reinterpret_cast<uint8_t *>(dst.data()));
-    tensor_operations::accumulate_weighted(s, d, alpha);
-}
-
-// Non linear filter
-void ReferenceCPP::non_linear_filter(const RawTensor &src, RawTensor &dst, NonLinearFilterFunction function, unsigned int mask_size,
-                                     MatrixPattern pattern, const uint8_t *mask, BorderMode border_mode, uint8_t constant_border_value)
-{
-    ARM_COMPUTE_ERROR_ON(src.data_type() != DataType::U8 || dst.data_type() != DataType::U8);
-    const Tensor<uint8_t> s(src.shape(), src.data_type(), src.fixed_point_position(), reinterpret_cast<const uint8_t *>(src.data()));
-    Tensor<uint8_t>       d(dst.shape(), dst.data_type(), dst.fixed_point_position(), reinterpret_cast<uint8_t *>(dst.data()));
-    tensor_operations::non_linear_filter(s, d, function, mask_size, pattern, mask, border_mode, constant_border_value);
-}
-
-// Threshold
-void ReferenceCPP::threshold(const RawTensor &src, RawTensor &dst, uint8_t threshold, uint8_t false_value, uint8_t true_value, ThresholdType type, uint8_t upper)
-{
-    ARM_COMPUTE_ERROR_ON(src.data_type() != DataType::U8 || dst.data_type() != DataType::U8);
-    const Tensor<uint8_t> s(src.shape(), src.data_type(), src.fixed_point_position(), reinterpret_cast<const uint8_t *>(src.data()));
-    Tensor<uint8_t>       d(dst.shape(), dst.data_type(), dst.fixed_point_position(), reinterpret_cast<uint8_t *>(dst.data()));
-    tensor_operations::threshold(s, d, threshold, false_value, true_value, type, upper);
-}
-
-// ROI Pooling Layer
-void ReferenceCPP::roi_pooling_layer(const RawTensor &src, RawTensor &dst, const std::vector<ROI> &rois, const ROIPoolingLayerInfo &pool_info)
-{
-    const TensorVariant s = TensorFactory::get_tensor(src);
-    TensorVariant       d = TensorFactory::get_tensor(dst);
-    boost::apply_visitor(tensor_visitors::roi_pooling_layer_visitor(s, rois, pool_info), d);
-}
-
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
diff --git a/tests/validation_old/ReferenceCPP.h b/tests/validation_old/ReferenceCPP.h
deleted file mode 100644
index 79d0d69..0000000
--- a/tests/validation_old/ReferenceCPP.h
+++ /dev/null
@@ -1,139 +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_REFERENCE_REFERENCE_CPP_H__
-#define __ARM_COMPUTE_TEST_REFERENCE_REFERENCE_CPP_H__
-
-#include "RawTensor.h"
-#include "Reference.h"
-
-#include <map>
-#include <memory>
-#include <ostream>
-#include <vector>
-
-namespace arm_compute
-{
-class Tensor;
-
-namespace test
-{
-namespace validation
-{
-/** C++ reference implementation. */
-class ReferenceCPP final : public Reference
-{
-public:
-    /** Function to compute reference Harris corners.
-     *
-     * @param[in]  src                   Input tensor
-     * @param[in]  Gx                    Tensor used to compute Sobel along the x axis
-     * @param[in]  Gy                    Tensor used to compute Sobel along the y axis
-     * @param[in]  candidates            Tensor used to store candidate corners
-     * @param[in]  non_maxima            Tensor used to store non_maxima suppressed candidate corners
-     * @param[in]  threshold             Minimum threshold with which to eliminate Harris Corner scores (computed using the normalized Sobel kernel).
-     * @param[in]  min_dist              Radial Euclidean distance for the euclidean distance stage
-     * @param[in]  sensitivity           Sensitivity threshold k from the Harris-Stephens equation
-     * @param[in]  gradient_size         The gradient window size to use on the input. The implementation supports 3, 5, and 7
-     * @param[in]  block_size            The block window size used to compute the Harris Corner score. The implementation supports 3, 5, and 7.
-     * @param[out] corners               Array of keypoints to store the results.
-     * @param[in]  border_mode           Border mode to use
-     * @param[in]  constant_border_value Constant value to use for borders if border_mode is set to CONSTANT.
-     *
-     */
-    static void harris_corners(RawTensor &src, RawTensor &Gx, RawTensor &Gy, const RawTensor &candidates, const RawTensor &non_maxima, float threshold, float min_dist, float sensitivity,
-                               int32_t gradient_size, int32_t block_size, KeyPointArray &corners, BorderMode border_mode, uint8_t constant_border_value);
-    /** Function to compute the integral image of a tensor.
-     *
-     * @param[in]  src Input tensor.
-     * @param[out] dst Result tensor.
-     */
-    static void integral_image(const RawTensor &src, RawTensor &dst);
-    /** Function to compute the absolute difference between two tensors.
-     *
-     * @param[in]  src1 First tensor.
-     * @param[in]  src2 Second tensor.
-     * @param[out] dst  Result tensor.
-     */
-    static void absolute_difference(const RawTensor &src1, const RawTensor &src2, RawTensor &dst);
-    /** Function to accumulate an input tensor into an output tensor.
-     *
-     * @param[in]      src Input tensor.
-     * @param[in, out] dst Result tensor.
-     */
-    static void accumulate(const RawTensor &src, RawTensor &dst);
-    /** Function to accumulate a squared value from an input tensor to an output tensor.
-     *
-     * @param[in]      src   Input tensor.
-     * @param[in, out] dst   Result tensor.
-     * @param[in]      shift A uint32_t value within the range of [0, 15]
-     */
-    static void accumulate_squared(const RawTensor &src, RawTensor &dst, uint32_t shift);
-    /** Function to accumulate a weighted value from an input tensor to an output tensor.
-     *
-     * @param[in]      src   Input tensor.
-     * @param[in, out] dst   Result tensor.
-     * @param[in]      alpha A float value within the range of [0, 1]
-     */
-    static void accumulate_weighted(const RawTensor &src, RawTensor &dst, float alpha);
-    /** Compute non linear filter function.
-     *
-     * @param[in]  src                   First input tensor
-     * @param[out] dst                   Output tensor
-     * @param[in]  function              Non linear function to perform
-     * @param[in]  mask_size             Mask size. Supported sizes: 3, 5
-     * @param[in]  pattern               Matrix pattern
-     * @param[in]  mask                  The given mask.
-     * @param[in]  border_mode           Strategy to use for borders.
-     * @param[in]  constant_border_value (Optional) Constant value to use for borders if border_mode is set to CONSTANT.
-    */
-    static void non_linear_filter(const RawTensor &src, RawTensor &dst, NonLinearFilterFunction function, unsigned int mask_size,
-                                  MatrixPattern pattern, const uint8_t *mask, BorderMode border_mode, uint8_t constant_border_value = 0);
-    /** Threshold of@p src to @p dst
-     *
-     * @param[in]  src         Input tensor.
-     * @param[out] dst         Result tensor.
-     * @param[in]  threshold   Threshold. When the threhold type is RANGE, this is used as the lower threshold.
-     * @param[in]  false_value value to set when the condition is not respected.
-     * @param[in]  true_value  value to set when the condition is respected.
-     * @param[in]  type        Thresholding type. Either RANGE or BINARY.
-     * @param[in]  upper       Upper threshold. Only used when the thresholding type is RANGE.
-     */
-    static void threshold(const RawTensor &src, RawTensor &dst, uint8_t threshold, uint8_t false_value, uint8_t true_value, ThresholdType type, uint8_t upper);
-    /** ROI Pooling layer of @p src based on the information from @p pool_info and @p rois.
-     *
-     * @param[in]  src       Input tensor.
-     * @param[out] dst       Result tensor.
-     * @param[in]  rois      Region of Interest points.
-     * @param[in]  pool_info ROI Pooling Layer information.
-     */
-    static void roi_pooling_layer(const RawTensor &src, RawTensor &dst, const std::vector<ROI> &rois, const ROIPoolingLayerInfo &pool_info);
-
-private:
-    ReferenceCPP()  = delete;
-    ~ReferenceCPP() = delete;
-};
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_REFERENCE_REFERENCE_CPP_H__ */
diff --git a/tests/validation_old/SConscript b/tests/validation_old/SConscript
deleted file mode 100644
index b401f88..0000000
--- a/tests/validation_old/SConscript
+++ /dev/null
@@ -1,120 +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.
-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')
-    Import('arm_compute_core_a')
-    old_validation_env.Append(LIBS = [arm_compute_a, arm_compute_core_a])
-    arm_compute_lib = arm_compute_a
-else:
-    Import('arm_compute_so')
-    old_validation_env.Append(LIBS = ["arm_compute", "arm_compute_core"])
-    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_old/Tensor.h b/tests/validation_old/Tensor.h
deleted file mode 100644
index 84d76e7..0000000
--- a/tests/validation_old/Tensor.h
+++ /dev/null
@@ -1,118 +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_TENSOR_H__
-#define __ARM_COMPUTE_TEST_TENSOR_H__
-
-#include "arm_compute/core/TensorShape.h"
-#include "arm_compute/core/Types.h"
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-template <typename T>
-class Tensor
-{
-public:
-    Tensor()
-        : _shape(), _dt(DataType::UNKNOWN), _fixed_point_position(0), _ptr(nullptr), _ptr_const(nullptr) {};
-
-    Tensor(TensorShape shape, DataType dt, int fixed_point_position, T *ptr)
-        : _shape(shape), _dt(dt), _fixed_point_position(fixed_point_position), _ptr(ptr), _ptr_const(nullptr) {};
-
-    Tensor(TensorShape shape, DataType dt, int fixed_point_position, const T *ptr)
-        : _shape(shape), _dt(dt), _fixed_point_position(fixed_point_position), _ptr(nullptr), _ptr_const(ptr) {};
-
-    Tensor(const Tensor &tensor) = delete;
-    Tensor &operator=(const Tensor &) = delete;
-    Tensor(Tensor &&)                 = default;
-    Tensor &operator=(Tensor &&) = default;
-
-    ~Tensor() = default;
-
-    T &operator[](size_t offset)
-    {
-        ARM_COMPUTE_ERROR_ON(_ptr == nullptr);
-
-        return _ptr[offset];
-    }
-
-    const T &operator[](size_t offset) const
-    {
-        const T *ptr = (_ptr_const != nullptr) ? _ptr_const : _ptr;
-
-        ARM_COMPUTE_ERROR_ON(ptr == nullptr);
-
-        return ptr[offset]; // NOLINT
-    }
-
-    int num_elements() const
-    {
-        return std::accumulate(_shape.cbegin(), _shape.cend(), 1, std::multiplies<int>());
-    }
-
-    TensorShape shape() const
-    {
-        return _shape;
-    }
-
-    DataType data_type() const
-    {
-        return _dt;
-    }
-
-    int fixed_point_position() const
-    {
-        return _fixed_point_position;
-    }
-
-    const T *data() const
-    {
-        return (_ptr_const != nullptr) ? _ptr_const : _ptr;
-    }
-
-    T *data()
-    {
-        return _ptr;
-    }
-
-    const T *data_const() const
-    {
-        return _ptr_const;
-    }
-
-private:
-    TensorShape _shape;
-    DataType    _dt;
-    int         _fixed_point_position;
-    T          *_ptr;
-    const T    *_ptr_const;
-};
-} // namespace validation
-} // test
-} // arm_compute
-
-#endif /* __ARM_COMPUTE_TEST_TENSOR_H__ */
diff --git a/tests/validation_old/TensorFactory.h b/tests/validation_old/TensorFactory.h
deleted file mode 100644
index 3f5b960..0000000
--- a/tests/validation_old/TensorFactory.h
+++ /dev/null
@@ -1,111 +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_TENSOR_FACTORY_H__
-#define __ARM_COMPUTE_TEST_TENSOR_FACTORY_H__
-
-#include "arm_compute/core/Error.h"
-#include "tests/RawTensor.h"
-#include "tests/validation_old/Tensor.h"
-#include "tests/validation_old/half.h"
-
-#include "tests/validation_old/boost_wrapper.h"
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-using TensorVariant = boost::variant<Tensor<uint8_t>, Tensor<int8_t>,
-      Tensor<uint16_t>, Tensor<int16_t>,
-      Tensor<uint32_t>, Tensor<int32_t>,
-      Tensor<half_float::half>,
-      Tensor<float>>;
-
-/** Helper to create a constant type if the passed reference is constant. */
-template <typename R, typename T>
-struct match_const
-{
-    using type = typename std::conditional<std::is_const<typename std::remove_reference<R>::type>::value, const T, T>::type;
-};
-
-class TensorFactory
-{
-public:
-    template <typename R>
-    static TensorVariant get_tensor(R &&raw)
-    {
-        TensorVariant v;
-        DataType      dt                   = raw.data_type();
-        int           fixed_point_position = raw.fixed_point_position();
-        auto          shape                = raw.shape();
-        auto          data                 = raw.data();
-
-        switch(dt)
-        {
-            case DataType::U8:
-                using value_type_u8 = typename match_const<R, uint8_t>::type;
-                v                   = Tensor<uint8_t>(shape, dt, fixed_point_position, reinterpret_cast<value_type_u8 *>(data));
-                break;
-            case DataType::S8:
-            case DataType::QS8:
-                using value_type_s8 = typename match_const<R, int8_t>::type;
-                v                   = Tensor<int8_t>(shape, dt, fixed_point_position, reinterpret_cast<value_type_s8 *>(data));
-                break;
-            case DataType::U16:
-                using value_type_u16 = typename match_const<R, uint16_t>::type;
-                v                    = Tensor<uint16_t>(shape, dt, fixed_point_position, reinterpret_cast<value_type_u16 *>(data));
-                break;
-            case DataType::S16:
-            case DataType::QS16:
-                using value_type_s16 = typename match_const<R, int16_t>::type;
-                v                    = Tensor<int16_t>(shape, dt, fixed_point_position, reinterpret_cast<value_type_s16 *>(data));
-                break;
-            case DataType::U32:
-                using value_type_u32 = typename match_const<R, uint32_t>::type;
-                v                    = Tensor<uint32_t>(shape, dt, fixed_point_position, reinterpret_cast<value_type_u32 *>(data));
-                break;
-            case DataType::S32:
-                using value_type_s32 = typename match_const<R, int32_t>::type;
-                v                    = Tensor<int32_t>(shape, dt, fixed_point_position, reinterpret_cast<value_type_s32 *>(data));
-                break;
-            case DataType::F16:
-                using value_type_f16 = typename match_const<R, half_float::half>::type;
-                v                    = Tensor<half_float::half>(shape, dt, fixed_point_position, reinterpret_cast<value_type_f16 *>(data));
-                break;
-            case DataType::F32:
-                using value_type_f32 = typename match_const<R, float>::type;
-                v                    = Tensor<float>(shape, dt, fixed_point_position, reinterpret_cast<value_type_f32 *>(data));
-                break;
-            default:
-                ARM_COMPUTE_ERROR("NOT SUPPORTED!");
-        }
-        return v;
-    }
-};
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
-
-#endif /* __ARM_COMPUTE_TEST_TENSOR_FACTORY_H__ */
diff --git a/tests/validation_old/TensorOperations.h b/tests/validation_old/TensorOperations.h
deleted file mode 100644
index e033365..0000000
--- a/tests/validation_old/TensorOperations.h
+++ /dev/null
@@ -1,687 +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_TENSOR_OPERATIONS_H__
-#define __ARM_COMPUTE_TEST_TENSOR_OPERATIONS_H__
-
-#include "arm_compute/core/FixedPoint.h"
-#include "arm_compute/core/Helpers.h"
-#include "arm_compute/core/Types.h"
-#include "support/ToolchainSupport.h"
-#include "tests/Types.h"
-#include "tests/Utils.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>
-#include <cmath>
-#include <random>
-#include <string>
-#include <vector>
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-namespace tensor_operations
-{
-namespace
-{
-template <class T>
-struct is_floating_point
-    : std::integral_constant < bool,
-      std::is_same<float, typename std::remove_cv<T>::type>::value || std::is_same<half_float::half, typename std::remove_cv<T>::type>::value
-      || std::is_same<double, typename std::remove_cv<T>::type>::value || std::is_same<long double, typename std::remove_cv<T>::type>::value >
-{
-};
-
-// Return a tensor element at a specified coordinate with different border modes
-template <typename T>
-T tensor_elem_at(const Tensor<T> &in, Coordinates coord, BorderMode border_mode, T constant_border_value)
-{
-    const int x      = coord.x();
-    const int y      = coord.y();
-    const int width  = static_cast<int>(in.shape().x());
-    const int height = static_cast<int>(in.shape().y());
-
-    // If coordinates beyond range of tensor's width or height
-    if(x < 0 || y < 0 || x >= width || y >= height)
-    {
-        if(border_mode == BorderMode::REPLICATE)
-        {
-            coord.set(0, std::max(0, std::min(x, width - 1)));
-            coord.set(1, std::max(0, std::min(y, height - 1)));
-        }
-        else
-        {
-            return constant_border_value;
-        }
-    }
-
-    return in[coord2index(in.shape(), coord)];
-}
-
-/** Apply 2D spatial filter on a single element of @p in at coordinates @p coord
- *
- * - filter sizes have to be odd number
- * - Row major order of filter assumed
- * - TO_ZERO rounding policy assumed
- * - SATURATE convert policy assumed
- *
- */
-template <typename T1, typename T2, typename T3>
-void apply_2d_spatial_filter(Coordinates coord, const Tensor<T1> &in, Tensor<T3> &out, const TensorShape &filter_shape, const T2 *filter_itr, float scale, BorderMode border_mode,
-                             T1 constant_border_value = 0)
-{
-    double    val = 0;
-    const int x   = coord.x();
-    const int y   = coord.y();
-    for(int j = y - static_cast<int>(filter_shape[1] / 2); j <= y + static_cast<int>(filter_shape[1] / 2); ++j)
-    {
-        for(int i = x - static_cast<int>(filter_shape[0] / 2); i <= x + static_cast<int>(filter_shape[0] / 2); ++i)
-        {
-            coord.set(0, i);
-            coord.set(1, j);
-            val += static_cast<double>(*filter_itr) * tensor_elem_at(in, coord, border_mode, constant_border_value);
-            ++filter_itr;
-        }
-    }
-    coord.set(0, x);
-    coord.set(1, y);
-    const double rounded_val = support::cpp11::trunc(val * static_cast<double>(scale));
-    out[coord2index(in.shape(), coord)] = saturate_cast<T3>(rounded_val);
-}
-} // namespace
-
-// Sobel 3x3
-template <typename T1, typename T2>
-void sobel_3x3(Tensor<T1> &in, Tensor<T2> &out_x, Tensor<T2> &out_y, BorderMode border_mode, uint8_t constant_border_value)
-{
-    const std::array<int8_t, 9> sobel_x{ { -1, 0, 1, -2, 0, 2, -1, 0, 1 } };
-    const std::array<int8_t, 9> sobel_y{ { -1, -2, -1, 0, 0, 0, 1, 2, 1 } };
-
-    for(int element_idx = 0; element_idx < in.num_elements(); ++element_idx)
-    {
-        const Coordinates id = index2coord(in.shape(), element_idx);
-
-        apply_2d_spatial_filter(id, in, out_x, TensorShape(3U, 3U), sobel_x.data(), 1.f, border_mode, constant_border_value);
-        apply_2d_spatial_filter(id, in, out_y, TensorShape(3U, 3U), sobel_y.data(), 1.f, border_mode, constant_border_value);
-    }
-}
-
-// Sobel 5x5
-template <typename T1, typename T2>
-void sobel_5x5(Tensor<T1> &in, Tensor<T2> &out_x, Tensor<T2> &out_y, BorderMode border_mode, uint8_t constant_border_value)
-{
-    const std::array<int8_t, 25> sobel_x{ {
-            -1, -2, 0, 2, 1,
-            -4, -8, 0, 8, 4,
-            -6, -12, 0, 12, 6,
-            -4, -8, 0, 8, 4,
-            -1, -2, 0, 2, 1
-        } };
-
-    const std::array<int8_t, 25> sobel_y{ {
-            -1, -4, -6, -4, -1,
-            -2, -8, -12, -8, -2,
-            0, 0, 0, 0, 0,
-            2, 8, 12, 8, 2,
-            1, 4, 6, 4, 1
-        } };
-
-    for(int element_idx = 0; element_idx < in.num_elements(); ++element_idx)
-    {
-        const Coordinates id = index2coord(in.shape(), element_idx);
-
-        apply_2d_spatial_filter(id, in, out_x, TensorShape(5U, 5U), sobel_x.data(), 1.f, border_mode, constant_border_value);
-        apply_2d_spatial_filter(id, in, out_y, TensorShape(5U, 5U), sobel_y.data(), 1.f, border_mode, constant_border_value);
-    }
-}
-
-// Sobel 7x7
-template <typename T1, typename T2>
-void sobel_7x7(Tensor<T1> &in, Tensor<T2> &out_x, Tensor<T2> &out_y, BorderMode border_mode, uint8_t constant_border_value)
-{
-    const std::array<int8_t, 49> sobel_x{ {
-            -1, -4, -5, 0, 5, 4, 1,
-            -6, -24, -30, 0, 30, 24, 6,
-            -15, -60, -75, 0, 75, 60, 15,
-            -20, -80, -100, 0, 100, 80, 20,
-            -15, -60, -75, 0, 75, 60, 15,
-            -6, -24, -30, 0, 30, 24, 6,
-            -1, -4, -5, 0, 5, 4, 1
-        } };
-
-    const std::array<int8_t, 49> sobel_y{ {
-            -1, -6, -15, -20, -15, -6, -1,
-            -4, -24, -60, -80, -60, -24, -4,
-            -5, -30, -75, -100, -75, -30, -5,
-            0, 0, 0, 0, 0, 0, 0,
-            5, 30, 75, 100, 75, 30, 5,
-            4, 24, 60, 80, 60, 24, 4,
-            1, 6, 15, 20, 15, 6, 1
-        } };
-
-    for(int element_idx = 0; element_idx < in.num_elements(); ++element_idx)
-    {
-        const Coordinates id = index2coord(in.shape(), element_idx);
-
-        apply_2d_spatial_filter(id, in, out_x, TensorShape(7U, 7U), sobel_x.data(), 1.f, border_mode, constant_border_value);
-        apply_2d_spatial_filter(id, in, out_y, TensorShape(7U, 7U), sobel_y.data(), 1.f, border_mode, constant_border_value);
-    }
-}
-
-template <typename T>
-void non_maxima_suppression_3x3(Tensor<T> &in, Tensor<T> &out, BorderMode border_mode)
-{
-    for(int i = 0; i < in.num_elements(); ++i)
-    {
-        Coordinates coord = index2coord(in.shape(), i);
-        int         x     = coord.x();
-        int         y     = coord.y();
-
-        if(in[i] >= tensor_elem_at(in, Coordinates(x - 1, y - 1), border_mode, 0.f) && in[i] >= tensor_elem_at(in, Coordinates(x, y - 1), border_mode, 0.f)
-           && in[i] >= tensor_elem_at(in, Coordinates(x + 1, y - 1), border_mode, 0.f) && in[i] >= tensor_elem_at(in, Coordinates(x - 1, y), border_mode, 0.f)
-           && in[i] > tensor_elem_at(in, Coordinates(x + 1, y), border_mode, 0.f) && in[i] > tensor_elem_at(in, Coordinates(x - 1, y + 1), border_mode, 0.f)
-           && in[i] > tensor_elem_at(in, Coordinates(x, y + 1), border_mode, 0.f) && in[i] > tensor_elem_at(in, Coordinates(x + 1, y + 1), border_mode, 0.f))
-        {
-            out[i] = in[i];
-        }
-        else
-        {
-            out[i] = 0;
-        }
-    }
-}
-
-// Harris corners
-template <typename T1, typename T2, typename T3>
-void harris_corners(Tensor<T1> &in, Tensor<T2> &Gx, Tensor<T2> &Gy, Tensor<T3> &candidates, Tensor<T3> &non_maxima, float threshold, float min_dist, float sensitivity,
-                    int32_t gradient_size, int32_t block_size, KeyPointArray &corners, BorderMode border_mode, uint8_t constant_border_value)
-{
-    ARM_COMPUTE_ERROR_ON(block_size != 3 && block_size != 5 && block_size != 7);
-
-    ValidRegion valid_region = shape_to_valid_region(candidates.shape());
-    float       norm_factor  = 0.f;
-
-    // Sobel
-    switch(gradient_size)
-    {
-        case 3:
-            sobel_3x3(in, Gx, Gy, border_mode, constant_border_value);
-            norm_factor = 1.f / (4 * 255 * block_size);
-            break;
-        case 5:
-            sobel_5x5(in, Gx, Gy, border_mode, constant_border_value);
-            norm_factor = 1.f / (16 * 255 * block_size);
-            break;
-        case 7:
-            sobel_7x7(in, Gx, Gy, border_mode, constant_border_value);
-            norm_factor = 1.f / (64 * 255 * block_size);
-            break;
-        default:
-            ARM_COMPUTE_ERROR("Gradient size not supported.");
-    }
-
-    //Calculate scores
-    for(int i = 0; i < in.num_elements(); ++i)
-    {
-        Coordinates in_coord = index2coord(in.shape(), i);
-
-        float Gx2 = 0;
-        float Gy2 = 0;
-        float Gxy = 0;
-
-        // Calculate Gx^2, Gy^2 and Gxy within the given window
-        for(int y = in_coord.y() - block_size / 2; y <= in_coord.y() + block_size / 2; ++y)
-        {
-            for(int x = in_coord.x() - block_size / 2; x <= in_coord.x() + block_size / 2; ++x)
-            {
-                Coordinates block_coord(x, y);
-
-                float norm_gx = tensor_elem_at(Gx, block_coord, border_mode, static_cast<T2>(constant_border_value)) * norm_factor;
-                float norm_gy = tensor_elem_at(Gy, block_coord, border_mode, static_cast<T2>(constant_border_value)) * norm_factor;
-
-                Gx2 += std::pow(norm_gx, 2);
-                Gy2 += std::pow(norm_gy, 2);
-                Gxy += norm_gx * norm_gy;
-            }
-        }
-
-        float trace2   = std::pow(Gx2 + Gy2, 2);
-        float det      = Gx2 * Gy2 - std::pow(Gxy, 2);
-        float response = det - sensitivity * trace2;
-
-        if(response > threshold)
-        {
-            candidates[i] = response;
-        }
-        else
-        {
-            candidates[i] = 0.f;
-        }
-    }
-
-    // Update valid region and remove candidates on borders for border_mode == UNDEFINED
-    if(border_mode == BorderMode::UNDEFINED)
-    {
-        valid_region = shape_to_valid_region(candidates.shape(), true, BorderSize((gradient_size / 2) + (block_size / 2)));
-
-        for(int i = 0; i < candidates.num_elements(); ++i)
-        {
-            if(!is_in_valid_region(valid_region, index2coord(candidates.shape(), i)))
-            {
-                candidates[i] = 0.f;
-            }
-        }
-    }
-
-    // Suppress non-maxima candidates
-    non_maxima_suppression_3x3(candidates, non_maxima, border_mode != BorderMode::UNDEFINED ? BorderMode::CONSTANT : BorderMode::UNDEFINED);
-    if(border_mode == BorderMode::UNDEFINED)
-    {
-        valid_region = shape_to_valid_region(non_maxima.shape(), true, BorderSize((gradient_size / 2) + (block_size / 2) + 1));
-    }
-
-    // Create vector of candidate corners
-    KeyPointArray candidates_vector(corners.max_num_values());
-    for(int i = 0; i < non_maxima.num_elements(); ++i)
-    {
-        Coordinates coord = index2coord(non_maxima.shape(), i);
-
-        if(non_maxima[i] != 0.f && is_in_valid_region(valid_region, coord))
-        {
-            KeyPoint corner;
-            corner.x               = coord.x();
-            corner.y               = coord.y();
-            corner.tracking_status = 1;
-            corner.strength        = non_maxima[i];
-
-            corner.scale       = 0.f;
-            corner.orientation = 0.f;
-            corner.error       = 0.f;
-
-            candidates_vector.push_back(corner);
-        }
-    }
-
-    // If there are any candidates, sort them by strength and add them to the output corners vector if there are no stronger corners within the given euclidean radius
-    if(candidates_vector.num_values() > 0)
-    {
-        std::sort(candidates_vector.buffer(), candidates_vector.buffer() + candidates_vector.num_values(), [](KeyPoint a, KeyPoint b)
-        {
-            return a.strength > b.strength;
-        });
-        corners.push_back(candidates_vector.at(0));
-
-        for(size_t j = 0; j < candidates_vector.num_values(); ++j)
-        {
-            bool    found = false;
-            int32_t x     = candidates_vector.at(j).x;
-            int32_t y     = candidates_vector.at(j).y;
-
-            for(size_t i = 0; i < corners.num_values(); ++i)
-            {
-                int32_t corners_x = corners.at(i).x;
-                int32_t corners_y = corners.at(i).y;
-
-                // Euclidean distance
-                if(std::sqrt((std::pow(x - corners_x, 2) + std::pow(y - corners_y, 2))) < min_dist)
-                {
-                    found = true;
-                }
-            }
-
-            // If no stronger corners within the given euclidean radius
-            if(!found)
-            {
-                corners.push_back(candidates_vector.at(j));
-            }
-        }
-    }
-}
-
-// Integral Image
-void integral_image(const Tensor<uint8_t> &in, Tensor<uint32_t> &out)
-{
-    // Length of dimensions
-    const size_t width  = in.shape().x();
-    const size_t height = in.shape().y();
-    const size_t depth  = in.shape().z() * in.shape()[3] * in.shape()[4] * in.shape()[5];
-
-    const size_t image_size = width * height;
-
-    for(size_t z = 0; z < depth; ++z)
-    {
-        size_t current_image = z * image_size;
-
-        //First element of each image
-        out[current_image] = in[current_image];
-
-        // First row of each image (add only pixel on the left)
-        for(size_t x = 1; x < width; ++x)
-        {
-            out[current_image + x] = static_cast<uint32_t>(in[current_image + x]) + out[current_image + x - 1];
-        }
-
-        // Subsequent rows
-        for(size_t y = 1; y < height; ++y)
-        {
-            size_t current_row = current_image + (width * y);
-
-            // First element of each row (add only pixel up)
-            out[current_row] = static_cast<uint32_t>(in[current_row]) + out[current_row - width];
-
-            // Following row elements
-            for(size_t x = 1; x < width; ++x)
-            {
-                size_t current_pixel = current_row + x;
-
-                // out = in + up(out) + left(out) - up_left(out)
-                out[current_pixel] = static_cast<uint32_t>(in[current_pixel]) + out[current_pixel - 1]
-                                     + out[current_pixel - width] - out[current_pixel - width - 1];
-            }
-        }
-    }
-}
-
-// Absolute difference
-template <typename T1, typename T2, typename T3>
-void absolute_difference(const Tensor<T1> &in1, const Tensor<T2> &in2, Tensor<T3> &out)
-{
-    using intermediate_type = typename common_promoted_signed_type<T1, T2, T3>::intermediate_type;
-
-    for(int i = 0; i < in1.num_elements(); ++i)
-    {
-        intermediate_type val(std::abs(static_cast<intermediate_type>(in1[i]) - static_cast<intermediate_type>(in2[i])));
-        out[i] = saturate_cast<T3>(val);
-    }
-}
-
-// Accumulate
-template <typename T1, typename T2>
-void accumulate(const Tensor<T1> &in, Tensor<T2> &out)
-{
-    using intermediate_type = typename common_promoted_signed_type<T1, T2>::intermediate_type;
-
-    for(int i = 0; i < in.num_elements(); ++i)
-    {
-        intermediate_type val = static_cast<intermediate_type>(out[i]) + static_cast<intermediate_type>(in[i]);
-        out[i]                = saturate_cast<T2>(val);
-    }
-}
-
-// Accumulate squared
-template <typename T1, typename T2>
-void accumulate_squared(const Tensor<T1> &in, Tensor<T2> &out, uint32_t shift)
-{
-    if(shift > 15)
-    {
-        ARM_COMPUTE_ERROR("Shift in accumulate_squared must be within the range [0, 15]");
-    }
-    using intermediate_type = typename common_promoted_signed_type<T1, T2>::intermediate_type;
-    intermediate_type denom = 1 << shift;
-
-    for(int i = 0; i < in.num_elements(); ++i)
-    {
-        intermediate_type val = static_cast<intermediate_type>(out[i]) + (static_cast<intermediate_type>(in[i]) * static_cast<intermediate_type>(in[i]) / denom);
-        out[i]                = saturate_cast<T2>(val);
-    }
-}
-
-// Accumulate weighted total_size   = init_auto_padding(tensor_shape, num_channels, type);
-template <typename T>
-void accumulate_weighted(const Tensor<T> &in, Tensor<T> &out, float alpha)
-{
-    if(alpha < 0.f || alpha > 1.f)
-    {
-        ARM_COMPUTE_ERROR("Weight (alpha) specified in accumulate_weighted must be within the range [0, 1]");
-    }
-    using intermediate_type = typename common_promoted_signed_type<T>::intermediate_type;
-
-    for(int i = 0; i < in.num_elements(); ++i)
-    {
-        double val = (1. - static_cast<double>(alpha)) * static_cast<intermediate_type>(out[i]) + static_cast<double>(alpha) * static_cast<intermediate_type>(in[i]);
-        out[i]     = static_cast<T>(val);
-    }
-}
-
-// Non linear filter
-template <typename T>
-void non_linear_filter(const Tensor<T> &in, Tensor<T> &out, NonLinearFilterFunction function, unsigned int mask_size,
-                       MatrixPattern pattern, const uint8_t *mask, BorderMode border_mode, uint8_t constant_border_value)
-{
-    ARM_COMPUTE_ERROR_ON(pattern == MatrixPattern::OTHER && mask == nullptr);
-
-    using intermediate_type = typename common_promoted_signed_type<T>::intermediate_type;
-
-    const int                      sq_mask_size   = mask_size * mask_size;
-    const int                      half_mask_size = mask_size / 2;
-    std::vector<intermediate_type> vals(sq_mask_size);
-    intermediate_type              current_value = 0;
-
-    const ValidRegion valid_region = shape_to_valid_region(in.shape(), border_mode == BorderMode::UNDEFINED, BorderSize(half_mask_size));
-
-    for(int element_idx = 0, count = 0, index = 0; element_idx < in.num_elements(); ++element_idx, count = 0, index = 0)
-    {
-        Coordinates id = index2coord(in.shape(), element_idx);
-        if(is_in_valid_region(valid_region, id))
-        {
-            int idx = id.x();
-            int idy = id.y();
-            for(int y = idy - half_mask_size; y <= idy + half_mask_size; ++y)
-            {
-                for(int x = idx - half_mask_size; x <= idx + half_mask_size; ++x, ++index)
-                {
-                    id.set(0, x);
-                    id.set(1, y);
-                    current_value = tensor_elem_at(in, id, border_mode, constant_border_value);
-
-                    if(mask[index] == 255)
-                    {
-                        vals[count] = static_cast<intermediate_type>(current_value);
-                        ++count;
-                    }
-                }
-            }
-            std::sort(vals.begin(), vals.begin() + count);
-            switch(function)
-            {
-                case NonLinearFilterFunction::MIN:
-                    out[element_idx] = saturate_cast<T>(vals[0]);
-                    break;
-                case NonLinearFilterFunction::MAX:
-                    out[element_idx] = saturate_cast<T>(vals[count - 1]);
-                    break;
-                case NonLinearFilterFunction::MEDIAN:
-                    out[element_idx] = saturate_cast<T>(vals[count / 2]);
-                    break;
-                default:
-                    ARM_COMPUTE_ERROR("Unsupported NonLinearFilter function.");
-            }
-        }
-    }
-}
-
-// Threshold
-template <typename T>
-void threshold(const Tensor<T> &in, Tensor<T> &out, uint8_t threshold, uint8_t false_value, uint8_t true_value, ThresholdType type, uint8_t upper)
-{
-    switch(type)
-    {
-        case ThresholdType::BINARY:
-            for(int i = 0; i < in.num_elements(); ++i)
-            {
-                out[i] = ((in[i] > threshold) ? true_value : false_value);
-            }
-            break;
-        case ThresholdType::RANGE:
-            for(int i = 0; i < in.num_elements(); ++i)
-            {
-                if(in[i] > upper)
-                {
-                    out[i] = false_value;
-                }
-                else if(in[i] < threshold)
-                {
-                    out[i] = false_value;
-                }
-                else
-                {
-                    out[i] = true_value;
-                }
-            }
-            break;
-        default:
-            ARM_COMPUTE_ERROR("Thresholding type not recognised");
-            break;
-    }
-}
-
-// ROI Pooling layer
-template <typename T>
-void roi_pooling_layer(const Tensor<T> &in, Tensor<T> &out, const std::vector<ROI> &rois, const ROIPoolingLayerInfo &pool_info)
-{
-    const int   num_rois   = rois.size();
-    const int   width_in   = in.shape().x();
-    const int   height_in  = in.shape().y();
-    const int   fms        = in.shape().z();
-    const int   volume_in  = width_in * height_in * fms;
-    const int   pool_w     = pool_info.pooled_width();
-    const int   pool_h     = pool_info.pooled_height();
-    const int   volume_out = pool_w * pool_h * fms;
-    const float roi_scale  = pool_info.spatial_scale();
-
-    // Iterate through all rois
-    for(int roi_idx = 0; roi_idx < num_rois; ++roi_idx)
-    {
-        // Get dimensions of current ROI
-        const ROI &roi = rois[roi_idx];
-
-        int batch_id    = roi.batch_idx;
-        int roi_start_x = support::cpp11::round(roi.rect.x * roi_scale);
-        int roi_start_y = support::cpp11::round(roi.rect.y * roi_scale);
-        int roi_width   = std::max(support::cpp11::round(roi.rect.width * roi_scale), 1.f);
-        int roi_height  = std::max(support::cpp11::round(roi.rect.height * roi_scale), 1.f);
-
-        // Iterate through all channel
-        for(int fm = 0; fm < fms; ++fm)
-        {
-            // Calculate each output pixel
-            for(int py = 0; py < pool_h; ++py)
-            {
-                for(int px = 0; px < pool_w; ++px)
-                {
-                    int region_start_x = static_cast<int>(std::floor((static_cast<float>(px) / pool_w) * roi_width));
-                    int region_end_x   = static_cast<int>(std::floor((static_cast<float>(px + 1) / pool_w) * roi_width));
-                    int region_start_y = static_cast<int>(std::floor((static_cast<float>(py) / pool_h) * roi_height));
-                    int region_end_y   = static_cast<int>(std::floor((static_cast<float>(py + 1) / pool_h) * roi_height));
-
-                    region_start_x = std::min(std::max(region_start_x + roi_start_x, 0), width_in);
-                    region_end_x   = std::min(std::max(region_end_x + roi_start_x, 0), width_in);
-                    region_start_y = std::min(std::max(region_start_y + roi_start_y, 0), height_in);
-                    region_end_y   = std::min(std::max(region_end_y + roi_start_y, 0), height_in);
-
-                    // Iterate through each pixel in the pooling region
-                    if((region_end_x <= region_start_x) || (region_end_y <= region_start_y))
-                    {
-                        out[roi_idx * volume_out + fm * pool_w * pool_h + py * pool_w + px] = 0;
-                    }
-                    else
-                    {
-                        T curr_max = std::numeric_limits<T>::lowest();
-                        for(int j = region_start_y; j < region_end_y; ++j)
-                        {
-                            for(int i = region_start_x; i < region_end_x; ++i)
-                            {
-                                const auto val = in[batch_id * volume_in + fm * width_in * height_in + j * width_in + i];
-                                curr_max       = std::max(val, curr_max);
-                            }
-                        }
-                        out[roi_idx * volume_out + fm * pool_w * pool_h + py * pool_w + px] = curr_max;
-                    }
-                }
-            }
-        }
-    }
-}
-
-// Fixed point operations
-template <typename T>
-void fixed_point_operation(const Tensor<T> &in, Tensor<T> &out, FixedPointOp op)
-{
-    int p = in.fixed_point_position();
-    switch(op)
-    {
-        case FixedPointOp::EXP:
-            for(int i = 0; i < in.num_elements(); ++i)
-            {
-                out[i] = fixed_point_arithmetic::exp(fixed_point_arithmetic::fixed_point<T>(in[i], p, true)).raw();
-            }
-            break;
-        case FixedPointOp::LOG:
-            for(int i = 0; i < in.num_elements(); ++i)
-            {
-                out[i] = fixed_point_arithmetic::log(fixed_point_arithmetic::fixed_point<T>(in[i], p, true)).raw();
-            }
-            break;
-        case FixedPointOp::INV_SQRT:
-            for(int i = 0; i < in.num_elements(); ++i)
-            {
-                out[i] = fixed_point_arithmetic::inv_sqrt(fixed_point_arithmetic::fixed_point<T>(in[i], p, true)).raw();
-            }
-            break;
-        case FixedPointOp::RECIPROCAL:
-            for(int i = 0; i < in.num_elements(); ++i)
-            {
-                out[i] = fixed_point_arithmetic::div(fixed_point_arithmetic::fixed_point<T>(1, p), fixed_point_arithmetic::fixed_point<T>(in[i], p, true)).raw();
-            }
-            break;
-        default:
-            ARM_COMPUTE_ERROR("Fixed point operation not supported");
-            break;
-    }
-}
-
-// Tensor print
-template <typename T>
-void print(const Tensor<T> &in, std::ostream &out)
-{
-    out << "\n";
-    for(int i = 0; i < in.num_elements(); ++i)
-    {
-        out << in[i] << " ";
-    }
-    out << "\n";
-}
-} // namespace tensor_operations
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
-
-#endif /* __ARM_COMPUTE_TEST_TENSOR_OPERATIONS_H__ */
diff --git a/tests/validation_old/TensorVisitors.h b/tests/validation_old/TensorVisitors.h
deleted file mode 100644
index 72c2ba0..0000000
--- a/tests/validation_old/TensorVisitors.h
+++ /dev/null
@@ -1,130 +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_TENSOR_VISITORS_H__
-#define __ARM_COMPUTE_TEST_TENSOR_VISITORS_H__
-
-#include "Tensor.h"
-#include "TensorOperations.h"
-#include "arm_compute/core/Error.h"
-#include "arm_compute/core/Helpers.h"
-#include "arm_compute/runtime/Lut.h"
-
-#include "tests/validation_old/boost_wrapper.h"
-
-#include <algorithm>
-#include <map>
-#include <memory>
-#include <ostream>
-#include <vector>
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-namespace tensor_visitors
-{
-// Absolute Difference visitor
-struct absolute_difference_visitor : public boost::static_visitor<>
-{
-public:
-    template <typename T1, typename T2, typename T3>
-    void operator()(const Tensor<T1> &in1, const Tensor<T2> &in2, Tensor<T3> &out) const
-    {
-        tensor_operations::absolute_difference(in1, in2, out);
-    }
-};
-
-// ROI Pooling layer
-struct roi_pooling_layer_visitor : public boost::static_visitor<>
-{
-public:
-    explicit roi_pooling_layer_visitor(const TensorVariant &in, const std::vector<ROI> &rois, ROIPoolingLayerInfo pool_info)
-        : _in(in), _rois(rois), _pool_info(pool_info)
-    {
-    }
-
-    template <typename T>
-    void operator()(Tensor<T> &out) const
-    {
-        const Tensor<T> &in = boost::get<Tensor<T>>(_in);
-        tensor_operations::roi_pooling_layer(in, out, _rois, _pool_info);
-    }
-
-private:
-    const TensorVariant    &_in;
-    const std::vector<ROI> &_rois;
-    ROIPoolingLayerInfo     _pool_info;
-};
-
-// Fixed Point operations visitor
-struct fixed_point_operation_visitor : public boost::static_visitor<>
-{
-public:
-    explicit fixed_point_operation_visitor(const TensorVariant &in, FixedPointOp op)
-        : _in(in), _op(op)
-    {
-    }
-
-    template <typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
-    void operator()(Tensor<T> &out) const
-    {
-        const Tensor<T> &in = boost::get<Tensor<T>>(_in);
-        tensor_operations::fixed_point_operation(in, out, _op);
-    }
-    template < typename T, typename std::enable_if < !std::is_integral<T>::value, int >::type = 0 >
-    void operator()(Tensor<T> &out) const
-    {
-        ARM_COMPUTE_ERROR("NOT SUPPORTED!");
-    }
-
-private:
-    const TensorVariant &_in;
-    FixedPointOp         _op;
-};
-// Print Tensor visitor
-struct print_visitor : public boost::static_visitor<>
-{
-public:
-    explicit print_visitor(std::ostream &out)
-        : _out(out)
-    {
-    }
-
-    template <typename T>
-    void operator()(const Tensor<T> &in) const
-    {
-        tensor_operations::print(in, _out);
-    }
-
-private:
-    std::ostream &_out;
-};
-} // namespace tensor_visitors
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
-
-#endif /* __ARM_COMPUTE_TEST_TENSOR_VISITORS_H__ */
diff --git a/tests/validation_old/UserConfiguration.cpp b/tests/validation_old/UserConfiguration.cpp
deleted file mode 100644
index a24de90..0000000
--- a/tests/validation_old/UserConfiguration.cpp
+++ /dev/null
@@ -1,55 +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 "UserConfiguration.h"
-
-#include "ProgramOptions.h"
-
-#include <string>
-
-namespace arm_compute
-{
-namespace test
-{
-UserConfiguration::UserConfiguration(const ProgramOptions &options)
-{
-    std::random_device::result_type tmp_seed = 0;
-    if(options.get("seed", tmp_seed))
-    {
-        seed = tmp_seed;
-    }
-
-    std::string tmp_path;
-    if(options.get("path", tmp_path))
-    {
-        path = tmp_path;
-    }
-
-    unsigned int tmp_threads = 0;
-    if(options.get("threads", tmp_threads))
-    {
-        threads = tmp_threads;
-    }
-}
-} // namespace test
-} // namespace arm_compute
diff --git a/tests/validation_old/UserConfiguration.h b/tests/validation_old/UserConfiguration.h
deleted file mode 100644
index 815da04..0000000
--- a/tests/validation_old/UserConfiguration.h
+++ /dev/null
@@ -1,136 +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_USER_CONFIGURATION_H__
-#define __ARM_COMPUTE_TEST_USER_CONFIGURATION_H__
-
-#include "arm_compute/core/Error.h"
-#include "arm_compute/core/Types.h"
-
-#include <random>
-#include <string>
-
-namespace arm_compute
-{
-namespace test
-{
-class ProgramOptions;
-
-/** Container providing easy access to runtime options provided by the user. */
-struct UserConfiguration
-{
-protected:
-    /** Wrapper around options to store if an option has been set. */
-    template <typename T>
-    class Option
-    {
-    public:
-        /** Initialise the option to its default (C++) value and mark it as 'not set'. */
-        Option();
-
-        /** Initialise the option to the given @p value and mark it as 'set'. */
-        Option(const T &value);
-
-        /** Assign the given @p value and mark it as 'set'. */
-        Option<T> &operator=(const T &value);
-
-        /** Query if the option has been set. */
-        constexpr bool is_set() const;
-
-        /** Return the underlying value as constant. */
-        T get() const;
-
-        /** Return the underlying value. */
-        T &get();
-
-        /** Implicitly return the underlying value. */
-        operator T() const;
-
-    private:
-        T    _value;
-        bool _is_set;
-    };
-
-public:
-    UserConfiguration() = default;
-
-    /** Initialise the configuration according to the program options.
-     *
-     * @param[in] options Parsed command line options.
-     */
-    UserConfiguration(const ProgramOptions &options);
-
-    Option<std::string>                     path{};
-    Option<std::random_device::result_type> seed{};
-    Option<unsigned int>                    threads{};
-};
-
-template <typename T>
-UserConfiguration::Option<T>::Option()
-    : _value{}, _is_set{ false }
-{
-}
-
-template <typename T>
-UserConfiguration::Option<T>::Option(const T &value)
-    : _value{ value }, _is_set{ true }
-{
-}
-
-template <typename T>
-UserConfiguration::Option<T> &UserConfiguration::Option<T>::operator=(const T &value)
-{
-    _value  = value;
-    _is_set = true;
-
-    return *this;
-}
-
-template <typename T>
-constexpr bool UserConfiguration::Option<T>::is_set() const
-{
-    return _is_set;
-}
-
-template <typename T>
-T UserConfiguration::Option<T>::get() const
-{
-    ARM_COMPUTE_ERROR_ON(!is_set());
-    return _value;
-}
-
-template <typename T>
-T &UserConfiguration::Option<T>::get()
-{
-    return _value;
-}
-
-template <typename T>
-UserConfiguration::Option<T>::operator T() const
-{
-    ARM_COMPUTE_ERROR_ON(!is_set());
-    return _value;
-}
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_USER_CONFIGURATION_H__ */
diff --git a/tests/validation_old/Validation.cpp b/tests/validation_old/Validation.cpp
deleted file mode 100644
index da5e874..0000000
--- a/tests/validation_old/Validation.cpp
+++ /dev/null
@@ -1,477 +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/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/Utils.h"
-#include "tests/validation_old/half.h"
-#include "utils/TypePrinter.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
deleted file mode 100644
index f0630c1..0000000
--- a/tests/validation_old/Validation.h
+++ /dev/null
@@ -1,152 +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_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 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_old/ValidationProgramOptions.cpp b/tests/validation_old/ValidationProgramOptions.cpp
deleted file mode 100644
index adb8c5a..0000000
--- a/tests/validation_old/ValidationProgramOptions.cpp
+++ /dev/null
@@ -1,50 +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 "ValidationProgramOptions.h"
-
-#include <thread>
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Weffc++"
-#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
-#pragma GCC diagnostic ignored "-Wctor-dtor-privacy"
-#include "boost/program_options.hpp"
-#pragma GCC diagnostic pop
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-ValidationProgramOptions::ValidationProgramOptions()
-{
-    boost::program_options::options_description options("Validation options");
-    options.add_options()("runs", boost::program_options::value<unsigned int>()->default_value(1), "Repetitions per test");
-    options.add_options()("threads", boost::program_options::value<unsigned int>()->default_value(std::thread::hardware_concurrency()), "Number of parallel CPU threads");
-    add_options(options);
-}
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
diff --git a/tests/validation_old/ValidationUserConfiguration.h b/tests/validation_old/ValidationUserConfiguration.h
deleted file mode 100644
index a9b8b4f..0000000
--- a/tests/validation_old/ValidationUserConfiguration.h
+++ /dev/null
@@ -1,42 +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_REFERENCE_VALIDATION_USER_CONFIGURATION_H__
-#define __ARM_COMPUTE_TEST_REFERENCE_VALIDATION_USER_CONFIGURATION_H__
-
-#include "UserConfiguration.h"
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-// Validation requires no specific configuration
-using ValidationUserConfiguration = UserConfiguration;
-} // namespace validation
-
-extern validation::ValidationUserConfiguration user_config;
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_REFERENCE_VALIDATION_USER_CONFIGURATION_H__ */
diff --git a/tests/validation_old/boost_wrapper.h b/tests/validation_old/boost_wrapper.h
deleted file mode 100644
index b584e4c..0000000
--- a/tests/validation_old/boost_wrapper.h
+++ /dev/null
@@ -1,40 +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.
- */
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Woverloaded-virtual"
-#pragma GCC diagnostic ignored "-Weffc++"
-#pragma GCC diagnostic ignored "-Wctor-dtor-privacy"
-#pragma GCC diagnostic ignored "-Wunused-variable"
-#pragma GCC diagnostic ignored "-Wsign-compare"
-#include "boost/test/unit_test.hpp"
-#include "boost/variant.hpp"
-#include "boost/variant/multivisitors.hpp"
-#pragma GCC diagnostic pop
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Weffc++"
-#include "boost/test/data/test_case.hpp"
-#pragma GCC diagnostic pop
-
-#include "boost/test/data/monomorphic.hpp"
diff --git a/tests/validation_old/dataset/ActivationFunctionDataset.h b/tests/validation_old/dataset/ActivationFunctionDataset.h
deleted file mode 100644
index b72cffb..0000000
--- a/tests/validation_old/dataset/ActivationFunctionDataset.h
+++ /dev/null
@@ -1,67 +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_DATASET_ACTIVATION_FUNCTION_DATASET_H__
-#define __ARM_COMPUTE_TEST_DATASET_ACTIVATION_FUNCTION_DATASET_H__
-
-#include "arm_compute/core/Types.h"
-#include "tests/validation_old/dataset/GenericDataset.h"
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-/** Data set containing all possible activation functions.
- *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on all activation functions.
- */
-class ActivationFunctions final : public GenericDataset<ActivationLayerInfo::ActivationFunction, 10>
-{
-public:
-    ActivationFunctions()
-        : GenericDataset
-    {
-        ActivationLayerInfo::ActivationFunction::ABS,
-        ActivationLayerInfo::ActivationFunction::LINEAR,
-        ActivationLayerInfo::ActivationFunction::LOGISTIC,
-        ActivationLayerInfo::ActivationFunction::RELU,
-        ActivationLayerInfo::ActivationFunction::BOUNDED_RELU,
-        ActivationLayerInfo::ActivationFunction::LEAKY_RELU,
-        ActivationLayerInfo::ActivationFunction::SOFT_RELU,
-        ActivationLayerInfo::ActivationFunction::SQRT,
-        ActivationLayerInfo::ActivationFunction::SQUARE,
-        ActivationLayerInfo::ActivationFunction::TANH
-    }
-    {
-    }
-
-    ~ActivationFunctions() = default;
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_DATASET_ACTIVATION_FUNCTION_DATASET_H__ */
diff --git a/tests/validation_old/dataset/ActivationLayerDataset.h b/tests/validation_old/dataset/ActivationLayerDataset.h
deleted file mode 100644
index 881e19f..0000000
--- a/tests/validation_old/dataset/ActivationLayerDataset.h
+++ /dev/null
@@ -1,177 +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_DATASET_ACTIVATION_LAYER_DATASET_H__
-#define __ARM_COMPUTE_TEST_DATASET_ACTIVATION_LAYER_DATASET_H__
-
-#include "utils/TypePrinter.h"
-
-#include "arm_compute/core/TensorShape.h"
-#include "arm_compute/core/Types.h"
-#include "tests/validation_old/dataset/GenericDataset.h"
-
-#include <sstream>
-#include <type_traits>
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-class ActivationLayerDataObject
-{
-public:
-    operator std::string() const
-    {
-        std::stringstream ss;
-        ss << "ActivationLayer";
-        ss << "_I" << shape;
-        ss << "_F_" << info.activation();
-        return ss.str();
-    }
-
-public:
-    TensorShape         shape;
-    ActivationLayerInfo info;
-};
-
-template <unsigned int Size>
-using ActivationLayerDataset = GenericDataset<ActivationLayerDataObject, Size>;
-
-class AlexNetActivationLayerDataset final : public ActivationLayerDataset<5>
-{
-public:
-    AlexNetActivationLayerDataset()
-        : GenericDataset
-    {
-        ActivationLayerDataObject{ TensorShape(55U, 55U, 96U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        ActivationLayerDataObject{ TensorShape(27U, 27U, 256U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        ActivationLayerDataObject{ TensorShape(13U, 13U, 384U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        ActivationLayerDataObject{ TensorShape(13U, 13U, 256U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        ActivationLayerDataObject{ TensorShape(4096U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-    }
-    {
-    }
-
-    ~AlexNetActivationLayerDataset() = default;
-};
-
-class LeNet5ActivationLayerDataset final : public ActivationLayerDataset<1>
-{
-public:
-    LeNet5ActivationLayerDataset()
-        : GenericDataset
-    {
-        ActivationLayerDataObject{ TensorShape(500U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-    }
-    {
-    }
-
-    ~LeNet5ActivationLayerDataset() = default;
-};
-
-class GoogLeNetActivationLayerDataset final : public ActivationLayerDataset<33>
-{
-public:
-    GoogLeNetActivationLayerDataset()
-        : GenericDataset
-    {
-        // conv1/relu_7x7
-        ActivationLayerDataObject{ TensorShape(112U, 112U, 64U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // conv2/relu_3x3_reduce
-        ActivationLayerDataObject{ TensorShape(56U, 56U, 64U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // conv2/relu_3x3
-        ActivationLayerDataObject{ TensorShape(56U, 56U, 192U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_3a/relu_1x1, inception_3b/relu_pool_proj
-        ActivationLayerDataObject{ TensorShape(28U, 28U, 64U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_3a/relu_3x3_reduce, inception_3b/relu_5x5
-        ActivationLayerDataObject{ TensorShape(28U, 28U, 96U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_3a/relu_3x3, inception_3b/relu_1x1, inception_3b/relu_3x3_reduce
-        ActivationLayerDataObject{ TensorShape(28U, 28U, 128U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_3a/relu_5x5_reduce
-        ActivationLayerDataObject{ TensorShape(28U, 28U, 16U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_3a/relu_5x5, inception_3a/relu_pool_proj, inception_3b/relu_5x5_reduce
-        ActivationLayerDataObject{ TensorShape(28U, 28U, 32U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_3b/relu_3x3
-        ActivationLayerDataObject{ TensorShape(28U, 28U, 192U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4a/relu_1x1
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 192U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4a/relu_3x3_reduce
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 96U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4a/relu_3x3
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 208U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4a/relu_5x5_reduce
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 16U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4a/relu_5x5
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 48U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4a/relu_pool_proj, inception_4b/relu_5x5, inception_4b/relu_pool_proj, inception_4c/relu_5x5, inception_4c/relu_pool_proj, inception_4d/relu_5x5, inception_4d/relu_pool_proj
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 64U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4b/relu_1x1, inception_4e/relu_3x3_reduce
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 160U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4b/relu_3x3_reduce, inception_4d/relu_1x1
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 112U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4b/relu_3x3
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 224U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4b/relu_5x5_reduce, inception_4c/relu_5x5_reduce
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 24U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4c/relu_1x1, inception_4c/relu_3x3_reduce, inception_4e/relu_5x5, inception_4e/relu_pool_proj
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 128U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4c/relu_3x3, inception_4e/relu_1x1
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 256U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4d/relu_3x3_reduce
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 144U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4d/relu_3x3
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 288U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4d/relu_5x5_reduce, inception_4e/relu_5x5_reduce
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 32U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_4e/relu_3x3
-        ActivationLayerDataObject{ TensorShape(14U, 14U, 320U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_5a/relu_1x1
-        ActivationLayerDataObject{ TensorShape(7U, 7U, 256U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_5a/relu_3x3_reduce
-        ActivationLayerDataObject{ TensorShape(7U, 7U, 160U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_5a/relu_3x3
-        ActivationLayerDataObject{ TensorShape(7U, 7U, 320U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_5a/relu_5x5_reduce
-        ActivationLayerDataObject{ TensorShape(7U, 7U, 32U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_5a/relu_5x5, inception_5a/relu_pool_proj, inception_5b/relu_5x5, inception_5b/relu_pool_proj
-        ActivationLayerDataObject{ TensorShape(7U, 7U, 128U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_5b/relu_1x1, inception_5b/relu_3x3
-        ActivationLayerDataObject{ TensorShape(7U, 7U, 384U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_5b/relu_3x3_reduce
-        ActivationLayerDataObject{ TensorShape(7U, 7U, 192U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) },
-        // inception_5b/relu_5x5_reduce
-        ActivationLayerDataObject{ TensorShape(7U, 7U, 48U), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) }
-    }
-    {
-    }
-
-    ~GoogLeNetActivationLayerDataset() = default;
-};
-
-} // namespace test
-} // namespace arm_compute
-#endif //__ARM_COMPUTE_TEST_DATASET_ACTIVATION_LAYER_DATASET_H__
diff --git a/tests/validation_old/dataset/BatchNormalizationLayerDataset.h b/tests/validation_old/dataset/BatchNormalizationLayerDataset.h
deleted file mode 100644
index 3ad1bef..0000000
--- a/tests/validation_old/dataset/BatchNormalizationLayerDataset.h
+++ /dev/null
@@ -1,90 +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_DATASET_BATCH_NORMALIZATION_LAYER_DATASET_H__
-#define __ARM_COMPUTE_TEST_DATASET_BATCH_NORMALIZATION_LAYER_DATASET_H__
-
-#include "utils/TypePrinter.h"
-
-#include "arm_compute/core/TensorShape.h"
-#include "arm_compute/core/Types.h"
-#include "tests/validation_old/dataset/GenericDataset.h"
-
-#include <ostream>
-#include <sstream>
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-class BatchNormalizationLayerDataObject
-{
-public:
-    operator std::string() const
-    {
-        std::stringstream ss;
-        ss << "BatchNormalizationLayer";
-        ss << "_I" << shape0;
-        ss << "_I" << shape1;
-        ss << "_I" << epsilon;
-        return ss.str();
-    }
-
-    friend std::ostream &operator<<(std::ostream &s, const BatchNormalizationLayerDataObject &obj)
-    {
-        s << static_cast<std::string>(obj);
-        return s;
-    }
-
-public:
-    TensorShape shape0;
-    TensorShape shape1;
-    float       epsilon;
-};
-
-template <unsigned int Size>
-using BatchNormalizationLayerDataset = GenericDataset<BatchNormalizationLayerDataObject, Size>;
-
-class RandomBatchNormalizationLayerDataset final : public BatchNormalizationLayerDataset<3>
-{
-public:
-    RandomBatchNormalizationLayerDataset()
-        : GenericDataset
-    {
-        BatchNormalizationLayerDataObject{ TensorShape(15U, 16U, 2U, 12U), TensorShape(2U), 0.1f },
-        BatchNormalizationLayerDataObject{ TensorShape(21U, 11U, 12U, 7U), TensorShape(12U), 0.1f },
-        BatchNormalizationLayerDataObject{ TensorShape(7U, 3U, 6U, 11U), TensorShape(6U), 0.1f },
-    }
-    {
-    }
-
-    ~RandomBatchNormalizationLayerDataset() = default;
-};
-
-} // namespace test
-} // namespace arm_compute
-#endif //__ARM_COMPUTE_TEST_DATASET_BATCH_NORMALIZATION_LAYER_DATASET_H__
diff --git a/tests/validation_old/dataset/BorderModeDataset.h b/tests/validation_old/dataset/BorderModeDataset.h
deleted file mode 100644
index d1eb48d..0000000
--- a/tests/validation_old/dataset/BorderModeDataset.h
+++ /dev/null
@@ -1,82 +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_BORDER_MODE_DATASET_H__
-#define __ARM_COMPUTE_TEST_BORDER_MODE_DATASET_H__
-
-#include "arm_compute/core/Types.h"
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-#include <array>
-
-namespace arm_compute
-{
-namespace test
-{
-/** Data set containing all possible border modes.
- *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on all border modes.
- */
-class BorderModes
-{
-public:
-    /** Type of the samples in the data set. */
-    using sample = BorderMode;
-
-    /** Dimensionality of the data set. */
-    enum
-    {
-        arity = 1
-    };
-
-    /** Number of samples in the data set. */
-#ifdef BOOST
-    boost::unit_test::data::size_t size() const
-#else  /* BOOST */
-    unsigned int size() const
-#endif /* BOOST */
-    {
-        return _modes.size();
-    }
-
-    /** Type of the iterator used to step through all samples in the data set.
-     * Needs to support operator*() and operator++() which a pointer does.
-     */
-    using iterator = const BorderMode *;
-
-    /** Iterator to the first sample in the data set. */
-    iterator begin() const
-    {
-        return _modes.data();
-    }
-
-private:
-    std::array<BorderMode, 3> _modes{ { BorderMode::UNDEFINED, BorderMode::CONSTANT, BorderMode::REPLICATE } };
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_BORDER_MODE_DATASET_H__ */
diff --git a/tests/validation_old/dataset/ConvertPolicyDataset.h b/tests/validation_old/dataset/ConvertPolicyDataset.h
deleted file mode 100644
index e6e2169..0000000
--- a/tests/validation_old/dataset/ConvertPolicyDataset.h
+++ /dev/null
@@ -1,82 +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_DATASETS_CONVERT_POLICY_DATASETS_H__
-#define __ARM_COMPUTE_TEST_DATASETS_CONVERT_POLICY_DATASETS_H__
-
-#include "arm_compute/core/Types.h"
-
-#include <type_traits>
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-/** Data set containing all possible convert/overflow policies.
- *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on different convert policies.
- */
-class ConvertPolicies
-{
-public:
-    /** Type of the samples in the data set. */
-    using sample = ConvertPolicy;
-
-    /** Dimensionality of the data set. */
-    enum
-    {
-        arity = 1
-    };
-
-    /** Number of samples in the data set. */
-#ifdef BOOST
-    boost::unit_test::data::size_t size() const
-#else  /* BOOST */
-    unsigned int size() const
-#endif /* BOOST */
-    {
-        return _policies.size();
-    }
-
-    /** Type of the iterator used to step through all samples in the data set.
-     * Needs to support operator*() and operator++() which a pointer does.
-     */
-    using iterator = const ConvertPolicy *;
-
-    /** Iterator to the first sample in the data set. */
-    iterator begin() const
-    {
-        return _policies.data();
-    }
-
-private:
-    std::array<ConvertPolicy, 2> _policies{ { ConvertPolicy::WRAP, ConvertPolicy::SATURATE } };
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_DATASETS_TEST_CONVERT_POLICY_DATASETS_H__ */
diff --git a/tests/validation_old/dataset/ConvolutionLayerDataset.h b/tests/validation_old/dataset/ConvolutionLayerDataset.h
deleted file mode 100644
index e612c3e..0000000
--- a/tests/validation_old/dataset/ConvolutionLayerDataset.h
+++ /dev/null
@@ -1,273 +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_DATASET_CONVOLUTION_LAYER_DATASET_H__
-#define __ARM_COMPUTE_TEST_DATASET_CONVOLUTION_LAYER_DATASET_H__
-
-#include "utils/TypePrinter.h"
-
-#include "arm_compute/core/TensorShape.h"
-#include "tests/validation_old/dataset/GenericDataset.h"
-#include "tests/validation_old/dataset/ShapeDatasets.h"
-
-#include <sstream>
-#include <type_traits>
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-/** Convolution Layer data object */
-class ConvolutionLayerDataObject
-{
-public:
-    operator std::string() const
-    {
-        std::stringstream ss;
-        ss << "ConvolutionLayer";
-        ss << "_I" << src_shape;
-        ss << "_K" << weights_shape;
-        ss << "_PS" << info;
-        return ss.str();
-    }
-
-    friend std::ostream &operator<<(std::ostream &os, const ConvolutionLayerDataObject &obj)
-    {
-        os << static_cast<std::string>(obj);
-        return os;
-    }
-
-public:
-    TensorShape   src_shape;
-    TensorShape   weights_shape;
-    TensorShape   bias_shape;
-    TensorShape   dst_shape;
-    PadStrideInfo info;
-};
-
-template <unsigned int Size>
-using ConvolutionLayerDataset = GenericDataset<ConvolutionLayerDataObject, Size>;
-
-/** Data set containing small convolution layer shapes */
-class SmallConvolutionLayerDataset final : public ConvolutionLayerDataset<6>
-{
-public:
-    SmallConvolutionLayerDataset()
-        : GenericDataset
-    {
-        ConvolutionLayerDataObject{ TensorShape(23U, 27U, 5U), TensorShape(3U, 3U, 5U, 21U), TensorShape(21U), TensorShape(11U, 25U, 21U), PadStrideInfo(2, 1, 0, 0) },
-        ConvolutionLayerDataObject{ TensorShape(33U, 27U, 7U), TensorShape(5U, 5U, 7U, 16U), TensorShape(16U), TensorShape(11U, 12U, 16U), PadStrideInfo(3, 2, 1, 0) },
-        ConvolutionLayerDataObject{ TensorShape(17U, 31U, 2U, 7U), TensorShape(5U, 5U, 2U, 19U), TensorShape(19U), TensorShape(15U, 15U, 19U, 7U), PadStrideInfo(1, 2, 1, 1) },
-        ConvolutionLayerDataObject{ TensorShape(23U, 27U, 5U), TensorShape(3U, 1U, 5U, 21U), TensorShape(21U), TensorShape(11U, 27U, 21U), PadStrideInfo(2, 1, 0, 0) },
-        ConvolutionLayerDataObject{ TensorShape(33U, 27U, 7U), TensorShape(5U, 7U, 7U, 16U), TensorShape(16U), TensorShape(11U, 11U, 16U), PadStrideInfo(3, 2, 1, 0) },
-        ConvolutionLayerDataObject{ TensorShape(17U, 31U, 2U, 7U), TensorShape(5U, 3U, 2U, 19U), TensorShape(19U), TensorShape(15U, 16U, 19U, 7U), PadStrideInfo(1, 2, 1, 1) }
-    }
-    {
-    }
-
-    ~SmallConvolutionLayerDataset() = default;
-};
-
-/** Data set containing direct convolution tensor shapes. */
-class DirectConvolutionShapes final : public ShapeDataset<4>
-{
-public:
-    DirectConvolutionShapes()
-        : ShapeDataset(TensorShape(3U, 3U, 3U, 2U, 4U, 5U),
-                       TensorShape(32U, 37U, 3U),
-                       TensorShape(64U, 32U, 4U, 2U),
-                       TensorShape(13U, 15U, 8U, 3U))
-    {
-    }
-};
-
-/** AlexNet's convolution layers tensor shapes. */
-class AlexNetConvolutionLayerDataset final : public ConvolutionLayerDataset<5>
-{
-public:
-    AlexNetConvolutionLayerDataset()
-        : GenericDataset
-    {
-        ConvolutionLayerDataObject{ TensorShape(227U, 227U, 3U), TensorShape(11U, 11U, 3U, 96U), TensorShape(96U), TensorShape(55U, 55U, 96U), PadStrideInfo(4, 4, 0, 0) },
-        ConvolutionLayerDataObject{ TensorShape(27U, 27U, 96U), TensorShape(5U, 5U, 96U, 256U), TensorShape(256U), TensorShape(27U, 27U, 256U), PadStrideInfo(1, 1, 2, 2) },
-        ConvolutionLayerDataObject{ TensorShape(13U, 13U, 256U), TensorShape(3U, 3U, 256U, 384U), TensorShape(384U), TensorShape(13U, 13U, 384U), PadStrideInfo(1, 1, 1, 1) },
-        ConvolutionLayerDataObject{ TensorShape(13U, 13U, 384U), TensorShape(3U, 3U, 384U, 384U), TensorShape(384U), TensorShape(13U, 13U, 384U), PadStrideInfo(1, 1, 1, 1) },
-        ConvolutionLayerDataObject{ TensorShape(13U, 13U, 384U), TensorShape(3U, 3U, 384U, 256U), TensorShape(256U), TensorShape(13U, 13U, 256U), PadStrideInfo(1, 1, 1, 1) }
-    }
-    {
-    }
-
-    ~AlexNetConvolutionLayerDataset() = default;
-};
-
-/** LeNet5's convolution layers tensor shapes. */
-class LeNet5ConvolutionLayerDataset final : public ConvolutionLayerDataset<2>
-{
-public:
-    LeNet5ConvolutionLayerDataset()
-        : GenericDataset
-    {
-        ConvolutionLayerDataObject{ TensorShape(28U, 28U, 1U), TensorShape(5U, 5U, 1U, 20U), TensorShape(20U), TensorShape(24U, 24U, 20U), PadStrideInfo(1, 1, 0, 0) },
-        ConvolutionLayerDataObject{ TensorShape(12U, 12U, 20U), TensorShape(5U, 5U, 20U, 50U), TensorShape(50U), TensorShape(8U, 8U, 50U), PadStrideInfo(1, 1, 0, 0) },
-    }
-    {
-    }
-
-    ~LeNet5ConvolutionLayerDataset() = default;
-};
-
-/** GoogleLeNet v1 convolution layers tensor shapes (Part 1).
- *
- * @note Dataset is split into two to avoid a register allocation failure produced by clang in Android debug builds.
- */
-class GoogLeNetConvolutionLayerDataset1 final : public ConvolutionLayerDataset<32>
-{
-public:
-    GoogLeNetConvolutionLayerDataset1()
-        : GenericDataset
-    {
-        // conv1/7x7_s2
-        ConvolutionLayerDataObject{ TensorShape(224U, 224U, 3U), TensorShape(7U, 7U, 3U, 64U), TensorShape(64U), TensorShape(112U, 112U, 64U), PadStrideInfo(2, 2, 3, 3) },
-        // conv2/3x3_reduce
-        ConvolutionLayerDataObject{ TensorShape(56U, 56U, 64U), TensorShape(1U, 1U, 64U, 64U), TensorShape(64U), TensorShape(56U, 56U, 64U), PadStrideInfo(1, 1, 0, 0) },
-        // conv2/3x3
-        ConvolutionLayerDataObject{ TensorShape(56U, 56U, 64U), TensorShape(3U, 3U, 64U, 192U), TensorShape(192U), TensorShape(56U, 56U, 192U), PadStrideInfo(1, 1, 1, 1) },
-        // inception_3a/1x1
-        ConvolutionLayerDataObject{ TensorShape(28U, 28U, 192U), TensorShape(1U, 1U, 192U, 64U), TensorShape(64U), TensorShape(28U, 28U, 64U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_3a/3x3_reduce
-        ConvolutionLayerDataObject{ TensorShape(28U, 28U, 192U), TensorShape(1U, 1U, 192U, 96U), TensorShape(96U), TensorShape(28U, 28U, 96U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_3a/3x3
-        ConvolutionLayerDataObject{ TensorShape(28U, 28U, 96U), TensorShape(3U, 3U, 96U, 128U), TensorShape(128U), TensorShape(28U, 28U, 128U), PadStrideInfo(1, 1, 1, 1) },
-        // inception_3a/5x5_reduce
-        ConvolutionLayerDataObject{ TensorShape(28U, 28U, 192U), TensorShape(1U, 1U, 192U, 16U), TensorShape(16U), TensorShape(28U, 28U, 16U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_3a/5x5
-        ConvolutionLayerDataObject{ TensorShape(28U, 28U, 16U), TensorShape(5U, 5U, 16U, 32U), TensorShape(32U), TensorShape(28U, 28U, 32U), PadStrideInfo(1, 1, 2, 2) },
-        // inception_3a/pool_proj
-        ConvolutionLayerDataObject{ TensorShape(28U, 28U, 192U), TensorShape(1U, 1U, 192U, 32U), TensorShape(32U), TensorShape(28U, 28U, 32U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_3b/1x1, inception_3b/3x3_reduce
-        ConvolutionLayerDataObject{ TensorShape(28U, 28U, 256U), TensorShape(1U, 1U, 256U, 128U), TensorShape(128U), TensorShape(28U, 28U, 128U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_3b/3x3
-        ConvolutionLayerDataObject{ TensorShape(28U, 28U, 128U), TensorShape(3U, 3U, 128U, 192U), TensorShape(192U), TensorShape(28U, 28U, 192U), PadStrideInfo(1, 1, 1, 1) },
-        // inception_3b/5x5_reduce
-        ConvolutionLayerDataObject{ TensorShape(28U, 28U, 256U), TensorShape(1U, 1U, 256U, 32U), TensorShape(32U), TensorShape(28U, 28U, 32U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_3b/5x5
-        ConvolutionLayerDataObject{ TensorShape(28U, 28U, 32U), TensorShape(5U, 5U, 32U, 96U), TensorShape(96U), TensorShape(28U, 28U, 96U), PadStrideInfo(1, 1, 2, 2) },
-        // inception_3b/pool_proj
-        ConvolutionLayerDataObject{ TensorShape(28U, 28U, 256U), TensorShape(1U, 1U, 256U, 64U), TensorShape(64U), TensorShape(28U, 28U, 64U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4a/1x1
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 480U), TensorShape(1U, 1U, 480U, 192U), TensorShape(192U), TensorShape(14U, 14U, 192U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4a/3x3_reduce
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 480U), TensorShape(1U, 1U, 480U, 96U), TensorShape(96U), TensorShape(14U, 14U, 96U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4a/3x3
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 96U), TensorShape(3U, 3U, 96U, 208U), TensorShape(208U), TensorShape(14U, 14U, 208U), PadStrideInfo(1, 1, 1, 1) },
-        // inception_4a/5x5_reduce
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 480U), TensorShape(1U, 1U, 480U, 16U), TensorShape(16U), TensorShape(14U, 14U, 16U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4a/5x5
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 16U), TensorShape(5U, 5U, 16U, 48U), TensorShape(48U), TensorShape(14U, 14U, 48U), PadStrideInfo(1, 1, 2, 2) },
-        // inception_4a/pool_proj
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 480U), TensorShape(1U, 1U, 480U, 64U), TensorShape(64U), TensorShape(14U, 14U, 64U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4b/1x1
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 512U), TensorShape(1U, 1U, 512U, 160U), TensorShape(160U), TensorShape(14U, 14U, 160U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4b/3x3_reduce, inception_4d/1x1
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 512U), TensorShape(1U, 1U, 512U, 112U), TensorShape(112U), TensorShape(14U, 14U, 112U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4b/3x3
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 112U), TensorShape(3U, 3U, 112U, 224U), TensorShape(224U), TensorShape(14U, 14U, 224U), PadStrideInfo(1, 1, 1, 1) },
-        // inception_4b/5x5_reduce, inception_4c/5x5_reduce
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 512U), TensorShape(1U, 1U, 512U, 24U), TensorShape(24U), TensorShape(14U, 14U, 24U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4b/5x5, inception_4c/5x5
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 24U), TensorShape(5U, 5U, 24U, 64U), TensorShape(64U), TensorShape(14U, 14U, 64U), PadStrideInfo(1, 1, 2, 2) },
-        // inception_4b/pool_proj, inception_4c/pool_proj, inception_4d/pool_proj
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 512U), TensorShape(1U, 1U, 512U, 64U), TensorShape(64U), TensorShape(14U, 14U, 64U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4c/1x1, inception_4c/3x3_reduce
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 512U), TensorShape(1U, 1U, 512U, 128U), TensorShape(128U), TensorShape(14U, 14U, 128U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4c/3x3
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 128U), TensorShape(3U, 3U, 128U, 256U), TensorShape(256U), TensorShape(14U, 14U, 256U), PadStrideInfo(1, 1, 1, 1) },
-        // inception_4d/3x3_reduce
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 512U), TensorShape(1U, 1U, 512U, 144U), TensorShape(144U), TensorShape(14U, 14U, 144U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4d/3x3
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 144U), TensorShape(3U, 3U, 144U, 288U), TensorShape(288U), TensorShape(14U, 14U, 288U), PadStrideInfo(1, 1, 1, 1) },
-        // inception_4d/5x5_reduce
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 512U), TensorShape(1U, 1U, 512U, 32U), TensorShape(32U), TensorShape(14U, 14U, 32U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4d/5x5
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 32U), TensorShape(5U, 5U, 32U, 64U), TensorShape(64U), TensorShape(14U, 14U, 64U), PadStrideInfo(1, 1, 2, 2) },
-    }
-    {
-    }
-
-    ~GoogLeNetConvolutionLayerDataset1() = default;
-};
-
-/** GoogleLeNet v1 convolution layers tensor shapes (Part 2). */
-class GoogLeNetConvolutionLayerDataset2 final : public ConvolutionLayerDataset<17>
-{
-public:
-    GoogLeNetConvolutionLayerDataset2()
-        : GenericDataset
-    {
-        // inception_4e/1x1
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 528U), TensorShape(1U, 1U, 528U, 256U), TensorShape(256U), TensorShape(14U, 14U, 256U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4e/3x3_reduce
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 528U), TensorShape(1U, 1U, 528U, 160U), TensorShape(160U), TensorShape(14U, 14U, 160U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4e/3x3
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 160U), TensorShape(3U, 3U, 160U, 320U), TensorShape(320U), TensorShape(14U, 14U, 320U), PadStrideInfo(1, 1, 1, 1) },
-        // inception_4e/5x5_reduce
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 528U), TensorShape(1U, 1U, 528U, 32U), TensorShape(32U), TensorShape(14U, 14U, 32U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_4e/5x5
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 32U), TensorShape(5U, 5U, 32U, 128U), TensorShape(128U), TensorShape(14U, 14U, 128U), PadStrideInfo(1, 1, 2, 2) },
-        // inception_4e/pool_proj
-        ConvolutionLayerDataObject{ TensorShape(14U, 14U, 528U), TensorShape(1U, 1U, 528U, 128U), TensorShape(128U), TensorShape(14U, 14U, 128U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_5a/1x1
-        ConvolutionLayerDataObject{ TensorShape(7U, 7U, 832U), TensorShape(1U, 1U, 832U, 256U), TensorShape(256U), TensorShape(7U, 7U, 256U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_5a/3x3_reduce
-        ConvolutionLayerDataObject{ TensorShape(7U, 7U, 832U), TensorShape(1U, 1U, 832U, 160U), TensorShape(160U), TensorShape(7U, 7U, 160U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_5a/3x3
-        ConvolutionLayerDataObject{ TensorShape(7U, 7U, 160U), TensorShape(3U, 3U, 160U, 320U), TensorShape(320U), TensorShape(7U, 7U, 320U), PadStrideInfo(1, 1, 1, 1) },
-        // inception_5a/5x5_reduce
-        ConvolutionLayerDataObject{ TensorShape(7U, 7U, 832U), TensorShape(1U, 1U, 832U, 32U), TensorShape(32U), TensorShape(7U, 7U, 32U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_5a/5x5
-        ConvolutionLayerDataObject{ TensorShape(7U, 7U, 32U), TensorShape(5U, 5U, 32U, 128U), TensorShape(128U), TensorShape(7U, 7U, 128U), PadStrideInfo(1, 1, 2, 2) },
-        // inception_5a/pool_proj, inception_5b/pool_proj
-        ConvolutionLayerDataObject{ TensorShape(7U, 7U, 832U), TensorShape(1U, 1U, 832U, 128U), TensorShape(128U), TensorShape(7U, 7U, 128U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_5b/1x1
-        ConvolutionLayerDataObject{ TensorShape(7U, 7U, 832U), TensorShape(1U, 1U, 832U, 384U), TensorShape(384U), TensorShape(7U, 7U, 384U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_5b/3x3_reduce
-        ConvolutionLayerDataObject{ TensorShape(7U, 7U, 832U), TensorShape(1U, 1U, 832U, 192U), TensorShape(192U), TensorShape(7U, 7U, 192U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_5b/3x3
-        ConvolutionLayerDataObject{ TensorShape(7U, 7U, 192U), TensorShape(3U, 3U, 192U, 384U), TensorShape(384U), TensorShape(7U, 7U, 384U), PadStrideInfo(1, 1, 1, 1) },
-        // inception_5b/5x5_reduce
-        ConvolutionLayerDataObject{ TensorShape(7U, 7U, 832U), TensorShape(1U, 1U, 832U, 48U), TensorShape(48U), TensorShape(7U, 7U, 48U), PadStrideInfo(1, 1, 0, 0) },
-        // inception_5b/5x5
-        ConvolutionLayerDataObject{ TensorShape(7U, 7U, 48U), TensorShape(5U, 5U, 48U, 128U), TensorShape(128U), TensorShape(7U, 7U, 128U), PadStrideInfo(1, 1, 2, 2) }
-    }
-    {
-    }
-
-    ~GoogLeNetConvolutionLayerDataset2() = default;
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_DATASET_CONVOLUTION_LAYER_DATASET_H__ */
diff --git a/tests/validation_old/dataset/DataTypeDatasets.h b/tests/validation_old/dataset/DataTypeDatasets.h
deleted file mode 100644
index 34fc782..0000000
--- a/tests/validation_old/dataset/DataTypeDatasets.h
+++ /dev/null
@@ -1,193 +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_DATA_TYPE_DATASET_H__
-#define __ARM_COMPUTE_TEST_DATA_TYPE_DATASET_H__
-
-#include "arm_compute/core/Types.h"
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-/** Abstract data set containing data types.
- *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on different data types.
- */
-template <unsigned int Size>
-class DataTypes
-{
-public:
-    /** Type of the samples in the data set. */
-    using sample = DataType;
-
-    /** Dimensionality of the data set. */
-    enum
-    {
-        arity = 1
-    };
-
-    /** Number of samples in the data set. */
-#ifdef BOOST
-    boost::unit_test::data::size_t size() const
-#else  /* BOOST */
-    unsigned int size() const
-#endif /* BOOST */
-    {
-        return _types.size();
-    }
-
-    /** Type of the iterator used to step through all samples in the data set.
-     * Needs to support operator*() and operator++() which a pointer does.
-     */
-    using iterator = const DataType *;
-
-    /** Iterator to the first sample in the data set. */
-    iterator begin() const
-    {
-        return _types.data();
-    }
-
-protected:
-    /** Protected constructor to make the class abstract. */
-    template <typename... Ts>
-    DataTypes(Ts &&... types)
-        : _types{ { types... } }
-    {
-    }
-
-    /** Protected destructor to prevent deletion of derived classes through a
-     * pointer to the base class.
-     */
-    ~DataTypes() = default;
-
-private:
-    std::array<DataType, Size> _types;
-};
-
-/** Data set containing all data types. */
-class AllDataTypes final : public DataTypes<14>
-{
-public:
-    AllDataTypes()
-        : DataTypes{ DataType::U8, DataType::S8, DataType::U16, DataType::S16,
-                     DataType::U32, DataType::S32, DataType::U64, DataType::S64,
-                     DataType::F16, DataType::F32, DataType::F64, DataType::SIZET,
-                     DataType::QS8, DataType::QS16 }
-    {
-    }
-
-    ~AllDataTypes() = default;
-};
-
-/** Data set containing all unsigned data types. */
-class UnsignedDataTypes final : public DataTypes<4>
-{
-public:
-    UnsignedDataTypes()
-        : DataTypes{ DataType::U8, DataType::U16, DataType::U32, DataType::U64 }
-    {
-    }
-
-    ~UnsignedDataTypes() = default;
-};
-
-/** Data set containing all signed data types. */
-class SignedDataTypes final : public DataTypes<4>
-{
-public:
-    SignedDataTypes()
-        : DataTypes{ DataType::S8, DataType::S16, DataType::S32, DataType::S64 }
-    {
-    }
-
-    ~SignedDataTypes() = default;
-};
-
-/** Data set containing all floating point data types. */
-class FloatDataTypes final : public DataTypes<3>
-{
-public:
-    FloatDataTypes()
-        : DataTypes{ DataType::F16, DataType::F32, DataType::F64 }
-    {
-    }
-
-    ~FloatDataTypes() = default;
-};
-
-/** Data set containing all fixed point data types. */
-class FixedPointDataTypes final : public DataTypes<2>
-{
-public:
-    FixedPointDataTypes()
-        : DataTypes{ DataType::QS8, DataType::QS16 }
-    {
-    }
-
-    ~FixedPointDataTypes() = default;
-};
-
-/** Supported CNN float types. */
-class CNNFloatDataTypes final : public DataTypes<1>
-{
-public:
-    CNNFloatDataTypes()
-        : DataTypes{ DataType::F32 }
-    {
-    }
-
-    ~CNNFloatDataTypes() = default;
-};
-
-/** Supported CNN fixed point types. */
-class CNNFixedPointDataTypes final : public DataTypes<2>
-{
-public:
-    CNNFixedPointDataTypes()
-        : DataTypes{ DataType::QS8, DataType::QS16 }
-    {
-    }
-
-    ~CNNFixedPointDataTypes() = default;
-};
-
-/** Supported CNN types. */
-class CNNDataTypes final : public DataTypes<2>
-{
-public:
-    CNNDataTypes()
-        : DataTypes{ DataType::F32, DataType::QS8 }
-    {
-    }
-
-    ~CNNDataTypes() = default;
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_DATA_TYPE_DATASET_H__ */
diff --git a/tests/validation_old/dataset/FullyConnectedLayerDataset.h b/tests/validation_old/dataset/FullyConnectedLayerDataset.h
deleted file mode 100644
index 8a8fed8..0000000
--- a/tests/validation_old/dataset/FullyConnectedLayerDataset.h
+++ /dev/null
@@ -1,155 +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_DATASET_FULLY_CONNECTED_LAYER_DATASET_H__
-#define __ARM_COMPUTE_TEST_DATASET_FULLY_CONNECTED_LAYER_DATASET_H__
-
-#include "utils/TypePrinter.h"
-
-#include "arm_compute/core/TensorShape.h"
-#include "tests/validation_old/dataset/GenericDataset.h"
-
-#include <sstream>
-#include <type_traits>
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-class FullyConnectedLayerDataObject
-{
-public:
-    operator std::string() const
-    {
-        std::stringstream ss;
-        ss << "FullyConnectedLayer";
-        ss << "_I" << src_shape;
-        ss << "_K" << weights_shape;
-        return ss.str();
-    }
-
-    friend std::ostream &operator<<(std::ostream &os, const FullyConnectedLayerDataObject &obj)
-    {
-        os << static_cast<std::string>(obj);
-        return os;
-    }
-
-public:
-    TensorShape src_shape;
-    TensorShape weights_shape;
-    TensorShape bias_shape;
-    TensorShape dst_shape;
-    bool        transpose_weights;
-    bool        are_weights_reshaped;
-};
-
-template <unsigned int Size>
-using FullyConnectedLayerDataset = GenericDataset<FullyConnectedLayerDataObject, Size>;
-
-class SmallFullyConnectedLayerDataset final : public FullyConnectedLayerDataset<5>
-{
-public:
-    SmallFullyConnectedLayerDataset()
-        : GenericDataset
-    {
-        FullyConnectedLayerDataObject{ TensorShape(9U, 5U, 7U), TensorShape(315U, 271U), TensorShape(271U), TensorShape(271U), true, false },
-        FullyConnectedLayerDataObject{ TensorShape(9U, 5U, 7U, 3U), TensorShape(315U, 271U), TensorShape(271U), TensorShape(271U, 3U), true, false },
-        FullyConnectedLayerDataObject{ TensorShape(201U), TensorShape(201U, 529U), TensorShape(529U), TensorShape(529U), true, false },
-        FullyConnectedLayerDataObject{ TensorShape(9U, 5U, 7U), TensorShape(315U, 271U), TensorShape(271U), TensorShape(271U), true, true },
-        FullyConnectedLayerDataObject{ TensorShape(201U), TensorShape(201U, 529U), TensorShape(529U), TensorShape(529U), true, true },
-    }
-    {
-    }
-
-    ~SmallFullyConnectedLayerDataset() = default;
-};
-
-class LargeFullyConnectedLayerDataset final : public FullyConnectedLayerDataset<5>
-{
-public:
-    LargeFullyConnectedLayerDataset()
-        : GenericDataset
-    {
-        FullyConnectedLayerDataObject{ TensorShape(9U, 5U, 257U), TensorShape(11565U, 2123U), TensorShape(2123U), TensorShape(2123U), true, false },
-        FullyConnectedLayerDataObject{ TensorShape(9U, 5U, 257U, 2U), TensorShape(11565U, 2123U), TensorShape(2123U), TensorShape(2123U, 2U), true, false },
-        FullyConnectedLayerDataObject{ TensorShape(3127U), TensorShape(3127U, 989U), TensorShape(989U), TensorShape(989U), true, false },
-        FullyConnectedLayerDataObject{ TensorShape(9U, 5U, 257U), TensorShape(11565U, 2123U), TensorShape(2123U), TensorShape(2123U), true, true },
-        FullyConnectedLayerDataObject{ TensorShape(3127U), TensorShape(3127U, 989U), TensorShape(989U), TensorShape(989U), true, true },
-    }
-    {
-    }
-
-    ~LargeFullyConnectedLayerDataset() = default;
-};
-
-class AlexNetFullyConnectedLayerDataset final : public FullyConnectedLayerDataset<3>
-{
-public:
-    AlexNetFullyConnectedLayerDataset()
-        : GenericDataset
-    {
-        FullyConnectedLayerDataObject{ TensorShape(6U, 6U, 256U), TensorShape(9216U, 4096U), TensorShape(4096U), TensorShape(4096U), true },
-        FullyConnectedLayerDataObject{ TensorShape(4096U), TensorShape(4096U, 4096U), TensorShape(4096U), TensorShape(4096U), true },
-        FullyConnectedLayerDataObject{ TensorShape(4096U), TensorShape(4096U, 1000U), TensorShape(1000U), TensorShape(1000U), true },
-    }
-    {
-    }
-
-    ~AlexNetFullyConnectedLayerDataset() = default;
-};
-
-class LeNet5FullyConnectedLayerDataset final : public FullyConnectedLayerDataset<2>
-{
-public:
-    LeNet5FullyConnectedLayerDataset()
-        : GenericDataset
-    {
-        FullyConnectedLayerDataObject{ TensorShape(4U, 4U, 50U), TensorShape(800U, 500U), TensorShape(500U), TensorShape(500U) },
-        FullyConnectedLayerDataObject{ TensorShape(500U), TensorShape(500U, 10U), TensorShape(10U), TensorShape(10U) },
-    }
-    {
-    }
-
-    ~LeNet5FullyConnectedLayerDataset() = default;
-};
-
-class GoogLeNetFullyConnectedLayerDataset final : public FullyConnectedLayerDataset<1>
-{
-public:
-    GoogLeNetFullyConnectedLayerDataset()
-        : GenericDataset
-    {
-        FullyConnectedLayerDataObject{ TensorShape(1024U), TensorShape(1024U, 1000U), TensorShape(1000U), TensorShape(1000U), true },
-    }
-    {
-    }
-
-    ~GoogLeNetFullyConnectedLayerDataset() = default;
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_DATASET_FULLY_CONNECTED_LAYER_DATASET_H__ */
diff --git a/tests/validation_old/dataset/GEMMDataset.h b/tests/validation_old/dataset/GEMMDataset.h
deleted file mode 100644
index ee2a387..0000000
--- a/tests/validation_old/dataset/GEMMDataset.h
+++ /dev/null
@@ -1,220 +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_DATASET_GEMM_DATASET_H__
-#define __ARM_COMPUTE_TEST_DATASET_GEMM_DATASET_H__
-
-#include "utils/TypePrinter.h"
-
-#include "arm_compute/core/TensorShape.h"
-#include "arm_compute/core/Types.h"
-#include "tests/validation_old/dataset/GenericDataset.h"
-
-#include <ostream>
-#include <sstream>
-
-#include <tuple>
-#include <type_traits>
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-class GEMMDataObject
-{
-public:
-    //Data object used for matrix multiple
-    //D = alpha * A * B + beta * C;
-    TensorShape shape_a;
-    TensorShape shape_b;
-    TensorShape shape_c;
-    TensorShape shape_d;
-    float       alpha;
-    float       beta;
-
-    operator std::string() const
-    {
-        std::stringstream ss;
-        ss << "GEMM";
-        ss << "_A" << shape_a;
-        ss << "_B" << shape_b;
-        ss << "_C" << shape_c;
-        ss << "_D" << shape_d;
-        ss << "_alpha" << alpha;
-        ss << "_beta" << beta;
-        return ss.str();
-    }
-
-    friend std::ostream &operator<<(std::ostream &os, const GEMMDataObject &obj)
-    {
-        os << static_cast<std::string>(obj);
-        return os;
-    }
-};
-
-class SmallGEMMDataset : public GenericDataset<GEMMDataObject, 4>
-{
-public:
-    SmallGEMMDataset()
-        : GenericDataset
-    {
-        GEMMDataObject{ TensorShape(21U, 13U), TensorShape(33U, 21U), TensorShape(33U, 13U), TensorShape(33U, 13U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(31U, 1U), TensorShape(23U, 31U), TensorShape(23U, 1U), TensorShape(23U, 1U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(38U, 12U), TensorShape(21U, 38U), TensorShape(21U, 12U), TensorShape(21U, 12U), 0.2f, 1.2f },
-        GEMMDataObject{ TensorShape(32U, 1U), TensorShape(17U, 32U), TensorShape(17U, 1U), TensorShape(17U, 1U), 0.4f, 0.7f },
-    }
-    {
-    }
-
-    ~SmallGEMMDataset() = default;
-};
-
-class LargeGEMMDataset : public GenericDataset<GEMMDataObject, 4>
-{
-public:
-    LargeGEMMDataset()
-        : GenericDataset
-    {
-        GEMMDataObject{ TensorShape(923U, 429U), TensorShape(871U, 923U), TensorShape(871U, 429U), TensorShape(871U, 429U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1021U, 1U), TensorShape(783U, 1021U), TensorShape(783U, 1U), TensorShape(783U, 1U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(681U, 1023U), TensorShape(213U, 681U), TensorShape(213U, 1023U), TensorShape(213U, 1023U), 0.2f, 1.2f },
-        GEMMDataObject{ TensorShape(941U, 1U), TensorShape(623U, 941U), TensorShape(623U, 1U), TensorShape(623U, 1U), 0.4f, 0.7f },
-    }
-    {
-    }
-
-    ~LargeGEMMDataset() = default;
-};
-
-class GoogLeNetGEMMDataset1 : public GenericDataset<GEMMDataObject, 32>
-{
-public:
-    GoogLeNetGEMMDataset1()
-        : GenericDataset
-    {
-        GEMMDataObject{ TensorShape(147U, 12544U), TensorShape(64U, 147U), TensorShape(64U, 12544U), TensorShape(64U, 12544U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(64U, 3136U), TensorShape(64U, 64U), TensorShape(64U, 3136U), TensorShape(64U, 3136U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(576U, 3136U), TensorShape(192U, 576U), TensorShape(192U, 3136U), TensorShape(192U, 3136U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(192U, 784U), TensorShape(64U, 192U), TensorShape(64U, 784U), TensorShape(64U, 784U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(192U, 784U), TensorShape(96U, 192U), TensorShape(96U, 784U), TensorShape(96U, 784U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(864U, 784U), TensorShape(128U, 864U), TensorShape(128U, 784U), TensorShape(128U, 784U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(192U, 784U), TensorShape(16U, 192U), TensorShape(16U, 784U), TensorShape(16U, 784U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(400U, 784U), TensorShape(32U, 400U), TensorShape(32U, 784U), TensorShape(32U, 784U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(192U, 784U), TensorShape(32U, 192U), TensorShape(32U, 784U), TensorShape(32U, 784U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(256U, 784U), TensorShape(128U, 256U), TensorShape(128U, 784U), TensorShape(128U, 784U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(256U, 784U), TensorShape(128U, 256U), TensorShape(128U, 784U), TensorShape(128U, 784U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1152U, 784U), TensorShape(192U, 1152U), TensorShape(192U, 784U), TensorShape(192U, 784U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(256U, 784U), TensorShape(32U, 256U), TensorShape(32U, 784U), TensorShape(32U, 784U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(800U, 784U), TensorShape(96U, 800U), TensorShape(96U, 784U), TensorShape(96U, 784U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(256U, 784U), TensorShape(64U, 256U), TensorShape(64U, 784U), TensorShape(64U, 784U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(480U, 196U), TensorShape(192U, 480U), TensorShape(192U, 196U), TensorShape(192U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(480U, 196U), TensorShape(96U, 480U), TensorShape(96U, 196U), TensorShape(96U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(864U, 196U), TensorShape(204U, 864U), TensorShape(204U, 196U), TensorShape(204U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(480U, 196U), TensorShape(16U, 480U), TensorShape(16U, 196U), TensorShape(16U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(400U, 196U), TensorShape(48U, 400U), TensorShape(48U, 196U), TensorShape(48U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(480U, 196U), TensorShape(64U, 480U), TensorShape(64U, 196U), TensorShape(64U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(508U, 196U), TensorShape(160U, 508U), TensorShape(160U, 196U), TensorShape(160U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(508U, 196U), TensorShape(112U, 508U), TensorShape(112U, 196U), TensorShape(112U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1008U, 196U), TensorShape(224U, 1008U), TensorShape(224U, 196U), TensorShape(224U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(508U, 196U), TensorShape(24U, 508U), TensorShape(24U, 196U), TensorShape(24U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(600U, 196U), TensorShape(64U, 600U), TensorShape(64U, 196U), TensorShape(64U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(508U, 196U), TensorShape(64U, 508U), TensorShape(64U, 196U), TensorShape(64U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(512U, 196U), TensorShape(128U, 512U), TensorShape(128U, 196U), TensorShape(128U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(512U, 196U), TensorShape(128U, 512U), TensorShape(128U, 196U), TensorShape(128U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1152U, 196U), TensorShape(256U, 1152U), TensorShape(256U, 196U), TensorShape(256U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(512U, 196U), TensorShape(24U, 512U), TensorShape(24U, 196U), TensorShape(24U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(600U, 196U), TensorShape(64U, 600U), TensorShape(64U, 196U), TensorShape(64U, 196U), 1.0f, 0.0f }
-    }
-    {
-    }
-
-    ~GoogLeNetGEMMDataset1() = default;
-};
-
-class GoogLeNetGEMMDataset2 : public GenericDataset<GEMMDataObject, 32>
-{
-public:
-    GoogLeNetGEMMDataset2()
-        : GenericDataset
-    {
-        GEMMDataObject{ TensorShape(512U, 196U), TensorShape(64U, 512U), TensorShape(64U, 196U), TensorShape(64U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(512U, 196U), TensorShape(112U, 512U), TensorShape(112U, 196U), TensorShape(112U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(512U, 196U), TensorShape(144U, 512U), TensorShape(144U, 196U), TensorShape(144U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1296U, 196U), TensorShape(288U, 1296U), TensorShape(288U, 196U), TensorShape(288U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(512U, 196U), TensorShape(32U, 512U), TensorShape(32U, 196U), TensorShape(32U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(800U, 196U), TensorShape(64U, 800U), TensorShape(64U, 196U), TensorShape(64U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(512U, 196U), TensorShape(64U, 512U), TensorShape(64U, 196U), TensorShape(64U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(528U, 196U), TensorShape(256U, 528U), TensorShape(256U, 196U), TensorShape(256U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(528U, 196U), TensorShape(160U, 528U), TensorShape(160U, 196U), TensorShape(160U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1440U, 196U), TensorShape(320U, 1440U), TensorShape(320U, 196U), TensorShape(320U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(528U, 196U), TensorShape(32U, 528U), TensorShape(32U, 196U), TensorShape(32U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(800U, 196U), TensorShape(128U, 800U), TensorShape(128U, 196U), TensorShape(128U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(528U, 196U), TensorShape(128U, 528U), TensorShape(128U, 196U), TensorShape(128U, 196U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(832U, 49U), TensorShape(256U, 832U), TensorShape(256U, 49U), TensorShape(256U, 49U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(832U, 49U), TensorShape(160U, 832U), TensorShape(160U, 49U), TensorShape(160U, 49U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1440U, 49U), TensorShape(320U, 1440U), TensorShape(320U, 49U), TensorShape(320U, 49U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(832U, 49U), TensorShape(48U, 832U), TensorShape(48U, 49U), TensorShape(48U, 49U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1200U, 49U), TensorShape(128U, 1200U), TensorShape(128U, 49U), TensorShape(128U, 49U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(832U, 49U), TensorShape(128U, 832U), TensorShape(128U, 49U), TensorShape(128U, 49U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(832U, 49U), TensorShape(384U, 832U), TensorShape(384U, 49U), TensorShape(384U, 49U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(832U, 49U), TensorShape(192U, 832U), TensorShape(192U, 49U), TensorShape(192U, 49U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1728U, 49U), TensorShape(384U, 1728U), TensorShape(384U, 49U), TensorShape(384U, 49U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(832U, 49U), TensorShape(48U, 832U), TensorShape(48U, 49U), TensorShape(48U, 49U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1200U, 49U), TensorShape(128U, 1200U), TensorShape(128U, 49U), TensorShape(128U, 49U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(832U, 49U), TensorShape(128U, 832U), TensorShape(128U, 49U), TensorShape(128U, 49U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(508U, 16U), TensorShape(128U, 508U), TensorShape(128U, 16U), TensorShape(128U, 16U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(2048U, 1U), TensorShape(1024U, 2048U), TensorShape(1024U, 1U), TensorShape(1024U, 1U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1024U, 1U), TensorShape(1008U, 1024U), TensorShape(1008U, 1U), TensorShape(1008U, 1U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(528U, 16U), TensorShape(128U, 528U), TensorShape(128U, 16U), TensorShape(128U, 16U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(2048U, 1U), TensorShape(1024U, 2048U), TensorShape(1024U, 1U), TensorShape(1024U, 1U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1024U, 1U), TensorShape(1008U, 1024U), TensorShape(1008U, 1U), TensorShape(1008U, 1U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1024U, 1U), TensorShape(1008U, 1024U), TensorShape(1008U, 1U), TensorShape(1008U, 1U), 1.0f, 0.0f }
-    }
-    {
-    }
-
-    ~GoogLeNetGEMMDataset2() = default;
-};
-
-class MatrixMultiplyDataset : public GenericDataset<GEMMDataObject, 3>
-{
-public:
-    MatrixMultiplyDataset()
-        : GenericDataset
-    {
-        GEMMDataObject{ TensorShape(1024U, 1U), TensorShape(1000U, 1024U), TensorShape(1000U, 1U), TensorShape(1000U, 1U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(256U, 784U), TensorShape(64U, 256U), TensorShape(64U, 784U), TensorShape(64U, 784U), 1.0f, 0.0f },
-        GEMMDataObject{ TensorShape(1152U, 2704U), TensorShape(256U, 1152U), TensorShape(256U, 2704U), TensorShape(256U, 2704U), 1.0f, 0.0f },
-    }
-    {
-    }
-
-    ~MatrixMultiplyDataset() = default;
-};
-} // namespace test
-} // namespace arm_compute
-#endif //__ARM_COMPUTE_TEST_DATASET_GEMM_DATASET_H__
diff --git a/tests/validation_old/dataset/GenericDataset.h b/tests/validation_old/dataset/GenericDataset.h
deleted file mode 100644
index d2c9f2d..0000000
--- a/tests/validation_old/dataset/GenericDataset.h
+++ /dev/null
@@ -1,97 +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_DATASET_GENERIC_DATASET_H__
-#define __ARM_COMPUTE_TEST_DATASET_GENERIC_DATASET_H__
-
-#include "arm_compute/core/TensorShape.h"
-#include "arm_compute/core/Types.h"
-
-#include <type_traits>
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-/** Abstract data set containing multiple objects T.
- *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on different configurations.
- */
-template <class T, unsigned int Size>
-class GenericDataset
-{
-public:
-    /** Type of the samples in the data set. */
-    using sample = T;
-
-    /** Dimensionality of the data set. */
-    enum
-    {
-        arity = 1
-    };
-
-    /** Number of samples in the data set. */
-#ifdef BOOST
-    boost::unit_test::data::size_t size() const
-#else  /* BOOST */
-    unsigned int size() const
-#endif /* BOOST */
-    {
-        return _data.size();
-    }
-
-    /** Type of the iterator used to step through all samples in the data set.
-     * Needs to support operator*() and operator++() which a pointer does.
-     */
-    using iterator = const T *;
-
-    /** Iterator to the first sample in the data set. */
-    iterator begin() const
-    {
-        return _data.data();
-    }
-
-protected:
-    /** Protected constructor to make the class abstract. */
-    template <typename... Ts>
-    GenericDataset(Ts... objs)
-        : _data{ { objs... } }
-    {
-    }
-
-    /** Protected destructor to prevent deletion of derived class through a
-     * pointer to the base class.
-     */
-    ~GenericDataset() = default;
-
-private:
-    std::array<T, Size> _data;
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_DATASET_GENERIC_DATASET_H__ */
diff --git a/tests/validation_old/dataset/ImageDatasets.h b/tests/validation_old/dataset/ImageDatasets.h
deleted file mode 100644
index 7fcd067..0000000
--- a/tests/validation_old/dataset/ImageDatasets.h
+++ /dev/null
@@ -1,120 +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_IMAGE_DATASETS_H__
-#define __ARM_COMPUTE_TEST_IMAGE_DATASETS_H__
-
-#include <string>
-#include <type_traits>
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-/** Abstract data set containing image names.
- *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on different images.
- */
-template <unsigned int Size>
-class ImageDataset
-{
-public:
-    /** Type of the samples in the data set. */
-    using sample = const std::string;
-
-    /** Dimensionality of the data set. */
-    enum
-    {
-        arity = 1
-    };
-
-    /** Number of samples in the data set. */
-#ifdef BOOST
-    boost::unit_test::data::size_t size() const
-#else  /* BOOST */
-    unsigned int size() const
-#endif /* BOOST */
-    {
-        return _images.size();
-    }
-
-    /** Type of the iterator used to step through all samples in the data set.
-     * Needs to support operator*() and operator++() which a pointer does.
-     */
-    using iterator = const std::string *;
-
-    /** Iterator to the first sample in the data set. */
-    iterator begin() const
-    {
-        return _images.data();
-    }
-
-protected:
-    /** Protected constructor to make the class abstract. */
-    template <typename... Ts>
-    ImageDataset(Ts... images)
-        : _images{ { images... } }
-    {
-    }
-
-    /** Protected destructor to prevent deletion of derived class through a
-     * pointer to the base class.
-     */
-    ~ImageDataset() = default;
-
-private:
-    std::array<std::string, Size> _images;
-};
-
-/** Data set containing names of small images. */
-class SmallImages final : public ImageDataset<2>
-{
-public:
-    SmallImages()
-        : ImageDataset("128x128.ppm", "640x480.ppm")
-    {
-    }
-};
-
-/** Data set containing names of large images. */
-class LargeImages final : public ImageDataset<3>
-{
-public:
-    LargeImages()
-#ifdef INTERNAL_ONLY
-        : ImageDataset("1280x720.ppm", "1920x1080.ppm", "4160x3120.ppm")
-          // The 4k image is too large to distribute
-#else  /* INTERNAL_ONLY */
-        : ImageDataset("1280x720.ppm", "1920x1080.ppm")
-#endif /* INTERNAL_ONLY */
-    {
-    }
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_IMAGE_DATASETS_H__ */
diff --git a/tests/validation_old/dataset/InterpolationPolicyDataset.h b/tests/validation_old/dataset/InterpolationPolicyDataset.h
deleted file mode 100644
index 64cc9bf..0000000
--- a/tests/validation_old/dataset/InterpolationPolicyDataset.h
+++ /dev/null
@@ -1,80 +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_INTERPOLATION_POLICY_DATASET_H__
-#define __ARM_COMPUTE_TEST_INTERPOLATION_POLICY_DATASET_H__
-
-#include "arm_compute/core/Types.h"
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-/** Data set containing all possible interpolation policies.
- *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on all interpolation policies.
- */
-class InterpolationPolicies
-{
-public:
-    /** Type of the samples in the data set. */
-    using sample = InterpolationPolicy;
-
-    /** Dimensionality of the data set. */
-    enum
-    {
-        arity = 1
-    };
-
-    /** Number of samples in the data set. */
-#ifdef BOOST
-    boost::unit_test::data::size_t size() const
-#else  /* BOOST */
-    unsigned int size() const
-#endif /* BOOST */
-    {
-        return _policies.size();
-    }
-
-    /** Type of the iterator used to step through all samples in the data set.
-     * Needs to support operator*() and operator++() which a pointer does.
-     */
-    using iterator = const InterpolationPolicy *;
-
-    /** Iterator to the first sample in the data set. */
-    iterator begin() const
-    {
-        return _policies.data();
-    }
-
-private:
-    std::array<InterpolationPolicy, 3> _policies{ { InterpolationPolicy::NEAREST_NEIGHBOR, InterpolationPolicy::BILINEAR, InterpolationPolicy::AREA } };
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_INTERPOLATION_POLICY_DATASET_H__ */
diff --git a/tests/validation_old/dataset/MatrixPatternDataset.h b/tests/validation_old/dataset/MatrixPatternDataset.h
deleted file mode 100644
index 5100ae0..0000000
--- a/tests/validation_old/dataset/MatrixPatternDataset.h
+++ /dev/null
@@ -1,82 +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_DATASETS_TEST_MATRIX_PATTERN_DATASET_H__
-#define __ARM_COMPUTE_DATASETS_TEST_MATRIX_PATTERN_DATASET_H__
-
-#include "arm_compute/core/Types.h"
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-#include <array>
-
-namespace arm_compute
-{
-namespace test
-{
-/** Data set containing all possible border modes.
- *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on all border modes.
- */
-class MatrixPatterns
-{
-public:
-    /** Type of the samples in the data set. */
-    using sample = MatrixPattern;
-
-    /** Dimensionality of the data set. */
-    enum
-    {
-        arity = 1
-    };
-
-    /** Number of samples in the data set. */
-#ifdef BOOST
-    boost::unit_test::data::size_t size() const
-#else  /* BOOST */
-    unsigned int size() const
-#endif /* BOOST */
-    {
-        return _patterns.size();
-    }
-
-    /** Type of the iterator used to step through all samples in the data set.
-     * Needs to support operator*() and operator++() which a pointer does.
-     */
-    using iterator = const MatrixPattern *;
-
-    /** Iterator to the first sample in the data set. */
-    iterator begin() const
-    {
-        return _patterns.data();
-    }
-
-private:
-    std::array<MatrixPattern, 4> _patterns{ { MatrixPattern::BOX, MatrixPattern::CROSS, MatrixPattern::DISK, MatrixPattern::OTHER } };
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_DATASETS_TEST_MATRIX_PATTERN_DATASET_H__ */
diff --git a/tests/validation_old/dataset/NonLinearFilterFunctionDataset.h b/tests/validation_old/dataset/NonLinearFilterFunctionDataset.h
deleted file mode 100644
index 5beeb14..0000000
--- a/tests/validation_old/dataset/NonLinearFilterFunctionDataset.h
+++ /dev/null
@@ -1,82 +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_DATASETS_TEST_NON_LINEAR_FILTER_FUNCTION_DATASET_H__
-#define __ARM_COMPUTE_DATASETS_TEST_NON_LINEAR_FILTER_FUNCTION_DATASET_H__
-
-#include "arm_compute/core/Types.h"
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-#include <array>
-
-namespace arm_compute
-{
-namespace test
-{
-/** Data set containing all possible non linear filter function.
- *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on all border modes.
- */
-class NonLinearFilterFunctions
-{
-public:
-    /** Type of the samples in the data set. */
-    using sample = NonLinearFilterFunction;
-
-    /** Dimensionality of the data set. */
-    enum
-    {
-        arity = 1
-    };
-
-    /** Number of samples in the data set. */
-#ifdef BOOST
-    boost::unit_test::data::size_t size() const
-#else  /* BOOST */
-    unsigned int size() const
-#endif /* BOOST */
-    {
-        return _functions.size();
-    }
-
-    /** Type of the iterator used to step through all samples in the data set.
-     * Needs to support operator*() and operator++() which a pointer does.
-     */
-    using iterator = const NonLinearFilterFunction *;
-
-    /** Iterator to the first sample in the data set. */
-    iterator begin() const
-    {
-        return _functions.data();
-    }
-
-private:
-    std::array<NonLinearFilterFunction, 3> _functions{ { NonLinearFilterFunction::MAX, NonLinearFilterFunction::MEDIAN, NonLinearFilterFunction::MIN } };
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_DATASETS_TEST_NON_LINEAR_FILTER_FUNCTION_DATASET_H__ */
diff --git a/tests/validation_old/dataset/NormalizationLayerDataset.h b/tests/validation_old/dataset/NormalizationLayerDataset.h
deleted file mode 100644
index 489d1e0..0000000
--- a/tests/validation_old/dataset/NormalizationLayerDataset.h
+++ /dev/null
@@ -1,99 +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_DATASET_NORMALIZATION_LAYER_DATASET_H__
-#define __ARM_COMPUTE_TEST_DATASET_NORMALIZATION_LAYER_DATASET_H__
-
-#include "utils/TypePrinter.h"
-
-#include "arm_compute/core/TensorShape.h"
-#include "arm_compute/core/Types.h"
-#include "tests/validation_old/dataset/GenericDataset.h"
-
-#include <sstream>
-#include <type_traits>
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-class NormalizationLayerDataObject
-{
-public:
-    operator std::string() const
-    {
-        std::stringstream ss;
-        ss << "NormalizationLayer";
-        ss << "_I" << shape;
-        ss << "_F_" << info.type();
-        ss << "_S_" << info.norm_size();
-        return ss.str();
-    }
-
-public:
-    TensorShape            shape;
-    NormalizationLayerInfo info;
-};
-
-template <unsigned int Size>
-using NormalizationLayerDataset = GenericDataset<NormalizationLayerDataObject, Size>;
-
-class GoogLeNetNormalizationLayerDataset final : public NormalizationLayerDataset<2>
-{
-public:
-    GoogLeNetNormalizationLayerDataset()
-        : GenericDataset
-    {
-        // conv2/norm2
-        NormalizationLayerDataObject{ TensorShape(56U, 56U, 192U), NormalizationLayerInfo(NormType::CROSS_MAP, 5, 0.0001f, 0.75f) },
-        // pool1/norm1
-        NormalizationLayerDataObject{ TensorShape(56U, 56U, 64U), NormalizationLayerInfo(NormType::CROSS_MAP, 5, 0.0001f, 0.75f) }
-    }
-    {
-    }
-
-    ~GoogLeNetNormalizationLayerDataset() = default;
-};
-
-class AlexNetNormalizationLayerDataset final : public NormalizationLayerDataset<2>
-{
-public:
-    AlexNetNormalizationLayerDataset()
-        : GenericDataset
-    {
-        NormalizationLayerDataObject{ TensorShape(55U, 55U, 96U), NormalizationLayerInfo(NormType::CROSS_MAP, 5, 0.0001f, 0.75f) },
-        NormalizationLayerDataObject{ TensorShape(27U, 27U, 256U), NormalizationLayerInfo(NormType::CROSS_MAP, 5, 0.0001f, 0.75f) },
-    }
-    {
-    }
-
-    ~AlexNetNormalizationLayerDataset() = default;
-};
-
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_DATASET_NORMALIZATION_LAYER_DATASET_H__ */
diff --git a/tests/validation_old/dataset/NormalizationTypeDataset.h b/tests/validation_old/dataset/NormalizationTypeDataset.h
deleted file mode 100644
index 2a89dbe..0000000
--- a/tests/validation_old/dataset/NormalizationTypeDataset.h
+++ /dev/null
@@ -1,80 +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_NORMALIZATION_TYPE_DATASET_H__
-#define __ARM_COMPUTE_TEST_NORMALIZATION_TYPE_DATASET_H__
-
-#include "arm_compute/core/Types.h"
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-/** Data set containing all possible normalization types.
- *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on all normalization types.
- */
-class NormalizationTypes
-{
-public:
-    /** Type of the samples in the data set. */
-    using sample = NormType;
-
-    /** Dimensionality of the data set. */
-    enum
-    {
-        arity = 1
-    };
-
-    /** Number of samples in the data set. */
-#ifdef BOOST
-    boost::unit_test::data::size_t size() const
-#else  /* BOOST */
-    unsigned int size() const
-#endif /* BOOST */
-    {
-        return _types.size();
-    }
-
-    /** Type of the iterator used to step through all samples in the data set.
-     * Needs to support operator*() and operator++() which a pointer does.
-     */
-    using iterator = const NormType *;
-
-    /** Iterator to the first sample in the data set. */
-    iterator begin() const
-    {
-        return _types.data();
-    }
-
-private:
-    const std::array<NormType, 3> _types{ { NormType::IN_MAP_1D, NormType::IN_MAP_2D, NormType::CROSS_MAP } };
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_NORMALIZATION_TYPE_DATASET_H__ */
diff --git a/tests/validation_old/dataset/PoolingLayerDataset.h b/tests/validation_old/dataset/PoolingLayerDataset.h
deleted file mode 100644
index a4e570c..0000000
--- a/tests/validation_old/dataset/PoolingLayerDataset.h
+++ /dev/null
@@ -1,138 +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_DATASET_POOLING_LAYER_DATASET_H__
-#define __ARM_COMPUTE_TEST_DATASET_POOLING_LAYER_DATASET_H__
-
-#include "utils/TypePrinter.h"
-
-#include "arm_compute/core/TensorShape.h"
-#include "arm_compute/core/Types.h"
-#include "tests/validation_old/dataset/GenericDataset.h"
-
-#include <type_traits>
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-class PoolingLayerDataObject
-{
-public:
-    operator std::string() const
-    {
-        std::stringstream ss;
-        ss << "PoolingLayer";
-        ss << "_I" << src_shape;
-        ss << "_S_" << info.pool_size();
-        ss << "_F_" << info.pool_type();
-        ss << "_PS" << info.pad_stride_info();
-        return ss.str();
-    }
-
-    friend std::ostream &operator<<(std::ostream &s, const PoolingLayerDataObject &obj)
-    {
-        s << static_cast<std::string>(obj);
-        return s;
-    }
-
-public:
-    TensorShape      src_shape;
-    TensorShape      dst_shape;
-    PoolingLayerInfo info;
-};
-
-template <unsigned int Size>
-using PoolingLayerDataset = GenericDataset<PoolingLayerDataObject, Size>;
-
-class AlexNetPoolingLayerDataset final : public PoolingLayerDataset<3>
-{
-public:
-    AlexNetPoolingLayerDataset()
-        : GenericDataset
-    {
-        PoolingLayerDataObject{ TensorShape(55U, 55U, 96U), TensorShape(27U, 27U, 96U), PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0)) },
-        PoolingLayerDataObject{ TensorShape(27U, 27U, 256U), TensorShape(13U, 13U, 256U), PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0)) },
-        PoolingLayerDataObject{ TensorShape(13U, 13U, 256U), TensorShape(6U, 6U, 256U), PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0)) },
-    }
-    {
-    }
-
-    ~AlexNetPoolingLayerDataset() = default;
-};
-
-class LeNet5PoolingLayerDataset final : public PoolingLayerDataset<2>
-{
-public:
-    LeNet5PoolingLayerDataset()
-        : GenericDataset
-    {
-        PoolingLayerDataObject{ TensorShape(24U, 24U, 20U), TensorShape(12U, 12U, 20U), PoolingLayerInfo(PoolingType::MAX, 2, PadStrideInfo(2, 2, 0, 0)) },
-        PoolingLayerDataObject{ TensorShape(8U, 8U, 50U), TensorShape(4U, 4U, 50U), PoolingLayerInfo(PoolingType::MAX, 2, PadStrideInfo(2, 2, 0, 0)) },
-    }
-    {
-    }
-
-    ~LeNet5PoolingLayerDataset() = default;
-};
-
-class GoogLeNetPoolingLayerDataset final : public PoolingLayerDataset<10>
-{
-public:
-    GoogLeNetPoolingLayerDataset()
-        : GenericDataset
-    {
-        // FIXME: Add support for 7x7 pooling layer pool5/7x7_s1
-        // pool1/3x3_s2
-        PoolingLayerDataObject{ TensorShape(112U, 112U, 64U), TensorShape(56U, 56U, 64U), PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL)) },
-        // pool2/3x3_s2
-        PoolingLayerDataObject{ TensorShape(56U, 56U, 192U), TensorShape(28U, 28U, 192U), PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL)) },
-        // inception_3a/pool
-        PoolingLayerDataObject{ TensorShape(28U, 28U, 192U), TensorShape(28U, 28U, 192U), PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL)) },
-        // inception_3b/pool
-        PoolingLayerDataObject{ TensorShape(28U, 28U, 256U), TensorShape(28U, 28U, 256U), PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL)) },
-        // pool3/3x3_s2
-        PoolingLayerDataObject{ TensorShape(28U, 28U, 480U), TensorShape(14U, 14U, 480U), PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL)) },
-        // inception_4a/pool
-        PoolingLayerDataObject{ TensorShape(14U, 14U, 480U), TensorShape(14U, 14U, 480U), PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL)) },
-        // inception_4b/pool, inception_4c/pool, inception_4d/pool
-        PoolingLayerDataObject{ TensorShape(14U, 14U, 512U), TensorShape(14U, 14U, 512U), PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL)) },
-        // inception_4e/pool
-        PoolingLayerDataObject{ TensorShape(14U, 14U, 528U), TensorShape(14U, 14U, 528U), PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL)) },
-        // pool4/3x3_s2
-        PoolingLayerDataObject{ TensorShape(14U, 14U, 832U), TensorShape(7U, 7U, 832U), PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL)) },
-        // inception_5a/pool, inception_5b/pool
-        PoolingLayerDataObject{ TensorShape(7U, 7U, 832U), TensorShape(7U, 7U, 832U), PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL)) },
-    }
-    {
-    }
-
-    ~GoogLeNetPoolingLayerDataset() = default;
-};
-} // namespace test
-} // namespace arm_compute
-#endif //__ARM_COMPUTE_TEST_DATASET_POOLING_LAYER_DATASET_H__
diff --git a/tests/validation_old/dataset/PoolingTypesDataset.h b/tests/validation_old/dataset/PoolingTypesDataset.h
deleted file mode 100644
index a826df3..0000000
--- a/tests/validation_old/dataset/PoolingTypesDataset.h
+++ /dev/null
@@ -1,55 +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_DATASET_POOLING_TYPE_DATASET_H__
-#define __ARM_COMPUTE_TEST_DATASET_POOLING_TYPE_DATASET_H__
-
-#include "arm_compute/core/Types.h"
-#include "tests/validation_old/dataset/GenericDataset.h"
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-/** Data set containing all possible pooling types.
- *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on all pooling types.
- */
-class PoolingTypes final : public GenericDataset<PoolingType, 2>
-{
-public:
-    PoolingTypes()
-        : GenericDataset{ PoolingType::MAX, PoolingType::AVG }
-    {
-    }
-
-    ~PoolingTypes() = default;
-};
-} // namespace test
-} // namespace arm_compute
-#endif //__ARM_COMPUTE_TEST_DATASET_POOLING_TYPE_DATASET_H__
diff --git a/tests/validation_old/dataset/RoundingPolicyDataset.h b/tests/validation_old/dataset/RoundingPolicyDataset.h
deleted file mode 100644
index af946b4..0000000
--- a/tests/validation_old/dataset/RoundingPolicyDataset.h
+++ /dev/null
@@ -1,82 +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_ROUNDING_POLICY_DATASETS_H__
-#define __ARM_COMPUTE_TEST_ROUNDING_POLICY_DATASETS_H__
-
-#include "arm_compute/core/Types.h"
-
-#include <type_traits>
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-/** Data set containing all possible rounding policies.
- *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on different rounding policies.
- */
-class RoundingPolicies
-{
-public:
-    /** Type of the samples in the data set. */
-    using sample = RoundingPolicy;
-
-    /** Dimensionality of the data set. */
-    enum
-    {
-        arity = 1
-    };
-
-    /** Number of samples in the data set. */
-#ifdef BOOST
-    boost::unit_test::data::size_t size() const
-#else  /* BOOST */
-    unsigned int size() const
-#endif /* BOOST */
-    {
-        return _policies.size();
-    }
-
-    /** Type of the iterator used to step through all samples in the data set.
-     * Needs to support operator*() and operator++() which a pointer does.
-     */
-    using iterator = const RoundingPolicy *;
-
-    /** Iterator to the first sample in the data set. */
-    iterator begin() const
-    {
-        return _policies.data();
-    }
-
-private:
-    std::array<RoundingPolicy, 3> _policies{ { RoundingPolicy::TO_ZERO, RoundingPolicy::TO_NEAREST_UP, RoundingPolicy::TO_NEAREST_EVEN } };
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_ROUNDING_POLICY_DATASETS_H__ */
diff --git a/tests/validation_old/dataset/ShapeDatasets.h b/tests/validation_old/dataset/ShapeDatasets.h
deleted file mode 100644
index 3c986ab..0000000
--- a/tests/validation_old/dataset/ShapeDatasets.h
+++ /dev/null
@@ -1,152 +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_SHAPE_DATASETS_H__
-#define __ARM_COMPUTE_TEST_SHAPE_DATASETS_H__
-
-#include "arm_compute/core/TensorShape.h"
-
-#include <type_traits>
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-/** Abstract data set containing tensor shapes.
- *
- * Can be used as input for Boost data test cases to automatically run a test
- * case on different tensor shapes.
- */
-template <unsigned int Size>
-class ShapeDataset
-{
-public:
-    /** Type of the samples in the data set. */
-    using sample = TensorShape;
-
-    /** Dimensionality of the data set. */
-    enum
-    {
-        arity = 1
-    };
-
-    /** Number of samples in the data set. */
-#ifdef BOOST
-    boost::unit_test::data::size_t size() const
-#else  /* BOOST */
-    unsigned int size() const
-#endif /* BOOST */
-    {
-        return _shapes.size();
-    }
-
-    /** Type of the iterator used to step through all samples in the data set.
-     * Needs to support operator*() and operator++() which a pointer does.
-     */
-    using iterator = const TensorShape *;
-
-    /** Iterator to the first sample in the data set. */
-    iterator begin() const
-    {
-        return _shapes.data();
-    }
-
-protected:
-    /** Protected constructor to make the class abstract. */
-    template <typename... Ts>
-    ShapeDataset(Ts... shapes)
-        : _shapes{ { shapes... } }
-    {
-    }
-
-    /** Protected destructor to prevent deletion of derived class through a
-     * pointer to the base class.
-     */
-    ~ShapeDataset() = default;
-
-private:
-    std::array<TensorShape, Size> _shapes;
-};
-
-/** Data set containing one 1D tensor shape. */
-class Small1DShape final : public ShapeDataset<1>
-{
-public:
-    Small1DShape()
-        : ShapeDataset(TensorShape(256U))
-    {
-    }
-};
-
-/** Data set containing two small 2D tensor shapes. */
-class Small2DShapes final : public ShapeDataset<2>
-{
-public:
-    Small2DShapes()
-        : ShapeDataset(TensorShape(17U, 17U),
-                       TensorShape(640U, 480U))
-    {
-    }
-};
-
-/** Data set containing small tensor shapes. */
-class SmallShapes final : public ShapeDataset<3>
-{
-public:
-    SmallShapes()
-        : ShapeDataset(TensorShape(7U, 7U),
-                       TensorShape(27U, 13U, 2U),
-                       TensorShape(128U, 64U, 1U, 3U))
-    {
-    }
-};
-
-/** Data set containing large tensor shapes. */
-class LargeShapes final : public ShapeDataset<3>
-{
-public:
-    LargeShapes()
-        : ShapeDataset(TensorShape(1920U, 1080U),
-                       TensorShape(1245U, 652U, 1U, 3U),
-                       TensorShape(4160U, 3120U))
-    {
-    }
-};
-
-/** Data set containing two 2D large tensor shapes. */
-class Large2DShapes final : public ShapeDataset<2>
-{
-public:
-    Large2DShapes()
-        : ShapeDataset(TensorShape(1920U, 1080U),
-                       TensorShape(4160U, 3120U))
-    {
-    }
-};
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_SHAPE_DATASETS_H__ */
diff --git a/tests/validation_old/dataset/ThresholdDataset.h b/tests/validation_old/dataset/ThresholdDataset.h
deleted file mode 100644
index 789ffac..0000000
--- a/tests/validation_old/dataset/ThresholdDataset.h
+++ /dev/null
@@ -1,95 +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_DATASET_THRESHOLD_DATASET_H__
-#define __ARM_COMPUTE_TEST_DATASET_THRESHOLD_DATASET_H__
-
-#include "utils/TypePrinter.h"
-
-#include "arm_compute/core/TensorShape.h"
-#include "arm_compute/core/Types.h"
-#include "tests/validation_old/dataset/GenericDataset.h"
-
-#include <ostream>
-#include <sstream>
-
-#include <tuple>
-#include <type_traits>
-
-#ifdef BOOST
-#include "tests/validation_old/boost_wrapper.h"
-#endif /* BOOST */
-
-namespace arm_compute
-{
-namespace test
-{
-class ThresholdDataObject
-{
-public:
-    uint8_t       threshold;
-    uint8_t       false_value;
-    uint8_t       true_value;
-    ThresholdType type;
-    uint8_t       upper;
-
-    operator std::string() const
-    {
-        std::stringstream ss;
-        ss << "Threshold";
-        ss << "_threshold_value" << threshold;
-        ss << "_false_value" << std::boolalpha << false_value;
-        ss << "_true_value" << std::boolalpha << true_value;
-        ss << "_type";
-        ss << ((type == ThresholdType::BINARY) ? "binary" : "range");
-        ss << "_upper" << upper;
-        return ss.str();
-    }
-
-    friend std::ostream &operator<<(std::ostream &os, const ThresholdDataObject &obj)
-    {
-        os << static_cast<std::string>(obj);
-        return os;
-    }
-};
-
-class ThresholdDataset : public GenericDataset<ThresholdDataObject, 4>
-{
-public:
-    ThresholdDataset()
-        : GenericDataset
-    {
-        ThresholdDataObject{ 10U, 25U, 3U, ThresholdType::BINARY, 0U },
-        ThresholdDataObject{ 20U, 1U, 0U, ThresholdType::BINARY, 0U },
-        ThresholdDataObject{ 30U, 1U, 0U, ThresholdType::RANGE, 100U },
-        ThresholdDataObject{ 100U, 1U, 0U, ThresholdType::RANGE, 200U },
-    }
-    {
-    }
-
-    ~ThresholdDataset() = default;
-};
-
-} // namespace test
-} // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_DATASET_THRESHOLD_DATASET_H__ */
diff --git a/tests/validation_old/half.h b/tests/validation_old/half.h
deleted file mode 100644
index d8aa341..0000000
--- a/tests/validation_old/half.h
+++ /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.
- */
-#ifndef __ARM_COMPUTE_TEST_HALF_H__
-#define __ARM_COMPUTE_TEST_HALF_H__
-
-#ifdef __ANDROID__
-// Android toolchain is broken and doesn't support all CPP11 math functions.
-#define HALF_ENABLE_CPP11_CMATH 0
-#endif /* __ANDROID__ */
-
-// Set style to round to nearest
-#define HALF_ROUND_STYLE 1
-#define HALF_ROUND_TIES_TO_EVEN 1
-
-#include "half/half.hpp"
-#endif /* __ARM_COMPUTE_TEST_HALF_H__ */
diff --git a/tests/validation_old/main.cpp b/tests/validation_old/main.cpp
deleted file mode 100644
index 9f15c3a..0000000
--- a/tests/validation_old/main.cpp
+++ /dev/null
@@ -1,97 +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.
- */
-#define BOOST_TEST_ALTERNATIVE_INIT_API
-
-#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 "tests/validation_old/boost_wrapper.h"
-
-#include <iostream>
-#include <memory>
-#include <random>
-
-using namespace arm_compute::test;
-using namespace arm_compute::test::validation;
-
-namespace arm_compute
-{
-namespace test
-{
-ValidationUserConfiguration    user_config;
-std::unique_ptr<AssetsLibrary> library;
-} // namespace test
-} // namespace arm_compute
-
-struct GlobalFixture
-{
-    GlobalFixture()
-    {
-        library = arm_compute::support::cpp14::make_unique<AssetsLibrary>(user_config.path.get(), user_config.seed);
-        std::cout << "Seed: " << library->seed() << "\n";
-    }
-};
-
-BOOST_GLOBAL_FIXTURE(GlobalFixture);
-
-bool init_unit_test()
-{
-    boost::unit_test::framework::master_test_suite().p_name.value = "Compute Library Validation Tests";
-
-    ValidationProgramOptions options;
-
-    int   &argc = boost::unit_test::framework::master_test_suite().argc;
-    char **argv = boost::unit_test::framework::master_test_suite().argv;
-
-    try
-    {
-        options.parse_commandline(argc, argv);
-
-        if(options.wants_help())
-        {
-            std::cout << "Usage: " << argv[0] << " [options] PATH\n";
-            std::cout << options.get_help() << "\n";
-            return false;
-        }
-
-        user_config = ValidationUserConfiguration(options);
-    }
-    catch(const boost::program_options::required_option &err)
-    {
-        std::cerr << "Error: " << err.what() << "\n";
-        std::cout << "\nUsage: " << argv[0] << " [options] PATH\n";
-        std::cout << options.get_help() << "\n";
-        return false;
-    }
-
-    std::cout << "Using " << user_config.threads << " CPU " << (user_config.threads == 1 ? "thread" : "threads") << "\n";
-    arm_compute::Scheduler::get().set_num_threads(user_config.threads);
-    return true;
-}
