diff --git a/src/main.cpp b/src/main.cpp
index 42439f0..2e9de97 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2,6 +2,7 @@
 #include <vulkan/vulkan_raii.hpp>
 #include <GLFW/glfw3.h>
 #define GLM_FORCE_RADIANS
+#define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES
 #include <glm/glm.hpp>
 #include <glm/gtc/matrix_transform.hpp>
 
@@ -73,6 +74,8 @@ private:
     std::vector<vk::raii::ImageView> m_swapChainImageViews;
     vk::raii::RenderPass m_renderPass{ nullptr };
     vk::raii::DescriptorSetLayout m_descriptorSetLayout{ nullptr };
+    vk::raii::DescriptorPool m_descriptorPool{ nullptr };
+    std::vector<vk::raii::DescriptorSet> m_descriptorSets;
     vk::raii::PipelineLayout m_pipelineLayout{ nullptr };
     vk::raii::Pipeline m_graphicsPipeline{ nullptr };
     std::vector<vk::raii::Framebuffer> m_swapChainFramebuffers;
@@ -113,6 +116,8 @@ private:
         createVertexBuffer();
         createIndexBuffer();
         createUniformBuffers();
+        createDescriptorPool();
+        createDescriptorSets();
         createCommandBuffers();
         createSyncObjects();
     }
@@ -580,7 +585,7 @@ private:
         rasterizer.polygonMode = vk::PolygonMode::eFill;
         rasterizer.lineWidth = 1.0f;
         rasterizer.cullMode = vk::CullModeFlagBits::eBack;
-        rasterizer.frontFace = vk::FrontFace::eClockwise;
+        rasterizer.frontFace = vk::FrontFace::eCounterClockwise;
         rasterizer.depthBiasEnable = false;
 
         vk::PipelineMultisampleStateCreateInfo multisampling;
@@ -701,6 +706,14 @@ private:
         commandBuffer.bindVertexBuffers( 0, *m_vertexBuffer, vk::DeviceSize{0} );
         commandBuffer.bindIndexBuffer( m_indexBuffer, 0, vk::IndexType::eUint16 );
 
+        commandBuffer.bindDescriptorSets(
+            vk::PipelineBindPoint::eGraphics, 
+            m_pipelineLayout,
+            0,
+            *m_descriptorSets[m_currentFrame],
+            nullptr
+        );
+
         commandBuffer.drawIndexed(static_cast<uint32_t>(indices.size()), 1, 0, 0, 0);
 
         commandBuffer.endRenderPass();
@@ -975,7 +988,7 @@ private:
 
     /////////////////////////////////////////////////////////////////
     /// descriptor layout and buffer
-    struct UniformBufferObject {
+    struct alignas(16) UniformBufferObject {
         glm::mat4 model;
         glm::mat4 view;
         glm::mat4 proj;
@@ -1043,6 +1056,45 @@ private:
         memcpy(m_uniformBuffersMapped[currentImage], &ubo, sizeof(ubo));
     }
     /////////////////////////////////////////////////////////////////
+
+    /////////////////////////////////////////////////////////////////
+    /// descriptor pool and sets
+    void createDescriptorPool() {
+        vk::DescriptorPoolSize poolSize;
+        poolSize.type = vk::DescriptorType::eUniformBuffer;
+        poolSize.descriptorCount = static_cast<uint32_t>(MAX_FRAMES_IN_FLIGHT);
+        vk::DescriptorPoolCreateInfo poolInfo;
+        poolInfo.flags = vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet;
+        poolInfo.setPoolSizes( poolSize );
+        poolInfo.maxSets = static_cast<uint32_t>(MAX_FRAMES_IN_FLIGHT);
+
+        m_descriptorPool = m_device.createDescriptorPool(poolInfo);
+    }
+    void createDescriptorSets() {
+        std::vector<vk::DescriptorSetLayout> layouts(MAX_FRAMES_IN_FLIGHT, *m_descriptorSetLayout); 
+        vk::DescriptorSetAllocateInfo allocInfo;
+        allocInfo.descriptorPool = m_descriptorPool;
+        allocInfo.setSetLayouts( layouts );
+
+        m_descriptorSets = m_device.allocateDescriptorSets(allocInfo);
+
+        for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
+            vk::DescriptorBufferInfo bufferInfo;
+            bufferInfo.buffer = m_uniformBuffers[i];
+            bufferInfo.offset = 0;
+            bufferInfo.range = sizeof(UniformBufferObject);
+
+            vk::WriteDescriptorSet descriptorWrite;
+            descriptorWrite.dstSet = m_descriptorSets[i];
+            descriptorWrite.dstBinding = 0;
+            descriptorWrite.dstArrayElement = 0;
+            descriptorWrite.descriptorType = vk::DescriptorType::eUniformBuffer;
+            descriptorWrite.setBufferInfo(bufferInfo);
+
+            m_device.updateDescriptorSets(descriptorWrite, nullptr);
+        }
+    }
+    /////////////////////////////////////////////////////////////////
 };
 
 int main() {
