diff --git a/overcooked_simulator/game_content/layouts_backup/basic.layout b/overcooked_simulator/game_content/layouts/basic.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/basic.layout
rename to overcooked_simulator/game_content/layouts/basic.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/empty.layout b/overcooked_simulator/game_content/layouts/empty.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/empty.layout
rename to overcooked_simulator/game_content/layouts/empty.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/large.layout b/overcooked_simulator/game_content/layouts/large.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/large.layout
rename to overcooked_simulator/game_content/layouts/large.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/large_t.layout b/overcooked_simulator/game_content/layouts/large_t.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/large_t.layout
rename to overcooked_simulator/game_content/layouts/large_t.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/1-1-far-apart.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-1-far-apart.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/1-1-far-apart.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/1-1-far-apart.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/1-2-pedestrians.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-2-pedestrians.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/1-2-pedestrians.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/1-2-pedestrians.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/1-3-moving-counters.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-3-moving-counters.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/1-3-moving-counters.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/1-3-moving-counters.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/1-4-bottleneck.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-4-bottleneck.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/1-4-bottleneck.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/1-4-bottleneck.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/1-5-circle.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-5-circle.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/1-5-circle.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/1-5-circle.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/1-6-raising-platforms.layout b/overcooked_simulator/game_content/layouts/overcooked-1/1-6-raising-platforms.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/1-6-raising-platforms.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/1-6-raising-platforms.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/2-1-moving-trucks.layout b/overcooked_simulator/game_content/layouts/overcooked-1/2-1-moving-trucks.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/2-1-moving-trucks.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/2-1-moving-trucks.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/2-2-rats.layout b/overcooked_simulator/game_content/layouts/overcooked-1/2-2-rats.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/2-2-rats.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/2-2-rats.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/2-3-separated-conveyors.layout b/overcooked_simulator/game_content/layouts/overcooked-1/2-3-separated-conveyors.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/2-3-separated-conveyors.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/2-3-separated-conveyors.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/2-4-separated-2.layout b/overcooked_simulator/game_content/layouts/overcooked-1/2-4-separated-2.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/2-4-separated-2.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/2-4-separated-2.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/3-1-ice.layout b/overcooked_simulator/game_content/layouts/overcooked-1/3-1-ice.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/3-1-ice.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/3-1-ice.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/3-2-separated-moving-counters.layout b/overcooked_simulator/game_content/layouts/overcooked-1/3-2-separated-moving-counters.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/3-2-separated-moving-counters.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/3-2-separated-moving-counters.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/3-3-moving-trucks-2.layout b/overcooked_simulator/game_content/layouts/overcooked-1/3-3-moving-trucks-2.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/3-3-moving-trucks-2.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/3-3-moving-trucks-2.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/3-4-ice-moving-platforms.layout b/overcooked_simulator/game_content/layouts/overcooked-1/3-4-ice-moving-platforms.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/3-4-ice-moving-platforms.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/3-4-ice-moving-platforms.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/4-1-moving-counters.layout b/overcooked_simulator/game_content/layouts/overcooked-1/4-1-moving-counters.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/4-1-moving-counters.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/4-1-moving-counters.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/4-2-dark.layout b/overcooked_simulator/game_content/layouts/overcooked-1/4-2-dark.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/4-2-dark.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/4-2-dark.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/4-3-moving-counters.layout b/overcooked_simulator/game_content/layouts/overcooked-1/4-3-moving-counters.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/4-3-moving-counters.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/4-3-moving-counters.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/overcooked-1/4-4-moving-counters-separated.layout b/overcooked_simulator/game_content/layouts/overcooked-1/4-4-moving-counters-separated.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/overcooked-1/4-4-moving-counters-separated.layout
rename to overcooked_simulator/game_content/layouts/overcooked-1/4-4-moving-counters-separated.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/rot_test.layout b/overcooked_simulator/game_content/layouts/rot_test.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/rot_test.layout
rename to overcooked_simulator/game_content/layouts/rot_test.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/split.layout b/overcooked_simulator/game_content/layouts/split.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/split.layout
rename to overcooked_simulator/game_content/layouts/split.layout
diff --git a/overcooked_simulator/game_content/layouts_backup/godot_test_layout.layout b/overcooked_simulator/game_content/layouts/test_layouts/godot_test_layout.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts_backup/godot_test_layout.layout
rename to overcooked_simulator/game_content/layouts/test_layouts/godot_test_layout.layout
diff --git a/overcooked_simulator/game_content/layouts/test1.layout b/overcooked_simulator/game_content/layouts/test_layouts/test1.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts/test1.layout
rename to overcooked_simulator/game_content/layouts/test_layouts/test1.layout
diff --git a/overcooked_simulator/game_content/layouts/test2.layout b/overcooked_simulator/game_content/layouts/test_layouts/test2.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts/test2.layout
rename to overcooked_simulator/game_content/layouts/test_layouts/test2.layout
diff --git a/overcooked_simulator/game_content/layouts/test3.layout b/overcooked_simulator/game_content/layouts/test_layouts/test3.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts/test3.layout
rename to overcooked_simulator/game_content/layouts/test_layouts/test3.layout
diff --git a/overcooked_simulator/game_content/layouts/test4.layout b/overcooked_simulator/game_content/layouts/test_layouts/test4.layout
similarity index 100%
rename from overcooked_simulator/game_content/layouts/test4.layout
rename to overcooked_simulator/game_content/layouts/test_layouts/test4.layout
diff --git a/overcooked_simulator/game_content/layouts/tutorial.layout b/overcooked_simulator/game_content/layouts/tutorial.layout
new file mode 100644
index 0000000000000000000000000000000000000000..9e80a7e4ffd96d1f2fe76aab7f9a556c6bcea21a
--- /dev/null
+++ b/overcooked_simulator/game_content/layouts/tutorial.layout
@@ -0,0 +1,4 @@
+#C##
+T__$
+L__#
+#P##
diff --git a/overcooked_simulator/gui_2d_vis/controller_tutorial.png b/overcooked_simulator/gui_2d_vis/controller_tutorial.png
index ff48c2ca5ac859a3156bfe5e0befac3ba5e3cd31..5b36df266fc541df523916dbe3e436d6650f05d4 100644
Binary files a/overcooked_simulator/gui_2d_vis/controller_tutorial.png and b/overcooked_simulator/gui_2d_vis/controller_tutorial.png differ
diff --git a/overcooked_simulator/gui_2d_vis/overcooked_gui.py b/overcooked_simulator/gui_2d_vis/overcooked_gui.py
index a119283fcf8792851ab79c214c28c1fa710d11bf..f11cdd346d0746d420b1487b77d021e8448cd0f1 100644
--- a/overcooked_simulator/gui_2d_vis/overcooked_gui.py
+++ b/overcooked_simulator/gui_2d_vis/overcooked_gui.py
@@ -37,6 +37,7 @@ from overcooked_simulator.utils import (
 
 CONNECT_WITH_STUDY_SERVER = False
 USE_AAAMBOS_AGENT = False
+SHOW_TUTORIAL_GAME = True
 
 
 class MenuStates(Enum):
@@ -252,9 +253,11 @@ class PyGameGUI:
                 if event.type == pygame.KEYDOWN:
                     key_set.next_player()
 
-    def set_game_size(self):
-        max_width = self.window_width - (2 * self.screen_margin)
-        max_height = self.window_height - (2 * self.screen_margin)
+    def set_game_size(self, max_width=None, max_height=None):
+        if max_width is None:
+            max_width = self.window_width - (2 * self.screen_margin)
+        if max_height is None:
+            max_height = self.window_height - (2 * self.screen_margin)
 
         self.kitchen_aspect_ratio = self.kitchen_height / self.kitchen_width
         if self.kitchen_width > self.kitchen_height:
@@ -467,14 +470,14 @@ class PyGameGUI:
             ROOT_DIR / "gui_2d_vis" / "controller_tutorial.png"
         ).convert_alpha()
         image_rect = image.get_rect()
-        image_rect.top = 40
+        image_rect.topleft = (40, 40)
         self.tutorial_image = pygame_gui.elements.UIImage(
             image_rect,
             image,
             manager=self.manager,
-            anchors={"centerx": "centerx", "top": "top"},
+            anchors={"top": "top", "left": "left"},
         )
-        img_height = self.window_height * 0.85
+        img_height = self.window_height * 0.8
         img_width = img_height * (image_rect.width / image_rect.height)
         new_dims = (img_width, img_height)
         self.tutorial_image.set_dimensions(new_dims)
@@ -500,6 +503,24 @@ class PyGameGUI:
             anchors={"right": "right", "top": "top"},
         )
 
+        if SHOW_TUTORIAL_GAME:
+            self.setup_environment(tutorial=True)
+
+            self.key_sets = self.setup_player_keys(
+                min(self.number_humans_to_be_added, 1), disjunct=False
+            )
+
+            self.vis.create_player_colors(self.number_players)
+            self.reset_gui_values()
+            self.set_game_size(
+                max_height=self.window_height * 0.4, max_width=self.window_width * 0.4
+            )
+            self.set_window_size()
+            self.game_center = (
+                self.window_width - self.game_width // 2 - 20,
+                self.window_height / 2 + 100,
+            )
+
     def show_pre_game_screen(self):
         self.manager = pygame_gui.UIManager((self.window_width, self.window_height))
         self.manager.get_theme().load_theme(ROOT_DIR / "gui_2d_vis" / "gui_theme.json")
@@ -610,7 +631,7 @@ class PyGameGUI:
         )
 
         next_game_button_rect = pygame.Rect((0, 0), (190, 50))
