diff --git a/src/runtime/NEON/INEOperator.cpp b/src/runtime/NEON/INEOperator.cpp
index a13b29b..ff643d1 100644
--- a/src/runtime/NEON/INEOperator.cpp
+++ b/src/runtime/NEON/INEOperator.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020 Arm Limited.
+ * Copyright (c) 2020-2021 Arm Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -54,7 +54,7 @@
 
 MemoryRequirements INEOperator::workspace() const
 {
-    return {};
+    return _workspace;
 }
 } // namespace experimental
 } // namespace arm_compute
diff --git a/src/runtime/NEON/functions/NEPoolingAssemblyDispatch.cpp b/src/runtime/NEON/functions/NEPoolingAssemblyDispatch.cpp
new file mode 100644
index 0000000..2600e2b
--- /dev/null
+++ b/src/runtime/NEON/functions/NEPoolingAssemblyDispatch.cpp
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2021 Arm Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "src/runtime/NEON/functions/NEPoolingAssemblyDispatch.h"
+
+#include "arm_compute/core/ITensor.h"
+#include "arm_compute/runtime/NEON/NEScheduler.h"
+#include "src/core/CPP/Validate.h"
+#include "src/core/NEON/kernels/assembly/NEPoolingAssemblyWrapperKernel.h"
+
+namespace arm_compute
+{
+namespace experimental
+{
+NEPoolingAssemblyDispatch::~NEPoolingAssemblyDispatch() = default;
+
+void NEPoolingAssemblyDispatch::configure(const ITensorInfo *input, ITensorInfo *output, const PoolingLayerInfo &info)
+{
+    const CPUInfo     &ci          = NEScheduler::get().cpu_info();
+    const unsigned int num_threads = NEScheduler::get().num_threads();
+
+    // If we don't support a combination of data types, silently return: it is the caller's responsibility to check if configure() was successful via is_configured()
+    if(!NEPoolingAssemblyDispatch::validate(input, output, info))
+    {
+        return;
+    }
+
+    auto pooling_wrapper = std::make_unique<NEPoolingAssemblyWrapperKernel>();
+    ARM_COMPUTE_ERROR_ON(pooling_wrapper == nullptr);
+    pooling_wrapper->configure(input, output, info, ci);
+
+    // Check if we have Global Pooling Layer
+    _is_global_pooling_layer = (input->dimension(2) == info.pool_size.width) && (input->dimension(1) == info.pool_size.height);
+
+    // Set workspace requirements
+    const unsigned int alignment = 4096;
+    _workspace.push_back(MemoryInfo(TensorType::ACL_DST_1, pooling_wrapper->get_working_size(num_threads), alignment));
+
+    _kernel = std::move(pooling_wrapper);
+}
+
+Status NEPoolingAssemblyDispatch::validate(const ITensorInfo *input, const ITensorInfo *output, const PoolingLayerInfo &info)
+{
+    return NEPoolingAssemblyWrapperKernel::validate(input, output, info);
+}
+
+bool NEPoolingAssemblyDispatch::is_configured() const
+{
+    return _kernel != nullptr;
+}
+
+void NEPoolingAssemblyDispatch::run(ITensorPack &tensors)
+{
+    if(tensors.empty())
+    {
+        ARM_COMPUTE_ERROR("No inputs provided");
+    }
+
+    if(_is_global_pooling_layer)
+    {
+        NEScheduler::get().schedule_op(_kernel.get(), Window::DimX, tensors);
+    }
+    else
+    {
+        NEScheduler::get().schedule_op(_kernel.get(), Window::DimY, tensors);
+    }
+}
+} // namespace experimental
+
+struct NEPoolingAssemblyDispatch::Impl
+{
+    const ITensor                                           *src{ nullptr };
+    ITensor                                                 *dst{ nullptr };
+    ITensor                                                 *workspace{ nullptr };
+    std::unique_ptr<experimental::NEPoolingAssemblyDispatch> op{ nullptr };
+};
+
+NEPoolingAssemblyDispatch::NEPoolingAssemblyDispatch(NEPoolingAssemblyDispatch &&) = default;
+
+NEPoolingAssemblyDispatch &NEPoolingAssemblyDispatch::operator=(NEPoolingAssemblyDispatch &&) = default;
+
+NEPoolingAssemblyDispatch::~NEPoolingAssemblyDispatch() = default;
+
+NEPoolingAssemblyDispatch::NEPoolingAssemblyDispatch(std::shared_ptr<IMemoryManager> memory_manager)
+    : _impl(std::make_unique<Impl>()),
+      _memory_group(std::move(memory_manager)),
+      _workspace()
+{
+}
+
+void NEPoolingAssemblyDispatch::configure(const ITensor *input, ITensor *output, const PoolingLayerInfo &info)
+{
+    ARM_COMPUTE_ERROR_ON_NULLPTR(input, output);
+
+    _impl->src       = input;
+    _impl->dst       = output;
+    _impl->workspace = &_workspace;
+
+    _impl->op = std::make_unique<experimental::NEPoolingAssemblyDispatch>();
+    _impl->op->configure(input->info(), output->info(), info);
+
+    const auto workspace = _impl->op->workspace().at(0);
+    if(workspace.size > 0)
+    {
+        // Allocate workspace
+        allocate_workspace(workspace.size, workspace.alignment);
+    }
+}
+
+Status NEPoolingAssemblyDispatch::validate(const ITensorInfo *input, const ITensorInfo *output, const PoolingLayerInfo &info)
+{
+    return experimental::NEPoolingAssemblyDispatch::validate(input, output, info);
+}
+
+bool NEPoolingAssemblyDispatch::is_configured() const
+{
+    return _impl->op->is_configured();
+}
+
+void NEPoolingAssemblyDispatch::run()
+{
+    ITensorPack pack;
+    pack.add_tensor(TensorType::ACL_SRC, _impl->src);
+    pack.add_tensor(TensorType::ACL_DST_0, _impl->dst);
+    pack.add_tensor(TensorType::ACL_DST_1, _impl->workspace);
+    _impl->op->run(pack);
+}
+
+void NEPoolingAssemblyDispatch::allocate_workspace(size_t workspace_size, size_t alignment)
+{
+    ARM_COMPUTE_ERROR_ON_MSG(workspace_size == 0, "size cannot be 0");
+    _workspace.allocator()->init(TensorInfo(TensorShape{ (workspace_size + alignment /* FIXME: remove alignment after COMPMID-1088 */) }, 1, DataType::S8), alignment);
+    _memory_group.manage(&_workspace);
+    _workspace.allocator()->allocate();
+}
+} //namespace arm_compute
diff --git a/src/runtime/NEON/functions/NEPoolingAssemblyDispatch.h b/src/runtime/NEON/functions/NEPoolingAssemblyDispatch.h
new file mode 100644
index 0000000..f6d232b
--- /dev/null
+++ b/src/runtime/NEON/functions/NEPoolingAssemblyDispatch.h
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2021 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_NEPOOLINGASSEMBLYDISPATCH_H
+#define ARM_COMPUTE_NEPOOLINGASSEMBLYDISPATCH_H
+
+#include "arm_compute/runtime/IFunction.h"
+#include "arm_compute/runtime/IMemoryManager.h"
+#include "arm_compute/runtime/MemoryGroup.h"
+#include "arm_compute/runtime/NEON/INEOperator.h"
+#include "arm_compute/runtime/Tensor.h"
+#include "src/core/NEON/INEKernel.h"
+
+namespace arm_compute
+{
+// Forward Declarations
+class ITensor;
+struct PoolingLayerInfo;
+
+/** Assembly kernel glue */
+class NEPoolingAssemblyDispatch : public IFunction
+{
+public:
+    /** Constructor */
+    NEPoolingAssemblyDispatch(std::shared_ptr<IMemoryManager> memory_manager = nullptr);
+    /** Prevent instances of this class from being copied (As this class contains pointers) */
+    NEPoolingAssemblyDispatch(const NEPoolingAssemblyDispatch &) = delete;
+    /** Default move constructor */
+    NEPoolingAssemblyDispatch(NEPoolingAssemblyDispatch &&);
+    /** Prevent instances of this class from being copied (As this class contains pointers) */
+    NEPoolingAssemblyDispatch &operator=(const NEPoolingAssemblyDispatch &) = delete;
+    /** Default move assignment operator */
+    NEPoolingAssemblyDispatch &operator=(NEPoolingAssemblyDispatch &&);
+    /** Destructor */
+    ~NEPoolingAssemblyDispatch();
+
+    /** If supported create an assembly routine, else fallback to Compute Library function.
+     *
+     * @param[in]  input  Input tensor. Data types supported: QASYMM8/QASYMM8_SIGNED/F16/F32.
+     * @param[out] output Output tensor to store the result of pooling. Data types supported: same as @p input.
+     * @param[in]  info   Pooling meta-data
+     */
+    void configure(const ITensor *input, ITensor *output, const PoolingLayerInfo &info);
+
+    /** Indicates whether or not this function can be used to process the given parameters.
+     *
+     * @param[in] input  Input tensor info. Data types supported: QASYMM8/QASYMM8_SIGNED/F16/F32.
+     * @param[in] output Output tensor to store the result of pooling. Data types supported: same as @p input.
+     * @param[in] info   Pooling meta-data
+     *
+     * @return a status.
+     */
+    static Status validate(const ITensorInfo *input, const ITensorInfo *output, const PoolingLayerInfo &info);
+
+    /** Was the function successfully configured ?
+     *
+     * @return True if the function is configured and ready to run
+     */
+    bool is_configured() const;
+
+    // Inherited methods overridden:
+    void run() override;
+
+private:
+    /** Helper function to allocate memory for the workspace needed by the
+     * assembly kernels
+     *
+     * @param[in] workspace_size Total size of the workspace.
+     * @param[in] alignment      Alignment requirement in bytes.
+     */
+    void allocate_workspace(size_t workspace_size, size_t alignment);
+
+    struct Impl;
+    std::unique_ptr<Impl> _impl;
+
+    MemoryGroup _memory_group{};
+    Tensor      _workspace{};
+};
+
+namespace experimental
+{
+/** Basic function to run pooling assembly kernels */
+class NEPoolingAssemblyDispatch : public INEOperator
+{
+public:
+    /** Constructor */
+    NEPoolingAssemblyDispatch() = default;
+    /** Prevent instances of this class from being copied */
+    NEPoolingAssemblyDispatch(const NEPoolingAssemblyDispatch &) = delete;
+    /** Default move constructor */
+    NEPoolingAssemblyDispatch(NEPoolingAssemblyDispatch &&) = default;
+    /** Prevent instances of this class from being copied */
+    NEPoolingAssemblyDispatch &operator=(const NEPoolingAssemblyDispatch &) = delete;
+    /** Default move assignment operator */
+    NEPoolingAssemblyDispatch &operator=(NEPoolingAssemblyDispatch &&) = default;
+    /** Destructor */
+    ~NEPoolingAssemblyDispatch();
+
+    /** If supported create an assembly routine, else fallback to Compute Library function.
+     *
+     * @param[in]  input  Input tensor. Data types supported: QASYMM8/QASYMM8_SIGNED/F16/F32.
+     * @param[out] output Output tensor to store the result of pooling. Data types supported: same as @p input.
+     * @param[in]  info   Pooling meta-data
+     */
+    void configure(const ITensorInfo *input, ITensorInfo *output, const PoolingLayerInfo &info);
+
+    /** Indicates whether or not this function can be used to process the given parameters.
+     *
+     * @param[in] input  Input tensor info. Data types supported: QASYMM8/QASYMM8_SIGNED/F16/F32.
+     * @param[in] output Output tensor to store the result of pooling. Data types supported: same as @p input.
+     * @param[in] info   Pooling meta-data
+     *
+     * @return a status.
+     */
+    static Status validate(const ITensorInfo *input, const ITensorInfo *output, const PoolingLayerInfo &info);
+    /** Was the function successfully configured ?
+     *
+     * @return True if the function is configured and ready to run
+     */
+    bool is_configured() const;
+    // Run method overriden
+    void run(ITensorPack &tensors) override;
+
+private:
+    bool _is_global_pooling_layer{ false };
+};
+} // namespace experimental
+} // namespace arm_compute
+#endif /* ARM_COMPUTE_NEPOOLINGASSEMBLYDISPATCH_H */
diff --git a/src/runtime/NEON/functions/NEPoolingLayer.cpp b/src/runtime/NEON/functions/NEPoolingLayer.cpp
index 887f00d..0c857b5 100644
--- a/src/runtime/NEON/functions/NEPoolingLayer.cpp
+++ b/src/runtime/NEON/functions/NEPoolingLayer.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2020 Arm Limited.
+ * Copyright (c) 2017-2021 Arm Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -27,73 +27,99 @@
 #include "arm_compute/runtime/NEON/NEScheduler.h"
 #include "src/core/NEON/kernels/NEFillBorderKernel.h"
 #include "src/core/NEON/kernels/NEPoolingLayerKernel.h"
