diff --git a/tests/datasets/SplitDataset.h b/tests/datasets/SplitDataset.h
new file mode 100644
index 0000000..b38252a
--- /dev/null
+++ b/tests/datasets/SplitDataset.h
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2018 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_SPLIT_DATASET
+#define ARM_COMPUTE_TEST_SPLIT_DATASET
+
+#include "utils/TypePrinter.h"
+
+#include "arm_compute/core/Types.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace datasets
+{
+class SplitDataset
+{
+public:
+    using type = std::tuple<TensorShape, unsigned int, unsigned int>;
+
+    struct iterator
+    {
+        iterator(std::vector<TensorShape>::const_iterator  tensor_shapes_it,
+                 std::vector<unsigned int>::const_iterator axis_values_it,
+                 std::vector<unsigned int>::const_iterator splits_values_it)
+            : _tensor_shapes_it{ std::move(tensor_shapes_it) },
+              _axis_values_it{ std::move(axis_values_it) },
+              _splits_values_it{ std::move(splits_values_it) }
+        {
+        }
+
+        std::string description() const
+        {
+            std::stringstream description;
+            description << "Shape=" << *_tensor_shapes_it << ":";
+            description << "Axis=" << *_axis_values_it << ":";
+            description << "Splits=" << *_splits_values_it << ":";
+            return description.str();
+        }
+
+        SplitDataset::type operator*() const
+        {
+            return std::make_tuple(*_tensor_shapes_it, *_axis_values_it, *_splits_values_it);
+        }
+
+        iterator &operator++()
+        {
+            ++_tensor_shapes_it;
+            ++_axis_values_it;
+            ++_splits_values_it;
+            return *this;
+        }
+
+    private:
+        std::vector<TensorShape>::const_iterator  _tensor_shapes_it;
+        std::vector<unsigned int>::const_iterator _axis_values_it;
+        std::vector<unsigned int>::const_iterator _splits_values_it;
+    };
+
+    iterator begin() const
+    {
+        return iterator(_tensor_shapes.begin(), _axis_values.begin(), _splits_values.begin());
+    }
+
+    int size() const
+    {
+        return std::min(_tensor_shapes.size(), std::min(_axis_values.size(), _splits_values.size()));
+    }
+
+    void add_config(TensorShape shape, unsigned int axis, unsigned int splits)
+    {
+        _tensor_shapes.emplace_back(std::move(shape));
+        _axis_values.emplace_back(axis);
+        _splits_values.emplace_back(splits);
+    }
+
+protected:
+    SplitDataset()                = default;
+    SplitDataset(SplitDataset &&) = default;
+
+private:
+    std::vector<TensorShape>  _tensor_shapes{};
+    std::vector<unsigned int> _axis_values{};
+    std::vector<unsigned int> _splits_values{};
+};
+
+class SmallSplitDataset final : public SplitDataset
+{
+public:
+    SmallSplitDataset()
+    {
+        add_config(TensorShape(128U), 0U, 4U);
+        add_config(TensorShape(6U, 3U, 4U), 2U, 2U);
+        add_config(TensorShape(27U, 14U, 2U), 1U, 2U);
+        add_config(TensorShape(64U, 32U, 4U, 6U), 3U, 3U);
+    }
+};
+
+class LargeSplitDataset final : public SplitDataset
+{
+public:
+    LargeSplitDataset()
+    {
+        add_config(TensorShape(512U), 0U, 8U);
+        add_config(TensorShape(128U, 64U, 8U), 2U, 2U);
+        add_config(TensorShape(128U, 64U, 8U, 2U), 1U, 2U);
+        add_config(TensorShape(128U, 64U, 32U, 4U), 3U, 4U);
+    }
+};
+} // namespace datasets
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_SPLIT_DATASET */
diff --git a/tests/validation/CL/Split.cpp b/tests/validation/CL/Split.cpp
new file mode 100644
index 0000000..7736318
--- /dev/null
+++ b/tests/validation/CL/Split.cpp
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2018 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/CLSplit.h"
+
+#include "tests/CL/CLAccessor.h"
+#include "tests/datasets/SplitDataset.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/SplitFixture.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+TEST_SUITE(CL)
+TEST_SUITE(Split)
+
+// *INDENT-OFF*
+// clang-format off
+DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
+        framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 3U, 16U, 2U), 1, DataType::F32), // Invalid axis
+                                                TensorInfo(TensorShape(27U, 3U, 16U, 2U), 1, DataType::F32), // Invalid number of splits
+                                                TensorInfo(TensorShape(27U, 3U, 16U, 2U), 1, DataType::F32)
+        }),
+        framework::dataset::make("Axis", { 4, 2, 2 })),
+        framework::dataset::make("Splits", { 4, 5, 4 })),
+        framework::dataset::make("Expected", { false, false, true })),
+        input_info, axis, splits, expected)
+{
+    std::vector<TensorInfo> outputs_info(splits);
+    std::vector<ITensorInfo*> outputs_info_ptr;
+    for(auto &output_info : outputs_info)
+    {
+        outputs_info_ptr.emplace_back(&output_info);
+    }
+    const Status status = CLSplit::validate(&input_info.clone()->set_is_resizable(false), outputs_info_ptr, axis);
+    ARM_COMPUTE_EXPECT(bool(status) == expected, framework::LogLevel::ERRORS);
+}
+// clang-format on
+// *INDENT-ON*
+
+DATA_TEST_CASE(Configuration,
+               framework::DatasetMode::ALL,
+               combine(datasets::SmallSplitDataset(), framework::dataset::make("DataType", { DataType::F16, DataType::F32 })),
+               shape, axis, splits, data_type)
+{
+    // Create tensors
+    CLTensor                 src = create_tensor<CLTensor>(shape, data_type);
+    std::vector<CLTensor>    dsts(splits);
+    std::vector<ICLTensor *> dsts_ptrs;
+    for(auto &dst : dsts)
+    {
+        dsts_ptrs.emplace_back(&dst);
+    }
+
+    // Create and Configure function
+    CLSplit split;
+    split.configure(&src, dsts_ptrs, axis);
+
+    // Validate valid regions
+    for(auto &dst : dsts)
+    {
+        const ValidRegion valid_region = shape_to_valid_region(dst.info()->tensor_shape());
+        validate(dst.info()->valid_region(), valid_region);
+    }
+}
+
+template <typename T>
+using CLSplitFixture = SplitFixture<CLTensor, ICLTensor, CLAccessor, CLSplit, T>;
+
+TEST_SUITE(Float)
+TEST_SUITE(FP16)
+FIXTURE_DATA_TEST_CASE(RunSmall,
+                       CLSplitFixture<half>,
+                       framework::DatasetMode::PRECOMMIT,
+                       combine(datasets::SmallSplitDataset(), framework::dataset::make("DataType", DataType::F16)))
+{
+    // Validate outputs
+    for(unsigned int i = 0; i < _target.size(); ++i)
+    {
+        validate(CLAccessor(_target[i]), _reference[i]);
+    }
+}
+
+FIXTURE_DATA_TEST_CASE(RunLarge,
+                       CLSplitFixture<half>,
+                       framework::DatasetMode::NIGHTLY,
+                       combine(datasets::LargeSplitDataset(), framework::dataset::make("DataType", DataType::F16)))
+{
+    // Validate outputs
+    for(unsigned int i = 0; i < _target.size(); ++i)
+    {
+        validate(CLAccessor(_target[i]), _reference[i]);
+    }
+}
+TEST_SUITE_END() // FP16
+
+TEST_SUITE(FP32)
+FIXTURE_DATA_TEST_CASE(RunSmall,
+                       CLSplitFixture<float>,
+                       framework::DatasetMode::PRECOMMIT,
+                       combine(datasets::SmallSplitDataset(), framework::dataset::make("DataType", DataType::F32)))
+{
+    // Validate outputs
+    for(unsigned int i = 0; i < _target.size(); ++i)
+    {
+        validate(CLAccessor(_target[i]), _reference[i]);
+    }
+}
+
+FIXTURE_DATA_TEST_CASE(RunLarge,
+                       CLSplitFixture<float>,
+                       framework::DatasetMode::NIGHTLY,
+                       combine(datasets::LargeSplitDataset(), framework::dataset::make("DataType", DataType::F32)))
+{
+    // Validate outputs
+    for(unsigned int i = 0; i < _target.size(); ++i)
+    {
+        validate(CLAccessor(_target[i]), _reference[i]);
+    }
+}
+TEST_SUITE_END() // FP32
+TEST_SUITE_END() // Float
+
+TEST_SUITE_END() // Split
+TEST_SUITE_END() // CL
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/validation/fixtures/SliceOperationsFixtures.h b/tests/validation/fixtures/SliceOperationsFixtures.h
index 018bafb..df016d5 100644
--- a/tests/validation/fixtures/SliceOperationsFixtures.h
+++ b/tests/validation/fixtures/SliceOperationsFixtures.h
@@ -21,8 +21,8 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#ifndef ARM_COMPUTE_TEST_STRIDED_SLICE_FIXTURE
-#define ARM_COMPUTE_TEST_STRIDED_SLICE_FIXTURE
+#ifndef ARM_COMPUTE_TEST_SLICE_OPERATIONS_FIXTURE
+#define ARM_COMPUTE_TEST_SLICE_OPERATIONS_FIXTURE
 
 #include "arm_compute/core/TensorShape.h"
 #include "arm_compute/core/Types.h"
