diff --git a/src/ui/app.rs b/src/ui/app.rs
index 902e5860bc472feb991261d1eb49c62519a111fd..199d195db146ae8c6c97c1b5b555385e69407996 100644
--- a/src/ui/app.rs
+++ b/src/ui/app.rs
@@ -66,18 +66,18 @@ impl eframe::App for App {
                 ((Modifiers::NONE, Key::V), PaneAction::SplitV),
                 ((Modifiers::NONE, Key::H), PaneAction::SplitH),
                 ((Modifiers::NONE, Key::C), PaneAction::Close),
-                (
-                    (Modifiers::NONE, Key::R),
-                    PaneAction::ReplaceThroughGallery(Some(hovered_tile)),
-                ),
+                ((Modifiers::NONE, Key::R), PaneAction::ReplaceThroughGallery),
                 ((Modifiers::SHIFT, Key::Escape), PaneAction::Maximize),
                 ((Modifiers::NONE, Key::Escape), PaneAction::Exit),
             ];
-            pane_action = pane_action.or(shortcuts::map_to_action(ctx, &key_action_pairs[..]));
+            pane_action =
+                pane_action
+                    .or(shortcuts::map_to_action(ctx, &key_action_pairs[..])
+                        .map(|a| (hovered_tile, a)));
         }
 
         // If an action was triggered, we consume it
-        if let Some(action) = pane_action.take() {
+        if let Some((tile_id, action)) = pane_action.take() {
             match action {
                 PaneAction::SplitH => {
                     if let Some(hovered_tile) = hovered_pane {
@@ -132,15 +132,15 @@ impl eframe::App for App {
                         }
                     }
                 }
-                PaneAction::Replace(tile_id, new_pane) => {
+                PaneAction::Replace(new_pane) => {
                     debug!(
                         "Called Replace on tile {:?} with pane {:?}",
                         tile_id, new_pane
                     );
                     panes_tree.tiles.insert(tile_id, Tile::Pane(*new_pane));
                 }
-                PaneAction::ReplaceThroughGallery(Some(source_tile)) => {
-                    self.widget_gallery.replace_tile(source_tile);
+                PaneAction::ReplaceThroughGallery => {
+                    self.widget_gallery.replace_tile(tile_id);
                 }
                 PaneAction::Maximize => {
                     // This is a toggle: if there is not currently a maximized pane,
@@ -170,7 +170,6 @@ impl eframe::App for App {
                         self.maximized_pane = None;
                     }
                 }
-                _ => panic!("Unable to handle action"),
             }
         }
 
@@ -225,7 +224,7 @@ impl eframe::App for App {
         egui::CentralPanel::default().show(ctx, |ui| {
             if let Some(maximized_pane) = self.maximized_pane {
                 if let Some(Tile::Pane(pane)) = panes_tree.tiles.get_mut(maximized_pane) {
-                    maximized_pane_ui(ui, maximized_pane, pane);
+                    maximized_pane_ui(ui, pane);
                 } else {
                     panic!("Maximized pane not found in tree!");
                 }
@@ -400,7 +399,7 @@ impl AppState {
 /// Behavior for the tree of panes in the app
 #[derive(Default)]
 pub struct AppBehavior {
-    pub action: Option<PaneAction>,
+    pub action: Option<(TileId, PaneAction)>,
 }
 
 impl Behavior<Pane> for AppBehavior {
@@ -413,10 +412,10 @@ impl Behavior<Pane> for AppBehavior {
         let PaneResponse {
             action_called,
             drag_response,
-        } = pane.ui(ui, tile_id);
+        } = pane.ui(ui);
         // Capture the action and store it to be consumed in the update function
         if let Some(action_called) = action_called {
-            self.action = Some(action_called);
+            self.action = Some((tile_id, action_called));
         }
         drag_response
     }
@@ -456,8 +455,8 @@ pub enum PaneAction {
     SplitH,
     SplitV,
     Close,
-    Replace(TileId, Box<Pane>),
-    ReplaceThroughGallery(Option<TileId>),
+    Replace(Box<Pane>),
+    ReplaceThroughGallery,
     Maximize,
     Exit,
 }
diff --git a/src/ui/panes.rs b/src/ui/panes.rs
index 5d031f3abf6888b69894e3d6899ea776eb9a8696..1bec4dfe618a45380e44fa8e140420804929ccb0 100644
--- a/src/ui/panes.rs
+++ b/src/ui/panes.rs
@@ -4,7 +4,7 @@ mod pid_drawing_tool;
 mod plot;
 mod valve_control;
 
-use egui_tiles::TileId;
+use egui::Ui;
 use enum_dispatch::enum_dispatch;
 use serde::{Deserialize, Serialize};
 use strum_macros::{self, EnumIter, EnumMessage};
@@ -27,7 +27,7 @@ impl Pane {
 #[enum_dispatch(PaneKind)]
 pub trait PaneBehavior {
     /// Renders the UI of the pane.
-    fn ui(&mut self, ui: &mut egui::Ui, tile_id: TileId) -> PaneResponse;
+    fn ui(&mut self, ui: &mut Ui) -> PaneResponse;
 
     /// Whether the pane contains the pointer.
     fn contains_pointer(&self) -> bool;
@@ -53,8 +53,8 @@ pub trait PaneBehavior {
 }
 
 impl PaneBehavior for Pane {
-    fn ui(&mut self, ui: &mut egui::Ui, tile_id: TileId) -> PaneResponse {
-        self.pane.ui(ui, tile_id)
+    fn ui(&mut self, ui: &mut Ui) -> PaneResponse {
+        self.pane.ui(ui)
     }
 
     fn contains_pointer(&self) -> bool {
diff --git a/src/ui/panes/default.rs b/src/ui/panes/default.rs
index e4d1befeda37b7cca5ed8d10cd23c3a18d81527e..63eb9d753929847dd2d65ba44e987efce058e618 100644
--- a/src/ui/panes/default.rs
+++ b/src/ui/panes/default.rs
@@ -1,4 +1,5 @@
 use super::PaneBehavior;
+use egui::Ui;
 use serde::{Deserialize, Serialize};
 use tracing::debug;
 
@@ -26,7 +27,7 @@ impl PartialEq for DefaultPane {
 
 impl PaneBehavior for DefaultPane {
     #[profiling::function]
-    fn ui(&mut self, ui: &mut egui::Ui, tile_id: egui_tiles::TileId) -> PaneResponse {
+    fn ui(&mut self, ui: &mut Ui) -> PaneResponse {
         let mut response = PaneResponse::default();
 
         let parent = vertically_centered(ui, &mut self.centering_memo, |ui| {
@@ -40,7 +41,7 @@ impl PaneBehavior for DefaultPane {
                     debug!("Horizontal Split button clicked");
                 }
                 if ui.button("Widget Gallery").clicked() {
-                    response.set_action(PaneAction::ReplaceThroughGallery(Some(tile_id)));
+                    response.set_action(PaneAction::ReplaceThroughGallery);
                 }
             })
             .response
diff --git a/src/ui/panes/messages_viewer.rs b/src/ui/panes/messages_viewer.rs
index 2c8a54f5e0c796dba09e932fee105fc99ee07ed1..628f2d12ec63ae8d73188d74df9a58b00606cd8f 100644
--- a/src/ui/panes/messages_viewer.rs
+++ b/src/ui/panes/messages_viewer.rs
@@ -19,7 +19,7 @@ impl PartialEq for MessagesViewerPane {
 
 impl PaneBehavior for MessagesViewerPane {
     #[profiling::function]
-    fn ui(&mut self, ui: &mut egui::Ui, _tile_id: egui_tiles::TileId) -> PaneResponse {
+    fn ui(&mut self, ui: &mut egui::Ui) -> PaneResponse {
         let mut response = PaneResponse::default();
         let label = ui.add_sized(ui.available_size(), Label::new("This is a label"));
         self.contains_pointer = label.contains_pointer();
diff --git a/src/ui/panes/pid_drawing_tool.rs b/src/ui/panes/pid_drawing_tool.rs
index 6f7695ebc98510a0f467e500dcae13020590faa3..1a7ec73dc7a56f3c0e9da23be78a635afe921bf5 100644
--- a/src/ui/panes/pid_drawing_tool.rs
+++ b/src/ui/panes/pid_drawing_tool.rs
@@ -8,7 +8,6 @@ use core::f32;
 use egui::{
     Button, Color32, Context, CursorIcon, PointerButton, Response, Sense, Theme, Ui, Widget,
 };
-use egui_tiles::TileId;
 use elements::Element;
 use glam::Vec2;
 use grid::GridInfo;
@@ -83,7 +82,7 @@ impl PartialEq for PidPane {
 }
 
 impl PaneBehavior for PidPane {
-    fn ui(&mut self, ui: &mut egui::Ui, _: TileId) -> PaneResponse {
+    fn ui(&mut self, ui: &mut Ui) -> PaneResponse {
         let mut pane_response = PaneResponse::default();
 
         let theme = PidPane::find_theme(ui.ctx());
diff --git a/src/ui/panes/plot.rs b/src/ui/panes/plot.rs
index 42444abb31fb64a6bf431b8b79d806ad7d489ad2..0d67e3df3a0e3ec22dcd68e0e0d8f537441a4d7f 100644
--- a/src/ui/panes/plot.rs
+++ b/src/ui/panes/plot.rs
@@ -11,9 +11,8 @@ use crate::{
     ui::app::PaneResponse,
     utils::units::UnitOfMeasure,
 };
-use egui::{Color32, Vec2, Vec2b};
+use egui::{Color32, Ui, Vec2, Vec2b};
 use egui_plot::{AxisHints, HPlacement, Legend, Line, PlotPoint, log_grid_spacer};
-use egui_tiles::TileId;
 use serde::{self, Deserialize, Serialize};
 use source_window::sources_window;
 use std::{
@@ -44,7 +43,7 @@ impl PartialEq for Plot2DPane {
 
 impl PaneBehavior for Plot2DPane {
     #[profiling::function]
-    fn ui(&mut self, ui: &mut egui::Ui, _: TileId) -> PaneResponse {
+    fn ui(&mut self, ui: &mut Ui) -> PaneResponse {
         let mut response = PaneResponse::default();
         let data_settings_digest = self.settings.data_digest();
 
@@ -235,7 +234,7 @@ impl PaneBehavior for Plot2DPane {
     }
 }
 
-fn show_menu(ui: &mut egui::Ui, settings_visible: &mut bool, settings: &mut PlotSettings) {
+fn show_menu(ui: &mut Ui, settings_visible: &mut bool, settings: &mut PlotSettings) {
     ui.set_max_width(200.0); // To make sure we wrap long text
 
     if ui.button("Source Data Settings…").clicked() {
diff --git a/src/ui/panes/valve_control.rs b/src/ui/panes/valve_control.rs
index a46ff41cd1dbc3a276ff8b2fd44bf12c34749564..f2e83cc5b08c989aecaa3ddf76e29ecbf851a094 100644
--- a/src/ui/panes/valve_control.rs
+++ b/src/ui/panes/valve_control.rs
@@ -1,4 +1,3 @@
-use egui_tiles::TileId;
 use serde::{Deserialize, Serialize};
 
 use crate::ui::app::PaneResponse;
@@ -15,7 +14,7 @@ pub struct ValveControlPane {
 }
 
 impl PaneBehavior for ValveControlPane {
-    fn ui(&mut self, ui: &mut egui::Ui, tile_id: TileId) -> PaneResponse {
+    fn ui(&mut self, ui: &mut egui::Ui) -> PaneResponse {
         todo!()
     }
 
diff --git a/src/ui/utils.rs b/src/ui/utils.rs
index 0c2ae3f7257254b414d9974507003ee1443a30bf..2469c54aa8b79743d4bc3f9f081593ffe26d71be 100644
--- a/src/ui/utils.rs
+++ b/src/ui/utils.rs
@@ -1,17 +1,16 @@
 use egui::containers::Frame;
 use egui::{Response, Shadow, Stroke, Style, Ui};
-use egui_tiles::TileId;
 
 use super::panes::{Pane, PaneBehavior};
 
 /// This function wraps a ui into a popup frame intended for the pane that needs
 /// to be maximized on screen.
-pub fn maximized_pane_ui(ui: &mut Ui, tile_id: TileId, pane: &mut Pane) {
+pub fn maximized_pane_ui(ui: &mut Ui, pane: &mut Pane) {
     Frame::popup(&Style::default())
         .fill(egui::Color32::TRANSPARENT)
         .shadow(Shadow::NONE)
         .stroke(Stroke::NONE)
-        .show(ui, |ui| pane.ui(ui, tile_id));
+        .show(ui, |ui| pane.ui(ui));
 }
 
 #[derive(Debug, Default, Clone)]
diff --git a/src/ui/widget_gallery.rs b/src/ui/widget_gallery.rs
index ad8796d55159d2cf83b10f73a0db4692bedf6506..80ef01ebcb7e0c8e45b14e0c9dae23e1875743ab 100644
--- a/src/ui/widget_gallery.rs
+++ b/src/ui/widget_gallery.rs
@@ -19,7 +19,7 @@ impl WidgetGallery {
         self.open = true;
     }
 
-    pub fn show(&mut self, ctx: &Context) -> Option<PaneAction> {
+    pub fn show(&mut self, ctx: &Context) -> Option<(TileId, PaneAction)> {
         let mut window_visible = self.open;
         let resp = egui::Window::new("Widget Gallery")
             .collapsible(false)
@@ -31,7 +31,7 @@ impl WidgetGallery {
                     } else if let Some(message) = pane.get_message() {
                         if ui.button(message).clicked() {
                             if let Some(tile_id) = self.tile_id {
-                                return Some(PaneAction::Replace(tile_id, Pane::boxed(pane)));
+                                return Some((tile_id, PaneAction::Replace(Pane::boxed(pane))));
                             }
                         }
                     }