IVGCVSW-1709: Clean up memory manager bodge

 * Added quick workaround for the memory management errors in the
   CL/Neon unit tests

Change-Id: I56250db462cdbdc1acc0a5824807d288fb0c1d11
diff --git a/src/armnn/LoadedNetwork.cpp b/src/armnn/LoadedNetwork.cpp
index f58a115..92433d1 100644
--- a/src/armnn/LoadedNetwork.cpp
+++ b/src/armnn/LoadedNetwork.cpp
@@ -132,12 +132,6 @@
 
     // Set up memory.
     m_OptimizedNetwork->GetGraph().AllocateDynamicBuffers();
-
-    // Finalize the workload factories before execution.
-    for (auto&& workloadFactory : m_WorkloadFactories)
-    {
-        workloadFactory.second->Finalize();
-    }
 }
 
 TensorInfo LoadedNetwork::GetInputTensorInfo(LayerBindingId layerId) const
diff --git a/src/backends/aclCommon/BaseMemoryManager.cpp b/src/backends/aclCommon/BaseMemoryManager.cpp
new file mode 100644
index 0000000..4e0d14c
--- /dev/null
+++ b/src/backends/aclCommon/BaseMemoryManager.cpp
@@ -0,0 +1,98 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+#include "BaseMemoryManager.hpp"
+
+#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED)
+#include "arm_compute/runtime/BlobLifetimeManager.h"
+#include "arm_compute/runtime/PoolManager.h"
+#include "arm_compute/runtime/OffsetLifetimeManager.h"
+#endif
+
+#include <boost/polymorphic_cast.hpp>
+
+namespace armnn
+{
+
+#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED)
+BaseMemoryManager::BaseMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc,
+                                     MemoryAffinity memoryAffinity)
+{
+    BOOST_ASSERT(alloc);
+    m_Allocator = std::move(alloc);
+
+    m_IntraLayerMemoryMgr = CreateArmComputeMemoryManager(memoryAffinity);
+    m_InterLayerMemoryMgr = CreateArmComputeMemoryManager(memoryAffinity);
+}
+
+std::shared_ptr<arm_compute::MemoryManagerOnDemand>
+BaseMemoryManager::CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity)
+{
+    std::shared_ptr<arm_compute::ILifetimeManager> lifetimeManager = nullptr;
+
+    if (memoryAffinity == MemoryAffinity::Buffer)
+    {
+        lifetimeManager = std::make_shared<arm_compute::BlobLifetimeManager>();
+    }
+    else
+    {
+        lifetimeManager = std::make_shared<arm_compute::OffsetLifetimeManager>();
+    }
+
+    auto poolManager   = std::make_shared<arm_compute::PoolManager>();
+    auto memoryManager = std::make_shared<arm_compute::MemoryManagerOnDemand>(lifetimeManager, poolManager);
+
+    return memoryManager;
+}
+
+void BaseMemoryManager::Acquire()
+{
+    static const size_t s_NumPools = 1;
+
+    // Allocate memory pools for intra-layer memory manager
+    BOOST_ASSERT(m_IntraLayerMemoryMgr);
+    m_IntraLayerMemoryMgr->populate(*m_Allocator, s_NumPools);
+
+    // Allocate memory pools for inter-layer memory manager
+    BOOST_ASSERT(m_InterLayerMemoryMgr);
+    m_InterLayerMemoryMgr->populate(*m_Allocator, s_NumPools);
+
+    // Acquire inter-layer memory group. NOTE: This has to come after allocating the pools
+    BOOST_ASSERT(m_InterLayerMemoryGroup);
+    m_InterLayerMemoryGroup->acquire();
+}
+
+void BaseMemoryManager::Release()
+{
+    // Release inter-layer memory group. NOTE: This has to come before releasing the pools
+    BOOST_ASSERT(m_InterLayerMemoryGroup);
+    m_InterLayerMemoryGroup->release();
+
+    // Release memory pools managed by intra-layer memory manager
+    BOOST_ASSERT(m_IntraLayerMemoryMgr);
+    m_IntraLayerMemoryMgr->clear();
+
+    // Release memory pools managed by inter-layer memory manager
+    BOOST_ASSERT(m_InterLayerMemoryMgr);
+    m_InterLayerMemoryMgr->clear();
+}
+#endif
+
+#ifdef ARMCOMPUTENEON_ENABLED
+std::shared_ptr<arm_compute::IMemoryGroup>
+NeonMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
+{
+    return std::make_shared<arm_compute::MemoryGroup>(memoryManager);
+}
+#endif
+
+#ifdef ARMCOMPUTECL_ENABLED
+std::shared_ptr<arm_compute::IMemoryGroup>
+ClMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
+{
+    return std::make_shared<arm_compute::CLMemoryGroup>(memoryManager);
+}
+#endif
+
+}
diff --git a/src/backends/aclCommon/memory/BaseMemoryManager.hpp b/src/backends/aclCommon/BaseMemoryManager.hpp
similarity index 96%
rename from src/backends/aclCommon/memory/BaseMemoryManager.hpp
rename to src/backends/aclCommon/BaseMemoryManager.hpp
index a6ffff7..ffa440b 100644
--- a/src/backends/aclCommon/memory/BaseMemoryManager.hpp
+++ b/src/backends/aclCommon/BaseMemoryManager.hpp
@@ -43,12 +43,10 @@
     std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetInterLayerManager() { return m_InterLayerMemoryMgr; }
     std::shared_ptr<arm_compute::IMemoryGroup>& GetInterLayerMemoryGroup()      { return m_InterLayerMemoryGroup; }
 
-    void Finalize();
     void Acquire();
     void Release();
 
 protected:
-
     std::unique_ptr<arm_compute::IAllocator>            m_Allocator;
     std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_IntraLayerMemoryMgr;
     std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_InterLayerMemoryMgr;
@@ -59,7 +57,6 @@
     virtual std::shared_ptr<arm_compute::IMemoryGroup>
     CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) = 0;
 
-    void FinalizeMemoryManager(arm_compute::MemoryManagerOnDemand& memoryManager);
 #endif
 };
 
diff --git a/src/backends/aclCommon/CMakeLists.txt b/src/backends/aclCommon/CMakeLists.txt
index 83c7c87..933d7ab 100644
--- a/src/backends/aclCommon/CMakeLists.txt
+++ b/src/backends/aclCommon/CMakeLists.txt
@@ -7,20 +7,8 @@
     ArmComputeTensorUtils.hpp
     ArmComputeTensorUtils.cpp
     ArmComputeUtils.hpp
