Bug 14084: Get tests compiling and running

Some layer tests still have issues.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1697736..07deeeb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -46,7 +46,7 @@
     set(PYTHON_CMD "py")
 endif()
 
-option(BUILD_TESTS "Build tests" OFF)
+option(BUILD_TESTS "Build tests" ON)
 
 # loader: Generic VULKAN ICD loader
 # icd: Device dependent (DD) VULKAN components
diff --git a/tests/blit_tests.cpp b/tests/blit_tests.cpp
index fc511d8..d7d0762 100644
--- a/tests/blit_tests.cpp
+++ b/tests/blit_tests.cpp
@@ -748,11 +748,8 @@
     vk_testing::Buffer bufs[3];
     VkEventCreateInfo event_info;
     VkEvent event;
-    VkMemoryRequirements mem_req;
     VkResult err;
     VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
-    VkMemoryAllocInfo mem_info;
-    VkDeviceMemory event_mem;
 
     //        typedef struct VkEventCreateInfo_
     //        {
@@ -766,26 +763,6 @@
     err = vkCreateEvent(dev_.handle(), &event_info, &event);
     ASSERT_VK_SUCCESS(err);
 
-    err = vkGetObjectMemoryRequirements(dev_.handle(), VK_OBJECT_TYPE_EVENT, event, &mem_req);
-    ASSERT_VK_SUCCESS(err);
-
-    if (mem_req.size) {
-
-        memset(&mem_info, 0, sizeof(mem_info));
-        mem_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
-        mem_info.allocationSize = mem_req.size;
-        mem_info.memoryTypeIndex = 0;
-
-        err = dev_.phy().set_memory_type(mem_req.memoryTypeBits, &mem_info, 0);
-        ASSERT_VK_SUCCESS(err);
-
-        err = vkAllocMemory(dev_.handle(), &mem_info, &event_mem);
-        ASSERT_VK_SUCCESS(err);
-
-        err = vkBindObjectMemory(dev_.handle(), VK_OBJECT_TYPE_EVENT, event, event_mem, 0);
-        ASSERT_VK_SUCCESS(err);
-    }
-
     err = vkResetEvent(dev_.handle(), event);
     ASSERT_VK_SUCCESS(err);
 
@@ -840,14 +817,9 @@
     EXPECT_EQ(0x11111111, data[0]);
     bufs[2].memory().unmap();
 
-    err = vkDestroyObject(dev_.handle(), VK_OBJECT_TYPE_EVENT, event);
+    err = vkDestroyEvent(dev_.handle(), event);
     ASSERT_VK_SUCCESS(err);
 
-    if (mem_req.size) {
-        // All done with event memory, clean up
-        err = vkFreeMemory(dev_.handle(), event_mem);
-        ASSERT_VK_SUCCESS(err);
-    }
 }
 
 class VkCmdBlitImageTest : public VkCmdBlitTest {
diff --git a/tests/image_tests.cpp b/tests/image_tests.cpp
index 6193dca..0504d96 100644
--- a/tests/image_tests.cpp
+++ b/tests/image_tests.cpp
@@ -218,7 +218,7 @@
     mem_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
     mem_info.pNext = NULL;
 
-    err = vkGetObjectMemoryRequirements(device(), VK_OBJECT_TYPE_IMAGE, m_image, &mem_req);
+    err = vkGetImageMemoryRequirements(device(), m_image, &mem_req);
     ASSERT_VK_SUCCESS(err);
 
     ASSERT_NE(0, mem_req.size) << "vkGetObjectMemoryRequirements (Image): Failed - expect images to require memory";
@@ -233,7 +233,7 @@
     ASSERT_VK_SUCCESS(err);
 
     /* bind memory */
-    err = vkBindObjectMemory(device(), VK_OBJECT_TYPE_IMAGE, m_image, m_image_mem, 0);
+    err = vkBindImageMemory(device(), m_image, m_image_mem, 0);
     ASSERT_VK_SUCCESS(err);
 }
 
@@ -244,7 +244,7 @@
     err = vkFreeMemory(device(), m_image_mem);
     ASSERT_VK_SUCCESS(err);
 
