bug 14362: VK_NULL_HANDLE does not work in C (WIP)

Drop type safety on 32-bit.

https://cvs.khronos.org/bugzilla/show_bug.cgi?id=14362
diff --git a/demos/cube.c b/demos/cube.c
index b64023f..22a925f 100644
--- a/demos/cube.c
+++ b/demos/cube.c
@@ -438,7 +438,7 @@
     assert(!err);
 
     const VkCmdBuffer cmd_bufs[] = { demo->cmd };
-    VkFence nullFence = { VK_NULL_HANDLE };
+    VkFence nullFence = VK_NULL_HANDLE;
     VkSubmitInfo submit_info = {
         .waitSemCount = 0,
         .pWaitSemaphores = NULL,
@@ -483,9 +483,9 @@
             .sType = VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO,
             .pNext = NULL,
             .flags = 0,
-            .renderPass = { VK_NULL_HANDLE },
+            .renderPass = VK_NULL_HANDLE,
             .subpass = 0,
-            .framebuffer = { VK_NULL_HANDLE },
+            .framebuffer = VK_NULL_HANDLE,
         };
         err = vkBeginCommandBuffer(demo->cmd, &cmd_buf_info);
         assert(!err);
@@ -526,9 +526,9 @@
         .sType = VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO,
         .pNext = NULL,
         .flags = 0,
-        .renderPass = { VK_NULL_HANDLE },
+        .renderPass = VK_NULL_HANDLE,
         .subpass = 0,
-        .framebuffer = { VK_NULL_HANDLE },
+        .framebuffer = VK_NULL_HANDLE,
     };
     const VkClearValue clear_values[2] = {
         [0] = { .color.float32 = { 0.2f, 0.2f, 0.2f, 0.2f } },
@@ -631,7 +631,7 @@
         .pNext = NULL,
         .flags = 0,
     };
-    VkFence nullFence = { VK_NULL_HANDLE };
+    VkFence nullFence = VK_NULL_HANDLE;
 
     err = vkCreateSemaphore(demo->device,
                             &presentCompleteSemaphoreCreateInfo,
@@ -816,7 +816,7 @@
     // swapchain at this point.
     // Note: destroying the swapchain also cleans up all its associated
     // presentable images once the platform is done with them.
-    if (oldSwapchain.handle != VK_NULL_HANDLE) {
+    if (oldSwapchain != VK_NULL_HANDLE) {
         demo->fpDestroySwapchainKHR(demo->device, oldSwapchain);
     }
 
@@ -894,7 +894,7 @@
     VkImageViewCreateInfo view = {
         .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
         .pNext = NULL,
-        .image.handle = VK_NULL_HANDLE,
+        .image = VK_NULL_HANDLE,
         .format = depth_format,
         .subresourceRange = {
             .aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT,
@@ -1187,7 +1187,7 @@
         VkImageViewCreateInfo view = {
             .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
             .pNext = NULL,
-            .image.handle = VK_NULL_HANDLE,
+            .image = VK_NULL_HANDLE,
             .viewType = VK_IMAGE_VIEW_TYPE_2D,
             .format = tex_format,
             .channels = { VK_CHANNEL_SWIZZLE_R,
diff --git a/demos/tri.c b/demos/tri.c
index 3d72f87..5eb22fd 100644
--- a/demos/tri.c
+++ b/demos/tri.c
@@ -323,9 +323,9 @@
             .sType = VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO,
             .pNext = NULL,
             .flags = 0,
-            .renderPass = { VK_NULL_HANDLE },
+            .renderPass = VK_NULL_HANDLE,
             .subpass = 0,
-            .framebuffer = { VK_NULL_HANDLE },
+            .framebuffer = VK_NULL_HANDLE,
         };
         err = vkBeginCommandBuffer(demo->setup_cmd, &cmd_buf_info);
         assert(!err);
@@ -366,9 +366,9 @@
         .sType = VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO,
         .pNext = NULL,
         .flags = 0,
-        .renderPass = { VK_NULL_HANDLE },
+        .renderPass = VK_NULL_HANDLE,
         .subpass = 0,
-        .framebuffer = { VK_NULL_HANDLE },
+        .framebuffer = VK_NULL_HANDLE,
     };
     const VkClearValue clear_values[2] = {
         [0] = { .color.float32 = { 0.2f, 0.2f, 0.2f, 0.2f } },
@@ -489,7 +489,7 @@
 
 // FIXME/TODO: DEAL WITH VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR
     demo_draw_build_cmd(demo);
-    VkFence nullFence = { VK_NULL_HANDLE };
+    VkFence nullFence = VK_NULL_HANDLE;
 
     VkSubmitInfo submit_info = {
         .waitSemCount = 1,
@@ -622,7 +622,7 @@
     // swapchain at this point.
     // Note: destroying the swapchain also cleans up all its associated
     // presentable images once the platform is done with them.
-    if (oldSwapchain.handle != VK_NULL_HANDLE) {
+    if (oldSwapchain != VK_NULL_HANDLE) {
         demo->fpDestroySwapchainKHR(demo->device, oldSwapchain);
     }
 
@@ -707,7 +707,7 @@
     VkImageViewCreateInfo view = {
         .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
         .pNext = NULL,
-        .image.handle = VK_NULL_HANDLE,
+        .image = VK_NULL_HANDLE,
         .format = depth_format,
         .subresourceRange = {
             .aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT,
@@ -944,7 +944,7 @@
         VkImageViewCreateInfo view = {
             .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
             .pNext = NULL,
-            .image.handle = VK_NULL_HANDLE,
+            .image = VK_NULL_HANDLE,
             .viewType = VK_IMAGE_VIEW_TYPE_2D,
             .format = tex_format,
             .channels = { VK_CHANNEL_SWIZZLE_R,
diff --git a/icd/intel/buf.c b/icd/intel/buf.c
index 09811ef..a776828 100644
--- a/icd/intel/buf.c
+++ b/icd/intel/buf.c
@@ -103,7 +103,7 @@
     VkBuffer                                buffer)
 
  {
-    struct intel_obj *obj = intel_obj(buffer.handle);
+    struct intel_obj *obj = intel_obj(buffer);
 
     obj->destroy(obj);
  }
diff --git a/icd/intel/cmd.c b/icd/intel/cmd.c
index 6258fbc..f7a3750 100644
--- a/icd/intel/cmd.c
+++ b/icd/intel/cmd.c
@@ -501,7 +501,7 @@
     const VkCmdBuffer                  *cmd_bufs)
 {
     for (uint32_t i = 0; i < count; i++) {
-        struct intel_obj *obj = intel_obj((uint64_t)cmd_bufs[i]);
+        struct intel_obj *obj = intel_obj(cmd_bufs[i]);
 
         obj->destroy(obj);
     }
diff --git a/icd/intel/cmd_meta.c b/icd/intel/cmd_meta.c
index 6719e61..2db0857 100644
--- a/icd/intel/cmd_meta.c
+++ b/icd/intel/cmd_meta.c
@@ -65,8 +65,7 @@
 {
     struct intel_buf_view *view;
     VkResult res;
-    VkBuffer localbuf;
-    localbuf.handle = (uint64_t) buf;
+    VkBuffer localbuf = (VkBuffer) buf;
 
     res = cmd_meta_create_buf_view(cmd, localbuf,
             buf->size, format, &view);
@@ -95,8 +94,7 @@
 {
     struct intel_buf_view *view;
     VkResult res;
-    VkBuffer localbuf;
-    localbuf.handle = (uint64_t) buf;
+    VkBuffer localbuf = (VkBuffer) buf;
 
     res = cmd_meta_create_buf_view(cmd, localbuf,
             buf->size, format, &view);
@@ -130,7 +128,7 @@
 
     memset(&info, 0, sizeof(info));
     info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
-    info.image.handle = (uint64_t) img;
+    info.image = (VkImage) img;
 
     if (img->array_size == 1) {
         switch (img->type) {
@@ -259,7 +257,7 @@
 
     memset(&info, 0, sizeof(info));
     info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
-    info.image.handle = (uint64_t) img;
+    info.image = (VkImage) img;
     info.format = format;
     info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
     info.subresourceRange.baseMipLevel = lod;
@@ -291,8 +289,7 @@
 {
     struct intel_buf_view *view;
     VkResult res;
-    VkBuffer localbuf;
-    localbuf.handle = 0;
+    VkBuffer localbuf = VK_NULL_HANDLE;
 
     res = cmd_meta_create_buf_view(cmd, localbuf,
             size, format, &view);
@@ -323,7 +320,7 @@
 
     memset(&info, 0, sizeof(info));
     info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
-    info.image.handle = (uint64_t)img;
+    info.image = (VkImage) img;
     info.subresourceRange.baseMipLevel = lod;
     info.subresourceRange.numLevels = 1;
     info.subresourceRange.baseArrayLayer = layer;
diff --git a/icd/intel/desc.c b/icd/intel/desc.c
index 374693c..448d40a 100644
--- a/icd/intel/desc.c
+++ b/icd/intel/desc.c
@@ -602,7 +602,7 @@
             uint32_t j;
 
             for (j = 1; j < lb->arraySize; j++) {
-                if (lb->pImmutableSamplers[j].handle != lb->pImmutableSamplers[0].handle) {
+                if (lb->pImmutableSamplers[j] != lb->pImmutableSamplers[0]) {
                     shared = false;
                     break;
                 }
@@ -760,7 +760,7 @@
     VkDescriptorSetLayout                   descriptorSetLayout)
 
 {
-    struct intel_obj *obj = intel_obj(descriptorSetLayout.handle);
+    struct intel_obj *obj = intel_obj(descriptorSetLayout);
 
     obj->destroy(obj);
 }
@@ -782,7 +782,7 @@
     VkPipelineLayout                        pipelineLayout)
 
 {
-    struct intel_obj *obj = intel_obj(pipelineLayout.handle);
+    struct intel_obj *obj = intel_obj(pipelineLayout);
 
     obj->destroy(obj);
 }
@@ -803,7 +803,7 @@
     VkDescriptorPool                        descriptorPool)
 
 {
-    struct intel_obj *obj = intel_obj(descriptorPool.handle);
+    struct intel_obj *obj = intel_obj(descriptorPool);
 
     obj->destroy(obj);
 }
diff --git a/icd/intel/event.c b/icd/intel/event.c
index 05b917e..f2ac3d6 100644
--- a/icd/intel/event.c
+++ b/icd/intel/event.c
@@ -155,7 +155,7 @@
     VkEvent                                 event)
 
  {
-    struct intel_obj *obj = intel_obj(event.handle);
+    struct intel_obj *obj = intel_obj(event);
 
     intel_mem_free(obj->mem);
     obj->destroy(obj);
diff --git a/icd/intel/fb.c b/icd/intel/fb.c
index 0e643b7..5c9fd4e 100644
--- a/icd/intel/fb.c
+++ b/icd/intel/fb.c
@@ -212,7 +212,7 @@
     VkFramebuffer                           framebuffer)
 
 {
-    struct intel_obj *obj = intel_obj(framebuffer.handle);
+    struct intel_obj *obj = intel_obj(framebuffer);
 
     obj->destroy(obj);
 }
@@ -233,7 +233,7 @@
     VkRenderPass                           renderPass)
 
 {
-    struct intel_obj *obj = intel_obj(renderPass.handle);
+    struct intel_obj *obj = intel_obj(renderPass);
 
     obj->destroy(obj);
 }
diff --git a/icd/intel/fence.c b/icd/intel/fence.c
index af62df0..91eaaf1 100644
--- a/icd/intel/fence.c
+++ b/icd/intel/fence.c
@@ -133,7 +133,7 @@
     VkFence                                 fence)
 
  {
-    struct intel_obj *obj = intel_obj(fence.handle);
+    struct intel_obj *obj = intel_obj(fence);
 
     obj->destroy(obj);
  }
diff --git a/icd/intel/img.c b/icd/intel/img.c
index e1185c2..207ec09 100644
--- a/icd/intel/img.c
+++ b/icd/intel/img.c
@@ -155,7 +155,7 @@
     VkImage                                 image)
 
  {
-    struct intel_obj *obj = intel_obj(image.handle);
+    struct intel_obj *obj = intel_obj(image);
 
     obj->destroy(obj);
  }
diff --git a/icd/intel/obj.c b/icd/intel/obj.c
index ec83845..f8a2b0b 100644
--- a/icd/intel/obj.c
+++ b/icd/intel/obj.c
@@ -313,7 +313,7 @@
     VkBuffer                                    buffer,
     VkMemoryRequirements*                       pRequirements)
 {
-    struct intel_base *base = intel_base(buffer.handle);
+    struct intel_base *base = intel_base(buffer);
 
     base->get_memory_requirements(base, pRequirements);
 }
@@ -323,7 +323,7 @@
     VkImage                                     image,
     VkMemoryRequirements*                       pRequirements)
 {
-    struct intel_base *base = intel_base(image.handle);
+    struct intel_base *base = intel_base(image);
 
     base->get_memory_requirements(base, pRequirements);
 }
@@ -334,7 +334,7 @@
     VkDeviceMemory                              mem_,
     VkDeviceSize                                memOffset)
 {
-    struct intel_obj *obj = intel_obj(buffer.handle);
+    struct intel_obj *obj = intel_obj(buffer);
     struct intel_mem *mem = intel_mem(mem_);
 
     intel_obj_bind_mem(obj, mem, memOffset);
@@ -348,7 +348,7 @@
     VkDeviceMemory                              mem_,
     VkDeviceSize                                memOffset)
 {
-    struct intel_obj *obj = intel_obj(image.handle);
+    struct intel_obj *obj = intel_obj(image);
     struct intel_mem *mem = intel_mem(mem_);
 
     intel_obj_bind_mem(obj, mem, memOffset);
diff --git a/icd/intel/obj.h b/icd/intel/obj.h
index 94d161a..d8dca79 100644
--- a/icd/intel/obj.h
+++ b/icd/intel/obj.h
@@ -62,12 +62,12 @@
     size_t offset;
 };
 
-static inline struct intel_base *intel_base(uint64_t base)
+static inline struct intel_base *intel_base(void * base)
 {
     return (struct intel_base *) base;
 }
 
-static inline struct intel_obj *intel_obj(uint64_t obj)
+static inline struct intel_obj *intel_obj(void * obj)
 {
     return (struct intel_obj *) obj;
 }
diff --git a/icd/intel/pipeline.c b/icd/intel/pipeline.c
index 5f35e02..153a1fe 100644
--- a/icd/intel/pipeline.c
+++ b/icd/intel/pipeline.c
@@ -273,18 +273,18 @@
 {
     VkResult ret = VK_SUCCESS;
 
-    if (ret == VK_SUCCESS && info->vs.shader.handle)
+    if (ret == VK_SUCCESS && info->vs.shader)
         ret = pipeline_build_shader(pipeline, &info->vs, &pipeline->vs);
-    if (ret == VK_SUCCESS && info->tcs.shader.handle)
+    if (ret == VK_SUCCESS && info->tcs.shader)
         ret = pipeline_build_shader(pipeline, &info->tcs,&pipeline->tcs);
-    if (ret == VK_SUCCESS && info->tes.shader.handle)
+    if (ret == VK_SUCCESS && info->tes.shader)
         ret = pipeline_build_shader(pipeline, &info->tes,&pipeline->tes);
-    if (ret == VK_SUCCESS && info->gs.shader.handle)
+    if (ret == VK_SUCCESS && info->gs.shader)
         ret = pipeline_build_shader(pipeline, &info->gs, &pipeline->gs);
-    if (ret == VK_SUCCESS && info->fs.shader.handle)
+    if (ret == VK_SUCCESS && info->fs.shader)
         ret = pipeline_build_shader(pipeline, &info->fs, &pipeline->fs);
 
-    if (ret == VK_SUCCESS && info->compute.stage.shader.handle) {
+    if (ret == VK_SUCCESS && info->compute.stage.shader) {
         ret = pipeline_build_shader(pipeline,
                 &info->compute.stage, &pipeline->cs);
     }
@@ -1399,7 +1399,7 @@
             (struct intel_pipeline **) &(pPipelines[i]));
         //return NULL handle for unsuccessful creates
         if (res != VK_SUCCESS)
-            pPipelines[i].handle = 0;
+            pPipelines[i] = VK_NULL_HANDLE;
         else
             one_succeeded = true;
     }
@@ -1425,7 +1425,7 @@
     VkPipeline                              pipeline)
 
  {
-    struct intel_obj *obj = intel_obj(pipeline.handle);
+    struct intel_obj *obj = intel_obj(pipeline);
 
     intel_mem_free(obj->mem);
     obj->destroy(obj);
diff --git a/icd/intel/query.c b/icd/intel/query.c
index 9959d4d..4cba0d8 100644
--- a/icd/intel/query.c
+++ b/icd/intel/query.c
@@ -211,7 +211,7 @@
     VkQueryPool                                 queryPool)
 
  {
-    struct intel_obj *obj = intel_obj(queryPool.handle);
+    struct intel_obj *obj = intel_obj(queryPool);
 
     obj->destroy(obj);
  }
diff --git a/icd/intel/queue.c b/icd/intel/queue.c
index 92aa2ca..83b3a01 100644
--- a/icd/intel/queue.c
+++ b/icd/intel/queue.c
@@ -415,7 +415,7 @@
             intel_fence_set_seqno(queue->fence,
                     intel_cmd_get_batch(last_cmd, NULL));
 
-            if (fence_.handle != VK_NULL_HANDLE) {
+            if (fence_ != VK_NULL_HANDLE) {
                 struct intel_fence *fence = intel_fence(fence_);
                 intel_fence_copy(fence, queue->fence);
             }
@@ -461,6 +461,6 @@
     VkDevice                                    device,
     VkSemaphore                                 semaphore)
 {
-    struct intel_obj *obj = intel_obj(semaphore.handle);
+    struct intel_obj *obj = intel_obj(semaphore);
     obj->destroy(obj);
 }
diff --git a/icd/intel/sampler.c b/icd/intel/sampler.c
index b7910a9..493d097 100644
--- a/icd/intel/sampler.c
+++ b/icd/intel/sampler.c
@@ -411,7 +411,7 @@
     VkSampler                                 sampler)
 
  {
-    struct intel_obj *obj = intel_obj(sampler.handle);
+    struct intel_obj *obj = intel_obj(sampler);
 
     obj->destroy(obj);
  }
diff --git a/icd/intel/shader.c b/icd/intel/shader.c
index f37f7b2..9965d7e 100644
--- a/icd/intel/shader.c
+++ b/icd/intel/shader.c
@@ -80,7 +80,7 @@
     VkShaderModule                          shaderModule)
 
  {
-    struct intel_obj *obj = intel_obj(shaderModule.handle);
+    struct intel_obj *obj = intel_obj(shaderModule);
 
     obj->destroy(obj);
  }
@@ -139,7 +139,7 @@
     VkShader                                shader)
 
  {
-    struct intel_obj *obj = intel_obj(shader.handle);
+    struct intel_obj *obj = intel_obj(shader);
 
     obj->destroy(obj);
  }
diff --git a/icd/intel/view.c b/icd/intel/view.c
index dadbc22..8593f53 100644
--- a/icd/intel/view.c
+++ b/icd/intel/view.c
@@ -1369,7 +1369,7 @@
     VkBufferView                        bufferView)
 
  {
-    struct intel_obj *obj = intel_obj(bufferView.handle);
+    struct intel_obj *obj = intel_obj(bufferView);
 
     obj->destroy(obj);
  }
@@ -1390,7 +1390,7 @@
     VkImageView                         imageView)
 
 {
-    struct intel_obj *obj = intel_obj(imageView.handle);
+    struct intel_obj *obj = intel_obj(imageView);
 
     obj->destroy(obj);
 }
diff --git a/icd/intel/wsi_x11.c b/icd/intel/wsi_x11.c
index 1a87c5a..dbcd2d6 100644
--- a/icd/intel/wsi_x11.c
+++ b/icd/intel/wsi_x11.c
@@ -123,7 +123,7 @@
 
 static inline struct intel_x11_swap_chain *x11_swap_chain(VkSwapchainKHR sc)
 {
-    return (struct intel_x11_swap_chain *) sc.handle;
+    return (struct intel_x11_swap_chain *) sc;
 }
 
 static bool x11_is_format_presentable(const struct intel_dev *dev,
@@ -1016,7 +1016,7 @@
 {
     struct intel_dev *dev = intel_dev(device);
 
-    if (pCreateInfo->oldSwapchain.handle) {
+    if (pCreateInfo->oldSwapchain) {
         // TODO: Eventually, do more than simply up-front destroy the
         // oldSwapchain (but just do that for now):
         struct intel_x11_swap_chain *sc =
@@ -1063,7 +1063,7 @@
     if (pSwapchainImages) {
         uint32_t i;
         for (i = 0; i < *pCount; i++) {
-            pSwapchainImages[i].handle = (uint64_t) sc->persistent_images[i];
+            pSwapchainImages[i] = (VkImage) sc->persistent_images[i];
         }
     } else {
         *pCount = sc->persistent_image_count;
diff --git a/icd/nulldrv/nulldrv.c b/icd/nulldrv/nulldrv.c
index 69c1141..3c7f4bf 100644
--- a/icd/nulldrv/nulldrv.c
+++ b/icd/nulldrv/nulldrv.c
@@ -800,7 +800,7 @@
                         VK_OBJECT_TYPE_IMAGE);
                 if (!img)
                     return VK_ERROR_OUT_OF_HOST_MEMORY;
-            pSwapchainImages[i].handle = (uint64_t) &img;
+            pSwapchainImages[i] = (VkImage) img;
         }
     }
 
@@ -1622,7 +1622,7 @@
     VkMemoryRequirements*                       pMemoryRequirements)
 {
     NULLDRV_LOG_FUNC;
-    struct nulldrv_base *base = nulldrv_base((void*)buffer.handle);
+    struct nulldrv_base *base = nulldrv_base((void*)buffer);
 
     base->get_memory_requirements(base, pMemoryRequirements);
 }
@@ -1633,7 +1633,7 @@
     VkMemoryRequirements*                       pMemoryRequirements)
 {
     NULLDRV_LOG_FUNC;
-    struct nulldrv_base *base = nulldrv_base((void*)image.handle);
+    struct nulldrv_base *base = nulldrv_base((void*)image);
 
     base->get_memory_requirements(base, pMemoryRequirements);
 }
diff --git a/include/vulkan.h b/include/vulkan.h
index 074f7e5..e17207b 100644
--- a/include/vulkan.h
+++ b/include/vulkan.h
@@ -44,46 +44,17 @@
 #define VK_API_VERSION VK_MAKE_VERSION(0, 185, 0)
 
 
-#if defined(__cplusplus) && ((defined(_MSC_VER) && _MSC_VER >= 1800) || __cplusplus >= 201103L)
-    #define VK_NULL_HANDLE nullptr
-#else
-    #define VK_NULL_HANDLE 0
-#endif
+#define VK_NULL_HANDLE 0
+        
 
 
 #define VK_DEFINE_HANDLE(obj) typedef struct obj##_T* obj;
 
 
-#if defined(__cplusplus)
-    #if ((defined(_MSC_VER) && _MSC_VER >= 1800) || __cplusplus >= 201103L)
-        // The bool operator only works if there are no implicit conversions from an obj to
-        // a bool-compatible type, which can then be used to unintentionally violate type safety.
-        // C++11 and above supports the "explicit" keyword on conversion operators to stop this
-        // from happening. Otherwise users of C++ below C++11 won't get direct access to evaluating
-        // the object handle as a bool in expressions like:
-        //     if (obj) vkDestroy(obj);
-        #define VK_NONDISP_HANDLE_OPERATOR_BOOL() explicit operator bool() const { return handle != 0; }
-        #define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
-            explicit obj(uint64_t x) : handle(x) { } \
-            obj(decltype(nullptr)) : handle(0) { }
-    #else
-        #define VK_NONDISP_HANDLE_OPERATOR_BOOL()
-        #define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
-            obj(uint64_t x) : handle(x) { }
-    #endif
-    #define VK_DEFINE_NONDISP_HANDLE(obj) \
-        struct obj { \
-            obj() : handle(0) { } \
-            VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
-            obj& operator =(uint64_t x) { handle = x; return *this; } \
-            bool operator==(const obj& other) const { return handle == other.handle; } \
-            bool operator!=(const obj& other) const { return handle != other.handle; } \
-            bool operator!() const { return !handle; } \
-            VK_NONDISP_HANDLE_OPERATOR_BOOL() \
-            uint64_t handle; \
-        };
+#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
+	#define VK_DEFINE_NONDISP_HANDLE(obj) typedef struct obj##_T *obj;
 #else
-    #define VK_DEFINE_NONDISP_HANDLE(obj) typedef struct obj##_T { uint64_t handle; } obj;
+	#define VK_DEFINE_NONDISP_HANDLE(obj) typedef uint64_t obj;
 #endif
         
 
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index a928547..2b6d55e 100755
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -63,21 +63,21 @@
     VkLayerInstanceDispatchTable* instance_dispatch_table;
     devExts device_extensions;
     // Layer specific data
-    unordered_map<uint64_t, unique_ptr<SAMPLER_NODE>> sampleMap;
-    unordered_map<uint64_t, unique_ptr<VkImageViewCreateInfo>> imageViewMap;
-    unordered_map<uint64_t, unique_ptr<VkImageCreateInfo>> imageMap;
-    unordered_map<uint64_t, unique_ptr<VkBufferViewCreateInfo>> bufferViewMap;
-    unordered_map<uint64_t, unique_ptr<VkBufferCreateInfo>> bufferMap;
-    unordered_map<uint64_t, PIPELINE_NODE*> pipelineMap;
-    unordered_map<uint64_t, POOL_NODE*> poolMap;
-    unordered_map<uint64_t, SET_NODE*> setMap;
-    unordered_map<uint64_t, LAYOUT_NODE*> layoutMap;
-    unordered_map<uint64_t, PIPELINE_LAYOUT_NODE> pipelineLayoutMap;
-    unordered_map<uint64_t, VkShaderStageFlagBits> shaderStageMap;
+    unordered_map<VkSampler, unique_ptr<SAMPLER_NODE>> sampleMap;
+    unordered_map<VkImageView, unique_ptr<VkImageViewCreateInfo>> imageViewMap;
+    unordered_map<VkImage, unique_ptr<VkImageCreateInfo>> imageMap;
+    unordered_map<VkBufferView, unique_ptr<VkBufferViewCreateInfo>> bufferViewMap;
+    unordered_map<VkBuffer, unique_ptr<VkBufferCreateInfo>> bufferMap;
+    unordered_map<VkPipeline, PIPELINE_NODE*> pipelineMap;
+    unordered_map<VkDescriptorPool, POOL_NODE*> poolMap;
+    unordered_map<VkDescriptorSet, SET_NODE*> setMap;
+    unordered_map<VkDescriptorSetLayout, LAYOUT_NODE*> layoutMap;
+    unordered_map<VkPipelineLayout, PIPELINE_LAYOUT_NODE> pipelineLayoutMap;
+    unordered_map<VkShader, VkShaderStageFlagBits> shaderStageMap;
     // Map for layout chains
     unordered_map<void*, GLOBAL_CB_NODE*> cmdBufferMap;
-    unordered_map<uint64_t, VkRenderPassCreateInfo*> renderPassMap;
-    unordered_map<uint64_t, VkFramebufferCreateInfo*> frameBufferMap;
+    unordered_map<VkRenderPass, VkRenderPassCreateInfo*> renderPassMap;
+    unordered_map<VkFramebuffer, VkFramebufferCreateInfo*> frameBufferMap;
 
     layer_data() :
         report_data(nullptr),
@@ -283,12 +283,12 @@
 static PIPELINE_NODE* getPipeline(layer_data* my_data, const VkPipeline pipeline)
 {
     loader_platform_thread_lock_mutex(&globalLock);
-    if (my_data->pipelineMap.find(pipeline.handle) == my_data->pipelineMap.end()) {
+    if (my_data->pipelineMap.find(pipeline) == my_data->pipelineMap.end()) {
         loader_platform_thread_unlock_mutex(&globalLock);
         return NULL;
     }
     loader_platform_thread_unlock_mutex(&globalLock);
-    return my_data->pipelineMap[pipeline.handle];
+    return my_data->pipelineMap[pipeline];
 }
 // Return VK_TRUE if for a given PSO, the given state enum is dynamic, else return VK_FALSE
 static VkBool32 isDynamic(const PIPELINE_NODE* pPipeline, const VkDynamicState state)
@@ -328,8 +328,8 @@
     //  We should have that check separately and then gate this check based on that check
     if (pPipe && (pCB->lastBoundPipelineLayout) && (pCB->lastBoundPipelineLayout != pPipe->graphicsPipelineCI.layout)) {
         result = VK_FALSE;
-        result |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_PIPELINE_LAYOUT, pCB->lastBoundPipelineLayout.handle, 0, DRAWSTATE_PIPELINE_LAYOUT_MISMATCH, "DS",
-                "Pipeline layout from last vkCmdBindDescriptorSets() (%#" PRIxLEAST64 ") does not match PSO Pipeline layout (%#" PRIxLEAST64 ") ", pCB->lastBoundPipelineLayout.handle, pPipe->graphicsPipelineCI.layout.handle);
+        result |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_PIPELINE_LAYOUT, (uint64_t) pCB->lastBoundPipelineLayout, 0, DRAWSTATE_PIPELINE_LAYOUT_MISMATCH, "DS",
+                "Pipeline layout from last vkCmdBindDescriptorSets() (%#" PRIxLEAST64 ") does not match PSO Pipeline layout (%#" PRIxLEAST64 ") ", (uint64_t) pCB->lastBoundPipelineLayout, (uint64_t) pPipe->graphicsPipelineCI.layout);
     }
     // Verify Vtx binding
     if (MAX_BINDING != pCB->lastVtxBinding) {
@@ -449,10 +449,10 @@
     for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) {
         const VkPipelineShaderStageCreateInfo *pPSSCI = &pCreateInfo->pStages[i];
 
-        if (dev_data->shaderStageMap.find(pPSSCI->shader.handle) == dev_data->shaderStageMap.end())
+        if (dev_data->shaderStageMap.find(pPSSCI->shader) == dev_data->shaderStageMap.end())
             continue;
 
-        switch (dev_data->shaderStageMap[pPSSCI->shader.handle]) {
+        switch (dev_data->shaderStageMap[pPSSCI->shader]) {
             case VK_SHADER_STAGE_VERTEX_BIT:
                 memcpy(&pPipeline->vsCI, pPSSCI, sizeof(VkPipelineShaderStageCreateInfo));
                 pPipeline->active_shaders |= VK_SHADER_STAGE_VERTEX_BIT;
@@ -582,7 +582,7 @@
 // For given pipeline, return number of MSAA samples, or one if MSAA disabled
 static uint32_t getNumSamples(layer_data* my_data, const VkPipeline pipeline)
 {
-    PIPELINE_NODE* pPipe = my_data->pipelineMap[pipeline.handle];
+    PIPELINE_NODE* pPipe = my_data->pipelineMap[pipeline];
     if (VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO == pPipe->msStateCI.sType) {
         return pPipe->msStateCI.rasterSamples;
     }
@@ -595,7 +595,7 @@
         // Verify that any MSAA request in PSO matches sample# in bound FB
         uint32_t psoNumSamples = getNumSamples(my_data, pipeline);
         if (pCB->activeRenderPass) {
-            const VkRenderPassCreateInfo* pRPCI = my_data->renderPassMap[pCB->activeRenderPass.handle];
+            const VkRenderPassCreateInfo* pRPCI = my_data->renderPassMap[pCB->activeRenderPass];
             const VkSubpassDescription* pSD = &pRPCI->pSubpasses[pCB->activeSubpass];
             int subpassNumSamples = 0;
             uint32_t i;
@@ -623,9 +623,9 @@
             }
 
             if (psoNumSamples != subpassNumSamples) {
-                return log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_PIPELINE, pipeline.handle, 0, DRAWSTATE_NUM_SAMPLES_MISMATCH, "DS",
+                return log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_PIPELINE, (uint64_t) pipeline, 0, DRAWSTATE_NUM_SAMPLES_MISMATCH, "DS",
                         "Num samples mismatch! Binding PSO (%#" PRIxLEAST64 ") with %u samples while current RenderPass (%#" PRIxLEAST64 ") w/ %u samples!",
-                        pipeline.handle, psoNumSamples, pCB->activeRenderPass.handle, subpassNumSamples);
+                        (uint64_t) pipeline, psoNumSamples, (uint64_t) pCB->activeRenderPass, subpassNumSamples);
             }
         } else {
             // TODO : I believe it's an error if we reach this point and don't have an activeRenderPass
@@ -644,33 +644,33 @@
 static POOL_NODE* getPoolNode(layer_data* my_data, const VkDescriptorPool pool)
 {
     loader_platform_thread_lock_mutex(&globalLock);
-    if (my_data->poolMap.find(pool.handle) == my_data->poolMap.end()) {
+    if (my_data->poolMap.find(pool) == my_data->poolMap.end()) {
         loader_platform_thread_unlock_mutex(&globalLock);
         return NULL;
     }
     loader_platform_thread_unlock_mutex(&globalLock);
-    return my_data->poolMap[pool.handle];
+    return my_data->poolMap[pool];
 }
 // Return Set node ptr for specified set or else NULL
 static SET_NODE* getSetNode(layer_data* my_data, const VkDescriptorSet set)
 {
     loader_platform_thread_lock_mutex(&globalLock);
-    if (my_data->setMap.find(set.handle) == my_data->setMap.end()) {
+    if (my_data->setMap.find(set) == my_data->setMap.end()) {
         loader_platform_thread_unlock_mutex(&globalLock);
         return NULL;
     }
     loader_platform_thread_unlock_mutex(&globalLock);
-    return my_data->setMap[set.handle];
+    return my_data->setMap[set];
 }
 
 static LAYOUT_NODE* getLayoutNode(layer_data* my_data, const VkDescriptorSetLayout layout) {
     loader_platform_thread_lock_mutex(&globalLock);
-    if (my_data->layoutMap.find(layout.handle) == my_data->layoutMap.end()) {
+    if (my_data->layoutMap.find(layout) == my_data->layoutMap.end()) {
         loader_platform_thread_unlock_mutex(&globalLock);
         return NULL;
     }
     loader_platform_thread_unlock_mutex(&globalLock);
-    return my_data->layoutMap[layout.handle];
+    return my_data->layoutMap[layout];
 }
 // Return VK_FALSE if update struct is of valid type, otherwise flag error and return code from callback
 static VkBool32 validUpdateStruct(layer_data* my_data, const VkDevice device, const GENERIC_HEADER* pUpdateStruct)
@@ -836,14 +836,14 @@
 static VkBool32 validateSampler(const layer_data* my_data, const VkSampler* pSampler, const VkBool32 immutable)
 {
     VkBool32 skipCall = VK_FALSE;
-    auto sampIt = my_data->sampleMap.find(pSampler->handle);
+    auto sampIt = my_data->sampleMap.find(*pSampler);
     if (sampIt == my_data->sampleMap.end()) {
         if (!immutable) {
-            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SAMPLER, pSampler->handle, 0, DRAWSTATE_SAMPLER_DESCRIPTOR_ERROR, "DS",
-                "vkUpdateDescriptorSets: Attempt to update descriptor with invalid sampler %#" PRIxLEAST64, pSampler->handle);
+            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SAMPLER, (uint64_t) *pSampler, 0, DRAWSTATE_SAMPLER_DESCRIPTOR_ERROR, "DS",
+                "vkUpdateDescriptorSets: Attempt to update descriptor with invalid sampler %#" PRIxLEAST64, (uint64_t) *pSampler);
         } else { // immutable
-            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SAMPLER, pSampler->handle, 0, DRAWSTATE_SAMPLER_DESCRIPTOR_ERROR, "DS",
-                "vkUpdateDescriptorSets: Attempt to update descriptor whose binding has an invalid immutable sampler %#" PRIxLEAST64, pSampler->handle);
+            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SAMPLER, (uint64_t) *pSampler, 0, DRAWSTATE_SAMPLER_DESCRIPTOR_ERROR, "DS",
+                "vkUpdateDescriptorSets: Attempt to update descriptor whose binding has an invalid immutable sampler %#" PRIxLEAST64, (uint64_t) *pSampler);
         }
     } else {
         // TODO : Any further checks we want to do on the sampler?
@@ -854,19 +854,19 @@
 static VkBool32 validateImageView(const layer_data* my_data, const VkImageView* pImageView, const VkImageLayout imageLayout)
 {
     VkBool32 skipCall = VK_FALSE;
-    auto ivIt = my_data->imageViewMap.find(pImageView->handle);
+    auto ivIt = my_data->imageViewMap.find(*pImageView);
     if (ivIt == my_data->imageViewMap.end()) {
-        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, pImageView->handle, 0, DRAWSTATE_IMAGEVIEW_DESCRIPTOR_ERROR, "DS",
-                "vkUpdateDescriptorSets: Attempt to update descriptor with invalid imageView %#" PRIxLEAST64, pImageView->handle);
+        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t) *pImageView, 0, DRAWSTATE_IMAGEVIEW_DESCRIPTOR_ERROR, "DS",
+                "vkUpdateDescriptorSets: Attempt to update descriptor with invalid imageView %#" PRIxLEAST64, (uint64_t) *pImageView);
     } else {
         // Validate that imageLayout is compatible with aspectMask and image format
         VkImageAspectFlags aspectMask = ivIt->second->subresourceRange.aspectMask;
-        uint64_t imageHandle = ivIt->second->image.handle;
+        VkImage image = ivIt->second->image;
         // TODO : Check here in case we have a bad image handle
-        auto imgIt = my_data->imageMap.find(imageHandle);
+        auto imgIt = my_data->imageMap.find(image);
         if (imgIt == my_data->imageMap.end()) {
-            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE, imageHandle, 0, DRAWSTATE_IMAGEVIEW_DESCRIPTOR_ERROR, "DS",
-                "vkUpdateDescriptorSets: Attempt to update descriptor with invalid image handle %#" PRIxLEAST64 " in imageView %#" PRIxLEAST64, imageHandle, pImageView->handle);
+            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE, (uint64_t) image, 0, DRAWSTATE_IMAGEVIEW_DESCRIPTOR_ERROR, "DS",
+                "vkUpdateDescriptorSets: Attempt to update descriptor with invalid image handle %#" PRIxLEAST64 " in imageView %#" PRIxLEAST64, (uint64_t) image, (uint64_t) *pImageView);
         } else {
             VkFormat format = (*imgIt).second->format;
             bool ds = vk_format_is_depth_or_stencil(format);
@@ -874,15 +874,15 @@
                 case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
                     // Only Color bit must be set
                     if ((aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) != VK_IMAGE_ASPECT_COLOR_BIT) {
-                        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, pImageView->handle, 0,
+                        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t) *pImageView, 0,
                             DRAWSTATE_INVALID_IMAGE_ASPECT, "DS", "vkUpdateDescriptorSets: Updating descriptor with layout VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL and imageView %#" PRIxLEAST64 ""
-                                    " that does not have VK_IMAGE_ASPECT_COLOR_BIT set.", pImageView->handle);
+                                    " that does not have VK_IMAGE_ASPECT_COLOR_BIT set.", (uint64_t) *pImageView);
                     }
                     // format must NOT be DS
                     if (ds) {
-                        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, pImageView->handle, 0,
+                        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t) *pImageView, 0,
                             DRAWSTATE_IMAGEVIEW_DESCRIPTOR_ERROR, "DS", "vkUpdateDescriptorSets: Updating descriptor with layout VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL and imageView %#" PRIxLEAST64 ""
