diff --git a/config/Sources.cmake b/config/Sources.cmake
index 41cd0c20f2106dc02700d9b23227f3e6c34a057a..66068e64cb3bd15cdaeab0c3c35515888223ca5f 100644
--- a/config/Sources.cmake
+++ b/config/Sources.cmake
@@ -75,6 +75,12 @@ set(vkcv_sources
 		
 		${vkcv_source}/vkcv/SamplerManager.hpp
 		${vkcv_source}/vkcv/SamplerManager.cpp
+
+		${vkcv_include}/vkcv/WindowManager.hpp
+		${vkcv_source}/vkcv/WindowManager.cpp
+
+		${vkcv_include}/vkcv/SwapchainManager.hpp
+		${vkcv_source}/vkcv/SwapchainManager.cpp
         
         ${vkcv_include}/vkcv/DescriptorWrites.hpp
         
diff --git a/include/vkcv/SwapchainManager.hpp b/include/vkcv/SwapchainManager.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..197bbc731133272f2731005e1d2f88add7a6109d
--- /dev/null
+++ b/include/vkcv/SwapchainManager.hpp
@@ -0,0 +1,41 @@
+#pragma once
+
+#include <vector>
+#include <GLFW/glfw3.h>
+
+#include "vkcv/WindowManager.hpp"
+#include "vkcv/Swapchain.hpp"
+#include "vkcv/Handles.hpp"
+
+namespace vkcv {
+	class Core;
+
+	class SwapchainManager {
+		friend class Core;
+
+		friend class WindowManager;
+
+	private:
+
+		void destroySwapchainById(uint64_t id);
+
+	public:
+		SwapchainManager() noexcept;
+
+		~SwapchainManager() noexcept;
+
+		SwapchainManager(SwapchainManager &&other) = delete;
+
+		SwapchainManager(const SwapchainManager &other) = delete;
+
+		SwapchainManager &operator=(SwapchainManager &&other) = delete;
+
+		SwapchainManager &operator=(const SwapchainManager &other) = delete;
+
+		SwapchainHandle createSwapchain(Window &window, Context &context);
+
+		[[nodiscard]]
+		Swapchain &getSwapchain(const SwapchainHandle handle) const;
+
+	};
+}
\ No newline at end of file
diff --git a/include/vkcv/WindowManager.hpp b/include/vkcv/WindowManager.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..3fe66adeb15fd3802adadc985c4f6626dfbd3512
--- /dev/null
+++ b/include/vkcv/WindowManager.hpp
@@ -0,0 +1,47 @@
+#pragma once
+
+#include <vector>
+#include <GLFW/glfw3.h>
+
+#include "vkcv/Window.hpp"
+#include "vkcv/Handles.hpp"
+
+namespace vkcv {
+	class Core;
+
+	class WindowManager {
+		friend class Core;
+
+	private:
+
+		void destroyWindowById(uint64_t id);
+
+	public:
+		WindowManager() noexcept;
+
+		~WindowManager() noexcept;
+
+		WindowManager(WindowManager &&other) = delete;
+
+		WindowManager(const WindowManager &other) = delete;
+
+		WindowManager &operator=(WindowManager &&other) = delete;
+
+		WindowManager &operator=(const WindowManager &other) = delete;
+
+		WindowHandle createWindow(Core &core, const char *applicationName, uint32_t windowWidth, uint32_t windowHeight,
+								  bool resizeable);
+
+		[[nodiscard]]
+		Window &getWindow(const WindowHandle handle) const;
+
+		/**
+		 * Forwards the event poll to "vkcv/Window.hpp"
+		 */
+		static void pollEvents();
+
+		static bool hasOpenWindow();
+
+		static const Window getFocusedWindow();
+	};
+}
\ No newline at end of file
diff --git a/src/vkcv/SwapchainManager.cpp b/src/vkcv/SwapchainManager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b97a645e6bf28d63d995473b607a80dd114e8930
--- /dev/null
+++ b/src/vkcv/SwapchainManager.cpp
@@ -0,0 +1,36 @@
+#include <vkcv/SwapchainManager.hpp>
+
+namespace vkcv {
+	static std::vector<Swapchain> m_swapchains;
+
+	SwapchainManager::SwapchainManager() noexcept {
+	}
+
+	SwapchainManager::~SwapchainManager() noexcept {
+		for (uint64_t id = 0; id < m_swapchains.size(); id++) {
+			destroySwapchainById(id);
+		}
+		m_swapchains.clear();
+	}
+
+	[[maybe_unused]] SwapchainHandle SwapchainManager::createSwapchain(Window &window, Context &context) {
+		const uint64_t id = m_swapchains.size();
+
+		Swapchain swapchain = Swapchain::create(window, context);
+
+		m_swapchains.push_back(swapchain);
+		return SwapchainHandle(id, [&](uint64_t id) { destroySwapchainById(id); });
+	}
+
+	Swapchain &SwapchainManager::getSwapchain(const SwapchainHandle handle) const {
+		return m_swapchains[handle.getId()];
+	}
+
+	void SwapchainManager::destroySwapchainById(uint64_t id) {
+
+		if (id >= m_swapchains.size()) {
+			vkcv_log(LogLevel::ERROR, "Invalid id");
+			return;
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/vkcv/WindowManager.cpp b/src/vkcv/WindowManager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..73d9826680781486ba11ca0a6e0dbe666ed2c2df
--- /dev/null
+++ b/src/vkcv/WindowManager.cpp
@@ -0,0 +1,71 @@
+#include "vkcv/WindowManager.hpp"
+#include "vkcv/Core.hpp"
+
+namespace vkcv {
+	static std::vector<Window> m_windows;
+
+	WindowManager::WindowManager() noexcept {
+	}
+
+	WindowManager::~WindowManager() noexcept {
+		for (uint64_t id = 0; id < m_windows.size(); id++) {
+			destroyWindowById(id);
+		}
+		m_windows.clear();
+	}
+
+	WindowHandle WindowManager::createWindow(
+			Core &core,
+			const char *applicationName,
+			uint32_t windowWidth,
+			uint32_t windowHeight,
+			bool resizeable) {
+		const uint64_t id = m_windows.size();
+
+		vkcv::Window window = vkcv::Window(applicationName, windowWidth, windowHeight, resizeable);
+
+		Swapchain swapChain = Swapchain::create(window, core.getContext());
+
+		if (resizeable) {
+			window.e_resize.add([&](int width, int height) {
+				// m_swapchain.signalSwapchainRecreation(); // swapchain signal
+			});
+		}
+
+		m_windows.push_back(window);
+		return WindowHandle(id, [&](uint64_t id) { destroyWindowById(id); });
+	}
+
+	Window &WindowManager::getWindow(const WindowHandle handle) const {
+		return m_windows[handle.getId()];
+	}
+
+	void WindowManager::destroyWindowById(uint64_t id) {
+
+		if (id >= m_windows.size()) {
+			vkcv_log(LogLevel::ERROR, "Invalid id");
+			return;
+		}
+
+		Window &window = m_windows[id];
+		window.destroyWindow();
+		m_windows[id] = nullptr;
+	}
+
+	void WindowManager::pollEvents() {
+		Window::pollEvents();
+	}
+
+	bool WindowManager::hasOpenWindow() {
+		for (auto &window : m_windows) {
+			if (window.isOpen()) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	const Window WindowManager::getFocusedWindow() {
+		return Window::getFocusedWindow();
+	}
+}
\ No newline at end of file