diff --git a/osu.Android.props b/osu.Android.props
index 1866acd248..591db6e2c2 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -52,7 +52,7 @@
   </ItemGroup>
   <ItemGroup>
     <PackageReference Include="ppy.osu.Game.Resources" Version="2021.803.0" />
-    <PackageReference Include="ppy.osu.Framework.Android" Version="2021.803.0" />
+    <PackageReference Include="ppy.osu.Framework.Android" Version="2021.804.0" />
   </ItemGroup>
   <ItemGroup Label="Transitive Dependencies">
     <!-- Realm needs to be directly referenced in all Xamarin projects, as it will not pull in its transitive dependencies otherwise. -->
diff --git a/osu.Game.Tests/Visual/Editing/TestSceneHitObjectComposer.cs b/osu.Game.Tests/Visual/Editing/TestSceneHitObjectComposer.cs
index 550896270a..c758bd1707 100644
--- a/osu.Game.Tests/Visual/Editing/TestSceneHitObjectComposer.cs
+++ b/osu.Game.Tests/Visual/Editing/TestSceneHitObjectComposer.cs
@@ -75,7 +75,7 @@ namespace osu.Game.Tests.Visual.Editing
             AddAssert("Hitcircle button not clickable", () => !hitObjectComposer.ChildrenOfType<EditorRadioButton>().First(d => d.Button.Label == "HitCircle").Enabled.Value);
             AddStep("Add timing point", () => editorBeatmap.ControlPointInfo.Add(0, new TimingControlPoint()));
             AddAssert("Hitcircle button is clickable", () => hitObjectComposer.ChildrenOfType<EditorRadioButton>().First(d => d.Button.Label == "HitCircle").Enabled.Value);
-            AddStep("Change to hitcircle", () => hitObjectComposer.ChildrenOfType<EditorRadioButton>().First(d => d.Button.Label == "HitCircle").Click());
+            AddStep("Change to hitcircle", () => hitObjectComposer.ChildrenOfType<EditorRadioButton>().First(d => d.Button.Label == "HitCircle").TriggerClick());
             AddAssert("Tool changed", () => hitObjectComposer.ChildrenOfType<ComposeBlueprintContainer>().First().CurrentTool is HitCircleCompositionTool);
         }
 
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneGameplayMenuOverlay.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneGameplayMenuOverlay.cs
index ed40a83831..477ac70501 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneGameplayMenuOverlay.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneGameplayMenuOverlay.cs
@@ -228,7 +228,7 @@ namespace osu.Game.Tests.Visual.Gameplay
                 var lastAction = pauseOverlay.OnRetry;
                 pauseOverlay.OnRetry = () => triggered = true;
 
-                getButton(1).Click();
+                getButton(1).TriggerClick();
                 pauseOverlay.OnRetry = lastAction;
             });
 
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs
index 0a23550f5d..bcbdcd2a4f 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneLoungeRoomsContainer.cs
@@ -42,7 +42,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
             AddAssert("has 2 rooms", () => container.Rooms.Count == 2);
             AddAssert("first room removed", () => container.Rooms.All(r => r.Room.RoomID.Value != 0));
 
-            AddStep("select first room", () => container.Rooms.First().Click());
+            AddStep("select first room", () => container.Rooms.First().TriggerClick());
             AddAssert("first room selected", () => checkRoomSelected(RoomManager.Rooms.First()));
         }
 
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs
index 1474e0f712..cd3c50cf14 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs
@@ -232,7 +232,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
             DrawableRoom.PasswordEntryPopover passwordEntryPopover = null;
             AddUntilStep("password prompt appeared", () => (passwordEntryPopover = InputManager.ChildrenOfType<DrawableRoom.PasswordEntryPopover>().FirstOrDefault()) != null);
             AddStep("enter password in text box", () => passwordEntryPopover.ChildrenOfType<TextBox>().First().Text = "password");
