diff --git a/tests/benchmark/fixtures/DepthConcatenateLayerFixture.h b/tests/benchmark/fixtures/DepthConcatenateLayerFixture.h
index 7f7ed8b..4db27e7 100644
--- a/tests/benchmark/fixtures/DepthConcatenateLayerFixture.h
+++ b/tests/benchmark/fixtures/DepthConcatenateLayerFixture.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2018 ARM Limited.
+ * Copyright (c) 2017-2019 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -100,7 +100,7 @@
             src_ptrs.emplace_back(&_srcs.back());
         }
 
-        TensorShape dst_shape = misc::shape_calculator::calculate_depth_concatenate_shape(src_ptrs);
+        TensorShape dst_shape = misc::shape_calculator::calculate_concatenate_shape(src_ptrs, Window::DimZ);
         _dst                  = create_tensor<TensorType>(dst_shape, data_type, 1);
 
         _depth_concat.configure(src_ptrs, &_dst);
diff --git a/tests/validation/CL/DepthConcatenateLayer.cpp b/tests/validation/CL/DepthConcatenateLayer.cpp
index 5da8a34..beda637 100644
--- a/tests/validation/CL/DepthConcatenateLayer.cpp
+++ b/tests/validation/CL/DepthConcatenateLayer.cpp
@@ -83,8 +83,8 @@
 {
     // Create tensors
     CLTensor src1 = create_tensor<CLTensor>(TensorShape(128U, 32U, 32U), DataType::F32, 1);
-    CLTensor src2 = create_tensor<CLTensor>(TensorShape(32U, 32U, 32U), DataType::F32, 1);
-    CLTensor src3 = create_tensor<CLTensor>(TensorShape(16U, 32U, 32U), DataType::F32, 1);
+    CLTensor src2 = create_tensor<CLTensor>(TensorShape(128U, 32U, 32U), DataType::F32, 1);
+    CLTensor src3 = create_tensor<CLTensor>(TensorShape(128U, 32U, 32U), DataType::F32, 1);
     CLTensor dst;
 
     ARM_COMPUTE_EXPECT(src1.info()->is_resizable(), framework::LogLevel::ERRORS);
diff --git a/tests/validation/CL/LSTMLayer.cpp b/tests/validation/CL/LSTMLayer.cpp
index ea20bd6..71a9383 100644
--- a/tests/validation/CL/LSTMLayer.cpp
+++ b/tests/validation/CL/LSTMLayer.cpp
@@ -109,7 +109,7 @@
                                                         TensorInfo(TensorShape(16U, 2U), 1, DataType::F32),
                                                         TensorInfo(TensorShape(16U, 2U), 1, DataType::F32),
                                                         TensorInfo(TensorShape(16U, 2U), 1, DataType::F32),
-                                                        TensorInfo(TensorShape(11U, 13U), 1, DataType::F32),
+                                                        TensorInfo(TensorShape(11U, 2U), 1, DataType::F32),
                                                         TensorInfo(TensorShape(16U, 2U), 1, DataType::F32),
                })),
                framework::dataset::make("ScratchInfo", { TensorInfo(TensorShape(64U, 2U), 1, DataType::F32),
diff --git a/tests/validation/GLES_COMPUTE/DepthConcatenateLayer.cpp b/tests/validation/GLES_COMPUTE/DepthConcatenateLayer.cpp
index 7af3050..04e91d6 100644
--- a/tests/validation/GLES_COMPUTE/DepthConcatenateLayer.cpp
+++ b/tests/validation/GLES_COMPUTE/DepthConcatenateLayer.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 ARM Limited.
+ * Copyright (c) 2017-2019 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -24,14 +24,14 @@
 #include "arm_compute/core/Types.h"
 #include "arm_compute/runtime/GLES_COMPUTE/GCTensor.h"
 #include "arm_compute/runtime/GLES_COMPUTE/GCTensorAllocator.h"
-#include "arm_compute/runtime/GLES_COMPUTE/functions/GCDepthConcatenateLayer.h"
+#include "arm_compute/runtime/GLES_COMPUTE/functions/GCConcatenateLayer.h"
 #include "tests/GLES_COMPUTE/GCAccessor.h"
 #include "tests/datasets/ShapeDatasets.h"
 #include "tests/framework/Asserts.h"
 #include "tests/framework/Macros.h"
 #include "tests/framework/datasets/Datasets.h"
 #include "tests/validation/Validation.h"
-#include "tests/validation/fixtures/DepthConcatenateLayerFixture.h"
+#include "tests/validation/fixtures/ConcatenateLayerFixture.h"
 
 namespace arm_compute
 {
@@ -42,21 +42,23 @@
 TEST_SUITE(GC)
 TEST_SUITE(DepthConcatenateLayer)
 
-//TODO(COMPMID-415): Add configuration test?
-
 template <typename T>
-using GCDepthConcatenateLayerFixture = DepthConcatenateLayerValidationFixture<GCTensor, IGCTensor, GCAccessor, GCDepthConcatenateLayer, T>;
+using GCDepthConcatenateLayerFixture = ConcatenateLayerValidationFixture<GCTensor, IGCTensor, GCAccessor, GCConcatenateLayer, T>;
 
 TEST_SUITE(Float)
 TEST_SUITE(FP16)
-FIXTURE_DATA_TEST_CASE(RunSmall, GCDepthConcatenateLayerFixture<half>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), framework::dataset::make("DataType",
-                                                                                                                  DataType::F16)))
+FIXTURE_DATA_TEST_CASE(RunSmall, GCDepthConcatenateLayerFixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::Small3DShapes(),
+                                                                                                                  framework::dataset::make("DataType",
+                                                                                                                          DataType::F16)),
+                                                                                                                  framework::dataset::make("Axis", 2)))
 {
     // Validate output
     validate(GCAccessor(_target), _reference);
 }