-        next_game_button_rect.center = (self.buttons_width // 2 - 200, 200)
+        next_game_button_rect.center = (self.buttons_width // 2, 200)
         self.next_game_button = pygame_gui.elements.UIButton(
             relative_rect=next_game_button_rect,
             manager=self.manager,
@@ -620,7 +641,7 @@ class PyGameGUI:
         )
 
         retry_button_rect = pygame.Rect((0, 0), (190, 50))
-        retry_button_rect.center = (self.buttons_width // 2 + 0, 200)
+        retry_button_rect.center = (self.buttons_width // 2 - 200, 200)
         self.retry_button = pygame_gui.elements.UIButton(
             relative_rect=retry_button_rect,
             manager=self.manager,
@@ -659,6 +680,17 @@ class PyGameGUI:
             anchors={"right": "right", "top": "top"},
         )
 
+        conclusion_rect = pygame.Rect(
+            0, 0, self.window_width * 0.6, self.window_height * 0.4
+        )
+        self.conclusion_label = pygame_gui.elements.UILabel(
+            text="Thank you!",
+            relative_rect=conclusion_rect,
+            manager=self.manager,
+            object_id="#score_label",
+            anchors={"center": "center"},
+        )
+
     def update_screen(self):
         match self.menu_state:
             case MenuStates.Start:
@@ -683,16 +715,33 @@ class PyGameGUI:
         match self.menu_state:
             case MenuStates.Start:
                 pass
-
+            case MenuStates.ControllerTutorial:
+                if SHOW_TUTORIAL_GAME:
+                    self.draw_tutorial_screen_frame()
             case MenuStates.Game:
                 self.draw_game_screen_frame()
 
-            case MenuStates.End:
+            case MenuStates.PostGame:
                 self.update_conclusion_label(self.last_state)
 
         self.manager.update(self.time_delta)
         pygame.display.flip()
 
+    def draw_tutorial_screen_frame(self):
+        self.handle_keys()
+
+        state = self.request_state()
+        self.vis.draw_gamescreen(
+            self.game_screen,
+            state,
+            self.grid_size,
+            [k.current_player for k in self.key_sets],
+        )
+
+        game_screen_rect = self.game_screen.get_rect()
+        game_screen_rect.center = self.game_center
+        self.main_window.blit(self.game_screen, game_screen_rect)
+
     def draw_game_screen_frame(self):
         self.last_state = self.request_state()
 
@@ -814,7 +863,7 @@ class PyGameGUI:
         display_time = f"{minutes}:{'%02d' % seconds}"
         self.timer_label.set_text(f"Time remaining: {display_time}")
 
-    def setup_environment(self):
+    def setup_environment(self, tutorial=False):
         if CONNECT_WITH_STUDY_SERVER:
             self.player_info = requests.post(
                 f"http://localhost:8080/connect_to_game/{uuid.uuid4().hex}"
@@ -825,7 +874,12 @@ class PyGameGUI:
             environment_config_path = (
                 ROOT_DIR / "game_content" / "environment_config.yaml"
             )
-            layout_path = self.layout_file_paths[self.current_layout_idx]
+
+            if tutorial:
+                layout_path = ROOT_DIR / "game_content" / "layouts" / "tutorial.layout"
+            else:
+                layout_path = self.layout_file_paths[self.current_layout_idx]
+
             item_info_path = ROOT_DIR / "game_content" / "item_info.yaml"
             with open(item_info_path, "r") as file:
                 item_info = file.read()
@@ -988,7 +1042,6 @@ class PyGameGUI:
         log.debug("Pressed quit button")
 
     def reset_button_press(self):
-        # self.reset_gui_values()
         if not CONNECT_WITH_STUDY_SERVER:
             requests.post(
                 f"{self.request_url}/manage/stop_env",
@@ -1025,6 +1078,9 @@ class PyGameGUI:
         self.currently_controlled_player_idx = 0
         self.number_humans_to_be_added = 1
         self.number_bots_to_be_added = 0
+        self.number_players = (
+            self.number_humans_to_be_added + self.number_bots_to_be_added
+        )
         self.split_players = False
         self.multiple_keysets = False
         self.player_minimum = 1
@@ -1041,7 +1097,6 @@ class PyGameGUI:
 
         text = "WASD+ARROW" if self.multiple_keysets else "WASD"
         self.multiple_keysets_button.set_text(text)
-        # self.split_players_button
         self.added_players_label.set_text(
             f"Humans to be added: {self.number_humans_to_be_added}"
         )
@@ -1162,6 +1217,7 @@ class PyGameGUI:
                 match event.ui_element:
                     case self.continue_button:
                         self.menu_state = MenuStates.PreGame
+                        self.disconnect_websockets()
                     case self.fullscreen_button:
                         self.fullscreen_button_press()
 
@@ -1242,10 +1298,13 @@ class PyGameGUI:
                         self.update_screen()
                         self.update_selection_elements()
 
-                    if (
-                        event.type in [pygame.KEYDOWN, pygame.KEYUP]
-                        and self.menu_state == MenuStates.Game
-                    ):
+                    if event.type in [
+                        pygame.KEYDOWN,
+                        pygame.KEYUP,
+                    ] and self.menu_state in [
+                        MenuStates.Game,
+                        MenuStates.ControllerTutorial,
+                    ]:
                         self.handle_key_event(event)
 
                     self.manager.process_events(event)