diff --git a/tests/datasets/StridedSliceDataset.h b/tests/datasets/SliceOperationsDataset.h
similarity index 65%
rename from tests/datasets/StridedSliceDataset.h
rename to tests/datasets/SliceOperationsDataset.h
index 00f1992..b6df404 100644
--- a/tests/datasets/StridedSliceDataset.h
+++ b/tests/datasets/SliceOperationsDataset.h
@@ -34,6 +34,77 @@
 {
 namespace datasets
 {
+class SliceDataset
+{
+public:
+    using type = std::tuple<TensorShape, Coordinates, Coordinates>;
+
+    struct iterator
+    {
+        iterator(std::vector<TensorShape>::const_iterator tensor_shapes_it,
+                 std::vector<Coordinates>::const_iterator starts_values_it,
+                 std::vector<Coordinates>::const_iterator ends_values_it)
+            : _tensor_shapes_it{ std::move(tensor_shapes_it) },
+              _starts_values_it{ std::move(starts_values_it) },
+              _ends_values_it{ std::move(ends_values_it) }
+        {
+        }
+
+        std::string description() const
+        {
+            std::stringstream description;
+            description << "Shape=" << *_tensor_shapes_it << ":";
+            description << "Starts=" << *_starts_values_it << ":";
+            description << "Ends=" << *_ends_values_it << ":";
+            return description.str();
+        }
+
+        SliceDataset::type operator*() const
+        {
+            return std::make_tuple(*_tensor_shapes_it, *_starts_values_it, *_ends_values_it);
+        }
+
+        iterator &operator++()
+        {
+            ++_tensor_shapes_it;
+            ++_starts_values_it;
+            ++_ends_values_it;
+            return *this;
+        }
+
+    private:
+        std::vector<TensorShape>::const_iterator _tensor_shapes_it;
+        std::vector<Coordinates>::const_iterator _starts_values_it;
+        std::vector<Coordinates>::const_iterator _ends_values_it;
+    };
+
+    iterator begin() const
+    {
+        return iterator(_tensor_shapes.begin(), _starts_values.begin(), _ends_values.begin());
+    }
+
+    int size() const
+    {
+        return std::min(_tensor_shapes.size(), std::min(_starts_values.size(), _ends_values.size()));
+    }
+
+    void add_config(TensorShape shape, Coordinates starts, Coordinates ends)
+    {
+        _tensor_shapes.emplace_back(std::move(shape));
+        _starts_values.emplace_back(std::move(starts));
+        _ends_values.emplace_back(std::move(ends));
+    }
+
+protected:
+    SliceDataset()                = default;
+    SliceDataset(SliceDataset &&) = default;
+
+private:
+    std::vector<TensorShape> _tensor_shapes{};
+    std::vector<Coordinates> _starts_values{};
+    std::vector<Coordinates> _ends_values{};
+};
+
 class StridedSliceDataset
 {
 public:
@@ -140,6 +211,41 @@
     std::vector<int32_t>     _shrink_mask_values{};
 };
 
+class SmallSliceDataset final : public SliceDataset
+{
+public:
+    SmallSliceDataset()
+    {
+        // 1D
+        add_config(TensorShape(15U), Coordinates(4), Coordinates(9));
+        add_config(TensorShape(15U), Coordinates(0), Coordinates(-1));
+        // 2D
+        add_config(TensorShape(15U, 16U), Coordinates(0, 1), Coordinates(5, -1));
+        add_config(TensorShape(15U, 16U), Coordinates(4, 1), Coordinates(12, -1));
+        // 3D
+        add_config(TensorShape(15U, 16U, 4U), Coordinates(0, 1, 2), Coordinates(5, -1, 4));
+        add_config(TensorShape(15U, 16U, 4U), Coordinates(0, 1, 2), Coordinates(5, -1, 4));
+        // 4D
+        add_config(TensorShape(15U, 16U, 4U, 12U), Coordinates(0, 1, 2, 2), Coordinates(5, -1, 4, 5));
+    }
+};
+
+class LargeSliceDataset final : public SliceDataset
+{
+public:
+    LargeSliceDataset()
+    {
+        // 1D
+        add_config(TensorShape(1025U), Coordinates(128), Coordinates(-100));
+        // 2D
+        add_config(TensorShape(372U, 68U), Coordinates(128, 7), Coordinates(368, -1));
+        // 3D
+        add_config(TensorShape(372U, 68U, 12U), Coordinates(128, 7, 2), Coordinates(368, -1, 4));
+        // 4D
+        add_config(TensorShape(372U, 68U, 7U, 4U), Coordinates(128, 7, 2), Coordinates(368, 17, 5));
+    }
+};
+
 class SmallStridedSliceDataset final : public StridedSliceDataset
 {
 public:
@@ -167,14 +273,13 @@
         // 1D
         add_config(TensorShape(1025U), Coordinates(128), Coordinates(-100), BiStrides(20));
         // 2D
-        add_config(TensorShape(372U, 68U), Coordinates(128U, 7U), Coordinates(368U, -30), BiStrides(10, 7));
+        add_config(TensorShape(372U, 68U), Coordinates(128, 7), Coordinates(368, -30), BiStrides(10, 7));
         // 3D
-        add_config(TensorShape(372U, 68U, 12U), Coordinates(128U, 7U, -1), Coordinates(368U, -30, -5), BiStrides(14, 7, -2));
+        add_config(TensorShape(372U, 68U, 12U), Coordinates(128, 7, -1), Coordinates(368, -30, -5), BiStrides(14, 7, -2));
         // 4D
-        add_config(TensorShape(372U, 68U, 7U, 4U), Coordinates(128U, 7U, 2U), Coordinates(368U, -30, 5U), BiStrides(20, 7, 2), 1, 1);
+        add_config(TensorShape(372U, 68U, 7U, 4U), Coordinates(128, 7, 2), Coordinates(368, -30, 5), BiStrides(20, 7, 2), 1, 1);
     }
 };
-
 } // namespace datasets
 } // namespace test
 } // namespace arm_compute