-    ASSERT_VK_SUCCESS(vkDestroyObject(device(), VK_OBJECT_TYPE_IMAGE, m_image));
+    ASSERT_VK_SUCCESS(vkDestroyImage(device(), m_image));
 }
 
 void VkImageTest::CreateImageView(VkImageViewCreateInfo *pCreateInfo,
@@ -256,7 +256,7 @@
 
 void VkImageTest::DestroyImageView(VkImageView imageView)
 {
-    ASSERT_VK_SUCCESS(vkDestroyObject(device(), VK_OBJECT_TYPE_IMAGE_VIEW, imageView));
+    ASSERT_VK_SUCCESS(vkDestroyImageView(device(), imageView));
 }
 
 TEST_F(VkImageTest, CreateImageViewTest) {
diff --git a/tests/init.cpp b/tests/init.cpp
index 4c1881e..d298fc1 100644
--- a/tests/init.cpp
+++ b/tests/init.cpp
@@ -169,8 +169,6 @@
 TEST_F(VkTest, Event) {
     VkEventCreateInfo event_info;
     VkEvent event;
-    VkMemoryRequirements mem_req;
-    VkDeviceMemory event_mem;
     VkResult err;
 
     //        typedef struct VkEventCreateInfo_
@@ -185,31 +183,6 @@
     err = vkCreateEvent(device(), &event_info, &event);
     ASSERT_VK_SUCCESS(err);
 
-    err = vkGetObjectMemoryRequirements(device(), VK_OBJECT_TYPE_EVENT, event, &mem_req);
-    ASSERT_VK_SUCCESS(err);
-
-    if (mem_req.size) {
-
-        //        VkResult VKAPI vkAllocMemory(
-        //            VkDevice                                  device,
-        //            const VkMemoryAllocInfo*                pAllocInfo,
-        //            VkDeviceMemory*                             pMem);
-        VkMemoryAllocInfo mem_info;
-
-        memset(&mem_info, 0, sizeof(mem_info));
-        mem_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
-        mem_info.allocationSize = mem_req.size;
-        mem_info.memoryTypeIndex = 0;
-
-        err = m_device->phy().set_memory_type(mem_req.memoryTypeBits, &mem_info, 0);
-        ASSERT_VK_SUCCESS(err);
-
-        err = vkAllocMemory(device(), &mem_info, &event_mem);
-        ASSERT_VK_SUCCESS(err);
-
-        err = vkBindObjectMemory(device(), VK_OBJECT_TYPE_EVENT, event, event_mem, 0);
-        ASSERT_VK_SUCCESS(err);
-    }
     err = vkResetEvent(device(), event);
     ASSERT_VK_SUCCESS(err);
 
@@ -225,13 +198,8 @@
     // TODO: Test actual synchronization with command buffer event.
 
     // All done with event memory, clean up
-    err = vkDestroyObject(device(), VK_OBJECT_TYPE_EVENT, event);
+    err = vkDestroyEvent(device(), event);
     ASSERT_VK_SUCCESS(err);
-
-    if (mem_req.size) {
-        err = vkFreeMemory(device(), event_mem);
-        ASSERT_VK_SUCCESS(err);
-    }
 }
 
 #define MAX_QUERY_SLOTS 10
@@ -239,10 +207,8 @@
 TEST_F(VkTest, Query) {
     VkQueryPoolCreateInfo query_info;
     VkQueryPool query_pool;
-    VkMemoryRequirements mem_req;
     size_t query_result_size;
     uint32_t *query_result_data;
-    VkDeviceMemory query_mem;
     VkResult err;
 
     //        typedef enum VkQueryType_
@@ -277,32 +243,6 @@
     err = vkCreateQueryPool(device(), &query_info, &query_pool);
     ASSERT_VK_SUCCESS(err);
 
-    err = vkGetObjectMemoryRequirements(device(), VK_OBJECT_TYPE_QUERY_POOL, query_pool, &mem_req);
-    ASSERT_VK_SUCCESS(err);
-
-    if (mem_req.size) {
-
-        //        VkResult VKAPI vkAllocMemory(
-        //            VkDevice                                  device,
-        //            const VkMemoryAllocInfo*                pAllocInfo,
-        //            VkDeviceMemory*                             pMem);
-        VkMemoryAllocInfo mem_info;
-
-        memset(&mem_info, 0, sizeof(mem_info));
-        mem_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
-        // TODO: Is a simple multiple all that's needed here?
-        mem_info.allocationSize = mem_req.size * MAX_QUERY_SLOTS;
-        mem_info.memoryTypeIndex = 0;
-
-        err = m_device->phy().set_memory_type(mem_req.memoryTypeBits, &mem_info, 0);
-        ASSERT_VK_SUCCESS(err);
-
-        err = vkAllocMemory(device(), &mem_info, &query_mem);
-        ASSERT_VK_SUCCESS(err);
-
-        err = vkBindObjectMemory(device(), VK_OBJECT_TYPE_QUERY_POOL, query_pool, query_mem, 0);
-        ASSERT_VK_SUCCESS(err);
-    }
     // TODO: Test actual synchronization with command buffer event.
     // TODO: Create command buffer
     // TODO: vkCmdResetQueryPool
@@ -324,14 +264,8 @@
 
     }
 
-    err = vkDestroyObject(device(), VK_OBJECT_TYPE_QUERY_POOL, query_pool);
+    err = vkDestroyQueryPool(device(), query_pool);
     ASSERT_VK_SUCCESS(err);
-
-    if (mem_req.size) {
-        // All done with QueryPool memory, clean up
-        err = vkFreeMemory(device(), query_mem);
-        ASSERT_VK_SUCCESS(err);
-    }
 }
 
 void getQueue(vk_testing::Device *device, uint32_t queue_node_index, const char *qname)
@@ -474,7 +408,7 @@
     VkMemoryRequirements mem_req;
     VkDeviceMemory image_mem;
 
-    err = vkGetObjectMemoryRequirements(device(), VK_OBJECT_TYPE_IMAGE, image, &mem_req);
+    err = vkGetImageMemoryRequirements(device(), image, &mem_req);
     ASSERT_VK_SUCCESS(err);
 
     if (mem_req.size) {
@@ -496,7 +430,7 @@
         err = vkAllocMemory(device(), &mem_info, &image_mem);
         ASSERT_VK_SUCCESS(err);
 
-        err = vkBindObjectMemory(device(), VK_OBJECT_TYPE_IMAGE, image, image_mem, 0);
+        err = vkBindImageMemory(device(), image, image_mem, 0);
         ASSERT_VK_SUCCESS(err);
     }
 
@@ -540,8 +474,8 @@
     // TODO: Test image memory.
 
     // All done with image memory, clean up
-    ASSERT_VK_SUCCESS(vkDestroyObject(device(), VK_OBJECT_TYPE_IMAGE_VIEW, view));
-    ASSERT_VK_SUCCESS(vkDestroyObject(device(), VK_OBJECT_TYPE_IMAGE, image));
+    ASSERT_VK_SUCCESS(vkDestroyImageView(device(), view));
+    ASSERT_VK_SUCCESS(vkDestroyImage(device(), image));
 
     if (mem_req.size) {
         ASSERT_VK_SUCCESS(vkFreeMemory(device(), image_mem));
@@ -571,7 +505,7 @@
     err = vkCreateCommandBuffer(device(), &info, &cmdBuffer);
     ASSERT_VK_SUCCESS(err) << "vkCreateCommandBuffer failed";
 
-    ASSERT_VK_SUCCESS(vkDestroyObject(device(), VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer));
+    ASSERT_VK_SUCCESS(vkDestroyCommandBuffer(device(), cmdBuffer));
 }
 
 TEST_F(VkTest, TestCommandBuffer) {
@@ -617,7 +551,7 @@
     err = vkCreateShader(device(), &createInfo, &shader);
     ASSERT_VK_SUCCESS(err);
 
-    err = vkDestroyObject(device(), VK_OBJECT_TYPE_SHADER_MODULE, module);
+    err = vkDestroyShaderModule(device(), module);
     ASSERT_VK_SUCCESS(err);
 
     *pshader = shader;
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index b37511d..14d4a51 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -61,9 +61,9 @@
         "}\n";
 
 static void myDbgFunc(
-    VkFlags                    msgFlags,
-    VkObjectType                        objType,
-    VkObject                            srcObject,
+    VkFlags                             msgFlags,
+    VkDbgObjectType                     objType,
+    uint64_t                            srcObject,
     size_t                              location,
     int32_t                             msgCode,
     const char*                         pLayerPrefix,
@@ -121,8 +121,8 @@
 
 static void myDbgFunc(
     VkFlags                    msgFlags,
-    VkObjectType               objType,
-    VkObject                   srcObject,
+    VkDbgObjectType            objType,
+    uint64_t                   srcObject,
     size_t                     location,
     int32_t                    msgCode,
     const char*                pLayerPrefix,
@@ -298,16 +298,16 @@
 
     cmdBuffer->PrepareAttachments();
     if ((failMask & BsoFailRaster) != BsoFailRaster) {
-        cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_RASTER, m_stateRaster);
+        cmdBuffer->BindDynamicRasterState(m_stateRaster);
     }
     if ((failMask & BsoFailViewport) != BsoFailViewport) {
-        cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_VIEWPORT, m_stateViewport);
+        cmdBuffer->BindDynamicViewportState(m_stateViewport);
     }
     if ((failMask & BsoFailColorBlend) != BsoFailColorBlend) {
-        cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_COLOR_BLEND, m_colorBlend);
+        cmdBuffer->BindDynamicColorBlendState(m_colorBlend);
     }
     if ((failMask & BsoFailDepthStencil) != BsoFailDepthStencil) {
-        cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_DEPTH_STENCIL, m_stateDepthStencil);
+        cmdBuffer->BindDynamicDepthStencilState(m_stateDepthStencil);
     }
     // Make sure depthWriteEnable is set so that DepthStencil fail test will work correctly
     VkStencilOpState stencil = {
@@ -461,8 +461,7 @@
     err = vkCreateImage(m_device->device(), &image_create_info, &image);
     ASSERT_VK_SUCCESS(err);
 
-    err = vkGetObjectMemoryRequirements(m_device->device(),
-                          VK_OBJECT_TYPE_IMAGE,
+    err = vkGetImageMemoryRequirements(m_device->device(),
                           image,
                           &mem_reqs);
     ASSERT_VK_SUCCESS(err);
@@ -474,7 +473,7 @@
     ASSERT_VK_SUCCESS(err);
 
     // Try to bind free memory that has been freed
-    err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
+    err = vkBindImageMemory(m_device->device(), image, mem, 0);
     ASSERT_VK_SUCCESS(err);
 
     // Map memory as if to initialize the image
@@ -529,8 +528,7 @@
     err = vkCreateImage(m_device->device(), &image_create_info, &image);
     ASSERT_VK_SUCCESS(err);
 
-    err = vkGetObjectMemoryRequirements(m_device->device(),
-                          VK_OBJECT_TYPE_IMAGE,
+    err = vkGetImageMemoryRequirements(m_device->device(),
                           image,
                           &mem_reqs);
     ASSERT_VK_SUCCESS(err);
@@ -549,7 +547,7 @@
     ASSERT_VK_SUCCESS(err);
 
     // Try to bind free memory that has been freed
-    err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
+    err = vkBindImageMemory(m_device->device(), image, mem, 0);
     ASSERT_VK_SUCCESS(err);
 
     msgFlags = m_errorMonitor->GetState(&msgString);
@@ -600,8 +598,7 @@
     err = vkCreateImage(m_device->device(), &image_create_info, &image);
     ASSERT_VK_SUCCESS(err);
 
-    err = vkGetObjectMemoryRequirements(m_device->device(),
-                          VK_OBJECT_TYPE_IMAGE,
+    err = vkGetImageMemoryRequirements(m_device->device(),
                           image,
                           &mem_reqs);
     ASSERT_VK_SUCCESS(err);
@@ -616,7 +613,7 @@
     ASSERT_VK_SUCCESS(err);
 
     // Bind memory to Image object
-    err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
+    err = vkBindImageMemory(m_device->device(), image, mem, 0);
     ASSERT_VK_SUCCESS(err);
 
     // Introduce validation failure, free memory while still bound to object
@@ -672,8 +669,7 @@
     err = vkCreateImage(m_device->device(), &image_create_info, &image);
     ASSERT_VK_SUCCESS(err);
 
-    err = vkGetObjectMemoryRequirements(m_device->device(),
-                          VK_OBJECT_TYPE_IMAGE,
+    err = vkGetImageMemoryRequirements(m_device->device(),
                           image,
                           &mem_reqs);
     ASSERT_VK_SUCCESS(err);
@@ -689,11 +685,11 @@
     ASSERT_VK_SUCCESS(err);
 
     // Bind first memory object to Image object
-    err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem1, 0);
+    err = vkBindImageMemory(m_device->device(), image, mem1, 0);
     ASSERT_VK_SUCCESS(err);
 
     // Introduce validation failure, try to bind a different memory object to the same image object
-    err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem2, 0);
+    err = vkBindImageMemory(m_device->device(), image, mem2, 0);
     ASSERT_VK_SUCCESS(err);
 
     msgFlags = m_errorMonitor->GetState(&msgString);
@@ -744,8 +740,7 @@
     err = vkCreateImage(m_device->device(), &image_create_info, &image);
     ASSERT_VK_SUCCESS(err);
 
-    err = vkGetObjectMemoryRequirements(m_device->device(),
-                          VK_OBJECT_TYPE_IMAGE,
+    err = vkGetImageMemoryRequirements(m_device->device(),
                           image,
                           &mem_reqs);
     ASSERT_VK_SUCCESS(err);
@@ -759,11 +754,11 @@
     ASSERT_VK_SUCCESS(err);
 
     // Introduce validation failure, destroy Image object before binding
-    vkDestroyObject(m_device->device(), VK_OBJECT_TYPE_IMAGE, image);
+    vkDestroyImage(m_device->device(), image);
     ASSERT_VK_SUCCESS(err);
 
     // Now Try to bind memory to this destroyted object
-    err = vkBindObjectMemory(m_device->device(), VK_OBJECT_TYPE_IMAGE, image, mem, 0);
+    err = vkBindImageMemory(m_device->device(), image, mem, 0);
     ASSERT_VK_SUCCESS(err);
 
     msgFlags = m_errorMonitor->GetState(&msgString);
@@ -2288,7 +2283,6 @@
 
     VkEventCreateInfo event_info;
     VkEvent event;
-    VkMemoryRequirements mem_req;
     VkResult err;
 
     memset(&event_info, 0, sizeof(event_info));
@@ -2297,26 +2291,6 @@
     err = vkCreateEvent(device(), &event_info, &event);
     ASSERT_VK_SUCCESS(err);
 
-    err = vkGetObjectMemoryRequirements(device(), VK_OBJECT_TYPE_EVENT, event, &mem_req);
-    ASSERT_VK_SUCCESS(err);
-
-    VkMemoryAllocInfo mem_info;
-    VkDeviceMemory event_mem;
-
-    memset(&mem_info, 0, sizeof(mem_info));
-    mem_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
-    mem_info.allocationSize = mem_req.size;
-    mem_info.memoryTypeIndex = 0;
-
-    err = m_device->phy().set_memory_type(mem_req.memoryTypeBits, &mem_info, 0);
-    ASSERT_VK_SUCCESS(err);
-
-    err = vkAllocMemory(device(), &mem_info, &event_mem);
-    ASSERT_VK_SUCCESS(err);
-
-    err = vkBindObjectMemory(device(), VK_OBJECT_TYPE_EVENT, event, event_mem, 0);
-    ASSERT_VK_SUCCESS(err);
-
     err = vkResetEvent(device(), event);
     ASSERT_VK_SUCCESS(err);
 
diff --git a/tests/render_tests.cpp b/tests/render_tests.cpp
index 1bb54ab..7d0749d 100644
--- a/tests/render_tests.cpp
+++ b/tests/render_tests.cpp
@@ -344,10 +344,10 @@
     }
 
     cmdBuffer->PrepareAttachments();
-    cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_RASTER, m_stateRaster);
-    cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_VIEWPORT, m_stateViewport);
-    cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_COLOR_BLEND, m_colorBlend);
-    cmdBuffer->BindStateObject(VK_STATE_BIND_POINT_DEPTH_STENCIL, m_stateDepthStencil);
+    cmdBuffer->BindDynamicRasterState(m_stateRaster);
+    cmdBuffer->BindDynamicViewportState(m_stateViewport);
+    cmdBuffer->BindDynamicColorBlendState(m_colorBlend);
+    cmdBuffer->BindDynamicDepthStencilState(m_stateDepthStencil);
     descriptorSet.CreateVKDescriptorSet(cmdBuffer);
     pipelineobj.CreateVKPipeline(descriptorSet, renderPass());
     cmdBuffer->BindPipeline(pipelineobj);
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index cd8ec6b..4b45f10 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -146,22 +146,22 @@
 
 void VkRenderFramework::ShutdownFramework()
 {
-    if (m_colorBlend) vkDestroyObject(device(), VK_OBJECT_TYPE_DYNAMIC_CB_STATE, m_colorBlend);
-    if (m_stateDepthStencil) vkDestroyObject(device(), VK_OBJECT_TYPE_DYNAMIC_DS_STATE, m_stateDepthStencil);
-    if (m_stateRaster) vkDestroyObject(device(), VK_OBJECT_TYPE_DYNAMIC_RS_STATE, m_stateRaster);
-    if (m_cmdBuffer) vkDestroyObject(device(), VK_OBJECT_TYPE_COMMAND_BUFFER, m_cmdBuffer);
-    if (m_framebuffer) vkDestroyObject(device(), VK_OBJECT_TYPE_FRAMEBUFFER, m_framebuffer);
-    if (m_renderPass) vkDestroyObject(device(), VK_OBJECT_TYPE_RENDER_PASS, m_renderPass);
+    if (m_colorBlend) vkDestroyDynamicColorBlendState(device(), m_colorBlend);
+    if (m_stateDepthStencil) vkDestroyDynamicDepthStencilState(device(), m_stateDepthStencil);
+    if (m_stateRaster) vkDestroyDynamicRasterState(device(), m_stateRaster);
+    if (m_cmdBuffer) vkDestroyCommandBuffer(device(), m_cmdBuffer);
+    if (m_framebuffer) vkDestroyFramebuffer(device(), m_framebuffer);
+    if (m_renderPass) vkDestroyRenderPass(device(), m_renderPass);
 
     if (m_globalMsgCallback) m_dbgDestroyMsgCallback(this->inst, m_globalMsgCallback);
     if (m_devMsgCallback) m_dbgDestroyMsgCallback(this->inst, m_devMsgCallback);
 
     if (m_stateViewport) {
-        vkDestroyObject(device(), VK_OBJECT_TYPE_DYNAMIC_VP_STATE, m_stateViewport);
+        vkDestroyDynamicViewportState(device(), m_stateViewport);
     }
     while (!m_renderTargets.empty()) {
-        vkDestroyObject(device(), VK_OBJECT_TYPE_ATTACHMENT_VIEW, m_renderTargets.back()->targetView());
-        vkDestroyObject(device(), VK_OBJECT_TYPE_IMAGE, m_renderTargets.back()->image());
+        vkDestroyAttachmentView(device(), m_renderTargets.back()->targetView());
+        vkDestroyImage(device(), m_renderTargets.back()->image());
         vkFreeMemory(device(), m_renderTargets.back()->memory());
         m_renderTargets.pop_back();
     }
@@ -180,14 +180,14 @@
     m_render_target_fmt = VK_FORMAT_B8G8R8A8_UNORM;
 
     // create a raster state (solid, back-face culling)
-    VkDynamicRsStateCreateInfo raster = {};
-    raster.sType = VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO;
+    VkDynamicRasterStateCreateInfo raster = {};
+    raster.sType = VK_STRUCTURE_TYPE_DYNAMIC_RASTER_STATE_CREATE_INFO;
 
     err = vkCreateDynamicRasterState( device(), &raster, &m_stateRaster );
     ASSERT_VK_SUCCESS(err);
 
-    VkDynamicCbStateCreateInfo blend = {};
-    blend.sType = VK_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO;
+    VkDynamicColorBlendStateCreateInfo blend = {};
+    blend.sType = VK_STRUCTURE_TYPE_DYNAMIC_COLOR_BLEND_STATE_CREATE_INFO;
     blend.blendConst[0] = 1.0f;
     blend.blendConst[1] = 1.0f;
     blend.blendConst[2] = 1.0f;
@@ -195,8 +195,8 @@
     err = vkCreateDynamicColorBlendState(device(), &blend, &m_colorBlend);
     ASSERT_VK_SUCCESS( err );
 
-    VkDynamicDsStateCreateInfo depthStencil = {};
-    depthStencil.sType = VK_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO;
+    VkDynamicDepthStencilStateCreateInfo depthStencil = {};
+    depthStencil.sType = VK_STRUCTURE_TYPE_DYNAMIC_DEPTH_STENCIL_STATE_CREATE_INFO;
     depthStencil.minDepthBounds = 0.f;
     depthStencil.maxDepthBounds = 1.f;
     depthStencil.stencilFrontRef = 0;
@@ -223,8 +223,8 @@
     VkViewport viewport;
     VkRect2D scissor;
 
-    VkDynamicVpStateCreateInfo viewportCreate = {};
-    viewportCreate.sType = VK_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO;
+    VkDynamicViewportStateCreateInfo viewportCreate = {};
+    viewportCreate.sType = VK_STRUCTURE_TYPE_DYNAMIC_VIEWPORT_STATE_CREATE_INFO;
     viewportCreate.viewportAndScissorCount         = 1;
     viewport.originX  = 0;
     viewport.originY  = 0;
@@ -1403,9 +1403,24 @@
     vkCmdEndRenderPass(handle());
 }
 
