diff --git a/arm_compute/runtime/CL/functions/CLSplit.h b/arm_compute/runtime/CL/functions/CLSplit.h
index 7e22f52..87265a4 100644
--- a/arm_compute/runtime/CL/functions/CLSplit.h
+++ b/arm_compute/runtime/CL/functions/CLSplit.h
@@ -24,9 +24,11 @@
 #ifndef ARM_COMPUTE_CLSPLIT_H
 #define ARM_COMPUTE_CLSPLIT_H
 
+#include "arm_compute/core/CL/ICLTensor.h"
 #include "arm_compute/core/Types.h"
 
 #include "arm_compute/runtime/CL/functions/CLSlice.h"
+#include "arm_compute/runtime/CPP/functions/CPPSplit.h"
 #include "arm_compute/runtime/IFunction.h"
 
 #include <memory>
@@ -34,43 +36,12 @@
 
 namespace arm_compute
 {
-// Forward declarations
-class ICLTensor;
-
 /** Basic function to split a tensor along a given axis */
-class CLSplit : public IFunction
+class CLSplit : public CPPSplit<CLSlice, ICLTensor>
 {
 public:
-    /** Default constructor */
-    CLSplit();
-    /** Initialise the kernel's input and outputs.
-     *
-     * @param[in]  input   The input tensor. Data types supported: All.
-     * @param[out] outputs A vector containing the output tensors. Data types supported: Same as @p input.
-     *                     The output tensors should match the input tensor dimensions for all shape dimensions apart
-     *                     from the split dimension.
-     * @param[in]  axis    Axis on which to split the input.
-     */
-    void configure(const ICLTensor *input, const std::vector<ICLTensor *> &outputs, unsigned int axis);
-    /** Static function to check if given info will lead to a valid configuration of @ref CLSplit
-     *
-     * @param[in] input   The input tensor info. Data types supported: All.
-     * @param[in] outputs A vector containing the output tensors' info. Data types supported: Same as @p input.
-     *                    The output tensors should match the input tensor dimensions for all shape dimensions apart
-     *                    from the split dimension
-     * @param[in] axis    Axis on which to split the input.
-     *
-     * @return a status
-     */
-    static Status validate(const ITensorInfo *input, const std::vector<ITensorInfo *> &outputs, unsigned int axis);
-
     // Inherited methods overridden:
     void run() override;
-
-private:
-    std::vector<ICLTensor *> _outputs_vector;
-    std::vector<CLSlice>     _slice_functions;
-    unsigned int             _num_outputs;
 };
 } // namespace arm_compute
 #endif /* ARM_COMPUTE_CLSPLIT_H */
diff --git a/arm_compute/runtime/CPP/CPPFunctions.h b/arm_compute/runtime/CPP/CPPFunctions.h
index b78436c..c196381 100644
--- a/arm_compute/runtime/CPP/CPPFunctions.h
+++ b/arm_compute/runtime/CPP/CPPFunctions.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2019 ARM Limited.
+ * Copyright (c) 2017-2020 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -30,6 +30,7 @@
 #include "arm_compute/runtime/CPP/functions/CPPDetectionPostProcessLayer.h"
 #include "arm_compute/runtime/CPP/functions/CPPNonMaximumSuppression.h"
 #include "arm_compute/runtime/CPP/functions/CPPPermute.h"
+#include "arm_compute/runtime/CPP/functions/CPPSplit.h"
 #include "arm_compute/runtime/CPP/functions/CPPTopKV.h"
 #include "arm_compute/runtime/CPP/functions/CPPUpsample.h"
 
