diff --git a/src/backends/backendsCommon/test/layerTests/ConcatTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/ConcatTestImpl.cpp
index d486bc0..3eca273 100644
--- a/src/backends/backendsCommon/test/layerTests/ConcatTestImpl.cpp
+++ b/src/backends/backendsCommon/test/layerTests/ConcatTestImpl.cpp
@@ -428,9 +428,9 @@
 {
     TensorInfo inputTensorInfo({ 3 }, ArmnnType, qScale, qOffset);
 
-    auto input0 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>({ 1.0f, 2.0f, 3.0f }, qScale, qOffset));
-    auto input1 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>({ 4.0f, 5.0f, 6.0f }, qScale, qOffset));
-    auto input2 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>({ 7.0f, 8.0f, 9.0f }, qScale, qOffset));
+    auto input0 = QuantizedVector<T>({ 1.0f, 2.0f, 3.0f }, qScale, qOffset);
+    auto input1 = QuantizedVector<T>({ 4.0f, 5.0f, 6.0f }, qScale, qOffset);
+    auto input2 = QuantizedVector<T>({ 7.0f, 8.0f, 9.0f }, qScale, qOffset);
 
     TensorInfo outputTensorInfo({ 9 }, ArmnnType, qScale, qOffset);
 
@@ -446,12 +446,12 @@
                    0,
                    true);
 