diff --git a/tests/validation/CL/Slice.cpp b/tests/validation/CL/Slice.cpp
new file mode 100644
index 0000000..91c2e90
--- /dev/null
+++ b/tests/validation/CL/Slice.cpp
@@ -0,0 +1,133 @@
+/*
+ * 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/CLSlice.h"
+
+#include "tests/CL/CLAccessor.h"
+#include "tests/datasets/SliceOperationsDataset.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/SliceOperationsFixtures.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+TEST_SUITE(CL)
+TEST_SUITE(Slice)
+
+// *INDENT-OFF*
+// clang-format off
+DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
+        framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 3U, 2U, 5U, 3U), 1, DataType::F32), // Invalid input shape
+                                                TensorInfo(TensorShape(27U, 3U, 2U), 1, DataType::F32),         // Negative begin
+                                                TensorInfo(TensorShape(27U, 3U, 2U), 1, DataType::F32),         // Big number of coordinates
+                                                TensorInfo(TensorShape(27U, 3U, 2U), 1, DataType::F32)
+        }),
+        framework::dataset::make("Starts", { Coordinates(3, 1, 0), Coordinates(-3, 1, 0), Coordinates(3, 1, 0), Coordinates(3, 1, 0) })),
+        framework::dataset::make("Ends", { Coordinates(13, 3, 0),  Coordinates(13, 3, 1), Coordinates(13, 3, 1, 1), Coordinates(13, 3, 1) })),
+        framework::dataset::make("Expected", { false, false, false, true })),
+        input_info, starts, ends, expected)
+{
+    TensorInfo output_info;
+    const Status status = CLSlice::validate(&input_info.clone()->set_is_resizable(false), &output_info, starts, ends);
+    ARM_COMPUTE_EXPECT(bool(status) == expected, framework::LogLevel::ERRORS);
+}
+// clang-format on
+// *INDENT-ON*
+
+DATA_TEST_CASE(Configuration,
+               framework::DatasetMode::ALL,
+               combine(arm_compute::test::datasets::SmallSliceDataset(), framework::dataset::make("DataType", { DataType::F16, DataType::F32 })),
+               shape, starts, ends, data_type)
+{
+    // Create tensors
+    CLTensor src = create_tensor<CLTensor>(shape, data_type);
+    CLTensor dst;
+
+    // Create and Configure function
+    CLSlice slice;
+    slice.configure(&src, &dst, starts, ends);
+
+    // Validate valid region
+    const ValidRegion valid_region = shape_to_valid_region(dst.info()->tensor_shape());
+    validate(dst.info()->valid_region(), valid_region);
+}
+
+template <typename T>
+using CLSliceFixture = SliceFixture<CLTensor, CLAccessor, CLSlice, T>;
+
+TEST_SUITE(Float)
+TEST_SUITE(FP16)
+FIXTURE_DATA_TEST_CASE(RunSmall,
+                       CLSliceFixture<half>,
+                       framework::DatasetMode::PRECOMMIT,
+                       combine(datasets::SmallSliceDataset(), framework::dataset::make("DataType", DataType::F16)))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference);
+}
+
+FIXTURE_DATA_TEST_CASE(RunLarge,
+                       CLSliceFixture<half>,
+                       framework::DatasetMode::NIGHTLY,
+                       combine(datasets::LargeSliceDataset(), framework::dataset::make("DataType", DataType::F16)))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference);
+}
+TEST_SUITE_END() // FP16
+
+TEST_SUITE(FP32)
+FIXTURE_DATA_TEST_CASE(RunSmall,
+                       CLSliceFixture<float>,
+                       framework::DatasetMode::PRECOMMIT,
+                       combine(datasets::SmallSliceDataset(), framework::dataset::make("DataType", DataType::F32)))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference);
+}
+
+FIXTURE_DATA_TEST_CASE(RunLarge,
+                       CLSliceFixture<float>,
+                       framework::DatasetMode::NIGHTLY,
+                       combine(datasets::LargeSliceDataset(), framework::dataset::make("DataType", DataType::F32)))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference);
+}
+TEST_SUITE_END() // FP32
+TEST_SUITE_END() // Float
+
+TEST_SUITE_END() // Slice
+TEST_SUITE_END() // CL
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/validation/CL/StridedSlice.cpp b/tests/validation/CL/StridedSlice.cpp
index 824f7b1..00eee16 100644
--- a/tests/validation/CL/StridedSlice.cpp
+++ b/tests/validation/CL/StridedSlice.cpp
@@ -28,12 +28,12 @@
 
 #include "tests/CL/CLAccessor.h"
 #include "tests/PaddingCalculator.h"
-#include "tests/datasets/StridedSliceDataset.h"
+#include "tests/datasets/SliceOperationsDataset.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/StridedSliceFixture.h"
+#include "tests/validation/fixtures/SliceOperationsFixtures.h"
 
 namespace arm_compute
 {
diff --git a/tests/validation/fixtures/StridedSliceFixture.h b/tests/validation/fixtures/SliceOperationsFixtures.h
similarity index 68%
rename from tests/validation/fixtures/StridedSliceFixture.h
rename to tests/validation/fixtures/SliceOperationsFixtures.h
index 26442ad..018bafb 100644
--- a/tests/validation/fixtures/StridedSliceFixture.h
+++ b/tests/validation/fixtures/SliceOperationsFixtures.h
@@ -34,7 +34,7 @@
 #include "tests/framework/Asserts.h"
 #include "tests/framework/Fixture.h"
 #include "tests/validation/Helpers.h"
-#include "tests/validation/reference/StridedSlice.h"
+#include "tests/validation/reference/SliceOperations.h"
 
 namespace arm_compute
 {
@@ -43,6 +43,69 @@
 namespace validation
 {
 template <typename TensorType, typename AccessorType, typename FunctionType, typename T>
+class SliceFixture : public framework::Fixture
+{
+public:
+    template <typename...>
+    void setup(TensorShape shape, Coordinates starts, Coordinates ends, DataType data_type)
+    {
+        _target    = compute_target(shape, starts, ends, data_type);
+        _reference = compute_reference(shape, starts, ends, data_type);
+    }
+
+protected:
+    template <typename U>
+    void fill(U &&tensor, int i)
+    {
+        library->fill_tensor_uniform(tensor, i);
+    }
+
+    TensorType compute_target(const TensorShape &shape, const Coordinates &starts, const Coordinates &ends, DataType data_type)
+    {
+        // Create tensors
+        TensorType src = create_tensor<TensorType>(shape, data_type);
+        TensorType dst;
+
+        // Create and configure function
+        FunctionType slice;
+        slice.configure(&src, &dst, starts, ends);
+
+        ARM_COMPUTE_EXPECT(src.info()->is_resizable(), framework::LogLevel::ERRORS);
+        ARM_COMPUTE_EXPECT(dst.info()->is_resizable(), framework::LogLevel::ERRORS);
+
+        // Allocate tensors
+        src.allocator()->allocate();
+        dst.allocator()->allocate();
+
+        ARM_COMPUTE_EXPECT(!src.info()->is_resizable(), framework::LogLevel::ERRORS);
+        ARM_COMPUTE_EXPECT(!dst.info()->is_resizable(), framework::LogLevel::ERRORS);
+
+        // Fill tensors
+        fill(AccessorType(src), 0);
+        fill(AccessorType(dst), 1);
+
+        // Compute function
+        slice.run();
+
+        return dst;
+    }
+
+    SimpleTensor<T> compute_reference(const TensorShape &shape, const Coordinates &starts, const Coordinates &ends, DataType data_type)
+    {
+        // Create reference
+        SimpleTensor<T> src{ shape, data_type };
+
+        // Fill reference
+        fill(src, 0);
+
+        return reference::slice(src, starts, ends);
+    }
+
+    TensorType      _target{};
+    SimpleTensor<T> _reference{};
+};
+
+template <typename TensorType, typename AccessorType, typename FunctionType, typename T>
 class StridedSliceFixture : public framework::Fixture
 {
 public:
diff --git a/tests/validation/reference/StridedSlice.cpp b/tests/validation/reference/SliceOperations.cpp
similarity index 68%
rename from tests/validation/reference/StridedSlice.cpp
rename to tests/validation/reference/SliceOperations.cpp
index ac02ce1..04b5b98 100644
--- a/tests/validation/reference/StridedSlice.cpp
+++ b/tests/validation/reference/SliceOperations.cpp
@@ -21,7 +21,7 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "StridedSlice.h"
+#include "SliceOperations.h"
 
 #include "arm_compute/core/utils/helpers/tensor_transform.h"
 
@@ -34,6 +34,51 @@
 namespace reference
 {
 template <typename T>
+SimpleTensor<T> slice(const SimpleTensor<T> &src, Coordinates starts, Coordinates ends)
+{
+    using namespace arm_compute::helpers::tensor_transform;
+
+    // Validation checks
+    ARM_COMPUTE_ERROR_ON(src.shape().num_dimensions() > 4);
+    ARM_COMPUTE_ERROR_ON(starts.num_dimensions() > src.shape().num_dimensions());
+    ARM_COMPUTE_ERROR_ON(std::any_of(starts.cbegin(), starts.cbegin() + starts.num_dimensions(), [](int i)
+    {
+        return i < 0;
+    }));
+    ARM_COMPUTE_ERROR_ON(ends.num_dimensions() > src.shape().num_dimensions());
+
+    // Get source shape
+    const TensorShape &src_shape = src.shape();
+
+    // Get actual end
+    Coordinates ends_abs = slice_absolute_end_coords(src_shape, ends);
+
+    // Get destination shape
+    TensorShape dst_shape = compute_slice_output_shape(src_shape, starts, ends_abs);
+
+    // Create destination tensor
+    SimpleTensor<T> dst{ dst_shape, src.data_type(), 1 };
+
+    // Perform slice
+    Window win;
+    win.use_tensor_dimensions(dst_shape);
+    execute_window_loop(win, [&](const Coordinates & id)
+    {
+        Coordinates offset;
+        for(unsigned int i = 0; i < id.num_dimensions(); ++i)
+        {
+            offset.set(i, starts[i] + id[i]);
+        }
+        *reinterpret_cast<T *>(dst(id)) = *reinterpret_cast<const T *>(src(offset));
+    });
+
+    return dst;
+}
+
+template SimpleTensor<float> slice(const SimpleTensor<float> &src, Coordinates starts, Coordinates ends);
+template SimpleTensor<half_float::half> slice(const SimpleTensor<half_float::half> &src, Coordinates starts, Coordinates ends);
+
+template <typename T>
 SimpleTensor<T> strided_slice(const SimpleTensor<T> &src,
                               Coordinates starts, Coordinates ends, BiStrides strides,
                               int32_t begin_mask, int32_t end_mask, int32_t shrink_axis_mask)
@@ -45,10 +90,10 @@
     ARM_COMPUTE_ERROR_ON(starts.num_dimensions() > src.shape().num_dimensions());
     ARM_COMPUTE_ERROR_ON(ends.num_dimensions() > src.shape().num_dimensions());
     ARM_COMPUTE_ERROR_ON(strides.num_dimensions() > src.shape().num_dimensions());
-    for(unsigned int i = 0; i < strides.num_dimensions(); ++i)
+    ARM_COMPUTE_ERROR_ON(std::any_of(strides.cbegin(), strides.cbegin() + strides.num_dimensions(), [](int i)
     {
-        ARM_COMPUTE_ERROR_ON(strides[i] == 0);
-    }
+        return i == 0;
+    }));
 
     // Get source shape
     const TensorShape &src_shape = src.shape();
diff --git a/tests/validation/reference/StridedSlice.h b/tests/validation/reference/SliceOperations.h
similarity index 85%
rename from tests/validation/reference/StridedSlice.h
rename to tests/validation/reference/SliceOperations.h
index 805b7e6..89fe203 100644
--- a/tests/validation/reference/StridedSlice.h
+++ b/tests/validation/reference/SliceOperations.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_H__
-#define __ARM_COMPUTE_TEST_STRIDED_SLICE_H__
+#ifndef __ARM_COMPUTE_TEST_SLICE_OPERATIONS_H__
+#define __ARM_COMPUTE_TEST_SLICE_OPERATIONS_H__
 
 #include "tests/SimpleTensor.h"
 
@@ -35,6 +35,9 @@
 namespace reference
 {
 template <typename T>
+SimpleTensor<T> slice(const SimpleTensor<T> &src, Coordinates starts, Coordinates ends);
+
+template <typename T>
 SimpleTensor<T> strided_slice(const SimpleTensor<T> &src,
                               Coordinates starts, Coordinates ends, BiStrides strides,
                               int32_t begin_mask, int32_t end_mask, int32_t shrink_axis_mask);
@@ -42,4 +45,4 @@
 } // namespace validation
 } // namespace test
 } // namespace arm_compute
-#endif /* __ARM_COMPUTE_TEST_STRIDED_SLICE_H__ */
+#endif /* __ARM_COMPUTE_TEST_SLICE_OPERATIONS_H__ */