+#include "src/runtime/NEON/functions/NEPoolingAssemblyDispatch.h"
 
 namespace arm_compute
 {
 NEPoolingLayer::~NEPoolingLayer() = default;
 
-NEPoolingLayer::NEPoolingLayer()
-    : _pooling_layer_kernel(), _border_handler(), _is_global_pooling_layer(false), _data_layout(DataLayout::NCHW)
+NEPoolingLayer::NEPoolingLayer(std::shared_ptr<IMemoryManager> memory_manager)
+    : _memory_manager(std::move(memory_manager)), _pooling_layer_kernel(), _border_handler(), _asm_glue(), _is_global_pooling_layer(false), _data_layout(DataLayout::NCHW)
 {
 }
 
 void NEPoolingLayer::configure(ITensor *input, ITensor *output, const PoolingLayerInfo &pool_info, ITensor *indices)
 {
-    // Check if we have Global Pooling Layer
-    _is_global_pooling_layer = (input->info()->dimension(0) == pool_info.pool_size.width) && (input->info()->dimension(1) == pool_info.pool_size.height);
+    // Check if we can run assembly kernels. Currently, indices are not supported by those kernels
+    const bool run_optimised = bool(NEPoolingAssemblyDispatch::validate(input->info(), output->info(), pool_info)) && (indices == nullptr);
 
-    // Get data layout
-    _data_layout = pool_info.data_layout == DataLayout::UNKNOWN ? input->info()->data_layout() : pool_info.data_layout;
-
-    // Configure pooling kernel
-    _pooling_layer_kernel = std::make_unique<NEPoolingLayerKernel>();
-    _pooling_layer_kernel->configure(input, output, pool_info, indices);
-
-    switch(_data_layout)
+    if(run_optimised)
     {
-        case DataLayout::NCHW:
+        _asm_glue = std::make_unique<NEPoolingAssemblyDispatch>(_memory_manager);
+        _asm_glue->configure(input, output, pool_info);
+        ARM_COMPUTE_ERROR_ON(!_asm_glue->is_configured());
+    }
+    else
+    {
+        // Check if we have Global Pooling Layer
+        _is_global_pooling_layer = (input->info()->dimension(0) == pool_info.pool_size.width) && (input->info()->dimension(1) == pool_info.pool_size.height);
+
+        // Get data layout
+        _data_layout = pool_info.data_layout == DataLayout::UNKNOWN ? input->info()->data_layout() : pool_info.data_layout;
+
+        // Configure pooling kernel
+        _pooling_layer_kernel = std::make_unique<NEPoolingLayerKernel>();
+        _pooling_layer_kernel->configure(input, output, pool_info, indices);
+
+        switch(_data_layout)
         {
-            // Configure border depending on operation required (quantize border in case of asymmetric data_type)
-            BorderMode border_mode = (!indices && pool_info.pool_type == PoolingType::MAX) ? BorderMode::REPLICATE : BorderMode::CONSTANT;
-            PixelValue zero_value((indices) ? std::numeric_limits<int>::min() : 0.f);
-            if(is_data_type_quantized_asymmetric(input->info()->data_type()) && !pool_info.exclude_padding)
+            case DataLayout::NCHW:
             {
-                zero_value = PixelValue(0, input->info()->data_type(), input->info()->quantization_info());
+                // Configure border depending on operation required (quantize border in case of asymmetric data_type)
+                BorderMode border_mode = (!indices && pool_info.pool_type == PoolingType::MAX) ? BorderMode::REPLICATE : BorderMode::CONSTANT;
+                PixelValue zero_value((indices) ? std::numeric_limits<int>::min() : 0.f);
+                if(is_data_type_quantized_asymmetric(input->info()->data_type()) && !pool_info.exclude_padding)
+                {
+                    zero_value = PixelValue(0, input->info()->data_type(), input->info()->quantization_info());
+                }
+                _border_handler = std::make_unique<NEFillBorderKernel>();
+                _border_handler->configure(input, _pooling_layer_kernel->border_size(), border_mode, zero_value);
+                break;
             }
-            _border_handler = std::make_unique<NEFillBorderKernel>();
-            _border_handler->configure(input, _pooling_layer_kernel->border_size(), border_mode, zero_value);
-            break;
+            case DataLayout::NHWC:
+                break;
+            default:
+                ARM_COMPUTE_ERROR("Data layout not supported");
         }
-        case DataLayout::NHWC:
-            break;
-        default:
-            ARM_COMPUTE_ERROR("Data layout not supported");
     }
 }
 
 Status NEPoolingLayer::validate(const ITensorInfo *input, const ITensorInfo *output, const PoolingLayerInfo &pool_info, const ITensorInfo *indices)
 {
+    const bool run_optimised = bool(NEPoolingAssemblyDispatch::validate(input, output, pool_info)) && (indices == nullptr);
+
+    if(run_optimised)
+    {
+        return Status{};
+    }
+
     return NEPoolingLayerKernel::validate(input, output, pool_info, indices);
 }
 
 void NEPoolingLayer::run()
 {
-    switch(_data_layout)
+    if(_asm_glue && _asm_glue->is_configured())
     {
-        case DataLayout::NCHW:
-            // Fill border
-            NEScheduler::get().schedule(_border_handler.get(), Window::DimY);
+        _asm_glue->run();
+    }
+    else
+    {
+        switch(_data_layout)
+        {
+            case DataLayout::NCHW:
+                // Fill border
+                NEScheduler::get().schedule(_border_handler.get(), Window::DimY);
 
-            // Run pooling layer
-            NEScheduler::get().schedule(_pooling_layer_kernel.get(), _is_global_pooling_layer ? Window::DimZ : Window::DimY);
-            break;
-        case DataLayout::NHWC:
-            // Run pooling layer
-            NEScheduler::get().schedule(_pooling_layer_kernel.get(), Window::DimX);
-            break;
-        default:
-            ARM_COMPUTE_ERROR("Data layout not supported");
+                // Run pooling layer
+                NEScheduler::get().schedule(_pooling_layer_kernel.get(), _is_global_pooling_layer ? Window::DimZ : Window::DimY);
+                break;
+            case DataLayout::NHWC:
+                // Run pooling layer
+                NEScheduler::get().schedule(_pooling_layer_kernel.get(), Window::DimX);
+                break;
+            default:
+                ARM_COMPUTE_ERROR("Data layout not supported");
+        }
     }
 }
-
 } // namespace arm_compute