-            AddStep("press join room button", () => passwordEntryPopover.ChildrenOfType<OsuButton>().First().Click());
+            AddStep("press join room button", () => passwordEntryPopover.ChildrenOfType<OsuButton>().First().TriggerClick());
 
             AddUntilStep("wait for room open", () => this.ChildrenOfType<MultiplayerMatchSubScreen>().FirstOrDefault()?.IsLoaded == true);
             AddUntilStep("wait for join", () => client.Room != null);
@@ -396,7 +396,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
                 }
             });
 
-            AddStep("open mod overlay", () => this.ChildrenOfType<PurpleTriangleButton>().ElementAt(2).Click());
+            AddStep("open mod overlay", () => this.ChildrenOfType<PurpleTriangleButton>().ElementAt(2).TriggerClick());
 
             AddStep("invoke on back button", () => multiplayerScreen.OnBackButton());
 
@@ -404,7 +404,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
 
             AddAssert("dialog overlay is hidden", () => DialogOverlay.State.Value == Visibility.Hidden);
 
-            testLeave("lounge tab item", () => this.ChildrenOfType<BreadcrumbControl<IScreen>.BreadcrumbTabItem>().First().Click());
+            testLeave("lounge tab item", () => this.ChildrenOfType<BreadcrumbControl<IScreen>.BreadcrumbTabItem>().First().TriggerClick());
 
             testLeave("back button", () => multiplayerScreen.OnBackButton());
 
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerLoungeSubScreen.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerLoungeSubScreen.cs
index 4ea635fd3e..c66d5429d6 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerLoungeSubScreen.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerLoungeSubScreen.cs
@@ -74,7 +74,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
             AddStep("attempt join room", () => InputManager.Key(Key.Enter));
             AddUntilStep("password prompt appeared", () => (passwordEntryPopover = InputManager.ChildrenOfType<DrawableRoom.PasswordEntryPopover>().FirstOrDefault()) != null);
             AddStep("enter password in text box", () => passwordEntryPopover.ChildrenOfType<TextBox>().First().Text = "password");
-            AddStep("press join room button", () => passwordEntryPopover.ChildrenOfType<OsuButton>().First().Click());
+            AddStep("press join room button", () => passwordEntryPopover.ChildrenOfType<OsuButton>().First().TriggerClick());
 
             AddAssert("room join requested", () => lastJoinedRoom == RoomManager.Rooms.First());
             AddAssert("room join password correct", () => lastJoinedPassword == "password");
diff --git a/osu.Game.Tests/Visual/Online/TestSceneAccountCreationOverlay.cs b/osu.Game.Tests/Visual/Online/TestSceneAccountCreationOverlay.cs
index 437c5b07c9..06cc613c17 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneAccountCreationOverlay.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneAccountCreationOverlay.cs
@@ -53,7 +53,7 @@ namespace osu.Game.Tests.Visual.Online
             AddStep("show manually", () => accountCreation.Show());
             AddUntilStep("overlay is visible", () => accountCreation.State.Value == Visibility.Visible);
 
-            AddStep("click button", () => accountCreation.ChildrenOfType<SettingsButton>().Single().Click());
+            AddStep("click button", () => accountCreation.ChildrenOfType<SettingsButton>().Single().TriggerClick());
             AddUntilStep("warning screen is present", () => accountCreation.ChildrenOfType<ScreenWarning>().SingleOrDefault()?.IsPresent == true);
 
             AddStep("log back in", () => API.Login("dummy", "password"));
diff --git a/osu.Game.Tests/Visual/Online/TestSceneChatOverlay.cs b/osu.Game.Tests/Visual/Online/TestSceneChatOverlay.cs
index 5e234bdacf..7cfca31167 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneChatOverlay.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneChatOverlay.cs
@@ -330,22 +330,11 @@ namespace osu.Game.Tests.Visual.Online
             InputManager.ReleaseKey(Key.AltLeft);
         }
 
-        private void pressCloseDocumentKeys() => pressKeysFor(PlatformAction.DocumentClose);
+        private void pressCloseDocumentKeys() => InputManager.Keys(PlatformAction.DocumentClose);
 
-        private void pressNewTabKeys() => pressKeysFor(PlatformAction.TabNew);
+        private void pressNewTabKeys() => InputManager.Keys(PlatformAction.TabNew);
 
-        private void pressRestoreTabKeys() => pressKeysFor(PlatformAction.TabRestore);
-
-        private void pressKeysFor(PlatformAction type)
-        {
-            var binding = host.PlatformKeyBindings.First(b => (PlatformAction)b.Action == type);
-
-            foreach (var k in binding.KeyCombination.Keys)
-                InputManager.PressKey((Key)k);
-
-            foreach (var k in binding.KeyCombination.Keys)
-                InputManager.ReleaseKey((Key)k);
-        }
+        private void pressRestoreTabKeys() => InputManager.Keys(PlatformAction.TabRestore);
 
         private void clickDrawable(Drawable d)
         {
diff --git a/osu.Game.Tests/Visual/Online/TestSceneNewsOverlay.cs b/osu.Game.Tests/Visual/Online/TestSceneNewsOverlay.cs
index 93a5b6fc59..f94c018b27 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneNewsOverlay.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneNewsOverlay.cs
@@ -37,7 +37,7 @@ namespace osu.Game.Tests.Visual.Online
             AddStep("Show", () => overlay.Show());
             AddUntilStep("Show More button is visible", () => showMoreButton?.Alpha == 1);
             setUpNewsResponse(responseWithNoCursor, "Set up no cursor response");
-            AddStep("Click Show More", () => showMoreButton?.Click());
+            AddStep("Click Show More", () => showMoreButton?.TriggerClick());
             AddUntilStep("Show More button is hidden", () => showMoreButton?.Alpha == 0);
         }
 
diff --git a/osu.Game.Tests/Visual/Online/TestSceneShowMoreButton.cs b/osu.Game.Tests/Visual/Online/TestSceneShowMoreButton.cs
index 18ac415126..d7fa5a1f6d 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneShowMoreButton.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneShowMoreButton.cs
@@ -32,19 +32,19 @@ namespace osu.Game.Tests.Visual.Online
                 }
             });
 
-            AddStep("click button", () => button.Click());
+            AddStep("click button", () => button.TriggerClick());
 
             AddAssert("action fired once", () => fireCount == 1);
             AddAssert("is in loading state", () => button.IsLoading);
 
-            AddStep("click button", () => button.Click());
+            AddStep("click button", () => button.TriggerClick());
 
             AddAssert("action not fired", () => fireCount == 1);
             AddAssert("is in loading state", () => button.IsLoading);
 
             AddUntilStep("wait for loaded", () => !button.IsLoading);
 
-            AddStep("click button", () => button.Click());
+            AddStep("click button", () => button.TriggerClick());
 
             AddAssert("action fired twice", () => fireCount == 2);
             AddAssert("is in loading state", () => button.IsLoading);
diff --git a/osu.Game.Tests/Visual/Online/TestSceneVotePill.cs b/osu.Game.Tests/Visual/Online/TestSceneVotePill.cs
index e9e826e62f..a9fed7b302 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneVotePill.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneVotePill.cs
@@ -45,7 +45,7 @@ namespace osu.Game.Tests.Visual.Online
             AddStep("Log in", logIn);
             AddStep("User comment", () => addVotePill(getUserComment()));
             AddAssert("Background is transparent", () => votePill.Background.Alpha == 0);
-            AddStep("Click", () => votePill.Click());
+            AddStep("Click", () => votePill.TriggerClick());
             AddAssert("Not loading", () => !votePill.IsLoading);
         }
 
@@ -56,7 +56,7 @@ namespace osu.Game.Tests.Visual.Online
             AddStep("Log in", logIn);
             AddStep("Random comment", () => addVotePill(getRandomComment()));
             AddAssert("Background is visible", () => votePill.Background.Alpha == 1);
-            AddStep("Click", () => votePill.Click());
+            AddStep("Click", () => votePill.TriggerClick());
             AddAssert("Loading", () => votePill.IsLoading);
         }
 
@@ -66,7 +66,7 @@ namespace osu.Game.Tests.Visual.Online
             AddStep("Hide login overlay", () => login.Hide());
             AddStep("Log out", API.Logout);
             AddStep("Random comment", () => addVotePill(getRandomComment()));
-            AddStep("Click", () => votePill.Click());
+            AddStep("Click", () => votePill.TriggerClick());
             AddAssert("Login overlay is visible", () => login.State.Value == Visibility.Visible);
         }
 
diff --git a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsLoungeSubScreen.cs b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsLoungeSubScreen.cs
index 79ba6d9660..ecdb046203 100644
--- a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsLoungeSubScreen.cs
+++ b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsLoungeSubScreen.cs
@@ -56,7 +56,7 @@ namespace osu.Game.Tests.Visual.Playlists
 
             AddUntilStep("first room is not masked", () => checkRoomVisible(roomsContainer.Rooms[0]));
 
-            AddStep("select last room", () => roomsContainer.Rooms[^1].Click());
+            AddStep("select last room", () => roomsContainer.Rooms[^1].TriggerClick());
 
             AddUntilStep("first room is masked", () => !checkRoomVisible(roomsContainer.Rooms[0]));
             AddUntilStep("last room is not masked", () => checkRoomVisible(roomsContainer.Rooms[^1]));
diff --git a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsRoomSubScreen.cs b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsRoomSubScreen.cs
index f2bfb80beb..9fc29049ef 100644
--- a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsRoomSubScreen.cs
+++ b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsRoomSubScreen.cs
@@ -76,7 +76,7 @@ namespace osu.Game.Tests.Visual.Playlists
                 });
             });
 
-            AddStep("start match", () => match.ChildrenOfType<PlaylistsReadyButton>().First().Click());
+            AddStep("start match", () => match.ChildrenOfType<PlaylistsReadyButton>().First().TriggerClick());
             AddUntilStep("player loader loaded", () => Stack.CurrentScreen is PlayerLoader);
         }
 
diff --git a/osu.Game.Tests/Visual/Settings/TestSceneKeyBindingPanel.cs b/osu.Game.Tests/Visual/Settings/TestSceneKeyBindingPanel.cs
index 54293485cb..fa2c9ecdea 100644
--- a/osu.Game.Tests/Visual/Settings/TestSceneKeyBindingPanel.cs
+++ b/osu.Game.Tests/Visual/Settings/TestSceneKeyBindingPanel.cs
@@ -160,7 +160,7 @@ namespace osu.Game.Tests.Visual.Settings
             {
                 var resetButton = settingsKeyBindingRow.ChildrenOfType<RestoreDefaultValueButton<bool>>().First();
 
-                resetButton.Click();
+                resetButton.TriggerClick();
             });
 
             AddUntilStep("restore button hidden", () => settingsKeyBindingRow.ChildrenOfType<RestoreDefaultValueButton<bool>>().First().Alpha == 0);
@@ -189,7 +189,7 @@ namespace osu.Game.Tests.Visual.Settings
             {
                 var resetButton = panel.ChildrenOfType<ResetButton>().First();
 
-                resetButton.Click();
+                resetButton.TriggerClick();
             });
 
             AddUntilStep("restore button hidden", () => settingsKeyBindingRow.ChildrenOfType<RestoreDefaultValueButton<bool>>().First().Alpha == 0);
diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs
index 1e76c33fca..32c1d262d5 100644
--- a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs
@@ -94,10 +94,10 @@ namespace osu.Game.Tests.Visual.UserInterface
 
             AddAssert("selected mod matches", () => (SelectedMods.Value.Single() as OsuModDoubleTime)?.SpeedChange.Value == 1.2);
 
-            AddStep("deselect", () => modSelect.DeselectAllButton.Click());
+            AddStep("deselect", () => modSelect.DeselectAllButton.TriggerClick());
             AddAssert("selected mods empty", () => SelectedMods.Value.Count == 0);
 
-            AddStep("reselect", () => modSelect.GetModButton(osuModDoubleTime).Click());
+            AddStep("reselect", () => modSelect.GetModButton(osuModDoubleTime).TriggerClick());
             AddAssert("selected mod has default value", () => (SelectedMods.Value.Single() as OsuModDoubleTime)?.SpeedChange.IsDefault == true);
         }
 
diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneModSettings.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneModSettings.cs
index 65db2e9644..84e2ebb6d8 100644
--- a/osu.Game.Tests/Visual/UserInterface/TestSceneModSettings.cs
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneModSettings.cs
@@ -48,7 +48,7 @@ namespace osu.Game.Tests.Visual.UserInterface
             AddUntilStep("wait for button load", () => modSelect.ButtonsLoaded);
             AddStep("select mod", () => modSelect.SelectMod(testCustomisableMod));
             AddAssert("button enabled", () => modSelect.CustomiseButton.Enabled.Value);
-            AddStep("open Customisation", () => modSelect.CustomiseButton.Click());
+            AddStep("open Customisation", () => modSelect.CustomiseButton.TriggerClick());
             AddStep("deselect mod", () => modSelect.SelectMod(testCustomisableMod));
             AddAssert("controls hidden", () => modSelect.ModSettingsContainer.State.Value == Visibility.Hidden);
         }
diff --git a/osu.Game.Tournament.Tests/Screens/TestSceneGameplayScreen.cs b/osu.Game.Tournament.Tests/Screens/TestSceneGameplayScreen.cs
index 522567584d..2e34c39370 100644
--- a/osu.Game.Tournament.Tests/Screens/TestSceneGameplayScreen.cs
+++ b/osu.Game.Tournament.Tests/Screens/TestSceneGameplayScreen.cs
@@ -40,6 +40,6 @@ namespace osu.Game.Tournament.Tests.Screens
                 () => this.ChildrenOfType<TeamScore>().All(score => score.Alpha == (visible ? 1 : 0)));
 
         private void toggleWarmup()
-            => AddStep("toggle warmup", () => this.ChildrenOfType<TourneyButton>().First().Click());
+            => AddStep("toggle warmup", () => this.ChildrenOfType<TourneyButton>().First().TriggerClick());
     }
 }
diff --git a/osu.Game/Graphics/UserInterface/BackButton.cs b/osu.Game/Graphics/UserInterface/BackButton.cs
index b8196c6360..1607762908 100644
--- a/osu.Game/Graphics/UserInterface/BackButton.cs
+++ b/osu.Game/Graphics/UserInterface/BackButton.cs
@@ -35,7 +35,7 @@ namespace osu.Game.Graphics.UserInterface
                 Add(receptor = new Receptor());
             }
 
-            receptor.OnBackPressed = () => button.Click();
+            receptor.OnBackPressed = () => button.TriggerClick();
         }
 
         [BackgroundDependencyLoader]
diff --git a/osu.Game/Overlays/BeatmapSet/Buttons/PreviewButton.cs b/osu.Game/Overlays/BeatmapSet/Buttons/PreviewButton.cs
index a5e5f664c9..5b3c142a66 100644
--- a/osu.Game/Overlays/BeatmapSet/Buttons/PreviewButton.cs
+++ b/osu.Game/Overlays/BeatmapSet/Buttons/PreviewButton.cs
@@ -63,7 +63,7 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
                 },
             };
 
-            Action = () => playButton.Click();
+            Action = () => playButton.TriggerClick();
             Playing.ValueChanged += playing => progress.FadeTo(playing.NewValue ? 1 : 0, 100);
         }
 
diff --git a/osu.Game/Overlays/Chat/Tabs/ChannelTabItem.cs b/osu.Game/Overlays/Chat/Tabs/ChannelTabItem.cs
index 58b402c164..9d2cd8a21d 100644
--- a/osu.Game/Overlays/Chat/Tabs/ChannelTabItem.cs
+++ b/osu.Game/Overlays/Chat/Tabs/ChannelTabItem.cs
@@ -153,7 +153,7 @@ namespace osu.Game.Overlays.Chat.Tabs
             switch (e.Button)
             {
                 case MouseButton.Middle:
-                    CloseButton.Click();
+                    CloseButton.TriggerClick();
                     break;
             }
         }
diff --git a/osu.Game/Overlays/Comments/CommentEditor.cs b/osu.Game/Overlays/Comments/CommentEditor.cs
index 7b4bf882dc..20a8ab64f7 100644
--- a/osu.Game/Overlays/Comments/CommentEditor.cs
+++ b/osu.Game/Overlays/Comments/CommentEditor.cs
@@ -120,7 +120,7 @@ namespace osu.Game.Overlays.Comments
                 if (commitButton.IsBlocked.Value)
                     return;
 
-                commitButton.Click();
+                commitButton.TriggerClick();
             };
         }
 
diff --git a/osu.Game/Overlays/Dialog/PopupDialog.cs b/osu.Game/Overlays/Dialog/PopupDialog.cs
index cd02900e88..78ef2ec795 100644
--- a/osu.Game/Overlays/Dialog/PopupDialog.cs
+++ b/osu.Game/Overlays/Dialog/PopupDialog.cs
@@ -218,7 +218,7 @@ namespace osu.Game.Overlays.Dialog
         /// <summary>
         /// Programmatically clicks the first <see cref="PopupDialogOkButton"/>.
         /// </summary>
-        public void PerformOkAction() => Buttons.OfType<PopupDialogOkButton>().First().Click();
+        public void PerformOkAction() => Buttons.OfType<PopupDialogOkButton>().First().TriggerClick();
 
         protected override bool OnKeyDown(KeyDownEvent e)
         {
@@ -265,7 +265,7 @@ namespace osu.Game.Overlays.Dialog
             if (!actionInvoked && content.IsPresent)
                 // In the case a user did not choose an action before a hide was triggered, press the last button.
                 // This is presumed to always be a sane default "cancel" action.
-                buttonsContainer.Last().Click();
+                buttonsContainer.Last().TriggerClick();
 
             content.FadeOut(EXIT_DURATION, Easing.InSine);
         }
@@ -273,7 +273,7 @@ namespace osu.Game.Overlays.Dialog
         private void pressButtonAtIndex(int index)
         {
             if (index < Buttons.Count())
-                Buttons.Skip(index).First().Click();
+                Buttons.Skip(index).First().TriggerClick();
         }
     }
 }
diff --git a/osu.Game/Overlays/DialogOverlay.cs b/osu.Game/Overlays/DialogOverlay.cs
index bc3b0e6c9a..43ef42a809 100644
--- a/osu.Game/Overlays/DialogOverlay.cs
+++ b/osu.Game/Overlays/DialogOverlay.cs
@@ -88,7 +88,7 @@ namespace osu.Game.Overlays
             switch (action)
             {
                 case GlobalAction.Select:
-                    CurrentDialog?.Buttons.OfType<PopupDialogOkButton>().FirstOrDefault()?.Click();
+                    CurrentDialog?.Buttons.OfType<PopupDialogOkButton>().FirstOrDefault()?.TriggerClick();
                     return true;
             }
 
diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
index 793bb79318..96eba7808f 100644
--- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs
+++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
@@ -404,11 +404,11 @@ namespace osu.Game.Overlays.Mods
             switch (e.Key)
             {
                 case Key.Number1:
-                    DeselectAllButton.Click();
+                    DeselectAllButton.TriggerClick();
                     return true;
 
                 case Key.Number2:
-                    CloseButton.Click();
+                    CloseButton.TriggerClick();
                     return true;
             }
 
diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs
index 4a33f9e296..6da41b2b5f 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs
@@ -188,7 +188,7 @@ namespace osu.Game.Overlays.Toolbar
         {
             if (action == Hotkey)
             {
-                Click();
+                TriggerClick();
                 return true;
             }
 
diff --git a/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs b/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs
index 564fd65719..a70a0d8a71 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs
@@ -62,7 +62,7 @@ namespace osu.Game.Overlays.Toolbar
 
             protected override bool OnClick(ClickEvent e)
             {
-                Parent.Click();
+                Parent.TriggerClick();
                 return base.OnClick(e);
             }
         }
diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs
index bdb0157746..6c712e9d5b 100644
--- a/osu.Game/Screens/Menu/ButtonSystem.cs
+++ b/osu.Game/Screens/Menu/ButtonSystem.cs
@@ -210,7 +210,7 @@ namespace osu.Game.Screens.Menu
             {
                 if (buttonsTopLevel.Any(b => e.Key == b.TriggerKey))
                 {
-                    logo?.Click();
+                    logo?.TriggerClick();
                     return true;
                 }
             }
@@ -226,7 +226,7 @@ namespace osu.Game.Screens.Menu
                     return goBack();
 
                 case GlobalAction.Select:
-                    logo?.Click();
+                    logo?.TriggerClick();
                     return true;
 
                 default:
@@ -248,7 +248,7 @@ namespace osu.Game.Screens.Menu
                     return true;
 
                 case ButtonSystemState.Play:
-                    backButton.Click();
+                    backButton.TriggerClick();
                     return true;
 
                 default:
@@ -268,11 +268,11 @@ namespace osu.Game.Screens.Menu
                     return true;
 
                 case ButtonSystemState.TopLevel:
-                    buttonsTopLevel.First().Click();
+                    buttonsTopLevel.First().TriggerClick();
                     return false;
 
                 case ButtonSystemState.Play:
-                    buttonsPlay.First().Click();
+                    buttonsPlay.First().TriggerClick();
                     return false;
             }
         }
diff --git a/osu.Game/Screens/OnlinePlay/Lounge/Components/DrawableRoom.cs b/osu.Game/Screens/OnlinePlay/Lounge/Components/DrawableRoom.cs
index adff1cc33e..c455cb0c50 100644
--- a/osu.Game/Screens/OnlinePlay/Lounge/Components/DrawableRoom.cs
+++ b/osu.Game/Screens/OnlinePlay/Lounge/Components/DrawableRoom.cs
@@ -262,7 +262,7 @@ namespace osu.Game.Screens.OnlinePlay.Lounge.Components
             switch (action)
             {
                 case GlobalAction.Select:
-                    Click();
+                    TriggerClick();
                     return true;
             }
 
diff --git a/osu.Game/Screens/Play/GameplayMenuOverlay.cs b/osu.Game/Screens/Play/GameplayMenuOverlay.cs
index 2608c93fa1..ce1f223403 100644
--- a/osu.Game/Screens/Play/GameplayMenuOverlay.cs
+++ b/osu.Game/Screens/Play/GameplayMenuOverlay.cs
@@ -42,12 +42,12 @@ namespace osu.Game.Screens.Play
         /// <summary>
         /// Action that is invoked when <see cref="GlobalAction.Back"/> is triggered.
         /// </summary>
-        protected virtual Action BackAction => () => InternalButtons.Children.LastOrDefault()?.Click();
+        protected virtual Action BackAction => () => InternalButtons.Children.LastOrDefault()?.TriggerClick();
 
         /// <summary>
         /// Action that is invoked when <see cref="GlobalAction.Select"/> is triggered.
         /// </summary>
-        protected virtual Action SelectAction => () => InternalButtons.Selected?.Click();
+        protected virtual Action SelectAction => () => InternalButtons.Selected?.TriggerClick();
 
         public abstract string Header { get; }
 
diff --git a/osu.Game/Screens/Play/PauseOverlay.cs b/osu.Game/Screens/Play/PauseOverlay.cs
index 8778cff535..e0b7e5c941 100644
--- a/osu.Game/Screens/Play/PauseOverlay.cs
+++ b/osu.Game/Screens/Play/PauseOverlay.cs
@@ -24,7 +24,7 @@ namespace osu.Game.Screens.Play
 
         private SkinnableSound pauseLoop;
 
-        protected override Action BackAction => () => InternalButtons.Children.First().Click();
+        protected override Action BackAction => () => InternalButtons.Children.First().TriggerClick();
 
         [BackgroundDependencyLoader]
         private void load(OsuColour colours)
diff --git a/osu.Game/Screens/Play/SkipOverlay.cs b/osu.Game/Screens/Play/SkipOverlay.cs
index ed49fc40b2..4a74fa1d4f 100644
--- a/osu.Game/Screens/Play/SkipOverlay.cs
+++ b/osu.Game/Screens/Play/SkipOverlay.cs
@@ -148,7 +148,7 @@ namespace osu.Game.Screens.Play
                     if (!button.Enabled.Value)
                         return false;
 
-                    button.Click();
+                    button.TriggerClick();
                     return true;
             }
 
diff --git a/osu.Game/Screens/Select/FooterButton.cs b/osu.Game/Screens/Select/FooterButton.cs
index c3fbd767ff..9c0a68133c 100644
--- a/osu.Game/Screens/Select/FooterButton.cs
+++ b/osu.Game/Screens/Select/FooterButton.cs
@@ -176,7 +176,7 @@ namespace osu.Game.Screens.Select
         {
             if (action == Hotkey)
             {
-                Click();
+                TriggerClick();
                 return true;
             }
 
diff --git a/osu.Game/Screens/Select/FooterButtonRandom.cs b/osu.Game/Screens/Select/FooterButtonRandom.cs
index 2d14111137..1eaf2c591e 100644
--- a/osu.Game/Screens/Select/FooterButtonRandom.cs
+++ b/osu.Game/Screens/Select/FooterButtonRandom.cs
@@ -67,7 +67,7 @@ namespace osu.Game.Screens.Select
                 return false;
             }
 
-            Click();
+            TriggerClick();
             return true;
         }
 
diff --git a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
index 2676635764..b5fdbd225f 100644
--- a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
+++ b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
@@ -122,7 +122,7 @@ namespace osu.Game.Screens.Select.Options
 
                 if (found != null)
                 {
-                    found.Click();
+                    found.TriggerClick();
                     return true;
                 }
             }
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 4b0edf990e..0c26bce8c9 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -36,7 +36,7 @@
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
     <PackageReference Include="Realm" Version="10.3.0" />
-    <PackageReference Include="ppy.osu.Framework" Version="2021.803.0" />
+    <PackageReference Include="ppy.osu.Framework" Version="2021.804.0" />
     <PackageReference Include="ppy.osu.Game.Resources" Version="2021.803.0" />
     <PackageReference Include="Sentry" Version="3.8.3" />
     <PackageReference Include="SharpCompress" Version="0.28.3" />
diff --git a/osu.iOS.props b/osu.iOS.props
index e4992e1132..b7f252820c 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -70,7 +70,7 @@
     <Reference Include="System.Net.Http" />
   </ItemGroup>
   <ItemGroup Label="Package References">
-    <PackageReference Include="ppy.osu.Framework.iOS" Version="2021.803.0" />
+    <PackageReference Include="ppy.osu.Framework.iOS" Version="2021.804.0" />
     <PackageReference Include="ppy.osu.Game.Resources" Version="2021.803.0" />
   </ItemGroup>
   <!-- See https://github.com/dotnet/runtime/issues/35988 (can be removed after Xamarin uses net5.0 / net6.0) -->
@@ -93,7 +93,7 @@
     <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" />
     <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.6" />
     <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
-    <PackageReference Include="ppy.osu.Framework" Version="2021.803.0" />
+    <PackageReference Include="ppy.osu.Framework" Version="2021.804.0" />
     <PackageReference Include="SharpCompress" Version="0.28.3" />
     <PackageReference Include="NUnit" Version="3.13.2" />
     <PackageReference Include="SharpRaven" Version="2.4.0" />