diff --git a/delegate/src/test/SliceTest.cpp b/delegate/src/test/SliceTest.cpp
index bd05849..1d7133f 100644
--- a/delegate/src/test/SliceTest.cpp
+++ b/delegate/src/test/SliceTest.cpp
@@ -1,5 +1,5 @@
 //
-// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
+// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
 // SPDX-License-Identifier: MIT
 //
 
@@ -8,236 +8,74 @@
 #include <armnn_delegate.hpp>
 
 #include <flatbuffers/flatbuffers.h>
-#include <tensorflow/lite/schema/schema_generated.h>
 
 #include <doctest/doctest.h>
 
 namespace armnnDelegate
 {
 
-void StridedSlice4DTest(std::vector<armnn::BackendId>& backends)
+void SliceFixtureSimpleTest(std::vector<armnn::BackendId>& backends)
 {
-    std::vector<int32_t> inputShape  { 3, 2, 3, 1 };
-    std::vector<int32_t> outputShape { 1, 2, 3, 1 };
-    std::vector<int32_t> beginShape  { 4 };
-    std::vector<int32_t> endShape    { 4 };
-    std::vector<int32_t> strideShape { 4 };
+    std::vector<int32_t> inputShape  { 3, 2, 3 };
+    std::vector<int32_t> outputShape { 2, 1, 3 };
+    std::vector<int32_t> beginShape  { 3 };
+    std::vector<int32_t> sizeShape   { 3 };
 
-    std::vector<int32_t> beginData  { 1, 0, 0, 0 };
-    std::vector<int32_t> endData    { 2, 2, 3, 1 };
-    std::vector<int32_t> strideData { 1, 1, 1, 1 };
+    std::vector<int32_t> beginData { 1, 0, 0 };
+    std::vector<int32_t> sizeData  { 2, 1, 3 };
     std::vector<float> inputData  { 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
                                     3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
                                     5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f };
-    std::vector<float> outputData { 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f };
+    std::vector<float> outputData { 3.0f, 3.0f, 3.0f,
+                                    5.0f, 5.0f, 5.0f };
 
-    StridedSliceTestImpl<float>(
-            backends,
-            inputData,
-            outputData,
-            beginData,
-            endData,
-            strideData,
-            inputShape,
-            beginShape,
-            endShape,
-            strideShape,
-            outputShape
-            );
+    SliceTestImpl<float>(
+        backends,
+        inputData,
+        outputData,
+        beginData,
+        sizeData,
+        inputShape,
+        beginShape,
+        sizeShape,
+        outputShape);
 }
 
-void StridedSlice4DReverseTest(std::vector<armnn::BackendId>& backends)
-{
-    std::vector<int32_t> inputShape  { 3, 2, 3, 1 };
-    std::vector<int32_t> outputShape { 1, 2, 3, 1 };
-    std::vector<int32_t> beginShape  { 4 };
-    std::vector<int32_t> endShape    { 4 };
-    std::vector<int32_t> strideShape { 4 };
-
-    std::vector<int32_t> beginData  { 1, -1, 0, 0 };
-    std::vector<int32_t> endData    { 2, -3, 3, 1 };
-    std::vector<int32_t> strideData { 1, -1, 1, 1 };
-    std::vector<float>   inputData  { 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
-                                      3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
-                                      5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f };
-    std::vector<float>   outputData { 4.0f, 4.0f, 4.0f, 3.0f, 3.0f, 3.0f };
-
-    StridedSliceTestImpl<float>(
-            backends,
-            inputData,
-            outputData,
-            beginData,
-            endData,
-            strideData,
-            inputShape,
-            beginShape,
-            endShape,
-            strideShape,
-            outputShape
-    );
-}
-
-void StridedSliceSimpleStrideTest(std::vector<armnn::BackendId>& backends)
-{
-    std::vector<int32_t> inputShape  { 3, 2, 3, 1 };
-    std::vector<int32_t> outputShape { 2, 1, 2, 1 };
-    std::vector<int32_t> beginShape  { 4 };
-    std::vector<int32_t> endShape    { 4 };
-    std::vector<int32_t> strideShape { 4 };
-
-    std::vector<int32_t> beginData  { 0, 0, 0, 0 };
-    std::vector<int32_t> endData    { 3, 2, 3, 1 };
-    std::vector<int32_t> strideData { 2, 2, 2, 1 };
-    std::vector<float>   inputData  { 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
-                                      3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
-                                      5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f };
-    std::vector<float>   outputData { 1.0f, 1.0f,
-                                      5.0f, 5.0f };
-
-    StridedSliceTestImpl<float>(
-            backends,
-            inputData,
-            outputData,
-            beginData,
-            endData,
-            strideData,
-            inputShape,
-            beginShape,
-            endShape,
-            strideShape,
-            outputShape
-    );
-}
-
-void StridedSliceSimpleRangeMaskTest(std::vector<armnn::BackendId>& backends)
-{
-    std::vector<int32_t> inputShape  { 3, 2, 3, 1 };
-    std::vector<int32_t> outputShape { 3, 2, 3, 1 };
-    std::vector<int32_t> beginShape  { 4 };
-    std::vector<int32_t> endShape    { 4 };
-    std::vector<int32_t> strideShape { 4 };
-
-    std::vector<int32_t> beginData  { 1, 1, 1, 1 };
-    std::vector<int32_t> endData    { 1, 1, 1, 1 };
-    std::vector<int32_t> strideData { 1, 1, 1, 1 };
-
-    int beginMask = -1;
-    int endMask   = -1;
-
-    std::vector<float>   inputData  { 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
-                                      3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
-                                      5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f };
-    std::vector<float>   outputData { 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
-                                      3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
-                                      5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f };
-
-    StridedSliceTestImpl<float>(
-            backends,
-            inputData,
-            outputData,
-            beginData,
-            endData,
-            strideData,
-            inputShape,
-            beginShape,
-            endShape,
-            strideShape,
-            outputShape,
-            beginMask,
-            endMask
-    );
-}
-
-
-TEST_SUITE("StridedSlice_CpuRefTests")
+TEST_SUITE("Slice_CpuRefTests")
 {
 
-TEST_CASE ("StridedSlice_4D_CpuRef_Test")
+TEST_CASE ("Slice_Simple_CpuRef_Test")
 {
     std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
-    StridedSlice4DTest(backends);
+    SliceFixtureSimpleTest(backends);
 }
 
-TEST_CASE ("StridedSlice_4D_Reverse_CpuRef_Test")
+} // Slice_CpuRefTests TestSuite
+
+
+
+TEST_SUITE("Slice_CpuAccTests")
+{
+
+TEST_CASE ("Slice_Simple_CpuAcc_Test")
 {
     std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
-    StridedSlice4DReverseTest(backends);
+    SliceFixtureSimpleTest(backends);
 }
 
-TEST_CASE ("StridedSlice_SimpleStride_CpuRef_Test")
-{
-    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
-    StridedSliceSimpleStrideTest(backends);
-}
-
-TEST_CASE ("StridedSlice_SimpleRange_CpuRef_Test")
-{
-    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
-    StridedSliceSimpleRangeMaskTest(backends);
-}
-
-} // StridedSlice_CpuRefTests TestSuite
-
-
-
-TEST_SUITE("StridedSlice_CpuAccTests")
-{
-
-TEST_CASE ("StridedSlice_4D_CpuAcc_Test")
-{
-    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc};
-    StridedSlice4DTest(backends);
-}
-
-TEST_CASE ("StridedSlice_4D_Reverse_CpuAcc_Test")
-{
-    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc};
-    StridedSlice4DReverseTest(backends);
-}
-
-TEST_CASE ("StridedSlice_SimpleStride_CpuAcc_Test")
-{
-    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc};
-    StridedSliceSimpleStrideTest(backends);
-}
-
-TEST_CASE ("StridedSlice_SimpleRange_CpuAcc_Test")
-{
-    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc};
-    StridedSliceSimpleRangeMaskTest(backends);
-}
-
-} // StridedSlice_CpuAccTests TestSuite
+} // Slice_CpuAccTests TestSuite
 
 
 
 TEST_SUITE("StridedSlice_GpuAccTests")
 {
 
-TEST_CASE ("StridedSlice_4D_GpuAcc_Test")
+TEST_CASE ("Slice_Simple_GpuAcc_Test")
 {
-    std::vector<armnn::BackendId> backends = {armnn::Compute::GpuAcc};
-    StridedSlice4DTest(backends);
+    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
+    SliceFixtureSimpleTest(backends);
 }
 
-TEST_CASE ("StridedSlice_4D_Reverse_GpuAcc_Test")
-{
-    std::vector<armnn::BackendId> backends = {armnn::Compute::GpuAcc};
-    StridedSlice4DReverseTest(backends);
-}
-
-TEST_CASE ("StridedSlice_SimpleStride_GpuAcc_Test")
-{
-    std::vector<armnn::BackendId> backends = {armnn::Compute::GpuAcc};
-    StridedSliceSimpleStrideTest(backends);
-}
-
-TEST_CASE ("StridedSlice_SimpleRange_GpuAcc_Test")
-{
-    std::vector<armnn::BackendId> backends = {armnn::Compute::GpuAcc};
-    StridedSliceSimpleRangeMaskTest(backends);
-}
-
-} // StridedSlice_GpuAccTests TestSuite
+} // Slice_GpuAccTests TestSuite
 
 } // namespace armnnDelegate