-void VkCommandBufferObj::BindStateObject(VkStateBindPoint stateBindPoint, VkDynamicStateObject stateObject)
+void VkCommandBufferObj::BindDynamicViewportState(VkDynamicViewportState viewportState)
 {
-    vkCmdBindDynamicStateObject( handle(), stateBindPoint, stateObject);
+    vkCmdBindDynamicViewportState( handle(), viewportState);
+}
+
+void VkCommandBufferObj::BindDynamicRasterState(VkDynamicRasterState rasterState)
+{
+    vkCmdBindDynamicRasterState( handle(), rasterState);
+}
+
+void VkCommandBufferObj::BindDynamicColorBlendState(VkDynamicColorBlendState colorBlendState)
+{
+    vkCmdBindDynamicColorBlendState( handle(), colorBlendState);
+}
+
+void VkCommandBufferObj::BindDynamicDepthStencilState(VkDynamicDepthStencilState depthStencilState)
+{
+    vkCmdBindDynamicDepthStencilState( handle(), depthStencilState);
 }
 
 void VkCommandBufferObj::AddRenderTarget(VkImageObj *renderTarget)
@@ -1425,7 +1440,8 @@
 
 void VkCommandBufferObj::QueueCommandBuffer()
 {
-    QueueCommandBuffer(NULL);
+    VkFence nullFence = { VK_NULL_HANDLE };
+    QueueCommandBuffer(nullFence);
 }
 
 void VkCommandBufferObj::QueueCommandBuffer(VkFence fence)
diff --git a/tests/vkrenderframework.h b/tests/vkrenderframework.h
index fc27779..bdf508e 100644
--- a/tests/vkrenderframework.h
+++ b/tests/vkrenderframework.h
@@ -106,19 +106,12 @@
     VkCmdBuffer                         m_cmdBuffer;
     VkRenderPass                        m_renderPass;
     VkFramebuffer                       m_framebuffer;
-<<<<<<< HEAD
     std::vector<VkClearValue>           m_renderPassClearValues;
     VkRenderPassBeginInfo               m_renderPassBeginInfo;
-    VkDynamicRsState                    m_stateRaster;
-    VkDynamicCbState                    m_colorBlend;
-    VkDynamicVpState                    m_stateViewport;
-    VkDynamicDsState                    m_stateDepthStencil;
-=======
     VkDynamicRasterState                m_stateRaster;
     VkDynamicColorBlendState            m_colorBlend;
     VkDynamicViewportState              m_stateViewport;
     VkDynamicDepthStencilState          m_stateDepthStencil;
->>>>>>> Bug 14084 - Improve type safety and remove polymorphism
     vector<VkImageObj*>                 m_renderTargets;
     float                               m_width, m_height;
     VkFormat                            m_render_target_fmt;
@@ -177,8 +170,11 @@
     void BindDescriptorSet(VkDescriptorSetObj &descriptorSet);
     void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding);
     void BindIndexBuffer(VkIndexBufferObj *indexBuffer, uint32_t offset);
-    void BindStateObject(VkStateBindPoint stateBindPoint, VkDynamicStateObject stateObject);
     void BeginRenderPass(const VkRenderPassBeginInfo &info);
+    void BindDynamicViewportState(VkDynamicViewportState viewportState);
+    void BindDynamicRasterState(VkDynamicRasterState rasterState);
+    void BindDynamicColorBlendState(VkDynamicColorBlendState colorBlendState);
+    void BindDynamicDepthStencilState(VkDynamicDepthStencilState depthStencilState);
     void EndRenderPass();
     void Draw(uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount);
     void DrawIndexed(uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount);
diff --git a/tests/vktestbinding.cpp b/tests/vktestbinding.cpp
index 70483e7..2f21733 100644
--- a/tests/vktestbinding.cpp
+++ b/tests/vktestbinding.cpp
@@ -23,6 +23,7 @@
 #include <iostream>
 #include <string.h> // memset(), memcmp()
 #include <assert.h>
+#include <stdarg.h>
 #include "vktestbinding.h"
 
 namespace {
@@ -34,11 +35,11 @@
             NonDispHandle::init(dev.handle(), handle);                              \
     } while (0)
 
-#define NON_DISPATCHABLE_HANDLE_DTOR(cls, destroy_func, ...)                        \
+#define NON_DISPATCHABLE_HANDLE_DTOR(cls, destroy_func)                        \
     cls::~cls()                                                                     \
     {                                                                               \
         if (initialized())                                                          \
-            EXPECT(destroy_func(device(), __VA_ARGS__, handle()) == VK_SUCCESS);    \
+            EXPECT(destroy_func(device(), handle()) == VK_SUCCESS);    \
     }
 
 #define STRINGIFY(x) #x
