diff --git a/NothinFancy/src/client/render/RenderEngine.cpp b/NothinFancy/src/client/render/RenderEngine.cpp
index 0ad545a..6968049 100644
--- a/NothinFancy/src/client/render/RenderEngine.cpp
+++ b/NothinFancy/src/client/render/RenderEngine.cpp
@@ -13,6 +13,9 @@ namespace nf::cli::render {
         , m_physicalDevice()
         , m_queueFIGraphics()
         , m_queueFIPresent()
+        , m_device()
+        , m_queueGraphics()
+        , m_queuePresent()
     {
         NFLog("Initializing render engine");
         m_window->setDisplay(m_display);
@@ -21,6 +24,7 @@ namespace nf::cli::render {
         createInstance();
         createSurface(m_window->getHandle());
         pickPhysicalDevice();
+        createDevice();
     }
 
     void RenderEngine::createInstance() {
@@ -125,7 +129,38 @@ namespace nf::cli::render {
             NFError("No Vulkan GPUs were found to be compatible");
     }
 
+    void RenderEngine::createDevice() {
+        std::set<uint32_t> uniqueQueueFamilyIndices = { m_queueFIGraphics, m_queueFIPresent };
+
+        float queuePriority = 1.0f;
+        std::vector<VkDeviceQueueCreateInfo> queueCIs;
+        for (uint32_t currentQueueFamilyIndex : uniqueQueueFamilyIndices) {
+            VkDeviceQueueCreateInfo queueCI = { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO };
+            queueCI.queueFamilyIndex = currentQueueFamilyIndex;
+            queueCI.queueCount = 1;
+            queueCI.pQueuePriorities = &queuePriority;
+            queueCIs.push_back(queueCI);
+        }
+
+        VkPhysicalDeviceFeatures features = {};
+
+        VkDeviceCreateInfo deviceCI = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO };
+        deviceCI.queueCreateInfoCount = queueCIs.size();
+        deviceCI.pQueueCreateInfos = queueCIs.data();
+        deviceCI.pEnabledFeatures = &features;
+
+        const char* swapChainExtName = VK_KHR_SWAPCHAIN_EXTENSION_NAME;
+        deviceCI.enabledExtensionCount = 1;
+        deviceCI.ppEnabledExtensionNames = &swapChainExtName;
+        if (vkCreateDevice(m_physicalDevice, &deviceCI, nullptr, &m_device) != VK_SUCCESS)
+            NFError("Could not create Vulkan device");
+
+        vkGetDeviceQueue(m_device, m_queueFIGraphics, 0, &m_queueGraphics);
+        vkGetDeviceQueue(m_device, m_queueFIPresent, 0, &m_queuePresent);
+    }
+
     RenderEngine::~RenderEngine() {
+        vkDestroyDevice(m_device, nullptr);
         vkDestroySurfaceKHR(m_instance, m_surface, nullptr);
         vkDestroyInstance(m_instance, nullptr);
     }
diff --git a/NothinFancy/src/client/render/RenderEngine.h b/NothinFancy/src/client/render/RenderEngine.h
index 554cd87..28222d9 100644
--- a/NothinFancy/src/client/render/RenderEngine.h
+++ b/NothinFancy/src/client/render/RenderEngine.h
@@ -14,6 +14,7 @@ namespace nf::cli::render {
         void createInstance();
         void createSurface(HWND window);
         void pickPhysicalDevice();
+        void createDevice();
 
         std::shared_ptr<Window> m_window;
         DisplayConfig m_display;
@@ -22,5 +23,7 @@ namespace nf::cli::render {
         VkSurfaceKHR m_surface;
         VkPhysicalDevice m_physicalDevice;
         uint32_t m_queueFIGraphics, m_queueFIPresent;
+        VkDevice m_device;
+        VkQueue m_queueGraphics, m_queuePresent;
     };
 }