-    memory/BaseMemoryManager.cpp
-    memory/BaseMemoryManager.hpp
-    memory/BlobLifetimeManager.cpp
-    memory/BlobLifetimeManager.hpp
-    memory/BlobMemoryPool.cpp
-    memory/BlobMemoryPool.hpp
-    memory/IMemoryPool.hpp
-    memory/IPoolManager.hpp
-    memory/OffsetLifetimeManager.cpp
-    memory/OffsetLifetimeManager.hpp
-    memory/OffsetMemoryPool.cpp
-    memory/OffsetMemoryPool.hpp
-    memory/PoolManager.cpp
-    memory/PoolManager.hpp
+    BaseMemoryManager.cpp
+    BaseMemoryManager.hpp
 )
 
 if(BUILD_UNIT_TESTS)
diff --git a/src/backends/aclCommon/common.mk b/src/backends/aclCommon/common.mk
index 67ba01b..cebceaf 100644
--- a/src/backends/aclCommon/common.mk
+++ b/src/backends/aclCommon/common.mk
@@ -9,12 +9,7 @@
 
 COMMON_SOURCES := \
     ArmComputeTensorUtils.cpp \
-    memory/BaseMemoryManager.cpp \
-    memory/BlobLifetimeManager.cpp \
-    memory/BlobMemoryPool.cpp \
-    memory/OffsetLifetimeManager.cpp \
-    memory/OffsetMemoryPool.cpp \
-    memory/PoolManager.cpp
+    BaseMemoryManager.cpp
 
 # COMMON_TEST_SOURCES contains the list of files to be included
 # in the Android unit test build (armnn-tests) and it is picked