@@ -179,4 +179,4 @@
 } // namespace validation
 } // namespace test
 } // namespace arm_compute
-#endif /* ARM_COMPUTE_TEST_STRIDED_SLICE_FIXTURE */
+#endif /* ARM_COMPUTE_TEST_SLICE_OPERATIONS_FIXTURE */
diff --git a/tests/validation/fixtures/SplitFixture.h b/tests/validation/fixtures/SplitFixture.h
new file mode 100644
index 0000000..0750177
--- /dev/null
+++ b/tests/validation/fixtures/SplitFixture.h
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2018 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_SPLIT_FIXTURE
+#define ARM_COMPUTE_TEST_SPLIT_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/RawLutAccessor.h"
+#include "tests/framework/Asserts.h"
+#include "tests/framework/Fixture.h"
+#include "tests/validation/Helpers.h"
+#include "tests/validation/reference/SliceOperations.h"
+
+#include <algorithm>
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+template <typename TensorType, typename ITensorType, typename AccessorType, typename FunctionType, typename T>
+class SplitFixture : public framework::Fixture
+{
+public:
+    template <typename...>
+    void setup(TensorShape shape, unsigned int axis, unsigned int splits, DataType data_type)
+    {
+        _target    = compute_target(shape, axis, splits, data_type);
+        _reference = compute_reference(shape, axis, splits, data_type);
+    }
+
+protected:
+    template <typename U>
+    void fill(U &&tensor, int i)
+    {
+        library->fill_tensor_uniform(tensor, i);
+    }
+
+    std::vector<TensorType> compute_target(const TensorShape &shape, unsigned int axis, unsigned int splits, DataType data_type)
+    {
+        // Create tensors
+        TensorType                 src = create_tensor<TensorType>(shape, data_type);
+        std::vector<TensorType>    dsts(splits);
+        std::vector<ITensorType *> dsts_ptr;
+        for(auto &dst : dsts)
+        {
+            dsts_ptr.emplace_back(&dst);
+        }
+
+        // Create and configure function
+        FunctionType split;
+        split.configure(&src, dsts_ptr, axis);
+
+        ARM_COMPUTE_EXPECT(src.info()->is_resizable(), framework::LogLevel::ERRORS);
+        ARM_COMPUTE_EXPECT(std::all_of(dsts.cbegin(), dsts.cend(), [](const TensorType & t)
+        {
+            return t.info()->is_resizable();
+        }),
+        framework::LogLevel::ERRORS);
+
+        // Allocate tensors
+        src.allocator()->allocate();
+        for(unsigned int i = 0; i < splits; ++i)
+        {
+            dsts[i].allocator()->allocate();
+        }
+
+        ARM_COMPUTE_EXPECT(!src.info()->is_resizable(), framework::LogLevel::ERRORS);
+        ARM_COMPUTE_EXPECT(std::all_of(dsts.cbegin(), dsts.cend(), [](const TensorType & t)
+        {
+            return !t.info()->is_resizable();
+        }),
+        framework::LogLevel::ERRORS);
+
+        // Fill tensors
+        fill(AccessorType(src), 0);
+
+        // Compute function
+        split.run();
+
+        return dsts;
+    }
+
+    std::vector<SimpleTensor<T>> compute_reference(const TensorShape &shape, unsigned int axis, unsigned int splits, DataType data_type)
+    {
+        // Create reference
+        SimpleTensor<T>              src{ shape, data_type };
+        std::vector<SimpleTensor<T>> dsts;
+
+        // Fill reference
+        fill(src, 0);
+
+        // Calculate splice for each split
+        const size_t axis_split_step = shape[axis] / splits;
+        unsigned int axis_offset     = 0;
+
+        // Start/End coordinates
+        Coordinates start_coords;
+        Coordinates end_coords;
+        for(unsigned int d = 0; d < shape.num_dimensions(); ++d)
+        {
+            end_coords.set(d, -1);
+        }
+
+        for(unsigned int i = 0; i < splits; ++i)
+        {
+            // Update coordinate on axis
+            start_coords.set(axis, axis_offset);
+            end_coords.set(axis, axis_offset + axis_split_step);
+
+            dsts.emplace_back(std::move(reference::slice(src, start_coords, end_coords)));
+
+            axis_offset += axis_split_step;
+        }
+
+        return dsts;
+    }
+
+    std::vector<TensorType>      _target{};
+    std::vector<SimpleTensor<T>> _reference{};
+};
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_SPLIT_FIXTURE */
