diff --git a/src/Tests.cpp b/src/Tests.cpp
index e5b373d..16ac94b 100644
--- a/src/Tests.cpp
+++ b/src/Tests.cpp
@@ -696,6 +696,10 @@
         VkImageCreateInfo m_ImageInfo;
     };
 
+    // After defragmentation.
+    VkBuffer m_NewBuffer = VK_NULL_HANDLE;
+    VkImage m_NewImage = VK_NULL_HANDLE;
+
     void CreateBuffer(
         const VkBufferCreateInfo& bufCreateInfo,
         const VmaAllocationCreateInfo& allocCreateInfo);
@@ -729,11 +733,13 @@
 {
     if(m_Image)
     {
+        assert(!m_Buffer);
         vkDestroyImage(g_hDevice, m_Image, g_Allocs);
         m_Image = VK_NULL_HANDLE;
     }
     if(m_Buffer)
     {
+        assert(!m_Image);
         vkDestroyBuffer(g_hDevice, m_Buffer, g_Allocs);
         m_Buffer = VK_NULL_HANDLE;
     }
@@ -922,7 +928,7 @@
             TEST(currAllocInfo.m_ImageInfo.format == VK_FORMAT_R8G8B8A8_UNORM && "Only RGBA8 images are currently supported.");
             TEST(currAllocInfo.m_ImageInfo.mipLevels == 1 && "Only single mip images are currently supported.");
 
-            const VkDeviceSize size = currAllocInfo.m_ImageInfo.extent.width * currAllocInfo.m_ImageInfo.extent.height * sizeof(uint32_t);
+            const VkDeviceSize size = (VkDeviceSize)currAllocInfo.m_ImageInfo.extent.width * currAllocInfo.m_ImageInfo.extent.height * sizeof(uint32_t);
 
             VkBuffer stagingBuf = VK_NULL_HANDLE;
             void* stagingBufMappedPtr = nullptr;
@@ -1850,7 +1856,7 @@
     g_MemoryAliasingWarningEnabled = true;
 }
 
-static void ProcessDefragmentationStepInfo(VmaDefragmentationStepInfo &stepInfo)
+static void ProcessDefragmentationStepInfo(VmaDefragmentationPassInfo &stepInfo)
 {
     std::vector<VkImageMemoryBarrier> beginImageBarriers;
     std::vector<VkImageMemoryBarrier> finalizeImageBarriers;
@@ -1866,9 +1872,7 @@
     VkMemoryBarrier beginMemoryBarrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER };
     VkMemoryBarrier finalizeMemoryBarrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER };
 
-    std::vector<void *> newHandles;
-
-    for(uint32_t i = 0; i < stepInfo.moveCount; ++ i)
+    for(uint32_t i = 0; i < stepInfo.moveCount; ++i)
     {
         VmaAllocationInfo info;
         vmaGetAllocationInfo(g_hAllocator, stepInfo.pMoves[i].allocation, &info);
@@ -1883,7 +1887,7 @@
             TEST(result >= VK_SUCCESS);
 
             vkBindImageMemory(g_hDevice, newImage, stepInfo.pMoves[i].memory, stepInfo.pMoves[i].offset);
-            newHandles.push_back(newImage);
+            allocInfo->m_NewImage = newImage;
 
             // Keep track of our pipeline stages that we need to wait/signal on
             beginSrcStageMask |= VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
@@ -1937,7 +1941,7 @@
             TEST(result >= VK_SUCCESS);
 
             vkBindBufferMemory(g_hDevice, newBuffer, stepInfo.pMoves[i].memory, stepInfo.pMoves[i].offset);
-            newHandles.push_back(newBuffer);
+            allocInfo->m_NewBuffer = newBuffer;
 
             // Keep track of our pipeline stages that we need to wait/signal on
             beginSrcStageMask |= VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
@@ -2006,13 +2010,8 @@
             vkCmdCopyImage(
                 g_hTemporaryCommandBuffer,
                 allocInfo->m_Image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
-                (VkImage)newHandles[i], VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+                allocInfo->m_NewImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
                 (uint32_t)imageCopies.size(), imageCopies.data());
-
-            imageCopies.clear();
-
-            // Update our alloc info with the new resource to be used
-            allocInfo->m_Image = (VkImage)newHandles[i];
         }
         else if(allocInfo->m_Buffer)
         {
@@ -2022,16 +2021,11 @@
                 allocInfo->m_BufferInfo.size };
 
             vkCmdCopyBuffer(g_hTemporaryCommandBuffer, 
-                allocInfo->m_Buffer, (VkBuffer)newHandles[i],
+                allocInfo->m_Buffer, allocInfo->m_NewBuffer,
                 1, &region);