\ No newline at end of file
diff --git a/delegate/src/test/SliceTestHelper.hpp b/delegate/src/test/SliceTestHelper.hpp
index abaa807..4a2537f 100644
--- a/delegate/src/test/SliceTestHelper.hpp
+++ b/delegate/src/test/SliceTestHelper.hpp
@@ -1,5 +1,5 @@
 //
-// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
+// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
 // SPDX-License-Identifier: MIT
 //
 
@@ -24,61 +24,27 @@
 namespace
 {
 
-struct StridedSliceParams
-{
-    StridedSliceParams(std::vector<int32_t>& inputTensorShape,
-                       std::vector<int32_t>& beginTensorData,
-                       std::vector<int32_t>& endTensorData,
-                       std::vector<int32_t>& strideTensorData,
-                       std::vector<int32_t>& outputTensorShape,
-                       armnn::StridedSliceDescriptor& descriptor)
-        : m_InputTensorShape(inputTensorShape),
-          m_BeginTensorData(beginTensorData),
-          m_EndTensorData(endTensorData),
-          m_StrideTensorData(strideTensorData),
-          m_OutputTensorShape(outputTensorShape),
-          m_Descriptor (descriptor) {}
-
-    std::vector<int32_t> m_InputTensorShape;
-    std::vector<int32_t> m_BeginTensorData;
-    std::vector<int32_t> m_EndTensorData;
-    std::vector<int32_t> m_StrideTensorData;
-    std::vector<int32_t> m_OutputTensorShape;
-    armnn::StridedSliceDescriptor m_Descriptor;
-};
-
 std::vector<char> CreateSliceTfLiteModel(tflite::TensorType tensorType,
                                          const std::vector<int32_t>& inputTensorShape,
                                          const std::vector<int32_t>& beginTensorData,
-                                         const std::vector<int32_t>& endTensorData,
-                                         const std::vector<int32_t>& strideTensorData,
+                                         const std::vector<int32_t>& sizeTensorData,
                                          const std::vector<int32_t>& beginTensorShape,
-                                         const std::vector<int32_t>& endTensorShape,
-                                         const std::vector<int32_t>& strideTensorShape,
-                                         const std::vector<int32_t>& outputTensorShape,
-                                         const int32_t beginMask,
-                                         const int32_t endMask,
-                                         const int32_t ellipsisMask,
-                                         const int32_t newAxisMask,
-                                         const int32_t ShrinkAxisMask,
-                                         const armnn::DataLayout& dataLayout)
+                                         const std::vector<int32_t>& sizeTensorShape,
+                                         const std::vector<int32_t>& outputTensorShape)
 {
     using namespace tflite;
     flatbuffers::FlatBufferBuilder flatBufferBuilder;
 
-    std::array<flatbuffers::Offset<tflite::Buffer>, 4> buffers;
+    std::array<flatbuffers::Offset<tflite::Buffer>, 3> buffers;
     buffers[0] = CreateBuffer(flatBufferBuilder, flatBufferBuilder.CreateVector({}));
     buffers[1] = CreateBuffer(flatBufferBuilder,
                               flatBufferBuilder.CreateVector(reinterpret_cast<const uint8_t*>(beginTensorData.data()),
                                                              sizeof(int32_t) * beginTensorData.size()));
     buffers[2] = CreateBuffer(flatBufferBuilder,
-                              flatBufferBuilder.CreateVector(reinterpret_cast<const uint8_t*>(endTensorData.data()),
-                                                             sizeof(int32_t) * endTensorData.size()));
-    buffers[3] = CreateBuffer(flatBufferBuilder,
-                              flatBufferBuilder.CreateVector(reinterpret_cast<const uint8_t*>(strideTensorData.data()),
-                                                             sizeof(int32_t) * strideTensorData.size()));
+                              flatBufferBuilder.CreateVector(reinterpret_cast<const uint8_t*>(sizeTensorData.data()),
+                                                             sizeof(int32_t) * sizeTensorData.size()));
 
-    std::array<flatbuffers::Offset<Tensor>, 5> tensors;
+    std::array<flatbuffers::Offset<Tensor>, 4> tensors;
     tensors[0] = CreateTensor(flatBufferBuilder,
                               flatBufferBuilder.CreateVector<int32_t>(inputTensorShape.data(),
                                                                       inputTensorShape.size()),
@@ -92,18 +58,12 @@
                               1,
                               flatBufferBuilder.CreateString("begin_tensor"));
     tensors[2] = CreateTensor(flatBufferBuilder,
-                              flatBufferBuilder.CreateVector<int32_t>(endTensorShape.data(),
-                                                                      endTensorShape.size()),
+                              flatBufferBuilder.CreateVector<int32_t>(sizeTensorShape.data(),
+                                                                      sizeTensorShape.size()),
                               ::tflite::TensorType_INT32,
                               2,
-                              flatBufferBuilder.CreateString("end_tensor"));
+                              flatBufferBuilder.CreateString("size_tensor"));
     tensors[3] = CreateTensor(flatBufferBuilder,
-                              flatBufferBuilder.CreateVector<int32_t>(strideTensorShape.data(),
-                                                                      strideTensorShape.size()),
-                              ::tflite::TensorType_INT32,
-                              3,
-                              flatBufferBuilder.CreateString("stride_tensor"));
-    tensors[4] = CreateTensor(flatBufferBuilder,
                               flatBufferBuilder.CreateVector<int32_t>(outputTensorShape.data(),
                                                                       outputTensorShape.size()),
                               tensorType,
@@ -112,45 +72,40 @@
 
 
     // create operator
-    tflite::BuiltinOptions operatorBuiltinOptionsType = tflite::BuiltinOptions_StridedSliceOptions;
-    flatbuffers::Offset<void> operatorBuiltinOptions = CreateStridedSliceOptions(flatBufferBuilder,
-                                                                                 beginMask,
-                                                                                 endMask,
-                                                                                 ellipsisMask,
-                                                                                 newAxisMask,
-                                                                                 ShrinkAxisMask).Union();
+    tflite::BuiltinOptions operatorBuiltinOptionsType = tflite::BuiltinOptions_SliceOptions;
+    flatbuffers::Offset<void> operatorBuiltinOptions = CreateSliceOptions(flatBufferBuilder).Union();
 
-    const std::vector<int> operatorInputs{ 0, 1, 2, 3 };
-    const std::vector<int> operatorOutputs{ 4 };
+    const std::vector<int> operatorInputs{ 0, 1, 2 };
+    const std::vector<int> operatorOutputs{ 3 };
     flatbuffers::Offset <Operator> sliceOperator =
-            CreateOperator(flatBufferBuilder,
-                           0,
-                           flatBufferBuilder.CreateVector<int32_t>(operatorInputs.data(), operatorInputs.size()),
-                           flatBufferBuilder.CreateVector<int32_t>(operatorOutputs.data(), operatorOutputs.size()),
-                           operatorBuiltinOptionsType,
-                           operatorBuiltinOptions);
+        CreateOperator(flatBufferBuilder,
+                       0,
+                       flatBufferBuilder.CreateVector<int32_t>(operatorInputs.data(), operatorInputs.size()),
+                       flatBufferBuilder.CreateVector<int32_t>(operatorOutputs.data(), operatorOutputs.size()),
+                       operatorBuiltinOptionsType,
+                       operatorBuiltinOptions);
 
-    const std::vector<int> subgraphInputs{ 0, 1, 2, 3 };
-    const std::vector<int> subgraphOutputs{ 4 };
+    const std::vector<int> subgraphInputs{ 0, 1, 2 };
+    const std::vector<int> subgraphOutputs{ 3 };
     flatbuffers::Offset <SubGraph> subgraph =
-            CreateSubGraph(flatBufferBuilder,
-                           flatBufferBuilder.CreateVector(tensors.data(), tensors.size()),
-                           flatBufferBuilder.CreateVector<int32_t>(subgraphInputs.data(), subgraphInputs.size()),
-                           flatBufferBuilder.CreateVector<int32_t>(subgraphOutputs.data(), subgraphOutputs.size()),
-                           flatBufferBuilder.CreateVector(&sliceOperator, 1));
+        CreateSubGraph(flatBufferBuilder,
+                       flatBufferBuilder.CreateVector(tensors.data(), tensors.size()),
+                       flatBufferBuilder.CreateVector<int32_t>(subgraphInputs.data(), subgraphInputs.size()),
+                       flatBufferBuilder.CreateVector<int32_t>(subgraphOutputs.data(), subgraphOutputs.size()),
+                       flatBufferBuilder.CreateVector(&sliceOperator, 1));
 
     flatbuffers::Offset <flatbuffers::String> modelDescription =
-            flatBufferBuilder.CreateString("ArmnnDelegate: StridedSlice Operator Model");
+        flatBufferBuilder.CreateString("ArmnnDelegate: Slice Operator Model");
     flatbuffers::Offset <OperatorCode> operatorCode = CreateOperatorCode(flatBufferBuilder,
-                                                                         BuiltinOperator_STRIDED_SLICE);
+                                                                         BuiltinOperator_SLICE);
 
     flatbuffers::Offset <Model> flatbufferModel =
