diff --git a/src/core/vulkan/mod.rs b/src/core/vulkan/mod.rs
index 29fe224..b4833ac 100644
--- a/src/core/vulkan/mod.rs
+++ b/src/core/vulkan/mod.rs
@@ -1,7 +1,9 @@
 use vulkan_context::VulkanContext;
 use window_render_context::WindowRenderContext;
 
-use bevy_app::App;
+use bevy_app::{App, Plugin};
+
+use super::window::raw_handle::WindowWrapper;
 
 mod utils;
 mod vulkan_context;
@@ -13,16 +15,20 @@ pub enum VulkanError {
     FailedToCreateVulkanContext,
 }
 
-pub struct Vulkan;
+pub struct VulkanPlugin;
 
-impl Vulkan {
-    pub fn new(app: &mut App) -> Result<(), VulkanError> {
+impl Plugin for VulkanPlugin {
+    fn build(&self, app: &mut App) {
         let vulkan_context = VulkanContext::from(app as &App);
         app.world_mut().insert_resource(vulkan_context);
+    }
 
+    fn ready(&self, app: &App) -> bool {
+        app.world().get_resource::<WindowWrapper>().is_some()
+    }
+
+    fn finish(&self, app: &mut App) {
         let window_render_context = WindowRenderContext::from(app as &App);
         app.world_mut().insert_resource(window_render_context);
-
-        Ok(())
     }
 }
diff --git a/src/core/window/mod.rs b/src/core/window/mod.rs
index 4a19fee..1576e63 100644
--- a/src/core/window/mod.rs
+++ b/src/core/window/mod.rs
@@ -1,4 +1,4 @@
-use bevy_app::{App, AppExit, PluginsState};
+use bevy_app::{App, AppExit, Plugin, PluginsState};
 use config::WindowConfig;
 use raw_handle::{DisplayHandleWrapper, EventLoopProxyWrapper};
 use state::WindowState;
@@ -14,23 +14,24 @@ pub enum WindowError {
     FailedToCreateEventLoop,
 }
 
-pub struct Window;
+pub struct WindowPlugin {
+    pub window_config: WindowConfig,
+}
 
-impl Window {
-    pub fn new(app: &mut App, window_config: WindowConfig) -> Result<(), WindowError> {
+impl Plugin for WindowPlugin {
+    fn build(&self, app: &mut App) {
         let world = app.world_mut();
-        world.insert_resource(window_config);
+        world.insert_resource(self.window_config.clone());
 
         let mut event_loop_builder = EventLoop::with_user_event();
         let event_loop = event_loop_builder
             .build()
-            .map_err(|_| WindowError::FailedToCreateEventLoop)?;
+            .map_err(|_| WindowError::FailedToCreateEventLoop)
+            .expect("Failed to create event loop");
 
         world.insert_resource(DisplayHandleWrapper(event_loop.owned_display_handle()));
 
         app.set_runner(Box::new(move |app| runner(app, event_loop)));
-
-        Ok(())
     }
 }
 
diff --git a/src/core/window/state.rs b/src/core/window/state.rs
index 58d78d2..5654022 100644
--- a/src/core/window/state.rs
+++ b/src/core/window/state.rs
@@ -1,16 +1,13 @@
 use std::sync::Arc;
 
 use bevy_app::{App, PluginsState};
-use bevy_ecs::{event, world::World};
+use bevy_ecs::world::World;
 use winit::{
     application::ApplicationHandler, event::WindowEvent, event_loop::ActiveEventLoop,
     window::WindowId,
 };
 
-use super::{
-    config::WindowConfig,
-    raw_handle::{DisplayHandleWrapper, WindowWrapper},
-};
+use super::{config::WindowConfig, raw_handle::WindowWrapper};
 
 pub struct WindowState {
     app: App,
@@ -54,14 +51,14 @@ impl ApplicationHandler for WindowState {
                 if self.app.plugins_state() == PluginsState::Cleaned {
                     self.app.update();
                 }
+
+                let window_wrapper = self.app.world().get_resource::<WindowWrapper>().unwrap();
+
+                window_wrapper.0.request_redraw();
             }
             _ => {}
         }
     }
 
-    fn about_to_wait(&mut self, _event_loop: &ActiveEventLoop) {
-        let window_wrapper = self.app.world().get_resource::<WindowWrapper>().unwrap();
-
-        window_wrapper.0.request_redraw();
-    }
+    fn about_to_wait(&mut self, _event_loop: &ActiveEventLoop) {}
 }
diff --git a/src/game/mod.rs b/src/game/mod.rs
index 903a179..e141086 100644
--- a/src/game/mod.rs
+++ b/src/game/mod.rs
@@ -1,8 +1,8 @@
 use bevy_app::App;
 
 use crate::core::{
-    vulkan::Vulkan,
-    window::{Window, config::WindowConfig},
+    vulkan,
+    window::{self, config::WindowConfig},
 };
 
 pub mod test_plugin;
@@ -14,7 +14,11 @@ pub fn init(app: &mut App) {
         height: 600,
     };
 
-    app.add_plugins(test_plugin::TestPlugin);
-    Window::new(app, window_config).unwrap();
+    app.add_plugins((
+        test_plugin::TestPlugin,
+        window::WindowPlugin { window_config },
+        vulkan::VulkanPlugin,
+    ));
+    // Window::new(app, window_config).unwrap();
     // Vulkan::new(app).unwrap();
 }