diff --git a/src/D3D12MemAlloc.cpp b/src/D3D12MemAlloc.cpp
index 06ecfe5..e648300 100644
--- a/src/D3D12MemAlloc.cpp
+++ b/src/D3D12MemAlloc.cpp
@@ -3728,11 +3728,8 @@
 {
 public:
     PoolPimpl(AllocatorPimpl* allocator, const POOL_DESC& desc);
-    ~PoolPimpl()
-    {
-        D3D12MA_DELETE(m_Allocator->GetAllocs(), m_BlockVector);
-    }
     HRESULT Init();
+    ~PoolPimpl();
 
     AllocatorPimpl* GetAllocator() const { return m_Allocator; }
     const POOL_DESC& GetDesc() const { return m_Desc; }
@@ -3740,34 +3737,25 @@
     
     void CalculateStats(StatInfo& outStats);
 
+    void SetName(LPCWSTR Name);
+    LPCWSTR GetName() const { return m_Name; }
+
 private:
     friend class Allocator;
 
     AllocatorPimpl* m_Allocator; // Externally owned object.
     POOL_DESC m_Desc;
     BlockVector* m_BlockVector; // Owned object.
+    wchar_t* m_Name;
+
+    void FreeName();
 };
 
-HRESULT PoolPimpl::Init()
-{
-    return m_BlockVector->CreateMinBlocks();
-}
-
-void PoolPimpl::CalculateStats(StatInfo& outStats)
-{
-    ZeroMemory(&outStats, sizeof(outStats));
-    outStats.AllocationSizeMin = UINT64_MAX;
-    outStats.UnusedRangeSizeMin = UINT64_MAX;
-
-    m_BlockVector->AddStats(outStats);
-
-    PostProcessStatInfo(outStats);
-}
-
 PoolPimpl::PoolPimpl(AllocatorPimpl* allocator, const POOL_DESC& desc) :
     m_Allocator(allocator),
     m_Desc(desc),
-    m_BlockVector(NULL)
+    m_BlockVector(NULL),
+    m_Name(NULL)
 {
     const bool explicitBlockSize = desc.BlockSize != 0;
     const UINT64 preferredBlockSize = explicitBlockSize ? desc.BlockSize : D3D12MA_DEFAULT_BLOCK_SIZE;
@@ -3787,6 +3775,49 @@
         explicitBlockSize);
 }
 
+HRESULT PoolPimpl::Init()
+{
+    return m_BlockVector->CreateMinBlocks();
+}
+
+PoolPimpl::~PoolPimpl()
+{
+    FreeName();
+    D3D12MA_DELETE(m_Allocator->GetAllocs(), m_BlockVector);
+}
+
+void PoolPimpl::CalculateStats(StatInfo& outStats)
+{
+    ZeroMemory(&outStats, sizeof(outStats));
+    outStats.AllocationSizeMin = UINT64_MAX;
+    outStats.UnusedRangeSizeMin = UINT64_MAX;
+
+    m_BlockVector->AddStats(outStats);
+
+    PostProcessStatInfo(outStats);
+}
+
+void PoolPimpl::SetName(LPCWSTR Name)
+{
+    FreeName();
+
+    if(Name)
+    {
+        const size_t nameCharCount = wcslen(Name) + 1;
+        m_Name = D3D12MA_NEW_ARRAY(m_Allocator->GetAllocs(), WCHAR, nameCharCount);
+        memcpy(m_Name, Name, nameCharCount * sizeof(WCHAR));
+    }
+}
+
+void PoolPimpl::FreeName()
+{
+    if(m_Name)
+    {
+        const size_t nameCharCount = wcslen(m_Name) + 1;
+        D3D12MA_DELETE_ARRAY(m_Allocator->GetAllocs(), m_Name, nameCharCount);
+        m_Name = NULL;
+    }
+}
 
 ////////////////////////////////////////////////////////////////////////////////
 // Public class Pool implementation
@@ -3815,6 +3846,17 @@
     m_Pimpl->CalculateStats(*pStats);
 }
 
+void Pool::SetName(LPCWSTR Name)
+{
+    D3D12MA_DEBUG_GLOBAL_MUTEX_LOCK
+    m_Pimpl->SetName(Name);
+}
+
+LPCWSTR Pool::GetName() const
+{
+    return m_Pimpl->GetName();
+}
+
 Pool::Pool(Allocator* allocator, const POOL_DESC &desc) :
     m_Pimpl(D3D12MA_NEW(allocator->m_Pimpl->GetAllocs(), PoolPimpl)(allocator->m_Pimpl, desc))
 {
diff --git a/src/D3D12MemAlloc.h b/src/D3D12MemAlloc.h
index 10c5735..02913ff 100644
--- a/src/D3D12MemAlloc.h
+++ b/src/D3D12MemAlloc.h
@@ -707,6 +707,23 @@
     */
     void CalculateStats(StatInfo* pStats);
 
+    /** \brief Associates a name with the pool. This name is for use in debug diagnostics and tools.
+
+    Internal copy of the string is made, so the memory pointed by the argument can be
+    changed of freed immediately after this call.
+
+    `Name` can be NULL.
+    */
+    void SetName(LPCWSTR Name);
+
+    /** \brief Returns the name associated with the pool object.
+
+    Returned string points to an internal copy.
+
+    If no name was associated with the allocation, returns NULL.
+    */
+    LPCWSTR GetName() const;
+
 private:
     friend class Allocator;
     friend class AllocatorPimpl;
diff --git a/src/Tests.cpp b/src/Tests.cpp
index 8b3b504..662e059 100644
--- a/src/Tests.cpp
+++ b/src/Tests.cpp
@@ -436,6 +436,11 @@
     CHECK_BOOL( poolStats.UsedBytes == 0 );
     CHECK_BOOL( poolStats.UnusedBytes == poolDesc.BlockSize );
 
+    // # SetName and GetName
+    static const wchar_t* NAME = L"Custom pool name 1";
+    pool->SetName(NAME);
+    CHECK_BOOL( wcscmp(pool->GetName(), NAME) == 0 );
+
     // # Create buffers 2x 5 MB
 
     D3D12MA::ALLOCATION_DESC allocDesc = {};