diff --git a/arm_compute/runtime/CPP/functions/CPPSplit.h b/arm_compute/runtime/CPP/functions/CPPSplit.h
new file mode 100644
index 0000000..6adcbc3
--- /dev/null
+++ b/arm_compute/runtime/CPP/functions/CPPSplit.h
@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 2020 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_CPP_SPLIT_H
+#define ARM_COMPUTE_CPP_SPLIT_H
+
+#include "arm_compute/core/Error.h"
+#include "arm_compute/core/Helpers.h"
+#include "arm_compute/core/TensorInfo.h"
+#include "arm_compute/core/Types.h"
+#include "arm_compute/core/utils/misc/ShapeCalculator.h"
+
+#include "support/ToolchainSupport.h"
+
+#include "arm_compute/runtime/IFunction.h"
+
+namespace arm_compute
+{
+/** Basic function to split a tensor along a given axis */
+template <typename SliceType, typename TensorInterfaceType = ITensor>
+class CPPSplit : public IFunction
+{
+public:
+    CPPSplit()
+        : _outputs_vector(), _slice_functions(), _num_outputs(0)
+    {
+    }
+    /** Static function to check if given info will lead to a valid configuration of @ref CPPSplit
+     *
+     * @param[in] input   The input tensor info. Data types supported: U8/S8/QASYMM8/U16/S16/U32/S32/F16/F32.
+     * @param[in] outputs A vector containing the output tensors' info. Data types supported: Same as @p input.
+     *                    The output tensors should match the input tensor dimensions for all shape dimensions apart
+     *                    from the split dimension
+     * @param[in] axis    Axis on which to split the input.
+     *
+     * @return a status
+     */
+    static Status validate(const ITensorInfo *input, const std::vector<ITensorInfo *> &outputs, unsigned int axis)
+    {
+        ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(input);
+        ARM_COMPUTE_RETURN_ERROR_ON(axis >= input->num_dimensions());
+        ARM_COMPUTE_RETURN_ERROR_ON(outputs.size() < 2);
+
+        // Get output shape
+        TensorShape  output_shape{};
+        unsigned int total_output_shape_size = 0;
+
+        // Sum the output sizes and fall back to evenly-sized splits if any are zero
+        const bool using_split_shapes = std::none_of(outputs.begin(), outputs.end(), [&total_output_shape_size](ITensorInfo * info)
+        {
+            unsigned int output_shape_size = info->tensor_shape().total_size();
+            total_output_shape_size += output_shape_size;
+            return output_shape_size == 0;
+        });
+
+        if(using_split_shapes)
+        {
+            ARM_COMPUTE_RETURN_ERROR_ON(input->tensor_shape().total_size() != total_output_shape_size);
+        }
+        else
+        {
+            output_shape = arm_compute::misc::shape_calculator::compute_split_shape(input, axis, outputs.size());
+            ARM_COMPUTE_RETURN_ERROR_ON(output_shape.total_size() == 0);
+        }
+
+        // Validate output tensors
+        unsigned int axis_offset = 0;
+        for(const auto &output : outputs)
+        {
+            ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(output);
+            if(using_split_shapes)
+            {
+                output_shape = output->tensor_shape();
+                ARM_COMPUTE_RETURN_ERROR_ON(output_shape.total_size() == 0);
+            }
+
+            const size_t axis_split_step = output_shape[axis];
+
+            // Start/End coordinates
+            Coordinates start_coords;
+            Coordinates end_coords;
+            for(unsigned int d = 0; d < output_shape.num_dimensions(); ++d)
+            {
+                end_coords.set(d, -1);
+            }
+
+            // Output auto inizialitation if not yet initialized
+            TensorInfo tmp_output_info = *output->clone();
+            auto_init_if_empty(tmp_output_info, input->clone()->set_is_resizable(true).set_tensor_shape(output_shape));
+
+            // Update coordinate on axis
+            start_coords.set(axis, axis_offset);
+            end_coords.set(axis, axis_offset + axis_split_step);
+
+            ARM_COMPUTE_RETURN_ON_ERROR(SliceType::validate(input, output, start_coords, end_coords));
+            axis_offset += axis_split_step;
+        }
+
+        return Status{};
+    }
+
+    /** Initialise the kernel's input and outputs.
+     *
+     * @param[in]  input   The input tensor. Data types supported: All
+     * @param[out] outputs A vector containing the output tensors. Data types supported: Same as @p input.
+     *                     The output tensors should match the input tensor dimensions for all shape dimensions apart
+     *                     from the split dimension.
+     * @param[in]  axis    Axis on which to split the input.
+     */
+    void configure(const TensorInterfaceType *input, const std::vector<TensorInterfaceType *> &outputs, unsigned int axis)
+    {
+        // Create Slice functions
+        _num_outputs = outputs.size();
+        _slice_functions.resize(_num_outputs);
+
+        // Extract output tensor info
+        std::vector<ITensorInfo *> outputs_info;
+        for(auto &output : outputs)
+        {
+            ARM_COMPUTE_ERROR_ON_NULLPTR(output);
+            outputs_info.emplace_back(output->info());
+        }
+
+        // If any of the outputs have a zero size, fall-back to using evenly-sized output splits
+        const bool outputs_have_sizes = std::none_of(outputs_info.begin(), outputs_info.end(), [](ITensorInfo * info)
+        {
+            return info->tensor_shape().total_size() == 0;
+        });
+
+        // Validate
+        ARM_COMPUTE_ERROR_THROW_ON(CPPSplit::validate(input->info(), outputs_info, axis));
+
+        unsigned int axis_offset = 0;
+        unsigned int i           = 0;
+
+        for(const auto &output_info : outputs_info)
+        {
+            // Get output shape
+            TensorShape output_shape = (outputs_have_sizes ?
+                                        output_info->tensor_shape() :
+                                        arm_compute::misc::shape_calculator::compute_split_shape(input->info(), axis, _num_outputs));
+
+            const size_t axis_split_step = output_shape[axis];
+
+            // Start/End coordinates
+            Coordinates start_coords;
+            Coordinates end_coords;
+
+            for(unsigned int d = 0; d < output_shape.num_dimensions(); ++d)
+            {
+                end_coords.set(d, -1);
+            }
+
+            // Update coordinate on axis
+            start_coords.set(axis, axis_offset);
+            end_coords.set(axis, axis_offset + axis_split_step);
+
+            // Configure slice function
+            _slice_functions[i].configure(input, outputs[i], start_coords, end_coords);
+
+            // Set valid region from shape
+            outputs[i]->info()->set_valid_region(ValidRegion(Coordinates(), output_shape));
+
+            // Update axis offset
+            axis_offset += axis_split_step;
+            ++i;
+        }
+    }
+
+protected:
+    std::vector<TensorInterfaceType *> _outputs_vector;
+    std::vector<SliceType>             _slice_functions;
+    unsigned int                       _num_outputs;
+};
+
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_CPP_SPLIT_H */
diff --git a/src/runtime/CL/functions/CLSplit.cpp b/src/runtime/CL/functions/CLSplit.cpp
index 8d37d53..9fca52b 100644
--- a/src/runtime/CL/functions/CLSplit.cpp
+++ b/src/runtime/CL/functions/CLSplit.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2019 ARM Limited.
+ * Copyright (c) 2018-2020 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -34,100 +34,6 @@
 
 namespace arm_compute
 {
-CLSplit::CLSplit()
-    : _outputs_vector(), _slice_functions(), _num_outputs(0)
-{
-}
-
-void CLSplit::configure(const ICLTensor *input, const std::vector<ICLTensor *> &outputs, unsigned int axis)
-{
-    // Create Slice functions
-    _num_outputs = outputs.size();
-    _slice_functions.resize(_num_outputs);
-
-    // Get output shape
-    const TensorShape output_shape = arm_compute::misc::shape_calculator::compute_split_shape(input->info(), axis, _num_outputs);
-
-    // Extract output tensor info
-    std::vector<ITensorInfo *> outputs_info;
-    for(auto &output : outputs)
-    {
-        ARM_COMPUTE_ERROR_ON_NULLPTR(output);
-        outputs_info.emplace_back(output->info());
-    }
-
-    // Validate
-    ARM_COMPUTE_ERROR_THROW_ON(CLSplit::validate(input->info(), outputs_info, axis));
-
-    const size_t axis_split_step = output_shape[axis];
-    unsigned int axis_offset     = 0;
-
-    // Start/End coordinates
-    Coordinates start_coords;
-    Coordinates end_coords;
-    for(unsigned int d = 0; d < output_shape.num_dimensions(); ++d)
-    {
-        end_coords.set(d, -1);
-    }
-
-    for(unsigned int i = 0; i < _num_outputs; i++)
-    {
-        // Update coordinate on axis
-        start_coords.set(axis, axis_offset);
-        end_coords.set(axis, axis_offset + axis_split_step);
-
-        // Configure slice function
-        _slice_functions[i].configure(input, outputs[i], start_coords, end_coords);
-
-        // Set valid region from shape
-        outputs[i]->info()->set_valid_region(ValidRegion(Coordinates(), output_shape));
-
-        // Update axis offset
-        axis_offset += axis_split_step;
-    }
-}
-
-Status CLSplit::validate(const ITensorInfo *input, const std::vector<ITensorInfo *> &outputs, unsigned int axis)
-{
-    ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(input);
-    ARM_COMPUTE_RETURN_ERROR_ON(axis >= input->num_dimensions());
-    ARM_COMPUTE_RETURN_ERROR_ON(outputs.size() < 2);
-
-    // Get output shape
-    const TensorShape output_shape = arm_compute::misc::shape_calculator::compute_split_shape(input, axis, outputs.size());
-    ARM_COMPUTE_RETURN_ERROR_ON(output_shape.total_size() == 0);
-
-    const size_t axis_split_step = output_shape[axis];
-    unsigned int axis_offset     = 0;
-
-    // Start/End coordinates
-    Coordinates start_coords;
-    Coordinates end_coords;
-    for(unsigned int d = 0; d < output_shape.num_dimensions(); ++d)
-    {
-        end_coords.set(d, -1);
-    }
-
-    // Validate output tensors
-    for(const auto &output : outputs)
-    {
-        ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(output);
-
-        // Output auto inizialitation if not yet initialized
-        TensorInfo tmp_output_info = *output->clone();
-        auto_init_if_empty(tmp_output_info, input->clone()->set_is_resizable(true).set_tensor_shape(output_shape));
-
-        // Update coordinate on axis
-        start_coords.set(axis, axis_offset);
-        end_coords.set(axis, axis_offset + axis_split_step);
-
-        ARM_COMPUTE_RETURN_ON_ERROR(CLSlice::validate(input, output, start_coords, end_coords));
-        axis_offset += axis_split_step;
-    }
-
-    return Status{};
-}
-
 void CLSplit::run()
 {
     cl::CommandQueue q = CLScheduler::get().queue();
diff --git a/tests/datasets/SplitDataset.h b/tests/datasets/SplitDataset.h
index b38252a..3d4c289 100644
--- a/tests/datasets/SplitDataset.h
+++ b/tests/datasets/SplitDataset.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018 ARM Limited.
+ * Copyright (c) 2018-2020 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -128,6 +128,90 @@
         add_config(TensorShape(128U, 64U, 32U, 4U), 3U, 4U);
     }
 };
+
+class SplitShapesDataset
+{
+public:
+    using type = std::tuple<TensorShape, unsigned int, std::vector<TensorShape>>;
+
+    struct iterator
+    {
+        iterator(std::vector<TensorShape>::const_iterator              tensor_shapes_it,
+                 std::vector<unsigned int>::const_iterator             axis_values_it,
+                 std::vector<std::vector<TensorShape>>::const_iterator split_shapes_values_it)
+            : _tensor_shapes_it{ std::move(tensor_shapes_it) },
+              _axis_values_it{ std::move(axis_values_it) },
+              _split_shapes_values_it{ std::move(split_shapes_values_it) }
+        {
+        }
+
+        std::string description() const
+        {
+            std::stringstream description;
+            description << "Shape=" << *_tensor_shapes_it << ":";
+            description << "Axis=" << *_axis_values_it << ":";
+            description << "Split shapes=" << *_split_shapes_values_it << ":";
+            return description.str();
+        }
+
+        SplitShapesDataset::type operator*() const
+        {
+            return std::make_tuple(*_tensor_shapes_it, *_axis_values_it, *_split_shapes_values_it);
+        }
+
+        iterator &operator++()
+        {
+            ++_tensor_shapes_it;
+            ++_axis_values_it;
+            ++_split_shapes_values_it;
+            return *this;
+        }
+
+    private:
+        std::vector<TensorShape>::const_iterator              _tensor_shapes_it;
+        std::vector<unsigned int>::const_iterator             _axis_values_it;
+        std::vector<std::vector<TensorShape>>::const_iterator _split_shapes_values_it;
+    };
+
+    iterator begin() const
+    {
+        return iterator(_tensor_shapes.begin(), _axis_values.begin(), _split_shapes_values.begin());
+    }
+
+    int size() const
+    {
+        return std::min(_tensor_shapes.size(), std::min(_axis_values.size(), _split_shapes_values.size()));
+    }
+
+    void add_config(TensorShape shape, unsigned int axis, std::vector<TensorShape> split_shapes)
+    {
+        _tensor_shapes.emplace_back(std::move(shape));
+        _axis_values.emplace_back(axis);
+        _split_shapes_values.emplace_back(split_shapes);
+    }
+
+protected:
+    SplitShapesDataset()                      = default;
+    SplitShapesDataset(SplitShapesDataset &&) = default;
+
+private:
+    std::vector<TensorShape>              _tensor_shapes{};
+    std::vector<unsigned int>             _axis_values{};
+    std::vector<std::vector<TensorShape>> _split_shapes_values{};
+};
+
+class SmallSplitShapesDataset final : public SplitShapesDataset
+{
+public:
+    SmallSplitShapesDataset()
+    {
+        add_config(TensorShape(27U, 3U, 16U, 2U), 2U, std::vector<TensorShape> { TensorShape(27U, 3U, 4U, 2U),
+                                                                                 TensorShape(27U, 3U, 4U, 2U),
+                                                                                 TensorShape(27U, 3U, 8U, 2U)
+                                                                               });
+    }
+};
+
 } // namespace datasets
 } // namespace test
 } // namespace arm_compute
diff --git a/tests/validation/CL/Split.cpp b/tests/validation/CL/Split.cpp
index e038b89..8f55b42 100644
--- a/tests/validation/CL/Split.cpp
+++ b/tests/validation/CL/Split.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2019 ARM Limited.
+ * Copyright (c) 2018-2020 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -65,6 +65,29 @@
     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);
 }
+
+DATA_TEST_CASE(ValidateSplitShapes, framework::DatasetMode::ALL, zip(zip(zip(
+        framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 3U, 16U, 2U), 1, DataType::F32),
+                                                TensorInfo(TensorShape(27U, 3U, 16U, 2U), 1, DataType::F32)
+        }),
+        framework::dataset::make("Axis", { 2, 2 })),
+        framework::dataset::make("Splits", { std::vector<TensorInfo>{TensorInfo(TensorShape(27U, 3U, 4U,  2U), 1, DataType::F32),
+                                                                     TensorInfo(TensorShape(27U, 3U, 4U,  2U), 1, DataType::F32),
+                                                                     TensorInfo(TensorShape(27U, 3U, 8U,  2U), 1, DataType::F32)},
+                                             std::vector<TensorInfo>{TensorInfo(TensorShape(27U, 3U, 3U,  2U), 1, DataType::F32),
+                                                                     TensorInfo(TensorShape(27U, 3U, 13U, 2U), 1, DataType::F32)} })),
+        framework::dataset::make("Expected", { true, true })),
+        input_info, axis, splits, expected)
+{
+    std::vector<ITensorInfo*> outputs_info_ptr;
+
+    for(auto &split : splits)
+    {
+        outputs_info_ptr.emplace_back(const_cast<TensorInfo*>(&split));
+    }
+    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*
 
@@ -95,9 +118,45 @@
     }
 }
 
