diff --git a/Assets/Scripts/UI/MainGame/PauseMenu.uxml b/Assets/Scripts/UI/MainGame/PauseMenu.uxml
new file mode 100644
index 00000000..f70c018f
--- /dev/null
+++ b/Assets/Scripts/UI/MainGame/PauseMenu.uxml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Assets/Scripts/UI/MainGame/PauseMenu.uxml.meta b/Assets/Scripts/UI/MainGame/PauseMenu.uxml.meta
new file mode 100644
index 00000000..3fcb58f0
--- /dev/null
+++ b/Assets/Scripts/UI/MainGame/PauseMenu.uxml.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: e3e0cc16574c4527819a5593fb1c692e
+timeCreated: 1781122620
\ No newline at end of file
diff --git a/Assets/Scripts/UI/MainGame/PauseMenuController.cs b/Assets/Scripts/UI/MainGame/PauseMenuController.cs
new file mode 100644
index 00000000..58c63592
--- /dev/null
+++ b/Assets/Scripts/UI/MainGame/PauseMenuController.cs
@@ -0,0 +1,147 @@
+using System;
+using Core.Constants;
+using Events.Game;
+using Events.UI;
+using UI.Common;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+using UnityEngine.UIElements;
+
+namespace UI.MainGame
+{
+ [RequireComponent(typeof(UIDocument))]
+ public class PauseMenuController : MonoBehaviour
+ {
+ [SerializeField] private UIDocument uiDocument;
+
+ [SerializeField] private PointerOverUiEventChannel pointerOverUiChannel;
+
+ [SerializeField] private PauseStateEventChannel pauseStateChannel;
+
+ private bool _isPaused;
+ private VisualElement _pauseOverlay;
+ private VisualElement _pauseOverlayHost;
+ private bool _pauseUiInitialized;
+ private bool _pointerBlockersRegistered;
+ private VisualElement _root;
+ private SettingsPanelController _settingsPanelController;
+ private UiPointerTracker _uiPointerTracker;
+
+ private void Awake()
+ {
+ if (uiDocument == null)
+ uiDocument = GetComponent();
+ }
+
+ private void LateUpdate()
+ {
+ if (!Input.GetKeyDown(KeyCode.Escape))
+ return;
+
+ if (_settingsPanelController is { IsOpen: true })
+ {
+ _settingsPanelController.Hide();
+ return;
+ }
+
+ SetPaused(!_isPaused);
+ }
+
+ private void OnEnable()
+ {
+ if (uiDocument == null || uiDocument.rootVisualElement == null)
+ return;
+
+ _root = uiDocument.rootVisualElement;
+ InitializePauseUi();
+ RegisterUiPointerBlockers();
+ }
+
+ private void OnDisable()
+ {
+ SetPaused(false);
+ }
+
+ private void InitializePauseUi()
+ {
+ if (_pauseUiInitialized || _root == null)
+ return;
+
+ _pauseOverlay = _root.Q(SharedUiElementNames.Pause.Overlay);
+ _pauseOverlayHost = _root.Q(SharedUiElementNames.Pause.OverlayHost);
+ var title = _root.Q