diff --git a/src/backends/aclCommon/memory/BaseMemoryManager.cpp b/src/backends/aclCommon/memory/BaseMemoryManager.cpp
deleted file mode 100644
index 532692b..0000000
--- a/src/backends/aclCommon/memory/BaseMemoryManager.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#include "BaseMemoryManager.hpp"
-
-#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED)
-#include "BlobLifetimeManager.hpp"
-#include "PoolManager.hpp"
-#include "OffsetLifetimeManager.hpp"
-#endif
-
-#include <boost/polymorphic_cast.hpp>
-
-namespace armnn
-{
-
-#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED)
-BaseMemoryManager::BaseMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc,
-                                     MemoryAffinity memoryAffinity)
-{
-    // (Re)create the memory manager components.
-    m_Allocator = std::move(alloc);
-
-    m_IntraLayerMemoryMgr = CreateArmComputeMemoryManager(memoryAffinity);
-    m_InterLayerMemoryMgr = CreateArmComputeMemoryManager(memoryAffinity);
-}
-
-std::shared_ptr<arm_compute::MemoryManagerOnDemand>
-BaseMemoryManager::CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity)
-{
-    std::shared_ptr<arm_compute::ILifetimeManager> lifetimeManager = nullptr;
-
-    if (memoryAffinity == MemoryAffinity::Buffer)
-    {
-        lifetimeManager = std::make_shared<BlobLifetimeManager>();
-    }
-    else
-    {
-        lifetimeManager = std::make_shared<OffsetLifetimeManager>();
-    }
-
-    auto poolManager   = std::make_shared<PoolManager>();
-    auto memoryManager = std::make_shared<arm_compute::MemoryManagerOnDemand>(lifetimeManager, poolManager);
-
-    // Set allocator that the memory manager will use
-    memoryManager->set_allocator(m_Allocator.get());
-
-    return memoryManager;
-}
-
-void BaseMemoryManager::FinalizeMemoryManager(arm_compute::MemoryManagerOnDemand& memoryManager)
-{
-    // Number of pools that the manager will create. This specifies how many layers you want to run in parallel
-    memoryManager.set_num_pools(1);
-
-    // Finalize the memory manager. (Validity checks, memory allocations, etc)
-    memoryManager.finalize();
-}
-
-void BaseMemoryManager::Finalize()
-{
-    BOOST_ASSERT(m_IntraLayerMemoryMgr);
-    FinalizeMemoryManager(*m_IntraLayerMemoryMgr.get());
-
-    BOOST_ASSERT(m_InterLayerMemoryMgr);
-    FinalizeMemoryManager(*m_InterLayerMemoryMgr.get());
-}
-
-void BaseMemoryManager::Acquire()
-{
-    // Allocate memory pools for intra-layer memory manager
-    BOOST_ASSERT(m_IntraLayerMemoryMgr);
-    IPoolManager* poolManager = boost::polymorphic_downcast<IPoolManager*>(m_IntraLayerMemoryMgr->pool_manager());
-    BOOST_ASSERT(poolManager);
-    poolManager->AllocatePools();
-
-    // Allocate memory pools for inter-layer memory manager
-    BOOST_ASSERT(m_InterLayerMemoryMgr);
-    poolManager = boost::polymorphic_downcast<IPoolManager*>(m_InterLayerMemoryMgr->pool_manager());
-    BOOST_ASSERT(poolManager);
-    poolManager->AllocatePools();
-
-    // Acquire inter-layer memory group. NOTE: This has to come after allocating the pools
-    BOOST_ASSERT(m_InterLayerMemoryGroup);
-    m_InterLayerMemoryGroup->acquire();
-}
-
-void BaseMemoryManager::Release()
-{
-    // Release inter-layer memory group. NOTE: This has to come before releasing the pools
-    BOOST_ASSERT(m_InterLayerMemoryGroup);
-    m_InterLayerMemoryGroup->release();
-
-    // Release memory pools managed by intra-layer memory manager
-    BOOST_ASSERT(m_IntraLayerMemoryMgr);
-    IPoolManager* poolManager = boost::polymorphic_downcast<IPoolManager*>(m_IntraLayerMemoryMgr->pool_manager());
-    BOOST_ASSERT(poolManager);
-    poolManager->ReleasePools();
-
-    // Release memory pools managed by inter-layer memory manager
-    BOOST_ASSERT(m_InterLayerMemoryMgr);
-    poolManager = boost::polymorphic_downcast<IPoolManager*>(m_InterLayerMemoryMgr->pool_manager());
-    BOOST_ASSERT(poolManager);
-    poolManager->ReleasePools();
-}
-#endif
-
-#ifdef ARMCOMPUTENEON_ENABLED
-std::shared_ptr<arm_compute::IMemoryGroup>
-NeonMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
-{
-    return std::make_shared<arm_compute::MemoryGroup>(memoryManager);
-}
-#endif
-
-#ifdef ARMCOMPUTECL_ENABLED
-std::shared_ptr<arm_compute::IMemoryGroup>
-ClMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
-{
-    return std::make_shared<arm_compute::CLMemoryGroup>(memoryManager);
-}
-#endif
-
-}
diff --git a/src/backends/aclCommon/memory/BlobLifetimeManager.cpp b/src/backends/aclCommon/memory/BlobLifetimeManager.cpp
deleted file mode 100644
index 41100e9..0000000
--- a/src/backends/aclCommon/memory/BlobLifetimeManager.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#include "BlobLifetimeManager.hpp"
-#include "BlobMemoryPool.hpp"
-
-#include <arm_compute/runtime/IMemoryGroup.h>
-
-#include "boost/assert.hpp"
-
-#include <algorithm>
-
-namespace armnn
-{
-
-BlobLifetimeManager::BlobLifetimeManager()
-    : m_BlobSizes()
-{
-}
-
-arm_compute::MappingType BlobLifetimeManager::mapping_type() const
-{
-    return arm_compute::MappingType::BLOBS;
-}
-
-void BlobLifetimeManager::update_blobs_and_mappings()
-{
-    using namespace arm_compute;
-
-    BOOST_ASSERT(are_all_finalized());
-    BOOST_ASSERT(_active_group);
-
-    // Sort free blobs requirements in descending order.
-    _free_blobs.sort([](const Blob & ba, const Blob & bb)
-                     {
-                         return ba.max_size > bb.max_size;
-                     });
-    std::vector<size_t> groupSizes;
-    std::transform(std::begin(_free_blobs), std::end(_free_blobs), std::back_inserter(groupSizes), [](const Blob & b)
-    {
-        return b.max_size;
-    });
-
-    // Update blob sizes
-    size_t max_size = std::max(m_BlobSizes.size(), groupSizes.size());
-    m_BlobSizes.resize(max_size, 0);
-    groupSizes.resize(max_size, 0);
-    std::transform(std::begin(m_BlobSizes), std::end(m_BlobSizes), std::begin(groupSizes),
-        std::begin(m_BlobSizes), [](size_t lhs, size_t rhs)
-    {
-        return std::max(lhs, rhs);
-    });
-
-    // Calculate group mappings
-    auto& groupMappings  = _active_group->mappings();
-    unsigned int blobIdx = 0;
-
-    for(auto& freeBlob : _free_blobs)
-    {
-        for(auto& boundElementId : freeBlob.bound_elements)
-        {
-            BOOST_ASSERT(_active_elements.find(boundElementId) != std::end(_active_elements));
-
-            Element& boundElement = _active_elements[boundElementId];
-            groupMappings[boundElement.handle] = blobIdx;
-        }
-
-        ++blobIdx;
-    }
-}
-
-std::unique_ptr<arm_compute::IMemoryPool> BlobLifetimeManager::create_pool(arm_compute::IAllocator* allocator)
-{
-    BOOST_ASSERT(allocator);
-    return std::make_unique<BlobMemoryPool>(allocator, m_BlobSizes);
-}
-
-} // namespace armnn
\ No newline at end of file
diff --git a/src/backends/aclCommon/memory/BlobLifetimeManager.hpp b/src/backends/aclCommon/memory/BlobLifetimeManager.hpp
deleted file mode 100644
index d777ba5..0000000
--- a/src/backends/aclCommon/memory/BlobLifetimeManager.hpp
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include <arm_compute/runtime/ISimpleLifetimeManager.h>
-
-namespace armnn
-{
-
-class BlobLifetimeManager : public arm_compute::ISimpleLifetimeManager
-{
-public:
-    BlobLifetimeManager();
-
-    BlobLifetimeManager(const BlobLifetimeManager&) = delete;
-
-    BlobLifetimeManager& operator=(const BlobLifetimeManager&) = delete;
-
-    BlobLifetimeManager(BlobLifetimeManager&&) = default;
-
-    BlobLifetimeManager& operator=(BlobLifetimeManager&&) = default;
-
-    std::unique_ptr<arm_compute::IMemoryPool> create_pool(arm_compute::IAllocator* allocator) override;
-
-    arm_compute::MappingType mapping_type() const override;
-
-private:
-    void update_blobs_and_mappings() override;
-
-    std::vector<size_t> m_BlobSizes;
-};
-
-} // namespace armnn
\ No newline at end of file
diff --git a/src/backends/aclCommon/memory/BlobMemoryPool.cpp b/src/backends/aclCommon/memory/BlobMemoryPool.cpp
deleted file mode 100644
index 8b0a957..0000000
--- a/src/backends/aclCommon/memory/BlobMemoryPool.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#include "BlobMemoryPool.hpp"
-
-#include <boost/assert.hpp>
-
-namespace armnn
-{
-
-BlobMemoryPool::BlobMemoryPool(arm_compute::IAllocator* allocator, std::vector<size_t> blobSizes)
-        : m_Allocator(allocator)
-        , m_Blobs()
-        , m_BlobSizes(std::move(blobSizes))
-        , m_MemoryAllocated(false)
-{
-    AllocatePool();
-}
-
-BlobMemoryPool::~BlobMemoryPool()
-{
-    ReleasePool();
-}
-
-void BlobMemoryPool::acquire(arm_compute::MemoryMappings& handles)
-{
-    // Set memory to handlers
-    for (auto& handle : handles)
-    {
-        BOOST_ASSERT(handle.first);
-        *handle.first = m_Blobs[handle.second];
-    }
-}
-
-void BlobMemoryPool::release(arm_compute::MemoryMappings &handles)
-{
-    for (auto& handle : handles)
-    {
-        BOOST_ASSERT(handle.first);
-        *handle.first = nullptr;
-    }
-}
-
-arm_compute::MappingType BlobMemoryPool::mapping_type() const
-{
-    return arm_compute::MappingType::BLOBS;
-}
-
-std::unique_ptr<arm_compute::IMemoryPool> BlobMemoryPool::duplicate()
-{
-    BOOST_ASSERT(m_Allocator);
-    return std::make_unique<BlobMemoryPool>(m_Allocator, m_BlobSizes);
-}
-
-void BlobMemoryPool::AllocatePool()
-{
-    if (!m_MemoryAllocated)
-    {
-        BOOST_ASSERT(m_Allocator);
-
-        for (const auto& blobSize : m_BlobSizes)
-        {
-            m_Blobs.push_back(m_Allocator->allocate(blobSize, 0));
-        }
-
-        m_MemoryAllocated = true;
-    }
-}
-
-void BlobMemoryPool::ReleasePool()
-{
-    if (m_MemoryAllocated)
-    {
-        BOOST_ASSERT(m_Allocator);
-
-        for (auto& blob : m_Blobs)
-        {
-            m_Allocator->free(blob);
-        }
-
-        m_Blobs.clear();
-
-        m_MemoryAllocated = false;
-    }
-}
-
-} // namespace armnn
\ No newline at end of file
diff --git a/src/backends/aclCommon/memory/BlobMemoryPool.hpp b/src/backends/aclCommon/memory/BlobMemoryPool.hpp
deleted file mode 100644
index 4d42e6e..0000000
--- a/src/backends/aclCommon/memory/BlobMemoryPool.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include "IMemoryPool.hpp"
-
-#include <arm_compute/runtime/IAllocator.h>
-#include <arm_compute/runtime/Types.h>
-
-namespace armnn
-{
-
-/** Blob memory pool */
-class BlobMemoryPool : public IMemoryPool
-{
-public:
-    BlobMemoryPool(arm_compute::IAllocator* allocator, std::vector<size_t> blobSizes);
-
-    ~BlobMemoryPool();
-
-    BlobMemoryPool(const BlobMemoryPool&) = delete;
-
-    BlobMemoryPool& operator=(const BlobMemoryPool&) = delete;
-
-    BlobMemoryPool(BlobMemoryPool&&) = default;
-
-    BlobMemoryPool& operator=(BlobMemoryPool&&) = default;
-
-    void acquire(arm_compute::MemoryMappings &handles) override;
-    void release(arm_compute::MemoryMappings &handles) override;
-
-    arm_compute::MappingType mapping_type() const override;
-
-    std::unique_ptr<arm_compute::IMemoryPool> duplicate() override;
-
-    void AllocatePool() override;
-    void ReleasePool() override;
-
-private:
-    /// Allocator to use for internal allocation
-    arm_compute::IAllocator* m_Allocator;
-
-    /// Vector holding all the memory blobs
-    std::vector<void*> m_Blobs;
-
-    /// Sizes of each memory blob
-    std::vector<size_t> m_BlobSizes;
-
-    /// Flag indicating whether memory has been allocated for the pool
-    bool m_MemoryAllocated;
-};
-
-} // namespace armnn
\ No newline at end of file
diff --git a/src/backends/aclCommon/memory/IMemoryPool.hpp b/src/backends/aclCommon/memory/IMemoryPool.hpp
deleted file mode 100644
index 9913069..0000000
--- a/src/backends/aclCommon/memory/IMemoryPool.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include <arm_compute/runtime/IMemoryPool.h>
-
-namespace armnn
-{
-
-class IMemoryPool : public arm_compute::IMemoryPool
-{
-public:
-    /// Allocates memory for the entire pool
-    virtual void AllocatePool() = 0;
-
-    /// Releases all memory associated with the pool
-    virtual void ReleasePool() = 0;
-};
-
-} // namespace armnn
\ No newline at end of file
diff --git a/src/backends/aclCommon/memory/IPoolManager.hpp b/src/backends/aclCommon/memory/IPoolManager.hpp
deleted file mode 100644
index be15fdd..0000000
--- a/src/backends/aclCommon/memory/IPoolManager.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include <arm_compute/runtime/IPoolManager.h>
-
-namespace armnn
-{
-
-class IPoolManager : public arm_compute::IPoolManager {
-public:
-    // Allocates all pools within the pool manager
-    virtual void AllocatePools() = 0;
-
-    // Releases all pools within the pool manager
-    virtual void ReleasePools() = 0;
-};
-
-} // namespace armnn
\ No newline at end of file
diff --git a/src/backends/aclCommon/memory/OffsetLifetimeManager.cpp b/src/backends/aclCommon/memory/OffsetLifetimeManager.cpp
deleted file mode 100644
index d0174f8..0000000
--- a/src/backends/aclCommon/memory/OffsetLifetimeManager.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#include "OffsetLifetimeManager.hpp"
-#include "OffsetMemoryPool.hpp"
-
-#include <arm_compute/runtime/IMemoryGroup.h>
-
-#include <numeric>
-
-#include <boost/assert.hpp>
-
-namespace armnn
-{
-
-OffsetLifetimeManager::OffsetLifetimeManager()
-    : m_BlobSize(0)
-{
-}
-
-std::unique_ptr<arm_compute::IMemoryPool> OffsetLifetimeManager::create_pool(arm_compute::IAllocator* allocator)
-{
-    BOOST_ASSERT(allocator);
-    return std::make_unique<OffsetMemoryPool>(allocator, m_BlobSize);
-}
-
-arm_compute::MappingType OffsetLifetimeManager::mapping_type() const
-{
-    return arm_compute::MappingType::OFFSETS;
-}
-
-void OffsetLifetimeManager::update_blobs_and_mappings()
-{
-    BOOST_ASSERT(are_all_finalized());
-    BOOST_ASSERT(_active_group);
-
-    // Update blob size
-    size_t maxGroupSize = std::accumulate(std::begin(_free_blobs), std::end(_free_blobs),
-        static_cast<size_t>(0), [](size_t s, const Blob& b)
-    {
-        return s + b.max_size;
-    });
-    m_BlobSize = std::max(m_BlobSize, maxGroupSize);
-
-    // Calculate group mappings
-    auto& groupMappings = _active_group->mappings();
-    size_t offset = 0;
-    for(auto& freeBlob : _free_blobs)
-    {
-        for(auto& boundElementId : freeBlob.bound_elements)
-        {
-            BOOST_ASSERT(_active_elements.find(boundElementId) != std::end(_active_elements));
-            Element& boundElement = _active_elements[boundElementId];
-            groupMappings[boundElement.handle] = offset;
-        }
-        offset += freeBlob.max_size;
-        BOOST_ASSERT(offset <= m_BlobSize);
-    }
-}
-
-} // namespace armnn
\ No newline at end of file
diff --git a/src/backends/aclCommon/memory/OffsetLifetimeManager.hpp b/src/backends/aclCommon/memory/OffsetLifetimeManager.hpp
deleted file mode 100644
index 1283193..0000000
--- a/src/backends/aclCommon/memory/OffsetLifetimeManager.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include <arm_compute/runtime/ISimpleLifetimeManager.h>
-
-namespace armnn
-{
-
-class OffsetLifetimeManager : public arm_compute::ISimpleLifetimeManager
-{
-public:
-    OffsetLifetimeManager();
-
-    OffsetLifetimeManager(const OffsetLifetimeManager&) = delete;
-
-    OffsetLifetimeManager& operator=(const OffsetLifetimeManager&) = delete;
-
-    OffsetLifetimeManager(OffsetLifetimeManager&&) = default;
-
-    OffsetLifetimeManager& operator=(OffsetLifetimeManager&&) = default;
-
-    std::unique_ptr<arm_compute::IMemoryPool> create_pool(arm_compute::IAllocator* allocator) override;
-
-    arm_compute::MappingType mapping_type() const override;
-
-private:
-    void update_blobs_and_mappings() override;
-
-private:
-    /// Memory blob size
-    size_t m_BlobSize;
-};
-
-} // namespace armnn
\ No newline at end of file
diff --git a/src/backends/aclCommon/memory/OffsetMemoryPool.cpp b/src/backends/aclCommon/memory/OffsetMemoryPool.cpp
deleted file mode 100644
index 48bea5e..0000000
--- a/src/backends/aclCommon/memory/OffsetMemoryPool.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#include "OffsetMemoryPool.hpp"
-
-#include <boost/assert.hpp>
-
-#include <algorithm>
-
-namespace armnn
-{
-
-OffsetMemoryPool::OffsetMemoryPool(arm_compute::IAllocator* allocator, size_t blobSize)
-    : m_Allocator(allocator)
-    , m_Blob()
-    , m_BlobSize(blobSize)
-    , m_MemoryAllocated(false)
-{
-    AllocatePool();
-}
-
-OffsetMemoryPool::~OffsetMemoryPool()
-{
-    ReleasePool();
-}
-
-void OffsetMemoryPool::acquire(arm_compute::MemoryMappings& handles)
-{
-    BOOST_ASSERT(m_Blob);
-
-    // Set memory to handlers
-    for(auto& handle : handles)
-    {
-        BOOST_ASSERT(handle.first);
-        *handle.first = reinterpret_cast<uint8_t*>(m_Blob) + handle.second;
-    }
-}
-
-void OffsetMemoryPool::release(arm_compute::MemoryMappings &handles)
-{
-    for(auto& handle : handles)
-    {
-        BOOST_ASSERT(handle.first);
-        *handle.first = nullptr;
-    }
-}
-
-arm_compute::MappingType OffsetMemoryPool::mapping_type() const
-{
-    return arm_compute::MappingType::OFFSETS;
-}
-
-std::unique_ptr<arm_compute::IMemoryPool> OffsetMemoryPool::duplicate()
-{
-    BOOST_ASSERT(m_Allocator);
-    return std::make_unique<OffsetMemoryPool>(m_Allocator, m_BlobSize);
-}
-
-void OffsetMemoryPool::AllocatePool()
-{
-    if (!m_MemoryAllocated)
-    {
-        BOOST_ASSERT(m_Allocator);
-        m_Blob = m_Allocator->allocate(m_BlobSize, 0);
-
-        m_MemoryAllocated = true;
-    }
-}
-
-void OffsetMemoryPool::ReleasePool()
-{
-    if (m_MemoryAllocated)
-    {
-        BOOST_ASSERT(m_Allocator);
-
-        m_Allocator->free(m_Blob);
-        m_Blob = nullptr;
-
-        m_MemoryAllocated = false;
-    }
-}
-
-} // namespace armnn
\ No newline at end of file
diff --git a/src/backends/aclCommon/memory/OffsetMemoryPool.hpp b/src/backends/aclCommon/memory/OffsetMemoryPool.hpp
deleted file mode 100644
index 25cf8cd..0000000
--- a/src/backends/aclCommon/memory/OffsetMemoryPool.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include "IMemoryPool.hpp"
-
-#include <arm_compute/runtime/IAllocator.h>
-#include <arm_compute/runtime/Types.h>
-
-namespace armnn
-{
-
-class OffsetMemoryPool : public IMemoryPool
-{
-public:
-    OffsetMemoryPool(arm_compute::IAllocator* allocator, size_t blobSize);
-
-    ~OffsetMemoryPool();
-
-    OffsetMemoryPool(const OffsetMemoryPool&) = delete;
-
-    OffsetMemoryPool& operator=(const OffsetMemoryPool&) = delete;
-
-    OffsetMemoryPool(OffsetMemoryPool&&) = default;
-
-    OffsetMemoryPool& operator=(OffsetMemoryPool &&) = default;
-
-    void acquire(arm_compute::MemoryMappings& handles) override;
-    void release(arm_compute::MemoryMappings& handles) override;
-
-    arm_compute::MappingType mapping_type() const override;
-
-    std::unique_ptr<arm_compute::IMemoryPool> duplicate() override;
-
-    void AllocatePool() override;
-    void ReleasePool() override;
-
-private:
-    /// Allocator to use for internal allocation
-    arm_compute::IAllocator* m_Allocator;
-
-    /// Memory blob
-    void* m_Blob;
-
-    /// Size of the allocated memory blob
-    size_t m_BlobSize;
-
-    /// Flag indicating whether memory has been allocated for the pool
-    bool m_MemoryAllocated;
-};
-
-} // namespace armnn
\ No newline at end of file
diff --git a/src/backends/aclCommon/memory/PoolManager.cpp b/src/backends/aclCommon/memory/PoolManager.cpp
deleted file mode 100644
index 363b459..0000000
--- a/src/backends/aclCommon/memory/PoolManager.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#include "IMemoryPool.hpp"
-#include "PoolManager.hpp"
-
-#include <boost/assert.hpp>
-#include <boost/polymorphic_cast.hpp>
-
-#include <algorithm>
-
-namespace armnn
-{
-
-PoolManager::PoolManager()
-        : m_FreePools()
-        , m_OccupiedPools()
-        , m_Semaphore()
-        , m_Mutex()
-{}
-
-arm_compute::IMemoryPool *PoolManager::lock_pool()
-{
-    BOOST_ASSERT_MSG(!(m_FreePools.empty() && m_OccupiedPools.empty()), "Haven't setup any pools");
-
-    m_Semaphore->wait();
-    std::lock_guard<arm_compute::Mutex> lock(m_Mutex);
-
-    BOOST_ASSERT_MSG(!m_FreePools.empty(), "Empty pool must exist as semaphore has been signalled");
-    m_OccupiedPools.splice(std::begin(m_OccupiedPools), m_FreePools, std::begin(m_FreePools));
-
-    return m_OccupiedPools.front().get();
-}
-
-void PoolManager::unlock_pool(arm_compute::IMemoryPool *pool)
-{
-    BOOST_ASSERT_MSG(!(m_FreePools.empty() && m_OccupiedPools.empty()), "Haven't setup any pools!");
-
-    std::lock_guard<arm_compute::Mutex> lock(m_Mutex);
-
-    auto it = std::find_if(
-            std::begin(m_OccupiedPools),
-            std::end(m_OccupiedPools),
-            [pool](const std::unique_ptr<arm_compute::IMemoryPool> &poolIterator)
-            {
-                return poolIterator.get() == pool;
-            }
-    );
-
-    BOOST_ASSERT_MSG(it != std::end(m_OccupiedPools), "Pool to be unlocked couldn't be found");
-    m_FreePools.splice(std::begin(m_FreePools), m_OccupiedPools, it);
-    m_Semaphore->signal();
-}
-
-void PoolManager::register_pool(std::unique_ptr<arm_compute::IMemoryPool> pool)
-{
-    std::lock_guard<arm_compute::Mutex> lock(m_Mutex);
-    BOOST_ASSERT_MSG(m_OccupiedPools.empty(), "All pools should be free in order to register a new one");
-
-    // Set pool
-    m_FreePools.push_front(std::move(pool));
-
-    // Update semaphore
-    m_Semaphore = std::make_unique<arm_compute::Semaphore>(m_FreePools.size());
-}
-
-size_t PoolManager::num_pools() const
-{
-    std::lock_guard<arm_compute::Mutex> lock(m_Mutex);
-
-    return m_FreePools.size() + m_OccupiedPools.size();
-}
-
-void PoolManager::AllocatePools()
-{
-    std::lock_guard<arm_compute::Mutex> lock(m_Mutex);
-
-    for (auto& pool : m_FreePools)
-    {
-        boost::polymorphic_downcast<IMemoryPool*>(pool.get())->AllocatePool();
-    }
-
-    for (auto& pool : m_OccupiedPools)
-    {
-        boost::polymorphic_downcast<IMemoryPool*>(pool.get())->AllocatePool();
-    }
-}
-
-void PoolManager::ReleasePools()
-{
-    std::lock_guard<arm_compute::Mutex> lock(m_Mutex);
-
-    for (auto& pool : m_FreePools)
-    {
-        boost::polymorphic_downcast<IMemoryPool*>(pool.get())->ReleasePool();
-    }
-
-    for (auto& pool : m_OccupiedPools)
-    {
-        boost::polymorphic_downcast<IMemoryPool*>(pool.get())->ReleasePool();
-    }
-}
-
-} //namespace armnn
\ No newline at end of file
diff --git a/src/backends/aclCommon/memory/PoolManager.hpp b/src/backends/aclCommon/memory/PoolManager.hpp
deleted file mode 100644
index 39bc665..0000000
--- a/src/backends/aclCommon/memory/PoolManager.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include "IPoolManager.hpp"
-
-#include <arm_compute/runtime/IMemoryPool.h>
-#include <arm_compute/core/Error.h>
-
-#include <support/Mutex.h>
-#include <support/Semaphore.h>
-
-#include <cstddef>
-#include <list>
-#include <memory>
-
-namespace armnn
-{
-
-class PoolManager : public IPoolManager
-{
-public:
-    PoolManager();
-
-    PoolManager(const PoolManager &) = delete;
-
-    PoolManager &operator=(const PoolManager &) = delete;
-
-    PoolManager(PoolManager &&) = default;
-
-    PoolManager &operator=(PoolManager &&) = default;
-
-    arm_compute::IMemoryPool *lock_pool() override;
-    void unlock_pool(arm_compute::IMemoryPool *pool) override;
-    void register_pool(std::unique_ptr<arm_compute::IMemoryPool> pool) override;
-    size_t num_pools() const override;
-
-    void AllocatePools() override;
-    void ReleasePools() override;
-
-private:
-    /// List of free pools
-    std::list<std::unique_ptr<arm_compute::IMemoryPool>> m_FreePools;
-
-    /// List of occupied pools
-    std::list<std::unique_ptr<arm_compute::IMemoryPool>> m_OccupiedPools;
-
-    /// Semaphore to control the queues
-    std::unique_ptr<arm_compute::Semaphore> m_Semaphore;
-
-    /// Mutex to control access to the queues
-    mutable arm_compute::Mutex m_Mutex;
-};
-
-} // namespace armnn
\ No newline at end of file
diff --git a/src/backends/backendsCommon/WorkloadFactory.hpp b/src/backends/backendsCommon/WorkloadFactory.hpp
index 34c1349..67876e1 100644
--- a/src/backends/backendsCommon/WorkloadFactory.hpp
+++ b/src/backends/backendsCommon/WorkloadFactory.hpp
@@ -25,9 +25,6 @@
 
     virtual const BackendId& GetBackendId() const = 0;
 
-    /// Informs the memory manager that the network is finalized and ready for execution.
-    virtual void Finalize() { }
-
     /// Inform the memory manager to release the memory
     virtual void Release() { }
 
diff --git a/src/backends/backendsCommon/test/BatchNormTestImpl.hpp b/src/backends/backendsCommon/test/BatchNormTestImpl.hpp
index 2360fd5..67282ed 100644
--- a/src/backends/backendsCommon/test/BatchNormTestImpl.hpp
+++ b/src/backends/backendsCommon/test/BatchNormTestImpl.hpp
@@ -87,7 +87,6 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -177,7 +176,6 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
diff --git a/src/backends/backendsCommon/test/Conv2dTestImpl.hpp b/src/backends/backendsCommon/test/Conv2dTestImpl.hpp
index aa3a44d..03becab 100755
--- a/src/backends/backendsCommon/test/Conv2dTestImpl.hpp
+++ b/src/backends/backendsCommon/test/Conv2dTestImpl.hpp
@@ -213,8 +213,9 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &batchedInput[0][0][0][0]);
 
-    workloadFactory.Finalize();
+    workloadFactory.Acquire();
     workload->Execute();
+    workloadFactory.Release();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
 
@@ -304,8 +305,9 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &batchedInput[0][0][0][0]);
 
-    workloadFactory.Finalize();
+    workloadFactory.Acquire();
     workload->Execute();
+    workloadFactory.Release();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
 
@@ -445,7 +447,6 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &batchedInput[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
@@ -589,7 +590,6 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
@@ -791,7 +791,6 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
@@ -891,7 +890,6 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &batchedInput[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
@@ -1007,8 +1005,9 @@
 
     CopyDataToITensorHandle(inputHandle.get(), inputData.data());
 
-    workloadFactory.Finalize();
+    workloadFactory.Acquire();
     workload->Execute();
+    workloadFactory.Release();
 
     // Output
     LayerTestResult<T,4> ret(outputInfo);
@@ -1105,9 +1104,10 @@
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
     CopyDataToITensorHandle(inputHandleRef.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
+    workloadFactory.Acquire();
     workload->Execute();
-    refWorkloadFactory.Finalize();
+    workloadFactory.Release();
+
     workloadRef->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
@@ -1228,9 +1228,7 @@
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
     CopyDataToITensorHandle(inputHandleRef.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
-    refWorkloadFactory.Finalize();
     workloadRef->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
diff --git a/src/backends/backendsCommon/test/FullyConnectedTestImpl.hpp b/src/backends/backendsCommon/test/FullyConnectedTestImpl.hpp
index 125b7e6..298901e 100644
--- a/src/backends/backendsCommon/test/FullyConnectedTestImpl.hpp
+++ b/src/backends/backendsCommon/test/FullyConnectedTestImpl.hpp
@@ -41,8 +41,9 @@
     outputHandle->Allocate();
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
+    workloadFactory.Acquire();
     workload->Execute();
+    workloadFactory.Release();
 
     CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get());
 
diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp
index 12a7063..6b5fa72 100755
--- a/src/backends/backendsCommon/test/LayerTests.cpp
+++ b/src/backends/backendsCommon/test/LayerTests.cpp
@@ -931,7 +931,6 @@
     CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
     CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
@@ -1021,7 +1020,6 @@
     CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
     CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
@@ -1098,7 +1096,6 @@
     CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
     CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
@@ -1170,7 +1167,6 @@
     CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
     CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
@@ -1255,9 +1251,7 @@
     CopyDataToITensorHandle(inputHandle1Ref.get(), &input1[0][0][0][0]);
     CopyDataToITensorHandle(inputHandle2Ref.get(), &input2[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
-    refWorkloadFactory.Finalize();
     workloadRef->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
@@ -1324,7 +1318,6 @@
     CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
     CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -1527,7 +1520,6 @@
     CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
     CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
@@ -1670,9 +1662,7 @@
     CopyDataToITensorHandle(inputHandle0Ref.get(), &input0[0][0][0][0]);
     CopyDataToITensorHandle(inputHandle1Ref.get(), &input1[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
-    refWorkloadFactory.Finalize();
     workloadRef->Execute();
 
     CopyDataFromITensorHandle(&comparisonResult.output[0][0][0][0], outputHandle.get());
@@ -1751,9 +1741,7 @@
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
     CopyDataToITensorHandle(inputHandleRef.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
-    refWorkloadFactory.Finalize();
     workloadRef->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
@@ -2106,7 +2094,6 @@
         ++nextInputId;
     }
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     if (needPermuteForConcat)
@@ -3087,7 +3074,6 @@
     outputHandle->Allocate();
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -3152,7 +3138,6 @@
     outputHandle->Allocate();
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -3217,7 +3202,6 @@
     outputHandle->Allocate();
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -3280,7 +3264,6 @@
     outputHandle->Allocate();
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -3345,7 +3328,6 @@
     outputHandle->Allocate();
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -3394,7 +3376,6 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0], outputHandle.get());
@@ -3441,8 +3422,9 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0][0]);
 
-    workloadFactory.Finalize();
+    workloadFactory.Acquire();
     workload->Execute();
+    workloadFactory.Release();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
 
@@ -3515,7 +3497,6 @@
 
   CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]);
 
-  workloadFactory.Finalize();
   workload->Execute();
 
   CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get());