-                                    " but the image format is %s which is not a color format.", pImageView->handle, string_VkFormat(format));
+                                    " but the image format is %s which is not a color format.", (uint64_t) *pImageView, string_VkFormat(format));
                     }
                     break;
                 case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
@@ -891,21 +891,21 @@
                     if (aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
                         if (aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
                             // both  must NOT be set
-                            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, pImageView->handle, 0,
+                            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t) *pImageView, 0,
                             DRAWSTATE_INVALID_IMAGE_ASPECT, "DS", "vkUpdateDescriptorSets: Updating descriptor with imageView %#" PRIxLEAST64 ""
-                                    " that has both STENCIL and DEPTH aspects set", pImageView->handle);
+                                    " that has both STENCIL and DEPTH aspects set", (uint64_t) *pImageView);
                         }
                     } else if (!(aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT)) {
                         // Neither were set
-                        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, pImageView->handle, 0,
+                        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t) *pImageView, 0,
                             DRAWSTATE_INVALID_IMAGE_ASPECT, "DS", "vkUpdateDescriptorSets: Updating descriptor with layout %s and imageView %#" PRIxLEAST64 ""
-                                    " that does not have STENCIL or DEPTH aspect set.", string_VkImageLayout(imageLayout), pImageView->handle);
+                                    " that does not have STENCIL or DEPTH aspect set.", string_VkImageLayout(imageLayout), (uint64_t) *pImageView);
                     }
                     // format must be DS
                     if (!ds) {
-                        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, pImageView->handle, 0,
+                        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t) *pImageView, 0,
                             DRAWSTATE_IMAGEVIEW_DESCRIPTOR_ERROR, "DS", "vkUpdateDescriptorSets: Updating descriptor with layout %s and imageView %#" PRIxLEAST64 ""
-                                    " but the image format is %s which is not a depth/stencil format.", string_VkImageLayout(imageLayout), pImageView->handle, string_VkFormat(format));
+                                    " but the image format is %s which is not a depth/stencil format.", string_VkImageLayout(imageLayout), (uint64_t) *pImageView, string_VkFormat(format));
                     }
                     break;
                 default:
@@ -920,10 +920,10 @@
 static VkBool32 validateBufferView(const layer_data* my_data, const VkBufferView* pBufferView)
 {
     VkBool32 skipCall = VK_FALSE;
-    auto sampIt = my_data->bufferViewMap.find(pBufferView->handle);
+    auto sampIt = my_data->bufferViewMap.find(*pBufferView);
     if (sampIt == my_data->bufferViewMap.end()) {
-        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_BUFFER_VIEW, pBufferView->handle, 0, DRAWSTATE_BUFFERVIEW_DESCRIPTOR_ERROR, "DS",
-                "vkUpdateDescriptorSets: Attempt to update descriptor with invalid bufferView %#" PRIxLEAST64, pBufferView->handle);
+        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_BUFFER_VIEW, (uint64_t) *pBufferView, 0, DRAWSTATE_BUFFERVIEW_DESCRIPTOR_ERROR, "DS",
+                "vkUpdateDescriptorSets: Attempt to update descriptor with invalid bufferView %#" PRIxLEAST64, (uint64_t) *pBufferView);
     } else {
         // TODO : Any further checks we want to do on the bufferView?
     }
@@ -933,10 +933,10 @@
 static VkBool32 validateBufferInfo(const layer_data* my_data, const VkDescriptorBufferInfo* pBufferInfo)
 {
     VkBool32 skipCall = VK_FALSE;
-    auto sampIt = my_data->bufferMap.find(pBufferInfo->buffer.handle);
+    auto sampIt = my_data->bufferMap.find(pBufferInfo->buffer);
     if (sampIt == my_data->bufferMap.end()) {
-        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_BUFFER, pBufferInfo->buffer.handle, 0, DRAWSTATE_BUFFERINFO_DESCRIPTOR_ERROR, "DS",
-                "vkUpdateDescriptorSets: Attempt to update descriptor where bufferInfo has invalid buffer %#" PRIxLEAST64, pBufferInfo->buffer.handle);
+        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_BUFFER, (uint64_t) pBufferInfo->buffer, 0, DRAWSTATE_BUFFERINFO_DESCRIPTOR_ERROR, "DS",
+                "vkUpdateDescriptorSets: Attempt to update descriptor where bufferInfo has invalid buffer %#" PRIxLEAST64, (uint64_t) pBufferInfo->buffer);
     } else {
         // TODO : Any further checks we want to do on the bufferView?
     }
@@ -965,14 +965,14 @@
                 if (NULL == pLayoutBinding->pImmutableSamplers) {
                     pSampler = &(pWDS->pImageInfo[i].sampler);
                     if (immutable) {
-                        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SAMPLER, pSampler->handle, 0, DRAWSTATE_INCONSISTENT_IMMUTABLE_SAMPLER_UPDATE, "DS",
+                        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SAMPLER, (uint64_t) *pSampler, 0, DRAWSTATE_INCONSISTENT_IMMUTABLE_SAMPLER_UPDATE, "DS",
                             "vkUpdateDescriptorSets: Update #%u is not an immutable sampler %#" PRIxLEAST64 ", but previous update(s) from this "
                             "VkWriteDescriptorSet struct used an immutable sampler. All updates from a single struct must either "
-                            "use immutable or non-immutable samplers.", i, pSampler->handle);
+                            "use immutable or non-immutable samplers.", i, (uint64_t) *pSampler);
                     }
                 } else {
                     if (i>0 && !immutable) {
-                        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SAMPLER, pSampler->handle, 0, DRAWSTATE_INCONSISTENT_IMMUTABLE_SAMPLER_UPDATE, "DS",
+                        skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SAMPLER, (uint64_t) *pSampler, 0, DRAWSTATE_INCONSISTENT_IMMUTABLE_SAMPLER_UPDATE, "DS",
                             "vkUpdateDescriptorSets: Update #%u is an immutable sampler, but previous update(s) from this "
                             "VkWriteDescriptorSet struct used a non-immutable sampler. All updates from a single struct must either "
                             "use immutable or non-immutable samplers.", i);
@@ -1019,7 +1019,7 @@
     uint32_t i = 0;
     for (i=0; i < writeCount; i++) {
         VkDescriptorSet ds = pWDS[i].destSet;
-        SET_NODE* pSet = my_data->setMap[ds.handle];
+        SET_NODE* pSet = my_data->setMap[ds];
         GENERIC_HEADER* pUpdate = (GENERIC_HEADER*) &pWDS[i];
         pLayout = pSet->pLayout;
         // First verify valid update struct
@@ -1030,7 +1030,7 @@
         binding = pWDS[i].destBinding;
         // Make sure that layout being updated has the binding being updated
         if (pLayout->createInfo.count < binding) {
-            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, ds.handle, 0, DRAWSTATE_INVALID_UPDATE_INDEX, "DS",
+            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t) ds, 0, DRAWSTATE_INVALID_UPDATE_INDEX, "DS",
                     "Descriptor Set %p does not have binding to match update binding %u for update type %s!", ds, binding, string_VkStructureType(pUpdate->sType));
         } else {
             // Next verify that update falls within size of given binding
@@ -1038,7 +1038,7 @@
             if (getBindingEndIndex(pLayout, binding) < endIndex) {
                 pLayoutCI = &pLayout->createInfo;
                 string DSstr = vk_print_vkdescriptorsetlayoutcreateinfo(pLayoutCI, "{DS}    ");
-                skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, ds.handle, 0, DRAWSTATE_DESCRIPTOR_UPDATE_OUT_OF_BOUNDS, "DS",
+                skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t) ds, 0, DRAWSTATE_DESCRIPTOR_UPDATE_OUT_OF_BOUNDS, "DS",
                         "Descriptor update type of %s is out of bounds for matching binding %u in Layout w/ CI:\n%s!", string_VkStructureType(pUpdate->sType), binding, DSstr.c_str());
             } else { // TODO : should we skip update on a type mismatch or force it?
                 uint32_t startIndex;
@@ -1052,7 +1052,7 @@
                         GENERIC_HEADER* pNewNode = NULL;
                         skipCall |= shadowUpdateNode(my_data, device, pUpdate, &pNewNode);
                         if (NULL == pNewNode) {
-                            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, ds.handle, 0, DRAWSTATE_OUT_OF_MEMORY, "DS",
+                            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t) ds, 0, DRAWSTATE_OUT_OF_MEMORY, "DS",
                                     "Out of memory while attempting to allocate UPDATE struct in vkUpdateDescriptors()");
                         } else {
                             // Insert shadow node into LL of updates for this set
@@ -1075,19 +1075,19 @@
         LAYOUT_NODE *pSrcLayout = NULL, *pDstLayout = NULL;
         uint32_t srcStartIndex = 0, srcEndIndex = 0, dstStartIndex = 0, dstEndIndex = 0;
         // For each copy make sure that update falls within given layout and that types match
-        pSrcSet = my_data->setMap[pCDS[i].srcSet.handle];
-        pDstSet = my_data->setMap[pCDS[i].destSet.handle];
+        pSrcSet = my_data->setMap[pCDS[i].srcSet];
+        pDstSet = my_data->setMap[pCDS[i].destSet];
         pSrcLayout = pSrcSet->pLayout;
         pDstLayout = pDstSet->pLayout;
         // Validate that src binding is valid for src set layout
         if (pSrcLayout->createInfo.count < pCDS[i].srcBinding) {
-            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, pSrcSet->set.handle, 0, DRAWSTATE_INVALID_UPDATE_INDEX, "DS",
+            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t) pSrcSet->set, 0, DRAWSTATE_INVALID_UPDATE_INDEX, "DS",
                 "Copy descriptor update %u has srcBinding %u which is out of bounds for underlying SetLayout %#" PRIxLEAST64 " which only has bindings 0-%u.",
-                i, pCDS[i].srcBinding, pSrcLayout->layout.handle, pSrcLayout->createInfo.count-1);
+                i, pCDS[i].srcBinding, (uint64_t) pSrcLayout->layout, pSrcLayout->createInfo.count-1);
         } else if (pDstLayout->createInfo.count < pCDS[i].destBinding) {
-            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, pDstSet->set.handle, 0, DRAWSTATE_INVALID_UPDATE_INDEX, "DS",
+            skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t) pDstSet->set, 0, DRAWSTATE_INVALID_UPDATE_INDEX, "DS",
                 "Copy descriptor update %u has destBinding %u which is out of bounds for underlying SetLayout %#" PRIxLEAST64 " which only has bindings 0-%u.",
-                i, pCDS[i].destBinding, pDstLayout->layout.handle, pDstLayout->createInfo.count-1);
+                i, pCDS[i].destBinding, (uint64_t) pDstLayout->layout, pDstLayout->createInfo.count-1);
         } else {
             // Proceed with validation. Bindings are ok, but make sure update is within bounds of given layout
             srcEndIndex = getUpdateEndIndex(my_data, device, pSrcLayout, pCDS[i].srcBinding, pCDS[i].srcArrayElement, (const GENERIC_HEADER*)&(pCDS[i]));
@@ -1095,12 +1095,12 @@
             if (getBindingEndIndex(pSrcLayout, pCDS[i].srcBinding) < srcEndIndex) {
                 pLayoutCI = &pSrcLayout->createInfo;
                 string DSstr = vk_print_vkdescriptorsetlayoutcreateinfo(pLayoutCI, "{DS}    ");
-                skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, pSrcSet->set.handle, 0, DRAWSTATE_DESCRIPTOR_UPDATE_OUT_OF_BOUNDS, "DS",
+                skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t) pSrcSet->set, 0, DRAWSTATE_DESCRIPTOR_UPDATE_OUT_OF_BOUNDS, "DS",
                     "Copy descriptor src update is out of bounds for matching binding %u in Layout w/ CI:\n%s!", pCDS[i].srcBinding, DSstr.c_str());
             } else if (getBindingEndIndex(pDstLayout, pCDS[i].destBinding) < dstEndIndex) {
                 pLayoutCI = &pDstLayout->createInfo;
                 string DSstr = vk_print_vkdescriptorsetlayoutcreateinfo(pLayoutCI, "{DS}    ");
-                skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, pDstSet->set.handle, 0, DRAWSTATE_DESCRIPTOR_UPDATE_OUT_OF_BOUNDS, "DS",
+                skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t) pDstSet->set, 0, DRAWSTATE_DESCRIPTOR_UPDATE_OUT_OF_BOUNDS, "DS",
                     "Copy descriptor dest update is out of bounds for matching binding %u in Layout w/ CI:\n%s!", pCDS[i].destBinding, DSstr.c_str());
             } else {
                 srcStartIndex = getUpdateStartIndex(my_data, device, pSrcLayout, pCDS[i].srcBinding, pCDS[i].srcArrayElement, (const GENERIC_HEADER*)&(pCDS[i]));
@@ -1130,17 +1130,17 @@
     for (i=0; i<count; ++i) {
         LAYOUT_NODE* pLayout = getLayoutNode(dev_data, pSetLayouts[i]);
         if (NULL == pLayout) {
-            skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, pSetLayouts[i].handle, 0, DRAWSTATE_INVALID_LAYOUT, "DS",
-                    "Unable to find set layout node for layout %#" PRIxLEAST64 " specified in vkAllocDescriptorSets() call", pSetLayouts[i].handle);
+            skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (uint64_t) pSetLayouts[i], 0, DRAWSTATE_INVALID_LAYOUT, "DS",
+                    "Unable to find set layout node for layout %#" PRIxLEAST64 " specified in vkAllocDescriptorSets() call", (uint64_t) pSetLayouts[i]);
         } else {
             uint32_t typeIndex = 0, typeCount = 0;
             for (j=0; j<pLayout->createInfo.count; ++j) {
                 typeIndex = static_cast<uint32_t>(pLayout->createInfo.pBinding[j].descriptorType);
                 typeCount = pLayout->createInfo.pBinding[j].arraySize;
                 if (typeCount > pPoolNode->availableDescriptorTypeCount[typeIndex]) {
-                    skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, pLayout->layout.handle, 0, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS",
+                    skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (uint64_t) pLayout->layout, 0, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS",
                         "Unable to allocate %u descriptors of type %s from pool %#" PRIxLEAST64 ". This pool only has %u descriptors of this type remaining.",
-                            typeCount, string_VkDescriptorType(pLayout->createInfo.pBinding[j].descriptorType), pPoolNode->pool.handle, pPoolNode->availableDescriptorTypeCount[typeIndex]);
+                            typeCount, string_VkDescriptorType(pLayout->createInfo.pBinding[j].descriptorType), (uint64_t) pPoolNode->pool, pPoolNode->availableDescriptorTypeCount[typeIndex]);
                 } else { // Decrement available descriptors of this type
                     pPoolNode->availableDescriptorTypeCount[typeIndex] -= typeCount;
                 }
@@ -1249,8 +1249,8 @@
 {
     POOL_NODE* pPool = getPoolNode(my_data, pool);
     if (!pPool) {
-        log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_POOL, pool.handle, 0, DRAWSTATE_INVALID_POOL, "DS",
-                "Unable to find pool node for pool %#" PRIxLEAST64 " specified in vkResetDescriptorPool() call", pool.handle);
+        log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_POOL, (uint64_t) pool, 0, DRAWSTATE_INVALID_POOL, "DS",
+                "Unable to find pool node for pool %#" PRIxLEAST64 " specified in vkResetDescriptorPool() call", (uint64_t) pool);
     } else {
         // TODO: validate flags
         // For every set off of this pool, clear it
@@ -1422,7 +1422,7 @@
         POOL_NODE* pPool = getPoolNode(my_data, pSet->pool);
         // Print out pool details
         skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_INFO_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_NONE, "DS",
-                "Details for pool %#" PRIxLEAST64 ".", pPool->pool.handle);
+                "Details for pool %#" PRIxLEAST64 ".", (uint64_t) pPool->pool);
         string poolStr = vk_print_vkdescriptorpoolcreateinfo(&pPool->createInfo, " ");
         skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_INFO_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_NONE, "DS",
                 "%s", poolStr.c_str());
@@ -1430,11 +1430,11 @@
         char prefix[10];
         uint32_t index = 0;
         skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_INFO_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_NONE, "DS",
-                "Details for descriptor set %#" PRIxLEAST64 ".", pSet->set.handle);
+                "Details for descriptor set %#" PRIxLEAST64 ".", (uint64_t) pSet->set);
         LAYOUT_NODE* pLayout = pSet->pLayout;
         // Print layout details
         skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_INFO_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_NONE, "DS",
-                "Layout #%u, (object %#" PRIxLEAST64 ") for DS %#" PRIxLEAST64 ".", index+1, (void*)pLayout->layout.handle, (void*)pSet->set.handle);
+                "Layout #%u, (object %#" PRIxLEAST64 ") for DS %#" PRIxLEAST64 ".", index+1, (void*)pLayout->layout, (void*)pSet->set);
         sprintf(prefix, "  [L%u] ", index);
         string DSLstr = vk_print_vkdescriptorsetlayoutcreateinfo(&pLayout->createInfo, prefix).c_str();
         skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_INFO_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_NONE, "DS",
@@ -1443,7 +1443,7 @@
         GENERIC_HEADER* pUpdate = pSet->pUpdateStructs;
         if (pUpdate) {
             skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_INFO_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_NONE, "DS",
-                    "Update Chain [UC] for descriptor set %#" PRIxLEAST64 ":", pSet->set.handle);
+                    "Update Chain [UC] for descriptor set %#" PRIxLEAST64 ":", (uint64_t) pSet->set);
             sprintf(prefix, "  [UC] ");
             skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_INFO_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_NONE, "DS",
                     dynamic_display(pUpdate, prefix).c_str());
@@ -1451,10 +1451,10 @@
         } else {
             if (0 != pSet->descriptorCount) {
                 skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_INFO_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_NONE, "DS",
-                        "No Update Chain for descriptor set %#" PRIxLEAST64 " which has %u descriptors (vkUpdateDescriptors has not been called)", pSet->set.handle, pSet->descriptorCount);
+                        "No Update Chain for descriptor set %#" PRIxLEAST64 " which has %u descriptors (vkUpdateDescriptors has not been called)", (uint64_t) pSet->set, pSet->descriptorCount);
             } else {
                 skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_INFO_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_NONE, "DS",
-                        "FYI: No descriptors in descriptor set %#" PRIxLEAST64 ".", pSet->set.handle);
+                        "FYI: No descriptors in descriptor set %#" PRIxLEAST64 ".", (uint64_t) pSet->set);
             }
         }
     }
@@ -1498,7 +1498,7 @@
         inside = log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER,
                          (uint64_t)pCB->cmdBuffer, 0, DRAWSTATE_INVALID_RENDERPASS_CMD, "DS",
                          "%s: It is invalid to issue this call inside an active render pass (%#" PRIxLEAST64 ")",
-                         apiName, pCB->activeRenderPass.handle);
+                         apiName, (uint64_t) pCB->activeRenderPass);
     }
     return inside;
 }
@@ -1767,25 +1767,22 @@
 VK_LAYER_EXPORT void VKAPI vkDestroyBuffer(VkDevice device, VkBuffer buffer)
 {
     layer_data* dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
-    uint64_t handle = buffer.handle;
     dev_data->device_dispatch_table->DestroyBuffer(device, buffer);
-    dev_data->bufferMap.erase(handle);
+    dev_data->bufferMap.erase(buffer);
 }
 
 VK_LAYER_EXPORT void VKAPI vkDestroyBufferView(VkDevice device, VkBufferView bufferView)
 {
     layer_data* dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
-    uint64_t handle = bufferView.handle;
     dev_data->device_dispatch_table->DestroyBufferView(device, bufferView);
-    dev_data->bufferViewMap.erase(handle);
+    dev_data->bufferViewMap.erase(bufferView);
 }
 
 VK_LAYER_EXPORT void VKAPI vkDestroyImage(VkDevice device, VkImage image)
 {
     layer_data* dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
-    uint64_t handle = image.handle;
     dev_data->device_dispatch_table->DestroyImage(device, image);
-    dev_data->imageMap.erase(handle);
+    dev_data->imageMap.erase(image);
 }
 
 VK_LAYER_EXPORT void VKAPI vkDestroyImageView(VkDevice device, VkImageView imageView)
@@ -1803,9 +1800,8 @@
 VK_LAYER_EXPORT void VKAPI vkDestroyShader(VkDevice device, VkShader shader)
 {
     layer_data* dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
-    uint64_t handle = shader.handle;
     dev_data->device_dispatch_table->DestroyShader(device, shader);
-    dev_data->shaderStageMap.erase(handle);
+    dev_data->shaderStageMap.erase(shader);
 }
 
 VK_LAYER_EXPORT void VKAPI vkDestroyPipeline(VkDevice device, VkPipeline pipeline)
@@ -1863,7 +1859,7 @@
     if (VK_SUCCESS == result) {
         loader_platform_thread_lock_mutex(&globalLock);
         // TODO : This doesn't create deep copy of pQueueFamilyIndices so need to fix that if/when we want that data to be valid
-        dev_data->bufferMap[pBuffer->handle] = unique_ptr<VkBufferCreateInfo>(new VkBufferCreateInfo(*pCreateInfo));
+        dev_data->bufferMap[*pBuffer] = unique_ptr<VkBufferCreateInfo>(new VkBufferCreateInfo(*pCreateInfo));
         loader_platform_thread_unlock_mutex(&globalLock);
     }
     return result;
@@ -1875,7 +1871,7 @@
     VkResult result = dev_data->device_dispatch_table->CreateBufferView(device, pCreateInfo, pView);
     if (VK_SUCCESS == result) {
         loader_platform_thread_lock_mutex(&globalLock);
-        dev_data->bufferViewMap[pView->handle] = unique_ptr<VkBufferViewCreateInfo>(new VkBufferViewCreateInfo(*pCreateInfo));
+        dev_data->bufferViewMap[*pView] = unique_ptr<VkBufferViewCreateInfo>(new VkBufferViewCreateInfo(*pCreateInfo));
         loader_platform_thread_unlock_mutex(&globalLock);
     }
     return result;
@@ -1887,7 +1883,7 @@
     VkResult result = dev_data->device_dispatch_table->CreateImage(device, pCreateInfo, pImage);
     if (VK_SUCCESS == result) {
         loader_platform_thread_lock_mutex(&globalLock);
-        dev_data->imageMap[pImage->handle] = unique_ptr<VkImageCreateInfo>(new VkImageCreateInfo(*pCreateInfo));
+        dev_data->imageMap[*pImage] = unique_ptr<VkImageCreateInfo>(new VkImageCreateInfo(*pCreateInfo));
         loader_platform_thread_unlock_mutex(&globalLock);
     }
     return result;
@@ -1899,7 +1895,7 @@
     VkResult result = dev_data->device_dispatch_table->CreateImageView(device, pCreateInfo, pView);
     if (VK_SUCCESS == result) {
         loader_platform_thread_lock_mutex(&globalLock);
-        dev_data->imageViewMap[pView->handle] = unique_ptr<VkImageViewCreateInfo>(new VkImageViewCreateInfo(*pCreateInfo));
+        dev_data->imageViewMap[*pView] = unique_ptr<VkImageViewCreateInfo>(new VkImageViewCreateInfo(*pCreateInfo));
         loader_platform_thread_unlock_mutex(&globalLock);
     }
     return result;
@@ -1915,7 +1911,7 @@
 
     if (VK_SUCCESS == result) {
         loader_platform_thread_lock_mutex(&globalLock);
-        dev_data->shaderStageMap[pShader->handle] = pCreateInfo->stage;
+        dev_data->shaderStageMap[*pShader] = pCreateInfo->stage;
         loader_platform_thread_unlock_mutex(&globalLock);
     }
 
