diff --git a/lazy_player/__init__.py b/lazy_player/__init__.py
index 9de7b37..6f36e07 100644
--- a/lazy_player/__init__.py
+++ b/lazy_player/__init__.py
@@ -14,6 +14,8 @@ from gi.repository import Gdk, Gst, Gtk  # NOQA: E402
 
 class MainWindow(Gtk.ApplicationWindow):
     file_info_label: Gtk.Label
+    stack: Gtk.Stack
+    list_view: Gtk.ListView
 
     def __init__(self, *args: Any, **kwargs: Any):
         super().__init__(*args, **kwargs)
@@ -22,9 +24,28 @@ class MainWindow(Gtk.ApplicationWindow):
         self.set_decorated(False)
         self.fullscreen()
 
+        # Setup key event controller
+        key_controller = Gtk.EventControllerKey()
+        key_controller.connect("key-pressed", self._on_key_pressed)
+        self.add_controller(key_controller)
+
         # Main horizontal box to split the screen
         main_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
 
+        # Create stack to hold our widgets
+        self.stack = Gtk.Stack()
+
+        # Create black overlay
+        overlay_box = Gtk.Box()
+        overlay_box.set_name("black-overlay")
+        overlay_box.set_vexpand(True)
+        overlay_box.set_hexpand(True)
+
+        # Add both main menu and overlay to stack
+        self.stack.add_named(main_box, "menu")
+        self.stack.add_named(overlay_box, "overlay")
+        self.stack.set_visible_child_name("menu")
+
         # Create a grid to handle the 1:2 ratio
         grid = Gtk.Grid()
         grid.set_column_homogeneous(True)
@@ -49,11 +70,11 @@ class MainWindow(Gtk.ApplicationWindow):
 
         # Create list store and view
         list_store = Gtk.StringList()
-        list_view = Gtk.ListView()
+        self.list_view = Gtk.ListView()
         selection_model = Gtk.SingleSelection.new(list_store)
         selection_model.connect("selection-changed", self._on_selection_changed)
-        list_view.set_model(selection_model)
-        list_view.set_vexpand(True)
+        self.list_view.set_model(selection_model)
+        self.list_view.set_vexpand(True)
 
         def on_activate(widget: Gtk.ListView, index: int):
             selected_item = selection_model.get_item(index)
@@ -62,23 +83,25 @@ class MainWindow(Gtk.ApplicationWindow):
                 string = string_obj.get_string()
                 print("activated", string)
 
-        list_view.connect("activate", on_activate)
+                self.stack.set_visible_child_name("overlay")
+
+        self.list_view.connect("activate", on_activate)
 
         # Factory for list items
         factory = Gtk.SignalListItemFactory()
         factory.connect("setup", self._setup_list_item)
         factory.connect("bind", self._bind_list_item)
-        list_view.set_factory(factory)
+        self.list_view.set_factory(factory)
 
         # Populate the list store
         self._populate_file_list(list_store)
 
         # Add list view to a scrolled window
         scrolled = Gtk.ScrolledWindow()
-        scrolled.set_child(list_view)
+        scrolled.set_child(self.list_view)
         right_box.append(scrolled)
 
-        self.set_child(main_box)
+        self.set_child(self.stack)
 
     def _setup_list_item(self, factory: Gtk.SignalListItemFactory, list_item: Gtk.ListItem):
         label = Gtk.Label()
@@ -104,6 +127,20 @@ class MainWindow(Gtk.ApplicationWindow):
                 string_obj = cast(Gtk.StringObject, selected_item)
                 self.file_info_label.set_text(string_obj.get_string())
 
+    def _on_key_pressed(
+        self,
+        controller: Gtk.EventControllerKey,
+        keyval: int,
+        keycode: int,
+        state: Gdk.ModifierType,
+    ) -> bool:
+        if keyval == Gdk.keyval_from_name("Escape"):
+            self.stack.set_visible_child_name("menu")
+            self.list_view.grab_focus()
+            return True
+
+        return False
+
     def _populate_file_list(self, list_store: Gtk.StringList) -> None:
         # TODO: Implement proper version sort (strverscmp equivalent)
 
diff --git a/lazy_player/style.css b/lazy_player/style.css
index c95daf6..886e02a 100644
--- a/lazy_player/style.css
+++ b/lazy_player/style.css
@@ -3,3 +3,7 @@ listview > row {
   font-size: 48px;
   font-family: monospace;
 }
+
+#black-overlay {
+  background-color: black;
+}