@@ -3596,7 +3577,6 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0], outputHandle.get());
@@ -3830,8 +3810,6 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0][0]);
 
-    workloadFactory.Finalize();
-
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -4530,7 +4508,6 @@
 
     outputHandle->Allocate();
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -4673,7 +4650,6 @@
     CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
     CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
@@ -4748,7 +4724,6 @@
     CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
     CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -4810,7 +4785,6 @@
     CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
     CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -4984,7 +4958,6 @@
     CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
     CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -5129,7 +5102,6 @@
     outputHandle->Allocate();
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -5187,7 +5159,6 @@
     outputHandle->Allocate();
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -5243,7 +5214,6 @@
     outputHandle->Allocate();
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -5297,7 +5267,6 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -5353,7 +5322,6 @@
     outputHandle->Allocate();
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
@@ -5875,7 +5843,6 @@
 
     CopyDataToITensorHandle(inputHandle.get(), input.origin());
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(result.output.origin(), outputHandle.get());
@@ -6119,7 +6086,5 @@
 
     CopyDataFromITensorHandle(&addRet.output[0][0][0][0], addOutputHandle.get());
 
-    workloadFactory.Finalize();
-
     return addRet;
 }
diff --git a/src/backends/backendsCommon/test/LstmTestImpl.hpp b/src/backends/backendsCommon/test/LstmTestImpl.hpp
index 758f294d..bb567e7 100644
--- a/src/backends/backendsCommon/test/LstmTestImpl.hpp
+++ b/src/backends/backendsCommon/test/LstmTestImpl.hpp
@@ -210,7 +210,6 @@
     CopyDataToITensorHandle(outputStateInHandle.get(), &outputStateInTensor[0][0]);
     CopyDataToITensorHandle(cellStateInHandle.get(), &cellStateInTensor[0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0], outputHandle.get());