+DATA_TEST_CASE(ConfigurationSplitShapes,
+               framework::DatasetMode::ALL,
+               combine(datasets::SmallSplitShapesDataset(), framework::dataset::make("DataType", { DataType::F16, DataType::F32 })),
+               shape, axis, split_shapes, data_type)
+{
+    // Create tensors
+    CLTensor              src = create_tensor<CLTensor>(shape, data_type);
+    std::vector<CLTensor> dsts;
+
+    for(const auto &split_shape : split_shapes)
+    {
+        CLTensor dst = create_tensor<CLTensor>(split_shape, data_type);
+        dsts.push_back(std::move(dst));
+    }
+
+    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>;
 
+template <typename T>
+using CLSplitShapesFixture = SplitShapesFixture<CLTensor, ICLTensor, CLAccessor, CLSplit, T>;
+
 TEST_SUITE(Float)
 TEST_SUITE(FP16)
 FIXTURE_DATA_TEST_CASE(RunSmall,
@@ -149,6 +208,18 @@
         validate(CLAccessor(_target[i]), _reference[i]);
     }
 }
+
+FIXTURE_DATA_TEST_CASE(RunSmallSplitShapes,
+                       CLSplitShapesFixture<float>,
+                       framework::DatasetMode::PRECOMMIT,
+                       combine(datasets::SmallSplitShapesDataset(), 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
 
diff --git a/tests/validation/fixtures/SplitFixture.h b/tests/validation/fixtures/SplitFixture.h
index 0750177..d2336ab 100644
--- a/tests/validation/fixtures/SplitFixture.h
+++ b/tests/validation/fixtures/SplitFixture.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018 ARM Limited.
+ * Copyright (c) 2018-2020 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -145,6 +145,115 @@
     std::vector<TensorType>      _target{};
     std::vector<SimpleTensor<T>> _reference{};
 };
+
+template <typename TensorType, typename ITensorType, typename AccessorType, typename FunctionType, typename T>
+class SplitShapesFixture : public framework::Fixture
+{
+public:
+    template <typename...>
+    void setup(TensorShape shape, unsigned int axis, std::vector<TensorShape> split_shapes, DataType data_type)
+    {
+        _target    = compute_target(shape, axis, split_shapes, data_type);
+        _reference = compute_reference(shape, axis, split_shapes, data_type);
+    }
+
+protected:
+    template <typename U>
+    void fill(U &&tensor, int i)
+    {
+        library->fill_tensor_uniform(tensor, i);
+    }
+
+    std::vector<TensorType> compute_target(TensorShape shape, unsigned int axis, std::vector<TensorShape> split_shapes, DataType data_type)
+    {
+        // Create tensors
+        TensorType                 src = create_tensor<TensorType>(shape, data_type);
+        std::vector<TensorType>    dsts{};
+        std::vector<ITensorType *> dsts_ptr;
+
+        for(const auto &split_shape : split_shapes)
+        {
+            TensorType dst = create_tensor<TensorType>(split_shape, data_type);
+            dsts.push_back(std::move(dst));
+        }
+
+        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 < dsts.size(); ++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(TensorShape shape, unsigned int axis, std::vector<TensorShape> split_shapes, DataType data_type)
+    {
+        // Create reference
+        SimpleTensor<T>              src{ shape, data_type };
+        std::vector<SimpleTensor<T>> dsts;
+
+        // Fill reference
+        fill(src, 0);
+
+        unsigned int axis_offset{ 0 };
+        for(const auto &split_shape : split_shapes)
+        {
+            // Calculate splice for each split
+            const size_t axis_split_step = split_shape[axis];
+
+            // Start/End coordinates
+            Coordinates start_coords;
+            Coordinates end_coords;
+            for(unsigned int d = 0; d < shape.num_dimensions(); ++d)
+            {
+                end_coords.set(d, -1);
+            }
+
+            // 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