@@ -1987,7 +1983,7 @@
         loader_platform_thread_lock_mutex(&globalLock);
         for (i=0; i<count; i++) {
             pPipeNode[i]->pipeline = pPipelines[i];
-            dev_data->pipelineMap[pPipeNode[i]->pipeline.handle] = pPipeNode[i];
+            dev_data->pipelineMap[pPipeNode[i]->pipeline] = pPipeNode[i];
         }
         loader_platform_thread_unlock_mutex(&globalLock);
     } else {
@@ -2011,7 +2007,7 @@
     VkResult result = dev_data->device_dispatch_table->CreateSampler(device, pCreateInfo, pSampler);
     if (VK_SUCCESS == result) {
         loader_platform_thread_lock_mutex(&globalLock);
-        dev_data->sampleMap[pSampler->handle] = unique_ptr<SAMPLER_NODE>(new SAMPLER_NODE(pSampler, pCreateInfo));
+        dev_data->sampleMap[*pSampler] = unique_ptr<SAMPLER_NODE>(new SAMPLER_NODE(pSampler, pCreateInfo));
         loader_platform_thread_unlock_mutex(&globalLock);
     }
     return result;
@@ -2024,7 +2020,7 @@
     if (VK_SUCCESS == result) {
         LAYOUT_NODE* pNewNode = new LAYOUT_NODE;
         if (NULL == pNewNode) {
-            if (log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (*pSetLayout).handle, 0, DRAWSTATE_OUT_OF_MEMORY, "DS",
+            if (log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (uint64_t) *pSetLayout, 0, DRAWSTATE_OUT_OF_MEMORY, "DS",
                     "Out of memory while attempting to allocate LAYOUT_NODE in vkCreateDescriptorSetLayout()"))
                 return VK_ERROR_VALIDATION_FAILED;
         }
@@ -2060,7 +2056,7 @@
         assert(pNewNode->endIndex >= pNewNode->startIndex);
         // Put new node at Head of global Layer list
         loader_platform_thread_lock_mutex(&globalLock);
-        dev_data->layoutMap[pSetLayout->handle] = pNewNode;
+        dev_data->layoutMap[*pSetLayout] = pNewNode;
         loader_platform_thread_unlock_mutex(&globalLock);
     }
     return result;
@@ -2071,7 +2067,7 @@
     layer_data* dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
     VkResult result = dev_data->device_dispatch_table->CreatePipelineLayout(device, pCreateInfo, pPipelineLayout);
     if (VK_SUCCESS == result) {
-        PIPELINE_LAYOUT_NODE plNode = dev_data->pipelineLayoutMap[pPipelineLayout->handle];
+        PIPELINE_LAYOUT_NODE plNode = dev_data->pipelineLayoutMap[*pPipelineLayout];
         plNode.descriptorSetLayouts.resize(pCreateInfo->descriptorSetCount);
         uint32_t i = 0;
         for (i=0; i<pCreateInfo->descriptorSetCount; ++i) {
@@ -2091,17 +2087,17 @@
     VkResult result = dev_data->device_dispatch_table->CreateDescriptorPool(device, pCreateInfo, pDescriptorPool);
     if (VK_SUCCESS == result) {
         // Insert this pool into Global Pool LL at head
-        if (log_msg(dev_data->report_data, VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DESCRIPTOR_POOL, (*pDescriptorPool).handle, 0, DRAWSTATE_OUT_OF_MEMORY, "DS",
-                "Created Descriptor Pool %#" PRIxLEAST64, (*pDescriptorPool).handle))
+        if (log_msg(dev_data->report_data, VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DESCRIPTOR_POOL, (uint64_t) *pDescriptorPool, 0, DRAWSTATE_OUT_OF_MEMORY, "DS",
+                "Created Descriptor Pool %#" PRIxLEAST64, (uint64_t) *pDescriptorPool))
             return VK_ERROR_VALIDATION_FAILED;
         loader_platform_thread_lock_mutex(&globalLock);
         POOL_NODE* pNewNode = new POOL_NODE(*pDescriptorPool, pCreateInfo);
         if (NULL == pNewNode) {
-            if (log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_POOL, (*pDescriptorPool).handle, 0, DRAWSTATE_OUT_OF_MEMORY, "DS",
+            if (log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_POOL, (uint64_t) *pDescriptorPool, 0, DRAWSTATE_OUT_OF_MEMORY, "DS",
                     "Out of memory while attempting to allocate POOL_NODE in vkCreateDescriptorPool()"))
                 return VK_ERROR_VALIDATION_FAILED;
         } else {
-            dev_data->poolMap[pDescriptorPool->handle] = pNewNode;
+            dev_data->poolMap[*pDescriptorPool] = pNewNode;
         }
         loader_platform_thread_unlock_mutex(&globalLock);
     } else {
@@ -2127,8 +2123,8 @@
     // Verify that requested descriptorSets are available in pool
     POOL_NODE *pPoolNode = getPoolNode(dev_data, pAllocInfo->descriptorPool);
     if (!pPoolNode) {
-        skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_POOL, pAllocInfo->descriptorPool.handle, 0, DRAWSTATE_INVALID_POOL, "DS",
-                "Unable to find pool node for pool %#" PRIxLEAST64 " specified in vkAllocDescriptorSets() call", pAllocInfo->descriptorPool.handle);
+        skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_POOL, (uint64_t) pAllocInfo->descriptorPool, 0, DRAWSTATE_INVALID_POOL, "DS",
+                "Unable to find pool node for pool %#" PRIxLEAST64 " specified in vkAllocDescriptorSets() call", (uint64_t) pAllocInfo->descriptorPool);
     } else { // Make sure pool has all the available descriptors before calling down chain
         skipCall |= validate_descriptor_availability_in_pool(dev_data, pPoolNode, pAllocInfo->count, pAllocInfo->pSetLayouts);
     }
@@ -2143,12 +2139,12 @@
                         "AllocDescriptorSets called with 0 count");
             }
             for (uint32_t i = 0; i < pAllocInfo->count; i++) {
-                log_msg(dev_data->report_data, VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, pDescriptorSets[i].handle, 0, DRAWSTATE_NONE, "DS",
-                        "Created Descriptor Set %#" PRIxLEAST64, pDescriptorSets[i].handle);
+                log_msg(dev_data->report_data, VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t) pDescriptorSets[i], 0, DRAWSTATE_NONE, "DS",
+                        "Created Descriptor Set %#" PRIxLEAST64, (uint64_t) pDescriptorSets[i]);
                 // Create new set node and add to head of pool nodes
                 SET_NODE* pNewNode = new SET_NODE;
                 if (NULL == pNewNode) {
-                    if (log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, pDescriptorSets[i].handle, 0, DRAWSTATE_OUT_OF_MEMORY, "DS",
+                    if (log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t) pDescriptorSets[i], 0, DRAWSTATE_OUT_OF_MEMORY, "DS",
                             "Out of memory while attempting to allocate SET_NODE in vkAllocDescriptorSets()"))
                         return VK_ERROR_VALIDATION_FAILED;
                 } else {
@@ -2161,8 +2157,8 @@
                     pPoolNode->pSets = pNewNode;
                     LAYOUT_NODE* pLayout = getLayoutNode(dev_data, pAllocInfo->pSetLayouts[i]);
                     if (NULL == pLayout) {
-                        if (log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, pAllocInfo->pSetLayouts[i].handle, 0, DRAWSTATE_INVALID_LAYOUT, "DS",
-                                "Unable to find set layout node for layout %#" PRIxLEAST64 " specified in vkAllocDescriptorSets() call", pAllocInfo->pSetLayouts[i].handle))
+                        if (log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (uint64_t) pAllocInfo->pSetLayouts[i], 0, DRAWSTATE_INVALID_LAYOUT, "DS",
+                                "Unable to find set layout node for layout %#" PRIxLEAST64 " specified in vkAllocDescriptorSets() call", (uint64_t) pAllocInfo->pSetLayouts[i]))
                             return VK_ERROR_VALIDATION_FAILED;
                     }
                     pNewNode->pLayout = pLayout;
@@ -2174,7 +2170,7 @@
                         pNewNode->ppDescriptors = new GENERIC_HEADER*[descriptorArraySize];
                         memset(pNewNode->ppDescriptors, 0, descriptorArraySize);
                     }
-                    dev_data->setMap[pDescriptorSets[i].handle] = pNewNode;
+                    dev_data->setMap[pDescriptorSets[i]] = pNewNode;
                 }
             }
         }
@@ -2198,7 +2194,7 @@
     if (VK_SUCCESS == result) {
         // For each freed descriptor add it back into the pool as available
         for (uint32_t i=0; i<count; ++i) {
-            SET_NODE* pSet = dev_data->setMap[pDescriptorSets[i].handle]; // getSetNode() without locking
+            SET_NODE* pSet = dev_data->setMap[pDescriptorSets[i]]; // getSetNode() without locking
             LAYOUT_NODE* pLayout = pSet->pLayout;
             uint32_t typeIndex = 0, typeCount = 0;
             for (uint32_t j=0; j<pLayout->createInfo.count; ++j) {
@@ -2248,13 +2244,13 @@
     GLOBAL_CB_NODE* pCB = getCBNode(dev_data, cmdBuffer);
     if (pCB) {
         if (pCB->level == VK_CMD_BUFFER_LEVEL_PRIMARY) {
-            if (pBeginInfo->renderPass.handle || pBeginInfo->framebuffer.handle) {
+            if (pBeginInfo->renderPass || pBeginInfo->framebuffer) {
                 // These should be NULL for a Primary CB
                 skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, DRAWSTATE_BEGIN_CB_INVALID_STATE, "DS",
                     "vkAllocCommandBuffers():  Primary Command Buffer (%p) may not specify framebuffer or renderpass parameters", (void*)cmdBuffer);
             }
         } else {
-            if (!pBeginInfo->renderPass.handle || !pBeginInfo->framebuffer.handle) {
+            if (!pBeginInfo->renderPass || !pBeginInfo->framebuffer) {
                 // These should NOT be null for an Secondary CB
                 skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, DRAWSTATE_BEGIN_CB_INVALID_STATE, "DS",
                     "vkAllocCommandBuffers():  Secondary Command Buffers (%p) must specify framebuffer and renderpass parameters", (void*)cmdBuffer);
@@ -2327,14 +2323,14 @@
             updateCBTracking(pCB);
             skipCall |= addCmd(dev_data, pCB, CMD_BINDPIPELINE);
             if ((VK_PIPELINE_BIND_POINT_COMPUTE == pipelineBindPoint) && (pCB->activeRenderPass)) {
-                skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_PIPELINE, pipeline.handle,
+                skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_PIPELINE, (uint64_t) pipeline,
                                     0, DRAWSTATE_INVALID_RENDERPASS_CMD, "DS",
                                     "Incorrectly binding compute pipeline (%#" PRIxLEAST64 ") during active RenderPass (%#" PRIxLEAST64 ")",
-                                    pipeline.handle, pCB->activeRenderPass.handle);
+                                    (uint64_t) pipeline, (uint64_t) pCB->activeRenderPass);
             } else if ((VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) && (!pCB->activeRenderPass)) {
-                skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_PIPELINE, pipeline.handle,
+                skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_PIPELINE, (uint64_t) pipeline,
                                     0, DRAWSTATE_NO_ACTIVE_RENDERPASS, "DS", "Incorrectly binding graphics pipeline "
-                                    " (%#" PRIxLEAST64 ") without an active RenderPass", pipeline.handle);
+                                    " (%#" PRIxLEAST64 ") without an active RenderPass", (uint64_t) pipeline);
             } else {
                 PIPELINE_NODE* pPN = getPipeline(dev_data, pipeline);
                 if (pPN) {
@@ -2345,9 +2341,9 @@
                     loader_platform_thread_unlock_mutex(&globalLock);
                     skipCall |= validatePipelineState(dev_data, pCB, pipelineBindPoint, pipeline);
                 } else {
-                    skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_PIPELINE, pipeline.handle,
+                    skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_PIPELINE, (uint64_t) pipeline,
                                         0, DRAWSTATE_INVALID_PIPELINE, "DS",
-                                        "Attempt to bind Pipeline %#" PRIxLEAST64 " that doesn't exist!", (void*)pipeline.handle);
+                                        "Attempt to bind Pipeline %#" PRIxLEAST64 " that doesn't exist!", (void*)pipeline);
                 }
             }
         } else {
@@ -2595,7 +2591,7 @@
         if (pCB->state == CB_UPDATE_ACTIVE) {
             if ((VK_PIPELINE_BIND_POINT_COMPUTE == pipelineBindPoint) && (pCB->activeRenderPass)) {
                 skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_INVALID_RENDERPASS_CMD, "DS",
-                        "Incorrectly binding compute DescriptorSets during active RenderPass (%#" PRIxLEAST64 ")", pCB->activeRenderPass.handle);
+                        "Incorrectly binding compute DescriptorSets during active RenderPass (%#" PRIxLEAST64 ")", (uint64_t) pCB->activeRenderPass);
             } else if ((VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) && (!pCB->activeRenderPass)) {
                 skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_NO_ACTIVE_RENDERPASS, "DS",
                         "Incorrectly binding graphics DescriptorSets without an active RenderPass");
@@ -2608,14 +2604,14 @@
                         pCB->lastBoundPipelineLayout = layout;
                         pCB->boundDescriptorSets.push_back(pDescriptorSets[i]);
                         loader_platform_thread_unlock_mutex(&globalLock);
-                        skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, pDescriptorSets[i].handle, 0, DRAWSTATE_NONE, "DS",
-                                "DS %#" PRIxLEAST64 " bound on pipeline %s", pDescriptorSets[i].handle, string_VkPipelineBindPoint(pipelineBindPoint));
+                        skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t) pDescriptorSets[i], 0, DRAWSTATE_NONE, "DS",
+                                "DS %#" PRIxLEAST64 " bound on pipeline %s", (uint64_t) pDescriptorSets[i], string_VkPipelineBindPoint(pipelineBindPoint));
                         if (!pSet->pUpdateStructs)
-                            skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, pDescriptorSets[i].handle, 0, DRAWSTATE_DESCRIPTOR_SET_NOT_UPDATED, "DS",
-                                    "DS %#" PRIxLEAST64 " bound but it was never updated. You may want to either update it or not bind it.", pDescriptorSets[i].handle);
+                            skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t) pDescriptorSets[i], 0, DRAWSTATE_DESCRIPTOR_SET_NOT_UPDATED, "DS",
+                                    "DS %#" PRIxLEAST64 " bound but it was never updated. You may want to either update it or not bind it.", (uint64_t) pDescriptorSets[i]);
                     } else {
-                        skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, pDescriptorSets[i].handle, 0, DRAWSTATE_INVALID_SET, "DS",
-                                "Attempt to bind DS %#" PRIxLEAST64 " that doesn't exist!", pDescriptorSets[i].handle);
+                        skipCall |= log_msg(dev_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t) pDescriptorSets[i], 0, DRAWSTATE_INVALID_SET, "DS",
+                                "Attempt to bind DS %#" PRIxLEAST64 " that doesn't exist!", (uint64_t) pDescriptorSets[i]);
                     }
                 }
                 updateCBTracking(pCB);
@@ -2997,7 +2993,7 @@
 
     // Validate that attachment is in reference list of active subpass
     if (pCB->activeRenderPass) {
-        const VkRenderPassCreateInfo *pRPCI = dev_data->renderPassMap[pCB->activeRenderPass.handle];
+        const VkRenderPassCreateInfo *pRPCI = dev_data->renderPassMap[pCB->activeRenderPass];
         const VkSubpassDescription   *pSD   = &pRPCI->pSubpasses[pCB->activeSubpass];
 
         for (uint32_t attachment_idx = 0; attachment_idx < attachmentCount; attachment_idx++) {
@@ -3268,7 +3264,7 @@
             localFBCI->pAttachments = new VkImageView[localFBCI->attachmentCount];
             memcpy((void*)localFBCI->pAttachments, pCreateInfo->pAttachments, localFBCI->attachmentCount*sizeof(VkImageView));
         }
-        dev_data->frameBufferMap[pFramebuffer->handle] = localFBCI;
+        dev_data->frameBufferMap[*pFramebuffer] = localFBCI;
     }
     return result;
 }
@@ -3475,7 +3471,7 @@
             localRPCI->pDependencies = new VkSubpassDependency[localRPCI->dependencyCount];
             memcpy((void*)localRPCI->pDependencies, pCreateInfo->pDependencies, localRPCI->dependencyCount*sizeof(VkSubpassDependency));
         }
-        dev_data->renderPassMap[pRenderPass->handle] = localRPCI;
+        dev_data->renderPassMap[*pRenderPass] = localRPCI;
     }
     return result;
 }
diff --git a/layers/image.cpp b/layers/image.cpp
index 26f58fd..b741a4c 100644
--- a/layers/image.cpp
+++ b/layers/image.cpp
@@ -51,7 +51,7 @@
     debug_report_data *report_data;
     std::vector<VkDbgMsgCallback> logging_callback;
     VkPhysicalDevice physicalDevice;
-    unordered_map<uint64_t, IMAGE_STATE> imageMap;
+    unordered_map<VkImage, IMAGE_STATE> imageMap;
 
     layer_data() :
         report_data(nullptr),
@@ -295,7 +295,7 @@
     VkResult result = get_dispatch_table(image_device_table_map, device)->CreateImage(device, pCreateInfo, pImage);
 
     if(result == VK_SUCCESS) {
-        device_data->imageMap[pImage->handle] = IMAGE_STATE(pCreateInfo);
+        device_data->imageMap[*pImage] = IMAGE_STATE(pCreateInfo);
     }
     return result;
 }
@@ -303,7 +303,7 @@
 VK_LAYER_EXPORT void VKAPI vkDestroyImage(VkDevice device, VkImage image)
 {
     layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
-    device_data->imageMap.erase(image.handle);
+    device_data->imageMap.erase(image);
     get_dispatch_table(image_device_table_map, device)->DestroyImage(device, image);
 }
 
@@ -388,18 +388,18 @@
 {
     VkBool32 skipCall = VK_FALSE;
     layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
-    auto imageEntry = device_data->imageMap.find(pCreateInfo->image.handle);
+    auto imageEntry = device_data->imageMap.find(pCreateInfo->image);
     if (imageEntry != device_data->imageMap.end()) {
         if (pCreateInfo->subresourceRange.baseMipLevel >= imageEntry->second.mipLevels) {
             std::stringstream ss;
             ss << "vkCreateImageView called with baseMipLevel " << pCreateInfo->subresourceRange.baseMipLevel
-               << " for image " << pCreateInfo->image.handle << " that only has " << imageEntry->second.mipLevels << " mip levels.";
+               << " for image " << pCreateInfo->image << " that only has " << imageEntry->second.mipLevels << " mip levels.";
             skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType)0, 0, 0, IMAGE_VIEW_CREATE_ERROR, "IMAGE", ss.str().c_str());
         }
         if (pCreateInfo->subresourceRange.baseArrayLayer >= imageEntry->second.arraySize) {
             std::stringstream ss;
             ss << "vkCreateImageView called with baseArrayLayer " << pCreateInfo->subresourceRange.baseArrayLayer << " for image "
-               << pCreateInfo->image.handle << " that only has " << imageEntry->second.arraySize << " mip levels.";
+               << pCreateInfo->image << " that only has " << imageEntry->second.arraySize << " mip levels.";
             skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType)0, 0, 0, IMAGE_VIEW_CREATE_ERROR, "IMAGE", ss.str().c_str());
         }
         if (!pCreateInfo->subresourceRange.numLevels) {
@@ -423,20 +423,20 @@
                 std::stringstream ss;
                 ss << "vkCreateImageView: Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set";
                 skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE,
-                                   (uint64_t)pCreateInfo->image.handle, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
+                                   (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
             }
             if ((aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) != aspectMask) {
                 std::stringstream ss;
                 ss << "vkCreateImageView: Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set";
                 skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE,
-                                   (uint64_t)pCreateInfo->image.handle, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
+                                   (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
             }
             if (VK_FALSE == vk_format_is_color(ivciFormat)) {
                 std::stringstream ss;
                 ss << "vkCreateImageView: The image view's format can differ from the parent image's format, but both must be "
                    << "color formats.  ImageFormat is " << string_VkFormat(imageFormat) << " ImageViewFormat is " << string_VkFormat(ivciFormat);
                 skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE,
-                                   (uint64_t)pCreateInfo->image.handle, 0, IMAGE_INVALID_FORMAT, "IMAGE", ss.str().c_str());
+                                   (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_FORMAT, "IMAGE", ss.str().c_str());
             }
             // TODO:  Uncompressed formats are compatible if they occupy they same number of bits per pixel.
             //        Compressed formats are compatible if the only difference between them is the numerical type of
@@ -447,39 +447,39 @@
                 std::stringstream ss;
                 ss << "vkCreateImageView: Combination depth/stencil image formats must have both VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set";
                 skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE,
-                                   (uint64_t)pCreateInfo->image.handle, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
+                                   (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
             }
             if ((aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != aspectMask) {
                 std::stringstream ss;
                 ss << "vkCreateImageView: Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set";
                 skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE,
-                                   (uint64_t)pCreateInfo->image.handle, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
+                                   (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
             }
         } else  if (vk_format_is_depth_only(imageFormat)) {
             if ((aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) {
                 std::stringstream ss;
                 ss << "vkCreateImageView: Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set";
                 skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE,
-                                   (uint64_t)pCreateInfo->image.handle, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
+                                   (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
             }
             if ((aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != aspectMask) {
                 std::stringstream ss;
                 ss << "vkCreateImageView: Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set";
                 skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE,
-                                   (uint64_t)pCreateInfo->image.handle, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
+                                   (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
             }
         } else  if (vk_format_is_stencil_only(imageFormat)) {
             if ((aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT) {
                 std::stringstream ss;
                 ss << "vkCreateImageView: Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set";
                 skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE,
-                                   (uint64_t)pCreateInfo->image.handle, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
+                                   (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
             }
             if ((aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != aspectMask) {
                 std::stringstream ss;
                 ss << "vkCreateImageView: Stencil-only image formats can have only the VK_IMAGE_ASPECT_STENCIL_BIT set";
                 skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE,
-                                   (uint64_t)pCreateInfo->image.handle, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
+                                   (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
             }
         }
     }
@@ -557,8 +557,8 @@
 {
     VkBool32 skipCall = VK_FALSE;
     layer_data *device_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map);
-    auto srcImageEntry = device_data->imageMap.find(srcImage.handle);
-    auto destImageEntry = device_data->imageMap.find(destImage.handle);
+    auto srcImageEntry = device_data->imageMap.find(srcImage);
+    auto destImageEntry = device_data->imageMap.find(destImage);
 
     // For each region, src and dst number of layers should not be zero
     // For each region, src and dst number of layers must match
@@ -758,8 +758,8 @@
     VkBool32    skipCall    = VK_FALSE;
     layer_data *device_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map);
 
-    auto srcImageEntry  = device_data->imageMap.find(srcImage.handle);
-    auto destImageEntry = device_data->imageMap.find(destImage.handle);
+    auto srcImageEntry  = device_data->imageMap.find(srcImage);
+    auto destImageEntry = device_data->imageMap.find(destImage);
 
     if ((srcImageEntry  != device_data->imageMap.end()) &&
         (destImageEntry != device_data->imageMap.end())) {
@@ -877,8 +877,8 @@
 {
     VkBool32 skipCall = VK_FALSE;
     layer_data *device_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map);
-    auto srcImageEntry = device_data->imageMap.find(srcImage.handle);
-    auto destImageEntry = device_data->imageMap.find(destImage.handle);
+    auto srcImageEntry = device_data->imageMap.find(srcImage);
+    auto destImageEntry = device_data->imageMap.find(destImage);
 
     // For each region, the number of layers in the image subresource should not be zero
     // For each region, src and dest image aspect must be color only
@@ -945,7 +945,7 @@
     layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
     VkFormat    format;
 
-    auto imageEntry = device_data->imageMap.find(image.handle);
+    auto imageEntry = device_data->imageMap.find(image);
 
     // Validate that image aspects match formats
     if (imageEntry != device_data->imageMap.end()) {
@@ -955,7 +955,7 @@
                 std::stringstream ss;
                 ss << "vkGetImageSubresourceLayout: For color formats, the aspect field of VkImageSubresource must be VK_IMAGE_ASPECT_COLOR.";
                 skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE,
-                                   (uint64_t)image.handle, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
+                                   (uint64_t)image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
             }
         } else if (vk_format_is_depth_or_stencil(format)) {
             if ((pSubresource->aspect != VK_IMAGE_ASPECT_DEPTH_BIT) &&
@@ -963,7 +963,7 @@
                 std::stringstream ss;
                 ss << "vkGetImageSubresourceLayout: For depth/stencil formats, the aspect selects either the depth or stencil image aspect.";
                 skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE,
-                                   (uint64_t)image.handle, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
+                                   (uint64_t)image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", ss.str().c_str());
             }
         }
     }
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index ffadf24..bd4cb96 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -46,7 +46,7 @@
 
 // WSI Image Objects bypass usual Image Object creation methods.  A special Memory
 // Object value will be used to identify them internally.
-static const VkDeviceMemory MEMTRACKER_SWAP_CHAIN_IMAGE_KEY = static_cast<VkDeviceMemory>(-1);
+static const VkDeviceMemory MEMTRACKER_SWAP_CHAIN_IMAGE_KEY = (VkDeviceMemory)(-1);
 
 struct layer_data {
     debug_report_data *report_data;
@@ -74,11 +74,11 @@
 
 // Maps for tracking key structs related to MemTracker state
 unordered_map<VkCmdBuffer,    MT_CB_INFO>           cbMap;
-unordered_map<uint64_t,       MT_MEM_OBJ_INFO>      memObjMap;
-unordered_map<uint64_t,       MT_FENCE_INFO>        fenceMap;    // Map fence to fence info
+unordered_map<VkDeviceMemory, MT_MEM_OBJ_INFO>      memObjMap;
+unordered_map<VkFence,        MT_FENCE_INFO>        fenceMap;    // Map fence to fence info
 unordered_map<VkQueue,        MT_QUEUE_INFO>        queueMap;
-unordered_map<uint64_t,       MT_SWAP_CHAIN_INFO*>  swapchainMap;
-unordered_map<uint64_t,       MtSemaphoreState>     semaphoreMap;
+unordered_map<VkSwapchainKHR, MT_SWAP_CHAIN_INFO*>  swapchainMap;
+unordered_map<VkSemaphore,    MtSemaphoreState>     semaphoreMap;
 
 // Images and Buffers are 2 objects that can have memory bound to them so they get special treatment
 unordered_map<uint64_t, MT_OBJ_BINDING_INFO> imageMap;
@@ -153,7 +153,7 @@
 {
     MT_SWAP_CHAIN_INFO* pInfo = new MT_SWAP_CHAIN_INFO;
     memcpy(&pInfo->createInfo, pCI, sizeof(VkSwapchainCreateInfoKHR));
-    swapchainMap[swapchain.handle] = pInfo;
+    swapchainMap[swapchain] = pInfo;
 }
 
 // Add new CBInfo for this cb to map container
@@ -240,14 +240,14 @@
     *fenceId = g_currentFenceId++;
 
     // If no fence, create an internal fence to track the submissions
-    if (fence.handle != 0) {
-        fenceMap[fence.handle].fenceId = *fenceId;
-        fenceMap[fence.handle].queue   = queue;
+    if (fence != VK_NULL_HANDLE) {
+        fenceMap[fence].fenceId = *fenceId;
+        fenceMap[fence].queue   = queue;
         // Validate that fence is in UNSIGNALED state
-        VkFenceCreateInfo* pFenceCI = &(fenceMap[fence.handle].createInfo);
+        VkFenceCreateInfo* pFenceCI = &(fenceMap[fence].createInfo);
         if (pFenceCI->flags & VK_FENCE_CREATE_SIGNALED_BIT) {
-            skipCall = log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_FENCE, fence.handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
-                           "Fence %#" PRIxLEAST64 " submitted in SIGNALED state.  Fences must be reset before being submitted", fence.handle);
+            skipCall = log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_FENCE, (uint64_t) fence, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
+                           "Fence %#" PRIxLEAST64 " submitted in SIGNALED state.  Fences must be reset before being submitted", (uint64_t) fence);
         }
     } else {
         // TODO : Do we need to create an internal fence here for tracking purposes?
@@ -261,14 +261,14 @@
 static void delete_fence_info(
     VkFence fence)
 {
-    fenceMap.erase(fence.handle);
+    fenceMap.erase(fence);
 }
 
 // Record information when a fence is known to be signalled
 static void update_fence_tracking(
     VkFence fence)
 {
-    auto fence_item = fenceMap.find(fence.handle);
+    auto fence_item = fenceMap.find(fence);
     if (fence_item != fenceMap.end()) {
         MT_FENCE_INFO *pCurFenceInfo = &(*fence_item).second;
         VkQueue queue = pCurFenceInfo->queue;
@@ -282,7 +282,7 @@
     }
 
     // Update fence state in fenceCreateInfo structure
-    auto pFCI = &(fenceMap[fence.handle].createInfo);
+    auto pFCI = &(fenceMap[fence].createInfo);
     pFCI->flags = static_cast<VkFenceCreateFlags>(pFCI->flags | VK_FENCE_CREATE_SIGNALED_BIT);
 }
 
@@ -337,10 +337,10 @@
                                            char const* func_name, char const* usage_string)
 {
     VkBool32 skipCall = VK_FALSE;
-    MT_OBJ_BINDING_INFO* pBindInfo = get_object_binding_info(image.handle, VK_OBJECT_TYPE_IMAGE);
+    MT_OBJ_BINDING_INFO* pBindInfo = get_object_binding_info((uint64_t) image, VK_OBJECT_TYPE_IMAGE);
     if (pBindInfo) {
         skipCall = validate_usage_flags(disp_obj, pBindInfo->create_info.image.usage, desired, strict,
-                                      image.handle, VK_OBJECT_TYPE_IMAGE, "image", func_name, usage_string);
+                                      (uint64_t) image, VK_OBJECT_TYPE_IMAGE, "image", func_name, usage_string);
     }
     return skipCall;
 }
@@ -352,10 +352,10 @@
                                             char const* func_name, char const* usage_string)
 {
     VkBool32 skipCall = VK_FALSE;
-    MT_OBJ_BINDING_INFO* pBindInfo = get_object_binding_info(buffer.handle, VK_OBJECT_TYPE_BUFFER);
+    MT_OBJ_BINDING_INFO* pBindInfo = get_object_binding_info((uint64_t) buffer, VK_OBJECT_TYPE_BUFFER);
     if (pBindInfo) {
         skipCall = validate_usage_flags(disp_obj, pBindInfo->create_info.buffer.usage, desired, strict,
-                                      buffer.handle, VK_OBJECT_TYPE_BUFFER, "buffer", func_name, usage_string);
+                                      (uint64_t) buffer, VK_OBJECT_TYPE_BUFFER, "buffer", func_name, usage_string);
     }
     return skipCall;
 }
@@ -363,9 +363,9 @@
 // Return ptr to info in map container containing mem, or NULL if not found
 //  Calls to this function should be wrapped in mutex
 static MT_MEM_OBJ_INFO* get_mem_obj_info(
-    const uint64_t device_mem_handle)
+    VkDeviceMemory mem)
 {
-    auto item = memObjMap.find(device_mem_handle);
+    auto item = memObjMap.find(mem);
     if (item != memObjMap.end()) {
         return &(*item).second;
     } else {
@@ -380,12 +380,12 @@
 {
     assert(object != NULL);
 
-    memcpy(&memObjMap[mem.handle].allocInfo, pAllocInfo, sizeof(VkMemoryAllocInfo));
+    memcpy(&memObjMap[mem].allocInfo, pAllocInfo, sizeof(VkMemoryAllocInfo));
     // TODO:  Update for real hardware, actually process allocation info structures
-    memObjMap[mem.handle].allocInfo.pNext = NULL;
-    memObjMap[mem.handle].object = object;
-    memObjMap[mem.handle].refCount = 0;
-    memObjMap[mem.handle].mem = mem;
+    memObjMap[mem].allocInfo.pNext = NULL;
+    memObjMap[mem].object = object;
+    memObjMap[mem].refCount = 0;
+    memObjMap[mem].mem = mem;
 }
 
 // Find CB Info and add mem reference to list container
@@ -401,11 +401,11 @@
     if (mem != MEMTRACKER_SWAP_CHAIN_IMAGE_KEY) {
 
         // First update CB binding in MemObj mini CB list
-        MT_MEM_OBJ_INFO* pMemInfo = get_mem_obj_info(mem.handle);
+        MT_MEM_OBJ_INFO* pMemInfo = get_mem_obj_info(mem);
         if (!pMemInfo) {
             skipCall = log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
                            "In %s, trying to bind mem obj %#" PRIxLEAST64 " to CB %p but no info for that mem obj.\n    "
-                           "Was it correctly allocated? Did it already get freed?", apiName, mem.handle, cb);
+                           "Was it correctly allocated? Did it already get freed?", apiName, (uint64_t) mem, cb);
         } else {
             // Search for cmd buffer object in memory object's binding list
             VkBool32 found  = VK_FALSE;
@@ -427,7 +427,7 @@
             // TODO: keep track of all destroyed CBs so we know if this is a stale or simply invalid object
             if (!pCBInfo) {
                 skipCall = log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
-                               "Trying to bind mem obj %#" PRIxLEAST64 " to CB %p but no info for that CB. Was CB incorrectly destroyed?", mem.handle, cb);
+                               "Trying to bind mem obj %#" PRIxLEAST64 " to CB %p but no info for that CB. Was CB incorrectly destroyed?", (uint64_t) mem, cb);
             } else {
                 // Search for memory object in cmd buffer's reference list
                 VkBool32 found  = VK_FALSE;
@@ -462,7 +462,7 @@
         if (pCBInfo->pMemObjList.size() > 0) {
             list<VkDeviceMemory> mem_obj_list = pCBInfo->pMemObjList;
             for (list<VkDeviceMemory>::iterator it=mem_obj_list.begin(); it!=mem_obj_list.end(); ++it) {
-                MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info((*it).handle);
+                MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(*it);
                 pInfo->pCmdBufferBindings.remove(cb);
                 pInfo->refCount--;
             }
@@ -493,16 +493,16 @@
     size_t objRefCount    = pMemObjInfo->pObjBindings.size();
 
     if ((pMemObjInfo->pCmdBufferBindings.size() + pMemObjInfo->pObjBindings.size()) != 0) {
-        skipCall = log_msg(mdd(pMemObjInfo->object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, pMemObjInfo->mem.handle, 0, MEMTRACK_FREED_MEM_REF, "MEM",
+        skipCall = log_msg(mdd(pMemObjInfo->object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t) pMemObjInfo->mem, 0, MEMTRACK_FREED_MEM_REF, "MEM",
                        "Attempting to free memory object %#" PRIxLEAST64 " which still contains %lu references",
-                       pMemObjInfo->mem.handle, (cmdBufRefCount + objRefCount));
+                       (uint64_t) pMemObjInfo->mem, (cmdBufRefCount + objRefCount));
     }
 
     if (cmdBufRefCount > 0 && pMemObjInfo->pCmdBufferBindings.size() > 0) {
         for (list<VkCmdBuffer>::const_iterator it = pMemObjInfo->pCmdBufferBindings.begin(); it != pMemObjInfo->pCmdBufferBindings.end(); ++it) {
             // TODO : cmdBuffer should be source Obj here
             log_msg(mdd(pMemObjInfo->object), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)(*it), 0, MEMTRACK_FREED_MEM_REF, "MEM",
-                    "Command Buffer %p still has a reference to mem obj %#" PRIxLEAST64, (*it), pMemObjInfo->mem.handle);
+                    "Command Buffer %p still has a reference to mem obj %#" PRIxLEAST64, (*it), (uint64_t) pMemObjInfo->mem);
         }
         // Clear the list of hanging references
         pMemObjInfo->pCmdBufferBindings.clear();
@@ -511,7 +511,7 @@
     if (objRefCount > 0 && pMemObjInfo->pObjBindings.size() > 0) {
         for (auto it = pMemObjInfo->pObjBindings.begin(); it != pMemObjInfo->pObjBindings.end(); ++it) {
             log_msg(mdd(pMemObjInfo->object), VK_DBG_REPORT_INFO_BIT, it->type, it->handle, 0, MEMTRACK_FREED_MEM_REF, "MEM",
-                    "VK Object %#" PRIxLEAST64 " still has a reference to mem obj %#" PRIxLEAST64, it->handle, pMemObjInfo->mem.handle);
+                    "VK Object %#" PRIxLEAST64 " still has a reference to mem obj %#" PRIxLEAST64, it->handle, (uint64_t) pMemObjInfo->mem);
         }
         // Clear the list of hanging references
         pMemObjInfo->pObjBindings.clear();
@@ -521,15 +521,15 @@
 
 static VkBool32 deleteMemObjInfo(
     void* object,
-    const uint64_t device_mem_handle)
+    VkDeviceMemory mem)
 {
     VkBool32 skipCall = VK_FALSE;
-    auto item = memObjMap.find(device_mem_handle);
+    auto item = memObjMap.find(mem);
     if (item != memObjMap.end()) {
         memObjMap.erase(item);
     } else {
-        skipCall = log_msg(mdd(object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, device_mem_handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
-                       "Request to delete memory object %#" PRIxLEAST64 " not present in memory Object Map", device_mem_handle);
+        skipCall = log_msg(mdd(object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t) mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
+                       "Request to delete memory object %#" PRIxLEAST64 " not present in memory Object Map", (uint64_t) mem);
     }
     return skipCall;
 }
@@ -552,7 +552,7 @@
         if (pCBInfo->fenceId > pQueueInfo->lastRetiredId) {
             log_msg(mdd(cb), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cb, 0,
                 MEMTRACK_NONE, "MEM", "fence %#" PRIxLEAST64 " for CB %p has not been checked for completion",
-                pCBInfo->lastSubmittedFence.handle, cb);
+                (uint64_t) pCBInfo->lastSubmittedFence, cb);
             *complete = VK_FALSE;
         }
     }
@@ -566,16 +566,16 @@
 {
     VkBool32 skipCall = VK_FALSE;
     // Parse global list to find info w/ mem
-    MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(mem.handle);
+    MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(mem);
     if (!pInfo) {
-        skipCall = log_msg(mdd(object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
+        skipCall = log_msg(mdd(object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t) mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
                        "Couldn't find mem info object for %#" PRIxLEAST64 "\n    Was %#" PRIxLEAST64 " never allocated or previously freed?",
-                       mem.handle, mem.handle);
+                       (uint64_t) mem, (uint64_t) mem);
     } else {
         if (pInfo->allocInfo.allocationSize == 0 && !internal) {
-            skipCall = log_msg(mdd(pInfo->object), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
+            skipCall = log_msg(mdd(pInfo->object), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t) mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
                             "Attempting to free memory associated with a Persistent Image, %#" PRIxLEAST64 ", "
-                            "this should not be explicitly freed\n", mem.handle);
+                            "this should not be explicitly freed\n", (uint64_t) mem);
         } else {
             // Clear any CB bindings for completed CBs
             //   TODO : Is there a better place to do this?
@@ -601,7 +601,7 @@
                 skipCall |= reportMemReferencesAndCleanUp(pInfo);
             }
             // Delete mem obj info
-            skipCall |= deleteMemObjInfo(object, mem.handle);
+            skipCall |= deleteMemObjInfo(object, mem);
         }
     }
     return skipCall;
@@ -635,7 +635,7 @@
     VkBool32 skipCall = VK_FALSE;
     MT_OBJ_BINDING_INFO* pObjBindInfo = get_object_binding_info(handle, type);
     if (pObjBindInfo) {
-        MT_MEM_OBJ_INFO* pMemObjInfo = get_mem_obj_info(pObjBindInfo->mem.handle);
+        MT_MEM_OBJ_INFO* pMemObjInfo = get_mem_obj_info(pObjBindInfo->mem);
         if (!pMemObjInfo) {
             skipCall = log_msg(mdd(dispObj), VK_DBG_REPORT_WARN_BIT, type, handle, 0, MEMTRACK_MEM_OBJ_CLEAR_EMPTY_BINDINGS, "MEM",
                            "Attempting to clear mem binding on %s obj %#" PRIxLEAST64 " but it has no binding.",
@@ -649,7 +649,7 @@
                     pMemObjInfo->refCount--;
                     pMemObjInfo->pObjBindings.erase(it);
                     // TODO : Make sure this is a reasonable way to reset mem binding
-                    pObjBindInfo->mem.handle = 0;
+                    pObjBindInfo->mem = VK_NULL_HANDLE;
                     clearSucceeded = VK_TRUE;
                     break;
                 }
@@ -657,7 +657,7 @@
             if (VK_FALSE == clearSucceeded ) {
                 skipCall |= log_msg(mdd(dispObj), VK_DBG_REPORT_ERROR_BIT, type, handle, 0, MEMTRACK_INVALID_OBJECT, "MEM",
                                 "While trying to clear mem binding for %s obj %#" PRIxLEAST64 ", unable to find that object referenced by mem obj %#" PRIxLEAST64,
-                                 object_type_to_string(type), handle, pMemObjInfo->mem.handle);
+                                 object_type_to_string(type), handle, (uint64_t) pMemObjInfo->mem);
             }
         }
     }
@@ -691,18 +691,18 @@
                             object_type_to_string(type), apiName, handle);
         } else {
             // non-null case so should have real mem obj
-            MT_MEM_OBJ_INFO* pMemInfo = get_mem_obj_info(mem.handle);
+            MT_MEM_OBJ_INFO* pMemInfo = get_mem_obj_info(mem);
             if (!pMemInfo) {
-                skipCall |= log_msg(mdd(dispatch_object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle,
+                skipCall |= log_msg(mdd(dispatch_object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t) mem,
                                 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", "In %s, while trying to bind mem for %s obj %#" PRIxLEAST64 ", couldn't find info for mem obj %#" PRIxLEAST64,
-                                object_type_to_string(type), apiName, handle, mem.handle);
+                                object_type_to_string(type), apiName, handle, (uint64_t) mem);
             } else {
                 // TODO : Need to track mem binding for obj and report conflict here
-                MT_MEM_OBJ_INFO* pPrevBinding = get_mem_obj_info(pObjBindInfo->mem.handle);
+                MT_MEM_OBJ_INFO* pPrevBinding = get_mem_obj_info(pObjBindInfo->mem);
                 if (pPrevBinding != NULL) {
-                    skipCall |= log_msg(mdd(dispatch_object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_REBIND_OBJECT, "MEM",
+                    skipCall |= log_msg(mdd(dispatch_object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t) mem, 0, MEMTRACK_REBIND_OBJECT, "MEM",
                             "In %s, attempting to bind memory (%#" PRIxLEAST64 ") to object (%#" PRIxLEAST64 ") which has already been bound to mem object %#" PRIxLEAST64,
-                            apiName, mem.handle, handle, pPrevBinding->mem.handle);
+                            apiName, (uint64_t) mem, handle, (uint64_t) pPrevBinding->mem);
                 }
                 else {
                     MT_OBJ_HANDLE_TYPE oht;
@@ -751,10 +751,10 @@
                             "In %s, attempting to update Binding of Obj(%#" PRIxLEAST64 ") that's not in global list()", apiName, handle);
         }
         // non-null case so should have real mem obj
-        MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(mem.handle);
+        MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(mem);
         if (!pInfo) {
-            skipCall |= log_msg(mdd(dispObject), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
-                            "In %s, While trying to bind mem for obj %#" PRIxLEAST64 ", couldn't find info for mem obj %#" PRIxLEAST64, apiName, handle, mem.handle);
+            skipCall |= log_msg(mdd(dispObject), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t) mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
+                            "In %s, While trying to bind mem for obj %#" PRIxLEAST64 ", couldn't find info for mem obj %#" PRIxLEAST64, apiName, handle, (uint64_t) mem);
         } else {
             // Search for object in memory object's binding list
             VkBool32 found  = VK_FALSE;
@@ -775,7 +775,7 @@
                 pInfo->refCount++;
             }
             // Need to set mem binding for this object
-            MT_MEM_OBJ_INFO* pPrevBinding = get_mem_obj_info(pObjBindInfo->mem.handle);
+            MT_MEM_OBJ_INFO* pPrevBinding = get_mem_obj_info(pObjBindInfo->mem);
             pObjBindInfo->mem = mem;
         }
     }