-FIXTURE_DATA_TEST_CASE(RunLarge, GCDepthConcatenateLayerFixture<half>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), framework::dataset::make("DataType",
-                                                                                                                DataType::F16)))
+FIXTURE_DATA_TEST_CASE(RunLarge, GCDepthConcatenateLayerFixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::Large3DShapes(),
+                                                                                                                        framework::dataset::make("DataType",
+                                                                                                                                DataType::F16)),
+                                                                                                                framework::dataset::make("Axis", 2)))
 {
     // Validate output
     validate(GCAccessor(_target), _reference);
@@ -64,14 +66,17 @@
 TEST_SUITE_END()
 
 TEST_SUITE(FP32)
-FIXTURE_DATA_TEST_CASE(RunSmall, GCDepthConcatenateLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), framework::dataset::make("DataType",
-                                                                                                                   DataType::F32)))
+FIXTURE_DATA_TEST_CASE(RunSmall, GCDepthConcatenateLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::Small3DShapes(),
+                                                                                                                   framework::dataset::make("DataType",
+                                                                                                                           DataType::F32)),
+                                                                                                                   framework::dataset::make("Axis", 2)))
 {
     // Validate output
     validate(GCAccessor(_target), _reference);
 }
-FIXTURE_DATA_TEST_CASE(RunLarge, GCDepthConcatenateLayerFixture<float>, framework::DatasetMode::NIGHTLY, combine(datasets::DepthConcatenateLayerShapes(), framework::dataset::make("DataType",
-                                                                                                                 DataType::F32)))
+FIXTURE_DATA_TEST_CASE(RunLarge, GCDepthConcatenateLayerFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::Large3DShapes(), framework::dataset::make("DataType",
+                                                                                                                 DataType::F32)),
+                                                                                                                 framework::dataset::make("Axis", 2)))
 {
     // Validate output
     validate(GCAccessor(_target), _reference);
diff --git a/tests/validation/Helpers.cpp b/tests/validation/Helpers.cpp
index e9612f2..504dbfd 100644
--- a/tests/validation/Helpers.cpp
+++ b/tests/validation/Helpers.cpp
@@ -74,46 +74,6 @@
     }
 }
 
-TensorShape calculate_depth_concatenate_shape(const std::vector<TensorShape> &input_shapes)
-{
-    ARM_COMPUTE_ERROR_ON(input_shapes.empty());
-
-    TensorShape out_shape = input_shapes[0];
-
-    size_t max_x = 0;
-    size_t max_y = 0;
-    size_t depth = 0;
-
-    for(const auto &shape : input_shapes)
-    {
-        max_x = std::max(shape.x(), max_x);
-        max_y = std::max(shape.y(), max_y);
-        depth += shape.z();
-    }
-
-    out_shape.set(0, max_x);
-    out_shape.set(1, max_y);
-    out_shape.set(2, depth);
-
-    return out_shape;
-}
-
-TensorShape calculate_concatenate_shape(const std::vector<TensorShape> &input_shapes, size_t axis)
-{
-    ARM_COMPUTE_ERROR_ON(input_shapes.empty());
-    TensorShape out_shape = input_shapes[0];
-    ARM_COMPUTE_ERROR_ON(axis >= out_shape.num_dimensions());
-
-    const int new_size = std::accumulate(input_shapes.begin(), input_shapes.end(), 0, [&](int sum, const TensorShape & shape)
-    {
-        ARM_COMPUTE_ERROR_ON(axis >= shape.num_dimensions());
-        return sum + shape[axis];
-    });
-    out_shape.set(axis, new_size);
-
-    return out_shape;
-}
-
 HarrisCornersParameters harris_corners_parameters()
 {
     HarrisCornersParameters params;
diff --git a/tests/validation/NEON/LSTMLayer.cpp b/tests/validation/NEON/LSTMLayer.cpp
index 5dfd32b..b27dfae 100644
--- a/tests/validation/NEON/LSTMLayer.cpp
+++ b/tests/validation/NEON/LSTMLayer.cpp
@@ -109,7 +109,7 @@
                                                         TensorInfo(TensorShape(16U, 2U), 1, DataType::F32),
                                                         TensorInfo(TensorShape(16U, 2U), 1, DataType::F32),
                                                         TensorInfo(TensorShape(16U, 2U), 1, DataType::F32),
-                                                        TensorInfo(TensorShape(11U, 13U), 1, DataType::F32),
+                                                        TensorInfo(TensorShape(11U, 2U), 1, DataType::F32),
                                                         TensorInfo(TensorShape(16U, 2U), 1, DataType::F32),
                })),
                framework::dataset::make("ScratchInfo", { TensorInfo(TensorShape(64U, 2U), 1, DataType::F32),
diff --git a/tests/validation/fixtures/ConcatenateLayerFixture.h b/tests/validation/fixtures/ConcatenateLayerFixture.h
index 39d4f9f..d1eed63 100644
--- a/tests/validation/fixtures/ConcatenateLayerFixture.h
+++ b/tests/validation/fixtures/ConcatenateLayerFixture.h
@@ -73,7 +73,7 @@
         // Generate more shapes based on the input
         for(auto &s : shapes)
         {
-            // Randomly change the first dimension
+            // Randomly change the dimension
             if(mutate_dis(gen))
             {
                 // Decrease the dimension by a small percentage. Don't increase
@@ -144,18 +144,20 @@
         return dst;
     }
 
-    SimpleTensor<T> compute_reference(const std::vector<TensorShape> &shapes, const std::vector<QuantizationInfo> &qinfo, DataType data_type, unsigned int axis)
+    SimpleTensor<T> compute_reference(std::vector<TensorShape> &shapes, const std::vector<QuantizationInfo> &qinfo, DataType data_type, unsigned int axis)
     {
         std::vector<SimpleTensor<T>> srcs;
+        std::vector<TensorShape *>   src_ptrs;
 
         // Create and fill tensors
         for(size_t j = 0; j < shapes.size(); ++j)
         {
             srcs.emplace_back(shapes[j], data_type, 1, qinfo[j]);
             fill(srcs.back(), j);
+            src_ptrs.emplace_back(&shapes[j]);
         }
 
-        const TensorShape dst_shape = calculate_concatenate_shape(shapes, axis);
+        const TensorShape dst_shape = misc::shape_calculator::calculate_concatenate_shape(src_ptrs, axis);
         SimpleTensor<T>   dst{ dst_shape, data_type, 1, qinfo[shapes.size()] };
         return reference::concatenate_layer<T>(srcs, dst, axis);
     }
diff --git a/tests/validation/fixtures/DepthConcatenateLayerFixture.h b/tests/validation/fixtures/DepthConcatenateLayerFixture.h
deleted file mode 100644
index edeefa2..0000000
--- a/tests/validation/fixtures/DepthConcatenateLayerFixture.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (c) 2017-2019 ARM Limited.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#ifndef ARM_COMPUTE_TEST_DEPTHCONCATENATE_LAYER_FIXTURE
-#define ARM_COMPUTE_TEST_DEPTHCONCATENATE_LAYER_FIXTURE
-
-#include "arm_compute/core/TensorShape.h"
-#include "arm_compute/core/Types.h"
-#include "arm_compute/core/utils/misc/ShapeCalculator.h"
-#include "tests/AssetsLibrary.h"
-#include "tests/Globals.h"
-#include "tests/IAccessor.h"
-#include "tests/framework/Asserts.h"
-#include "tests/framework/Fixture.h"
-#include "tests/validation/Helpers.h"
-#include "tests/validation/reference/DepthConcatenateLayer.h"
-
-#include <random>
-
-namespace arm_compute
-{
-namespace test
-{
-namespace validation
-{
-template <typename TensorType, typename ITensorType, typename AccessorType, typename FunctionType, typename T>
-class DepthConcatenateLayerValidationFixture : public framework::Fixture
-{
-public:
-    template <typename...>
-    void setup(TensorShape shape, DataType data_type)
-    {
-        // Create input shapes
-        std::mt19937                    gen(library->seed());
-        std::uniform_int_distribution<> num_dis(2, 4);
-        std::uniform_int_distribution<> offset_dis(0, 20);
-
-        const int num_tensors = num_dis(gen);
-
-        std::vector<TensorShape> shapes(num_tensors, shape);
-
-        // vector holding the quantization info:
-        //      the last element is the output quantization info
-        //      all other elements are the quantization info for the input tensors
-        std::vector<QuantizationInfo> qinfo(num_tensors + 1, QuantizationInfo());
-
-        for(auto &qi : qinfo)
-        {
-            qi = QuantizationInfo(1.f / 255.f, offset_dis(gen));
-        }
-
-        std::uniform_int_distribution<>  depth_dis(1, 3);
-        std::bernoulli_distribution      mutate_dis(0.5f);
-        std::uniform_real_distribution<> change_dis(-0.25f, 0.f);
-
-        // Generate more shapes based on the input
-        for(auto &s : shapes)
-        {
-            // Set the depth of the tensor
-            s.set(2, depth_dis(gen));
-
-            // Randomly change the first dimension
-            if(mutate_dis(gen))
-            {
-                // Decrease the dimension by a small percentage. Don't increase
-                // as that could make tensor too large. Also the change must be
-                // an even number. Otherwise out depth concatenate fails.
-                s.set(0, s[0] + 2 * static_cast<int>(s[0] * change_dis(gen)));
-            }
-
-            // Repeat the same as above for the second dimension
-            if(mutate_dis(gen))
-            {
-                s.set(1, s[1] + 2 * static_cast<int>(s[1] * change_dis(gen)));
-            }
-        }
-
-        _target    = compute_target(shapes, qinfo, data_type);
-        _reference = compute_reference(shapes, qinfo, data_type);
-    }
-
-protected:
-    template <typename U>
-    void fill(U &&tensor, int i)
-    {
-        library->fill_tensor_uniform(tensor, i);
-    }
-
-    TensorType compute_target(std::vector<TensorShape> shapes, const std::vector<QuantizationInfo> &qinfo, DataType data_type)
-    {
-        std::vector<TensorType>    srcs;
-        std::vector<ITensorType *> src_ptrs;
-
-        // Create tensors
-        srcs.reserve(shapes.size());
-
-        for(size_t j = 0; j < shapes.size(); ++j)
-        {
-            srcs.emplace_back(create_tensor<TensorType>(shapes[j], data_type, 1, qinfo[j]));
-            src_ptrs.emplace_back(&srcs.back());
-        }
-
-        TensorShape dst_shape = misc::shape_calculator::calculate_depth_concatenate_shape(src_ptrs);
-        TensorType  dst       = create_tensor<TensorType>(dst_shape, data_type, 1, qinfo[shapes.size()]);
-
-        // Create and configure function
-        FunctionType depth_concat;
-        depth_concat.configure(src_ptrs, &dst);
-
-        for(auto &src : srcs)
-        {
-            ARM_COMPUTE_EXPECT(src.info()->is_resizable(), framework::LogLevel::ERRORS);
-        }
-
-        ARM_COMPUTE_EXPECT(dst.info()->is_resizable(), framework::LogLevel::ERRORS);
-
-        // Allocate tensors
-        for(auto &src : srcs)
-        {
-            src.allocator()->allocate();
-            ARM_COMPUTE_EXPECT(!src.info()->is_resizable(), framework::LogLevel::ERRORS);
-        }
-
-        dst.allocator()->allocate();
-        ARM_COMPUTE_EXPECT(!dst.info()->is_resizable(), framework::LogLevel::ERRORS);
-
-        // Fill tensors
-        int i = 0;
-        for(auto &src : srcs)
-        {
-            fill(AccessorType(src), i++);
-        }
-
-        // Compute function
-        depth_concat.run();
-
-        return dst;
-    }
-
-    SimpleTensor<T> compute_reference(std::vector<TensorShape> shapes, const std::vector<QuantizationInfo> &qinfo, DataType data_type)
-    {
-        std::vector<SimpleTensor<T>> srcs;
-
-        // Create and fill tensors
-        for(size_t j = 0; j < shapes.size(); ++j)
-        {
-            srcs.emplace_back(shapes[j], data_type, 1, qinfo[j]);
-            fill(srcs.back(), j);
-        }
-
-        const TensorShape dst_shape = calculate_depth_concatenate_shape(shapes);
-        SimpleTensor<T>   dst{ dst_shape, data_type, 1, qinfo[shapes.size()] };
-
-        return reference::depthconcatenate_layer<T>(srcs, dst);
-    }
-
-    TensorType      _target{};
-    SimpleTensor<T> _reference{};
-};
-} // namespace validation
-} // namespace test
-} // namespace arm_compute
-#endif /* ARM_COMPUTE_TEST_DEPTHCONCATENATE_LAYER_FIXTURE */
