diff --git a/gb-emu/Cargo.toml b/gb-emu/Cargo.toml
index fa5d0ae..84fa839 100644
--- a/gb-emu/Cargo.toml
+++ b/gb-emu/Cargo.toml
@@ -10,7 +10,11 @@ identifier = "com.alexjanka.TWINC"
 [features]
 default = ["vulkan-static"]
 pixels = ["gb-emu-lib/pixels-renderer"]
-vulkan = ["dep:raw-window-handle", "gb-emu-lib/vulkan-renderer"]
+vulkan = [
+	"dep:raw-window-handle",
+	"gb-emu-lib/vulkan-renderer",
+	"gb-emu-lib/vulkan-debug",
+]
 vulkan-static = ["vulkan", "gb-emu-lib/vulkan-static"]
 camera = ["dep:nokhwa", "dep:send_wrapper"]
 
diff --git a/gb-vst/src/lib.rs b/gb-vst/src/lib.rs
index f6452a3..82ec4e1 100644
--- a/gb-vst/src/lib.rs
+++ b/gb-vst/src/lib.rs
@@ -7,7 +7,6 @@ use gb_emu_lib::{
         AudioOutput, CgbRomType, DownsampleType, EmulatorCoreTrait, EmulatorMessage,
         EmulatorOptions, NoCamera, RendererMessage, RomFile, SerialTarget,
     },
-    renderer::RendererBackendManager,
     EmulatorCore, HEIGHT, WIDTH,
 };
 use nih_plug::prelude::*;
@@ -21,7 +20,7 @@ use std::{
         Arc, Mutex, OnceLock, RwLock,
     },
 };
-use ui::Emulator;
+use ui::TwincEditor;
 
 mod ui;
 
@@ -112,7 +111,6 @@ pub struct GameboyEmu {
     vars: Option<EmuVars>,
     emu_comms: Arc<Mutex<Option<EmuComms>>>,
     params: Arc<EmuParams>,
-    renderer_manager: Arc<Mutex<Option<Arc<RendererBackendManager>>>>,
 }
 
 const BUFFERS_PER_FRAME: usize = 1;
@@ -279,11 +277,7 @@ impl Plugin for GameboyEmu {
             (HEIGHT * configs.vst_config.scale_factor) as f64,
         );
 
