diff --git a/tests/datasets/StridedSliceDataset.h b/tests/datasets/StridedSliceDataset.h
new file mode 100644
index 0000000..00f1992
--- /dev/null
+++ b/tests/datasets/StridedSliceDataset.h
@@ -0,0 +1,181 @@
+/*
+ * 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_STRIDED_SLICE_DATASET
+#define ARM_COMPUTE_TEST_STRIDED_SLICE_DATASET
+
+#include "utils/TypePrinter.h"
+
+#include "arm_compute/core/Types.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace datasets
+{
+class StridedSliceDataset
+{
+public:
+    using type = std::tuple<TensorShape, Coordinates, Coordinates, BiStrides, int32_t, int32_t, int32_t>;
+
+    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,
+                 std::vector<BiStrides>::const_iterator   strides_values_it,
+                 std::vector<int32_t>::const_iterator     begin_mask_values_it,
+                 std::vector<int32_t>::const_iterator     end_mask_values_it,
+                 std::vector<int32_t>::const_iterator     shrink_mask_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) },
+              _strides_values_it{ std::move(strides_values_it) },
+              _begin_mask_values_it{ std::move(begin_mask_values_it) },
+              _end_mask_values_it{ std::move(end_mask_values_it) },
+              _shrink_mask_values_it{ std::move(shrink_mask_values_it) }
+        {
+        }
+
+        std::string description() const
+        {
+            std::stringstream description;
+            description << "Shape=" << *_tensor_shapes_it << ":";
+            description << "Starts=" << *_starts_values_it << ":";
+            description << "Ends=" << *_ends_values_it << ":";
+            description << "Strides=" << *_strides_values_it << ":";
+            description << "BeginMask=" << *_begin_mask_values_it << ":";
+            description << "EndMask=" << *_end_mask_values_it << ":";
+            description << "ShrinkMask=" << *_shrink_mask_values_it << ":";
+            return description.str();
+        }
+
+        StridedSliceDataset::type operator*() const
+        {
+            return std::make_tuple(*_tensor_shapes_it,
+                                   *_starts_values_it, *_ends_values_it, *_strides_values_it,
+                                   *_begin_mask_values_it, *_end_mask_values_it, *_shrink_mask_values_it);
+        }
+
+        iterator &operator++()
+        {
+            ++_tensor_shapes_it;
+            ++_starts_values_it;
+            ++_ends_values_it;
+            ++_strides_values_it;
+            ++_begin_mask_values_it;
+            ++_end_mask_values_it;
+            ++_shrink_mask_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;
+        std::vector<BiStrides>::const_iterator   _strides_values_it;
+        std::vector<int32_t>::const_iterator     _begin_mask_values_it;
+        std::vector<int32_t>::const_iterator     _end_mask_values_it;
+        std::vector<int32_t>::const_iterator     _shrink_mask_values_it;
+    };
+
+    iterator begin() const
+    {
+        return iterator(_tensor_shapes.begin(),
+                        _starts_values.begin(), _ends_values.begin(), _strides_values.begin(),
+                        _begin_mask_values.begin(), _end_mask_values.begin(), _shrink_mask_values.begin());
+    }
+
+    int size() const
+    {
+        return std::min(_tensor_shapes.size(), std::min(_starts_values.size(), std::min(_ends_values.size(), _strides_values.size())));
+    }
+
+    void add_config(TensorShape shape,
+                    Coordinates starts, Coordinates ends, BiStrides strides,
+                    int32_t begin_mask = 0, int32_t end_mask = 0, int32_t shrink_mask = 0)
+    {
+        _tensor_shapes.emplace_back(std::move(shape));
+        _starts_values.emplace_back(std::move(starts));
+        _ends_values.emplace_back(std::move(ends));
+        _strides_values.emplace_back(std::move(strides));
+        _begin_mask_values.emplace_back(std::move(begin_mask));
+        _end_mask_values.emplace_back(std::move(end_mask));
+        _shrink_mask_values.emplace_back(std::move(shrink_mask));
+    }
+
+protected:
+    StridedSliceDataset()                       = default;
+    StridedSliceDataset(StridedSliceDataset &&) = default;
+
+private:
+    std::vector<TensorShape> _tensor_shapes{};
+    std::vector<Coordinates> _starts_values{};
+    std::vector<Coordinates> _ends_values{};
+    std::vector<BiStrides>   _strides_values{};
+    std::vector<int32_t>     _begin_mask_values{};
+    std::vector<int32_t>     _end_mask_values{};
+    std::vector<int32_t>     _shrink_mask_values{};
+};
+
+class SmallStridedSliceDataset final : public StridedSliceDataset
+{
+public:
+    SmallStridedSliceDataset()
+    {
+        // 1D
+        add_config(TensorShape(15U), Coordinates(0), Coordinates(5), BiStrides(2));
+        add_config(TensorShape(15U), Coordinates(-1), Coordinates(-8), BiStrides(-2));
+        // 2D
+        add_config(TensorShape(15U, 16U), Coordinates(0, 1), Coordinates(5, -1), BiStrides(2, 1));
+        add_config(TensorShape(15U, 16U), Coordinates(4, 1), Coordinates(12, -1), BiStrides(2, 1), 1);
+        // 3D
+        add_config(TensorShape(15U, 16U, 4U), Coordinates(0, 1, 2), Coordinates(5, -1, 4), BiStrides(2, 1, 2));
+        add_config(TensorShape(15U, 16U, 4U), Coordinates(0, 1, 2), Coordinates(5, -1, 4), BiStrides(2, 1, 2), 0, 1);
+        // 4D
+        add_config(TensorShape(15U, 16U, 4U, 12U), Coordinates(0, 1, 2, 2), Coordinates(5, -1, 4, 5), BiStrides(2, 1, 2, 3));
+    }
+};
+
+class LargeStridedSliceDataset final : public StridedSliceDataset
+{
+public:
+    LargeStridedSliceDataset()
+    {
+        // 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));
+        // 3D
+        add_config(TensorShape(372U, 68U, 12U), Coordinates(128U, 7U, -1), Coordinates(368U, -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);
+    }
+};
+
+} // namespace datasets
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_STRIDED_SLICE_DATASET */
diff --git a/tests/validation/CL/StridedSlice.cpp b/tests/validation/CL/StridedSlice.cpp
new file mode 100644
index 0000000..824f7b1
--- /dev/null
+++ b/tests/validation/CL/StridedSlice.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2017-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/CLStridedSlice.h"
+
+#include "tests/CL/CLAccessor.h"
+#include "tests/PaddingCalculator.h"
+#include "tests/datasets/StridedSliceDataset.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"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+TEST_SUITE(CL)
+TEST_SUITE(StridedSlice)
+
+// *INDENT-OFF*
+// clang-format off
+DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(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),         // Zero stride
+                                                TensorInfo(TensorShape(27U, 3U, 2U), 1, DataType::F32),         // Big number of coordinates
+                                                TensorInfo(TensorShape(27U, 3U, 2U), 1, DataType::F32),         // Invalid Coords/Strides
+                                                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), Coordinates(3, 1, 0) })),
+        framework::dataset::make("Ends", { Coordinates(13, 3, 0),  Coordinates(13, 3, 1), Coordinates(13, 3, 1, 1), Coordinates(13, -1, 1), Coordinates(13, 3, 1) })),
+        framework::dataset::make("Strides", { BiStrides(2, 1, 1),  BiStrides(2, 0, 1), BiStrides(2, 1, 1), BiStrides(2, -1, 1), BiStrides(2, 1, 1) })),
+        framework::dataset::make("Expected", { false, false, false, false, true })),
+        input_info, starts, ends, strides, expected)
+{
+    TensorInfo output_info;
+    ARM_COMPUTE_EXPECT(bool(CLStridedSlice::validate(&input_info.clone()->set_is_resizable(false), &output_info, starts, ends, strides)) == expected, framework::LogLevel::ERRORS);
+}
+// clang-format on
+// *INDENT-ON*
+
+DATA_TEST_CASE(Configuration,
+               framework::DatasetMode::ALL,
+               combine(arm_compute::test::datasets::SmallStridedSliceDataset(), framework::dataset::make("DataType", { DataType::F16, DataType::F32 })),
+               shape, starts, ends, strides, begin_mask, end_mask, shrink_mask, data_type)
+{
+    // Create tensors
+    CLTensor src = create_tensor<CLTensor>(shape, data_type);
+    CLTensor dst;
+
+    // Create and Configure function
+    CLStridedSlice strided_slice;
+    strided_slice.configure(&src, &dst, starts, ends, strides, begin_mask, end_mask, shrink_mask);
+
+    // 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 CLStridedSliceFixture = StridedSliceFixture<CLTensor, CLAccessor, CLStridedSlice, T>;
+
+TEST_SUITE(Float)
+TEST_SUITE(FP16)
+FIXTURE_DATA_TEST_CASE(RunSmall,
+                       CLStridedSliceFixture<half>,
+                       framework::DatasetMode::PRECOMMIT,
+                       combine(datasets::SmallStridedSliceDataset(), framework::dataset::make("DataType", DataType::F16)))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference);
+}
+
+FIXTURE_DATA_TEST_CASE(RunLarge,
+                       CLStridedSliceFixture<half>,
+                       framework::DatasetMode::NIGHTLY,
+                       combine(datasets::LargeStridedSliceDataset(), framework::dataset::make("DataType", DataType::F16)))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference);
+}
+TEST_SUITE_END() // FP16
+
+TEST_SUITE(FP32)
+FIXTURE_DATA_TEST_CASE(RunSmall,
+                       CLStridedSliceFixture<float>,
+                       framework::DatasetMode::PRECOMMIT,
+                       combine(datasets::SmallStridedSliceDataset(), framework::dataset::make("DataType", DataType::F32)))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference);
+}
+
+FIXTURE_DATA_TEST_CASE(RunLarge,
+                       CLStridedSliceFixture<float>,
+                       framework::DatasetMode::NIGHTLY,
+                       combine(datasets::LargeStridedSliceDataset(), framework::dataset::make("DataType", DataType::F32)))
+{
+    // Validate output
+    validate(CLAccessor(_target), _reference);
+}
+TEST_SUITE_END() // FP32
+TEST_SUITE_END() // Float
+
+TEST_SUITE_END() // StridedSlice
+TEST_SUITE_END() // CL
+
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/validation/fixtures/StridedSliceFixture.h b/tests/validation/fixtures/StridedSliceFixture.h
new file mode 100644
index 0000000..26442ad
--- /dev/null
+++ b/tests/validation/fixtures/StridedSliceFixture.h
@@ -0,0 +1,119 @@
+/*
+ * 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_STRIDED_SLICE_FIXTURE
+#define ARM_COMPUTE_TEST_STRIDED_SLICE_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/StridedSlice.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+template <typename TensorType, typename AccessorType, typename FunctionType, typename T>
+class StridedSliceFixture : public framework::Fixture
+{
+public:
+    template <typename...>
+    void setup(TensorShape shape,
+               Coordinates starts, Coordinates ends, BiStrides strides,
+               int32_t begin_mask, int32_t end_mask, int32_t shrink_mask,
+               DataType data_type)
+    {
+        _target    = compute_target(shape, starts, ends, strides, begin_mask, end_mask, shrink_mask, data_type);
+        _reference = compute_reference(shape, starts, ends, strides, begin_mask, end_mask, shrink_mask, 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, const BiStrides &strides,
+                              int32_t begin_mask, int32_t end_mask, int32_t shrink_mask,
+                              DataType data_type)
+    {
+        // Create tensors
+        TensorType src = create_tensor<TensorType>(shape, data_type);
+        TensorType dst;
+
+        // Create and configure function
+        FunctionType strided_slice;
+        strided_slice.configure(&src, &dst, starts, ends, strides, begin_mask, end_mask, shrink_mask);
+
+        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
+        strided_slice.run();
+
+        return dst;
+    }
+
+    SimpleTensor<T> compute_reference(const TensorShape &shape,
+                                      const Coordinates &starts, const Coordinates &ends, const BiStrides &strides,
+                                      int32_t begin_mask, int32_t end_mask, int32_t shrink_mask,
+                                      DataType data_type)
+    {
+        // Create reference
+        SimpleTensor<T> src{ shape, data_type };
+
+        // Fill reference
+        fill(src, 0);
+
+        return reference::strided_slice(src, starts, ends, strides, begin_mask, end_mask, shrink_mask);
+    }
+
+    TensorType      _target{};
+    SimpleTensor<T> _reference{};
+};
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_TEST_STRIDED_SLICE_FIXTURE */
diff --git a/tests/validation/reference/StridedSlice.cpp b/tests/validation/reference/StridedSlice.cpp
new file mode 100644
index 0000000..ac02ce1
--- /dev/null
+++ b/tests/validation/reference/StridedSlice.cpp
@@ -0,0 +1,92 @@
+/*
+ * 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 "StridedSlice.h"
+
+#include "arm_compute/core/utils/helpers/tensor_transform.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+namespace reference
+{
+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)
+{
+    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(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(strides[i] == 0);
+    }
+
+    // Get source shape
+    const TensorShape &src_shape = src.shape();
+
+    // Get actual start, end coordinates and strides
+    const Coordinates final_strides = strided_slice_strides(src_shape, strides);
+    const Coordinates starts_abs    = strided_slice_absolute_start_coords(src_shape, starts, final_strides, begin_mask);
+    const Coordinates ends_abs      = strided_slice_absolute_end_coords(src_shape, starts_abs, ends, final_strides, end_mask, shrink_axis_mask);
+
+    // Get destination shape
+    const TensorShape dst_shape = compute_strided_slice_output_shape(src_shape, starts_abs, ends_abs, final_strides);
+
+    // Create destination tensor
+    SimpleTensor<T> dst{ dst_shape, src.data_type(), 1 };
+
+    // Perform strided 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_abs[i] + id[i] * final_strides[i]);
+        }
+        *reinterpret_cast<T *>(dst(id)) = *reinterpret_cast<const T *>(src(offset));
+    });
+
+    return dst;
+}
+
+template SimpleTensor<float> strided_slice(const SimpleTensor<float> &src,
+                                           Coordinates starts, Coordinates ends, BiStrides strides,
+                                           int32_t begin_mask, int32_t end_mask, int32_t shrink_axis_mask);
+template SimpleTensor<half_float::half> strided_slice(const SimpleTensor<half_float::half> &src,
+                                                      Coordinates starts, Coordinates ends, BiStrides strides,
+                                                      int32_t begin_mask, int32_t end_mask, int32_t shrink_axis_mask);
+} // namespace reference
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
diff --git a/tests/validation/reference/StridedSlice.h b/tests/validation/reference/StridedSlice.h
new file mode 100644
index 0000000..805b7e6
--- /dev/null
+++ b/tests/validation/reference/StridedSlice.h
@@ -0,0 +1,45 @@
+/*
+ * 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_STRIDED_SLICE_H__
+#define __ARM_COMPUTE_TEST_STRIDED_SLICE_H__
+
+#include "tests/SimpleTensor.h"
+
+namespace arm_compute
+{
+namespace test
+{
+namespace validation
+{
+namespace reference
+{
+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);
+} // namespace reference
+} // namespace validation
+} // namespace test
+} // namespace arm_compute
+#endif /* __ARM_COMPUTE_TEST_STRIDED_SLICE_H__ */