@@ -468,21 +469,21 @@
     EXPECT(vkUnmapMemory(device(), handle()) == VK_SUCCESS);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(Fence, vkDestroyObject, VK_OBJECT_TYPE_FENCE)
+NON_DISPATCHABLE_HANDLE_DTOR(Fence, vkDestroyFence)
 
 void Fence::init(const Device &dev, const VkFenceCreateInfo &info)
 {
     NON_DISPATCHABLE_HANDLE_INIT(vkCreateFence, dev, &info);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(Semaphore, vkDestroyObject, VK_OBJECT_TYPE_SEMAPHORE)
+NON_DISPATCHABLE_HANDLE_DTOR(Semaphore, vkDestroySemaphore)
 
 void Semaphore::init(const Device &dev, const VkSemaphoreCreateInfo &info)
 {
     NON_DISPATCHABLE_HANDLE_INIT(vkCreateSemaphore, dev, &info);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(Event, vkDestroyObject, VK_OBJECT_TYPE_EVENT)
+NON_DISPATCHABLE_HANDLE_DTOR(Event, vkDestroyEvent)
 
 void Event::init(const Device &dev, const VkEventCreateInfo &info)
 {
@@ -499,7 +500,7 @@
     EXPECT(vkResetEvent(device(), handle()) == VK_SUCCESS);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(QueryPool, vkDestroyObject, VK_OBJECT_TYPE_QUERY_POOL)
+NON_DISPATCHABLE_HANDLE_DTOR(QueryPool, vkDestroyQueryPool)
 
 void QueryPool::init(const Device &dev, const VkQueryPoolCreateInfo &info)
 {
@@ -520,7 +521,7 @@
     return err;
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(Buffer, vkDestroyObject, VK_OBJECT_TYPE_BUFFER)
+NON_DISPATCHABLE_HANDLE_DTOR(Buffer, vkDestroyBuffer)
 
 void Buffer::init(const Device &dev, const VkBufferCreateInfo &info, VkMemoryPropertyFlags mem_props)
 {
@@ -540,24 +541,24 @@
 {
     VkMemoryRequirements reqs;
 
-    EXPECT(vkGetObjectMemoryRequirements(device(), VK_OBJECT_TYPE_BUFFER, handle(), &reqs) == VK_SUCCESS);
+    EXPECT(vkGetBufferMemoryRequirements(device(), handle(), &reqs) == VK_SUCCESS);
 
     return reqs;
 }
 
 void Buffer::bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset)
 {
-    EXPECT(vkBindObjectMemory(device(), VK_OBJECT_TYPE_BUFFER, handle(), mem.handle(), mem_offset) == VK_SUCCESS);
+    EXPECT(vkBindBufferMemory(device(), handle(), mem.handle(), mem_offset) == VK_SUCCESS);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(BufferView, vkDestroyObject, VK_OBJECT_TYPE_BUFFER_VIEW)
+NON_DISPATCHABLE_HANDLE_DTOR(BufferView, vkDestroyBufferView)
 
 void BufferView::init(const Device &dev, const VkBufferViewCreateInfo &info)
 {
     NON_DISPATCHABLE_HANDLE_INIT(vkCreateBufferView, dev, &info);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(Image, vkDestroyObject, VK_OBJECT_TYPE_IMAGE)
+NON_DISPATCHABLE_HANDLE_DTOR(Image, vkDestroyImage)
 
 void Image::init(const Device &dev, const VkImageCreateInfo &info, VkMemoryPropertyFlags mem_props)
 {
@@ -589,14 +590,14 @@
 {
     VkMemoryRequirements reqs;
 
-    EXPECT(vkGetObjectMemoryRequirements(device(), VK_OBJECT_TYPE_IMAGE, handle(), &reqs) == VK_SUCCESS);
+    EXPECT(vkGetImageMemoryRequirements(device(), handle(), &reqs) == VK_SUCCESS);
 
     return reqs;
 }
 
 void Image::bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset)
 {
-    EXPECT(vkBindObjectMemory(device(), VK_OBJECT_TYPE_IMAGE, handle(), mem.handle(), mem_offset) == VK_SUCCESS);
+    EXPECT(vkBindImageMemory(device(), handle(), mem.handle(), mem_offset) == VK_SUCCESS);
 }
 
 VkSubresourceLayout Image::subresource_layout(const VkImageSubresource &subres) const
@@ -617,21 +618,21 @@
                                     VK_IMAGE_USAGE_DEPTH_STENCIL_BIT)));
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(ImageView, vkDestroyObject, VK_OBJECT_TYPE_IMAGE_VIEW)
+NON_DISPATCHABLE_HANDLE_DTOR(ImageView, vkDestroyImageView)
 
 void ImageView::init(const Device &dev, const VkImageViewCreateInfo &info)
 {
     NON_DISPATCHABLE_HANDLE_INIT(vkCreateImageView, dev, &info);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(AttachmentView, vkDestroyObject, VK_OBJECT_TYPE_ATTACHMENT_VIEW)
+NON_DISPATCHABLE_HANDLE_DTOR(AttachmentView, vkDestroyAttachmentView)
 
 void AttachmentView::init(const Device &dev, const VkAttachmentViewCreateInfo &info)
 {
     NON_DISPATCHABLE_HANDLE_INIT(vkCreateAttachmentView, dev, &info);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(ShaderModule, vkDestroyObject, VK_OBJECT_TYPE_SHADER_MODULE)
+NON_DISPATCHABLE_HANDLE_DTOR(ShaderModule, vkDestroyShaderModule)
 
 void ShaderModule::init(const Device &dev, const VkShaderModuleCreateInfo &info)
 {
@@ -649,7 +650,7 @@
     return err;
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(Shader, vkDestroyObject, VK_OBJECT_TYPE_SHADER)
+NON_DISPATCHABLE_HANDLE_DTOR(Shader, vkDestroyShader)
 
 void Shader::init(const Device &dev, const VkShaderCreateInfo &info)
 {
@@ -667,7 +668,7 @@
     return err;
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(Pipeline, vkDestroyObject, VK_OBJECT_TYPE_PIPELINE)
+NON_DISPATCHABLE_HANDLE_DTOR(Pipeline, vkDestroyPipeline)
 
 void Pipeline::init(const Device &dev, const VkGraphicsPipelineCreateInfo &info)
 {
@@ -715,7 +716,7 @@
     }
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(PipelineLayout, vkDestroyObject, VK_OBJECT_TYPE_PIPELINE_LAYOUT)
+NON_DISPATCHABLE_HANDLE_DTOR(PipelineLayout, vkDestroyPipelineLayout)
 
 void PipelineLayout::init(const Device &dev, VkPipelineLayoutCreateInfo &info, const std::vector<const DescriptorSetLayout *> &layouts)
 {
@@ -725,21 +726,21 @@
     NON_DISPATCHABLE_HANDLE_INIT(vkCreatePipelineLayout, dev, &info);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(Sampler, vkDestroyObject, VK_OBJECT_TYPE_SAMPLER)
+NON_DISPATCHABLE_HANDLE_DTOR(Sampler, vkDestroySampler)
 
 void Sampler::init(const Device &dev, const VkSamplerCreateInfo &info)
 {
     NON_DISPATCHABLE_HANDLE_INIT(vkCreateSampler, dev, &info);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(DescriptorSetLayout, vkDestroyObject, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
+NON_DISPATCHABLE_HANDLE_DTOR(DescriptorSetLayout, vkDestroyDescriptorSetLayout)
 
 void DescriptorSetLayout::init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info)
 {
     NON_DISPATCHABLE_HANDLE_INIT(vkCreateDescriptorSetLayout, dev, &info);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(DescriptorPool, vkDestroyObject, VK_OBJECT_TYPE_DESCRIPTOR_POOL)
+NON_DISPATCHABLE_HANDLE_DTOR(DescriptorPool, vkDestroyDescriptorPool)
 
 void DescriptorPool::init(const Device &dev, VkDescriptorPoolUsage usage,
                           uint32_t max_sets, const VkDescriptorPoolCreateInfo &info)
@@ -769,7 +770,7 @@
     sets.reserve(set_count);
     for (std::vector<VkDescriptorSet>::const_iterator it = set_handles.begin(); it != set_handles.end(); it++) {
         // do descriptor sets need memories bound?
-        DescriptorSet *descriptorSet = new DescriptorSet(dev, *it);
+        DescriptorSet *descriptorSet = new DescriptorSet(dev, handle(), *it);
         sets.push_back(descriptorSet);
     }
     return sets;
@@ -786,30 +787,36 @@
     return (set.empty()) ? NULL : set[0];
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(DescriptorSet, vkDestroyObject, VK_OBJECT_TYPE_DESCRIPTOR_SET)
+DescriptorSet::~DescriptorSet()
+{
+    if (initialized()) {
+        VkDescriptorSet sets[1] = { handle() };
+        EXPECT(vkFreeDescriptorSets(device(), pool_, 1, sets) == VK_SUCCESS);
+    }
+}
 
-NON_DISPATCHABLE_HANDLE_DTOR(DynamicViewportState, vkDestroyObject, VK_OBJECT_TYPE_DYNAMIC_VP_STATE)
+NON_DISPATCHABLE_HANDLE_DTOR(DynamicViewportState, vkDestroyDynamicViewportState)
 
 void DynamicViewportState::init(const Device &dev, const VkDynamicViewportStateCreateInfo &info)
 {
     NON_DISPATCHABLE_HANDLE_INIT(vkCreateDynamicViewportState, dev, &info);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(DynamicRasterState, vkDestroyObject, VK_OBJECT_TYPE_DYNAMIC_RS_STATE)
+NON_DISPATCHABLE_HANDLE_DTOR(DynamicRasterState, vkDestroyDynamicRasterState)
 
 void DynamicRasterState::init(const Device &dev, const VkDynamicRasterStateCreateInfo &info)
 {
     NON_DISPATCHABLE_HANDLE_INIT(vkCreateDynamicRasterState, dev, &info);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(DynamicColorBlendState, vkDestroyObject, VK_OBJECT_TYPE_DYNAMIC_CB_STATE)
+NON_DISPATCHABLE_HANDLE_DTOR(DynamicColorBlendState, vkDestroyDynamicColorBlendState)
 
-void DynamicColorBlendState::init(const Device &dev, const VkDynamicCbStateCreateInfo &info)
+void DynamicColorBlendState::init(const Device &dev, const VkDynamicColorBlendStateCreateInfo &info)
 {
     NON_DISPATCHABLE_HANDLE_INIT(vkCreateDynamicColorBlendState, dev, &info);
 }
 
-NON_DISPATCHABLE_HANDLE_DTOR(DynamicDepthStencilState, vkDestroyObject, VK_OBJECT_TYPE_DYNAMIC_DS_STATE)
+NON_DISPATCHABLE_HANDLE_DTOR(DynamicDepthStencilState, vkDestroyDynamicDepthStencilState)
 
 void DynamicDepthStencilState::init(const Device &dev, const VkDynamicDepthStencilStateCreateInfo &info)
 {
@@ -819,7 +826,7 @@
 CmdBuffer::~CmdBuffer()
 {
     if (initialized())
-        EXPECT(vkDestroyObject(dev_handle_, VK_OBJECT_TYPE_COMMAND_BUFFER, handle()) == VK_SUCCESS);
+        EXPECT(vkDestroyCommandBuffer(dev_handle_, handle()) == VK_SUCCESS);
 }
 
 void CmdBuffer::init(const Device &dev, const VkCmdBufferCreateInfo &info)
diff --git a/tests/vktestbinding.h b/tests/vktestbinding.h
index 8480890..2a30ea9 100644
--- a/tests/vktestbinding.h
+++ b/tests/vktestbinding.h
@@ -539,7 +539,10 @@
     ~DescriptorSet();
 
     explicit DescriptorSet() : NonDispHandle() {}
-    explicit DescriptorSet(const Device &dev, VkDescriptorSet set) : NonDispHandle(dev.handle(), set) {}
+    explicit DescriptorSet(const Device &dev, VkDescriptorPool pool, VkDescriptorSet set) : NonDispHandle(dev.handle(), set) { pool_ = pool;}
+
+private:
+    VkDescriptorPool pool_;
 };
 
 class DynamicViewportState : public internal::NonDispHandle<VkDynamicViewportState> {
diff --git a/tests/vktestframework.cpp b/tests/vktestframework.cpp
index 1b8315b..3edc058 100644
--- a/tests/vktestframework.cpp
+++ b/tests/vktestframework.cpp
@@ -482,7 +482,8 @@
     VkCmdBuffer cmdBufs[1];
     cmdBufs[0] = m_cmdbuf.handle();
 
-    vkQueueSubmit(m_queue.handle(), 1, cmdBufs, NULL);
+    VkFence nullFence = { VK_NULL_HANDLE };
+    vkQueueSubmit(m_queue.handle(), 1, cmdBufs, nullFence);
     m_queue.wait();
 
     VkPresentInfoWSI present = {};