diff --git a/src/backends/backendsCommon/test/layerTests/UnidirectionalSequenceLstmTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/UnidirectionalSequenceLstmTestImpl.cpp
new file mode 100644
index 0000000..ac22d5d
--- /dev/null
+++ b/src/backends/backendsCommon/test/layerTests/UnidirectionalSequenceLstmTestImpl.cpp
@@ -0,0 +1,1030 @@
+//
+// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "UnidirectionalSequenceLstmTestImpl.hpp"
+
+#include <armnn/utility/NumericCast.hpp>
+
+#include <backendsCommon/TensorHandle.hpp>
+
+#include <backendsCommon/test/TensorCopyUtils.hpp>
+#include <backendsCommon/test/WorkloadTestUtils.hpp>
+
+#include <ResolveType.hpp>
+
+namespace {
+
+template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
+LayerTestResult<T, 3> UnidirectionalSequenceLstmLayerFloat32TestImpl(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::ITensorHandleFactory& tensorHandleFactory,
+    const std::vector<T>& input,
+    const std::vector<T>& outputExpected,
+    const armnn::TensorShape& inputShape,
+    const armnn::TensorShape& outputExpectedShape,
+    float qScale = 0.0f,
+    int32_t qOffset = 0,
+    armnn::DataType constantDataType = armnn::DataType::Float32) {
+    IgnoreUnused(memoryManager);
+    unsigned int batchSize = armnn::numeric_cast<unsigned int>(inputShape[0]);
+    unsigned int timeSize = armnn::numeric_cast<unsigned int>(inputShape[1]);
+    unsigned int inputSize = armnn::numeric_cast<unsigned int>(inputShape[2]);
+    unsigned int outputSize = armnn::numeric_cast<unsigned int>(outputExpectedShape[2]);
+    unsigned numUnits = outputSize;
+
+    armnn::TensorInfo inputTensorInfo({batchSize, timeSize, inputSize}, ArmnnType, qScale, qOffset);
+    armnn::TensorInfo cellStateInTensorInfo({batchSize, numUnits}, ArmnnType, qScale, qOffset);
+    armnn::TensorInfo outputStateInTensorInfo({batchSize, outputSize}, ArmnnType, qScale, qOffset);
+
+    armnn::TensorInfo outputTensorInfo({batchSize, timeSize, outputSize}, ArmnnType, qScale, qOffset);
+
+    std::vector<T> inputVector;
+    inputVector.assign(input.data(), input.data() + (batchSize * timeSize * inputSize));
+
+    std::vector<T> cellStateInVector(batchSize * numUnits, T());
+    std::vector<T> outputStateInVector(batchSize * outputSize, T());
+
+    std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
+
+    std::vector<T> outputVector;
+    outputVector.assign(outputExpected.data(), outputExpected.data() + (batchSize * timeSize * outputSize));
+
+    std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
+    std::unique_ptr<armnn::ITensorHandle> cellStateInHandle =
+        tensorHandleFactory.CreateTensorHandle(cellStateInTensorInfo);
+    std::unique_ptr<armnn::ITensorHandle> outputStateInHandle =
+        tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo);
+
+    std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
+
+    armnn::UnidirectionalSequenceLstmQueueDescriptor data;
+    armnn::WorkloadInfo info;
+
+    AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
+    AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get());
+    AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get());
+
+    AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
+
+    armnn::TensorInfo tensorInfo4({numUnits}, constantDataType, qScale, qOffset);
+    armnn::TensorInfo tensorInfo12({numUnits, 3}, constantDataType, qScale, qOffset);
+    armnn::TensorInfo tensorInfo16({numUnits, 4}, constantDataType, qScale, qOffset);
+
+    std::vector<float> inputToInputWeights = { -0.49536117f, -0.0556083915f, -0.102400711f,
+                                               -0.117484632f, 0.3298470976f, -0.1179017122f,
+                                               0.214305695f, 0.42135173085f, 0.003878414626f,
+                                               -0.348303917f, -0.1881275477f, 0.0343011027f };
+
+    std::vector<float> inputToForgetWeights = { 0.2415594226f, 0.15400093799f, 0.4566498398f,
+                                                -0.3810434485f, 0.268383264f, -0.009807467424f,
+                                                -0.3522925403f, -0.24275735512f, -0.28344226125f,
+                                                0.13512269116f, -0.4932442977f, -0.10039821991f };
+
+    std::vector<float> inputToCellWeights = { -0.2504855627f, 0.184490025045f, -0.2480507493f,
+                                              0.386399507f, -0.259465157985f, -0.16545993089f,
+                                              -0.4230232555f, 0.341664791103f, -0.18127849691f,
+                                              -0.2277662414f, -0.55275535589f, 0.34184026718f };
+
+    std::vector<float> inputToOutputWeights = { 0.2303854227f, 0.5218806862f, -0.4865379333f,
+                                                0.53969591851f, 0.23393625035f, -0.27140527306f,
+                                                0.50009280443f, 0.07511717046f, 0.3998299249f,
+                                                -0.51717478049f, 0.1889653282f, -0.367323637f };
+
+    std::vector<float> recurrentToInputWeights = { -0.128009796112f, 0.1995525098f, -0.07745539397f, 0.1558421701f,
+                                                   -0.265254765766f, -0.38837709614f, -0.05636804124f, 0.4259087456f,
+                                                   0.17628988623f, 0.3877420127f, 0.53300309181f, -0.0959980934f,
+                                                   0.00302857416f, 0.3266998827f, -0.142509296562f, -0.04433270756f };
+
+    std::vector<float> recurrentToForgetWeights = { -0.09499983487f, -0.08814888417f, -0.04834804721f, 0.1516668247f,
+                                                    -0.3967529535f, -0.06463699788f, 0.4952811002f, 0.003274492938f,
+                                                    -0.0968840941f, 0.17928104102f, 0.0031281141592f, -0.3387276584f,
+                                                    -0.3587934076f, 0.06705895066f, 0.22463923692f, 0.1961955726f };
+
+    std::vector<float> recurrentToCellWeights = { -0.21938985582f, -0.3023648226f, -0.1170005202f, -0.3509177422f,
+                                                  -0.4286288613f, 0.2726137042f, 0.09216640889f, -0.06551410215f,
+                                                  0.20453298098f, 0.2393476665f, 0.11846517771f, 0.2630801796f,
+                                                  0.3954237699f, -0.19407111404f, 0.30412107706f, -0.27342408554f };
+
+    std::vector<float> recurrentToOutputWeights = { -0.32921677827f, 0.32624614238f, -0.1388191282f, -0.17879831790f,
+                                                    -0.15185534954f, -0.16918526583f, -0.10087361183f, -0.5436913968f,
+                                                    0.016758225858f, 0.30454617738f, -0.41493862867f, -0.005565764375f,
+                                                    -0.12584099173f, -0.12319286912f, 0.2407919466f, -0.08879069983f };
+
+    std::vector<float> inputGateBias = { 0., 0., 0., 0. };
+
+    std::vector<float> forgetGateBias = { 1., 1., 1., 1. };
+
+    std::vector<float> cellBias = { 0., 0., 0., 0. };
+
+    std::vector<float> outputGateBias = { 0., 0., 0., 0. };
+
+    armnn::ScopedTensorHandle inputToInputWeightsTensor(tensorInfo12);
+    armnn::ScopedTensorHandle inputToForgetWeightsTensor(tensorInfo12);
+    armnn::ScopedTensorHandle inputToCellWeightsTensor(tensorInfo12);
+    armnn::ScopedTensorHandle inputToOutputWeightsTensor(tensorInfo12);
+    armnn::ScopedTensorHandle recurrentToInputWeightsTensor(tensorInfo16);
+    armnn::ScopedTensorHandle recurrentToForgetWeightsTensor(tensorInfo16);
+    armnn::ScopedTensorHandle recurrentToCellWeightsTensor(tensorInfo16);
+    armnn::ScopedTensorHandle recurrentToOutputWeightsTensor(tensorInfo16);
+    armnn::ScopedTensorHandle inputGateBiasTensor(tensorInfo4);
+    armnn::ScopedTensorHandle forgetGateBiasTensor(tensorInfo4);
+    armnn::ScopedTensorHandle cellBiasTensor(tensorInfo4);
+    armnn::ScopedTensorHandle outputGateBiasTensor(tensorInfo4);
+
+    AllocateAndCopyDataToITensorHandle(&inputToInputWeightsTensor, inputToInputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToForgetWeightsTensor, inputToForgetWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToCellWeightsTensor, inputToCellWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToOutputWeightsTensor, inputToOutputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToInputWeightsTensor, recurrentToInputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToForgetWeightsTensor, recurrentToForgetWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToCellWeightsTensor, recurrentToCellWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToOutputWeightsTensor, recurrentToOutputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputGateBiasTensor, inputGateBias.data());
+    AllocateAndCopyDataToITensorHandle(&forgetGateBiasTensor, forgetGateBias.data());
+    AllocateAndCopyDataToITensorHandle(&cellBiasTensor, cellBias.data());
+    AllocateAndCopyDataToITensorHandle(&outputGateBiasTensor, outputGateBias.data());
+
+    data.m_InputToInputWeights = &inputToInputWeightsTensor;
+    data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
+    data.m_InputToCellWeights = &inputToCellWeightsTensor;
+    data.m_InputToOutputWeights = &inputToOutputWeightsTensor;
+    data.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
+    data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
+    data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
+    data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;
+    data.m_InputGateBias = &inputGateBiasTensor;
+    data.m_ForgetGateBias = &forgetGateBiasTensor;
+    data.m_CellBias = &cellBiasTensor;
+    data.m_OutputGateBias = &outputGateBiasTensor;
+
+    // Flags to set test configuration
+    data.m_Parameters.m_ClippingThresCell = 10;
+    data.m_Parameters.m_ClippingThresProj = 0;
+    data.m_Parameters.m_ActivationFunc = 4;
+    data.m_Parameters.m_CifgEnabled = false;
+    data.m_Parameters.m_PeepholeEnabled = false;
+    data.m_Parameters.m_ProjectionEnabled = false;
+    data.m_Parameters.m_TimeMajor = false;
+
+    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateUnidirectionalSequenceLstm(data, info);
+    inputHandle->Allocate();
+    outputStateInHandle->Allocate();
+    cellStateInHandle->Allocate();
+
+    outputHandle->Allocate();
+
+    CopyDataToITensorHandle(inputHandle.get(), inputVector.data());
+    CopyDataToITensorHandle(outputStateInHandle.get(), outputStateInVector.data());
+    CopyDataToITensorHandle(cellStateInHandle.get(), cellStateInVector.data());
+
+    workload->Execute();
+
+    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
+
+    return LayerTestResult<T, 3>(actualOutput,
+                                 outputVector,
+                                 outputHandle->GetShape(),
+                                 outputTensorInfo.GetShape());
+}
+
+template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
+LayerTestResult<T, 3>
+UnidirectionalSequenceLstmLayerFloat32TimeMajorTestImpl(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::ITensorHandleFactory& tensorHandleFactory,
+    const std::vector<T>& input,
+    const std::vector<T>& outputExpected,
+    const armnn::TensorShape& inputShape,
+    const armnn::TensorShape& outputExpectedShape,
+    float qScale = 0.0f,
+    int32_t qOffset = 0,
+    armnn::DataType constantDataType = armnn::DataType::Float32) {
+    IgnoreUnused(memoryManager);
+    unsigned int batchSize = armnn::numeric_cast<unsigned int>(inputShape[1]);
+    unsigned int timeSize = armnn::numeric_cast<unsigned int>(inputShape[0]);
+    unsigned int inputSize = armnn::numeric_cast<unsigned int>(inputShape[2]);
+    unsigned int outputSize = armnn::numeric_cast<unsigned int>(outputExpectedShape[2]);
+    unsigned numUnits = outputSize;
+
+    armnn::TensorInfo inputTensorInfo({timeSize, batchSize, inputSize}, ArmnnType, qScale, qOffset);
+    armnn::TensorInfo cellStateInTensorInfo({batchSize, numUnits}, ArmnnType, qScale, qOffset);
+    armnn::TensorInfo outputStateInTensorInfo({batchSize, outputSize}, ArmnnType, qScale, qOffset);
+
+    armnn::TensorInfo outputTensorInfo({timeSize, batchSize, outputSize}, ArmnnType, qScale, qOffset);
+
+    std::vector<T> inputVector;
+    inputVector.assign(input.data(), input.data() + (batchSize * timeSize * inputSize));
+
+    std::vector<T> cellStateInVector(batchSize * numUnits, T());
+    std::vector<T> outputStateInVector(batchSize * outputSize, T());
+
+    std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
+
+    std::vector<T> outputVector;
+    outputVector.assign(outputExpected.data(), outputExpected.data() + (batchSize * timeSize * outputSize));
+
+    std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
+    std::unique_ptr<armnn::ITensorHandle> cellStateInHandle =
+        tensorHandleFactory.CreateTensorHandle(cellStateInTensorInfo);
+    std::unique_ptr<armnn::ITensorHandle> outputStateInHandle =
+        tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo);
+
+    std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
+
+    armnn::UnidirectionalSequenceLstmQueueDescriptor data;
+    armnn::WorkloadInfo info;
+
+    AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
+    AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get());
+    AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get());
+
+    AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
+
+    armnn::TensorInfo tensorInfo4({numUnits}, constantDataType, qScale, qOffset);
+    armnn::TensorInfo tensorInfo12({numUnits, 3}, constantDataType, qScale, qOffset);
+    armnn::TensorInfo tensorInfo16({numUnits, 4}, constantDataType, qScale, qOffset);
+
+    std::vector<float> inputToInputWeights = { 0.27277296781539917f, 0.3813590407371521f, -0.394489049911499f,
+                                               0.2782636880874634f, -0.3793870210647583f, -0.018918335437774658f,
+                                               0.2724653482437134f, -0.19314253330230713f, -0.2947450876235962f,
+                                               -0.30253493785858154f, 0.4241350293159485f, -0.22560018301010132f };
+
+    std::vector<float> inputToForgetWeights = { -0.2667974531650543f, -0.05505800247192383f, -0.20932340621948242f,
+                                                -0.14345619082450867f, 0.09666192531585693f, -0.2604355812072754f,
+                                                -0.2681812047958374f, -0.3314584493637085f, 0.4485899806022644f,
+                                                -0.23467743396759033f, 0.5072842240333557f, -0.4192768931388855f };
+
+    std::vector<float> inputToCellWeights = { -0.15782442688941956f, -0.027530014514923096f, 0.4789854884147644f,
+                                              0.23227906227111816f, 0.28259342908859253f, -0.030095696449279785f,
+                                              0.10071521997451782f, -0.08535495400428772f, 0.18563997745513916f,
+                                              -0.3049069046974182f, -0.478048175573349f, 0.025234103202819824f };
+
+    std::vector<float> inputToOutputWeights = { -0.04584759473800659f, -0.2716066539287567f, 0.012970447540283203f,
+                                                -0.4729190170764923f, -0.37422770261764526f, 0.49352723360061646f,
+                                                0.3163864016532898f, -0.436781644821167f, -0.33074596524238586f,
+                                                -0.32885751128196716f, -0.40959352254867554f, -0.2124689817428589f };
+
+    std::vector<float> recurrentToInputWeights = { 0.23788475990f, -0.24948765337f, 0.50044941902f, 0.14431896805f,
+                                                   -0.115940228137f, -0.717082679f, -0.17208620906f, 0.17850610617f,
+                                                   -0.16702319684f, -0.11384502053f, -0.309785276245f, -0.3316611672f,
+                                                   0.52380162477f, -0.06839632987f, -0.391478359627f, -0.10756178963f };
+
+    std::vector<float> recurrentToForgetWeights = { 0.11383482068f, 0.1676601767f, -0.08550968004f, 0.03399394089f,
+                                                    0.08042152225f, -0.2133381964f, 0.05182432704f, 0.38161808255f,
+                                                    -0.5018365979f, -0.08043262364f, 0.07894329014f, -0.07547105155f,
+                                                    0.12047368288f, 0.2986997961f, 0.0485043078f, -0.13372567296f };
+
+    std::vector<float> recurrentToCellWeights = { 0.0433832928545f, 0.07587072294f, -0.120520234107f, 0.604576051f,
+                                                  -0.434353142986f, 0.009314475068f, 0.005085289478f, 0.08488202038f,
+                                                  -0.00025437487886f, 0.15245915082f, -0.1936587542f, 0.004754020f,
+                                                  -0.1582719236f, 0.3307867646f, 0.0236605107784f, 0.307716339826f };
+
+    std::vector<float> recurrentToOutputWeights = { -0.079031050201f, 0.041414566286f, -0.583727357285f, 0.1025384515f,
+                                                    -0.172372072937f, 0.09214124082f, 0.178184121827f, -0.2439443916f,
+                                                    0.104485116899f, 0.2600405514f, 0.064414866268f, 0.24141204357f,
+                                                    0.281875759363f, -0.14234502664f, 0.15126448862f, -0.24421440064f };
+
+    std::vector<float> inputGateBias = { 0., 0., 0., 0. };
+
+    std::vector<float> forgetGateBias = { 1., 1., 1., 1. };
+
+    std::vector<float> cellBias = { 0., 0., 0., 0. };
+
+    std::vector<float> outputGateBias = { 0., 0., 0., 0. };
+
+    armnn::ScopedTensorHandle inputToInputWeightsTensor(tensorInfo12);
+    armnn::ScopedTensorHandle inputToForgetWeightsTensor(tensorInfo12);
+    armnn::ScopedTensorHandle inputToCellWeightsTensor(tensorInfo12);
+    armnn::ScopedTensorHandle inputToOutputWeightsTensor(tensorInfo12);
+    armnn::ScopedTensorHandle recurrentToInputWeightsTensor(tensorInfo16);
+    armnn::ScopedTensorHandle recurrentToForgetWeightsTensor(tensorInfo16);
+    armnn::ScopedTensorHandle recurrentToCellWeightsTensor(tensorInfo16);
+    armnn::ScopedTensorHandle recurrentToOutputWeightsTensor(tensorInfo16);
+    armnn::ScopedTensorHandle inputGateBiasTensor(tensorInfo4);
+    armnn::ScopedTensorHandle forgetGateBiasTensor(tensorInfo4);
+    armnn::ScopedTensorHandle cellBiasTensor(tensorInfo4);
+    armnn::ScopedTensorHandle outputGateBiasTensor(tensorInfo4);
+
+    AllocateAndCopyDataToITensorHandle(&inputToInputWeightsTensor, inputToInputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToForgetWeightsTensor, inputToForgetWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToCellWeightsTensor, inputToCellWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToOutputWeightsTensor, inputToOutputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToInputWeightsTensor, recurrentToInputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToForgetWeightsTensor, recurrentToForgetWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToCellWeightsTensor, recurrentToCellWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToOutputWeightsTensor, recurrentToOutputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputGateBiasTensor, inputGateBias.data());
+    AllocateAndCopyDataToITensorHandle(&forgetGateBiasTensor, forgetGateBias.data());
+    AllocateAndCopyDataToITensorHandle(&cellBiasTensor, cellBias.data());
+    AllocateAndCopyDataToITensorHandle(&outputGateBiasTensor, outputGateBias.data());
+
+    data.m_InputToInputWeights = &inputToInputWeightsTensor;
+    data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
+    data.m_InputToCellWeights = &inputToCellWeightsTensor;
+    data.m_InputToOutputWeights = &inputToOutputWeightsTensor;
+    data.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
+    data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
+    data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
+    data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;
+    data.m_InputGateBias = &inputGateBiasTensor;
+    data.m_ForgetGateBias = &forgetGateBiasTensor;
+    data.m_CellBias = &cellBiasTensor;
+    data.m_OutputGateBias = &outputGateBiasTensor;
+
+    // Flags to set test configuration
+    data.m_Parameters.m_ClippingThresCell = 10;
+    data.m_Parameters.m_ClippingThresProj = 0;
+    data.m_Parameters.m_ActivationFunc = 4;
+    data.m_Parameters.m_CifgEnabled = false;
+    data.m_Parameters.m_PeepholeEnabled = false;
+    data.m_Parameters.m_ProjectionEnabled = false;
+    data.m_Parameters.m_TimeMajor = true;
+
+    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateUnidirectionalSequenceLstm(data, info);
+    inputHandle->Allocate();
+    outputStateInHandle->Allocate();
+    cellStateInHandle->Allocate();
+
+    outputHandle->Allocate();
+
+    CopyDataToITensorHandle(inputHandle.get(), inputVector.data());
+    CopyDataToITensorHandle(outputStateInHandle.get(), outputStateInVector.data());
+    CopyDataToITensorHandle(cellStateInHandle.get(), cellStateInVector.data());
+
+    workload->Execute();
+
+    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
+
+    return LayerTestResult<T, 3>(actualOutput,
+                                 outputVector,
+                                 outputHandle->GetShape(),
+                                 outputTensorInfo.GetShape());
+}
+
+} // anonymous namespace
+
+LayerTestResult<float, 3> UnidirectionalSequenceLstmLayerFloat32Test(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::ITensorHandleFactory& tensorHandleFactory) {
+    armnn::TensorInfo inputInfo({3, 2, 3}, armnn::DataType::Float32);
+    std::vector<float> input = { 1., 2., 3., 4., 5., 4.,
+                                 3., 2., 1., 2., 3., 4.,
+                                 5., 4., 3., 2., 1., 2. };
+
+    armnn::TensorInfo outputInfo({3, 2, 4}, armnn::DataType::Float32);
+    std::vector<float> expectedOutput = { -0.07149004f, -0.1621171f, -0.17516759f, -0.0232934225f,
+                                          -0.16810727f, -0.41412935f, -0.5498753f, -0.00803578f,
+                                          -0.06687349f, 0.204077631f, -0.4276504f, -0.03123213f,
+                                          -0.12000261f, -0.0941918f, -0.45639035f, -0.02870186f,
+                                          -0.03429216f, 0.20824050f, -0.6569892f, -0.004152651f,
+                                          -0.10493034f,  0.14210969f, -0.58347696f, -0.03297536f };
+    return UnidirectionalSequenceLstmLayerFloat32TestImpl<armnn::DataType::Float32>(
+        workloadFactory, memoryManager, tensorHandleFactory,
+        input, expectedOutput, inputInfo.GetShape(), outputInfo.GetShape());
+}
+
+LayerTestResult<float, 3> UnidirectionalSequenceLstmLayerFloat32TimeMajorTest(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::ITensorHandleFactory& tensorHandleFactory) {
+    armnn::TensorInfo inputInfo({2, 3, 3}, armnn::DataType::Float32);
+    std::vector<float> input = { 1., 2., 3., 4., 5., 4.,
+                                 3., 2., 1., 2., 3., 4.,
+                                 5., 4., 3., 2., 1., 2. };
+
+    armnn::TensorInfo outputInfo({2, 3, 4}, armnn::DataType::Float32);
+    std::vector<float> expectedOutput = { 0.135657698f, 0.124672532f, 0.0212090332f, -0.0530203655f,
+                                          0.106138252f, 0.0404792242f, 0.0151643595f, -0.00675163185f,
+                                          -0.0128514022f, 0.0644884035f, 0.0709072053f, -0.0454045124f,
+                                          0.16288602f,  0.16649379f,  0.02770456f, -0.03698075f,
+                                          0.11171641f,  0.043119f  ,  0.0762981f , -0.01228541f,
+                                          0.10439701f,  0.21439962f,  0.11919238f, -0.08390583f };
+    return UnidirectionalSequenceLstmLayerFloat32TimeMajorTestImpl<armnn::DataType::Float32>(
+        workloadFactory, memoryManager, tensorHandleFactory,
+        input, expectedOutput, inputInfo.GetShape(), outputInfo.GetShape());
+}
+
+LayerTestResult<float, 3> UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithProjectionTest(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::ITensorHandleFactory& tensorHandleFactory)
+{
+    IgnoreUnused(memoryManager);
+    unsigned int batchSize = 2;
+    unsigned int timeSize = 3;
+    unsigned int outputSize = 5;
+    unsigned int inputSize = 4;
+    unsigned numUnits = 6;
+
+    armnn::TensorInfo inputTensorInfo({batchSize, timeSize, inputSize}, armnn::DataType::Float32);
+    armnn::TensorInfo cellStateInTensorInfo({batchSize , numUnits}, armnn::DataType::Float32);
+    armnn::TensorInfo outputStateInTensorInfo({batchSize , outputSize}, armnn::DataType::Float32);
+    armnn::TensorInfo outputTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32);
+
+    const std::vector<float> inputVector = { 1., 2., 3., 4., 5., 4.,
+                                             3., 2., 1., 2., 3., 4.,
+                                             5., 4., 3., 2., 1., 2.,
+                                             1., 2., 3., 4., 5., 4.};
+
+    std::vector<float> cellStateInVector(batchSize * numUnits, 0.f);
+    std::vector<float> outputStateInVector(batchSize * outputSize, 0.f);
+
+    std::vector<float> actualOutput(outputTensorInfo.GetNumElements());
+
+    const std::vector<float> expectedOutput = { -0.0135612f, -0.0263441f, 0.0314008f, -0.00883455f, 0.00763052f,
+                                                -0.00126877f, -0.0292959f, 0.0449957f, -0.00976195f, -0.00492338f,
+                                                -0.0175702f, -0.0431753f, 0.0597117f, -0.0169154f, 0.0142087f,
+                                                0.00472515f, -0.0196355f, 0.0342524f, -0.00407936f, -0.0253189f,
+                                                -0.00512944f, -0.0293754f, 0.0512771f, -0.0151874f, -0.0246433f,
+                                                -0.00744986f, -0.0345103f, 0.0450666f, -0.00944991f, 0.0127171f };
+
+    std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
+    std::unique_ptr<armnn::ITensorHandle> cellStateInHandle =
+            tensorHandleFactory.CreateTensorHandle(cellStateInTensorInfo);
+    std::unique_ptr<armnn::ITensorHandle> outputStateInHandle =
+            tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo);
+    std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
+
+    armnn::UnidirectionalSequenceLstmQueueDescriptor data;
+    armnn::WorkloadInfo info;
+
+    AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
+    AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get());
+    AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get());
+    AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
+
+    armnn::TensorInfo tensorInfo5({outputSize}, armnn::DataType::Float32);
+    armnn::TensorInfo tensorInfo6({numUnits}, armnn::DataType::Float32);
+    armnn::TensorInfo tensorInfo6x4({numUnits, inputSize}, armnn::DataType::Float32);
+    armnn::TensorInfo tensorInfo6x5({numUnits, outputSize}, armnn::DataType::Float32);
+    armnn::TensorInfo tensorInfo5x6({outputSize, numUnits}, armnn::DataType::Float32);
+
+    std::vector<float> inputToInputWeights = { 0.021393683f, 0.06124551f, 0.046905167f, -0.014657677f,
+                                               -0.03149463f, 0.09171803f, 0.14647801f, 0.10797193f,
+                                               -0.0057968358f, 0.0019193048f, -0.2726754f, 0.10154029f,
+                                               -0.018539885f, 0.080349885f, -0.10262385f, -0.022599787f,
+                                               -0.09121155f, -0.008675967f, -0.045206103f, -0.0821282f,
+                                               -0.008045952f, 0.015478081f, 0.055217247f, 0.038719587f };
+
+    std::vector<float> inputToForgetWeights = { -0.0018401089f, -0.004852237f, 0.03698424f, 0.014181704f,
+                                                0.028273236f, -0.016726194f, -0.05249759f, -0.10204261f,
+                                                0.00861066f, -0.040979505f, -0.009899187f, 0.01923892f,
+                                                -0.028177269f, -0.08535103f, -0.14585495f, 0.10662567f,
+                                                -0.01909731f, -0.017883534f, -0.0047269356f, -0.045103323f,
+                                                0.0030784295f, 0.076784775f, 0.07463696f, 0.094531395f};
+
+    std::vector<float> inputToCellWeights = { -0.04580283f, -0.09549462f, -0.032418985f, -0.06454633f,
+                                              -0.043528453f, 0.043018587f, -0.049152344f, -0.12418144f,
+                                              -0.078985475f, -0.07596889f, 0.019484362f, -0.11434962f,
+                                              -0.0074034138f, -0.06314844f, -0.092981495f, 0.0062155537f,
+                                              -0.025034338f, -0.0028890965f, 0.048929527f, 0.06235075f,
+                                              0.10665918f, -0.032036792f, -0.08505916f, -0.10843358f };
+
+    std::vector<float> inputToOutputWeights = { -0.0998932f, -0.07201956f, -0.052803773f, -0.15629593f,
+                                                -0.15001918f, -0.07650751f, 0.02359855f, -0.075155355f,
+                                                -0.08037709f, -0.15093534f, 0.029517552f, -0.04751393f,
+                                                0.010350531f, -0.02664851f, -0.016839722f, -0.023121163f,
+                                                0.0077019283f, 0.012851257f, -0.05040649f, -0.0129761f,
+                                                -0.021737747f, -0.038305793f, -0.06870586f, -0.01481247f };
+
+    std::vector<float> inputGateBias = { 0.02234832f, 0.14757581f, 0.18176508f,
+                                         0.10380666f, 0.053110216f, -0.06928846f };
+
+    std::vector<float> forgetGateBias = { 0.035185695f, -0.042891346f, -0.03032477f,
+                                          0.23027696f, 0.11098921f, 0.08989442f };
+
+    std::vector<float> cellBias = { -0.024379363f, 0.0055531194f, 0.23377132f,
+                                    0.033463873f, -0.1483596f, 0.029460307f };
+
+    std::vector<float> outputGateBias = { 0.046159424f, -0.0012809046f, 0.03563469f,
+                                          0.12648113f, 0.027195795f, 0.35373217f };
+
+    std::vector<float> recurrentToInputWeights = { -0.001374326f, -0.078856036f, 0.10672688f, 0.029162422f,
+                                                   -0.11585556f, 0.02557986f, -0.13446963f, -0.035785314f,
+                                                   -0.01244275f, 0.025961924f, -0.02337298f, -0.044228926f,
+                                                   -0.055839065f, -0.046598054f, -0.010546039f, -0.06900766f,
+                                                   0.027239809f, 0.022582639f, -0.013296484f, -0.05459212f,
+                                                   0.08981f, -0.045407712f, 0.08682226f, -0.06867011f,
+                                                   -0.14390695f, -0.02916037f, 0.000996957f, 0.091420636f,
+                                                   0.14283475f, -0.07390571f };
+
+    std::vector<float> recurrentToCellWeights = { -0.037322544f, 0.018592842f, 0.0056175636f, -0.06253426f,
+                                                   0.055647098f, -0.05713207f, -0.05626563f, 0.005559383f,
+                                                   0.03375411f, -0.025757805f, -0.088049285f, 0.06017052f,
+                                                   -0.06570978f, 0.007384076f, 0.035123326f, -0.07920549f,
+                                                   0.053676967f, 0.044480428f, -0.07663568f, 0.0071805613f,
+                                                   0.08089997f, 0.05143358f, 0.038261272f, 0.03339287f,
+                                                   -0.027673481f, 0.044746667f, 0.028349208f, 0.020090483f,
+                                                   -0.019443132f, -0.030755889f };
+
+    std::vector<float> recurrentToForgetWeights = { -0.057784554f, -0.026057621f, -0.068447545f, -0.022581743f,
+                                                    0.14811787f, 0.10826372f, 0.09471067f, 0.03987225f,
+                                                    -0.0039523416f, 0.00030638507f, 0.053185795f, 0.10572994f,
+                                                    0.08414449f, -0.022036452f, -0.00066928595f, -0.09203576f,
+                                                    0.032950465f, -0.10985798f, -0.023809856f, 0.0021431844f,
+                                                    -0.02196096f, -0.00326074f, 0.00058621005f, -0.074678116f,
+                                                    -0.06193199f, 0.055729095f, 0.03736828f, 0.020123724f,
+                                                    0.061878487f, -0.04729229f };
+
+    std::vector<float> recurrentToOutputWeights = { 0.025825322f, -0.05813119f, 0.09495884f,
+                                                    -0.045984812f,-0.01255415f, -0.0026479573f,
+                                                    -0.08196161f, -0.054914974f, -0.0046604523f,
+                                                    -0.029587349f, -0.044576716f, -0.07480124f,
+                                                    -0.082868785f, 0.023254942f, 0.027502948f,
+                                                    -0.0039728214f, -0.08683098f, -0.08116779f,
+                                                    -0.014675607f, -0.037924774f, -0.023314456f,
+                                                    -0.007401714f, -0.09255757f, 0.029460307f,
+                                                    -0.08829125f, -0.005139627f, -0.08989442f,
+                                                    -0.0555066f, 0.13596267f, 0.025062224f };
+
+    std::vector<float> cellToInputWeights = { 0.040369894f, 0.030746894f, 0.24704495f,
+                                              0.018586371f, -0.037586458f, -0.15312155f };
+
+    std::vector<float> cellToForgetWeights = { -0.01998659f, -0.15568835f, -0.24248174f,
+                                               -0.012770197f, 0.041331276f, -0.072311886f };
+
+    std::vector<float> cellToOutputWeights = { 0.08286371f, -0.08261836f, -0.51210177f,
+                                               0.002913762f, 0.17764764f, -0.5495371f };
+
+    std::vector<float> projectionWeights = { -0.009802181f, 0.09401916f, 0.0717386f, -0.13895074f, 0.09641832f,
+                                             0.060420845f, 0.08539281f, 0.054285463f, 0.061395317f, 0.034448683f,
+                                             -0.042991187f, 0.019801661f, -0.16840284f, -0.015726732f, -0.23041931f,
+                                             -0.024478018f, -0.10959692f, -0.013875541f, 0.18600968f, -0.061274476f,
+                                             0.0138165f, -0.08160894f, -0.07661644f, 0.032372914f, 0.16169067f,
+                                             0.22465782f, -0.03993472f, -0.004017731f, 0.08633481f, -0.28869787f };
+
+    std::vector<float> projectionBiasVector(outputSize, 0.f); //{outputSize}
+
+    armnn::ScopedTensorHandle inputToInputWeightsTensor(tensorInfo6x4);
+    armnn::ScopedTensorHandle inputToForgetWeightsTensor(tensorInfo6x4);
+    armnn::ScopedTensorHandle inputToCellWeightsTensor(tensorInfo6x4);
+    armnn::ScopedTensorHandle inputToOutputWeightsTensor(tensorInfo6x4);
+    armnn::ScopedTensorHandle recurrentToForgetWeightsTensor(tensorInfo6x5);
+    armnn::ScopedTensorHandle recurrentToInputWeightsTensor(tensorInfo6x5);
+    armnn::ScopedTensorHandle recurrentToCellWeightsTensor(tensorInfo6x5);
+    armnn::ScopedTensorHandle recurrentToOutputWeightsTensor(tensorInfo6x5);
+    armnn::ScopedTensorHandle cellToInputWeightsTensor(tensorInfo6);
+    armnn::ScopedTensorHandle inputGateBiasTensor(tensorInfo6);
+    armnn::ScopedTensorHandle forgetGateBiasTensor(tensorInfo6);
+    armnn::ScopedTensorHandle cellBiasTensor(tensorInfo6);
+    armnn::ScopedTensorHandle outputGateBiasTensor(tensorInfo6);
+    armnn::ScopedTensorHandle cellToForgetWeightsTensor(tensorInfo6);
+    armnn::ScopedTensorHandle cellToOutputWeightsTensor(tensorInfo6);
+    armnn::ScopedTensorHandle projectionWeightsTensor(tensorInfo5x6);
+    armnn::ScopedTensorHandle projectionBiasTensor(tensorInfo5);
+
+    AllocateAndCopyDataToITensorHandle(&inputToInputWeightsTensor, inputToInputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToForgetWeightsTensor, inputToForgetWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToCellWeightsTensor, inputToCellWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToOutputWeightsTensor, inputToOutputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToInputWeightsTensor, recurrentToInputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToForgetWeightsTensor, recurrentToForgetWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToCellWeightsTensor, recurrentToCellWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToOutputWeightsTensor, recurrentToOutputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&cellToInputWeightsTensor, cellToInputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputGateBiasTensor, inputGateBias.data());
+    AllocateAndCopyDataToITensorHandle(&forgetGateBiasTensor, forgetGateBias.data());
+    AllocateAndCopyDataToITensorHandle(&cellBiasTensor, cellBias.data());
+    AllocateAndCopyDataToITensorHandle(&outputGateBiasTensor, outputGateBias.data());
+    AllocateAndCopyDataToITensorHandle(&cellToForgetWeightsTensor, cellToForgetWeights.data());
+    AllocateAndCopyDataToITensorHandle(&cellToOutputWeightsTensor, cellToOutputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&projectionWeightsTensor, projectionWeights.data());
+    AllocateAndCopyDataToITensorHandle(&projectionBiasTensor, projectionBiasVector.data());
+
+    data.m_InputToInputWeights = &inputToInputWeightsTensor;
+    data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
+    data.m_InputToCellWeights = &inputToCellWeightsTensor;
+    data.m_InputToOutputWeights = &inputToOutputWeightsTensor;
+    data.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
+    data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
+    data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
+    data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;
+    data.m_CellToInputWeights = &cellToInputWeightsTensor;
+    data.m_InputGateBias = &inputGateBiasTensor;
+    data.m_ForgetGateBias = &forgetGateBiasTensor;
+    data.m_CellBias = &cellBiasTensor;
+    data.m_OutputGateBias = &outputGateBiasTensor;
+    data.m_CellToForgetWeights = &cellToForgetWeightsTensor;
+    data.m_CellToOutputWeights = &cellToOutputWeightsTensor;
+    data.m_ProjectionWeights = &projectionWeightsTensor;
+    data.m_ProjectionBias = &projectionBiasTensor;
+
+    // Flags to set test configuration
+    data.m_Parameters.m_ActivationFunc = 4;
+    data.m_Parameters.m_CifgEnabled = false;
+    data.m_Parameters.m_PeepholeEnabled = true;
+    data.m_Parameters.m_ProjectionEnabled = true;
+    data.m_Parameters.m_LayerNormEnabled = false;
+    data.m_Parameters.m_TimeMajor = false;
+    data.m_Parameters.m_ClippingThresCell = 10.0f;
+
+
+    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateUnidirectionalSequenceLstm(data, info);
+    inputHandle->Allocate();
+    outputStateInHandle->Allocate();
+    cellStateInHandle->Allocate();
+    outputHandle->Allocate();
+
+    CopyDataToITensorHandle(inputHandle.get(), inputVector.data());
+    CopyDataToITensorHandle(outputStateInHandle.get(), outputStateInVector.data());
+    CopyDataToITensorHandle(cellStateInHandle.get(), cellStateInVector.data());
+
+    workload->Execute();
+
+    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
+
+    return LayerTestResult<float, 3>(actualOutput,
+                                     expectedOutput,
+                                     outputHandle->GetShape(),
+                                     outputTensorInfo.GetShape());
+}
+
+LayerTestResult<float, 3> UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithProjectionWithLayerNormTest(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::ITensorHandleFactory& tensorHandleFactory)
+{
+    IgnoreUnused(memoryManager);
+    unsigned int batchSize = 3;
+    unsigned int timeSize = 2;
+    unsigned int outputSize = 4;
+    unsigned int inputSize = 3;
+    unsigned numUnits = 5;
+
+    armnn::TensorInfo inputTensorInfo({batchSize, timeSize, inputSize}, armnn::DataType::Float32);
+    armnn::TensorInfo cellStateInTensorInfo({batchSize , numUnits}, armnn::DataType::Float32);
+    armnn::TensorInfo outputStateInTensorInfo({batchSize , outputSize}, armnn::DataType::Float32);
+    armnn::TensorInfo outputTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32);
+
+    const std::vector<float> inputVector = { 1., 2., 3., 4., 5., 4.,
+                                             3., 2., 1., 2., 3., 4.,
+                                             5., 4., 3., 2., 1., 2. };
+
+    std::vector<float> cellStateInVector(batchSize * numUnits, 0.f);
+    std::vector<float> outputStateInVector(batchSize * outputSize, 0.f);
+
+    std::vector<float> actualOutput(outputTensorInfo.GetNumElements());
+
+    const std::vector<float> expectedOutput = { 0.0642256f, 0.0343966f, 0.184122f, 0.114717f,
+                                                0.11458f, 0.0407109f, 0.300327f, 0.174301f,
+                                                0.0864761f, 0.0362912f, 0.178635f, 0.115689f,
+                                                0.108008f, 0.0386623f, 0.273471f, 0.167115f,
+                                                0.0859545f, 0.0331481f, 0.186051f, 0.11888f,
+                                                0.106649f, 0.0276847f, 0.229863f, 0.166958f };
+
+    std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
+    std::unique_ptr<armnn::ITensorHandle> cellStateInHandle =
+            tensorHandleFactory.CreateTensorHandle(cellStateInTensorInfo);
+    std::unique_ptr<armnn::ITensorHandle> outputStateInHandle =
+            tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo);
+
+    std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
+
+    armnn::UnidirectionalSequenceLstmQueueDescriptor data;
+    armnn::WorkloadInfo info;
+
+    AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
+    AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get());
+    AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get());
+
+    AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
+
+    armnn::TensorInfo tensorInfo4({outputSize}, armnn::DataType::Float32);
+    armnn::TensorInfo tensorInfo5({numUnits}, armnn::DataType::Float32);
+    armnn::TensorInfo tensorInfo5x3({numUnits, inputSize}, armnn::DataType::Float32);
+    armnn::TensorInfo tensorInfo5x4({numUnits, outputSize}, armnn::DataType::Float32);
+    armnn::TensorInfo tensorInfo4x5({outputSize, numUnits}, armnn::DataType::Float32);
+
+    std::vector<float> inputToInputWeights = { -0.49536117f, -0.0556083915f, -0.102400711f,
+                                               -0.117484632f, 0.3298470976f, -0.1179017122f,
+                                               0.214305695f, 0.42135173085f, 0.003878414626f,
+                                               -0.348303917f, -0.1881275477f, 0.0343011027f,
+                                               -0.38837709614f, -0.05636804124f, 0.4259087456f};
+
+    std::vector<float> inputToForgetWeights = { 0.2415594226f, 0.15400093799f, 0.4566498398f,
+                                                -0.3810434485f, 0.268383264f, -0.009807467424f,
+                                                -0.3522925403f, -0.24275735512f, -0.28344226125f,
+                                                0.13512269116f, -0.4932442977f, -0.10039821991f,
+                                                0.2726137042f, 0.09216640889f, -0.06551410215f};
+
+    std::vector<float> inputToCellWeights = { -0.2504855627f, 0.184490025045f, -0.2480507493f,
+                                              0.386399507f, -0.259465157985f, -0.16545993089f,
+                                              -0.4230232555f, 0.341664791103f, -0.18127849691f,
+                                              -0.2277662414f, -0.55275535589f, 0.34184026718f,
+                                              0.3954237699f, -0.19407111404f, 0.30412107706f};
+
+    std::vector<float> inputToOutputWeights = { 0.2303854227f, 0.5218806862f, -0.4865379333f,
+                                                0.53969591851f, 0.23393625035f, -0.27140527306f,
+                                                0.50009280443f, 0.07511717046f, 0.3998299249f,
+                                                -0.51717478049f, 0.1889653282f, -0.367323637f,
+                                                -0.12584099173f, -0.12319286912f, 0.2407919466f};
+
+    std::vector<float> inputGateBias{ 0.03f, 0.15f, 0.22f, 0.38f, 0.05f };
+    std::vector<float> forgetGateBias{ 0.1f, -0.3f, -0.2f, 0.1f, 0.4f };
+    std::vector<float> cellBias{ -0.05f, 0.72f, 0.25f, 0.08f, 0.1f };
+    std::vector<float> outputGateBias{ 0.05f, -0.01f, 0.2f, 0.1f, -0.2f };
+
+    std::vector<float> recurrentToInputWeights = { -0.128009796112f, 0.1995525098f, -0.07745539397f, 0.1558421701f,
+                                                   -0.265254765766f, -0.38837709614f, -0.05636804124f, 0.4259087456f,
+                                                   0.17628988623f, 0.3877420127f, 0.53300309181f, -0.0959980934f,
+                                                   0.00302857416f, 0.3266998827f, -0.142509296562f, -0.04433270756f,
+                                                   0.54066205f, -0.32668582f, -0.43562764f, -0.56094903f };
+
+    std::vector<float> recurrentToForgetWeights = { -0.09499983487f, -0.08814888417f, -0.04834804721f, 0.1516668247f,
+                                                    -0.3967529535f, -0.06463699788f, 0.4952811002f, 0.003274492938f,
+                                                    -0.0968840941f, 0.17928104102f, 0.0031281141592f, -0.3387276584f,
+                                                    -0.3587934076f, 0.06705895066f, 0.22463923692f, 0.1961955726f,
+                                                    0.01841056f, -0.32764608f, -0.33027974f, -0.10826075f };
+
+    std::vector<float> recurrentToCellWeights = { -0.21938985582f, -0.3023648226f, -0.1170005202f, -0.3509177422f,
+                                                  -0.4286288613f, 0.2726137042f, 0.09216640889f, -0.06551410215f,
+                                                  0.20453298098f, 0.2393476665f, 0.11846517771f, 0.2630801796f,
+                                                  0.3954237699f, -0.19407111404f, 0.30412107706f, -0.27342408554f,
+                                                  0.19069612f, -0.03026325f, -0.54532051f, 0.33003211f };
+
+    std::vector<float> recurrentToOutputWeights = { -0.32921677827f, 0.32624614238f, -0.1388191282f, -0.17879831790f,
+                                                    -0.15185534954f, -0.16918526583f, -0.10087361183f, -0.5436913968f,
+                                                    0.016758225858f, 0.30454617738f, -0.41493862867f, -0.005565764375f,
+                                                    -0.12584099173f, -0.12319286912f, 0.2407919466f, -0.08879069983f,
+                                                    0.11178309f, 0.09481031f, -0.26424935f, 0.46261835f };
+
+    std::vector<float> cellToInputWeights { 0.05f, 0.1f, 0.25f, 0.15f, -0.02f };
+    std::vector<float> cellToForgetWeights { -0.02f, -0.15f, -0.25f, -0.03f, 0.15f };
+    std::vector<float> cellToOutputWeights { 0.1f, -0.1f, -0.5f, 0.05f, 0.01f };
+
+     std::vector<float> projectionWeights{ -0.1f, 0.2f, 0.01f, -0.2f,
+                                           0.1f, 0.5f,  0.3f, 0.08f,
+                                           0.07f, 0.2f, -0.4f,  0.2f,
+                                           0.5f, -0.4f, 0.3f, -0.2f,
+                                           0.3f, 0.08f, -0.07f, 0.2f};
+
+    std::vector<float> projectionBiasVector(outputSize, 0.f); //{outputSize}
+
+    std::vector<float> inputLayerNormWeights{ 0.1f, 0.2f, 0.3f, 0.5f, 0.8f };
+    std::vector<float> forgetLayerNormWeights{ 0.1f, 0.2f, 0.3f, 0.5f, 0.2f };
+    std::vector<float> cellLayerNormWeights{ 0.7f, 0.2f, 0.3f, 0.8f, 0.5f };
+    std::vector<float> outputLayerNormWeights{ 0.6f, 0.2f, 0.2f, 0.5f, 0.1f };
+
+    armnn::ScopedTensorHandle inputToInputWeightsTensor(tensorInfo5x3);
+    armnn::ScopedTensorHandle inputToForgetWeightsTensor(tensorInfo5x3);
+    armnn::ScopedTensorHandle inputToCellWeightsTensor(tensorInfo5x3);
+    armnn::ScopedTensorHandle inputToOutputWeightsTensor(tensorInfo5x3);
+    armnn::ScopedTensorHandle recurrentToForgetWeightsTensor(tensorInfo5x4);
+    armnn::ScopedTensorHandle recurrentToInputWeightsTensor(tensorInfo5x4);
+    armnn::ScopedTensorHandle recurrentToCellWeightsTensor(tensorInfo5x4);
+    armnn::ScopedTensorHandle recurrentToOutputWeightsTensor(tensorInfo5x4);
+    armnn::ScopedTensorHandle cellToInputWeightsTensor(tensorInfo5);
+    armnn::ScopedTensorHandle inputGateBiasTensor(tensorInfo5);
+    armnn::ScopedTensorHandle forgetGateBiasTensor(tensorInfo5);
+    armnn::ScopedTensorHandle cellBiasTensor(tensorInfo5);
+    armnn::ScopedTensorHandle outputGateBiasTensor(tensorInfo5);
+    armnn::ScopedTensorHandle cellToForgetWeightsTensor(tensorInfo5);
+    armnn::ScopedTensorHandle cellToOutputWeightsTensor(tensorInfo5);
+    armnn::ScopedTensorHandle projectionWeightsTensor(tensorInfo4x5);
+    armnn::ScopedTensorHandle projectionBiasTensor(tensorInfo4);
+
+    armnn::ScopedTensorHandle inputLayerNormWeightsTensor(tensorInfo5);
+    armnn::ScopedTensorHandle forgetLayerNormWeightsTensor(tensorInfo5);
+    armnn::ScopedTensorHandle cellLayerNormWeightsTensor(tensorInfo5);
+    armnn::ScopedTensorHandle outputLayerNormWeightsTensor(tensorInfo5);
+
+    AllocateAndCopyDataToITensorHandle(&inputToInputWeightsTensor, inputToInputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToForgetWeightsTensor, inputToForgetWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToCellWeightsTensor, inputToCellWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToOutputWeightsTensor, inputToOutputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToInputWeightsTensor, recurrentToInputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToForgetWeightsTensor, recurrentToForgetWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToCellWeightsTensor, recurrentToCellWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToOutputWeightsTensor, recurrentToOutputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&cellToInputWeightsTensor, cellToInputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputGateBiasTensor, inputGateBias.data());
+    AllocateAndCopyDataToITensorHandle(&forgetGateBiasTensor, forgetGateBias.data());
+    AllocateAndCopyDataToITensorHandle(&cellBiasTensor, cellBias.data());
+    AllocateAndCopyDataToITensorHandle(&outputGateBiasTensor, outputGateBias.data());
+    AllocateAndCopyDataToITensorHandle(&cellToForgetWeightsTensor, cellToForgetWeights.data());
+    AllocateAndCopyDataToITensorHandle(&cellToOutputWeightsTensor, cellToOutputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&projectionWeightsTensor, projectionWeights.data());
+    AllocateAndCopyDataToITensorHandle(&projectionBiasTensor, projectionBiasVector.data());
+
+    AllocateAndCopyDataToITensorHandle(&inputLayerNormWeightsTensor, inputLayerNormWeights.data());
+    AllocateAndCopyDataToITensorHandle(&forgetLayerNormWeightsTensor, forgetLayerNormWeights.data());
+    AllocateAndCopyDataToITensorHandle(&cellLayerNormWeightsTensor, cellLayerNormWeights.data());
+    AllocateAndCopyDataToITensorHandle(&outputLayerNormWeightsTensor, outputLayerNormWeights.data());
+
+    data.m_InputToInputWeights = &inputToInputWeightsTensor;
+    data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
+    data.m_InputToCellWeights = &inputToCellWeightsTensor;
+    data.m_InputToOutputWeights = &inputToOutputWeightsTensor;
+    data.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
+    data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
+    data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
+    data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;
+    data.m_CellToInputWeights = &cellToInputWeightsTensor;
+    data.m_InputGateBias = &inputGateBiasTensor;
+    data.m_ForgetGateBias = &forgetGateBiasTensor;
+    data.m_CellBias = &cellBiasTensor;
+    data.m_OutputGateBias = &outputGateBiasTensor;
+    data.m_CellToForgetWeights = &cellToForgetWeightsTensor;
+    data.m_CellToOutputWeights = &cellToOutputWeightsTensor;
+    data.m_ProjectionWeights = &projectionWeightsTensor;
+    data.m_ProjectionBias = &projectionBiasTensor;
+
+    data.m_InputLayerNormWeights = &inputLayerNormWeightsTensor;
+    data.m_ForgetLayerNormWeights = &forgetLayerNormWeightsTensor;
+    data.m_CellLayerNormWeights = &cellLayerNormWeightsTensor;
+    data.m_OutputLayerNormWeights = &outputLayerNormWeightsTensor;
+
+    // Flags to set test configuration
+    data.m_Parameters.m_ActivationFunc = 4;
+    data.m_Parameters.m_CifgEnabled = false;
+    data.m_Parameters.m_PeepholeEnabled = true;
+    data.m_Parameters.m_ProjectionEnabled = true;
+    data.m_Parameters.m_LayerNormEnabled = true;
+    data.m_Parameters.m_TimeMajor = false;
+    data.m_Parameters.m_ClippingThresCell = 10.0f;
+
+    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateUnidirectionalSequenceLstm(data, info);
+    inputHandle->Allocate();
+    outputStateInHandle->Allocate();
+    cellStateInHandle->Allocate();
+    outputHandle->Allocate();
+
+    CopyDataToITensorHandle(inputHandle.get(), inputVector.data());
+    CopyDataToITensorHandle(outputStateInHandle.get(), outputStateInVector.data());
+    CopyDataToITensorHandle(cellStateInHandle.get(), cellStateInVector.data());
+
+    workload->Execute();
+
+    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
+
+    return LayerTestResult<float, 3>(actualOutput,
+                                     expectedOutput,
+                                     outputHandle->GetShape(),
+                                     outputTensorInfo.GetShape());
+}
+
+LayerTestResult<float, 3> UnidirectionalSequenceLstmWithCifgWithPeepholeNoProjectionTest(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::ITensorHandleFactory& tensorHandleFactory)
+{
+    IgnoreUnused(memoryManager);
+    unsigned int batchSize = 3;
+    unsigned int timeSize = 2;
+    unsigned int inputSize = 3;
+    unsigned int outputSize = 4;
+    unsigned numUnits = outputSize;
+
+    armnn::TensorInfo inputTensorInfo({batchSize, timeSize, inputSize}, armnn::DataType::Float32);
+    armnn::TensorInfo cellStateInTensorInfo({batchSize, numUnits}, armnn::DataType::Float32);
+    armnn::TensorInfo outputStateInTensorInfo({batchSize, outputSize}, armnn::DataType::Float32);
+
+    armnn::TensorInfo outputTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32);
+
+    std::vector<float> inputVector = { 1., 2., 3., 4., 5., 4.,
+                                       3., 2., 1., 2., 3., 4.,
+                                       5., 4., 3., 2., 1., 2. };
+
+    std::vector<float> cellStateInVector(batchSize * numUnits, 0.f);
+    std::vector<float> outputStateInVector(batchSize * outputSize, 0.f);
+
+    std::vector<float> actualOutput(outputTensorInfo.GetNumElements());
+
+    std::vector<float> outputVector = { -0.0129257f, -0.070531f, -0.153508f, -0.0392391f,
+                                        -0.0300169f, -0.195717f, -0.528679f, -0.0818106f,
+                                        -0.0332748f, 0.155429f, -0.353966f, -0.0801505f,
+                                        -0.032312f, -0.0407911f, -0.435053f, -0.0932317f,
+                                        -0.0108233f, 0.165584f, -0.640424f, -0.0447535f,
+                                        -0.031675f, 0.125987f, -0.526695f, -0.110093f };
+
+    std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
+    std::unique_ptr<armnn::ITensorHandle> cellStateInHandle =
+        tensorHandleFactory.CreateTensorHandle(cellStateInTensorInfo);
+    std::unique_ptr<armnn::ITensorHandle> outputStateInHandle =
+        tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo);
+
+    std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
+
+    armnn::UnidirectionalSequenceLstmQueueDescriptor data;
+    armnn::WorkloadInfo info;
+
+    AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
+    AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get());
+    AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get());
+
+    AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
+
+    armnn::TensorInfo tensorInfo4({numUnits}, armnn::DataType::Float32);
+    armnn::TensorInfo tensorInfo12({numUnits, 3}, armnn::DataType::Float32);
+    armnn::TensorInfo tensorInfo16({numUnits, 4}, armnn::DataType::Float32);
+
+    std::vector<float> inputToForgetWeights = { 0.2415594226f, 0.15400093799f, 0.4566498398f,
+                                                -0.3810434485f, 0.268383264f, -0.009807467424f,
+                                                -0.3522925403f, -0.24275735512f, -0.28344226125f,
+                                                0.13512269116f, -0.4932442977f, -0.10039821991f };
+
+    std::vector<float> inputToCellWeights = { -0.2504855627f, 0.184490025045f, -0.2480507493f,
+                                              0.386399507f, -0.259465157985f, -0.16545993089f,
+                                              -0.4230232555f, 0.341664791103f, -0.18127849691f,
+                                              -0.2277662414f, -0.55275535589f, 0.34184026718f };
+
+    std::vector<float> inputToOutputWeights = { 0.2303854227f, 0.5218806862f, -0.4865379333f,
+                                                0.53969591851f, 0.23393625035f, -0.27140527306f,
+                                                0.50009280443f, 0.07511717046f, 0.3998299249f,
+                                                -0.51717478049f, 0.1889653282f, -0.367323637f };
+
+    std::vector<float> recurrentToForgetWeights = { -0.09499983487f, -0.08814888417f, -0.04834804721f, 0.1516668247f,
+                                                    -0.3967529535f, -0.06463699788f, 0.4952811002f, 0.003274492938f,
+                                                    -0.0968840941f, 0.17928104102f, 0.0031281141592f, -0.3387276584f,
+                                                    -0.3587934076f, 0.06705895066f, 0.22463923692f, 0.1961955726f };
+
+    std::vector<float> recurrentToCellWeights = { -0.21938985582f, -0.3023648226f, -0.1170005202f, -0.3509177422f,
+                                                  -0.4286288613f, 0.2726137042f, 0.09216640889f, -0.06551410215f,
+                                                  0.20453298098f, 0.2393476665f, 0.11846517771f, 0.2630801796f,
+                                                  0.3954237699f, -0.19407111404f, 0.30412107706f, -0.27342408554f };
+
+    std::vector<float> recurrentToOutputWeights = { -0.32921677827f, 0.32624614238f, -0.1388191282f, -0.17879831790f,
+                                                    -0.15185534954f, -0.16918526583f, -0.10087361183f, -0.5436913968f,
+                                                    0.016758225858f, 0.30454617738f, -0.41493862867f, -0.005565764375f,
+                                                    -0.12584099173f, -0.12319286912f, 0.2407919466f, -0.08879069983f };
+
+    std::vector<float> cellToForgetWeights{ 0.47485286f, -0.51955009f, -0.24458408f, 0.31544167f };
+
+    std::vector<float> cellToOutputWeights{ -0.17135078f, 0.82760304f, 0.85573703f, -0.77109635f };
+
+    std::vector<float> forgetGateBias = { 1., 1., 1., 1. };
+
+    std::vector<float> cellBias = { 0., 0., 0., 0. };
+
+    std::vector<float> outputGateBias = { 0., 0., 0., 0. };
+
+    armnn::ScopedTensorHandle inputToForgetWeightsTensor(tensorInfo12);
+    armnn::ScopedTensorHandle inputToCellWeightsTensor(tensorInfo12);
+    armnn::ScopedTensorHandle inputToOutputWeightsTensor(tensorInfo12);
+    armnn::ScopedTensorHandle recurrentToForgetWeightsTensor(tensorInfo16);
+    armnn::ScopedTensorHandle recurrentToCellWeightsTensor(tensorInfo16);
+    armnn::ScopedTensorHandle recurrentToOutputWeightsTensor(tensorInfo16);
+    armnn::ScopedTensorHandle cellToForgetWeightsTensor(tensorInfo4);
+    armnn::ScopedTensorHandle cellToOutputWeightsTensor(tensorInfo4);
+    armnn::ScopedTensorHandle forgetGateBiasTensor(tensorInfo4);
+    armnn::ScopedTensorHandle cellBiasTensor(tensorInfo4);
+    armnn::ScopedTensorHandle outputGateBiasTensor(tensorInfo4);
+
+    AllocateAndCopyDataToITensorHandle(&inputToForgetWeightsTensor, inputToForgetWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToCellWeightsTensor, inputToCellWeights.data());
+    AllocateAndCopyDataToITensorHandle(&inputToOutputWeightsTensor, inputToOutputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToForgetWeightsTensor, recurrentToForgetWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToCellWeightsTensor, recurrentToCellWeights.data());
+    AllocateAndCopyDataToITensorHandle(&recurrentToOutputWeightsTensor, recurrentToOutputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&cellToForgetWeightsTensor, cellToForgetWeights.data());
+    AllocateAndCopyDataToITensorHandle(&cellToOutputWeightsTensor, cellToOutputWeights.data());
+    AllocateAndCopyDataToITensorHandle(&forgetGateBiasTensor, forgetGateBias.data());
+    AllocateAndCopyDataToITensorHandle(&cellBiasTensor, cellBias.data());
+    AllocateAndCopyDataToITensorHandle(&outputGateBiasTensor, outputGateBias.data());
+
+    data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
+    data.m_InputToCellWeights = &inputToCellWeightsTensor;
+    data.m_InputToOutputWeights = &inputToOutputWeightsTensor;
+    data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
+    data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
+    data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;
+    data.m_CellToForgetWeights = &cellToForgetWeightsTensor;
+    data.m_CellToOutputWeights = &cellToOutputWeightsTensor;
+    data.m_ForgetGateBias = &forgetGateBiasTensor;
+    data.m_CellBias = &cellBiasTensor;
+    data.m_OutputGateBias = &outputGateBiasTensor;
+
+    // Flags to set test configuration
+    data.m_Parameters.m_ClippingThresCell = 10;
+    data.m_Parameters.m_ClippingThresProj = 0;
+    data.m_Parameters.m_ActivationFunc = 4;
+    data.m_Parameters.m_CifgEnabled = true;
+    data.m_Parameters.m_PeepholeEnabled = true;
+    data.m_Parameters.m_ProjectionEnabled = false;
+    data.m_Parameters.m_TimeMajor = false;
+
+    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateUnidirectionalSequenceLstm(data, info);
+    inputHandle->Allocate();
+    outputStateInHandle->Allocate();
+    cellStateInHandle->Allocate();
+
+    outputHandle->Allocate();
+
+    CopyDataToITensorHandle(inputHandle.get(), inputVector.data());
+    CopyDataToITensorHandle(outputStateInHandle.get(), outputStateInVector.data());
+    CopyDataToITensorHandle(cellStateInHandle.get(), cellStateInVector.data());
+
+    workload->Execute();
+
+    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
+
+    return LayerTestResult<float, 3>(actualOutput,
+                                     outputVector,
+                                     outputHandle->GetShape(),
+                                     outputTensorInfo.GetShape());
+}