@@ -920,7 +919,6 @@
     CopyDataToITensorHandle(outputStateInHandle.get(), &outputStateInTensor[0][0]);
     CopyDataToITensorHandle(cellStateInHandle.get(), &cellStateInTensor[0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0], outputHandle.get());
@@ -1138,7 +1136,6 @@
     CopyDataToITensorHandle(outputStateOutHandle.get(), &outputStateOutTensor[0][0]);
     CopyDataToITensorHandle(cellStateOutHandle.get(), &cellStateOutTensor[0][0]);
 
-    workloadFactory.Finalize();
     workload->Execute();
 
     CopyDataFromITensorHandle(&ret0.output[0][0], scratchBufferHandle.get());
diff --git a/src/backends/backendsCommon/test/NormTestImpl.hpp b/src/backends/backendsCommon/test/NormTestImpl.hpp
index 0d8d434..16893eb 100644
--- a/src/backends/backendsCommon/test/NormTestImpl.hpp
+++ b/src/backends/backendsCommon/test/NormTestImpl.hpp
@@ -73,8 +73,9 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
+    workloadFactory.Acquire();
     workload->Execute();
+    workloadFactory.Release();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
 
@@ -215,8 +216,9 @@
 
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
+    workloadFactory.Acquire();
     workload->Execute();
+    workloadFactory.Release();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
 
@@ -330,9 +332,10 @@
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
     CopyDataToITensorHandle(inputHandleRef.get(), &input[0][0][0][0]);
 
-    workloadFactory.Finalize();
+    workloadFactory.Acquire();
     workload->Execute();
-    refWorkloadFactory.Finalize();
+    workloadFactory.Release();
+
     workloadRef->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