-        Some(Box::new(Emulator::new(
-            self.emu_comms.clone(),
-            self.renderer_manager.clone(),
-            size,
-        )))
+        Some(Box::new(TwincEditor::new(self.emu_comms.clone(), size)))
     }
 
     fn initialize(
diff --git a/gb-vst/src/ui.rs b/gb-vst/src/ui.rs
index b9c97a5..dfecefc 100644
--- a/gb-vst/src/ui.rs
+++ b/gb-vst/src/ui.rs
@@ -1,6 +1,8 @@
 use std::sync::{Arc, Mutex};
 
-use baseview::{Event, EventStatus, Size, Window, WindowEvent, WindowHandler, WindowOpenOptions};
+use baseview::{
+    Event, EventStatus, Size, Window, WindowEvent, WindowHandle, WindowHandler, WindowOpenOptions,
+};
 use gb_emu_lib::{
     connect::{JoypadButtons, JoypadState, RendererMessage, ResolutionData, HEIGHT, WIDTH},
     renderer::{RendererBackend, RendererBackendManager, WindowOptions},
@@ -10,27 +12,18 @@ use nih_plug::prelude::*;
 
 use crate::{access_config, EmuComms};
 
-pub struct Emulator {
+pub struct TwincEditor {
     emu_comms: Arc<Mutex<Option<EmuComms>>>,
-    manager: Arc<Mutex<Option<Arc<RendererBackendManager>>>>,
     size: Size,
 }
 
-impl Emulator {
-    pub fn new(
-        emu_comms: Arc<Mutex<Option<EmuComms>>>,
-        manager: Arc<Mutex<Option<Arc<RendererBackendManager>>>>,
-        size: Size,
-    ) -> Self {
-        Self {
-            emu_comms,
-            manager,
-            size,
-        }
+impl TwincEditor {
+    pub fn new(emu_comms: Arc<Mutex<Option<EmuComms>>>, size: Size) -> Self {
+        Self { emu_comms, size }
     }
 }
 
-impl Editor for Emulator {
+impl Editor for TwincEditor {
     fn spawn(
         &self,
         parent: ParentWindowHandle,
@@ -50,9 +43,10 @@ impl Editor for Emulator {
         //     )
         // };
 
+        let config = access_config();
+
         #[cfg(feature = "vulkan")]
         let shader_path = {
-            let config = access_config();
             if crate::IS_CGB.get().is_some_and(|v| *v) {
                 config.emu_config.vulkan_config.cgb_shader_path.as_ref()
             } else {
@@ -61,38 +55,42 @@ impl Editor for Emulator {
             .map(|p| config.config_dir.join(p))
         };
 
-        let scale_factor = access_config().vst_config.scale_factor;
+        let scale_factor = config.vst_config.scale_factor;
 
         let size = Size::new(
             (WIDTH * scale_factor) as f64,
             (HEIGHT * scale_factor) as f64,
         );
 
-        let m = self.manager.clone();
-
-        Window::open_parented(
+        let window = Window::open_parented(
             &parent,
             WindowOpenOptions {
                 title: String::from("gb-emu"),
                 size,
                 scale: baseview::WindowScalePolicy::SystemScaleFactor,
             },
-            move |w| {
-                EmulatorWindow::new(
-                    w,
+            move |window| {
+                let manager = {
+                    #[cfg(feature = "vulkan")]
+                    {
+                        use raw_window_handle::HasRawDisplayHandle;
+                        Arc::new(RendererBackendManager::new(window.raw_display_handle()))
+                    }
+                    #[cfg(feature = "pixels")]
+                    Arc::new(RendererBackendManager::new())
+                };
+                TwincEditorWindow::new(
+                    window,
                     rr_cloned,
-                    m,
+                    manager,
                     size,
                     #[cfg(feature = "vulkan")]
                     shader_path,
                 )
             },
         );
-        Box::new(Self::new(
-            self.emu_comms.clone(),
-            self.manager.clone(),
-            size,
-        ))
+
+        Box::new(TwincEditorWindowHandle { window })
     }
 
     fn size(&self) -> (u32, u32) {
@@ -110,7 +108,19 @@ impl Editor for Emulator {
     fn param_values_changed(&self) {}
 }
 
-pub struct EmulatorWindow {
+struct TwincEditorWindowHandle {
+    window: WindowHandle,
+}
+
+unsafe impl Send for TwincEditorWindowHandle {}
+
+impl Drop for TwincEditorWindowHandle {
+    fn drop(&mut self) {
+        self.window.close();
+    }
+}
+
+pub struct TwincEditorWindow {
     renderer: RendererBackend,
     manager: Arc<RendererBackendManager>,
     emu_comms: Arc<Mutex<Option<EmuComms>>>,
@@ -119,11 +129,11 @@ pub struct EmulatorWindow {
     current_resolution: ResolutionData,
 }
 
-impl EmulatorWindow {
+impl TwincEditorWindow {
     fn new(
         window: &mut Window,
         emu_comms: Arc<Mutex<Option<EmuComms>>>,
-        manager: Arc<Mutex<Option<Arc<RendererBackendManager>>>>,
+        manager: Arc<RendererBackendManager>,
         size: Size,
         #[cfg(feature = "vulkan")] shader_path: Option<std::path::PathBuf>,
     ) -> Self {
@@ -139,23 +149,12 @@ impl EmulatorWindow {
         #[cfg(feature = "pixels")]
         let window_options = WindowOptions {};
 
-        let mut guard = manager.lock().unwrap();
-
-        let m = guard.get_or_insert_with(|| {
-            #[cfg(feature = "vulkan")]
-            {
-                use raw_window_handle::HasRawDisplayHandle;
-                Arc::new(RendererBackendManager::new(window.raw_display_handle()))
-            }
-            #[cfg(feature = "pixels")]
-            Arc::new(RendererBackendManager::new())
-        });
-
-        let renderer = RendererBackend::new(current_resolution, window, window_options, m.clone());
+        let renderer =
+            RendererBackend::new(current_resolution, window, window_options, manager.clone());
 
         Self {
             renderer,
-            manager: m.clone(),
+            manager,
             emu_comms,
             joypad_state: Default::default(),
             latest_buf: Vec::new(),
@@ -186,7 +185,7 @@ impl EmulatorWindow {
     }
 }
 
-impl WindowHandler for EmulatorWindow {
+impl WindowHandler for TwincEditorWindow {
     fn on_frame(&mut self, _window: &mut Window) {
         self.process_events();
 
diff --git a/lib/Cargo.toml b/lib/Cargo.toml
index 86b7002..4145811 100644
--- a/lib/Cargo.toml
+++ b/lib/Cargo.toml
@@ -16,6 +16,7 @@ vulkan-renderer = [
 	"dep:librashader-common",
 ]
 vulkan-static = ["dep:ash-molten", "vulkan-renderer"]
+vulkan-debug = []
 pixels-renderer = ["dep:pixels"]
 config = ["dep:directories", "dep:ron"]
 error-colour = []
diff --git a/lib/src/renderer/vulkan/types.rs b/lib/src/renderer/vulkan/types.rs
index 158535b..462f06f 100644
--- a/lib/src/renderer/vulkan/types.rs
+++ b/lib/src/renderer/vulkan/types.rs
@@ -20,10 +20,10 @@ pub(super) struct VulkanData {
     pub(super) pdevice: vk::PhysicalDevice,
     pub(super) device: Device,
     pub(super) device_memory_properties: vk::PhysicalDeviceMemoryProperties,
-    pub(super) desc_set_layouts: [vk::DescriptorSetLayout; 1],
+    // pub(super) desc_set_layouts: [vk::DescriptorSetLayout; 1],
     pub(super) present_queue: vk::Queue,
 
-    pub(super) pool: vk::CommandPool,
+    // pub(super) pool: vk::CommandPool,
     pub(super) draw_command_buffer: vk::CommandBuffer,
     pub(super) setup_command_buffer: vk::CommandBuffer,
     pub(super) texture_copy_command_buffer: vk::CommandBuffer,
@@ -34,8 +34,7 @@ pub(super) struct VulkanData {
     pub(super) draw_commands_reuse_fence: vk::Fence,
     pub(super) setup_commands_reuse_fence: vk::Fence,
     pub(super) texture_copy_commands_reuse_fence: vk::Fence,
-
-    pub(super) descriptor_pool: vk::DescriptorPool,
+    // pub(super) descriptor_pool: vk::DescriptorPool,
 }
 
 impl VulkanData {
@@ -148,44 +147,44 @@ impl VulkanData {
             .create_semaphore(&semaphore_create_info, None)
             .unwrap();
 
-        let descriptor_sizes = [
-            vk::DescriptorPoolSize {
-                ty: vk::DescriptorType::UNIFORM_BUFFER,
-                descriptor_count: 1,
-            },
-            vk::DescriptorPoolSize {
-                ty: vk::DescriptorType::COMBINED_IMAGE_SAMPLER,
-                descriptor_count: 1,
-            },
-        ];
-        let descriptor_pool_info = vk::DescriptorPoolCreateInfo::builder()
-            .pool_sizes(&descriptor_sizes)
-            .max_sets(1)
-            .build();
+        // let descriptor_sizes = [
+        //     vk::DescriptorPoolSize {
+        //         ty: vk::DescriptorType::UNIFORM_BUFFER,
+        //         descriptor_count: 1,
+        //     },
+        //     vk::DescriptorPoolSize {
+        //         ty: vk::DescriptorType::COMBINED_IMAGE_SAMPLER,
+        //         descriptor_count: 1,
+        //     },
+        // ];
+        // let descriptor_pool_info = vk::DescriptorPoolCreateInfo::builder()
+        //     .pool_sizes(&descriptor_sizes)
+        //     .max_sets(1)
+        //     .build();
 
-        let descriptor_pool = device
-            .create_descriptor_pool(&descriptor_pool_info, None)
-            .unwrap();
-        let desc_layout_bindings = [vk::DescriptorSetLayoutBinding {
-            descriptor_type: vk::DescriptorType::COMBINED_IMAGE_SAMPLER,
-            descriptor_count: 1,
-            stage_flags: vk::ShaderStageFlags::FRAGMENT,
-            ..Default::default()
-        }];
-        let descriptor_info = vk::DescriptorSetLayoutCreateInfo::builder()
-            .bindings(&desc_layout_bindings)
-            .build();
+        // let descriptor_pool = device
+        //     .create_descriptor_pool(&descriptor_pool_info, None)
+        //     .unwrap();
+        // let desc_layout_bindings = [vk::DescriptorSetLayoutBinding {
+        //     descriptor_type: vk::DescriptorType::COMBINED_IMAGE_SAMPLER,
+        //     descriptor_count: 1,
+        //     stage_flags: vk::ShaderStageFlags::FRAGMENT,
+        //     ..Default::default()
+        // }];
+        // let descriptor_info = vk::DescriptorSetLayoutCreateInfo::builder()
+        //     .bindings(&desc_layout_bindings)
+        //     .build();
 
-        let desc_set_layouts = [device
-            .create_descriptor_set_layout(&descriptor_info, None)
-            .unwrap()];
+        // let desc_set_layouts = [device
+        //     .create_descriptor_set_layout(&descriptor_info, None)
+        //     .unwrap()];
 
         Self {
             pdevice,
             device,
             device_memory_properties,
             present_queue,
-            pool,
+            // pool,
             draw_command_buffer,
             setup_command_buffer,
             texture_copy_command_buffer,
@@ -194,8 +193,8 @@ impl VulkanData {
             draw_commands_reuse_fence,
             setup_commands_reuse_fence,
             texture_copy_commands_reuse_fence,
-            desc_set_layouts,
-            descriptor_pool,
+            // desc_set_layouts,
+            // descriptor_pool,
         }
     }
 }
@@ -226,10 +225,6 @@ impl SurfaceData {
             surface_loader,
         }
     }
-
-    pub(super) unsafe fn manual_drop(&mut self) {
-        self.surface_loader.destroy_surface(self.surface, None);
-    }
 }
 
 pub(super) struct SwapchainData {
diff --git a/lib/src/renderer/vulkan/vulkan.rs b/lib/src/renderer/vulkan/vulkan.rs
index 1edad64..fc6d683 100644
--- a/lib/src/renderer/vulkan/vulkan.rs
+++ b/lib/src/renderer/vulkan/vulkan.rs
@@ -14,7 +14,7 @@ use self::{
     },
 };
 
-#[cfg(debug_assertions)]
+#[cfg(all(debug_assertions, feature = "vulkan-debug"))]
 mod debug;
 mod types;
 mod utils;
@@ -28,7 +28,7 @@ const VERTICES: [Vertex; 3] = [Vertex(-1.0, -1.0), Vertex(3.0, -1.0), Vertex(-1.
 pub struct RendererBackendManager {
     entry: Entry,
     instance: Instance,
-    #[cfg(debug_assertions)]
+    #[cfg(all(debug_assertions, feature = "vulkan-debug"))]
     #[allow(dead_code)]
     debug: debug::VulkanDebug,
 }
@@ -47,7 +47,7 @@ impl RendererBackendManager {
             .unwrap()
             .to_vec();
 
-        #[cfg(debug_assertions)]
+        #[cfg(all(debug_assertions, feature = "vulkan-debug"))]
         extension_names.push(ash::extensions::ext::DebugUtils::name().as_ptr());
 
         #[cfg(any(target_os = "macos", target_os = "ios"))]
@@ -80,7 +80,7 @@ impl RendererBackendManager {
         let instance = unsafe { entry.create_instance(&create_info, None) }.unwrap();
 
         Self {
-            #[cfg(debug_assertions)]
+            #[cfg(all(debug_assertions, feature = "vulkan-debug"))]
             debug: debug::VulkanDebug::new(&entry, &instance),
             entry,
             instance,
@@ -207,9 +207,7 @@ impl RendererBackend {
 
 struct VulkanWindowInner {
     vulkan_data: VulkanData,
-    vertex_input_buffer: vk::Buffer,
     renderpass: vk::RenderPass,
-    vertex_input_buffer_memory: vk::DeviceMemory,
     swapchain: SwapchainData,
     surface: SurfaceData,
     framebuffers: FramebufferData,
@@ -336,9 +334,7 @@ impl VulkanWindowInner {
         );
 
         Self {
-            vertex_input_buffer,
             renderpass,
-            vertex_input_buffer_memory,
             swapchain,
             surface,
             framebuffers,
@@ -539,21 +535,6 @@ impl Drop for VulkanWindowInner {
         unsafe {
             self.vulkan_data.device.device_wait_idle().unwrap();
 
-            self.vulkan_data
-                .device
-                .free_memory(self.vertex_input_buffer_memory, None);
-            self.vulkan_data
-                .device
-                .destroy_buffer(self.vertex_input_buffer, None);
-            for &descriptor_set_layout in self.vulkan_data.desc_set_layouts.iter() {
-                self.vulkan_data
-                    .device
-                    .destroy_descriptor_set_layout(descriptor_set_layout, None);
-            }
-            self.vulkan_data
-                .device
-                .destroy_descriptor_pool(self.vulkan_data.descriptor_pool, None);
-
             for framebuffer in &self.framebuffers.framebuffers {
                 self.vulkan_data
                     .device
@@ -576,12 +557,11 @@ impl Drop for VulkanWindowInner {
                 .device
                 .destroy_fence(self.vulkan_data.setup_commands_reuse_fence, None);
 
-            self.vulkan_data
-                .device
-                .destroy_command_pool(self.vulkan_data.pool, None);
             self.swapchain.manual_drop(&self.vulkan_data);
             self.vulkan_data.device.destroy_device(None);
-            self.surface.manual_drop();
+            self.surface
+                .surface_loader
+                .destroy_surface(self.surface.surface, None);
         }
     }
 }