diff --git a/Assets/Scripts/Core/Game/GameStateController.cs b/Assets/Scripts/Core/Game/GameStateController.cs
index b63e3fd103270c48956d045eeeae61ae4a1f8c8c..29bb07cbc7cf5a610b2eeb2fbe6934fa88392abc 100644
--- a/Assets/Scripts/Core/Game/GameStateController.cs
+++ b/Assets/Scripts/Core/Game/GameStateController.cs
@@ -6,15 +6,22 @@ using UnityEngine;
 public class GameStateController {
     // Attributes
     private readonly Stack<GameState> gameStateStack = new();
-    event StackChangeEvent<GameState> OnGameStateChange;
+    event GameStateChangeEvent OnGameStateChange;
     event Action OnPaused;
 
     // Constructor
     public GameStateController(){
         gameStateStack.Push(GameState.NULL);
+        gameStateStack.Push(GameState.RUNNING);
+        OnGameStateChange += LogGameStateStack;
     }
 
     // Functions
+    private void LogGameStateStack(StackChangeEventArgs<GameState> e){
+        Debug.Log(e.EventType);
+        Debug.Log(gameStateStack);
+    }
+
     public void PushState(GameState gameState){
         switch(gameState){
             case GameState.PAUSED:
@@ -23,7 +30,7 @@ public class GameStateController {
             case GameState.RUNNING:
                 Time.timeScale = 1;
                 break;
-            //TODO: Review cutscenes behaviour
+            //TODO: Review cutscenes and menu behaviour
             case GameState.CUTSCENE:
                 Time.timeScale = 0;
                 break;
@@ -34,7 +41,7 @@ public class GameStateController {
                 throw new Exception("Invalid gameState pushed to GameStateController, please refer to enum GameState for valid states");
         }
         gameStateStack.Push(gameState);
-        OnGameStateChange.Invoke(new StackChangeEventArgs<GameState>(
+        OnGameStateChange?.Invoke(new GameStateChangeArgs(
             StackChangeEventType.PUSH,
             gameStateStack.Count,
             gameState
@@ -59,8 +66,8 @@ public class GameStateController {
                 Time.timeScale = 0;
                 break;
         }
-        OnGameStateChange.Invoke(new StackChangeEventArgs<GameState>(
-            StackChangeEventType.PUSH,
+        OnGameStateChange?.Invoke(new GameStateChangeArgs(
+            StackChangeEventType.POP,
             gameStateStack.Count,
             gameState
         ));
@@ -70,7 +77,7 @@ public class GameStateController {
         switch (gameStateStack.Peek()){
             case GameState.RUNNING:
                 PushState(GameState.PAUSED);
-                OnPaused.Invoke();
+                OnPaused?.Invoke();
                 return;
 
             case GameState.PAUSED:
diff --git a/Assets/Scripts/Library/Enum/GameEventType.cs b/Assets/Scripts/Library/Enum/GameEventType.cs
new file mode 100644
index 0000000000000000000000000000000000000000..0252b7bbb00221078e577a370aa9d7cd95f4907d
--- /dev/null
+++ b/Assets/Scripts/Library/Enum/GameEventType.cs
@@ -0,0 +1,3 @@
+public enum GameEventType{
+    CHEAT
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Library/Enum/GameEventType.cs.meta b/Assets/Scripts/Library/Enum/GameEventType.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..e4f0d1ae92793d9037b2422f4bcd9f095eb02f73
--- /dev/null
+++ b/Assets/Scripts/Library/Enum/GameEventType.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 41b332ae7187a124789afd290f85cee9
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Library/Events/GameEvent.cs b/Assets/Scripts/Library/Events/GameEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..10086a8312a185ea231372911cb5b2582a1cdae0
--- /dev/null
+++ b/Assets/Scripts/Library/Events/GameEvent.cs
@@ -0,0 +1,10 @@
+using System;
+
+public class GameEventArgs : EventArgs{
+    public GameEventType EventType { get; }
+    public GameEventArgs(GameEventType eventType){
+        EventType = eventType;
+    }
+}
+
+public delegate void GameEvent(GameEventArgs e);
\ No newline at end of file
diff --git a/Assets/Scripts/Library/Events/GameEvent.cs.meta b/Assets/Scripts/Library/Events/GameEvent.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..c3bb62b93609f49720ec85baa1ae079a6d25514f
--- /dev/null
+++ b/Assets/Scripts/Library/Events/GameEvent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5230c920e65b9b34ea68dd5e60ccf3e7
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Library/Events/GameStateChangeEvent.cs b/Assets/Scripts/Library/Events/GameStateChangeEvent.cs
new file mode 100644
index 0000000000000000000000000000000000000000..ead0a904f4aea0bab54caa7cd432ee49e2d02182
--- /dev/null
+++ b/Assets/Scripts/Library/Events/GameStateChangeEvent.cs
@@ -0,0 +1,5 @@
+
+public class GameStateChangeArgs : StackChangeEventArgs<GameState>{
+    public GameStateChangeArgs(StackChangeEventType eventType, int index, GameState value) : base(eventType, index, value){}
+}
+public delegate void GameStateChangeEvent(GameStateChangeArgs e);
\ No newline at end of file
diff --git a/Assets/Scripts/Library/Events/GameStateChangeEvent.cs.meta b/Assets/Scripts/Library/Events/GameStateChangeEvent.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..54c950b93b0f5a4d6e386b192921802de3cc5746
--- /dev/null
+++ b/Assets/Scripts/Library/Events/GameStateChangeEvent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 25f336313940bf846bb06897a34c073c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: