diff --git a/source/States/GameState/ContextManager.cpp b/source/States/GameState/ContextManager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cbd7f8ae71c8f6db3d7f0252ff481f9f5e90ef8e
--- /dev/null
+++ b/source/States/GameState/ContextManager.cpp
@@ -0,0 +1,19 @@
+#include <States/GameState/ContextManager.h>
+
+void ContextManager::reset(GameContext&& context) {
+    while (!m_contexts.empty())
+        m_contexts.pop();
+    m_initial_context = std::move(context);
+    m_contexts.emplace(m_initial_context.clone());
+}
+
+void ContextManager::save_context() {
+    m_contexts.emplace(m_contexts.top().clone());
+}
+
+void ContextManager::restore_previous_context() {
+    if (m_contexts.size() > 1)
+        m_contexts.pop();
+    else
+        m_contexts.top() = m_initial_context.clone();
+}
diff --git a/source/States/GameState/ContextManager.h b/source/States/GameState/ContextManager.h
new file mode 100644
index 0000000000000000000000000000000000000000..8c0adc92e6207c911f2947e3d494a98eff186db9
--- /dev/null
+++ b/source/States/GameState/ContextManager.h
@@ -0,0 +1,14 @@
+#pragma once
+#include <States/GameState/GameContext.h>
+#include <stack>
+
+class ContextManager {
+public:
+    void reset(GameContext&& context);
+    GameContext& get_current_context() { return m_contexts.top(); }
+    void save_context();
+    void restore_previous_context();
+private:
+    GameContext m_initial_context;
+    std::stack<GameContext> m_contexts;
+};
diff --git a/source/States/GameState/GameState.cpp b/source/States/GameState/GameState.cpp
index 8aec6792c3c108d9275c2c895d8d2655d17a3176..56b7e71f197ff6487744f0ffbf9ccef23947969a 100644
--- a/source/States/GameState/GameState.cpp
+++ b/source/States/GameState/GameState.cpp
@@ -1,4 +1,4 @@
-#include "GameState.h"
+#include <States/GameState/GameState.h>
 #include <iostream> /// @todo remove it
 #include <States/ExitState/ExitState.h>
 
diff --git a/source/States/GameState/GameState.h b/source/States/GameState/GameState.h
index aa1d5ca80235302287185188bf758a7054ea1efe..2ddcd958e771c29025babcb772360e113cc00d75 100644
--- a/source/States/GameState/GameState.h
+++ b/source/States/GameState/GameState.h
@@ -1,12 +1,22 @@
 #pragma once
 #include <BasicAbstractions/IState.h>
 #include <BasicAbstractions/IWindowKeeper.h>
+#include <States/GameState/Maze/Maze.h>
+#include <States/GameState/ContextManager.h>
 
-struct GameState : IState, IWindowKeeper {
-    explicit GameState(IStateManager& state_manager, const sf::VideoMode& video_mode, const sf::String& window_title) : IState(state_manager), IWindowKeeper(video_mode, window_title) {}
+class GameState : IState, IWindowKeeper {
+public:
+    explicit GameState(IStateManager& state_manager, const sf::VideoMode& video_mode, const sf::String& window_title) :
+        IState(state_manager), IWindowKeeper(video_mode, window_title) {}
     bool do_step() override;
+    void set_maze(Maze&& maze) { m_maze = std::move(maze); }
+    void set_context(GameContext&& context) { m_context_manager.reset(std::move(context)); }
+private:
     void event_handling() override {};
     void update() override {};
     void render() override {};
+private:
+    Maze m_maze;
+    ContextManager m_context_manager;
 };
 
diff --git a/source/States/GameState/Maze/Maze.h b/source/States/GameState/Maze/Maze.h
index a188a840b6153f61bc6fd0ac7c7b47eceb5a2da6..7562d5a598b7276839bbd60ff4fb1cde0bb0ba89 100644
--- a/source/States/GameState/Maze/Maze.h
+++ b/source/States/GameState/Maze/Maze.h
@@ -6,6 +6,7 @@
 
 class Maze : public IDrawable {
 public:
+    Maze() = default;
     explicit Maze(std::vector<std::unique_ptr<Room>> rooms) : m_rooms(std::move(rooms)) {}
     void draw_into(sf::RenderWindow& window) const override;
 private:
diff --git a/source/States/SelectState/SelectState.h b/source/States/SelectState/SelectState.h
index ab2915e37d72bfff94ebc8b576bc1a9a4ea06a63..c0d43718df639bad32ac5d3594e540a27c324c22 100644
--- a/source/States/SelectState/SelectState.h
+++ b/source/States/SelectState/SelectState.h
@@ -33,6 +33,7 @@ public:
     explicit SelectState(IStateManager& state_manager, const sf::VideoMode& video_mode, const sf::String& window_title) :
     IState(state_manager), IWindowKeeper(video_mode, window_title), m_menu(state_manager) {}
     bool do_step() override;
+private:
     void event_handling() override;
     void update() override;
     void render() override;