-
-
-            // Update our alloc info with the new resource to be used
-            allocInfo->m_Buffer = (VkBuffer)newHandles[i];
         }
     }
 
-
     if(!finalizeImageBarriers.empty() || wantsMemoryBarrier)
     {
         const uint32_t memoryBarrierCount = wantsMemoryBarrier ? 1 : 0;
@@ -2056,7 +2050,7 @@
     const VkDeviceSize bufSizeMin = 5ull * 1024 * 1024;
     const VkDeviceSize bufSizeMax = 10ull * 1024 * 1024;
     const VkDeviceSize totalSize = 3ull * 256 * 1024 * 1024;
-    const size_t imageCount = (size_t)(totalSize / (imageSizes[0] * imageSizes[0] * 4)) / 2;
+    const size_t imageCount = totalSize / ((size_t)imageSizes[0] * imageSizes[0] * 4) / 2;
     const size_t bufCount = (size_t)(totalSize / bufSizeMin) / 2;
     const size_t percentToLeave = 30;
     RandomNumberGenerator rand = { 234522 };
@@ -2142,9 +2136,6 @@
 
         for(size_t i = 0; i < allocCount; ++i)
         {
-            VmaAllocationInfo allocInfo = {};
-            vmaGetAllocationInfo(g_hAllocator, allocations[i].m_Allocation, &allocInfo);
-
             allocationPtrs.push_back(allocations[i].m_Allocation);
         }
 
@@ -2164,23 +2155,49 @@
 
         res = VK_NOT_READY;
 
-        std::vector<VmaDefragmentationStepMoveInfo> moveInfo;
+        std::vector<VmaDefragmentationPassMoveInfo> moveInfo;
         moveInfo.resize(movableAllocCount);
 
         while(res == VK_NOT_READY)
         {
-            VmaDefragmentationStepInfo stepInfo = {};
+            VmaDefragmentationPassInfo stepInfo = {};
             stepInfo.pMoves = moveInfo.data();
             stepInfo.moveCount = (uint32_t)moveInfo.size();
 
-            res = vmaDefragmentationStepBegin(g_hAllocator, &stepInfo, ctx);
+            res = vmaBeginDefragmentationPass(g_hAllocator, ctx, &stepInfo);
             TEST(res >= VK_SUCCESS);
 
             BeginSingleTimeCommands();
+            std::vector<void*> newHandles;
             ProcessDefragmentationStepInfo(stepInfo);
             EndSingleTimeCommands();
 
-            res = vmaDefragmentationStepEnd(g_hAllocator, ctx);
+            res = vmaEndDefragmentationPass(g_hAllocator, ctx);
+            
+            // Destroy old buffers/images and replace them with new handles.
+            for(size_t i = 0; i < stepInfo.moveCount; ++i)
+            {
+                VmaAllocation const alloc = stepInfo.pMoves[i].allocation;
+                VmaAllocationInfo vmaAllocInfo;
+                vmaGetAllocationInfo(g_hAllocator, alloc, &vmaAllocInfo);
+                AllocInfo* allocInfo = (AllocInfo*)vmaAllocInfo.pUserData;
+                if(allocInfo->m_Buffer)
+                {
+                    assert(allocInfo->m_NewBuffer && !allocInfo->m_Image && !allocInfo->m_NewImage);
+                    vkDestroyBuffer(g_hDevice, allocInfo->m_Buffer, g_Allocs);
+                    allocInfo->m_Buffer = allocInfo->m_NewBuffer;
+                    allocInfo->m_NewBuffer = VK_NULL_HANDLE;
+                }
+                else if(allocInfo->m_Image)
+                {
+                    assert(allocInfo->m_NewImage && !allocInfo->m_Buffer && !allocInfo->m_NewBuffer);
+                    vkDestroyImage(g_hDevice, allocInfo->m_Image, g_Allocs);
+                    allocInfo->m_Image = allocInfo->m_NewImage;
+                    allocInfo->m_NewImage = VK_NULL_HANDLE;
+                }
+                else
+                    assert(0);
+            }
         }
 
         TEST(res >= VK_SUCCESS);
@@ -2199,7 +2216,7 @@
     swprintf_s(fileName, L"GPU_defragmentation_incremental_basic_B_after.json");
     SaveAllocatorStatsToFile(fileName);
 
-    // Destroy all remaining buffers.
+    // Destroy all remaining buffers and images.
     for(size_t i = allocations.size(); i--; )
     {
         allocations[i].Destroy();
@@ -2343,18 +2360,18 @@
 
         res = VK_NOT_READY;
 
-        std::vector<VmaDefragmentationStepMoveInfo> moveInfo;
+        std::vector<VmaDefragmentationPassMoveInfo> moveInfo;
         moveInfo.resize(movableAllocCount);
 
         MakeAdditionalAllocation();
 
         while(res == VK_NOT_READY)
         {
-            VmaDefragmentationStepInfo stepInfo = {};
+            VmaDefragmentationPassInfo stepInfo = {};
             stepInfo.pMoves = moveInfo.data();
             stepInfo.moveCount = (uint32_t)moveInfo.size();
 
-            res = vmaDefragmentationStepBegin(g_hAllocator, &stepInfo, ctx);
+            res = vmaBeginDefragmentationPass(g_hAllocator, ctx, &stepInfo);
             TEST(res >= VK_SUCCESS);
 
             MakeAdditionalAllocation();
@@ -2363,7 +2380,32 @@
             ProcessDefragmentationStepInfo(stepInfo);
             EndSingleTimeCommands();
 
-            res = vmaDefragmentationStepEnd(g_hAllocator, ctx);
+            res = vmaEndDefragmentationPass(g_hAllocator, ctx);
+
+            // Destroy old buffers/images and replace them with new handles.
+            for(size_t i = 0; i < stepInfo.moveCount; ++i)
+            {
+                VmaAllocation const alloc = stepInfo.pMoves[i].allocation;
+                VmaAllocationInfo vmaAllocInfo;
+                vmaGetAllocationInfo(g_hAllocator, alloc, &vmaAllocInfo);
+                AllocInfo* allocInfo = (AllocInfo*)vmaAllocInfo.pUserData;
+                if(allocInfo->m_Buffer)
+                {
+                    assert(allocInfo->m_NewBuffer && !allocInfo->m_Image && !allocInfo->m_NewImage);
+                    vkDestroyBuffer(g_hDevice, allocInfo->m_Buffer, g_Allocs);
+                    allocInfo->m_Buffer = allocInfo->m_NewBuffer;
+                    allocInfo->m_NewBuffer = VK_NULL_HANDLE;
+                }
+                else if(allocInfo->m_Image)
+                {
+                    assert(allocInfo->m_NewImage && !allocInfo->m_Buffer && !allocInfo->m_NewBuffer);
+                    vkDestroyImage(g_hDevice, allocInfo->m_Image, g_Allocs);
+                    allocInfo->m_Image = allocInfo->m_NewImage;
+                    allocInfo->m_NewImage = VK_NULL_HANDLE;
+                }
+                else
+                    assert(0);
+            }
 
             MakeAdditionalAllocation();
         }
diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index 9e78812..f6c85be 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -1952,7 +1952,6 @@
     PFN_vkCreateImage vkCreateImage;
     PFN_vkDestroyImage vkDestroyImage;
     PFN_vkCmdCopyBuffer vkCmdCopyBuffer;
-    PFN_vkCmdCopyImage vkCmdCopyImage;
 #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000
     PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;
     PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;
@@ -3193,20 +3192,20 @@
     VkCommandBuffer commandBuffer;
 } VmaDefragmentationInfo2;
 
-typedef struct VmaDefragmentationStepMoveInfo {
+typedef struct VmaDefragmentationPassMoveInfo {
     VmaAllocation allocation;
     VkDeviceMemory memory;
     VkDeviceSize offset;
-} VmaDefragmentationStepMoveInfo;
+} VmaDefragmentationPassMoveInfo;
 
 /** \brief Parameters for incremental defragmentation steps.
 
-To be used with function vmaDefragmentationStepBegin().
+To be used with function vmaBeginDefragmentationPass().
 */
-typedef struct VmaDefragmentationStepInfo {
+typedef struct VmaDefragmentationPassInfo {
     uint32_t moveCount;
-    VmaDefragmentationStepMoveInfo* pMoves;
-} VmaDefragmentationStepInfo;
+    VmaDefragmentationPassMoveInfo* pMoves;
+} VmaDefragmentationPassInfo;
 
 /** \brief Deprecated. Optional configuration parameters to be passed to function vmaDefragment().
 
@@ -3281,12 +3280,12 @@
     VmaAllocator allocator,
     VmaDefragmentationContext context);
 
-VMA_CALL_PRE VkResult VMA_CALL_POST vmaDefragmentationStepBegin(
+VMA_CALL_PRE VkResult VMA_CALL_POST vmaBeginDefragmentationPass(
     VmaAllocator allocator,
-    VmaDefragmentationStepInfo* pInfo,
-    VmaDefragmentationContext context
+    VmaDefragmentationContext context,
+    VmaDefragmentationPassInfo* pInfo
 );
-VMA_CALL_PRE VkResult VMA_CALL_POST vmaDefragmentationStepEnd(
+VMA_CALL_PRE VkResult VMA_CALL_POST vmaEndDefragmentationPass(
     VmaAllocator allocator,
     VmaDefragmentationContext context
 );
@@ -3733,10 +3732,10 @@
             VmaRWMutex() { InitializeSRWLock(&m_Lock); }
             void LockRead() { AcquireSRWLockShared(&m_Lock); }
             void UnlockRead() { ReleaseSRWLockShared(&m_Lock); }
-            bool TryLockRead() { return TryAcquireSRWLockShared(&m_Lock); }
+            bool TryLockRead() { return TryAcquireSRWLockShared(&m_Lock) != FALSE; }
             void LockWrite() { AcquireSRWLockExclusive(&m_Lock); }
             void UnlockWrite() { ReleaseSRWLockExclusive(&m_Lock); }
-            bool TryLockWrite() { return TryAcquireSRWLockExclusive(&m_Lock); }
+            bool TryLockWrite() { return TryAcquireSRWLockExclusive(&m_Lock) != FALSE; }
         private:
             SRWLOCK m_Lock;
         };
@@ -6357,7 +6356,7 @@
 
     uint32_t ProcessDefragmentations(
         class VmaBlockVectorDefragmentationContext *pCtx,
-        VmaDefragmentationStepMoveInfo* pMove, uint32_t maxMoves);
+        VmaDefragmentationPassMoveInfo* pMove, uint32_t maxMoves);
 
     void CommitDefragmentations(
         class VmaBlockVectorDefragmentationContext *pCtx,
@@ -6395,8 +6394,6 @@
 
     VkDeviceSize CalcMaxBlockSize() const;
 
-    static VkImageAspectFlags ImageAspectMaskForFormat(VkFormat format);
-    
     // Finds and removes given block from vector.
     void Remove(VmaDeviceMemoryBlock* pBlock);
 
@@ -6896,8 +6893,8 @@
         VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,
         VkCommandBuffer commandBuffer, VmaDefragmentationStats* pStats, VmaDefragmentationFlags flags);
 
-    VkResult DefragmentStepBegin(VmaDefragmentationStepInfo* pInfo);
-    VkResult DefragmentStepEnd();
+    VkResult DefragmentPassBegin(VmaDefragmentationPassInfo* pInfo);
+    VkResult DefragmentPassEnd();
 
 private:
     const VmaAllocator m_hAllocator;
@@ -7249,10 +7246,10 @@
     VkResult DefragmentationEnd(
         VmaDefragmentationContext context);
 
-    VkResult DefragmentationStepBegin(
-        VmaDefragmentationStepInfo* pInfo,
+    VkResult DefragmentationPassBegin(
+        VmaDefragmentationPassInfo* pInfo,
         VmaDefragmentationContext context);
-    VkResult DefragmentationStepEnd(
+    VkResult DefragmentationPassEnd(
         VmaDefragmentationContext context);
 
     void GetAllocationInfo(VmaAllocation hAllocation, VmaAllocationInfo* pAllocationInfo);
@@ -13016,7 +13013,7 @@
 
 uint32_t VmaBlockVector::ProcessDefragmentations(
     class VmaBlockVectorDefragmentationContext *pCtx,
-    VmaDefragmentationStepMoveInfo* pMove, uint32_t maxMoves)
+    VmaDefragmentationPassMoveInfo* pMove, uint32_t maxMoves)
 {
     VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);
     
@@ -14123,9 +14120,9 @@
     return res;
 }
 
-VkResult VmaDefragmentationContext_T::DefragmentStepBegin(VmaDefragmentationStepInfo* pInfo)
+VkResult VmaDefragmentationContext_T::DefragmentPassBegin(VmaDefragmentationPassInfo* pInfo)
 {
-    VmaDefragmentationStepMoveInfo* pCurrentMove = pInfo->pMoves;
+    VmaDefragmentationPassMoveInfo* pCurrentMove = pInfo->pMoves;
     uint32_t movesLeft = pInfo->moveCount;
 
     // Process default pools.
@@ -14197,7 +14194,7 @@
 
     return VK_SUCCESS;
 }
-VkResult VmaDefragmentationContext_T::DefragmentStepEnd()
+VkResult VmaDefragmentationContext_T::DefragmentPassEnd()
 {
     VkResult res = VK_SUCCESS;
 
@@ -15065,7 +15062,6 @@
     m_VulkanFunctions.vkCreateImage = (PFN_vkCreateImage)vkCreateImage;
     m_VulkanFunctions.vkDestroyImage = (PFN_vkDestroyImage)vkDestroyImage;
     m_VulkanFunctions.vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)vkCmdCopyBuffer;
-    m_VulkanFunctions.vkCmdCopyImage = (PFN_vkCmdCopyImage)vkCmdCopyImage;
 #if VMA_VULKAN_VERSION >= 1001000
     if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))
     {
@@ -15132,7 +15128,6 @@
         VMA_COPY_IF_NOT_NULL(vkCreateImage);
         VMA_COPY_IF_NOT_NULL(vkDestroyImage);
         VMA_COPY_IF_NOT_NULL(vkCmdCopyBuffer);
-        VMA_COPY_IF_NOT_NULL(vkCmdCopyImage);
 #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000
         VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);
         VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);
@@ -15167,7 +15162,6 @@
     VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);
     VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);
     VMA_ASSERT(m_VulkanFunctions.vkCmdCopyBuffer != VMA_NULL);
-    VMA_ASSERT(m_VulkanFunctions.vkCmdCopyImage != VMA_NULL);
 #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000
     if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0) || m_UseKhrDedicatedAllocation)
     {
@@ -15905,16 +15899,16 @@
     return VK_SUCCESS;
 }
 
-VkResult VmaAllocator_T::DefragmentationStepBegin(
-    VmaDefragmentationStepInfo* pInfo,
+VkResult VmaAllocator_T::DefragmentationPassBegin(
+    VmaDefragmentationPassInfo* pInfo,
     VmaDefragmentationContext context)
 {
-    return context->DefragmentStepBegin(pInfo);
+    return context->DefragmentPassBegin(pInfo);
 }
-VkResult VmaAllocator_T::DefragmentationStepEnd(
+VkResult VmaAllocator_T::DefragmentationPassEnd(
     VmaDefragmentationContext context)
 {
-    return context->DefragmentStepEnd();
+    return context->DefragmentPassEnd();
     
 }
 
@@ -17736,16 +17730,17 @@
     }
 }
 
-VMA_CALL_PRE VkResult VMA_CALL_POST vmaDefragmentationStepBegin(
+VMA_CALL_PRE VkResult VMA_CALL_POST vmaBeginDefragmentationPass(
     VmaAllocator allocator,
-    VmaDefragmentationStepInfo* pInfo,
-    VmaDefragmentationContext context)
+    VmaDefragmentationContext context,
+    VmaDefragmentationPassInfo* pInfo
+    )
 {
     VMA_ASSERT(allocator);
     VMA_ASSERT(pInfo);
     VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo->moveCount, pInfo->pMoves));
 
-    VMA_DEBUG_LOG("vmaDefragmentationStepBegin");
+    VMA_DEBUG_LOG("vmaBeginDefragmentationPass");
 
     VMA_DEBUG_GLOBAL_MUTEX_LOCK
 
@@ -17755,21 +17750,21 @@
         return VK_SUCCESS;
     }
 
-    return allocator->DefragmentationStepBegin(pInfo, context);
+    return allocator->DefragmentationPassBegin(pInfo, context);
 }
-VMA_CALL_PRE VkResult VMA_CALL_POST vmaDefragmentationStepEnd(
+VMA_CALL_PRE VkResult VMA_CALL_POST vmaEndDefragmentationPass(
     VmaAllocator allocator,
     VmaDefragmentationContext context)
 {
     VMA_ASSERT(allocator);
 
-    VMA_DEBUG_LOG("vmaDefragmentationStepEnd");
+    VMA_DEBUG_LOG("vmaEndDefragmentationPass");
     VMA_DEBUG_GLOBAL_MUTEX_LOCK
 
     if(context == VK_NULL_HANDLE)
         return VK_SUCCESS;
 
-    return allocator->DefragmentationStepEnd(context);
+    return allocator->DefragmentationPassEnd(context);
 }
 
 VMA_CALL_PRE VkResult VMA_CALL_POST vmaBindBufferMemory(