diff --git a/src/backends/backendsCommon/test/SoftmaxTestImpl.hpp b/src/backends/backendsCommon/test/SoftmaxTestImpl.hpp
index 1e145a1..2a23986 100644
--- a/src/backends/backendsCommon/test/SoftmaxTestImpl.hpp
+++ b/src/backends/backendsCommon/test/SoftmaxTestImpl.hpp
@@ -62,8 +62,9 @@
     outputHandle->Allocate();
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0]);
 
-    workloadFactory.Finalize();
+    workloadFactory.Acquire();
     workload->Execute();
+    workloadFactory.Release();
 
     CopyDataFromITensorHandle(&ret.output[0][0], outputHandle.get());
 
@@ -141,9 +142,10 @@
     CopyDataToITensorHandle(inputHandle.get(), &input[0][0]);
     CopyDataToITensorHandle(inputHandleRef.get(), &input[0][0]);
 
-    workloadFactory.Finalize();
+    workloadFactory.Acquire();
     workload->Execute();
-    refWorkloadFactory.Finalize();
+    workloadFactory.Release();
+
     workloadRef->Execute();
 
     CopyDataFromITensorHandle(&ret.output[0][0], outputHandle.get());
diff --git a/src/backends/cl/ClWorkloadFactory.cpp b/src/backends/cl/ClWorkloadFactory.cpp
index 43c147f..eece934 100644
--- a/src/backends/cl/ClWorkloadFactory.cpp
+++ b/src/backends/cl/ClWorkloadFactory.cpp
@@ -19,8 +19,6 @@
 
 #include <backendsCommon/MemCopyWorkload.hpp>
 
-#include <aclCommon/memory/IPoolManager.hpp>
-
 #include <cl/ClTensorHandle.hpp>
 #include <cl/workloads/ClWorkloads.hpp>
 #include <cl/workloads/ClWorkloadUtils.hpp>
@@ -316,11 +314,6 @@
     return MakeWorkload<ClPadWorkload>(descriptor, info);
 }
 
-void ClWorkloadFactory::Finalize()
-{
-    m_MemoryManager.Finalize();
-}
-
 void ClWorkloadFactory::Release()
 {
     m_MemoryManager.Release();
@@ -537,10 +530,6 @@
     return nullptr;
 }
 
-void ClWorkloadFactory::Finalize()
-{
-}
-
 void ClWorkloadFactory::Release()
 {
 }
diff --git a/src/backends/cl/ClWorkloadFactory.hpp b/src/backends/cl/ClWorkloadFactory.hpp
index ff7e56c..c45bc15 100644
--- a/src/backends/cl/ClWorkloadFactory.hpp
+++ b/src/backends/cl/ClWorkloadFactory.hpp
@@ -8,7 +8,7 @@
 #include <armnn/Optional.hpp>
 
 #include <backendsCommon/OutputHandler.hpp>
-#include <aclCommon/memory/BaseMemoryManager.hpp>
+#include <aclCommon/BaseMemoryManager.hpp>
 
 namespace armnn
 {
@@ -126,8 +126,6 @@
     virtual std::unique_ptr<IWorkload> CreatePad(const PadQueueDescriptor& descriptor,
                                                  const WorkloadInfo& info) const override;
 
-    virtual void Finalize() override;
-
     virtual void Release() override;
 
     virtual void Acquire() override;
diff --git a/src/backends/cl/test/ClContextControlFixture.hpp b/src/backends/cl/test/ClContextControlFixture.hpp
index 52e3414..0371c69 100644
--- a/src/backends/cl/test/ClContextControlFixture.hpp
+++ b/src/backends/cl/test/ClContextControlFixture.hpp
@@ -6,26 +6,14 @@
 #pragma once
 
 #include <cl/ClContextControl.hpp>
+#include <backendsCommon/WorkloadFactory.hpp>
 
 template<bool ProfilingEnabled>
 struct ClContextControlFixtureBase
 {
-    static ClContextControlFixtureBase*& Instance()
-    {
-        static ClContextControlFixtureBase* s_Instance = nullptr;
-        return s_Instance;
-    }
-
     // Initialising ClContextControl to ensure OpenCL is loaded correctly for each test case
     ClContextControlFixtureBase()
-        : m_ClContextControl(nullptr, ProfilingEnabled)
-    {
-        Instance() = this;
-    }
-    ~ClContextControlFixtureBase()
-    {
-        Instance() = nullptr;
-    }
+        : m_ClContextControl(nullptr, ProfilingEnabled) {}
 
     armnn::ClContextControl m_ClContextControl;
 };
diff --git a/src/backends/neon/NeonWorkloadFactory.cpp b/src/backends/neon/NeonWorkloadFactory.cpp
index 6046867..11b5634 100644
--- a/src/backends/neon/NeonWorkloadFactory.cpp
+++ b/src/backends/neon/NeonWorkloadFactory.cpp
@@ -16,7 +16,6 @@
 #include "workloads/NeonWorkloadUtils.hpp"
 #include "workloads/NeonWorkloads.hpp"
 
-#include <aclCommon/memory/IPoolManager.hpp>
 #endif
 
 #include <backendsCommon/MakeWorkloadHelper.hpp>
@@ -280,11 +279,6 @@
     return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
 }
 
-void NeonWorkloadFactory::Finalize()
-{
-    m_MemoryManager.Finalize();
-}
-
 void NeonWorkloadFactory::Release()
 {
     m_MemoryManager.Release();
@@ -501,9 +495,6 @@
     return nullptr;
 }
 
-void NeonWorkloadFactory::Finalize()
-{}
-
 void NeonWorkloadFactory::Release()
 {}
 
diff --git a/src/backends/neon/NeonWorkloadFactory.hpp b/src/backends/neon/NeonWorkloadFactory.hpp
index abcd033..9b574f6 100644
--- a/src/backends/neon/NeonWorkloadFactory.hpp
+++ b/src/backends/neon/NeonWorkloadFactory.hpp
@@ -5,8 +5,9 @@
 #pragma once
 
 #include <armnn/Optional.hpp>
+
 #include <backendsCommon/OutputHandler.hpp>
-#include <aclCommon/memory/BaseMemoryManager.hpp>
+#include <aclCommon/BaseMemoryManager.hpp>
 
 #include <boost/core/ignore_unused.hpp>
 
@@ -127,8 +128,6 @@
     virtual std::unique_ptr<IWorkload> CreatePad(const PadQueueDescriptor& descriptor,
                                                  const WorkloadInfo& info) const override;
 
-    virtual void Finalize() override;
-
     virtual void Release() override;
 
     virtual void Acquire() override;