-            CreateModel(flatBufferBuilder,
-                        TFLITE_SCHEMA_VERSION,
-                        flatBufferBuilder.CreateVector(&operatorCode, 1),
-                        flatBufferBuilder.CreateVector(&subgraph, 1),
-                        modelDescription,
-                        flatBufferBuilder.CreateVector(buffers.data(), buffers.size()));
+        CreateModel(flatBufferBuilder,
+                    TFLITE_SCHEMA_VERSION,
+                    flatBufferBuilder.CreateVector(&operatorCode, 1),
+                    flatBufferBuilder.CreateVector(&subgraph, 1),
+                    modelDescription,
+                    flatBufferBuilder.CreateVector(buffers.data(), buffers.size()));
 
     flatBufferBuilder.Finish(flatbufferModel);
 
@@ -159,62 +114,46 @@
 }
 
 template <typename T>
-void StridedSliceTestImpl(std::vector<armnn::BackendId>& backends,
-                          std::vector<T>& inputValues,
-                          std::vector<T>& expectedOutputValues,
-                          std::vector<int32_t>& beginTensorData,
-                          std::vector<int32_t>& endTensorData,
-                          std::vector<int32_t>& strideTensorData,
-                          std::vector<int32_t>& inputTensorShape,
-                          std::vector<int32_t>& beginTensorShape,
-                          std::vector<int32_t>& endTensorShape,
-                          std::vector<int32_t>& strideTensorShape,
-                          std::vector<int32_t>& outputTensorShape,
-                          const int32_t beginMask = 0,
-                          const int32_t endMask = 0,
-                          const int32_t ellipsisMask = 0,
-                          const int32_t newAxisMask = 0,
-                          const int32_t ShrinkAxisMask = 0,
-                          const armnn::DataLayout& dataLayout = armnn::DataLayout::NHWC)
+void SliceTestImpl(std::vector<armnn::BackendId>& backends,
+                   std::vector<T>& inputValues,
+                   std::vector<T>& expectedOutputValues,
+                   std::vector<int32_t>& beginTensorData,
+                   std::vector<int32_t>& sizeTensorData,
+                   std::vector<int32_t>& inputTensorShape,
+                   std::vector<int32_t>& beginTensorShape,
+                   std::vector<int32_t>& sizeTensorShape,
+                   std::vector<int32_t>& outputTensorShape)
 {
     using namespace tflite;
     std::vector<char> modelBuffer = CreateSliceTfLiteModel(
-            ::tflite::TensorType_FLOAT32,
-            inputTensorShape,
-            beginTensorData,
-            endTensorData,
-            strideTensorData,
-            beginTensorShape,
-            endTensorShape,
-            strideTensorShape,
-            outputTensorShape,
-            beginMask,
-            endMask,
-            ellipsisMask,
-            newAxisMask,
-            ShrinkAxisMask,
-            dataLayout);
+        ::tflite::TensorType_FLOAT32,
+        inputTensorShape,
+        beginTensorData,
+        sizeTensorData,
+        beginTensorShape,
+        sizeTensorShape,
+        outputTensorShape);
 
     auto tfLiteModel = GetModel(modelBuffer.data());
 
     // Create TfLite Interpreters
     std::unique_ptr<Interpreter> armnnDelegate;
     CHECK(InterpreterBuilder(tfLiteModel, ::tflite::ops::builtin::BuiltinOpResolver())
-              (&armnnDelegate) == kTfLiteOk);
+        (&armnnDelegate) == kTfLiteOk);
     CHECK(armnnDelegate != nullptr);
     CHECK(armnnDelegate->AllocateTensors() == kTfLiteOk);
 
     std::unique_ptr<Interpreter> tfLiteDelegate;
     CHECK(InterpreterBuilder(tfLiteModel, ::tflite::ops::builtin::BuiltinOpResolver())
-              (&tfLiteDelegate) == kTfLiteOk);
+        (&tfLiteDelegate) == kTfLiteOk);
     CHECK(tfLiteDelegate != nullptr);
     CHECK(tfLiteDelegate->AllocateTensors() == kTfLiteOk);
 
     // Create the ArmNN Delegate
     armnnDelegate::DelegateOptions delegateOptions(backends);
     std::unique_ptr<TfLiteDelegate, decltype(&armnnDelegate::TfLiteArmnnDelegateDelete)>
-    theArmnnDelegate(armnnDelegate::TfLiteArmnnDelegateCreate(delegateOptions),
-                     armnnDelegate::TfLiteArmnnDelegateDelete);
+        theArmnnDelegate(armnnDelegate::TfLiteArmnnDelegateCreate(delegateOptions),
+                         armnnDelegate::TfLiteArmnnDelegateDelete);
     CHECK(theArmnnDelegate != nullptr);
 
     // Modify armnnDelegateInterpreter to use armnnDelegate
@@ -236,6 +175,6 @@
 
     tfLiteDelegate.reset(nullptr);
     armnnDelegate.reset(nullptr);
-} // End of StridedSlice Test
+} // End of Slice Test
 
 } // anonymous namespace
\ No newline at end of file
diff --git a/delegate/src/test/StridedSliceTest.cpp b/delegate/src/test/StridedSliceTest.cpp
new file mode 100644
index 0000000..43aea8a
--- /dev/null
+++ b/delegate/src/test/StridedSliceTest.cpp
@@ -0,0 +1,241 @@
+//
+// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "StridedSliceTestHelper.hpp"
+
+#include <armnn_delegate.hpp>
+
+#include <flatbuffers/flatbuffers.h>
+
+#include <doctest/doctest.h>
+
+namespace armnnDelegate
+{
+
+void StridedSlice4DTest(std::vector<armnn::BackendId>& backends)
+{
+    std::vector<int32_t> inputShape  { 3, 2, 3, 1 };
+    std::vector<int32_t> outputShape { 1, 2, 3, 1 };
+    std::vector<int32_t> beginShape  { 4 };
+    std::vector<int32_t> endShape    { 4 };
+    std::vector<int32_t> strideShape { 4 };
+
+    std::vector<int32_t> beginData  { 1, 0, 0, 0 };
+    std::vector<int32_t> endData    { 2, 2, 3, 1 };
+    std::vector<int32_t> strideData { 1, 1, 1, 1 };
+    std::vector<float> inputData  { 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
+                                    3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
+                                    5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f };
+    std::vector<float> outputData { 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f };
+
+    StridedSliceTestImpl<float>(
+            backends,
+            inputData,
+            outputData,
+            beginData,
+            endData,
+            strideData,
+            inputShape,
+            beginShape,
+            endShape,
+            strideShape,
+            outputShape
+            );
+}
+
+void StridedSlice4DReverseTest(std::vector<armnn::BackendId>& backends)
+{
+    std::vector<int32_t> inputShape  { 3, 2, 3, 1 };
+    std::vector<int32_t> outputShape { 1, 2, 3, 1 };
+    std::vector<int32_t> beginShape  { 4 };
+    std::vector<int32_t> endShape    { 4 };
+    std::vector<int32_t> strideShape { 4 };
+
+    std::vector<int32_t> beginData  { 1, -1, 0, 0 };
+    std::vector<int32_t> endData    { 2, -3, 3, 1 };
+    std::vector<int32_t> strideData { 1, -1, 1, 1 };
+    std::vector<float>   inputData  { 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
+                                      3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
+                                      5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f };
+    std::vector<float>   outputData { 4.0f, 4.0f, 4.0f, 3.0f, 3.0f, 3.0f };
+
+    StridedSliceTestImpl<float>(
+            backends,
+            inputData,
+            outputData,
+            beginData,
+            endData,
+            strideData,
+            inputShape,
+            beginShape,
+            endShape,
+            strideShape,
+            outputShape
+    );
+}
+
+void StridedSliceSimpleStrideTest(std::vector<armnn::BackendId>& backends)
+{
+    std::vector<int32_t> inputShape  { 3, 2, 3, 1 };
+    std::vector<int32_t> outputShape { 2, 1, 2, 1 };
+    std::vector<int32_t> beginShape  { 4 };
+    std::vector<int32_t> endShape    { 4 };
+    std::vector<int32_t> strideShape { 4 };
+
+    std::vector<int32_t> beginData  { 0, 0, 0, 0 };
+    std::vector<int32_t> endData    { 3, 2, 3, 1 };
+    std::vector<int32_t> strideData { 2, 2, 2, 1 };
+    std::vector<float>   inputData  { 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
+                                      3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
+                                      5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f };
+    std::vector<float>   outputData { 1.0f, 1.0f,
+                                      5.0f, 5.0f };
+
+    StridedSliceTestImpl<float>(
+            backends,
+            inputData,
+            outputData,
+            beginData,
+            endData,
+            strideData,
+            inputShape,
+            beginShape,
+            endShape,
+            strideShape,
+            outputShape
+    );
+}
+
+void StridedSliceSimpleRangeMaskTest(std::vector<armnn::BackendId>& backends)
+{
+    std::vector<int32_t> inputShape  { 3, 2, 3, 1 };
+    std::vector<int32_t> outputShape { 3, 2, 3, 1 };
+    std::vector<int32_t> beginShape  { 4 };
+    std::vector<int32_t> endShape    { 4 };
+    std::vector<int32_t> strideShape { 4 };
+
+    std::vector<int32_t> beginData  { 1, 1, 1, 1 };
+    std::vector<int32_t> endData    { 1, 1, 1, 1 };
+    std::vector<int32_t> strideData { 1, 1, 1, 1 };
+
+    int beginMask = -1;
+    int endMask   = -1;
+
+    std::vector<float>   inputData  { 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
+                                      3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
+                                      5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f };
+    std::vector<float>   outputData { 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
+                                      3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
+                                      5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f };
+
+    StridedSliceTestImpl<float>(
+            backends,
+            inputData,
+            outputData,
+            beginData,
+            endData,
+            strideData,
+            inputShape,
+            beginShape,
+            endShape,
+            strideShape,
+            outputShape,
+            beginMask,
+            endMask
+    );
+}
+
+TEST_SUITE("StridedSlice_CpuRefTests")
+{
+
+TEST_CASE ("StridedSlice_4D_CpuRef_Test")
+{
+    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
+    StridedSlice4DTest(backends);
+}
+
+TEST_CASE ("StridedSlice_4D_Reverse_CpuRef_Test")
+{
+    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
+    StridedSlice4DReverseTest(backends);
+}
+
+TEST_CASE ("StridedSlice_SimpleStride_CpuRef_Test")
+{
+    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
+    StridedSliceSimpleStrideTest(backends);
+}
+
+TEST_CASE ("StridedSlice_SimpleRange_CpuRef_Test")
+{
+    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuRef};
+    StridedSliceSimpleRangeMaskTest(backends);
+}
+
+} // StridedSlice_CpuRefTests TestSuite
+
+
+
+TEST_SUITE("StridedSlice_CpuAccTests")
+{
+
+TEST_CASE ("StridedSlice_4D_CpuAcc_Test")
+{
+    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc};
+    StridedSlice4DTest(backends);
+}
+
+TEST_CASE ("StridedSlice_4D_Reverse_CpuAcc_Test")
+{
+    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc};
+    StridedSlice4DReverseTest(backends);
+}
+
+TEST_CASE ("StridedSlice_SimpleStride_CpuAcc_Test")
+{
+    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc};
+    StridedSliceSimpleStrideTest(backends);
+}
+
+TEST_CASE ("StridedSlice_SimpleRange_CpuAcc_Test")
+{
+    std::vector<armnn::BackendId> backends = {armnn::Compute::CpuAcc};
+    StridedSliceSimpleRangeMaskTest(backends);
+}
+
+} // StridedSlice_CpuAccTests TestSuite
+
+
+
+TEST_SUITE("StridedSlice_GpuAccTests")
+{
+
+TEST_CASE ("StridedSlice_4D_GpuAcc_Test")
+{
+    std::vector<armnn::BackendId> backends = {armnn::Compute::GpuAcc};
+    StridedSlice4DTest(backends);
+}
+
+TEST_CASE ("StridedSlice_4D_Reverse_GpuAcc_Test")
+{
+    std::vector<armnn::BackendId> backends = {armnn::Compute::GpuAcc};
+    StridedSlice4DReverseTest(backends);
+}
+
+TEST_CASE ("StridedSlice_SimpleStride_GpuAcc_Test")
+{
+    std::vector<armnn::BackendId> backends = {armnn::Compute::GpuAcc};
+    StridedSliceSimpleStrideTest(backends);
+}
+
+TEST_CASE ("StridedSlice_SimpleRange_GpuAcc_Test")
+{
+    std::vector<armnn::BackendId> backends = {armnn::Compute::GpuAcc};
+    StridedSliceSimpleRangeMaskTest(backends);
+}
+
+} // StridedSlice_GpuAccTests TestSuite
+
+} // namespace armnnDelegate
\ No newline at end of file
diff --git a/delegate/src/test/StridedSliceTestHelper.hpp b/delegate/src/test/StridedSliceTestHelper.hpp
new file mode 100644
index 0000000..2bca4fd
--- /dev/null
+++ b/delegate/src/test/StridedSliceTestHelper.hpp
@@ -0,0 +1,218 @@
+//
+// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include "TestUtils.hpp"
+
+#include <armnn_delegate.hpp>
+#include <armnn/DescriptorsFwd.hpp>
+
+#include <flatbuffers/flatbuffers.h>
+#include <tensorflow/lite/interpreter.h>
+#include <tensorflow/lite/kernels/register.h>
+#include <tensorflow/lite/model.h>
+#include <tensorflow/lite/schema/schema_generated.h>
+#include <tensorflow/lite/version.h>
+
+#include <doctest/doctest.h>
+
+#include <string>
+
+namespace
+{
+
+std::vector<char> CreateStridedSliceTfLiteModel(tflite::TensorType tensorType,
+                                                const std::vector<int32_t>& inputTensorShape,
+                                                const std::vector<int32_t>& beginTensorData,
+                                                const std::vector<int32_t>& endTensorData,
+                                                const std::vector<int32_t>& strideTensorData,
+                                                const std::vector<int32_t>& beginTensorShape,
+                                                const std::vector<int32_t>& endTensorShape,
+                                                const std::vector<int32_t>& strideTensorShape,
+                                                const std::vector<int32_t>& outputTensorShape,
+                                                const int32_t beginMask,
+                                                const int32_t endMask,
+                                                const int32_t ellipsisMask,
+                                                const int32_t newAxisMask,
+                                                const int32_t ShrinkAxisMask,
+                                                const armnn::DataLayout& dataLayout)
+{
+    using namespace tflite;
+    flatbuffers::FlatBufferBuilder flatBufferBuilder;
+
+    std::array<flatbuffers::Offset<tflite::Buffer>, 4> buffers;
+    buffers[0] = CreateBuffer(flatBufferBuilder, flatBufferBuilder.CreateVector({}));
+    buffers[1] = CreateBuffer(flatBufferBuilder,
+                              flatBufferBuilder.CreateVector(reinterpret_cast<const uint8_t*>(beginTensorData.data()),
+                                                             sizeof(int32_t) * beginTensorData.size()));
+    buffers[2] = CreateBuffer(flatBufferBuilder,
+                              flatBufferBuilder.CreateVector(reinterpret_cast<const uint8_t*>(endTensorData.data()),
+                                                             sizeof(int32_t) * endTensorData.size()));
+    buffers[3] = CreateBuffer(flatBufferBuilder,
+                              flatBufferBuilder.CreateVector(reinterpret_cast<const uint8_t*>(strideTensorData.data()),
+                                                             sizeof(int32_t) * strideTensorData.size()));
+
+    std::array<flatbuffers::Offset<Tensor>, 5> tensors;
+    tensors[0] = CreateTensor(flatBufferBuilder,
+                              flatBufferBuilder.CreateVector<int32_t>(inputTensorShape.data(),
+                                                                      inputTensorShape.size()),
+                              tensorType,
+                              0,
+                              flatBufferBuilder.CreateString("input"));
+    tensors[1] = CreateTensor(flatBufferBuilder,
+                              flatBufferBuilder.CreateVector<int32_t>(beginTensorShape.data(),
+                                                                      beginTensorShape.size()),
+                              ::tflite::TensorType_INT32,
+                              1,
+                              flatBufferBuilder.CreateString("begin_tensor"));
+    tensors[2] = CreateTensor(flatBufferBuilder,
+                              flatBufferBuilder.CreateVector<int32_t>(endTensorShape.data(),
+                                                                      endTensorShape.size()),
+                              ::tflite::TensorType_INT32,
+                              2,
+                              flatBufferBuilder.CreateString("end_tensor"));
+    tensors[3] = CreateTensor(flatBufferBuilder,
+                              flatBufferBuilder.CreateVector<int32_t>(strideTensorShape.data(),
+                                                                      strideTensorShape.size()),
+                              ::tflite::TensorType_INT32,
+                              3,
+                              flatBufferBuilder.CreateString("stride_tensor"));
+    tensors[4] = CreateTensor(flatBufferBuilder,
+                              flatBufferBuilder.CreateVector<int32_t>(outputTensorShape.data(),
+                                                                      outputTensorShape.size()),
+                              tensorType,
+                              0,
+                              flatBufferBuilder.CreateString("output"));
+
+
+    // create operator
+    tflite::BuiltinOptions operatorBuiltinOptionsType = tflite::BuiltinOptions_StridedSliceOptions;
+    flatbuffers::Offset<void> operatorBuiltinOptions = CreateStridedSliceOptions(flatBufferBuilder,
+                                                                                 beginMask,
+                                                                                 endMask,
+                                                                                 ellipsisMask,
+                                                                                 newAxisMask,
+                                                                                 ShrinkAxisMask).Union();
+
+    const std::vector<int> operatorInputs{ 0, 1, 2, 3 };
+    const std::vector<int> operatorOutputs{ 4 };
+    flatbuffers::Offset <Operator> sliceOperator =
+            CreateOperator(flatBufferBuilder,
+                           0,
+                           flatBufferBuilder.CreateVector<int32_t>(operatorInputs.data(), operatorInputs.size()),
+                           flatBufferBuilder.CreateVector<int32_t>(operatorOutputs.data(), operatorOutputs.size()),
+                           operatorBuiltinOptionsType,
+                           operatorBuiltinOptions);
+
+    const std::vector<int> subgraphInputs{ 0, 1, 2, 3 };
+    const std::vector<int> subgraphOutputs{ 4 };
+    flatbuffers::Offset <SubGraph> subgraph =
+            CreateSubGraph(flatBufferBuilder,
+                           flatBufferBuilder.CreateVector(tensors.data(), tensors.size()),
+                           flatBufferBuilder.CreateVector<int32_t>(subgraphInputs.data(), subgraphInputs.size()),
+                           flatBufferBuilder.CreateVector<int32_t>(subgraphOutputs.data(), subgraphOutputs.size()),
+                           flatBufferBuilder.CreateVector(&sliceOperator, 1));
+
+    flatbuffers::Offset <flatbuffers::String> modelDescription =
+            flatBufferBuilder.CreateString("ArmnnDelegate: StridedSlice Operator Model");
+    flatbuffers::Offset <OperatorCode> operatorCode = CreateOperatorCode(flatBufferBuilder,
+                                                                         BuiltinOperator_STRIDED_SLICE);
+
+    flatbuffers::Offset <Model> flatbufferModel =
+            CreateModel(flatBufferBuilder,
+                        TFLITE_SCHEMA_VERSION,
+                        flatBufferBuilder.CreateVector(&operatorCode, 1),
+                        flatBufferBuilder.CreateVector(&subgraph, 1),
+                        modelDescription,
+                        flatBufferBuilder.CreateVector(buffers.data(), buffers.size()));
+
+    flatBufferBuilder.Finish(flatbufferModel);
+
+    return std::vector<char>(flatBufferBuilder.GetBufferPointer(),
+                             flatBufferBuilder.GetBufferPointer() + flatBufferBuilder.GetSize());
+}
+
+template <typename T>
+void StridedSliceTestImpl(std::vector<armnn::BackendId>& backends,
+                          std::vector<T>& inputValues,
+                          std::vector<T>& expectedOutputValues,
+                          std::vector<int32_t>& beginTensorData,
+                          std::vector<int32_t>& endTensorData,
+                          std::vector<int32_t>& strideTensorData,
+                          std::vector<int32_t>& inputTensorShape,
+                          std::vector<int32_t>& beginTensorShape,
+                          std::vector<int32_t>& endTensorShape,
+                          std::vector<int32_t>& strideTensorShape,
+                          std::vector<int32_t>& outputTensorShape,
+                          const int32_t beginMask = 0,
+                          const int32_t endMask = 0,
+                          const int32_t ellipsisMask = 0,
+                          const int32_t newAxisMask = 0,
+                          const int32_t ShrinkAxisMask = 0,
+                          const armnn::DataLayout& dataLayout = armnn::DataLayout::NHWC)
+{
+    using namespace tflite;
+    std::vector<char> modelBuffer = CreateStridedSliceTfLiteModel(
+            ::tflite::TensorType_FLOAT32,
+            inputTensorShape,
+            beginTensorData,
+            endTensorData,
+            strideTensorData,
+            beginTensorShape,
+            endTensorShape,
+            strideTensorShape,
+            outputTensorShape,
+            beginMask,
+            endMask,
+            ellipsisMask,
+            newAxisMask,
+            ShrinkAxisMask,
+            dataLayout);
+
+    auto tfLiteModel = GetModel(modelBuffer.data());
+
+    // Create TfLite Interpreters
+    std::unique_ptr<Interpreter> armnnDelegate;
+    CHECK(InterpreterBuilder(tfLiteModel, ::tflite::ops::builtin::BuiltinOpResolver())
+              (&armnnDelegate) == kTfLiteOk);
+    CHECK(armnnDelegate != nullptr);
+    CHECK(armnnDelegate->AllocateTensors() == kTfLiteOk);
+
+    std::unique_ptr<Interpreter> tfLiteDelegate;
+    CHECK(InterpreterBuilder(tfLiteModel, ::tflite::ops::builtin::BuiltinOpResolver())
+              (&tfLiteDelegate) == kTfLiteOk);
+    CHECK(tfLiteDelegate != nullptr);
+    CHECK(tfLiteDelegate->AllocateTensors() == kTfLiteOk);
+
+    // Create the ArmNN Delegate
+    armnnDelegate::DelegateOptions delegateOptions(backends);
+    std::unique_ptr<TfLiteDelegate, decltype(&armnnDelegate::TfLiteArmnnDelegateDelete)>
+                                   theArmnnDelegate(armnnDelegate::TfLiteArmnnDelegateCreate(delegateOptions),
+                                                    armnnDelegate::TfLiteArmnnDelegateDelete);
+    CHECK(theArmnnDelegate != nullptr);
+
+    // Modify armnnDelegateInterpreter to use armnnDelegate
+    CHECK(armnnDelegate->ModifyGraphWithDelegate(theArmnnDelegate.get()) == kTfLiteOk);
+
+    // Set input data
+    armnnDelegate::FillInput<T>(tfLiteDelegate, 0, inputValues);
+    armnnDelegate::FillInput<T>(armnnDelegate, 0, inputValues);
+
+    // Run EnqueWorkload
+    CHECK(tfLiteDelegate->Invoke() == kTfLiteOk);
+    CHECK(armnnDelegate->Invoke() == kTfLiteOk);
+
+    // Compare output data
+    armnnDelegate::CompareOutputData<T>(tfLiteDelegate,
+                                        armnnDelegate,
+                                        outputTensorShape,
+                                        expectedOutputValues);
+
+    tfLiteDelegate.reset(nullptr);
+    armnnDelegate.reset(nullptr);
+} // End of StridedSlice Test
+
+} // anonymous namespace
\ No newline at end of file