-    result.output         = MakeTensor<T, 1>(outputTensorInfo, output);
-    result.outputExpected = MakeTensor<T, 1>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ActualData   = output;
+    result.m_ExpectedData = QuantizedVector<T>(
         {
             1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -468,7 +468,7 @@
 {
     TensorInfo inputTensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
 
-    auto input0 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(
+    auto input0 = QuantizedVector<T>(
         {
             // Batch 0
             1.0f, 2.0f, 3.0f,
@@ -476,9 +476,9 @@
             // Batch 1
             10.0f, 11.0f, 12.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
-    auto input1 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(
+    auto input1 = QuantizedVector<T>(
          {
             // Batch 0
             4.0f, 5.0f, 6.0f,
@@ -486,9 +486,9 @@
             // Batch 1
             13.0f, 14.0f, 15.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
-    auto input2 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(
+    auto input2 = QuantizedVector<T>(
         {
             // Batch 0
             7.0f, 8.0f, 9.0f,
@@ -496,7 +496,7 @@
             // Batch 1
             16.0f, 17.0f, 18.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     LayerTestResult<T, 2> result(outputTensorInfo);
 
@@ -510,7 +510,7 @@
                    dimension,
                    true);
 
-    result.output = MakeTensor<T, 2>(outputTensorInfo, output);
+    result.m_ActualData = output;
     return result;
 }
 
@@ -527,7 +527,7 @@
     LayerTestResult<T, 2> result = Concat2dTestImpl<ArmnnType>(
         workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 0, qScale, qOffset);
 
-    result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ExpectedData = QuantizedVector<T>(
         {
             // Batch 0
             1.0f, 2.0f, 3.0f,
@@ -547,7 +547,7 @@
             // Batch 5
             16.0f, 17.0f, 18.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -565,7 +565,7 @@
     LayerTestResult<T, 2> result = Concat2dTestImpl<ArmnnType>(
         workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 1, qScale, qOffset);
 
-    result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ExpectedData = QuantizedVector<T>(
         {
             // Batch 0
             1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
@@ -573,7 +573,7 @@
             // Batch 1
             10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -587,7 +587,7 @@
     int32_t qOffset)
 {
     TensorInfo input0TensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
-    auto input0 = MakeTensor<T, 2>(input0TensorInfo, QuantizedVector<T>(
+    auto input0 = QuantizedVector<T>(
         {
             // Batch 0
             1.0f, 2.0f, 3.0f,
@@ -595,10 +595,10 @@
             // Batch 1
             10.0f, 11.0f, 12.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo input1TensorInfo({ 3, 3 }, ArmnnType, qScale, qOffset);
-    auto input1 = MakeTensor<T, 2>(input1TensorInfo, QuantizedVector<T>(
+    auto input1 = QuantizedVector<T>(
         {
             // Batch 0
             4.0f, 5.0f, 6.0f,
@@ -609,15 +609,15 @@
             // Batch 0
             7.0f, 8.0f, 9.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo input2TensorInfo({ 1, 3 }, ArmnnType, qScale, qOffset);
-    auto input2 = MakeTensor<T, 2>(input2TensorInfo, QuantizedVector<T>(
+    auto input2 = QuantizedVector<T>(
         {
             // Batch 1
             16.0f, 17.0f, 18.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo outputTensorInfo({ 6, 3 }, ArmnnType, qScale, qOffset);
     LayerTestResult<T, 2> result(outputTensorInfo);
@@ -632,8 +632,8 @@
                    0,
                    true);
 
-    result.output = MakeTensor<T, 2>(outputTensorInfo, output);
-    result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ActualData = output;
+    result.m_ExpectedData = QuantizedVector<T>(
         {
             // Batch 0
             1.0f, 2.0f, 3.0f,
@@ -653,7 +653,7 @@
             // Batch 5
             16.0f, 17.0f, 18.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -667,7 +667,7 @@
     int32_t qOffset)
 {
     TensorInfo input0TensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
-    auto input0 = MakeTensor<T, 2>(input0TensorInfo, QuantizedVector<T>(
+    auto input0 = QuantizedVector<T>(
         {
             // Batch 0
             1.0f, 2.0f, 3.0f,
@@ -675,10 +675,10 @@
             // Batch 1
             10.0f, 11.0f, 12.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo input1TensorInfo({ 2, 5 }, ArmnnType, qScale, qOffset);
-    auto input1 = MakeTensor<T, 2>(input1TensorInfo, QuantizedVector<T>(
+    auto input1 = QuantizedVector<T>(
         {
             // Batch 0
             4.0f, 5.0f, 6.0f, 7.0f, 8.0f,
@@ -686,10 +686,10 @@
             // Batch 1
             13.0f, 14.0f, 15.0f, 16.0f, 17.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo input2TensorInfo({ 2, 1 }, ArmnnType, qScale, qOffset);
-    auto input2 = MakeTensor<T, 2>(input2TensorInfo, QuantizedVector<T>(
+    auto input2 = QuantizedVector<T>(
         {
             // Batch 0
             9.0f,
@@ -697,7 +697,7 @@
             // Batch 1
             18.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo outputTensorInfo({ 2, 9 }, ArmnnType, qScale, qOffset);
     LayerTestResult<T, 2> result(outputTensorInfo);
@@ -712,8 +712,8 @@
                    1,
                    true);
 
-    result.output = MakeTensor<T, 2>(outputTensorInfo, output);
-    result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ActualData = output;
+    result.m_ExpectedData = QuantizedVector<T>(
         {
             // Batch 0
             1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
@@ -721,7 +721,7 @@
             // Batch 1
             10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -739,7 +739,7 @@
 {
     TensorInfo inputTensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
 
-    auto input0 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(
+    auto input0 = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             1.0f, 2.0f,
@@ -759,9 +759,9 @@
             // Batch 1, Channel 2
             23.0f, 24.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
-    auto input1 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(
+    auto input1 = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             7.0f, 8.0f,
@@ -781,9 +781,9 @@
             // Batch 1, Channel 2
             29.0f, 30.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
-    auto input2 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(
+    auto input2 = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             13.0f, 14.0f,
@@ -803,7 +803,7 @@
             // Batch 1, Channel 2
             35.0f, 36.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     LayerTestResult<T, 3> result(outputTensorInfo);
 
@@ -817,7 +817,7 @@
                    dimension,
                    useSubtensor);
 
-    result.output = MakeTensor<T, 3>(outputTensorInfo, output);
+    result.m_ActualData = output;
     return result;
 }
 
@@ -834,7 +834,7 @@
     LayerTestResult<T, 3> result = Concat3dTestImpl<ArmnnType>(
         workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 0, true, qScale, qOffset);
 
-    result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ExpectedData = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             1.0f, 2.0f,
@@ -890,7 +890,7 @@
             // Batch 5, Channel 2
             35.0f, 36.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -908,7 +908,7 @@
     LayerTestResult<T, 3> result = Concat3dTestImpl<ArmnnType>(
         workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 1, true, qScale, qOffset);
 
-    result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ExpectedData = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             1.0f, 2.0f,
@@ -964,7 +964,7 @@
             // Batch 1, Channel 8
             35.0f, 36.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -983,7 +983,7 @@
     LayerTestResult<T, 3> result = Concat3dTestImpl<ArmnnType>(
         workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 2, useSubtensor, qScale, qOffset);
 
-    result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ExpectedData = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             1.0f, 2.0f, 7.0f, 8.0f, 13.0f, 14.0f,
@@ -1003,7 +1003,7 @@
             // Batch 1, Channel 2
             23.0f, 24.0f, 29.0f, 30.0f, 35.0f, 36.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -1017,7 +1017,7 @@
     int32_t qOffset)
 {
     TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType);
-    auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(
+    auto input0 = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             1.0f, 2.0f,
@@ -1037,10 +1037,10 @@
             // Batch 1, Channel 2
             23.0f, 24.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo input1TensorInfo({ 1, 3, 2 }, ArmnnType);
-    auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(
+    auto input1 = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             7.0f, 8.0f,
@@ -1051,10 +1051,10 @@
             // Batch 0, Channel 2
             11.0f, 12.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo input2TensorInfo({ 3, 3, 2 }, ArmnnType);
-    auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(
+    auto input2 = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             25.0f, 26.0f,
@@ -1083,7 +1083,7 @@
             // Batch 2, Channel 2
             35.0f, 36.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo outputTensorInfo({ 6, 3, 2 }, ArmnnType);
     LayerTestResult<T, 3> result(outputTensorInfo);
@@ -1098,8 +1098,8 @@
                    0,
                    true);
 
-    result.output = MakeTensor<T, 3>(outputTensorInfo, output);
-    result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ActualData = output;
+    result.m_ExpectedData = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             1.0f, 2.0f,
@@ -1155,7 +1155,7 @@
             // Batch 5, Channel 2
             35.0f, 36.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -1169,7 +1169,7 @@
     int32_t qOffset)
 {
     TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
-    auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(
+    auto input0 = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             1.0f, 2.0f,
@@ -1189,10 +1189,10 @@
             // Batch 1, Channel 2
             23.0f, 24.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo input1TensorInfo({ 2, 4, 2 }, ArmnnType, qScale, qOffset);
-    auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(
+    auto input1 = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             7.0f, 8.0f,
@@ -1218,10 +1218,10 @@
             // Batch 1, Channel 3
             15.0f, 16.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo input2TensorInfo({ 2, 1, 2 }, ArmnnType, qScale, qOffset);
-    auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(
+    auto input2 = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             17.0f, 18.0f,
@@ -1229,7 +1229,7 @@
             // Batch 1, Channel 0
             31.0f, 32.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo outputTensorInfo({ 2, 8, 2 }, ArmnnType, qScale, qOffset);
     LayerTestResult<T, 3> result(outputTensorInfo);
@@ -1244,8 +1244,8 @@
                    1,
                    true);
 
-    result.output = MakeTensor<T, 3>(outputTensorInfo, output);
-    result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ActualData = output;
+    result.m_ExpectedData = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             1.0f, 2.0f,
@@ -1295,7 +1295,7 @@
             // Batch 1, Channel 7
             31.0f, 32.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -1310,7 +1310,7 @@
     int32_t qOffset)
 {
     TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
-    auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(
+    auto input0 = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             1.0f, 2.0f,
@@ -1330,10 +1330,10 @@
             // Batch 1, Channel 2
             23.0f, 24.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo input1TensorInfo({ 2, 3, 1 }, ArmnnType, qScale, qOffset);
-    auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(
+    auto input1 = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             7.0f,
@@ -1353,10 +1353,10 @@
             // Batch 1, Channel 2
             29.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo input2TensorInfo({ 2, 3, 3 }, ArmnnType, qScale, qOffset);
-    auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(
+    auto input2 = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             13.0f, 14.0f, 50.0f,
@@ -1376,7 +1376,7 @@
             // Batch 1, Channel 2
             35.0f, 36.0f, 55.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo outputTensorInfo({ 2, 3, 6 }, ArmnnType, qScale, qOffset);
     LayerTestResult<T, 3> result(outputTensorInfo);
@@ -1391,8 +1391,8 @@
                    2,
                    useSubtensor);
 
-    result.output = MakeTensor<T, 3>(outputTensorInfo, output);
-    result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ActualData = output;
+    result.m_ExpectedData = QuantizedVector<T>(
         {
             // Batch 0, Channel 0
             1.0f, 2.0f, 7.0f, 13.0f, 14.0f, 50.0f,
@@ -1412,7 +1412,7 @@
             // Batch 1, Channel 2
             23.0f, 24.0f, 29.0f, 35.0f, 36.0f, 55.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -1430,7 +1430,7 @@
 {
     TensorInfo inputTensorInfo({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
 
-    auto input0 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(
+    auto input0 = QuantizedVector<T>(
         {
              1.0f,  2.0f,
              3.0f,  4.0f,
@@ -1439,9 +1439,9 @@
              9.0f, 10.0f,
             11.0f, 12.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
-    auto input1 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(
+    auto input1 = QuantizedVector<T>(
         {
             11.0f, 12.0f,
             13.0f, 14.0f,
@@ -1450,9 +1450,9 @@
             19.0f, 20.0f,
             21.0f, 22.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
-    auto input2 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(
+    auto input2 = QuantizedVector<T>(
         {
             21.0f, 22.0f,
             23.0f, 24.0f,
@@ -1461,7 +1461,7 @@
             29.0f, 30.0f,
             31.0f, 32.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     LayerTestResult<T, 4> result(outputTensorInfo);
 
@@ -1478,7 +1478,7 @@
                    dimension,
                    useSubtensor);
 
-    result.output = MakeTensor<T, 4>(outputTensorInfo, output);
+    result.m_ActualData = output;
     return result;
 }
 
@@ -1495,7 +1495,7 @@
     LayerTestResult<T, 4> result = Concat4dTestImpl<ArmnnType>(
         workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 0, true, qScale, qOffset);
 
-    result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ExpectedData = QuantizedVector<T>(
         {
              1.0f,  2.0f,
              3.0f,  4.0f,
@@ -1518,7 +1518,7 @@
             29.0f, 30.0f,
             31.0f, 32.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -1536,7 +1536,7 @@
     LayerTestResult<T, 4> result = Concat4dTestImpl<ArmnnType>(
         workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 1, true, qScale, qOffset);
 
-    result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ExpectedData = QuantizedVector<T>(
         {
              1.0f,  2.0f,
              3.0f,  4.0f,
@@ -1559,7 +1559,7 @@
             29.0f, 30.0f,
             31.0f, 32.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -1577,7 +1577,7 @@
     LayerTestResult<T, 4> result = Concat4dTestImpl<ArmnnType>(
         workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 2, true, qScale, qOffset);
 
-    result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ExpectedData = QuantizedVector<T>(
         {
              1.0f,  2.0f,
              3.0f,  4.0f,
@@ -1600,7 +1600,7 @@
             29.0f, 30.0f,
             31.0f, 32.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -1619,7 +1619,7 @@
     LayerTestResult<T, 4> result = Concat4dTestImpl<ArmnnType>(
         workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 3, useSubtensor, qScale, qOffset);
 
-    result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ExpectedData = QuantizedVector<T>(
         {
              1.0f,  2.0f,
             11.0f, 12.0f,
@@ -1642,7 +1642,7 @@
             21.0f, 22.0f,
             31.0f, 32.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -1658,7 +1658,7 @@
     constexpr unsigned int dimension = 0u;
 
     TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
-    auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(
+    auto input0 = QuantizedVector<T>(
         {
              1.0f,  2.0f,
              3.0f,  4.0f,
@@ -1667,11 +1667,11 @@
              9.0f, 10.0f,
             11.0f, 12.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo inputTensorInfo1({ 2, 3, 2, 2 }, ArmnnType, qScale, qOffset);
 
-    auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(
+    auto input1 = QuantizedVector<T>(
         {
             11.0f, 12.0f,
             13.0f, 14.0f,
@@ -1687,7 +1687,7 @@
             29.0f, 30.0f,
             31.0f, 32.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo outputTensorInfo({ 3, 3, 2, 2 }, ArmnnType, qScale, qOffset);
 
@@ -1705,8 +1705,8 @@
                    dimension,
                    true);
 
-    result.output = MakeTensor<T, 4>(outputTensorInfo, output);
-    result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ActualData = output;
+    result.m_ExpectedData = QuantizedVector<T>(
         {
              1.0f, 2.0f,
              3.0f, 4.0f,
@@ -1729,7 +1729,7 @@
             29.0f, 30.0f,
             31.0f, 32.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -1745,7 +1745,7 @@
     constexpr unsigned int dimension = 1u;
 
     TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
-    auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(
+    auto input0 = QuantizedVector<T>(
         {
              1.0f,  2.0f,
              3.0f,  4.0f,
@@ -1754,18 +1754,18 @@
              9.0f, 10.0f,
             11.0f, 12.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo inputTensorInfo1({ 1, 2, 2, 2 }, ArmnnType, qScale, qOffset);
 
-    auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(
+    auto input1 = QuantizedVector<T>(
         {
             11.0f, 12.0f,
             13.0f, 14.0f,
             15.0f, 16.0f,
             17.0f, 18.0f,
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo outputTensorInfo({ 1, 5, 2, 2 }, ArmnnType, qScale, qOffset);
 
@@ -1783,8 +1783,8 @@
                    dimension,
                    true);
 
-    result.output = MakeTensor<T, 4>(outputTensorInfo, output);
-    result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ActualData = output;
+    result.m_ExpectedData = QuantizedVector<T>(
         {
              1.0f,  2.0f,
              3.0f,  4.0f,
@@ -1797,7 +1797,7 @@
             15.0f, 16.0f,
             17.0f, 18.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -1813,7 +1813,7 @@
     constexpr unsigned int dimension = 2u;
 
     TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
-    auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(
+    auto input0 = QuantizedVector<T>(
         {
              1.0f, 2.0f,
              3.0f, 4.0f,
@@ -1822,10 +1822,10 @@
             9.0f, 10.0f,
             11.0f, 12.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo inputTensorInfo1({ 1, 3, 3, 2 }, ArmnnType, qScale, qOffset);
-    auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(
+    auto input1 = QuantizedVector<T>(
         {
             11.0f, 12.0f,
             13.0f, 14.0f,
@@ -1837,7 +1837,7 @@
             25.0f, 26.0f,
             27.0f, 28.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo outputTensorInfo({ 1, 3, 5, 2 }, ArmnnType, qScale, qOffset);
     LayerTestResult<T, 4> result(outputTensorInfo);
@@ -1854,8 +1854,8 @@
                    dimension,
                    true);
 
-    result.output         = MakeTensor<T, 4>(outputTensorInfo, output);
-    result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ActualData   = output;
+    result.m_ExpectedData = QuantizedVector<T>(
         {
              1.0f,  2.0f,
              3.0f,  4.0f,
@@ -1875,7 +1875,7 @@
             25.0f, 26.0f,
             27.0f, 28.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -1892,7 +1892,7 @@
     constexpr unsigned int dimension = 3u;
 
     TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
-    auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(
+    auto input0 = QuantizedVector<T>(
         {
              1.0f,  2.0f,
              3.0f,  4.0f,
@@ -1901,10 +1901,10 @@
              9.0f, 10.0f,
             11.0f, 12.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo inputTensorInfo1({ 1, 3, 2, 3 }, ArmnnType, qScale, qOffset);
-    auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(
+    auto input1 = QuantizedVector<T>(
         {
             11.0f, 12.0f, 13.0f,
             14.0f, 15.0f, 16.0f,
@@ -1915,7 +1915,7 @@
             23.0f, 24.0f, 25.0f,
             26.0f, 27.0f, 28.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     TensorInfo outputTensorInfo({ 1, 3, 2, 5 }, ArmnnType, qScale, qOffset);
 
@@ -1933,8 +1933,8 @@
                    dimension,
                    useSubtensor);
 
-    result.output = MakeTensor<T, 4>(outputTensorInfo, output);
-    result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(
+    result.m_ActualData = output;
+    result.m_ExpectedData = QuantizedVector<T>(
         {
             1.0f, 2.0f, 11.0f, 12.0f, 13.0f,
             3.0f, 4.0f, 14.0f, 15.0f, 16.0f,
@@ -1943,7 +1943,7 @@
             9.0f, 10.0f, 23.0f, 24.0f, 25.0f,
             11.0f, 12.0f, 26.0f, 27.0f, 28.0f
         },
-        qScale, qOffset));
+        qScale, qOffset);
 
     return result;
 }
@@ -1968,7 +1968,7 @@
     const float inputScale1 = 0.5f;
     const int32_t inputOffset1 = 5;
 
-    auto input1 = MakeTensor<T, 3>(inputTensorInfo1, std::vector<T>(
+    std::vector<T> input1 =
     {
         1, 2, 3,
         4, 5, 6,
@@ -1983,13 +1983,13 @@
         28, 29, 30,
         31, 32, 33,
         34, 35, 36
-    }));
+    };
 
     // Quatized input2 tensor.
     const float inputScale2 = 0.2f;
     const int32_t inputOffset2 = 10;
 
-    auto input2 = MakeTensor<T, 3>(inputTensorInfo2, std::vector<T>(
+    std::vector<T> input2 =
     {
         37, 38, 39,
         40, 41, 42,
@@ -1997,15 +1997,15 @@
         46, 47, 48,
         49, 50, 51,
         52, 53, 54
-    }));
+    };
 
     // Quantized output tensor.
     const float outputScale = 0.1f;
     const int32_t outputOffset = 20;
 
-    LayerTestResult<T, 3> ret(outputTensorInfo);
+    std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
 
-    ret.outputExpected = MakeTensor<T, 3>(outputTensorInfo, std::vector<T>(
+    std::vector<T> expectedOutput =
     {
         0,   5,  74,
         10,  15,  76,
@@ -2027,7 +2027,7 @@
         150, 155, 104,
         160, 165, 106,
         170, 175, 108
-    }));
+    };
 
     outputTensorInfo.SetQuantizationScale(outputScale);
     outputTensorInfo.SetQuantizationOffset(outputOffset);
@@ -2075,15 +2075,18 @@
     inputHandle2->Allocate();
     outputHandle->Allocate();
 
-    CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
-    CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
+    CopyDataToITensorHandle(inputHandle1.get(), input1.data());
+    CopyDataToITensorHandle(inputHandle2.get(), input2.data());
 
     workload->PostAllocationConfigure();
     workload->Execute();
 
-    CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
+    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
 
-    return ret;
+    return LayerTestResult<T, 3>(actualOutput,
+                                 expectedOutput,
+                                 outputHandle->GetShape(),
+                                 outputTensorInfo.GetShape());
 }
 
 //
@@ -2132,61 +2135,58 @@
     TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, DataType::Float32);
     TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, DataType::Float32);
 
-    LayerTestResult<float,3> ret(outputTensorInfo);
+    std::vector<float> actualOutput(outputTensorInfo.GetNumElements());
 
-    ret.outputExpected = MakeTensor<float, 3>(outputTensorInfo, std::vector<float>(
+    std::vector<float> expectedOutput =
     {
-            1.0f, 2.0f, 3.0f,
-            4.0f, 5.0f, 6.0f,
-            7.0f, 8.0f, 9.0f,
-            10.0f, 11.0f, 12.0f,
-            13.0f, 14.0f, 15.0f,
-            16.0f, 17.0f, 18.0f,
+        1.0f, 2.0f, 3.0f,
+        4.0f, 5.0f, 6.0f,
+        7.0f, 8.0f, 9.0f,
+        10.0f, 11.0f, 12.0f,
+        13.0f, 14.0f, 15.0f,
+        16.0f, 17.0f, 18.0f,
 
-            19.0f, 20.0f, 21.0f,
-            22.0f, 23.0f, 24.0f,
-            25.0f, 26.0f, 27.0f,
-            28.0f, 29.0f, 30.0f,
-            31.0f, 32.0f, 33.0f,
-            34.0f, 35.0f, 36.0f,
+        19.0f, 20.0f, 21.0f,
+        22.0f, 23.0f, 24.0f,
+        25.0f, 26.0f, 27.0f,
+        28.0f, 29.0f, 30.0f,
+        31.0f, 32.0f, 33.0f,
+        34.0f, 35.0f, 36.0f,
 
-            37.0f, 38.0f, 39.0f,
-            40.0f, 41.0f, 42.0f,
-            43.0f, 44.0f, 45.0f,
-            46.0f, 47.0f, 48.0f,
-            49.0f, 50.0f, 51.0f,
-            52.0f, 53.0f, 54.0f,
-        })
-    );
+        37.0f, 38.0f, 39.0f,
+        40.0f, 41.0f, 42.0f,
+        43.0f, 44.0f, 45.0f,
+        46.0f, 47.0f, 48.0f,
+        49.0f, 50.0f, 51.0f,
+        52.0f, 53.0f, 54.0f
+    };
 
-    auto input1 = MakeTensor<float, 3>(inputTensorInfo1, std::vector<float>(
-        {
-            1.0f, 2.0f, 3.0f,
-            4.0f, 5.0f, 6.0f,
-            7.0f, 8.0f, 9.0f,
-            10.0f, 11.0f, 12.0f,
-            13.0f, 14.0f, 15.0f,
-            16.0f, 17.0f, 18.0f,
+    std::vector<float> input1 =
+    {
+        1.0f, 2.0f, 3.0f,
+        4.0f, 5.0f, 6.0f,
+        7.0f, 8.0f, 9.0f,
+        10.0f, 11.0f, 12.0f,
+        13.0f, 14.0f, 15.0f,
+        16.0f, 17.0f, 18.0f,
 
-            19.0f, 20.0f, 21.0f,
-            22.0f, 23.0f, 24.0f,
-            25.0f, 26.0f, 27.0f,
-            28.0f, 29.0f, 30.0f,
-            31.0f, 32.0f, 33.0f,
-            34.0f, 35.0f, 36.0f,
-        })
-    );
+        19.0f, 20.0f, 21.0f,
+        22.0f, 23.0f, 24.0f,
+        25.0f, 26.0f, 27.0f,
+        28.0f, 29.0f, 30.0f,
+        31.0f, 32.0f, 33.0f,
+        34.0f, 35.0f, 36.0f
+    };
 
-    auto input2 = MakeTensor<float, 3>(inputTensorInfo2, std::vector<float>(
-        {
-            37.0f, 38.0f, 39.0f,
-            40.0f, 41.0f, 42.0f,
-            43.0f, 44.0f, 45.0f,
-            46.0f, 47.0f, 48.0f,
-            49.0f, 50.0f, 51.0f,
-            52.0f, 53.0f, 54.0f,
-        })
-    );
+    std::vector<float> input2 =
+    {
+        37.0f, 38.0f, 39.0f,
+        40.0f, 41.0f, 42.0f,
+        43.0f, 44.0f, 45.0f,
+        46.0f, 47.0f, 48.0f,
+        49.0f, 50.0f, 51.0f,
+        52.0f, 53.0f, 54.0f,
+    };
 
     std::vector<unsigned int> wOrigin1 = {0, 0, 0}; //Extent of the window is defined by size of input[0].
     ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
@@ -2223,15 +2223,18 @@
     inputHandle2->Allocate();
     outputHandle->Allocate();
 
-    CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
-    CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
+    CopyDataToITensorHandle(inputHandle1.get(), input1.data());
+    CopyDataToITensorHandle(inputHandle2.get(), input2.data());
 
     workload->PostAllocationConfigure();
     workload->Execute();
 
-    CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
+    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
 
-    return ret;
+    return LayerTestResult<float, 3>(actualOutput,
+                                     expectedOutput,
+                                     outputHandle->GetShape(),
+                                     outputTensorInfo.GetShape());
 }
 
 LayerTestResult<float, 1> Concat1dTest(
@@ -2448,7 +2451,7 @@
     const float inputScale1 = 0.015686f;
     const int32_t inputOffset1 = 192;
 
-    auto input1 = MakeTensor<uint8_t, 3>(inputTensorInfo1, std::vector<uint8_t>(
+    std::vector<uint8_t> input1 =
     {
         1, 2, 3,
         4, 5, 6,
@@ -2462,33 +2465,31 @@
         25, 26, 27,
         28, 29, 30,
         31, 32, 33,
-        34, 35, 36,
-    })
-    );
+        34, 35, 36
+    };
 
     // Quatized input2 tensor. Range [-1, 4]
     const float inputScale2 = 0.019608f;
     const int32_t inputOffset2 = 50;
 
-    auto input2 = MakeTensor<uint8_t, 3>(inputTensorInfo2, std::vector<uint8_t>(
+    std::vector<uint8_t> input2 =
     {
         37, 38, 39,
         40, 41, 42,
         43, 44, 45,
         46, 47, 48,
         49, 50, 51,
-        52, 53, 54,
-    })
-    );
+        52, 53, 54
+    };
 
     // Output has the same quantization parameters than input1,
     // so that only the requantization of input2 is required
     const float outputScale = 0.015686f;
     const int32_t outputOffset = 192;
 
-    LayerTestResult<uint8_t, 3> ret(outputTensorInfo);
+    std::vector<uint8_t> actualOutput(outputTensorInfo.GetNumElements());
 
-    ret.outputExpected = MakeTensor<uint8_t, 3>(outputTensorInfo, std::vector<uint8_t>(
+    std::vector<uint8_t> expectedOutput =
     {
         1, 2, 3,
         4, 5, 6,
@@ -2509,9 +2510,8 @@
         183, 184, 186,
         187, 188, 189,
         191, 192, 193,
-        195, 196, 197,
-    })
-    );
+        195, 196, 197
+    };
 
     outputTensorInfo.SetQuantizationScale(outputScale);
     outputTensorInfo.SetQuantizationOffset(outputOffset);
@@ -2555,15 +2555,18 @@
     inputHandle2->Allocate();
     outputHandle->Allocate();
 
-    CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
-    CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
+    CopyDataToITensorHandle(inputHandle1.get(), input1.data());
+    CopyDataToITensorHandle(inputHandle2.get(), input2.data());
 
     workload->PostAllocationConfigure();
     workload->Execute();
 
-    CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
+    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
 
-    return ret;
+    return LayerTestResult<uint8_t, 3>(actualOutput,
+                                       expectedOutput,
+                                       outputHandle->GetShape(),
+                                       outputTensorInfo.GetShape());
 }
 
 LayerTestResult<uint8_t, 3> ConcatUint8Test(
@@ -2601,34 +2604,9 @@
     inputTensorInfo2.SetQuantizationScale(scale);
     inputTensorInfo2.SetQuantizationOffset(offset);
 
-    LayerTestResult<uint8_t, 3> ret(outputTensorInfo);
+    std::vector<uint8_t> actualOutput(outputTensorInfo.GetNumElements());
 
-    ret.outputExpected = MakeTensor<uint8_t, 3>(outputTensorInfo, std::vector<uint8_t>(
-        {
-            1, 2, 3,
-            4, 5, 6,
-            7, 8, 9,
-            10, 11, 12,
-            13, 14, 15,
-            16, 17, 18,
-
-            19, 20, 21,
-            22, 23, 24,
-            25, 26, 27,
-            28, 29, 30,
-            31, 32, 33,
-            34, 35, 36,
-
-            37, 38, 39,
-            40, 41, 42,
-            43, 44, 45,
-            46, 47, 48,
-            49, 50, 51,
-            52, 53, 54,
-        })
-    );
-
-    auto input1 = MakeTensor<uint8_t, 3>(inputTensorInfo1, std::vector<uint8_t>(
+    std::vector<uint8_t> expectedOutput =
     {
         1, 2, 3,
         4, 5, 6,
@@ -2643,19 +2621,41 @@
         28, 29, 30,
         31, 32, 33,
         34, 35, 36,
-    })
-    );
 
-    auto input2 = MakeTensor<uint8_t, 3>(inputTensorInfo2, std::vector<uint8_t>(
+        37, 38, 39,
+        40, 41, 42,
+        43, 44, 45,
+        46, 47, 48,
+        49, 50, 51,
+        52, 53, 54
+    };
+
+    std::vector<uint8_t> input1 =
+    {
+        1, 2, 3,
+        4, 5, 6,
+        7, 8, 9,
+        10, 11, 12,
+        13, 14, 15,
+        16, 17, 18,
+
+        19, 20, 21,
+        22, 23, 24,
+        25, 26, 27,
+        28, 29, 30,
+        31, 32, 33,
+        34, 35, 36
+    };
+
+    std::vector<uint8_t> input2 =
     {
         37, 38, 39,
         40, 41, 42,
         43, 44, 45,
         46, 47, 48,
         49, 50, 51,
-        52, 53, 54,
-    })
-    );
+        52, 53, 54
+    };
 
     std::vector<unsigned int> wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0].
     ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
@@ -2693,15 +2693,18 @@
     inputHandle2->Allocate();
     outputHandle->Allocate();
 
-    CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
-    CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
+    CopyDataToITensorHandle(inputHandle1.get(), input1.data());
+    CopyDataToITensorHandle(inputHandle2.get(), input2.data());
 
     workload->PostAllocationConfigure();
     workload->Execute();
 
-    CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
+    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
 
-    return ret;
+    return LayerTestResult<uint8_t, 3>(actualOutput,
+                                       expectedOutput,
+                                       outputHandle->GetShape(),
+                                       outputTensorInfo.GetShape());
 }
 
 LayerTestResult<uint16_t, 3> ConcatUint16Test(
@@ -2739,9 +2742,9 @@
     inputTensorInfo2.SetQuantizationScale(scale);
     inputTensorInfo2.SetQuantizationOffset(offset);
 
-    LayerTestResult<uint16_t, 3> ret(outputTensorInfo);
+    std::vector<uint16_t> actualOutput(outputTensorInfo.GetNumElements());
 
-    ret.outputExpected = MakeTensor<uint16_t, 3>(outputTensorInfo, std::vector<uint16_t>(
+    std::vector<uint16_t> expectedOutput =
     {
         1, 2, 3,
         4, 5, 6,
@@ -2762,10 +2765,10 @@
         43, 44, 45,
         46, 47, 48,
         49, 50, 51,
-        52, 53, 54,
-    }));
+        52, 53, 54
+    };
 
-    auto input1 = MakeTensor<uint16_t, 3>(inputTensorInfo1, std::vector<uint16_t>(
+    std::vector<uint16_t> input1 =
     {
         1, 2, 3,
         4, 5, 6,
@@ -2780,9 +2783,9 @@
         28, 29, 30,
         31, 32, 33,
         34, 35, 36,
-    }));
+    };
 
-    auto input2 = MakeTensor<uint16_t, 3>(inputTensorInfo2, std::vector<uint16_t>(
+    std::vector<uint16_t> input2 =
     {
         37, 38, 39,
         40, 41, 42,
@@ -2790,7 +2793,7 @@
         46, 47, 48,
         49, 50, 51,
         52, 53, 54,
-    }));
+    };
 
     std::vector<unsigned int> wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0].
     ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
@@ -2829,15 +2832,18 @@
     inputHandle2->Allocate();
     outputHandle->Allocate();
 
-    CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
-    CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
+    CopyDataToITensorHandle(inputHandle1.get(), input1.data());
+    CopyDataToITensorHandle(inputHandle2.get(), input2.data());
 
     workload->PostAllocationConfigure();
     workload->Execute();
 
-    CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
+    CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
 
-    return ret;
+    return LayerTestResult<uint16_t, 3>(actualOutput,
+                                       expectedOutput,
+                                       outputHandle->GetShape(),
+                                       outputTensorInfo.GetShape());
 }
 
 LayerTestResult<uint8_t, 1> Concat1dUint8Test(