@@ -800,7 +800,7 @@
     void* dispObj, const uint64_t handle, const VkDbgObjectType type, VkDeviceMemory *mem)
 {
     VkBool32 skipCall = VK_FALSE;
-    mem->handle = 0;
+    *mem = VK_NULL_HANDLE;
     MT_OBJ_BINDING_INFO* pObjBindInfo = get_object_binding_info(handle, type);
     if (pObjBindInfo) {
         if (pObjBindInfo->mem) {
@@ -843,7 +843,7 @@
         log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
             "    ===MemObjInfo at %p===", (void*)pInfo);
         log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
-                "    Mem object: %#" PRIxLEAST64, (void*)pInfo->mem.handle);
+                "    Mem object: %#" PRIxLEAST64, (void*)pInfo->mem);
         log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
                 "    Ref Count: %u", pInfo->refCount);
         if (0 != pInfo->allocInfo.allocationSize) {
@@ -900,7 +900,7 @@
         log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
                 "    CB Info (%p) has CB %p, fenceId %" PRIx64", and fence %#" PRIxLEAST64,
                 (void*)pCBInfo, (void*)pCBInfo->cmdBuffer, pCBInfo->fenceId,
-                pCBInfo->lastSubmittedFence.handle);
+                (uint64_t) pCBInfo->lastSubmittedFence);
 
         if (pCBInfo->pMemObjList.size() <= 0)
             continue;
@@ -1048,7 +1048,7 @@
         for (auto ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
             pInfo = &(*ii).second;
             if (pInfo->allocInfo.allocationSize != 0) {
-                skipCall |= log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, pInfo->mem.handle, 0, MEMTRACK_MEMORY_LEAK, "MEM",
+                skipCall |= log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t) pInfo->mem, 0, MEMTRACK_MEMORY_LEAK, "MEM",
                                  "Mem Object %p has not been freed. You should clean up this memory by calling "
                                  "vkFreeMemory(%p) prior to vkDestroyDevice().", pInfo->mem, pInfo->mem);
             }
@@ -1167,25 +1167,25 @@
         for (uint32_t i = 0; i < submit->waitSemCount; i++) {
             VkSemaphore sem = submit->pWaitSemaphores[i];
 
-            if (semaphoreMap.find(sem.handle) != semaphoreMap.end()) {
-                if (semaphoreMap[sem.handle] != MEMTRACK_SEMAPHORE_STATE_SIGNALLED) {
-                    skipCall = log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SEMAPHORE, sem.handle,
+            if (semaphoreMap.find(sem) != semaphoreMap.end()) {
+                if (semaphoreMap[sem] != MEMTRACK_SEMAPHORE_STATE_SIGNALLED) {
+                    skipCall = log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SEMAPHORE, (uint64_t) sem,
                             0, MEMTRACK_NONE, "SEMAPHORE",
                             "vkQueueSubmit: Semaphore must be in signaled state before passing to pWaitSemaphores");
                 }
-                semaphoreMap[sem.handle] = MEMTRACK_SEMAPHORE_STATE_WAIT;
+                semaphoreMap[sem] = MEMTRACK_SEMAPHORE_STATE_WAIT;
             }
         }
         for (uint32_t i = 0; i < submit->signalSemCount; i++) {
             VkSemaphore sem = submit->pWaitSemaphores[i];
 
-            if (semaphoreMap.find(sem.handle) != semaphoreMap.end()) {
-                if (semaphoreMap[sem.handle] != MEMTRACK_SEMAPHORE_STATE_UNSET) {
-                    skipCall = log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SEMAPHORE, sem.handle,
+            if (semaphoreMap.find(sem) != semaphoreMap.end()) {
+                if (semaphoreMap[sem] != MEMTRACK_SEMAPHORE_STATE_UNSET) {
+                    skipCall = log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SEMAPHORE, (uint64_t) sem,
                             0, MEMTRACK_NONE, "SEMAPHORE",
                             "vkQueueSubmit: Semaphore must not be currently signaled or in a wait state");
                 }
-                semaphoreMap[sem.handle] = MEMTRACK_SEMAPHORE_STATE_SIGNALLED;
+                semaphoreMap[sem] = MEMTRACK_SEMAPHORE_STATE_SIGNALLED;
             }
         }
     }
@@ -1202,8 +1202,8 @@
         for (uint32_t i = 0; i < submit->waitSemCount; i++) {
             VkSemaphore sem = submit->pWaitSemaphores[i];
 
-            if (semaphoreMap.find(sem.handle) != semaphoreMap.end()) {
-                semaphoreMap[sem.handle] = MEMTRACK_SEMAPHORE_STATE_UNSET;
+            if (semaphoreMap.find(sem) != semaphoreMap.end()) {
+                semaphoreMap[sem] = MEMTRACK_SEMAPHORE_STATE_UNSET;
             }
         }
     }
@@ -1254,11 +1254,11 @@
     VkBool32 skipCall = VK_FALSE;
     VkResult result   = VK_ERROR_VALIDATION_FAILED;
     loader_platform_thread_lock_mutex(&globalLock);
-    MT_MEM_OBJ_INFO *pMemObj = get_mem_obj_info(mem.handle);
+    MT_MEM_OBJ_INFO *pMemObj = get_mem_obj_info(mem);
     if ((memProps.memoryTypes[pMemObj->allocInfo.memoryTypeIndex].propertyFlags &
          VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0) {
-        skipCall = log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_INVALID_STATE, "MEM",
-                       "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set: mem obj %#" PRIxLEAST64, mem.handle);
+        skipCall = log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t) mem, 0, MEMTRACK_INVALID_STATE, "MEM",
+                       "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set: mem obj %#" PRIxLEAST64, (uint64_t) mem);
     }
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -1280,7 +1280,7 @@
 {
     loader_platform_thread_lock_mutex(&globalLock);
     delete_fence_info(fence);
-    auto item = fenceMap.find(fence.handle);
+    auto item = fenceMap.find(fence);
     if (item != fenceMap.end()) {
         fenceMap.erase(item);
     }
@@ -1292,9 +1292,9 @@
 {
     VkBool32 skipCall = VK_FALSE;
     loader_platform_thread_lock_mutex(&globalLock);
-    auto item = bufferMap.find(buffer.handle);
+    auto item = bufferMap.find((uint64_t) buffer);
     if (item != bufferMap.end()) {
-        skipCall = clear_object_binding(device, buffer.handle, VK_OBJECT_TYPE_BUFFER);
+        skipCall = clear_object_binding(device, (uint64_t) buffer, VK_OBJECT_TYPE_BUFFER);
         bufferMap.erase(item);
     }
     loader_platform_thread_unlock_mutex(&globalLock);
@@ -1307,9 +1307,9 @@
 {
     VkBool32 skipCall = VK_FALSE;
     loader_platform_thread_lock_mutex(&globalLock);
-    auto item = imageMap.find(image.handle);
+    auto item = imageMap.find((uint64_t) image);
     if (item != imageMap.end()) {
-        skipCall = clear_object_binding(device, image.handle, VK_OBJECT_TYPE_IMAGE);
+        skipCall = clear_object_binding(device, (uint64_t) image, VK_OBJECT_TYPE_IMAGE);
         imageMap.erase(item);
     }
     loader_platform_thread_unlock_mutex(&globalLock);
@@ -1327,8 +1327,8 @@
     VkResult result = VK_ERROR_VALIDATION_FAILED;
     loader_platform_thread_lock_mutex(&globalLock);
     // Track objects tied to memory
-    VkBool32 skipCall = set_mem_binding(device, mem, buffer.handle, VK_OBJECT_TYPE_BUFFER, "vkBindBufferMemory");
-    add_object_binding_info(buffer.handle, VK_OBJECT_TYPE_BUFFER, mem);
+    VkBool32 skipCall = set_mem_binding(device, mem, (uint64_t) buffer, VK_OBJECT_TYPE_BUFFER, "vkBindBufferMemory");
+    add_object_binding_info((uint64_t) buffer, VK_OBJECT_TYPE_BUFFER, mem);
     print_mem_list(device);
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -1346,8 +1346,8 @@
     VkResult result = VK_ERROR_VALIDATION_FAILED;
     loader_platform_thread_lock_mutex(&globalLock);
     // Track objects tied to memory
-    VkBool32 skipCall = set_mem_binding(device, mem, image.handle, VK_OBJECT_TYPE_IMAGE, "vkBindImageMemory");
-    add_object_binding_info(image.handle, VK_OBJECT_TYPE_IMAGE, mem);
+    VkBool32 skipCall = set_mem_binding(device, mem, (uint64_t) image, VK_OBJECT_TYPE_IMAGE, "vkBindImageMemory");
+    add_object_binding_info((uint64_t) image, VK_OBJECT_TYPE_IMAGE, mem);
     print_mem_list(device);
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -1385,7 +1385,7 @@
     VkResult result = VK_ERROR_VALIDATION_FAILED;
     loader_platform_thread_lock_mutex(&globalLock);
     // Track objects tied to memory
-    VkBool32 skipCall = set_sparse_mem_binding(queue, pBindInfo->mem, image.handle, VK_OBJECT_TYPE_IMAGE, "vkQueueBindSparseImageOpaqeMemory");
+    VkBool32 skipCall = set_sparse_mem_binding(queue, pBindInfo->mem, (uint64_t) image, VK_OBJECT_TYPE_IMAGE, "vkQueueBindSparseImageOpaqeMemory");
     print_mem_list(queue);
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -1403,7 +1403,7 @@
     VkResult result = VK_ERROR_VALIDATION_FAILED;
     loader_platform_thread_lock_mutex(&globalLock);
     // Track objects tied to memory
-    VkBool32 skipCall = set_sparse_mem_binding(queue, pBindInfo->mem, image.handle, VK_OBJECT_TYPE_IMAGE, "vkQueueBindSparseImageMemory");
+    VkBool32 skipCall = set_sparse_mem_binding(queue, pBindInfo->mem, (uint64_t) image, VK_OBJECT_TYPE_IMAGE, "vkQueueBindSparseImageMemory");
     print_mem_list(queue);
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -1422,7 +1422,7 @@
     VkResult result = VK_ERROR_VALIDATION_FAILED;
     loader_platform_thread_lock_mutex(&globalLock);
     // Track objects tied to memory
-    VkBool32 skipCall = set_sparse_mem_binding(queue, pBindInfo->mem, buffer.handle, VK_OBJECT_TYPE_BUFFER, "VkQueueBindSparseBufferMemory");
+    VkBool32 skipCall = set_sparse_mem_binding(queue, pBindInfo->mem, (uint64_t) buffer, VK_OBJECT_TYPE_BUFFER, "VkQueueBindSparseBufferMemory");
     print_mem_list(queue);
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -1440,7 +1440,7 @@
     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateFence(device, pCreateInfo, pFence);
     if (VK_SUCCESS == result) {
         loader_platform_thread_lock_mutex(&globalLock);
-        MT_FENCE_INFO* pFI = &fenceMap[pFence->handle];
+        MT_FENCE_INFO* pFI = &fenceMap[*pFence];
         memset(pFI, 0, sizeof(MT_FENCE_INFO));
         memcpy(&(pFI->createInfo), pCreateInfo, sizeof(VkFenceCreateInfo));
         loader_platform_thread_unlock_mutex(&globalLock);
@@ -1459,12 +1459,12 @@
     loader_platform_thread_lock_mutex(&globalLock);
     // Reset fence state in fenceCreateInfo structure
     for (uint32_t i = 0; i < fenceCount; i++) {
-        auto fence_item = fenceMap.find(pFences[i].handle);
+        auto fence_item = fenceMap.find(pFences[i]);
         if (fence_item != fenceMap.end()) {
             // Validate fences in SIGNALED state
             if (!(fence_item->second.createInfo.flags & VK_FENCE_CREATE_SIGNALED_BIT)) {
-                skipCall = log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_FENCE, pFences[i].handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
-                        "Fence %#" PRIxLEAST64 " submitted to VkResetFences in UNSIGNALED STATE", pFences[i].handle);
+                skipCall = log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_FENCE, (uint64_t) pFences[i], 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
+                        "Fence %#" PRIxLEAST64 " submitted to VkResetFences in UNSIGNALED STATE", (uint64_t) pFences[i]);
             }
             else {
                 fence_item->second.createInfo.flags =
@@ -1482,15 +1482,15 @@
 static inline VkBool32 verifyFenceStatus(VkDevice device, VkFence fence, const char* apiCall)
 {
     VkBool32 skipCall = VK_FALSE;
-    auto pFenceInfo = fenceMap.find(fence.handle);
+    auto pFenceInfo = fenceMap.find(fence);
     if (pFenceInfo != fenceMap.end()) {
         if (pFenceInfo->second.createInfo.flags & VK_FENCE_CREATE_SIGNALED_BIT) {
-            skipCall |= log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_FENCE, fence.handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
-                "%s specified fence %#" PRIxLEAST64 " already in SIGNALED state.", apiCall, fence.handle);
+            skipCall |= log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_FENCE, (uint64_t) fence, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
+                "%s specified fence %#" PRIxLEAST64 " already in SIGNALED state.", apiCall, (uint64_t) fence);
         }
         if (!pFenceInfo->second.queue) { // Checking status of unsubmitted fence
-            skipCall |= log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_FENCE, fence.handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
-                "%s called for fence %#" PRIxLEAST64 " which has not been submitted on a Queue.", apiCall, fence.handle);
+            skipCall |= log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_FENCE, (uint64_t) fence, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
+                "%s called for fence %#" PRIxLEAST64 " which has not been submitted on a Queue.", apiCall, (uint64_t) fence);
         }
     }
     return skipCall;
@@ -1572,7 +1572,7 @@
     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateBuffer(device, pCreateInfo, pBuffer);
     if (VK_SUCCESS == result) {
         loader_platform_thread_lock_mutex(&globalLock);
-        add_object_create_info(pBuffer->handle, VK_OBJECT_TYPE_BUFFER, pCreateInfo);
+        add_object_create_info((uint64_t) *pBuffer, VK_OBJECT_TYPE_BUFFER, pCreateInfo);
         loader_platform_thread_unlock_mutex(&globalLock);
     }
     return result;
@@ -1586,7 +1586,7 @@
     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateImage(device, pCreateInfo, pImage);
     if (VK_SUCCESS == result) {
         loader_platform_thread_lock_mutex(&globalLock);
-        add_object_create_info(pImage->handle, VK_OBJECT_TYPE_IMAGE, pCreateInfo);
+        add_object_create_info((uint64_t) *pImage, VK_OBJECT_TYPE_IMAGE, pCreateInfo);
         loader_platform_thread_unlock_mutex(&globalLock);
     }
     return result;
@@ -1931,7 +1931,7 @@
 {
     VkDeviceMemory mem;
     loader_platform_thread_lock_mutex(&globalLock);
-    VkBool32 skipCall  = get_mem_binding_from_object(cmdBuffer, buffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
+    VkBool32 skipCall  = get_mem_binding_from_object(cmdBuffer, (uint64_t) buffer, VK_OBJECT_TYPE_BUFFER, &mem);
     skipCall          |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdDrawIndirect");
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -1948,7 +1948,7 @@
 {
     VkDeviceMemory mem;
     loader_platform_thread_lock_mutex(&globalLock);
-    VkBool32 skipCall = get_mem_binding_from_object(cmdBuffer, buffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
+    VkBool32 skipCall = get_mem_binding_from_object(cmdBuffer, (uint64_t) buffer, VK_OBJECT_TYPE_BUFFER, &mem);
     skipCall         |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdDrawIndexedIndirect");
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -1963,7 +1963,7 @@
 {
     VkDeviceMemory mem;
     loader_platform_thread_lock_mutex(&globalLock);
-    VkBool32 skipCall = get_mem_binding_from_object(cmdBuffer, buffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
+    VkBool32 skipCall = get_mem_binding_from_object(cmdBuffer, (uint64_t) buffer, VK_OBJECT_TYPE_BUFFER, &mem);
     skipCall         |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdDispatchIndirect");
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -1981,9 +1981,9 @@
     VkDeviceMemory mem;
     VkBool32       skipCall = VK_FALSE;
     loader_platform_thread_lock_mutex(&globalLock);
-    skipCall  = get_mem_binding_from_object(cmdBuffer, srcBuffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
+    skipCall  = get_mem_binding_from_object(cmdBuffer, (uint64_t) srcBuffer, VK_OBJECT_TYPE_BUFFER, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyBuffer");
-    skipCall |= get_mem_binding_from_object(cmdBuffer, destBuffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
+    skipCall |= get_mem_binding_from_object(cmdBuffer, (uint64_t) destBuffer, VK_OBJECT_TYPE_BUFFER, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyBuffer");
     // Validate that SRC & DST buffers have correct usage flags set
     skipCall |= validate_buffer_usage_flags(cmdBuffer, srcBuffer, VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdCopyBuffer()", "VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT");
@@ -2007,7 +2007,7 @@
     VkDeviceMemory mem;
     VkBool32       skipCall = VK_FALSE;
     loader_platform_thread_lock_mutex(&globalLock);
-    skipCall |= get_mem_binding_from_object(cmdBuffer, destBuffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
+    skipCall |= get_mem_binding_from_object(cmdBuffer, (uint64_t) destBuffer, VK_OBJECT_TYPE_BUFFER, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyQueryPoolResults");
     // Validate that DST buffer has correct usage flags set
     skipCall |= validate_buffer_usage_flags(cmdBuffer, destBuffer, VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdCopyQueryPoolResults()", "VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT");
@@ -2030,9 +2030,9 @@
     VkBool32       skipCall = VK_FALSE;
     loader_platform_thread_lock_mutex(&globalLock);
     // Validate that src & dst images have correct usage flags set
-    skipCall  = get_mem_binding_from_object(cmdBuffer, srcImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
+    skipCall  = get_mem_binding_from_object(cmdBuffer, (uint64_t) srcImage, VK_OBJECT_TYPE_IMAGE, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyImage");
-    skipCall |= get_mem_binding_from_object(cmdBuffer, destImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
+    skipCall |= get_mem_binding_from_object(cmdBuffer, (uint64_t) destImage, VK_OBJECT_TYPE_IMAGE, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyImage");
     skipCall |= validate_image_usage_flags(cmdBuffer, srcImage, VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdCopyImage()", "VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT");
     skipCall |= validate_image_usage_flags(cmdBuffer, destImage, VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdCopyImage()", "VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT");
@@ -2057,9 +2057,9 @@
     VkBool32       skipCall = VK_FALSE;
     loader_platform_thread_lock_mutex(&globalLock);
     // Validate that src & dst images have correct usage flags set
-    skipCall  = get_mem_binding_from_object(cmdBuffer, srcImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
+    skipCall  = get_mem_binding_from_object(cmdBuffer, (uint64_t) srcImage, VK_OBJECT_TYPE_IMAGE, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdBlitImage");
-    skipCall |= get_mem_binding_from_object(cmdBuffer, destImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
+    skipCall |= get_mem_binding_from_object(cmdBuffer, (uint64_t) destImage, VK_OBJECT_TYPE_IMAGE, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdBlitImage");
     skipCall |= validate_image_usage_flags(cmdBuffer, srcImage, VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT");
     skipCall |= validate_image_usage_flags(cmdBuffer, destImage, VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT");
@@ -2081,9 +2081,9 @@
     VkDeviceMemory mem;
     VkBool32       skipCall = VK_FALSE;
     loader_platform_thread_lock_mutex(&globalLock);
-    skipCall  = get_mem_binding_from_object(cmdBuffer, destImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
+    skipCall  = get_mem_binding_from_object(cmdBuffer, (uint64_t) destImage, VK_OBJECT_TYPE_IMAGE, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyBufferToImage");
-    skipCall |= get_mem_binding_from_object(cmdBuffer, srcBuffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
+    skipCall |= get_mem_binding_from_object(cmdBuffer, (uint64_t) srcBuffer, VK_OBJECT_TYPE_BUFFER, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyBufferToImage");
     // Validate that src buff & dst image have correct usage flags set
     skipCall |= validate_buffer_usage_flags(cmdBuffer, srcBuffer, VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdCopyBufferToImage()", "VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT");
@@ -2106,9 +2106,9 @@
     VkDeviceMemory mem;
     VkBool32       skipCall = VK_FALSE;
     loader_platform_thread_lock_mutex(&globalLock);
-    skipCall  = get_mem_binding_from_object(cmdBuffer, srcImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
+    skipCall  = get_mem_binding_from_object(cmdBuffer, (uint64_t) srcImage, VK_OBJECT_TYPE_IMAGE, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyImageToBuffer");
-    skipCall |= get_mem_binding_from_object(cmdBuffer, destBuffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
+    skipCall |= get_mem_binding_from_object(cmdBuffer, (uint64_t) destBuffer, VK_OBJECT_TYPE_BUFFER, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyImageToBuffer");
     // Validate that dst buff & src image have correct usage flags set
     skipCall |= validate_image_usage_flags(cmdBuffer, srcImage, VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdCopyImageToBuffer()", "VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT");
@@ -2130,7 +2130,7 @@
     VkDeviceMemory mem;
     VkBool32       skipCall = VK_FALSE;
     loader_platform_thread_lock_mutex(&globalLock);
-    skipCall  = get_mem_binding_from_object(cmdBuffer, destBuffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
+    skipCall  = get_mem_binding_from_object(cmdBuffer, (uint64_t) destBuffer, VK_OBJECT_TYPE_BUFFER, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdUpdateBuffer");
     // Validate that dst buff has correct usage flags set
     skipCall |= validate_buffer_usage_flags(cmdBuffer, destBuffer, VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdUpdateBuffer()", "VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT");
@@ -2150,7 +2150,7 @@
     VkDeviceMemory mem;
     VkBool32       skipCall = VK_FALSE;
     loader_platform_thread_lock_mutex(&globalLock);
-    skipCall  = get_mem_binding_from_object(cmdBuffer, destBuffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
+    skipCall  = get_mem_binding_from_object(cmdBuffer, (uint64_t) destBuffer, VK_OBJECT_TYPE_BUFFER, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdFillBuffer");
     // Validate that dst buff has correct usage flags set
     skipCall |= validate_buffer_usage_flags(cmdBuffer, destBuffer, VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdFillBuffer()", "VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT");
@@ -2172,7 +2172,7 @@
     VkDeviceMemory mem;
     VkBool32       skipCall = VK_FALSE;
     loader_platform_thread_lock_mutex(&globalLock);
-    skipCall  = get_mem_binding_from_object(cmdBuffer, image.handle, VK_OBJECT_TYPE_IMAGE, &mem);
+    skipCall  = get_mem_binding_from_object(cmdBuffer, (uint64_t) image, VK_OBJECT_TYPE_IMAGE, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdClearColorImage");
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -2192,7 +2192,7 @@
     VkDeviceMemory mem;
     VkBool32       skipCall = VK_FALSE;
     loader_platform_thread_lock_mutex(&globalLock);
-    skipCall  = get_mem_binding_from_object(cmdBuffer, image.handle, VK_OBJECT_TYPE_IMAGE, &mem);
+    skipCall  = get_mem_binding_from_object(cmdBuffer, (uint64_t) image, VK_OBJECT_TYPE_IMAGE, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdClearDepthStencilImage");
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -2213,9 +2213,9 @@
     VkBool32 skipCall = VK_FALSE;
     loader_platform_thread_lock_mutex(&globalLock);
     VkDeviceMemory mem;
-    skipCall  = get_mem_binding_from_object(cmdBuffer, srcImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
+    skipCall  = get_mem_binding_from_object(cmdBuffer, (uint64_t) srcImage, VK_OBJECT_TYPE_IMAGE, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdResolveImage");
-    skipCall |= get_mem_binding_from_object(cmdBuffer, destImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
+    skipCall |= get_mem_binding_from_object(cmdBuffer, (uint64_t) destImage, VK_OBJECT_TYPE_IMAGE, &mem);
     skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdResolveImage");
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -2303,19 +2303,19 @@
     VkBool32 skipCall = VK_FALSE;
     VkResult result   = VK_ERROR_VALIDATION_FAILED;
     loader_platform_thread_lock_mutex(&globalLock);
-    if (swapchainMap.find(swapchain.handle) != swapchainMap.end()) {
-        MT_SWAP_CHAIN_INFO* pInfo = swapchainMap[swapchain.handle];
+    if (swapchainMap.find(swapchain) != swapchainMap.end()) {
+        MT_SWAP_CHAIN_INFO* pInfo = swapchainMap[swapchain];
 
         if (pInfo->images.size() > 0) {
             for (auto it = pInfo->images.begin(); it != pInfo->images.end(); it++) {
-                skipCall = clear_object_binding(device, it->handle, VK_OBJECT_TYPE_SWAPCHAIN_KHR);
-                auto image_item = imageMap.find(it->handle);
+                skipCall = clear_object_binding(device, (uint64_t) *it, VK_OBJECT_TYPE_SWAPCHAIN_KHR);
+                auto image_item = imageMap.find((uint64_t) *it);
                 if (image_item != imageMap.end())
                     imageMap.erase(image_item);
             }
         }
         delete pInfo;
-        swapchainMap.erase(swapchain.handle);
+        swapchainMap.erase(swapchain);
     }
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -2334,7 +2334,7 @@
 
     if (result == VK_SUCCESS && pSwapchainImages != NULL) {
         const size_t count = *pCount;
-        MT_SWAP_CHAIN_INFO *pInfo = swapchainMap[swapchain.handle];
+        MT_SWAP_CHAIN_INFO *pInfo = swapchainMap[swapchain];
 
         if (pInfo->images.empty()) {
             pInfo->images.resize(count);
@@ -2344,17 +2344,17 @@
                 for (std::vector<VkImage>::const_iterator it = pInfo->images.begin();
                      it != pInfo->images.end(); it++) {
                     // Add image object binding, then insert the new Mem Object and then bind it to created image
-                    add_object_create_info(it->handle, VK_OBJECT_TYPE_SWAPCHAIN_KHR, &pInfo->createInfo);
+                    add_object_create_info((uint64_t) *it, VK_OBJECT_TYPE_SWAPCHAIN_KHR, &pInfo->createInfo);
                 }
             }
         } else {
             const size_t count = *pCount;
-            MT_SWAP_CHAIN_INFO *pInfo = swapchainMap[swapchain.handle];
+            MT_SWAP_CHAIN_INFO *pInfo = swapchainMap[swapchain];
             const bool mismatch = (pInfo->images.size() != count ||
                     memcmp(&pInfo->images[0], pSwapchainImages, sizeof(pInfo->images[0]) * count));
 
             if (mismatch) {
-                log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_SWAPCHAIN_KHR, swapchain.handle, 0, MEMTRACK_NONE, "SWAP_CHAIN",
+                log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_SWAPCHAIN_KHR, (uint64_t) swapchain, 0, MEMTRACK_NONE, "SWAP_CHAIN",
                         "vkGetSwapchainInfoKHR(%p, VK_SWAP_CHAIN_INFO_TYPE_PERSISTENT_IMAGES_KHR) returned mismatching data", swapchain);
             }
         }
@@ -2373,13 +2373,13 @@
     VkBool32 skipCall = VK_FALSE;
 
     loader_platform_thread_lock_mutex(&globalLock);
-    if (semaphoreMap.find(semaphore.handle) != semaphoreMap.end()) {
-        if (semaphoreMap[semaphore.handle] != MEMTRACK_SEMAPHORE_STATE_UNSET) {
-            skipCall = log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SEMAPHORE, semaphore.handle,
+    if (semaphoreMap.find(semaphore) != semaphoreMap.end()) {
+        if (semaphoreMap[semaphore] != MEMTRACK_SEMAPHORE_STATE_UNSET) {
+            skipCall = log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SEMAPHORE, (uint64_t) semaphore,
                                0, MEMTRACK_NONE, "SEMAPHORE",
                                "vkAcquireNextImageKHR: Semaphore must not be currently signaled or in a wait state");
         }
-        semaphoreMap[semaphore.handle] = MEMTRACK_SEMAPHORE_STATE_SIGNALLED;
+        semaphoreMap[semaphore] = MEMTRACK_SEMAPHORE_STATE_SIGNALLED;
     }
     loader_platform_thread_unlock_mutex(&globalLock);
     if (VK_FALSE == skipCall) {
@@ -2396,8 +2396,8 @@
 {
     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pSemaphore);
     loader_platform_thread_lock_mutex(&globalLock);
-    if (pSemaphore->handle != 0) {
-        semaphoreMap[pSemaphore->handle] = MEMTRACK_SEMAPHORE_STATE_UNSET;
+    if (*pSemaphore != VK_NULL_HANDLE) {
+        semaphoreMap[*pSemaphore] = MEMTRACK_SEMAPHORE_STATE_UNSET;
     }
     loader_platform_thread_unlock_mutex(&globalLock);
     return result;
@@ -2408,7 +2408,7 @@
     VkSemaphore semaphore)
 {
     loader_platform_thread_lock_mutex(&globalLock);
-    auto item = semaphoreMap.find(semaphore.handle);
+    auto item = semaphoreMap.find(semaphore);
     if (item != semaphoreMap.end()) {
         semaphoreMap.erase(item);
     }
diff --git a/layers/object_track.h b/layers/object_track.h
index c2f0e67..ea75743 100644
--- a/layers/object_track.h
+++ b/layers/object_track.h
@@ -451,20 +451,20 @@
 
 static VkBool32 validate_object(VkQueue dispatchable_object, VkImage object)
 {
-    if ((VkImageMap.find((void*)object.handle)        == VkImageMap.end()) &&
-        (swapchainImageMap.find((void*)object.handle) == swapchainImageMap.end())) {
-        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
-            "Invalid VkImage Object %p", object.handle);
+    if ((VkImageMap.find((void*)object)        == VkImageMap.end()) &&
+        (swapchainImageMap.find((void*)object) == swapchainImageMap.end())) {
+        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, (uint64_t) object, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
+            "Invalid VkImage Object %p", object);
     }
     return VK_FALSE;
 }
 
 static VkBool32 validate_object(VkCmdBuffer dispatchable_object, VkImage object)
 {
-    if ((VkImageMap.find((void*)object.handle)        == VkImageMap.end()) &&
-        (swapchainImageMap.find((void*)object.handle) == swapchainImageMap.end())) {
-        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
-            "Invalid VkImage Object %p", object.handle);
+    if ((VkImageMap.find((void*)object)        == VkImageMap.end()) &&
+        (swapchainImageMap.find((void*)object) == swapchainImageMap.end())) {
+        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, (uint64_t) object, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
+            "Invalid VkImage Object %p", object);
     }
     return VK_FALSE;
 }
@@ -480,18 +480,18 @@
 
 static VkBool32 validate_object(VkCmdBuffer dispatchable_object, VkDescriptorSet object)
 {
-    if (VkDescriptorSetMap.find((void*)object.handle) == VkDescriptorSetMap.end()) {
-        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
-            "Invalid VkDescriptorSet Object %p", object.handle);
+    if (VkDescriptorSetMap.find((void*)object) == VkDescriptorSetMap.end()) {
+        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, (uint64_t) object, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
+            "Invalid VkDescriptorSet Object %p", object);
     }
     return VK_FALSE;
 }
 
 static VkBool32 validate_object(VkQueue dispatchable_object, VkBuffer object)
 {
-    if (VkBufferMap.find((void*)object.handle) != VkBufferMap.end()) {
-        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
-            "Invalid VkBuffer Object %p", object.handle);
+    if (VkBufferMap.find((void*)object) != VkBufferMap.end()) {
+        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, (uint64_t) object, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
+            "Invalid VkBuffer Object %p", object);
     }
     return VK_FALSE;
 }
@@ -500,15 +500,15 @@
 {
     VkBool32 skipCall = VK_FALSE;
     if (object != VK_NULL_HANDLE) {
-        if (VkFenceMap.find((void*)object.handle) != VkFenceMap.end()) {
-            OBJTRACK_NODE* pNode = VkFenceMap[(void*)object.handle];
+        if (VkFenceMap.find((void*)object) != VkFenceMap.end()) {
+            OBJTRACK_NODE* pNode = VkFenceMap[(void*)object];
             pNode->status |= status_flag;
         }
         else {
             // If we do not find it print an error
-            skipCall |= log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_NONE, "OBJTRACK",
+            skipCall |= log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, (uint64_t) object, 0, OBJTRACK_NONE, "OBJTRACK",
                 "Unable to set status for non-existent object 0x%" PRIxLEAST64 " of %s type",
-                object.handle, string_VkDbgObjectType(objType));
+                (uint64_t) object, string_VkDbgObjectType(objType));
         }
     }
     return skipCall;
@@ -516,9 +516,9 @@
 
 static VkBool32 validate_object(VkQueue dispatchable_object, VkSemaphore object)
 {
-    if (VkSemaphoreMap.find((void*)object.handle) == VkSemaphoreMap.end()) {
-        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
-            "Invalid VkSemaphore Object %p", object.handle);
+    if (VkSemaphoreMap.find((void*)object) == VkSemaphoreMap.end()) {
+        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, (uint64_t) object, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
+            "Invalid VkSemaphore Object %p", object);
     }
     return VK_FALSE;
 }
@@ -565,15 +565,15 @@
 }
 static void create_obj(VkDevice dispatchable_object, VkSwapchainKHR vkObj, VkDbgObjectType objType)
 {
-    log_msg(mdd(dispatchable_object), VK_DBG_REPORT_INFO_BIT, objType, vkObj.handle, 0, OBJTRACK_NONE, "OBJTRACK",
+    log_msg(mdd(dispatchable_object), VK_DBG_REPORT_INFO_BIT, objType, (uint64_t) vkObj, 0, OBJTRACK_NONE, "OBJTRACK",
         "OBJ[%llu] : CREATE %s object 0x%" PRIxLEAST64 , object_track_index++, string_VkDbgObjectType(objType),
-        vkObj.handle);
+        (uint64_t) vkObj);
 
     OBJTRACK_NODE* pNewObjNode = new OBJTRACK_NODE;
     pNewObjNode->objType = objType;
     pNewObjNode->status  = OBJSTATUS_NONE;
-    pNewObjNode->vkObj  = vkObj.handle;
-    VkSwapchainKHRMap[(void*) vkObj.handle] = pNewObjNode;
+    pNewObjNode->vkObj  = (uint64_t) vkObj;
+    VkSwapchainKHRMap[(void*) vkObj] = pNewObjNode;
     uint32_t objIndex = objTypeToIndex(objType);
     numObjs[objIndex]++;
     numTotalObjs++;
@@ -595,37 +595,37 @@
 }
 static void create_swapchain_image_obj(VkDevice dispatchable_object, VkImage vkObj, VkSwapchainKHR swapchain)
 {
-    log_msg(mdd(dispatchable_object), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_IMAGE, vkObj.handle, 0, OBJTRACK_NONE, "OBJTRACK",
+    log_msg(mdd(dispatchable_object), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_IMAGE, (uint64_t) vkObj, 0, OBJTRACK_NONE, "OBJTRACK",
         "OBJ[%llu] : CREATE %s object 0x%" PRIxLEAST64 , object_track_index++, "SwapchainImage",
-        vkObj.handle);
+        (uint64_t) vkObj);
 
     OBJTRACK_NODE* pNewObjNode             = new OBJTRACK_NODE;
     pNewObjNode->objType                   = VK_OBJECT_TYPE_IMAGE;
     pNewObjNode->status                    = OBJSTATUS_NONE;
-    pNewObjNode->vkObj                     = vkObj.handle;
-    pNewObjNode->parentObj                 = swapchain.handle;
-    swapchainImageMap[(void*)vkObj.handle] = pNewObjNode;
+    pNewObjNode->vkObj                     = (uint64_t) vkObj;
+    pNewObjNode->parentObj                 = (uint64_t) swapchain;
+    swapchainImageMap[(void*)vkObj] = pNewObjNode;
 }
 
 static void destroy_obj(VkDevice dispatchable_object, VkSwapchainKHR object)
 {
-    if (VkSwapchainKHRMap.find((void*) object.handle) != VkSwapchainKHRMap.end()) {
-        OBJTRACK_NODE* pNode = VkSwapchainKHRMap[(void*) object.handle];
+    if (VkSwapchainKHRMap.find((void*) object) != VkSwapchainKHRMap.end()) {
+        OBJTRACK_NODE* pNode = VkSwapchainKHRMap[(void*) object];
         uint32_t objIndex = objTypeToIndex(pNode->objType);
         assert(numTotalObjs > 0);
         numTotalObjs--;
         assert(numObjs[objIndex] > 0);
         numObjs[objIndex]--;
-        log_msg(mdd(dispatchable_object), VK_DBG_REPORT_INFO_BIT, pNode->objType, object.handle, 0, OBJTRACK_NONE, "OBJTRACK",
+        log_msg(mdd(dispatchable_object), VK_DBG_REPORT_INFO_BIT, pNode->objType, (uint64_t) object, 0, OBJTRACK_NONE, "OBJTRACK",
            "OBJ_STAT Destroy %s obj 0x%" PRIxLEAST64 " (%lu total objs remain & %lu %s objs).",
-            string_VkDbgObjectType(pNode->objType), object.handle, numTotalObjs, numObjs[objIndex],
+            string_VkDbgObjectType(pNode->objType), (uint64_t) object, numTotalObjs, numObjs[objIndex],
             string_VkDbgObjectType(pNode->objType));
         delete pNode;
-        VkSwapchainKHRMap.erase((void*) object.handle);
+        VkSwapchainKHRMap.erase((void*) object);
     } else {
-        log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_NONE, "OBJTRACK",
+        log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, (uint64_t) object, 0, OBJTRACK_NONE, "OBJTRACK",
             "Unable to remove obj 0x%" PRIxLEAST64 ". Was it created? Has it already been destroyed?",
-           object.handle);
+           (uint64_t) object);
     }
 }
 //
@@ -856,7 +856,7 @@
     unordered_map<const void*, OBJTRACK_NODE*>::iterator itr = swapchainImageMap.begin();
     while (itr != swapchainImageMap.end()) {
         OBJTRACK_NODE* pNode = (*itr).second;
-        if (pNode->parentObj == swapchain.handle) {
+        if (pNode->parentObj == (uint64_t) swapchain) {
            swapchainImageMap.erase(itr++);
         } else {
            ++itr;
diff --git a/layers/screenshot.cpp b/layers/screenshot.cpp
index 0fa3337..cd91034 100644
--- a/layers/screenshot.cpp
+++ b/layers/screenshot.cpp
@@ -63,7 +63,7 @@
     VkFormat format;
     VkImage *imageList;
 } SwapchainMapStruct;
-static unordered_map<uint64_t, SwapchainMapStruct *> swapchainMap;
+static unordered_map<VkSwapchainKHR, SwapchainMapStruct *> swapchainMap;
 
 // unordered map: associates an image with a device, image extent, and format
 typedef struct
@@ -72,7 +72,7 @@
     VkExtent2D imageExtent;
     VkFormat format;
 } ImageMapStruct;
-static unordered_map<uint64_t, ImageMapStruct *> imageMap;
+static unordered_map<VkImage, ImageMapStruct *> imageMap;
 
 // unordered map: associates a device with a queue, cmdPool, and physical device
 typedef struct
@@ -140,13 +140,13 @@
     const char *ptr;
     VkDeviceMemory mem2;
     VkCmdBuffer cmdBuffer;
-    VkDevice device = imageMap[image1.handle]->device;
+    VkDevice device = imageMap[image1]->device;
     VkPhysicalDevice physicalDevice = deviceMap[device]->physicalDevice;
     VkInstance instance = physDeviceMap[physicalDevice]->instance;
     VkQueue queue = deviceMap[device]->queue;
-    int width = imageMap[image1.handle]->imageExtent.width;
-    int height = imageMap[image1.handle]->imageExtent.height;
-    VkFormat format = imageMap[image1.handle]->format;
+    int width = imageMap[image1]->imageExtent.width;
+    int height = imageMap[image1]->imageExtent.height;
+    VkFormat format = imageMap[image1]->format;
     const VkImageSubresource sr = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0};
     VkSubresourceLayout sr_layout;
     const VkImageCreateInfo imgCreateInfo = {
@@ -196,7 +196,7 @@
     VkLayerDispatchTable* pTableCmdBuffer;
     VkPhysicalDeviceMemoryProperties memory_properties;
 
-    if (imageMap.empty() || imageMap.find(image1.handle) == imageMap.end())
+    if (imageMap.empty() || imageMap.find(image1) == imageMap.end())
         return;
 
     // The VkImage image1 we are going to dump may not be mappable,
@@ -504,10 +504,10 @@
         swapchainMapElem->device = device;
         swapchainMapElem->imageExtent = pCreateInfo->imageExtent;
         swapchainMapElem->format = pCreateInfo->imageFormat;
-        swapchainMap.insert(make_pair(pSwapchain->handle, swapchainMapElem));
+        swapchainMap.insert(make_pair(*pSwapchain, swapchainMapElem));
 
         // Create a mapping for the swapchain object into the dispatch table
-        screenshot_device_table_map.emplace((void *)pSwapchain->handle, pTable);
+        screenshot_device_table_map.emplace((void *)pSwapchain, pTable);
     }
     loader_platform_thread_unlock_mutex(&globalLock);
 
@@ -531,32 +531,32 @@
 
     if (result == VK_SUCCESS &&
         pSwapchainImages &&
-        !swapchainMap.empty() && swapchainMap.find(swapchain.handle) != swapchainMap.end())
+        !swapchainMap.empty() && swapchainMap.find(swapchain) != swapchainMap.end())
     {
         unsigned i;
 
         for (i=0; i<*pCount; i++)
         {
             // Create a mapping for an image to a device, image extent, and format
-            if (imageMap[pSwapchainImages[i].handle] == NULL)
+            if (imageMap[pSwapchainImages[i]] == NULL)
             {
                 ImageMapStruct *imageMapElem = new ImageMapStruct;
-                imageMap[pSwapchainImages[i].handle] = imageMapElem;
+                imageMap[pSwapchainImages[i]] = imageMapElem;
             }
-            imageMap[pSwapchainImages[i].handle]->device = swapchainMap[swapchain.handle]->device;
-            imageMap[pSwapchainImages[i].handle]->imageExtent = swapchainMap[swapchain.handle]->imageExtent;
-            imageMap[pSwapchainImages[i].handle]->format = swapchainMap[swapchain.handle]->format;
+            imageMap[pSwapchainImages[i]]->device = swapchainMap[swapchain]->device;
+            imageMap[pSwapchainImages[i]]->imageExtent = swapchainMap[swapchain]->imageExtent;
+            imageMap[pSwapchainImages[i]]->format = swapchainMap[swapchain]->format;
         }
 
         // Add list of images to swapchain to image map
-        SwapchainMapStruct *swapchainMapElem = swapchainMap[swapchain.handle];
+        SwapchainMapStruct *swapchainMapElem = swapchainMap[swapchain];
         if (i >= 1 && swapchainMapElem)
         {
             VkImage *imageList = new VkImage[i];
             swapchainMapElem->imageList = imageList;
             for (unsigned j=0; j<i; j++)
             {
-                swapchainMapElem->imageList[j] = pSwapchainImages[j].handle;
+                swapchainMapElem->imageList[j] = pSwapchainImages[j];
             }
         }
 
@@ -615,9 +615,9 @@
             fileName = to_string(frameNumber) + ".ppm";
 
             VkImage image;
-            uint64_t swapchain;
+            VkSwapchainKHR swapchain;
             // We'll dump only one image: the first
-            swapchain = pPresentInfo->swapchains[0].handle;
+            swapchain = pPresentInfo->swapchains[0];
             image = swapchainMap[swapchain]->imageList[pPresentInfo->imageIndices[0]];
             writePPM(fileName.c_str(), image);
             screenshotFrames.erase(it);
diff --git a/layers/shader_checker.cpp b/layers/shader_checker.cpp
index 22bb357..91c0336 100644
--- a/layers/shader_checker.cpp
+++ b/layers/shader_checker.cpp
@@ -89,7 +89,7 @@
 static loader_platform_thread_mutex globalLock;
 
 
-std::unordered_map<uint64_t, std::vector<VkDescriptorSetLayoutBinding>*> descriptor_set_layout_map;
+std::unordered_map<VkDescriptorSetLayout, std::vector<VkDescriptorSetLayoutBinding>*> descriptor_set_layout_map;
 
 VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(
     VkDevice device,
@@ -102,7 +102,7 @@
 
     if (VK_SUCCESS == result) {
         loader_platform_thread_lock_mutex(&globalLock);
-        auto& bindings = descriptor_set_layout_map[pSetLayout->handle];
+        auto& bindings = descriptor_set_layout_map[*pSetLayout];
         bindings = new std::vector<VkDescriptorSetLayoutBinding>(
                 pCreateInfo->pBinding, pCreateInfo->pBinding + pCreateInfo->count);
         loader_platform_thread_unlock_mutex(&globalLock);
@@ -112,7 +112,7 @@
 }
 
 
-std::unordered_map<uint64_t, std::vector<std::vector<VkDescriptorSetLayoutBinding>*>*> pipeline_layout_map;
+std::unordered_map<VkPipelineLayout, std::vector<std::vector<VkDescriptorSetLayoutBinding>*>*> pipeline_layout_map;
 
 VK_LAYER_EXPORT VkResult VKAPI vkCreatePipelineLayout(
     VkDevice                                    device,
@@ -124,11 +124,11 @@
 
     if (VK_SUCCESS == result) {
         loader_platform_thread_lock_mutex(&globalLock);
-        auto& layouts = pipeline_layout_map[pPipelineLayout->handle];
+        auto& layouts = pipeline_layout_map[*pPipelineLayout];
         layouts = new std::vector<std::vector<VkDescriptorSetLayoutBinding>*>();
         layouts->reserve(pCreateInfo->descriptorSetCount);
         for (unsigned i = 0; i < pCreateInfo->descriptorSetCount; i++) {
-            layouts->push_back(descriptor_set_layout_map[pCreateInfo->pSetLayouts[i].handle]);
+            layouts->push_back(descriptor_set_layout_map[pCreateInfo->pSetLayouts[i]]);
         }
         loader_platform_thread_unlock_mutex(&globalLock);
     }
@@ -209,7 +209,7 @@
 };
 
 
-static std::unordered_map<uint64_t, shader_module *> shader_module_map;
+static std::unordered_map<VkShaderModule, shader_module *> shader_module_map;
 
 struct shader_object {
     std::string name;
@@ -218,12 +218,12 @@
 
     shader_object(VkShaderCreateInfo const *pCreateInfo)
     {
-        module = shader_module_map[pCreateInfo->module.handle];
+        module = shader_module_map[pCreateInfo->module];
         stage = pCreateInfo->stage;
         name = pCreateInfo->pName;
     }
 };
-static std::unordered_map<uint64_t, shader_object *> shader_object_map;
+static std::unordered_map<VkShader, shader_object *> shader_object_map;
 
 struct render_pass {
     std::vector<std::vector<VkFormat>> subpass_color_formats;
@@ -250,7 +250,7 @@
         }
     }
 };
-static std::unordered_map<uint64_t, render_pass *> render_pass_map;
+static std::unordered_map<VkRenderPass, render_pass *> render_pass_map;
 
 
 static void
@@ -650,7 +650,7 @@
 
     if (res == VK_SUCCESS) {
         loader_platform_thread_lock_mutex(&globalLock);
-        shader_module_map[pShaderModule->handle] = new shader_module(pCreateInfo);
+        shader_module_map[*pShaderModule] = new shader_module(pCreateInfo);
         loader_platform_thread_unlock_mutex(&globalLock);
     }
     return res;
@@ -664,7 +664,7 @@
     VkResult res = get_dispatch_table(shader_checker_device_table_map, device)->CreateShader(device, pCreateInfo, pShader);
 
     loader_platform_thread_lock_mutex(&globalLock);
-    shader_object_map[pShader->handle] = new shader_object(pCreateInfo);
+    shader_object_map[*pShader] = new shader_object(pCreateInfo);
     loader_platform_thread_unlock_mutex(&globalLock);
     return res;
 }
@@ -677,7 +677,7 @@
     VkResult res = get_dispatch_table(shader_checker_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pRenderPass);
 
     loader_platform_thread_lock_mutex(&globalLock);
-    render_pass_map[pRenderPass->handle] = new render_pass(pCreateInfo);
+    render_pass_map[*pRenderPass] = new render_pass(pCreateInfo);
     loader_platform_thread_unlock_mutex(&globalLock);
     return res;
 }
@@ -1080,7 +1080,7 @@
                 }
             }
             else {
-                struct shader_object *shader = shader_object_map[pStage->shader.handle];
+                struct shader_object *shader = shader_object_map[pStage->shader];
                 shaders[get_shader_stage_id(shader->stage)] = shader->module;
 
                 /* validate descriptor set layout against what the spirv module actually uses */
@@ -1088,8 +1088,8 @@
                 collect_interface_by_descriptor_slot(dev, shader->module, spv::StorageClassUniform,
                         descriptor_uses);
 
-                auto layout = pCreateInfo->layout.handle ?
-                    pipeline_layout_map[pCreateInfo->layout.handle] : nullptr;
+                auto layout = pCreateInfo->layout != VK_NULL_HANDLE ?
+                    pipeline_layout_map[pCreateInfo->layout] : nullptr;
 
                 for (auto it = descriptor_uses.begin(); it != descriptor_uses.end(); it++) {
 
@@ -1112,7 +1112,7 @@
     }
 
     if (pCreateInfo->renderPass != VK_NULL_HANDLE)
-        rp = render_pass_map[pCreateInfo->renderPass.handle];
+        rp = render_pass_map[pCreateInfo->renderPass];
 
     vi = pCreateInfo->pVertexInputState;
 
diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp
index 38d8e94..0fcac4e 100644
--- a/layers/swapchain.cpp
+++ b/layers/swapchain.cpp
@@ -53,7 +53,7 @@
 static std::unordered_map<void *, SwpInstance>       instanceMap;
 static std::unordered_map<void *, SwpPhysicalDevice> physicalDeviceMap;
 static std::unordered_map<void *, SwpDevice>         deviceMap;
-static std::unordered_map<uint64_t, SwpSwapchain>    swapchainMap;
+static std::unordered_map<VkSwapchainKHR, SwpSwapchain>    swapchainMap;
 
 
 static void createDeviceRegisterExtensions(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, VkDevice device)
@@ -830,11 +830,11 @@
             // Remember the swapchain's handle, and link it to the device:
             SwpDevice *pDevice = &deviceMap[device];
 
-            swapchainMap[pSwapchain->handle].swapchain = *pSwapchain;
-            pDevice->swapchains[pSwapchain->handle] =
-                &swapchainMap[pSwapchain->handle];
-            swapchainMap[pSwapchain->handle].pDevice = pDevice;
-            swapchainMap[pSwapchain->handle].imageCount = 0;
+            swapchainMap[*pSwapchain].swapchain = *pSwapchain;
+            pDevice->swapchains[*pSwapchain] =
+                &swapchainMap[*pSwapchain];
+            swapchainMap[*pSwapchain].pDevice = pDevice;
+            swapchainMap[*pSwapchain].imageCount = 0;
         }
 
         return result;
@@ -864,11 +864,11 @@
     }
 
     // Regardless of skipCall value, do some internal cleanup:
-    SwpSwapchain *pSwapchain = &swapchainMap[swapchain.handle];
+    SwpSwapchain *pSwapchain = &swapchainMap[swapchain];
     if (pSwapchain) {
         // Delete the SwpSwapchain associated with this swapchain:
         if (pSwapchain->pDevice) {
-            pSwapchain->pDevice->swapchains.erase(swapchain.handle);
+            pSwapchain->pDevice->swapchains.erase(swapchain);
             if (device != pSwapchain->pDevice->device) {
                 LOG_ERROR(VK_OBJECT_TYPE_DEVICE, device, "VkDevice",
                           SWAPCHAIN_DESTROY_SWAP_DIFF_DEVICE,
@@ -880,10 +880,10 @@
         if (pSwapchain->imageCount) {
             pSwapchain->images.clear();
         }
-        swapchainMap.erase(swapchain.handle);
+        swapchainMap.erase(swapchain);
     } else {
         skipCall |= LOG_ERROR_NON_VALID_OBJ(VK_OBJECT_TYPE_SWAPCHAIN_KHR,
-                                            swapchain.handle,
+                                            swapchain,
                                             "VkSwapchainKHR");
     }
 
@@ -916,7 +916,7 @@
                               "extension was not enabled for this VkDevice.",
                               __FUNCTION__);
     }
-    SwpSwapchain *pSwapchain = &swapchainMap[swapchain.handle];
+    SwpSwapchain *pSwapchain = &swapchainMap[swapchain];
     if (!pSwapchain) {
         skipCall |= LOG_ERROR_NON_VALID_OBJ(VK_OBJECT_TYPE_SWAPCHAIN_KHR,
                                             swapchain.handle,
@@ -973,10 +973,10 @@
                               __FUNCTION__);
     }
     // Validate that a valid VkSwapchainKHR was used:
-    SwpSwapchain *pSwapchain = &swapchainMap[swapchain.handle];
+    SwpSwapchain *pSwapchain = &swapchainMap[swapchain];
     if (!pSwapchain) {
         skipCall |= LOG_ERROR_NON_VALID_OBJ(VK_OBJECT_TYPE_SWAPCHAIN_KHR,
-                                            swapchain.handle,
+                                            swapchain,
                                             "VkSwapchainKHR");
     } else {
         // Look to see if the application is trying to own too many images at
@@ -1037,7 +1037,7 @@
     for (uint32_t i = 0; i < pPresentInfo->swapchainCount ; i++) {
         uint32_t index = pPresentInfo->imageIndices[i];
         SwpSwapchain *pSwapchain =
-            &swapchainMap[pPresentInfo->swapchains[i].handle];
+            &swapchainMap[pPresentInfo->swapchains[i]];
         if (pSwapchain) {
             if (!pSwapchain->pDevice->deviceSwapchainExtensionEnabled) {
                 skipCall |= LOG_ERROR(VK_OBJECT_TYPE_DEVICE,
@@ -1051,7 +1051,7 @@
             }
             if (index >= pSwapchain->imageCount) {
                 skipCall |= LOG_ERROR(VK_OBJECT_TYPE_SWAPCHAIN_KHR,
-                                      pPresentInfo->swapchains[i].handle,
+                                      pPresentInfo->swapchains[i],
                                       "VkSwapchainKHR",
                                       SWAPCHAIN_INDEX_TOO_LARGE,
                                       "%s() called for an index that is too "
@@ -1062,7 +1062,7 @@
             } else {
                 if (!pSwapchain->images[index].ownedByApp) {
                     skipCall |= LOG_ERROR(VK_OBJECT_TYPE_SWAPCHAIN_KHR,
-                                          pPresentInfo->swapchains[i].handle,
+                                          pPresentInfo->swapchains[i],
                                           "VkSwapchainKHR",
                                           SWAPCHAIN_INDEX_NOT_IN_USE,
                                           "%s() returned an index (i.e. %d) "
@@ -1073,7 +1073,7 @@
             }
         } else {
             skipCall |= LOG_ERROR_NON_VALID_OBJ(VK_OBJECT_TYPE_SWAPCHAIN_KHR,
-                                                pPresentInfo->swapchains[i].handle,
+                                                pPresentInfo->swapchains[i],
                                                 "VkSwapchainKHR");
         }
     }
@@ -1087,7 +1087,7 @@
             for (uint32_t i = 0; i < pPresentInfo->swapchainCount ; i++) {
                 int index = pPresentInfo->imageIndices[i];
                 SwpSwapchain *pSwapchain =
-                    &swapchainMap[pPresentInfo->swapchains[i].handle];
+                    &swapchainMap[pPresentInfo->swapchains[i]];
                 if (pSwapchain) {
                     // Change the state of the image (no longer owned by the
                     // application):
diff --git a/layers/swapchain.h b/layers/swapchain.h
index 21a2fe6..18dc363 100644
--- a/layers/swapchain.h
+++ b/layers/swapchain.h
@@ -183,7 +183,7 @@
 
     // When vkCreateSwapchainKHR is called, the VkSwapchainKHR's are
     // remembered:
-    unordered_map<uint64_t, SwpSwapchain*> swapchains;
+    unordered_map<VkSwapchainKHR, SwpSwapchain*> swapchains;
 };
 
 // Create one of these for each VkImage within a VkSwapchainKHR:
diff --git a/layers/vk_layer_logging.h b/layers/vk_layer_logging.h
index 60d3fb1..70894f7 100644
--- a/layers/vk_layer_logging.h
+++ b/layers/vk_layer_logging.h
@@ -119,7 +119,7 @@
 
         debug_report_log_msg(
                     debug_data, VK_DBG_REPORT_WARN_BIT,
-                    VK_OBJECT_TYPE_MSG_CALLBACK, pTrav->msgCallback.handle,
+                    VK_OBJECT_TYPE_MSG_CALLBACK, (uint64_t) pTrav->msgCallback,
                     0, DEBUG_REPORT_CALLBACK_REF,
                     "DebugReport",
                     "Debug Report callbacks not removed before DestroyInstance");
@@ -159,7 +159,7 @@
 
     // Handle of 0 is logging_callback so use allocated Node address as unique handle
     if (!(*pMsgCallback))
-        *pMsgCallback = (uint64_t) pNewDbgFuncNode;
+        *pMsgCallback = (VkDbgMsgCallback) pNewDbgFuncNode;
     pNewDbgFuncNode->msgCallback = *pMsgCallback;
     pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
     pNewDbgFuncNode->msgFlags = msgFlags;
@@ -171,7 +171,7 @@
 
     debug_report_log_msg(
                 debug_data, VK_DBG_REPORT_DEBUG_BIT,
-                VK_OBJECT_TYPE_MSG_CALLBACK, (*pMsgCallback).handle,
+                VK_OBJECT_TYPE_MSG_CALLBACK, (uint64_t) *pMsgCallback,
                 0, DEBUG_REPORT_CALLBACK_REF,
                 "DebugReport",
                 "Added callback");
@@ -196,7 +196,7 @@
             }
             debug_report_log_msg(
                         debug_data, VK_DBG_REPORT_DEBUG_BIT,
-                        VK_OBJECT_TYPE_MSG_CALLBACK, pTrav->msgCallback.handle,
+                        VK_OBJECT_TYPE_MSG_CALLBACK, (uint64_t) pTrav->msgCallback,
                         0, DEBUG_REPORT_NONE,
                         "DebugReport",
                         "Destroyed callback");
diff --git a/loader/debug_report.c b/loader/debug_report.c
index f73929a..00069b1 100644
--- a/loader/debug_report.c
+++ b/loader/debug_report.c
@@ -107,7 +107,7 @@
     VkResult result = inst->disp->DbgDestroyMsgCallback(instance, msg_callback);
 
     while (pTrav) {
-        if (pTrav->msgCallback.handle == msg_callback.handle) {
+        if (pTrav->msgCallback == msg_callback) {
             pPrev->pNext = pTrav->pNext;
             if (inst->DbgFunctionHead == pTrav)
                 inst->DbgFunctionHead = pTrav->pNext;
@@ -174,7 +174,7 @@
     if (icd) {
         storage_idx = 0;
         for (icd = inst->icds; icd; icd = icd->next) {
-            if (icd_info[storage_idx].handle) {
+            if (icd_info[storage_idx]) {
                 icd->DbgDestroyMsgCallback(
                       icd->instance,
                       icd_info[storage_idx]);
@@ -212,7 +212,7 @@
     icd_info = *(VkDbgMsgCallback **) &msgCallback;
     storage_idx = 0;
     for (icd = inst->icds; icd; icd = icd->next) {
-        if (icd_info[storage_idx].handle) {
+        if (icd_info[storage_idx]) {
             icd->DbgDestroyMsgCallback(
                   icd->instance,
                   icd_info[storage_idx]);
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 8e120ba..f98b068 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -1102,8 +1102,7 @@
     err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
     ASSERT_VK_SUCCESS(err);
 
-    VkBufferView view;
-    view.handle = 0xbaadbeef; // invalid bufferView object
+    VkBufferView view = (VkBufferView) 0xbaadbeef; // invalid bufferView object
 
     VkWriteDescriptorSet descriptor_write;
     memset(&descriptor_write, 0, sizeof(descriptor_write));
@@ -1739,7 +1738,6 @@
     std::string     msgString;
     VkResult        err;
     VkCmdBuffer     draw_cmd;
-    VkCmdPool       cmd_pool;
 
     ASSERT_NO_FATAL_FAILURE(InitState());
     m_errorMonitor->ClearState();
@@ -3272,8 +3270,7 @@
     err = vkAllocDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
     ASSERT_VK_SUCCESS(err);
 
-    VkSampler sampler;
-    sampler.handle = 0xbaadbeef; // Sampler with invalid handle
+    VkSampler sampler = (VkSampler) 0xbaadbeef; // Sampler with invalid handle
 
     VkDescriptorImageInfo descriptor_info;
     memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
@@ -3370,8 +3367,7 @@
     err = vkCreateSampler(m_device->device(), &sampler_ci, &sampler);
     ASSERT_VK_SUCCESS(err);
 
-    VkImageView view;
-    view.handle = 0xbaadbeef; // invalid imageView object
+    VkImageView view = (VkImageView) 0xbaadbeef; // invalid imageView object
 
     VkDescriptorImageInfo descriptor_info;
     memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
diff --git a/tests/vktestframework.cpp b/tests/vktestframework.cpp
index f320460..0551600 100644
--- a/tests/vktestframework.cpp
+++ b/tests/vktestframework.cpp
@@ -927,7 +927,7 @@
     swap_chain.queueFamilyCount = 0;
     swap_chain.pQueueFamilyIndices = NULL;
     swap_chain.presentMode = swapchainPresentMode;
-    swap_chain.oldSwapchain.handle = 0;
+    swap_chain.oldSwapchain = VK_NULL_HANDLE;
     swap_chain.clipped = true;
 
     uint32_t i;
diff --git a/vk-layer-generate.py b/vk-layer-generate.py
index 189360d..afcf4be 100755
--- a/vk-layer-generate.py
+++ b/vk-layer-generate.py
@@ -127,8 +127,8 @@
             return ("%lu", name)
         if vk_type.strip('*') in vulkan.object_non_dispatch_list:
             if '*' in vk_type:
-                return ("%lu", "%s->handle" % name)
-            return ("%lu", "%s.handle" % name)
+                return ("%lu", "%s" % name)
+            return ("%lu", "%s" % name)
         if "size" in vk_type:
             if '*' in vk_type:
                 return ("%lu", "(unsigned long)*%s" % name)
@@ -994,9 +994,9 @@
                         cp = True
             (pft, pfi) = self._get_printf_params(p.ty, p.name, cp, cpp=True)
             if p.name == "pSwapchain" or p.name == "pSwapchainImages":
-                log_func += '%s = " << ((%s == NULL) ? 0 : %s->handle) << ", ' % (p.name, p.name, p.name)
+                log_func += '%s = " << %s << ", ' % (p.name, p.name)
             elif p.name == "swapchain":
-                log_func += '%s = " << %s.handle << ", ' % (p.name, p.name)
+                log_func += '%s = " << %s << ", ' % (p.name, p.name)
             else:
                 log_func += '%s = " << %s << ", ' % (p.name, pfi)
             if "%p" == pft:
@@ -1067,10 +1067,7 @@
                         print_cast = ''
                         print_func = 'string_convert_helper'
                         #cis_print_func = 'tmp_str = string_convert_helper((void*)%s[i], "    ");' % proto.params[sp_index].name
-                    if proto.params[sp_index].ty.strip('*').replace('const ', '') in vulkan.object_non_dispatch_list:
-                        cis_print_func = 'tmp_str = %s(%s%s[i].handle, "    ");' % (print_func, print_cast, proto.params[sp_index].name)
-                    else:
-                        cis_print_func = 'tmp_str = %s(%s%s[i], "    ");' % (print_func, print_cast, proto.params[sp_index].name)
+                    cis_print_func = 'tmp_str = %s(%s%s[i], "    ");' % (print_func, print_cast, proto.params[sp_index].name)
                     if not i_decl:
                         log_func += '\n%suint32_t i;' % (indent)
                         i_decl = True
@@ -1215,26 +1212,18 @@
             procs_txt.append('%s' % self.lineinfo.get())
             if o in vulkan.object_dispatch_list:
                 procs_txt.append('static void create_obj(%s dispatchable_object, %s vkObj, VkDbgObjectType objType)' % (o, o))
-                procs_txt.append('{')
-                procs_txt.append('    log_msg(mdd(dispatchable_object), VK_DBG_REPORT_INFO_BIT, objType, reinterpret_cast<uint64_t>(vkObj), 0, OBJTRACK_NONE, "OBJTRACK",')
-                procs_txt.append('        "OBJ[%llu] : CREATE %s object 0x%" PRIxLEAST64 , object_track_index++, string_VkDbgObjectType(objType),')
-                procs_txt.append('        reinterpret_cast<uint64_t>(vkObj));')
             else:
                 procs_txt.append('static void create_obj(VkDevice dispatchable_object, %s vkObj, VkDbgObjectType objType)' % (o))
-                procs_txt.append('{')
-                procs_txt.append('    log_msg(mdd(dispatchable_object), VK_DBG_REPORT_INFO_BIT, objType, vkObj.handle, 0, OBJTRACK_NONE, "OBJTRACK",')
-                procs_txt.append('        "OBJ[%llu] : CREATE %s object 0x%" PRIxLEAST64 , object_track_index++, string_VkDbgObjectType(objType),')
-                procs_txt.append('        vkObj.handle);')
+            procs_txt.append('{')
+            procs_txt.append('    log_msg(mdd(dispatchable_object), VK_DBG_REPORT_INFO_BIT, objType, reinterpret_cast<uint64_t>(vkObj), 0, OBJTRACK_NONE, "OBJTRACK",')
+            procs_txt.append('        "OBJ[%llu] : CREATE %s object 0x%" PRIxLEAST64 , object_track_index++, string_VkDbgObjectType(objType),')
+            procs_txt.append('        reinterpret_cast<uint64_t>(vkObj));')
             procs_txt.append('')
             procs_txt.append('    OBJTRACK_NODE* pNewObjNode = new OBJTRACK_NODE;')
             procs_txt.append('    pNewObjNode->objType = objType;')
             procs_txt.append('    pNewObjNode->status  = OBJSTATUS_NONE;')
-            if o in vulkan.object_dispatch_list:
-                procs_txt.append('    pNewObjNode->vkObj  = reinterpret_cast<uint64_t>(vkObj);')
-                procs_txt.append('    %sMap[vkObj] = pNewObjNode;' % (o))
-            else:
-                procs_txt.append('    pNewObjNode->vkObj  = vkObj.handle;')
-                procs_txt.append('    %sMap[(void*)vkObj.handle] = pNewObjNode;' % (o))
+            procs_txt.append('    pNewObjNode->vkObj  = reinterpret_cast<uint64_t>(vkObj);')
+            procs_txt.append('    %sMap[vkObj] = pNewObjNode;' % (o))
             procs_txt.append('    uint32_t objIndex = objTypeToIndex(objType);')
             procs_txt.append('    numObjs[objIndex]++;')
             procs_txt.append('    numTotalObjs++;')
@@ -1263,12 +1252,12 @@
                     procs_txt.append('')
                 if o == "VkImage":
                     procs_txt.append('    // We need to validate normal image objects and those from the swapchain')
-                    procs_txt.append('    if ((%sMap.find((void*)object.handle)        == %sMap.end()) &&' % (o, o))
-                    procs_txt.append('        (swapchainImageMap.find((void*)object.handle) == swapchainImageMap.end())) {')
+                    procs_txt.append('    if ((%sMap.find((void*)object)        == %sMap.end()) &&' % (o, o))
+                    procs_txt.append('        (swapchainImageMap.find((void*)object) == swapchainImageMap.end())) {')
                 else:
-                    procs_txt.append('    if (%sMap.find((void*)object.handle) == %sMap.end()) {' % (o, o))
-                procs_txt.append('        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",')
-                procs_txt.append('            "Invalid %s Object %%p", object.handle);' % o)
+                    procs_txt.append('    if (%sMap.find((void*)object) == %sMap.end()) {' % (o, o))
+                procs_txt.append('        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, (uint64_t) object, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",')
+                procs_txt.append('            "Invalid %s Object %%p", object);' % o)
             procs_txt.append('    }')
             procs_txt.append('    return VK_FALSE;')
             procs_txt.append('}')
@@ -1280,68 +1269,42 @@
             else:
                 procs_txt.append('static void destroy_obj(VkDevice dispatchable_object, %s object)' % (o))
             procs_txt.append('{')
-            if o in vulkan.object_dispatch_list:
-                procs_txt.append('    if (%sMap.find(object) != %sMap.end()) {' % (o, o))
-                procs_txt.append('        OBJTRACK_NODE* pNode = %sMap[object];' % (o))
-            else:
-                procs_txt.append('    if (%sMap.find((void*)object.handle) != %sMap.end()) {' % (o, o))
-                procs_txt.append('        OBJTRACK_NODE* pNode = %sMap[(void*)object.handle];' % (o))
+            procs_txt.append('    if (%sMap.find(object) != %sMap.end()) {' % (o, o))
+            procs_txt.append('        OBJTRACK_NODE* pNode = %sMap[object];' % (o))
             procs_txt.append('        uint32_t objIndex = objTypeToIndex(pNode->objType);')
             procs_txt.append('        assert(numTotalObjs > 0);')
             procs_txt.append('        numTotalObjs--;')
             procs_txt.append('        assert(numObjs[objIndex] > 0);')
             procs_txt.append('        numObjs[objIndex]--;')
-            if o in vulkan.object_dispatch_list:
-                procs_txt.append('        log_msg(mdd(dispatchable_object), VK_DBG_REPORT_INFO_BIT, pNode->objType, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_NONE, "OBJTRACK",')
-                procs_txt.append('           "OBJ_STAT Destroy %s obj 0x%" PRIxLEAST64 " (%lu total objs remain & %lu %s objs).",')
-                procs_txt.append('            string_VkDbgObjectType(pNode->objType), reinterpret_cast<uint64_t>(object), numTotalObjs, numObjs[objIndex],')
-            else:
-                procs_txt.append('        log_msg(mdd(dispatchable_object), VK_DBG_REPORT_INFO_BIT, pNode->objType, object.handle, 0, OBJTRACK_NONE, "OBJTRACK",')
-                procs_txt.append('           "OBJ_STAT Destroy %s obj 0x%" PRIxLEAST64 " (%lu total objs remain & %lu %s objs).",')
-                procs_txt.append('            string_VkDbgObjectType(pNode->objType), object.handle, numTotalObjs, numObjs[objIndex],')
+            procs_txt.append('        log_msg(mdd(dispatchable_object), VK_DBG_REPORT_INFO_BIT, pNode->objType, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_NONE, "OBJTRACK",')
+            procs_txt.append('           "OBJ_STAT Destroy %s obj 0x%" PRIxLEAST64 " (%lu total objs remain & %lu %s objs).",')
+            procs_txt.append('            string_VkDbgObjectType(pNode->objType), reinterpret_cast<uint64_t>(object), numTotalObjs, numObjs[objIndex],')
             procs_txt.append('            string_VkDbgObjectType(pNode->objType));')
             procs_txt.append('        delete pNode;')
-            if o in vulkan.object_dispatch_list:
-                procs_txt.append('        %sMap.erase(object);' % (o))
-                procs_txt.append('    } else {')
-                procs_txt.append('        log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_NONE, "OBJTRACK",')
-                procs_txt.append('            "Unable to remove obj 0x%" PRIxLEAST64 ". Was it created? Has it already been destroyed?",')
-                procs_txt.append('           reinterpret_cast<uint64_t>(object));')
-                procs_txt.append('    }')
-            else:
-                procs_txt.append('        %sMap.erase((void*)object.handle);' % (o))
-                procs_txt.append('    } else {')
-                procs_txt.append('        log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_NONE, "OBJTRACK",')
-                procs_txt.append('            "Unable to remove obj 0x%" PRIxLEAST64 ". Was it created? Has it already been destroyed?",')
-                procs_txt.append('            object.handle);')
-                procs_txt.append('    }')
+            procs_txt.append('        %sMap.erase(object);' % (o))
+            procs_txt.append('    } else {')
+            procs_txt.append('        log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_NONE, "OBJTRACK",')
+            procs_txt.append('            "Unable to remove obj 0x%" PRIxLEAST64 ". Was it created? Has it already been destroyed?",')
+            procs_txt.append('           reinterpret_cast<uint64_t>(object));')
+            procs_txt.append('    }')
             procs_txt.append('}')
             procs_txt.append('')
             procs_txt.append('%s' % self.lineinfo.get())
             if o in vulkan.object_dispatch_list:
                 procs_txt.append('static VkBool32 set_status(%s dispatchable_object, %s object, VkDbgObjectType objType, ObjectStatusFlags status_flag)' % (o, o))
-                procs_txt.append('{')
-                procs_txt.append('    if (object != VK_NULL_HANDLE) {')
-                procs_txt.append('        if (%sMap.find(object) != %sMap.end()) {' % (o, o))
-                procs_txt.append('            OBJTRACK_NODE* pNode = %sMap[object];' % (o))
             else:
                 procs_txt.append('static VkBool32 set_status(VkDevice dispatchable_object, %s object, VkDbgObjectType objType, ObjectStatusFlags status_flag)' % (o))
-                procs_txt.append('{')
-                procs_txt.append('    if (object != VK_NULL_HANDLE) {')
-                procs_txt.append('        if (%sMap.find((void*)object.handle) != %sMap.end()) {' % (o, o))
-                procs_txt.append('            OBJTRACK_NODE* pNode = %sMap[(void*)object.handle];' % (o))
+            procs_txt.append('{')
+            procs_txt.append('    if (object != VK_NULL_HANDLE) {')
+            procs_txt.append('        if (%sMap.find(object) != %sMap.end()) {' % (o, o))
+            procs_txt.append('            OBJTRACK_NODE* pNode = %sMap[object];' % (o))
             procs_txt.append('            pNode->status |= status_flag;')
             procs_txt.append('        }')
             procs_txt.append('        else {')
             procs_txt.append('            // If we do not find it print an error')
-            if o in vulkan.object_dispatch_list:
-                procs_txt.append('            return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_NONE, "OBJTRACK",')
-                procs_txt.append('                "Unable to set status for non-existent object 0x%" PRIxLEAST64 " of %s type",')
-                procs_txt.append('                reinterpret_cast<uint64_t>(object), string_VkDbgObjectType(objType));')
-            else:
-                procs_txt.append('            return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_NONE, "OBJTRACK",')
-                procs_txt.append('                "Unable to set status for non-existent object 0x%" PRIxLEAST64 " of %s type",')
-                procs_txt.append('                object.handle, string_VkDbgObjectType(objType));')
+            procs_txt.append('            return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_NONE, "OBJTRACK",')
+            procs_txt.append('                "Unable to set status for non-existent object 0x%" PRIxLEAST64 " of %s type",')
+            procs_txt.append('                reinterpret_cast<uint64_t>(object), string_VkDbgObjectType(objType));')
             procs_txt.append('        }')
             procs_txt.append('    }')
             procs_txt.append('    return VK_FALSE;')
@@ -1360,35 +1323,21 @@
             procs_txt.append('    OBJECT_TRACK_ERROR  error_code,')
             procs_txt.append('    const char         *fail_msg)')
             procs_txt.append('{')
-            if o in vulkan.object_dispatch_list:
-                procs_txt.append('    if (%sMap.find(object) != %sMap.end()) {' % (o, o))
-                procs_txt.append('        OBJTRACK_NODE* pNode = %sMap[object];' % (o))
-            else:
-                procs_txt.append('    if (%sMap.find((void*)object.handle) != %sMap.end()) {' % (o, o))
-                procs_txt.append('        OBJTRACK_NODE* pNode = %sMap[(void*)object.handle];' % (o))
+            procs_txt.append('    if (%sMap.find(object) != %sMap.end()) {' % (o, o))
+            procs_txt.append('        OBJTRACK_NODE* pNode = %sMap[object];' % (o))
             procs_txt.append('        if ((pNode->status & status_mask) != status_flag) {')
-            if o in vulkan.object_dispatch_list:
-                procs_txt.append('            log_msg(mdd(dispatchable_object), msg_flags, pNode->objType, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK",')
-                procs_txt.append('                "OBJECT VALIDATION WARNING: %s object 0x%" PRIxLEAST64 ": %s", string_VkDbgObjectType(objType),')
-                procs_txt.append('                 reinterpret_cast<uint64_t>(object), fail_msg);')
-            else:
-                procs_txt.append('            log_msg(mdd(dispatchable_object), msg_flags, pNode->objType, object.handle, 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK",')
-                procs_txt.append('                "OBJECT VALIDATION WARNING: %s object 0x%" PRIxLEAST64 ": %s", string_VkDbgObjectType(objType),')
-                procs_txt.append('                 object.handle, fail_msg);')
+            procs_txt.append('            log_msg(mdd(dispatchable_object), msg_flags, pNode->objType, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK",')
+            procs_txt.append('                "OBJECT VALIDATION WARNING: %s object 0x%" PRIxLEAST64 ": %s", string_VkDbgObjectType(objType),')
+            procs_txt.append('                 reinterpret_cast<uint64_t>(object), fail_msg);')
             procs_txt.append('            return VK_FALSE;')
             procs_txt.append('        }')
             procs_txt.append('        return VK_TRUE;')
             procs_txt.append('    }')
             procs_txt.append('    else {')
             procs_txt.append('        // If we do not find it print an error')
-            if o in vulkan.object_dispatch_list:
-                procs_txt.append('        log_msg(mdd(dispatchable_object), msg_flags, (VkDbgObjectType) 0, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK",')
-                procs_txt.append('            "Unable to obtain status for non-existent object 0x%" PRIxLEAST64 " of %s type",')
-                procs_txt.append('            reinterpret_cast<uint64_t>(object), string_VkDbgObjectType(objType));')
-            else:
-                procs_txt.append('        log_msg(mdd(dispatchable_object), msg_flags, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK",')
-                procs_txt.append('            "Unable to obtain status for non-existent object 0x%" PRIxLEAST64 " of %s type",')
-                procs_txt.append('            object.handle, string_VkDbgObjectType(objType));')
+            procs_txt.append('        log_msg(mdd(dispatchable_object), msg_flags, (VkDbgObjectType) 0, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK",')
+            procs_txt.append('            "Unable to obtain status for non-existent object 0x%" PRIxLEAST64 " of %s type",')
+            procs_txt.append('            reinterpret_cast<uint64_t>(object), string_VkDbgObjectType(objType));')
             procs_txt.append('        return VK_FALSE;')
             procs_txt.append('    }')
             procs_txt.append('}')
@@ -1396,26 +1345,18 @@
             procs_txt.append('%s' % self.lineinfo.get())
             if o in vulkan.object_dispatch_list:
                 procs_txt.append('static VkBool32 reset_status(%s dispatchable_object, %s object, VkDbgObjectType objType, ObjectStatusFlags status_flag)' % (o, o))
-                procs_txt.append('{')
-                procs_txt.append('    if (%sMap.find(object) != %sMap.end()) {' % (o, o))
-                procs_txt.append('        OBJTRACK_NODE* pNode = %sMap[object];' % (o))
             else:
                 procs_txt.append('static VkBool32 reset_status(VkDevice dispatchable_object, %s object, VkDbgObjectType objType, ObjectStatusFlags status_flag)' % (o))
-                procs_txt.append('{')
-                procs_txt.append('    if (%sMap.find((void*)object.handle) != %sMap.end()) {' % (o, o))
-                procs_txt.append('        OBJTRACK_NODE* pNode = %sMap[(void*)object.handle];' % (o))
+            procs_txt.append('{')
+            procs_txt.append('    if (%sMap.find(object) != %sMap.end()) {' % (o, o))
+            procs_txt.append('        OBJTRACK_NODE* pNode = %sMap[object];' % (o))
             procs_txt.append('        pNode->status &= ~status_flag;')
             procs_txt.append('    }')
             procs_txt.append('    else {')
             procs_txt.append('        // If we do not find it print an error')
-            if o in vulkan.object_dispatch_list:
-                procs_txt.append('        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, objType, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK",')
-                procs_txt.append('            "Unable to reset status for non-existent object 0x%" PRIxLEAST64 " of %s type",')
-                procs_txt.append('            reinterpret_cast<uint64_t>(object), string_VkDbgObjectType(objType));')
-            else:
-                procs_txt.append('        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, objType, object.handle, 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK",')
-                procs_txt.append('            "Unable to reset status for non-existent object 0x%" PRIxLEAST64 " of %s type",')
-                procs_txt.append('            object.handle, string_VkDbgObjectType(objType));')
+            procs_txt.append('        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, objType, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK",')
+            procs_txt.append('            "Unable to reset status for non-existent object 0x%" PRIxLEAST64 " of %s type",')
+            procs_txt.append('            reinterpret_cast<uint64_t>(object), string_VkDbgObjectType(objType));')
             procs_txt.append('    }')
             procs_txt.append('    return VK_FALSE;')
             procs_txt.append('}')
@@ -1517,9 +1458,9 @@
                   'VkPipelineLayout', 'VkBuffer', 'VkEvent', 'VkQueryPool', 'VkRenderPass', 'VkFramebuffer']:
             cbv_txt.append('static VkBool32 validate_object(VkCmdBuffer dispatchable_object, %s object)' % (o))
             cbv_txt.append('{')
-            cbv_txt.append('    if (%sMap.find((void*)object.handle) == %sMap.end()) {' % (o, o))
-            cbv_txt.append('        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",')
-            cbv_txt.append('            "Invalid %s Object %%p", object.handle);' % (o))
+            cbv_txt.append('    if (%sMap.find((void*)object) == %sMap.end()) {' % (o, o))
+            cbv_txt.append('        return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, (uint64_t) object, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",')
+            cbv_txt.append('            "Invalid %s Object %%p", object);' % (o))
             cbv_txt.append('    }')
             cbv_txt.append('    return VK_FALSE;')
             cbv_txt.append('}')
@@ -1776,12 +1717,8 @@
     }
     def generate_useObject(self, ty):
         obj_type = self.thread_check_object_types[ty]
-        if ty in self.thread_check_dispatchable_objects:
-            key = "object"
-            msg_object = "reinterpret_cast<uint64_t>(object)"
-        else:
-            key = "object.handle"
-            msg_object = "object.handle"
+        key = "object"
+        msg_object = "reinterpret_cast<uint64_t>(object)"
         header_txt = []
         header_txt.append('%s' % self.lineinfo.get())
         header_txt.append('static void useObject(const void* dispatchable_object, %s object)' % ty)
@@ -1812,10 +1749,7 @@
         header_txt.append('}')
         return "\n".join(header_txt)
     def generate_finishUsingObject(self, ty):
-        if ty in self.thread_check_dispatchable_objects:
-            key = "object"
-        else:
-            key = "object.handle"
+        key = "object"
         header_txt = []
         header_txt.append('%s' % self.lineinfo.get())
         header_txt.append('static void finishUsingObject(%s object)' % ty)
@@ -1851,7 +1785,7 @@
         for ty in self.thread_check_dispatchable_objects:
             header_txt.append('static unordered_map<%s, loader_platform_thread_id> %sObjectsInUse;' % (ty, ty))
         for ty in self.thread_check_nondispatchable_objects:
-            header_txt.append('static unordered_map<uint64_t, loader_platform_thread_id> %sObjectsInUse;' % ty)
+            header_txt.append('static unordered_map<%s, loader_platform_thread_id> %sObjectsInUse;' % (ty, ty))
         header_txt.append('static int threadingLockInitialized = 0;')
         header_txt.append('static loader_platform_thread_mutex threadingLock;')
         header_txt.append('static loader_platform_thread_cond threadingCond;')
diff --git a/vk_helper.py b/vk_helper.py
index 9cf8c04..122db6b 100755
--- a/vk_helper.py
+++ b/vk_helper.py
@@ -953,7 +953,7 @@
                         if "addr" in po: # or self.struct_dict[s][m]['ptr']:
                             sh_funcs.append('    ss[%u].str("addr");' % (index))
                         elif not self.struct_dict[s][m]['ptr'] and self.struct_dict[s][m]['type'] in vulkan.core.objects:
-                            sh_funcs.append('    ss[%u] << pStruct->%s.handle;' % (index, self.struct_dict[s][m]['name']))
+                            sh_funcs.append('    ss[%u] << pStruct->%s;' % (index, self.struct_dict[s][m]['name']))
                         else:
                             sh_funcs.append('    ss[%u] << pStruct->%s;' % (index, self.struct_dict[s][m]['name']))
                     value_print = 'ss[%u].str()' % index
diff --git a/vktrace/src/vktrace_extensions/vktracevulkan/vkreplay/vkreplay_vkreplay.cpp b/vktrace/src/vktrace_extensions/vktracevulkan/vkreplay/vkreplay_vkreplay.cpp
index ddaa250..ca1a190 100644
--- a/vktrace/src/vktrace_extensions/vktracevulkan/vkreplay/vkreplay_vkreplay.cpp
+++ b/vktrace/src/vktrace_extensions/vktracevulkan/vkreplay/vkreplay_vkreplay.cpp
@@ -649,17 +649,14 @@
     if (remappedQueue == VK_NULL_HANDLE)
         return VK_ERROR_VALIDATION_FAILED;
 
-    uint64_t remappedFenceHandle = m_objMapper.remap_fences(pPacket->fence.handle);
-    if (pPacket->fence.handle != 0 && remappedFenceHandle == 0)
+    VkFence remappedFence = m_objMapper.remap_fences(pPacket->fence);
+    if (pPacket->fence != VK_NULL_HANDLE && remappedFence == VK_NULL_HANDLE)
         return VK_ERROR_VALIDATION_FAILED;
-    VkFence remappedFence;
-    remappedFence.handle = remappedFenceHandle;
 
     VkSubmitInfo *remappedSubmitInfo = NULL;
     remappedSubmitInfo = VKTRACE_NEW_ARRAY( VkSubmitInfo, pPacket->submitCount);
     VkCmdBuffer *pRemappedBuffers = NULL;
     VkSemaphore *pRemappedWaitSems = NULL, *pRemappedSignalSems = NULL;
-    uint64_t remapHandle = 0;
     for (uint32_t submit_idx = 0; submit_idx < pPacket->submitCount; submit_idx++) {
         const VkSubmitInfo *submit = &pPacket->pSubmitInfo[submit_idx];
         VkSubmitInfo *remappedSubmit = &remappedSubmitInfo[submit_idx];
@@ -684,9 +681,8 @@
             remappedSubmit->pWaitSemaphores = pRemappedWaitSems;
             remappedSubmit->waitSemCount = submit->waitSemCount;
             for (i = 0; i < submit->waitSemCount; i++) {
-                remapHandle = m_objMapper.remap_semaphores((*(submit->pWaitSemaphores + i)).handle);
-                (*(pRemappedWaitSems + i)).handle = remapHandle;
                 //*(pRemappedWaitSems + i)->handle = m_objMapper.remap_semaphores(*(submit->pWaitSemaphores + i));
+                (*(pRemappedWaitSems + i)) = m_objMapper.remap_semaphores((*(submit->pWaitSemaphores + i)));
                 if (*(pRemappedWaitSems + i) == VK_NULL_HANDLE) {
                     VKTRACE_DELETE(remappedSubmitInfo);
                     VKTRACE_DELETE(pRemappedWaitSems);
@@ -699,8 +695,7 @@
             remappedSubmit->pSignalSemaphores = pRemappedSignalSems;
             remappedSubmit->signalSemCount = submit->signalSemCount;
             for (i = 0; i < submit->signalSemCount; i++) {
-                remapHandle = m_objMapper.remap_semaphores((*(submit->pSignalSemaphores + i)).handle);
-                (*(pRemappedSignalSems + i)).handle = remapHandle;
+                (*(pRemappedSignalSems + i)) = m_objMapper.remap_semaphores((*(submit->pSignalSemaphores + i)));
                 if (*(pRemappedSignalSems + i) == VK_NULL_HANDLE) {
                     VKTRACE_DELETE(remappedSubmitInfo);
                     VKTRACE_DELETE(pRemappedSignalSems);
@@ -834,10 +829,10 @@
     // Begin manual code
     VkShaderModule savedModule = pPacket->pCreateInfo->module;
     VkShaderCreateInfo* pNonConstInfo = (VkShaderCreateInfo*)pPacket->pCreateInfo;
-    pNonConstInfo->module.handle = m_objMapper.remap_shadermodules(savedModule.handle);
-    if (savedModule.handle != 0 && pNonConstInfo->module.handle == 0)
+    pNonConstInfo->module = m_objMapper.remap_shadermodules(savedModule);
+    if (savedModule != VK_NULL_HANDLE && pNonConstInfo->module == VK_NULL_HANDLE)
     {
-        pNonConstInfo->module.handle = savedModule.handle;
+        pNonConstInfo->module = savedModule;
         return VK_ERROR_VALIDATION_FAILED;
     }
     // End manual code
@@ -846,7 +841,7 @@
     replayResult = m_vkFuncs.real_vkCreateShader(remappeddevice, pPacket->pCreateInfo, &local_pShader);
     if (replayResult == VK_SUCCESS)
     {
-        m_objMapper.add_to_shaders_map(pPacket->pShader->handle, local_pShader.handle);
+        m_objMapper.add_to_shaders_map(*(pPacket->pShader), local_pShader);
     }
 
     // Begin manual code
@@ -875,8 +870,8 @@
 
     for (uint32_t i = 0; i < pPacket->writeCount; i++)
     {
-        pRemappedWrites[i].destSet.handle = m_objMapper.remap_descriptorsets(pPacket->pDescriptorWrites[i].destSet.handle);
-        if (pRemappedWrites[i].destSet.handle == 0)
+        pRemappedWrites[i].destSet = m_objMapper.remap_descriptorsets(pPacket->pDescriptorWrites[i].destSet);
+        if (pRemappedWrites[i].destSet == VK_NULL_HANDLE)
         {
             vktrace_LogError("Skipping vkUpdateDescriptorSets() due to invalid remapped write VkDescriptorSet.");
             VKTRACE_DELETE(pRemappedWrites);
@@ -890,10 +885,10 @@
             memcpy((void*)pRemappedWrites[i].pImageInfo, pPacket->pDescriptorWrites[i].pImageInfo, pPacket->pDescriptorWrites[i].count * sizeof(VkDescriptorImageInfo));
             for (uint32_t j = 0; j < pPacket->pDescriptorWrites[i].count; j++)
             {
-                if (pPacket->pDescriptorWrites[i].pImageInfo[j].sampler.handle != 0)
+                if (pPacket->pDescriptorWrites[i].pImageInfo[j].sampler != VK_NULL_HANDLE)
                 {
-                    const_cast<VkDescriptorImageInfo*>(pRemappedWrites[i].pImageInfo)[j].sampler.handle = m_objMapper.remap_samplers(pPacket->pDescriptorWrites[i].pImageInfo[j].sampler.handle);
-                    if (pRemappedWrites[i].pImageInfo[j].sampler.handle == 0)
+                    const_cast<VkDescriptorImageInfo*>(pRemappedWrites[i].pImageInfo)[j].sampler = m_objMapper.remap_samplers(pPacket->pDescriptorWrites[i].pImageInfo[j].sampler);
+                    if (pRemappedWrites[i].pImageInfo[j].sampler == VK_NULL_HANDLE)
                     {
                         vktrace_LogError("Skipping vkUpdateDescriptorSets() due to invalid remapped VkSampler.");
                         VKTRACE_DELETE(pRemappedWrites);
@@ -910,10 +905,10 @@
             memcpy((void*)pRemappedWrites[i].pImageInfo, pPacket->pDescriptorWrites[i].pImageInfo, pPacket->pDescriptorWrites[i].count * sizeof(VkDescriptorImageInfo));
             for (uint32_t j = 0; j < pPacket->pDescriptorWrites[i].count; j++)
             {
-                if (pPacket->pDescriptorWrites[i].pImageInfo[j].imageView.handle != 0)
+                if (pPacket->pDescriptorWrites[i].pImageInfo[j].imageView != VK_NULL_HANDLE)
                 {
-                    const_cast<VkDescriptorImageInfo*>(pRemappedWrites[i].pImageInfo)[j].imageView.handle = m_objMapper.remap_imageviews(pPacket->pDescriptorWrites[i].pImageInfo[j].imageView.handle);
-                    if (pRemappedWrites[i].pImageInfo[j].imageView.handle == 0)
+                    const_cast<VkDescriptorImageInfo*>(pRemappedWrites[i].pImageInfo)[j].imageView = m_objMapper.remap_imageviews(pPacket->pDescriptorWrites[i].pImageInfo[j].imageView);
+                    if (pRemappedWrites[i].pImageInfo[j].imageView == VK_NULL_HANDLE)
                     {
                         vktrace_LogError("Skipping vkUpdateDescriptorSets() due to invalid remapped VkImageView.");
                         VKTRACE_DELETE(pRemappedWrites);
@@ -928,10 +923,10 @@
             memcpy((void*)pRemappedWrites[i].pImageInfo, pPacket->pDescriptorWrites[i].pImageInfo, pPacket->pDescriptorWrites[i].count * sizeof(VkDescriptorImageInfo));
             for (uint32_t j = 0; j < pPacket->pDescriptorWrites[i].count; j++)
             {
-                if (pPacket->pDescriptorWrites[i].pImageInfo[j].sampler.handle != 0)
+                if (pPacket->pDescriptorWrites[i].pImageInfo[j].sampler != VK_NULL_HANDLE)
                 {
-                    const_cast<VkDescriptorImageInfo*>(pRemappedWrites[i].pImageInfo)[j].sampler.handle = m_objMapper.remap_samplers(pPacket->pDescriptorWrites[i].pImageInfo[j].sampler.handle);
-                    if (pRemappedWrites[i].pImageInfo[j].sampler.handle == 0)
+                    const_cast<VkDescriptorImageInfo*>(pRemappedWrites[i].pImageInfo)[j].sampler = m_objMapper.remap_samplers(pPacket->pDescriptorWrites[i].pImageInfo[j].sampler);
+                    if (pRemappedWrites[i].pImageInfo[j].sampler == VK_NULL_HANDLE)
                     {
                         vktrace_LogError("Skipping vkUpdateDescriptorSets() due to invalid remapped VkSampler.");
                         VKTRACE_DELETE(pRemappedWrites);
@@ -939,10 +934,10 @@
                         return;
                     }
                 }
-                if (pPacket->pDescriptorWrites[i].pImageInfo[j].imageView.handle != 0)
+                if (pPacket->pDescriptorWrites[i].pImageInfo[j].imageView != VK_NULL_HANDLE)
                 {
-                    const_cast<VkDescriptorImageInfo*>(pRemappedWrites[i].pImageInfo)[j].imageView.handle = m_objMapper.remap_imageviews(pPacket->pDescriptorWrites[i].pImageInfo[j].imageView.handle);
-                    if (pRemappedWrites[i].pImageInfo[j].imageView.handle == 0)
+                    const_cast<VkDescriptorImageInfo*>(pRemappedWrites[i].pImageInfo)[j].imageView = m_objMapper.remap_imageviews(pPacket->pDescriptorWrites[i].pImageInfo[j].imageView);
+                    if (pRemappedWrites[i].pImageInfo[j].imageView == VK_NULL_HANDLE)
                     {
                         vktrace_LogError("Skipping vkUpdateDescriptorSets() due to invalid remapped VkImageView.");
                         VKTRACE_DELETE(pRemappedWrites);
@@ -958,10 +953,10 @@
             memcpy((void*)pRemappedWrites[i].pTexelBufferView, pPacket->pDescriptorWrites[i].pTexelBufferView, pPacket->pDescriptorWrites[i].count * sizeof(VkBufferView));
             for (uint32_t j = 0; j < pPacket->pDescriptorWrites[i].count; j++)
             {
-                if (pPacket->pDescriptorWrites[i].pTexelBufferView[j].handle != 0)
+                if (pPacket->pDescriptorWrites[i].pTexelBufferView[j] != VK_NULL_HANDLE)
                 {
-                    const_cast<VkBufferView*>(pRemappedWrites[i].pTexelBufferView)[j].handle = m_objMapper.remap_bufferviews(pPacket->pDescriptorWrites[i].pTexelBufferView[j].handle);
-                    if (pRemappedWrites[i].pTexelBufferView[j].handle == 0)
+                    const_cast<VkBufferView*>(pRemappedWrites[i].pTexelBufferView)[j] = m_objMapper.remap_bufferviews(pPacket->pDescriptorWrites[i].pTexelBufferView[j]);
+                    if (pRemappedWrites[i].pTexelBufferView[j] == VK_NULL_HANDLE)
                     {
                         vktrace_LogError("Skipping vkUpdateDescriptorSets() due to invalid remapped VkBufferView.");
                         VKTRACE_DELETE(pRemappedWrites);
@@ -979,10 +974,10 @@
             memcpy((void*)pRemappedWrites[i].pBufferInfo, pPacket->pDescriptorWrites[i].pBufferInfo, pPacket->pDescriptorWrites[i].count * sizeof(VkDescriptorBufferInfo));
             for (uint32_t j = 0; j < pPacket->pDescriptorWrites[i].count; j++)
             {
-                if (pPacket->pDescriptorWrites[i].pBufferInfo[j].buffer.handle != 0)
+                if (pPacket->pDescriptorWrites[i].pBufferInfo[j].buffer != VK_NULL_HANDLE)
                 {
-                    const_cast<VkDescriptorBufferInfo*>(pRemappedWrites[i].pBufferInfo)[j].buffer.handle = m_objMapper.remap_buffers(pPacket->pDescriptorWrites[i].pBufferInfo[j].buffer.handle);
-                    if (pRemappedWrites[i].pBufferInfo[j].buffer.handle == 0)
+                    const_cast<VkDescriptorBufferInfo*>(pRemappedWrites[i].pBufferInfo)[j].buffer = m_objMapper.remap_buffers(pPacket->pDescriptorWrites[i].pBufferInfo[j].buffer);
+                    if (pRemappedWrites[i].pBufferInfo[j].buffer == VK_NULL_HANDLE)
                     {
                         vktrace_LogError("Skipping vkUpdateDescriptorSets() due to invalid remapped VkBufferView.");
                         VKTRACE_DELETE(pRemappedWrites);
@@ -999,8 +994,8 @@
 
     for (uint32_t i = 0; i < pPacket->copyCount; i++)
     {
-        pRemappedCopies[i].destSet.handle = m_objMapper.remap_descriptorsets(pPacket->pDescriptorCopies[i].destSet.handle);
-        if (pRemappedCopies[i].destSet.handle == 0)
+        pRemappedCopies[i].destSet = m_objMapper.remap_descriptorsets(pPacket->pDescriptorCopies[i].destSet);
+        if (pRemappedCopies[i].destSet == VK_NULL_HANDLE)
         {
             vktrace_LogError("Skipping vkUpdateDescriptorSets() due to invalid remapped destination VkDescriptorSet.");
             VKTRACE_DELETE(pRemappedWrites);
@@ -1008,8 +1003,8 @@
             return;
         }
 
-        pRemappedCopies[i].srcSet.handle = m_objMapper.remap_descriptorsets(pPacket->pDescriptorCopies[i].srcSet.handle);
-        if (pRemappedCopies[i].srcSet.handle == 0)
+        pRemappedCopies[i].srcSet = m_objMapper.remap_descriptorsets(pPacket->pDescriptorCopies[i].srcSet);
+        if (pRemappedCopies[i].srcSet == VK_NULL_HANDLE)
         {
             vktrace_LogError("Skipping vkUpdateDescriptorSets() due to invalid remapped source VkDescriptorSet.");
             VKTRACE_DELETE(pRemappedWrites);
@@ -1043,7 +1038,7 @@
                     for (unsigned int j = 0; j < pBinding->arraySize; j++)
                     {
                         VkSampler* pSampler = (VkSampler*)&pBinding->pImmutableSamplers[j];
-                        pSampler->handle = m_objMapper.remap_samplers(pBinding->pImmutableSamplers[j].handle);
+                        *pSampler = m_objMapper.remap_samplers(pBinding->pImmutableSamplers[j]);
                     }
                 }
             }
@@ -1054,7 +1049,7 @@
     replayResult = m_vkFuncs.real_vkCreateDescriptorSetLayout(remappedDevice, pPacket->pCreateInfo, &setLayout);
     if (replayResult == VK_SUCCESS)
     {
-        m_objMapper.add_to_descriptorsetlayouts_map(pPacket->pSetLayout->handle, setLayout.handle);
+        m_objMapper.add_to_descriptorsetlayouts_map(*(pPacket->pSetLayout), setLayout);
     }
     return replayResult;
 }
@@ -1068,7 +1063,7 @@
     }
 
     m_vkFuncs.real_vkDestroyDescriptorSetLayout(remappedDevice, pPacket->descriptorSetLayout);
-    m_objMapper.rm_from_descriptorsetlayouts_map(pPacket->descriptorSetLayout.handle);
+    m_objMapper.rm_from_descriptorsetlayouts_map(pPacket->descriptorSetLayout);
 }
 
 VkResult vkReplay::manually_replay_vkAllocDescriptorSets(packet_vkAllocDescriptorSets* pPacket)
@@ -1079,7 +1074,7 @@
     if (remappedDevice == VK_NULL_HANDLE)
         return VK_ERROR_VALIDATION_FAILED;
 
-    VkDescriptorPool descriptorPool;
+    // VkDescriptorPool descriptorPool;
     // descriptorPool.handle = remap_descriptorpools(pPacket->descriptorPool.handle);
 
     VkDescriptorSet* pDescriptorSets = NULL;
@@ -1091,7 +1086,7 @@
     {
         for(uint32_t i = 0; i < pPacket->pAllocInfo->count; ++i)
         {
-           m_objMapper.add_to_descriptorsets_map(pPacket->pDescriptorSets[i].handle, pDescriptorSets[i].handle);
+           m_objMapper.add_to_descriptorsets_map(pPacket->pDescriptorSets[i], pDescriptorSets[i]);
         }
     }
     return replayResult;
@@ -1106,18 +1101,18 @@
         return VK_ERROR_VALIDATION_FAILED;
 
     VkDescriptorPool descriptorPool;
-    descriptorPool.handle = m_objMapper.remap_descriptorpools(pPacket->descriptorPool.handle);
+    descriptorPool = m_objMapper.remap_descriptorpools(pPacket->descriptorPool);
     VkDescriptorSet* localDSs = VKTRACE_NEW_ARRAY(VkDescriptorSet, pPacket->count);
     uint32_t i;
     for (i = 0; i < pPacket->count; ++i) {
-       localDSs[i].handle = m_objMapper.remap_descriptorsets(pPacket->pDescriptorSets[i].handle);
+       localDSs[i] = m_objMapper.remap_descriptorsets(pPacket->pDescriptorSets[i]);
     }
 
     replayResult = m_vkFuncs.real_vkFreeDescriptorSets(remappedDevice, descriptorPool, pPacket->count, localDSs);
     if(replayResult == VK_SUCCESS)
     {
         for (i = 0; i < pPacket->count; ++i) {
-           m_objMapper.rm_from_descriptorsets_map(pPacket->pDescriptorSets[i].handle);
+           m_objMapper.rm_from_descriptorsets_map(pPacket->pDescriptorSets[i]);
         }
     }
     return replayResult;
@@ -1132,14 +1127,12 @@
         return;
     }
 
-    uint64_t remappedLayoutHandle = m_objMapper.remap_pipelinelayouts(pPacket->layout.handle);
-    if (remappedLayoutHandle == 0)
+    VkPipelineLayout remappedLayout = m_objMapper.remap_pipelinelayouts(pPacket->layout);
+    if (remappedLayout == VK_NULL_HANDLE)
     {
         vktrace_LogError("Skipping vkCmdBindDescriptorSets() due to invalid remapped VkPipelineLayout.");
         return;
     }
-    VkPipelineLayout remappedLayout;
-    remappedLayout.handle = remappedLayoutHandle;
 
     VkDescriptorSet* pRemappedSets = (VkDescriptorSet *) vktrace_malloc(sizeof(VkDescriptorSet) * pPacket->setCount);
     if (pRemappedSets == NULL)
@@ -1150,7 +1143,7 @@
 
     for (uint32_t idx = 0; idx < pPacket->setCount && pPacket->pDescriptorSets != NULL; idx++)
     {
-        pRemappedSets[idx].handle = m_objMapper.remap_descriptorsets(pPacket->pDescriptorSets[idx].handle);
+        pRemappedSets[idx] = m_objMapper.remap_descriptorsets(pPacket->pDescriptorSets[idx]);
     }
 
     m_vkFuncs.real_vkCmdBindDescriptorSets(remappedCmdBuffer, pPacket->pipelineBindPoint, remappedLayout, pPacket->firstSet, pPacket->setCount, pRemappedSets, pPacket->dynamicOffsetCount, pPacket->pDynamicOffsets);
@@ -1178,7 +1171,7 @@
         {
             VkBuffer *pBuff = (VkBuffer*) &(pPacket->pBuffers[i]);
             pSaveBuff[i] = pPacket->pBuffers[i];
-            pBuff->handle = m_objMapper.remap_buffers(pPacket->pBuffers[i].handle);
+            *pBuff = m_objMapper.remap_buffers(pPacket->pBuffers[i]);
         }
     }
     m_vkFuncs.real_vkCmdBindVertexBuffers(remappedCmdBuffer, pPacket->startBinding, pPacket->bindingCount, pPacket->pBuffers, pPacket->pOffsets);
@@ -1259,28 +1252,24 @@
 
     VkGraphicsPipelineCreateInfo* pLocalCIs = VKTRACE_NEW_ARRAY(VkGraphicsPipelineCreateInfo, pPacket->count);
     uint32_t i, j;
-    uint64_t tmpHandle;
     for (i=0; i<pPacket->count; i++) {
         memcpy((void*)&(pLocalCIs[i]), (void*)&(pPacket->pCreateInfos[i]), sizeof(VkGraphicsPipelineCreateInfo));
         for (j=0; j < pPacket->pCreateInfos[i].stageCount; j++)
         {
-            pRemappedStages[j].shader.handle = m_objMapper.remap_shaders(pRemappedStages[j].shader.handle);
+            pRemappedStages[j].shader = m_objMapper.remap_shaders(pRemappedStages[j].shader);
         }
         VkPipelineShaderStageCreateInfo** ppSSCI = (VkPipelineShaderStageCreateInfo**)&(pLocalCIs[i].pStages);
         *ppSSCI = pRemappedStages;
 
-        tmpHandle = m_objMapper.remap_pipelinelayouts(pPacket->pCreateInfos[i].layout.handle);
-        memcpy((void*)&(pLocalCIs[i].layout.handle), (void*)&(tmpHandle), sizeof(uint64_t));
+        pLocalCIs[i].layout = m_objMapper.remap_pipelinelayouts(pPacket->pCreateInfos[i].layout);
 
-        tmpHandle = m_objMapper.remap_renderpasss(pPacket->pCreateInfos[i].renderPass.handle);
-        memcpy((void*)&(pLocalCIs[i].renderPass.handle), (void*)&(tmpHandle), sizeof(uint64_t));
+        pLocalCIs[i].renderPass = m_objMapper.remap_renderpasss(pPacket->pCreateInfos[i].renderPass);
 
-        tmpHandle = m_objMapper.remap_pipelines(pPacket->pCreateInfos[i].basePipelineHandle.handle);
-        memcpy((void*)&(pLocalCIs[i].basePipelineHandle.handle), (void*)&(tmpHandle), sizeof(uint64_t));
+        pLocalCIs[i].basePipelineHandle = m_objMapper.remap_pipelines(pPacket->pCreateInfos[i].basePipelineHandle);
     }
 
     VkPipelineCache pipelineCache;
-    pipelineCache.handle = m_objMapper.remap_pipelinecaches(pPacket->pipelineCache.handle);
+    pipelineCache = m_objMapper.remap_pipelinecaches(pPacket->pipelineCache);
     uint32_t count = pPacket->count;
 
     VkPipeline *local_pPipelines = VKTRACE_NEW_ARRAY(VkPipeline, pPacket->count);
@@ -1290,7 +1279,7 @@
     if (replayResult == VK_SUCCESS)
     {
         for (i = 0; i < pPacket->count; i++) {
-            m_objMapper.add_to_pipelines_map(pPacket->pPipelines[i].handle, local_pPipelines[i].handle);
+            m_objMapper.add_to_pipelines_map(pPacket->pPipelines[i], local_pPipelines[i]);
         }
     }
 
@@ -1319,13 +1308,13 @@
     for (i = 0; (i < pPacket->pCreateInfo->descriptorSetCount) && (pPacket->pCreateInfo->pSetLayouts != NULL); i++) {
         VkDescriptorSetLayout* pSL = (VkDescriptorSetLayout*) &(pPacket->pCreateInfo->pSetLayouts[i]);
         pSaveLayouts[i] = pPacket->pCreateInfo->pSetLayouts[i];
-        pSL->handle = m_objMapper.remap_descriptorsetlayouts(pPacket->pCreateInfo->pSetLayouts[i].handle);
+        *pSL = m_objMapper.remap_descriptorsetlayouts(pPacket->pCreateInfo->pSetLayouts[i]);
     }
     VkPipelineLayout localPipelineLayout;
     replayResult = m_vkFuncs.real_vkCreatePipelineLayout(remappedDevice, pPacket->pCreateInfo, &localPipelineLayout);
     if (replayResult == VK_SUCCESS)
     {
-        m_objMapper.add_to_pipelinelayouts_map(pPacket->pPipelineLayout->handle, localPipelineLayout.handle);
+        m_objMapper.add_to_pipelinelayouts_map(*(pPacket->pPipelineLayout), localPipelineLayout);
     }
     // restore packet to contain the original Set Layouts before being remapped.
     for (uint32_t k = 0; k < i; k++) {
@@ -1353,7 +1342,7 @@
     {
         VkEvent *pEvent = (VkEvent *) &(pPacket->pEvents[idx]);
         saveEvent[idx] = pPacket->pEvents[idx];
-        pEvent->handle = m_objMapper.remap_events(pPacket->pEvents[idx].handle);
+        *pEvent = m_objMapper.remap_events(pPacket->pEvents[idx]);
     }
 
     VkBuffer* saveBuf = VKTRACE_NEW_ARRAY(VkBuffer, pPacket->memBarrierCount);
@@ -1365,11 +1354,11 @@
         if (pNext->sType == VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER) {
             VkBufferMemoryBarrier *pNextBuf = (VkBufferMemoryBarrier *) pPacket->ppMemBarriers[idx];
             saveBuf[numRemapBuf++] = pNextBuf->buffer;
-            pNextBuf->buffer.handle = m_objMapper.remap_buffers(pNextBuf->buffer.handle);
+            pNextBuf->buffer = m_objMapper.remap_buffers(pNextBuf->buffer);
         } else if (pNext->sType == VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER) {
             VkImageMemoryBarrier *pNextImg = (VkImageMemoryBarrier *) pPacket->ppMemBarriers[idx];
             saveImg[numRemapImg++] = pNextImg->image;
-            pNextImg->image.handle = m_objMapper.remap_images(pNextImg->image.handle);
+            pNextImg->image = m_objMapper.remap_images(pNextImg->image);
         }
     }
     m_vkFuncs.real_vkCmdWaitEvents(remappedCmdBuffer, pPacket->eventCount, pPacket->pEvents, pPacket->srcStageMask, pPacket->destStageMask, pPacket->memBarrierCount, pPacket->ppMemBarriers);
@@ -1414,11 +1403,11 @@
         if (pNext->sType == VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER) {
             VkBufferMemoryBarrier *pNextBuf = (VkBufferMemoryBarrier *) pPacket->ppMemBarriers[idx];
             saveBuf[numRemapBuf++] = pNextBuf->buffer;
-            pNextBuf->buffer.handle = m_objMapper.remap_buffers(pNextBuf->buffer.handle);
+            pNextBuf->buffer = m_objMapper.remap_buffers(pNextBuf->buffer);
         } else if (pNext->sType == VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER) {
             VkImageMemoryBarrier *pNextImg = (VkImageMemoryBarrier *) pPacket->ppMemBarriers[idx];
             saveImg[numRemapImg++] = pNextImg->image;
-            pNextImg->image.handle = m_objMapper.remap_images(pNextImg->image.handle);
+            pNextImg->image = m_objMapper.remap_images(pNextImg->image);
         }
     }
     m_vkFuncs.real_vkCmdPipelineBarrier(remappedCmdBuffer, pPacket->srcStageMask, pPacket->destStageMask, pPacket->byRegion, pPacket->memBarrierCount, pPacket->ppMemBarriers);
@@ -1455,20 +1444,20 @@
         memcpy(pAttachments, pSavedAttachments, sizeof(VkImageView) * pInfo->attachmentCount);
         for (uint32_t i = 0; i < pInfo->attachmentCount; i++)
         {
-            pAttachments[i].handle = m_objMapper.remap_imageviews(pInfo->pAttachments[i].handle);
+            pAttachments[i] = m_objMapper.remap_imageviews(pInfo->pAttachments[i]);
         }
         pInfo->pAttachments = pAttachments;
     }
-    uint64_t savedRPHandle = pPacket->pCreateInfo->renderPass.handle;
-    pInfo->renderPass.handle = m_objMapper.remap_renderpasss(pPacket->pCreateInfo->renderPass.handle);
+    VkRenderPass savedRP = pPacket->pCreateInfo->renderPass;
+    pInfo->renderPass = m_objMapper.remap_renderpasss(pPacket->pCreateInfo->renderPass);
 
     VkFramebuffer local_framebuffer;
     replayResult = m_vkFuncs.real_vkCreateFramebuffer(remappedDevice, pPacket->pCreateInfo, &local_framebuffer);
     pInfo->pAttachments = pSavedAttachments;
-    pInfo->renderPass.handle = savedRPHandle;
+    pInfo->renderPass = savedRP;
     if (replayResult == VK_SUCCESS)
     {
-        m_objMapper.add_to_framebuffers_map(pPacket->pFramebuffer->handle, local_framebuffer.handle);
+        m_objMapper.add_to_framebuffers_map(*(pPacket->pFramebuffer), local_framebuffer);
     }
     if (allocatedAttachments)
     {
@@ -1489,7 +1478,7 @@
     replayResult = m_vkFuncs.real_vkCreateRenderPass(remappedDevice, pPacket->pCreateInfo, &local_renderpass);
     if (replayResult == VK_SUCCESS)
     {
-        m_objMapper.add_to_renderpasss_map(pPacket->pRenderPass->handle, local_renderpass.handle);
+        m_objMapper.add_to_renderpasss_map(*(pPacket->pRenderPass), local_renderpass);
     }
     return replayResult;
 }
@@ -1505,8 +1494,8 @@
     VkRenderPassBeginInfo local_renderPassBeginInfo;
     memcpy((void*)&local_renderPassBeginInfo, (void*)pPacket->pRenderPassBegin, sizeof(VkRenderPassBeginInfo));
     local_renderPassBeginInfo.pClearValues = (const VkClearValue*)pPacket->pRenderPassBegin->pClearValues;
-    local_renderPassBeginInfo.framebuffer.handle = m_objMapper.remap_framebuffers(pPacket->pRenderPassBegin->framebuffer.handle);
-    local_renderPassBeginInfo.renderPass.handle = m_objMapper.remap_renderpasss(pPacket->pRenderPassBegin->renderPass.handle);
+    local_renderPassBeginInfo.framebuffer = m_objMapper.remap_framebuffers(pPacket->pRenderPassBegin->framebuffer);
+    local_renderPassBeginInfo.renderPass = m_objMapper.remap_renderpasss(pPacket->pRenderPassBegin->renderPass);
     m_vkFuncs.real_vkCmdBeginRenderPass(remappedCmdBuffer, &local_renderPassBeginInfo, pPacket->contents);
     return;
 }
@@ -1529,8 +1518,8 @@
         savedFB = pInfo->framebuffer;
         pRP = &(pInfo->renderPass);
         pFB = &(pInfo->framebuffer);
-        pRP->handle = m_objMapper.remap_renderpasss(savedRP.handle);
-        pFB->handle = m_objMapper.remap_framebuffers(savedFB.handle);
+        *pRP = m_objMapper.remap_renderpasss(savedRP);
+        *pFB = m_objMapper.remap_framebuffers(savedFB);
     }
     replayResult = m_vkFuncs.real_vkBeginCommandBuffer(remappedCmdBuffer, pPacket->pBeginInfo);
     if (pInfo != NULL) {
@@ -1607,7 +1596,7 @@
     VkFence *pFence = VKTRACE_NEW_ARRAY(VkFence, pPacket->fenceCount);
     for (i = 0; i < pPacket->fenceCount; i++)
     {
-        (*(pFence + i)).handle = m_objMapper.remap_fences((*(pPacket->pFences + i)).handle);
+        (*(pFence + i)) = m_objMapper.remap_fences((*(pPacket->pFences + i)));
     }
     replayResult = m_vkFuncs.real_vkWaitForFences(remappedDevice, pPacket->fenceCount, pFence, pPacket->waitAll, pPacket->timeout);
     VKTRACE_DELETE(pFence);
@@ -1631,7 +1620,7 @@
         local_mem.pGpuMem = new (gpuMemory);
         if (local_mem.pGpuMem)
             local_mem.pGpuMem->setAllocInfo(pPacket->pAllocInfo, m_objMapper.m_adjustForGPU);
-        m_objMapper.add_to_devicememorys_map(pPacket->pMem->handle, local_mem);
+        m_objMapper.add_to_devicememorys_map(*(pPacket->pMem), local_mem);
     }
     return replayResult;
 }
@@ -1645,11 +1634,11 @@
     }
 
     gpuMemObj local_mem;
-    local_mem = m_objMapper.m_devicememorys.find(pPacket->mem.handle)->second;
+    local_mem = m_objMapper.m_devicememorys.find(pPacket->mem)->second;
     // TODO how/when to free pendingAlloc that did not use and existing gpuMemObj
     m_vkFuncs.real_vkFreeMemory(remappedDevice, local_mem.replayGpuMem);
     delete local_mem.pGpuMem;
-    m_objMapper.rm_from_devicememorys_map(pPacket->mem.handle);
+    m_objMapper.rm_from_devicememorys_map(pPacket->mem);
 }
 
 VkResult vkReplay::manually_replay_vkMapMemory(packet_vkMapMemory* pPacket)
@@ -1660,7 +1649,7 @@
     if (remappedDevice == VK_NULL_HANDLE)
         return VK_ERROR_VALIDATION_FAILED;
 
-    gpuMemObj local_mem = m_objMapper.m_devicememorys.find(pPacket->mem.handle)->second;
+    gpuMemObj local_mem = m_objMapper.m_devicememorys.find(pPacket->mem)->second;
     void* pData;
     if (!local_mem.pGpuMem->isPendingAlloc())
     {
@@ -1691,7 +1680,7 @@
         return;
     }
 
-    gpuMemObj local_mem = m_objMapper.m_devicememorys.find(pPacket->mem.handle)->second;
+    gpuMemObj local_mem = m_objMapper.m_devicememorys.find(pPacket->mem)->second;
     if (!local_mem.pGpuMem->isPendingAlloc())
     {
         if (local_mem.pGpuMem)
@@ -1730,9 +1719,9 @@
     gpuMemObj* pLocalMems = VKTRACE_NEW_ARRAY(gpuMemObj, pPacket->memRangeCount);
     for (uint32_t i = 0; i < pPacket->memRangeCount; i++)
     {
-        pLocalMems[i] = m_objMapper.m_devicememorys.find(pPacket->pMemRanges[i].mem.handle)->second;
-        localRanges[i].mem.handle = m_objMapper.remap_devicememorys(pPacket->pMemRanges[i].mem.handle);
-        if (localRanges[i].mem.handle == 0 || pLocalMems[i].pGpuMem == NULL)
+        pLocalMems[i] = m_objMapper.m_devicememorys.find(pPacket->pMemRanges[i].mem)->second;
+        localRanges[i].mem = m_objMapper.remap_devicememorys(pPacket->pMemRanges[i].mem);
+        if (localRanges[i].mem == VK_NULL_HANDLE || pLocalMems[i].pGpuMem == NULL)
         {
             VKTRACE_DELETE(localRanges);
             VKTRACE_DELETE(pLocalMems);
@@ -1842,7 +1831,7 @@
 //        return vktrace_replay::VKTRACE_REPLAY_ERROR;
 //    }
     save_oldSwapchain = pPacket->pCreateInfo->oldSwapchain;
-    (*pSC) = m_objMapper.remap_swapchainkhrs(save_oldSwapchain.handle);
+    (*pSC) = m_objMapper.remap_swapchainkhrs(save_oldSwapchain);
     VkSurfaceDescriptionKHR** ppSD = (VkSurfaceDescriptionKHR**)&(pPacket->pCreateInfo->pSurfaceDescription);
     *ppSD = (VkSurfaceDescriptionKHR*) m_display->get_surface_description();
 
@@ -1850,7 +1839,7 @@
     replayResult = m_vkFuncs.real_vkCreateSwapchainKHR(remappeddevice, pPacket->pCreateInfo, &local_pSwapchain);
     if (replayResult == VK_SUCCESS)
     {
-        m_objMapper.add_to_swapchainkhrs_map(pPacket->pSwapchain->handle, local_pSwapchain.handle);
+        m_objMapper.add_to_swapchainkhrs_map(*(pPacket->pSwapchain), local_pSwapchain);
     }
 
     (*pSC) = save_oldSwapchain;
@@ -1868,16 +1857,16 @@
 //    }
 
     VkSwapchainKHR remappedswapchain;
-    remappedswapchain.handle = m_objMapper.remap_swapchainkhrs(pPacket->swapchain.handle);
+    remappedswapchain = m_objMapper.remap_swapchainkhrs(pPacket->swapchain);
 
-    uint64_t packetImageHandles[128] = {0};
+    VkImage packetImage[128] = {0};
     uint32_t numImages = 0;
     if (pPacket->pSwapchainImages != NULL) {
         // Need to store the images and then add to map after we get actual image handles back
         VkImage* pPacketImages = (VkImage*)pPacket->pSwapchainImages;
         numImages = *(pPacket->pCount);
         for (uint32_t i = 0; i < numImages; i++) {
-            packetImageHandles[i] = (uint64_t) pPacketImages[i].handle;
+            packetImage[i] = pPacketImages[i];
         }
     }
 
@@ -1888,8 +1877,8 @@
             VkImage* pReplayImages = (VkImage*)pPacket->pSwapchainImages;
             for (uint32_t i = 0; i < numImages; i++) {
                 imageObj local_imageObj;
-                local_imageObj.replayImage.handle = pReplayImages[i].handle;
-                m_objMapper.add_to_images_map(packetImageHandles[i], local_imageObj);
+                local_imageObj.replayImage = pReplayImages[i];
+                m_objMapper.add_to_images_map(packetImage[i], local_imageObj);
             }
         }
     }
@@ -1904,7 +1893,7 @@
     uint32_t i;
     VkSwapchainKHR* remappedswapchains = VKTRACE_NEW_ARRAY(VkSwapchainKHR, pPacket->pPresentInfo->swapchainCount);
     for (i=0; i<pPacket->pPresentInfo->swapchainCount; i++) {
-        remappedswapchains[i].handle = m_objMapper.remap_swapchainkhrs(pPacket->pPresentInfo->swapchains[i].handle);
+        remappedswapchains[i] = m_objMapper.remap_swapchainkhrs(pPacket->pPresentInfo->swapchains[i]);
     }
     // TODO : Probably need some kind of remapping from image indices grabbed w/
     //   AcquireNextImageKHR call, and then the indicies that are passed in here
@@ -1941,7 +1930,7 @@
         replayResult = m_vkFuncs.real_vkDbgCreateMsgCallback(remappedInstance, pPacket->msgFlags, g_fpDbgMsgCallback, NULL, &local_msgCallback);
         if (replayResult == VK_SUCCESS)
         {
-                m_objMapper.add_to_dbgmsgcallbacks_map(pPacket->pMsgCallback->handle, local_msgCallback.handle);
+                m_objMapper.add_to_dbgmsgcallbacks_map(*(pPacket->pMsgCallback), local_msgCallback);
         }
     }
     return replayResult;
@@ -1952,7 +1941,7 @@
     VkResult replayResult = VK_SUCCESS;
     VkInstance remappedInstance = m_objMapper.remap_instances(pPacket->instance);
     VkDbgMsgCallback remappedMsgCallback;
-    remappedMsgCallback.handle = m_objMapper.remap_dbgmsgcallbacks(pPacket->msgCallback.handle);
+    remappedMsgCallback = m_objMapper.remap_dbgmsgcallbacks(pPacket->msgCallback);
     if (!g_fpDbgMsgCallback) {
         // just eat this call as we don't have local call back function defined
         return VK_SUCCESS;
@@ -1976,12 +1965,12 @@
 
     VkCmdBuffer *local_pCmdBuffers = new VkCmdBuffer[pPacket->pAllocInfo->count];
     VkCmdPool local_CmdPool;
-    local_CmdPool.handle = pPacket->pAllocInfo->cmdPool.handle;
-    uint64_t remappedCmdPoolHandle = m_objMapper.remap_cmdpools(pPacket->pAllocInfo->cmdPool.handle);
-    memcpy((void*)&(pPacket->pAllocInfo->cmdPool.handle), (void*)&(remappedCmdPoolHandle), sizeof(uint64_t));
+    local_CmdPool = pPacket->pAllocInfo->cmdPool;
+    ((VkCmdBufferAllocInfo *) pPacket->pAllocInfo)->cmdPool = m_objMapper.remap_cmdpools(pPacket->pAllocInfo->cmdPool);
 
     replayResult = m_vkFuncs.real_vkAllocCommandBuffers(remappeddevice, pPacket->pAllocInfo, local_pCmdBuffers);
-    memcpy((void*)&(pPacket->pAllocInfo->cmdPool.handle), (void*)&(local_CmdPool.handle), sizeof(uint64_t));
+    ((VkCmdBufferAllocInfo *) pPacket->pAllocInfo)->cmdPool = local_CmdPool;
+
     if (replayResult == VK_SUCCESS)
     {
         for (uint32_t i = 0; i < pPacket->pAllocInfo->count; i++) {
diff --git a/vktrace/src/vktrace_layer/vktrace_lib_helpers.h b/vktrace/src/vktrace_layer/vktrace_lib_helpers.h
index c413874..7526ab8 100644
--- a/vktrace/src/vktrace_layer/vktrace_lib_helpers.h
+++ b/vktrace/src/vktrace_layer/vktrace_lib_helpers.h
@@ -158,13 +158,13 @@
     VKAllocInfo *entry;
     unsigned int i;
     entry = g_memInfo.pEntrys;
-    if (g_memInfo.pLastMapped && g_memInfo.pLastMapped->handle.handle == handle.handle && g_memInfo.pLastMapped->valid)
+    if (g_memInfo.pLastMapped && g_memInfo.pLastMapped->handle == handle && g_memInfo.pLastMapped->valid)
     {
         return g_memInfo.pLastMapped;
     }
     for (i = 0; i < g_memInfo.numEntrys; i++)
     {
-        if ((entry + i)->valid && (handle.handle == (entry + i)->handle.handle))
+        if ((entry + i)->valid && (handle == (entry + i)->handle))
         {
             return entry + i;
         }
diff --git a/vktrace/src/vktrace_layer/vktrace_lib_trace.cpp b/vktrace/src/vktrace_layer/vktrace_lib_trace.cpp
index b4d1f2c..481493e 100644
--- a/vktrace/src/vktrace_layer/vktrace_lib_trace.cpp
+++ b/vktrace/src/vktrace_layer/vktrace_lib_trace.cpp
@@ -192,7 +192,7 @@
     pPacket = interpret_body_as_vkUnmapMemory(pHeader);
     if (siz)
     {
-        assert(entry->handle.handle == mem.handle);
+        assert(entry->handle == mem);
         vktrace_add_buffer_to_trace_packet(pHeader, (void**) &(pPacket->pData), siz, entry->pData + off);
         vktrace_finalize_buffer_address(pHeader, (void**)&(pPacket->pData));
         entry->pData = NULL;
@@ -264,7 +264,7 @@
 
         if (pEntry != NULL)
         {
-            assert(pEntry->handle.handle == pRange->mem.handle);
+            assert(pEntry->handle == pRange->mem);
             assert(pEntry->totalSize >= (pRange->size + pRange->offset));
             assert(pEntry->totalSize >= pRange->size);
             assert(pRange->offset >= pEntry->rangeOffset && (pRange->offset + pRange->size) <= (pEntry->rangeOffset + pEntry->rangeSize));
diff --git a/vktrace/vktrace_generate.py b/vktrace/vktrace_generate.py
index f214522..415cddb 100755
--- a/vktrace/vktrace_generate.py
+++ b/vktrace/vktrace_generate.py
@@ -1213,7 +1213,7 @@
         rc_body.append('    switch (objectType) {')
         rc_body.append('        case VK_OBJECT_TYPE_BUFFER:')
         rc_body.append('        {')
-        rc_body.append('            std::map<uint64_t, bufferObj>::iterator it = m_buffers.find(handle);')
+        rc_body.append('            std::map<VkBuffer, bufferObj>::iterator it = m_buffers.find((VkBuffer) handle);')
         rc_body.append('            if (it != m_buffers.end()) {')
         rc_body.append('                objMemory obj = it->second.bufferMem;')
         rc_body.append('                obj.setCount(num);')
@@ -1223,7 +1223,7 @@
         rc_body.append('        }')
         rc_body.append('        case VK_OBJECT_TYPE_IMAGE:')
         rc_body.append('        {')
-        rc_body.append('            std::map<uint64_t, imageObj>::iterator it = m_images.find(handle);')
+        rc_body.append('            std::map<VkImage, imageObj>::iterator it = m_images.find((VkImage) handle);')
         rc_body.append('            if (it != m_images.end()) {')
         rc_body.append('                objMemory obj = it->second.imageMem;')
         rc_body.append('                obj.setCount(num);')
@@ -1240,7 +1240,7 @@
         rc_body.append('    switch (objectType) {')
         rc_body.append('        case VK_OBJECT_TYPE_BUFFER:')
         rc_body.append('        {')
-        rc_body.append('            std::map<uint64_t, bufferObj>::iterator it = m_buffers.find(handle);')
+        rc_body.append('            std::map<VkBuffer, bufferObj>::iterator it = m_buffers.find((VkBuffer) handle);')
         rc_body.append('            if (it != m_buffers.end()) {')
         rc_body.append('                objMemory obj = it->second.bufferMem;')
         rc_body.append('                obj.setReqs(pMemReqs, num);')
@@ -1250,7 +1250,7 @@
         rc_body.append('        }')
         rc_body.append('        case VK_OBJECT_TYPE_IMAGE:')
         rc_body.append('        {')
-        rc_body.append('            std::map<uint64_t, imageObj>::iterator it = m_images.find(handle);')
+        rc_body.append('            std::map<VkImage, imageObj>::iterator it = m_images.find((VkImage) handle);')
         rc_body.append('            if (it != m_images.end()) {')
         rc_body.append('                objMemory obj = it->second.imageMem;')
         rc_body.append('                obj.setReqs(pMemReqs, num);')
@@ -1270,53 +1270,47 @@
         rc_body.append('    }\n')
         disp_obj_types = [obj for obj in vulkan.object_dispatch_list]
         for var in sorted(obj_map_dict):
-            # Disp objs are pts so the obj can be map key, for non-disp objs, use uint64_t handle as map key
-            if obj_map_dict[var] in disp_obj_types:
+            if obj_map_dict[var] == 'VkImage':
+                rc_body.append(self._map_decl('VkImage', 'imageObj', var))
+                rc_body.append(self._add_to_map_decl('VkImage', 'imageObj', var))
+                rc_body.append(self._rm_from_map_decl('VkImage', var))
+                rc_body.append('    VkImage remap_images(const VkImage& value)')
+                rc_body.append('    {')
+                rc_body.append('        if (value == 0) { return 0; }')
+                rc_body.append('')
+                rc_body.append('        std::map<VkImage, imageObj>::const_iterator q = m_images.find(value);')
+                rc_body.append('        if (q == m_images.end()) { vktrace_LogError("Failed to remap VkImage."); return value; }\n')
+                rc_body.append('        return q->second.replayImage;')
+                rc_body.append('    }\n')
+            elif obj_map_dict[var] == 'VkBuffer':
+                rc_body.append(self._map_decl('VkBuffer', 'bufferObj', var))
+                rc_body.append(self._add_to_map_decl('VkBuffer', 'bufferObj', var))
+                rc_body.append(self._rm_from_map_decl('VkBuffer', var))
+                rc_body.append('    VkBuffer remap_buffers(const VkBuffer& value)')
+                rc_body.append('    {')
+                rc_body.append('        if (value == 0) { return 0; }')
+                rc_body.append('')
+                rc_body.append('        std::map<VkBuffer, bufferObj>::const_iterator q = m_buffers.find(value);')
+                rc_body.append('        if (q == m_buffers.end()) { vktrace_LogError("Failed to remap VkBuffer."); return value; }\n')
+                rc_body.append('        return q->second.replayBuffer;')
+                rc_body.append('    }\n')
+            elif obj_map_dict[var] == 'VkDeviceMemory':
+                rc_body.append(self._map_decl('VkDeviceMemory', 'gpuMemObj', var))
+                rc_body.append(self._add_to_map_decl('VkDeviceMemory', 'gpuMemObj', var))
+                rc_body.append(self._rm_from_map_decl('VkDeviceMemory', var))
+                rc_body.append('    VkDeviceMemory remap_devicememorys(const VkDeviceMemory& value)')
+                rc_body.append('    {')
+                rc_body.append('        if (value == 0) { return 0; }')
+                rc_body.append('')
+                rc_body.append('        std::map<VkDeviceMemory, gpuMemObj>::const_iterator q = m_devicememorys.find(value);')
+                rc_body.append('        if (q == m_devicememorys.end()) { vktrace_LogError("Failed to remap VkDeviceMemory."); return value; }')
+                rc_body.append('        return q->second.replayGpuMem;')
+                rc_body.append('    }\n')
+            else:
                 rc_body.append(self._map_decl(obj_map_dict[var], obj_map_dict[var], var))
                 rc_body.append(self._add_to_map_decl(obj_map_dict[var], obj_map_dict[var], var))
                 rc_body.append(self._rm_from_map_decl(obj_map_dict[var], var))
                 rc_body.append(self._remap_decl(obj_map_dict[var], var))
-            elif obj_map_dict[var] == 'VkImage':
-                rc_body.append(self._map_decl('uint64_t', 'imageObj', var))
-                rc_body.append(self._add_to_map_decl('uint64_t', 'imageObj', var))
-                rc_body.append(self._rm_from_map_decl('uint64_t', var))
-                rc_body.append('    uint64_t remap_images(const uint64_t& value)')
-                rc_body.append('    {')
-                rc_body.append('        if (value == 0) { return 0; }')
-                rc_body.append('')
-                rc_body.append('        std::map<uint64_t, imageObj>::const_iterator q = m_images.find(value);')
-                rc_body.append('        if (q == m_images.end()) { vktrace_LogError("Failed to remap VkImage."); return value; }\n')
-                rc_body.append('        return q->second.replayImage.handle;')
-                rc_body.append('    }\n')
-            elif obj_map_dict[var] == 'VkBuffer':
-                rc_body.append(self._map_decl('uint64_t', 'bufferObj', var))
-                rc_body.append(self._add_to_map_decl('uint64_t', 'bufferObj', var))
-                rc_body.append(self._rm_from_map_decl('uint64_t', var))
-                rc_body.append('    uint64_t remap_buffers(const uint64_t& value)')
-                rc_body.append('    {')
-                rc_body.append('        if (value == 0) { return 0; }')
-                rc_body.append('')
-                rc_body.append('        std::map<uint64_t, bufferObj>::const_iterator q = m_buffers.find(value);')
-                rc_body.append('        if (q == m_buffers.end()) { vktrace_LogError("Failed to remap VkBuffer."); return value; }\n')
-                rc_body.append('        return q->second.replayBuffer.handle;')
-                rc_body.append('    }\n')
-            elif obj_map_dict[var] == 'VkDeviceMemory':
-                rc_body.append(self._map_decl('uint64_t', 'gpuMemObj', var))
-                rc_body.append(self._add_to_map_decl('uint64_t', 'gpuMemObj', var))
-                rc_body.append(self._rm_from_map_decl('uint64_t', var))
-                rc_body.append('    uint64_t remap_devicememorys(const uint64_t& value)')
-                rc_body.append('    {')
-                rc_body.append('        if (value == 0) { return 0; }')
-                rc_body.append('')
-                rc_body.append('        std::map<uint64_t, gpuMemObj>::const_iterator q = m_devicememorys.find(value);')
-                rc_body.append('        if (q == m_devicememorys.end()) { vktrace_LogError("Failed to remap VkDeviceMemory."); return value; }')
-                rc_body.append('        return q->second.replayGpuMem.handle;')
-                rc_body.append('    }\n')
-            else:
-                rc_body.append(self._map_decl('uint64_t', 'uint64_t', var))
-                rc_body.append(self._add_to_map_decl('uint64_t', 'uint64_t', var))
-                rc_body.append(self._rm_from_map_decl('uint64_t', var))
-                rc_body.append(self._remap_decl('uint64_t', var))
         # VkDynamicStateObject code
 # TODO138 : Each dynamic state object is now unique so need to make sure their re-mapping is being handled correctly
 #        state_obj_remap_types = vulkan.object_dynamic_state_list
@@ -1389,33 +1383,20 @@
                         result = '            %s *remapped%s = new %s%s;\n' % (cleanParamType, paramName, cleanParamType, pArray)
                         result += '%s\n' % self.lineinfo.get()
                         result += '            for (uint32_t i = 0; i < pPacket->%s; i++) {\n' % lastName
-                        if cleanParamType in  VulkNonDispObjects:
-                            result += '                remapped%s[i].handle = m_objMapper.remap_%ss(pPacket->%s[i]%s.handle);\n' % (paramName, cleanParamType.lower()[2:], paramName, objectTypeRemapParam)
-                            result += '                if (pPacket->%s[i].handle != 0 && remapped%s[i].handle == 0)\n' % (paramName, paramName)
-                        else:
-                            result += '                remapped%s[i] = m_objMapper.remap_%ss(pPacket->%s[i]%s);\n' % (paramName, cleanParamType.lower()[2:], paramName, objectTypeRemapParam)
-                            result += '                if (pPacket->%s[i] != VK_NULL_HANDLE && remapped%s[i] == VK_NULL_HANDLE)\n' % (paramName, paramName)
+                        result += '                remapped%s[i] = m_objMapper.remap_%ss(pPacket->%s[i]%s);\n' % (paramName, cleanParamType.lower()[2:], paramName, objectTypeRemapParam)
+                        result += '                if (pPacket->%s[i] != VK_NULL_HANDLE && remapped%s[i] == VK_NULL_HANDLE)\n' % (paramName, paramName)
                         result += '                {\n'
                         result += '                    return vktrace_replay::VKTRACE_REPLAY_ERROR;\n'
                         result += '                }\n'
                         result += '            }\n'
                         return result
 
-                if paramType in VulkNonDispObjects:
-                    result = '            %s remapped%s;\n' % (paramType, paramName)
-                    result += '            remapped%s.handle = m_objMapper.remap_%ss(pPacket->%s%s.handle);\n' % (paramName, cleanParamType.lower()[2:], paramName, objectTypeRemapParam)
-                    result += '%s\n' % self.lineinfo.get()
-                    result += '            if (pPacket->%s.handle != 0 && remapped%s.handle == 0)\n' % (paramName, paramName)
-                    result += '            {\n'
-                    result += '                return vktrace_replay::VKTRACE_REPLAY_ERROR;\n'
-                    result += '            }\n'
-                else:
-                    result = '            %s remapped%s = m_objMapper.remap_%ss(pPacket->%s%s);\n' % (paramType, paramName, cleanParamType.lower()[2:], paramName, objectTypeRemapParam)
-                    result += '%s\n' % self.lineinfo.get()
-                    result += '            if (pPacket->%s != VK_NULL_HANDLE && remapped%s == VK_NULL_HANDLE)\n' % (paramName, paramName)
-                    result += '            {\n'
-                    result += '                return vktrace_replay::VKTRACE_REPLAY_ERROR;\n'
-                    result += '            }\n'
+                result = '            %s remapped%s = m_objMapper.remap_%ss(pPacket->%s%s);\n' % (paramType, paramName, cleanParamType.lower()[2:], paramName, objectTypeRemapParam)
+                result += '%s\n' % self.lineinfo.get()
+                result += '            if (pPacket->%s != VK_NULL_HANDLE && remapped%s == VK_NULL_HANDLE)\n' % (paramName, paramName)
+                result += '            {\n'
+                result += '                return vktrace_replay::VKTRACE_REPLAY_ERROR;\n'
+                result += '            }\n'
                 return result
         return '            // No need to remap %s' % (paramName)
 
@@ -1446,7 +1427,7 @@
         ci_body.append('            replayResult = m_vkFuncs.real_vkCreateImage(remappedDevice, pPacket->pCreateInfo, &local_imageObj.replayImage);')
         ci_body.append('            if (replayResult == VK_SUCCESS)')
         ci_body.append('            {')
-        ci_body.append('                m_objMapper.add_to_images_map(pPacket->pImage->handle, local_imageObj);')
+        ci_body.append('                m_objMapper.add_to_images_map(*(pPacket->pImage), local_imageObj);')
         ci_body.append('            }')
         return "\n".join(ci_body)
 
@@ -1461,7 +1442,7 @@
         cb_body.append('            replayResult = m_vkFuncs.real_vkCreateBuffer(remappedDevice, pPacket->pCreateInfo, &local_bufferObj.replayBuffer);')
         cb_body.append('            if (replayResult == VK_SUCCESS)')
         cb_body.append('            {')
-        cb_body.append('                m_objMapper.add_to_buffers_map(pPacket->pBuffer->handle, local_bufferObj);')
+        cb_body.append('                m_objMapper.add_to_buffers_map(*(pPacket->pBuffer), local_bufferObj);')
         cb_body.append('            }')
         return "\n".join(cb_body)
 
@@ -1579,11 +1560,11 @@
                     rbody.append('            %s createInfo;' % (proto.params[1].ty.strip('*').replace('const ', '')))
                     rbody.append('            memcpy(&createInfo, pPacket->pCreateInfo, sizeof(%s));' % (proto.params[1].ty.strip('*').replace('const ', '')))
                     if 'CreateComputePipeline' == proto.name:
-                        rbody.append('            createInfo.cs.shader.handle = m_objMapper.remap_shaders(pPacket->pCreateInfo->cs.shader.handle);')
+                        rbody.append('            createInfo.cs.shader = m_objMapper.remap_shaders(pPacket->pCreateInfo->cs.shader);')
                     elif 'CreateBufferView' == proto.name:
-                        rbody.append('            createInfo.buffer.handle = m_objMapper.remap_buffers(pPacket->pCreateInfo->buffer.handle);')
+                        rbody.append('            createInfo.buffer = m_objMapper.remap_buffers(pPacket->pCreateInfo->buffer);')
                     else:
-                        rbody.append('            createInfo.image.handle = m_objMapper.remap_images(pPacket->pCreateInfo->image.handle);')
+                        rbody.append('            createInfo.image = m_objMapper.remap_images(pPacket->pCreateInfo->image);')
                     rbody.append('            %s local_%s;' % (proto.params[-1].ty.strip('*').replace('const ', ''), proto.params[-1].name))
                 elif create_func: # Declare local var to store created handle into
                     if 'AllocDescriptorSets' == proto.name:
@@ -1592,21 +1573,21 @@
                         rbody.append('            VkDescriptorSetLayout* local_pSetLayouts = (VkDescriptorSetLayout*)malloc(pPacket->pAllocInfo->count * sizeof(VkDescriptorSetLayout));')
                         rbody.append('            VkDescriptorSetAllocInfo local_AllocInfo, *local_pAllocInfo = &local_AllocInfo;')
                         rbody.append('            VkDescriptorPool local_descPool;')
-                        rbody.append('            local_descPool.handle = m_objMapper.remap_descriptorpools(pPacket->pAllocInfo->descriptorPool.handle);')
+                        rbody.append('            local_descPool = m_objMapper.remap_descriptorpools(pPacket->pAllocInfo->descriptorPool);')
                         rbody.append('            for (uint32_t i = 0; i < pPacket->pAllocInfo->count; i++)')
                         rbody.append('            {')
-                        rbody.append('                local_pSetLayouts[i].handle = m_objMapper.remap_descriptorsetlayouts(pPacket->%s->pSetLayouts[i].handle);' % (proto.params[-2].name))
+                        rbody.append('                local_pSetLayouts[i] = m_objMapper.remap_descriptorsetlayouts(pPacket->%s->pSetLayouts[i]);' % (proto.params[-2].name))
                         rbody.append('            }')
                         rbody.append('            memcpy(local_pAllocInfo, pPacket->pAllocInfo, sizeof(VkDescriptorSetAllocInfo));')
                         rbody.append('            local_pAllocInfo->pSetLayouts = local_pSetLayouts;')
-                        rbody.append('            local_pAllocInfo->descriptorPool.handle = local_descPool.handle;')
+                        rbody.append('            local_pAllocInfo->descriptorPool = local_descPool;')
                     else:
                         rbody.append('            %s local_%s;' % (proto.params[-1].ty.strip('*').replace('const ', ''), proto.params[-1].name))
                 elif proto.name == 'ResetFences':
                     rbody.append('            VkFence* fences = VKTRACE_NEW_ARRAY(VkFence, pPacket->fenceCount);')
                     rbody.append('            for (uint32_t i = 0; i < pPacket->fenceCount; i++)')
                     rbody.append('            {')
-                    rbody.append('                fences[i].handle = m_objMapper.remap_fences(pPacket->%s[i].handle);' % (proto.params[-1].name))
+                    rbody.append('                fences[i] = m_objMapper.remap_fences(pPacket->%s[i]);' % (proto.params[-1].name))
                     rbody.append('            }')
                 elif proto.name in do_while_dict:
                     rbody.append('            do {')
@@ -1696,7 +1677,7 @@
                 elif 'DestroySwapchainKHR' in proto.name:
                     rbody.append('            if (replayResult == VK_SUCCESS)')
                     rbody.append('            {')
-                    rbody.append('                m_objMapper.rm_from_swapchainkhrs_map(pPacket->swapchain.handle);')
+                    rbody.append('                m_objMapper.rm_from_swapchainkhrs_map(pPacket->swapchain);')
                     rbody.append('            }')
                 elif 'DestroyInstance' in proto.name:
                     rbody.append('            if (replayResult == VK_SUCCESS)')
@@ -1715,7 +1696,7 @@
                     rbody.append('            if (replayResult == VK_SUCCESS)')
                     rbody.append('            {')
                     rbody.append('                for (uint32_t i = 0; i < pPacket->pAllocInfo->count; i++) {')
-                    rbody.append('                    m_objMapper.add_to_descriptorsets_map(pPacket->%s[i].handle, local_%s[i].handle);' % (proto.params[-1].name, proto.params[-1].name))
+                    rbody.append('                    m_objMapper.add_to_descriptorsets_map(pPacket->%s[i], local_%s[i]);' % (proto.params[-1].name, proto.params[-1].name))
                     rbody.append('                }')
                     rbody.append('            }')
                     rbody.append('            free(local_pSetLayouts);')
@@ -1728,10 +1709,7 @@
                         rbody.append('            {')
                     clean_type = proto.params[-1].ty.strip('*').replace('const ', '')
                     VkNonDispObjType = [o for o in vulkan.object_non_dispatch_list]
-                    if clean_type in VkNonDispObjType:
-                        rbody.append('                m_objMapper.add_to_%ss_map(pPacket->%s->handle, local_%s.handle);' % (clean_type.lower()[2:], proto.params[-1].name, proto.params[-1].name))
-                    else:
-                        rbody.append('                m_objMapper.add_to_%ss_map(*(pPacket->%s), local_%s);' % (clean_type.lower()[2:], proto.params[-1].name, proto.params[-1].name))
+                    rbody.append('                m_objMapper.add_to_%ss_map(*(pPacket->%s), local_%s);' % (clean_type.lower()[2:], proto.params[-1].name, proto.params[-1].name))
                     if 'AllocMemory' == proto.name:
                         rbody.append('                m_objMapper.add_entry_to_mapData(local_%s, pPacket->pAllocInfo->allocationSize);' % (proto.params[-1].name))
                     if ret_value: