diff --git a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsMatchSettingsOverlay.cs b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsMatchSettingsOverlay.cs
index c71bdb3a06..811135435c 100644
--- a/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsMatchSettingsOverlay.cs
+++ b/osu.Game.Tests/Visual/Playlists/TestScenePlaylistsMatchSettingsOverlay.cs
@@ -10,6 +10,7 @@ using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Game.Graphics.Sprites;
 using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 using osu.Game.Online.Rooms;
 using osu.Game.Screens.OnlinePlay;
 using osu.Game.Screens.OnlinePlay.Playlists;
@@ -148,7 +149,7 @@ namespace osu.Game.Tests.Visual.Playlists
 
         private class TestRoomSettings : PlaylistsRoomSettingsOverlay
         {
-            public TriangleButton ApplyButton => ((MatchSettings)Settings).ApplyButton;
+            public RoundedButton ApplyButton => ((MatchSettings)Settings).ApplyButton;
 
             public OsuTextBox NameField => ((MatchSettings)Settings).NameField;
             public OsuDropdown<TimeSpan> DurationField => ((MatchSettings)Settings).DurationField;
diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneLoadingLayer.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneLoadingLayer.cs
index 2fc6405b88..9afb93236e 100644
--- a/osu.Game.Tests/Visual/UserInterface/TestSceneLoadingLayer.cs
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneLoadingLayer.cs
@@ -10,6 +10,7 @@ using osu.Framework.Graphics.Shapes;
 using osu.Framework.Utils;
 using osu.Game.Graphics.Sprites;
 using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 using osuTK;
 using osuTK.Graphics;
 
@@ -49,8 +50,8 @@ namespace osu.Game.Tests.Visual.UserInterface
                             Children = new Drawable[]
                             {
                                 new OsuSpriteText { Text = "Sample content" },
-                                new TriangleButton { Text = "can't puush me", Width = 200, },
-                                new TriangleButton { Text = "puush me", Width = 200, Action = () => { } },
+                                new RoundedButton { Text = "can't puush me", Width = 200, },
+                                new RoundedButton { Text = "puush me", Width = 200, Action = () => { } },
                             }
                         },
                         overlay = new TestLoadingLayer(true),
diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneOsuPopover.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneOsuPopover.cs
index 6cc89a6df8..e286578f56 100644
--- a/osu.Game.Tests/Visual/UserInterface/TestSceneOsuPopover.cs
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneOsuPopover.cs
@@ -33,7 +33,7 @@ namespace osu.Game.Tests.Visual.UserInterface
                         Text = @"No OverlayColourProvider",
                         Font = OsuFont.Default.With(size: 40)
                     },
-                    new TriangleButtonWithPopover()
+                    new RoundedButtonWithPopover()
                 }
             };
 
@@ -50,15 +50,15 @@ namespace osu.Game.Tests.Visual.UserInterface
                             Text = @"With OverlayColourProvider (orange)",
                             Font = OsuFont.Default.With(size: 40)
                         },
-                        new TriangleButtonWithPopover()
+                        new RoundedButtonWithPopover()
                     }
                 }
             };
         }
 
-        private class TriangleButtonWithPopover : TriangleButton, IHasPopover
+        private class RoundedButtonWithPopover : RoundedButton, IHasPopover
         {
-            public TriangleButtonWithPopover()
+            public RoundedButtonWithPopover()
             {
                 Width = 100;
                 Height = 30;
diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneRoundedButton.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneRoundedButton.cs
index 2587960275..6a8fe83176 100644
--- a/osu.Game.Tests/Visual/UserInterface/TestSceneRoundedButton.cs
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneRoundedButton.cs
@@ -9,7 +9,6 @@ using osu.Framework.Bindables;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Testing;
-using osu.Game.Graphics;
 using osu.Game.Graphics.UserInterfaceV2;
 using osu.Game.Overlays;
 using osu.Game.Overlays.Settings;
@@ -37,7 +36,7 @@ namespace osu.Game.Tests.Visual.UserInterface
                     },
                     new SettingsButton
                     {
-                        Text = "Test button",
+                        Text = "Test settings button",
                         Anchor = Anchor.Centre,
                         Origin = Anchor.Centre,
                         Enabled = { BindTarget = enabled },
@@ -56,8 +55,8 @@ namespace osu.Game.Tests.Visual.UserInterface
         public void TestBackgroundColour()
         {
             AddStep("set red scheme", () => CreateThemedContent(OverlayColourScheme.Red));
-            AddAssert("rounded button has correct colour", () => Cell(0, 1).ChildrenOfType<RoundedButton>().First().BackgroundColour == new OsuColour().Blue3);
-            AddAssert("settings button has correct colour", () => Cell(0, 1).ChildrenOfType<SettingsButton>().First().BackgroundColour == new OverlayColourProvider(OverlayColourScheme.Red).Highlight1);
+            AddAssert("rounded button has correct colour", () => Cell(0, 1).ChildrenOfType<RoundedButton>().First().BackgroundColour == new OverlayColourProvider(OverlayColourScheme.Red).Colour3);
+            AddAssert("settings button has correct colour", () => Cell(0, 1).ChildrenOfType<SettingsButton>().First().BackgroundColour == new OverlayColourProvider(OverlayColourScheme.Red).Colour3);
         }
     }
 }
diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneScreenBreadcrumbControl.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneScreenBreadcrumbControl.cs
index b3ee0af78b..7cfcc9de1f 100644
--- a/osu.Game.Tests/Visual/UserInterface/TestSceneScreenBreadcrumbControl.cs
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneScreenBreadcrumbControl.cs
@@ -11,6 +11,7 @@ using osu.Framework.Screens;
 using osu.Game.Graphics;
 using osu.Game.Graphics.Sprites;
 using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 using osu.Game.Screens;
 using osuTK;
 
@@ -109,7 +110,7 @@ namespace osu.Game.Tests.Visual.UserInterface
                             Origin = Anchor.TopCentre,
                             Text = Title,
                         },
-                        new TriangleButton
+                        new RoundedButton
                         {
                             Anchor = Anchor.TopCentre,
                             Origin = Anchor.TopCentre,
diff --git a/osu.Game.Tournament/Screens/Setup/ActionableInfo.cs b/osu.Game.Tournament/Screens/Setup/ActionableInfo.cs
index a9ac21284e..1172c26ffa 100644
--- a/osu.Game.Tournament/Screens/Setup/ActionableInfo.cs
+++ b/osu.Game.Tournament/Screens/Setup/ActionableInfo.cs
@@ -61,7 +61,7 @@ namespace osu.Game.Tournament.Screens.Setup
                     Spacing = new Vector2(10, 0),
                     Children = new Drawable[]
                     {
-                        Button = new TriangleButton
+                        Button = new RoundedButton
                         {
                             Size = new Vector2(100, 40),
                             Action = () => Action?.Invoke()
diff --git a/osu.Game.Tournament/Screens/Setup/StablePathSelectScreen.cs b/osu.Game.Tournament/Screens/Setup/StablePathSelectScreen.cs
index fac488fcf5..32ac75178e 100644
--- a/osu.Game.Tournament/Screens/Setup/StablePathSelectScreen.cs
+++ b/osu.Game.Tournament/Screens/Setup/StablePathSelectScreen.cs
@@ -93,7 +93,7 @@ namespace osu.Game.Tournament.Screens.Setup
                                         Spacing = new Vector2(20),
                                         Children = new Drawable[]
                                         {
-                                            new TriangleButton
+                                            new RoundedButton
                                             {
                                                 Anchor = Anchor.Centre,
                                                 Origin = Anchor.Centre,
@@ -101,7 +101,7 @@ namespace osu.Game.Tournament.Screens.Setup
                                                 Text = "Select stable path",
                                                 Action = ChangePath
                                             },
-                                            new TriangleButton
+                                            new RoundedButton
                                             {
                                                 Anchor = Anchor.Centre,
                                                 Origin = Anchor.Centre,
diff --git a/osu.Game.Tournament/Screens/Setup/TournamentSwitcher.cs b/osu.Game.Tournament/Screens/Setup/TournamentSwitcher.cs
index 447d6f44ce..1a1c90e96a 100644
--- a/osu.Game.Tournament/Screens/Setup/TournamentSwitcher.cs
+++ b/osu.Game.Tournament/Screens/Setup/TournamentSwitcher.cs
@@ -6,6 +6,7 @@
 using osu.Framework.Allocation;
 using osu.Framework.Graphics;
 using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 using osu.Game.Tournament.IO;
 
 namespace osu.Game.Tournament.Screens.Setup
@@ -37,7 +38,7 @@ namespace osu.Game.Tournament.Screens.Setup
         {
             var drawable = base.CreateComponent();
 
-            FlowContainer.Insert(-1, folderButton = new TriangleButton
+            FlowContainer.Insert(-1, folderButton = new RoundedButton
             {
                 Text = "Open folder",
                 Width = 100
diff --git a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs
index 5fc32ff704..77d30d50d6 100644
--- a/osu.Game/Graphics/Backgrounds/TrianglesV2.cs
+++ b/osu.Game/Graphics/Backgrounds/TrianglesV2.cs
@@ -172,7 +172,7 @@ namespace osu.Game.Graphics.Backgrounds
             // Limited by the maximum size of QuadVertexBuffer for safety.
             const int max_triangles = ushort.MaxValue / (IRenderer.VERTICES_PER_QUAD + 2);
 
-            AimCount = (int)Math.Min(max_triangles, DrawWidth * DrawHeight * 0.0005f * SpawnRatio);
+            AimCount = (int)Math.Clamp(DrawWidth * 0.02f * SpawnRatio, 1, max_triangles);
 
             int currentCount = parts.Count;
 
diff --git a/osu.Game/Graphics/UserInterface/DangerousTriangleButton.cs b/osu.Game/Graphics/UserInterface/DangerousRoundedButton.cs
similarity index 71%
rename from osu.Game/Graphics/UserInterface/DangerousTriangleButton.cs
rename to osu.Game/Graphics/UserInterface/DangerousRoundedButton.cs
index 1414979531..265ac01253 100644
--- a/osu.Game/Graphics/UserInterface/DangerousTriangleButton.cs
+++ b/osu.Game/Graphics/UserInterface/DangerousRoundedButton.cs
@@ -4,17 +4,16 @@
 #nullable disable
 
 using osu.Framework.Allocation;
+using osu.Game.Graphics.UserInterfaceV2;
 
 namespace osu.Game.Graphics.UserInterface
 {
-    public class DangerousTriangleButton : TriangleButton
+    public class DangerousRoundedButton : RoundedButton
     {
         [BackgroundDependencyLoader]
         private void load(OsuColour colours)
         {
             BackgroundColour = colours.PinkDark;
-            Triangles.ColourDark = colours.PinkDarker;
-            Triangles.ColourLight = colours.Pink;
         }
     }
 }
diff --git a/osu.Game/Graphics/UserInterface/OsuButton.cs b/osu.Game/Graphics/UserInterface/OsuButton.cs
index dae5de2d65..6f1312652b 100644
--- a/osu.Game/Graphics/UserInterface/OsuButton.cs
+++ b/osu.Game/Graphics/UserInterface/OsuButton.cs
@@ -37,7 +37,7 @@ namespace osu.Game.Graphics.UserInterface
         /// <summary>
         /// Sets a custom background colour to this button, replacing the provided default.
         /// </summary>
-        public Color4 BackgroundColour
+        public virtual Color4 BackgroundColour
         {
             get => backgroundColour ?? defaultBackgroundColour;
             set
@@ -90,6 +90,7 @@ namespace osu.Game.Graphics.UserInterface
                         Anchor = Anchor.Centre,
                         Origin = Anchor.Centre,
                         RelativeSizeAxes = Axes.Both,
+                        Depth = float.MaxValue,
                     },
                     Hover = new Box
                     {
@@ -141,13 +142,15 @@ namespace osu.Game.Graphics.UserInterface
             return base.OnClick(e);
         }
 
+        protected virtual float HoverLayerFinalAlpha => 0.1f;
+
         protected override bool OnHover(HoverEvent e)
         {
             if (Enabled.Value)
             {
                 Hover.FadeTo(0.2f, 40, Easing.OutQuint)
                      .Then()
-                     .FadeTo(0.1f, 800, Easing.OutQuint);
+                     .FadeTo(HoverLayerFinalAlpha, 800, Easing.OutQuint);
             }
 
             return base.OnHover(e);
diff --git a/osu.Game/Graphics/UserInterface/TriangleButton.cs b/osu.Game/Graphics/UserInterface/TriangleButton.cs
deleted file mode 100644
index 60d1824e5a..0000000000
--- a/osu.Game/Graphics/UserInterface/TriangleButton.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-#nullable disable
-
-using System.Collections.Generic;
-using osu.Framework.Allocation;
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Containers;
-using osu.Framework.Localisation;
-using osu.Game.Graphics.Backgrounds;
-
-namespace osu.Game.Graphics.UserInterface
-{
-    /// <summary>
-    /// A button with moving triangles in the background.
-    /// </summary>
-    public class TriangleButton : OsuButton, IFilterable
-    {
-        protected Triangles Triangles { get; private set; }
-
-        [BackgroundDependencyLoader]
-        private void load(OsuColour colours)
-        {
-            Add(Triangles = new Triangles
-            {
-                RelativeSizeAxes = Axes.Both,
-                ColourDark = colours.BlueDarker,
-                ColourLight = colours.Blue,
-            });
-        }
-
-        public virtual IEnumerable<LocalisableString> FilterTerms => new[] { Text };
-
-        public bool MatchingFilter
-        {
-            set => this.FadeTo(value ? 1 : 0);
-        }
-
-        public bool FilteringActive { get; set; }
-    }
-}
diff --git a/osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs b/osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs
index 4477633da1..fef9993932 100644
--- a/osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs
+++ b/osu.Game/Graphics/UserInterfaceV2/RoundedButton.cs
@@ -1,19 +1,29 @@
 // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
 // See the LICENCE file in the repository root for full licence text.
 
-#nullable disable
-
 using System.Collections.Generic;
+using System.Diagnostics;
 using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
+using osu.Framework.Input.Events;
 using osu.Framework.Localisation;
+using osu.Game.Graphics.Backgrounds;
 using osu.Game.Graphics.UserInterface;
+using osu.Game.Overlays;
+using osuTK.Graphics;
 
 namespace osu.Game.Graphics.UserInterfaceV2
 {
     public class RoundedButton : OsuButton, IFilterable
     {
+        protected TrianglesV2? Triangles { get; private set; }
+
+        protected override float HoverLayerFinalAlpha => 0;
+
+        private Color4? triangleGradientSecondColour;
+
         public override float Height
         {
             get => base.Height;
@@ -26,19 +36,65 @@ namespace osu.Game.Graphics.UserInterfaceV2
             }
         }
 
-        [BackgroundDependencyLoader(true)]
-        private void load(OsuColour colours)
+        public override Color4 BackgroundColour
         {
-            // According to flyte, buttons are supposed to have explicit colours for now.
-            // Not sure this is the correct direction, but we haven't decided on an `OverlayColourProvider` stand-in yet.
-            // This is a better default. See `SettingsButton` for an override which uses `OverlayColourProvider`.
-            DefaultBackgroundColour = colours.Blue3;
+            get => base.BackgroundColour;
+            set
+            {
+                base.BackgroundColour = value;
+                triangleGradientSecondColour = BackgroundColour.Lighten(0.2f);
+                updateColours();
+            }
+        }
+
+        [BackgroundDependencyLoader(true)]
+        private void load(OverlayColourProvider? overlayColourProvider, OsuColour colours)
+        {
+            // Many buttons have local colours, but this provides a sane default for all other cases.
+            DefaultBackgroundColour = overlayColourProvider?.Colour3 ?? colours.Blue3;
+            triangleGradientSecondColour ??= overlayColourProvider?.Colour1 ?? colours.Blue3.Lighten(0.2f);
         }
 
         protected override void LoadComplete()
         {
             base.LoadComplete();
+
             updateCornerRadius();
+
+            Add(Triangles = new TrianglesV2
+            {
+                Thickness = 0.02f,
+                SpawnRatio = 0.6f,
+                RelativeSizeAxes = Axes.Both,
+                Depth = float.MaxValue,
+            });
+
+            updateColours();
+        }
+
+        private void updateColours()
+        {
+            if (Triangles == null)
+                return;
+
+            Debug.Assert(triangleGradientSecondColour != null);
+
+            Triangles.ColourTop = triangleGradientSecondColour.Value;
+            Triangles.ColourBottom = BackgroundColour;
+        }
+
+        protected override bool OnHover(HoverEvent e)
+        {
+            Debug.Assert(triangleGradientSecondColour != null);
+
+            Background.FadeColour(triangleGradientSecondColour.Value, 300, Easing.OutQuint);
+            return base.OnHover(e);
+        }
+
+        protected override void OnHoverLost(HoverLostEvent e)
+        {
+            Background.FadeColour(BackgroundColour, 300, Easing.OutQuint);
+            base.OnHoverLost(e);
         }
 
         private void updateCornerRadius() => Content.CornerRadius = DrawHeight / 2;
diff --git a/osu.Game/Overlays/BeatmapSet/Buttons/HeaderButton.cs b/osu.Game/Overlays/BeatmapSet/Buttons/HeaderButton.cs
index 25d11bd6d7..3b22ff594c 100644
--- a/osu.Game/Overlays/BeatmapSet/Buttons/HeaderButton.cs
+++ b/osu.Game/Overlays/BeatmapSet/Buttons/HeaderButton.cs
@@ -1,16 +1,14 @@
 // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
 // See the LICENCE file in the repository root for full licence text.
 
-#nullable disable
-
 using osu.Framework.Allocation;
 using osu.Framework.Extensions.Color4Extensions;
 using osu.Framework.Graphics;
-using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 
 namespace osu.Game.Overlays.BeatmapSet.Buttons
 {
-    public class HeaderButton : TriangleButton
+    public class HeaderButton : RoundedButton
     {
         public HeaderButton()
         {
@@ -22,9 +20,6 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
         private void load()
         {
             BackgroundColour = Color4Extensions.FromHex(@"094c5f");
-            Triangles.ColourLight = Color4Extensions.FromHex(@"0f7c9b");
-            Triangles.ColourDark = Color4Extensions.FromHex(@"094c5f");
-            Triangles.TriangleScale = 1.5f;
         }
     }
 }
diff --git a/osu.Game/Overlays/Dashboard/CurrentlyPlayingDisplay.cs b/osu.Game/Overlays/Dashboard/CurrentlyPlayingDisplay.cs
index aae4932c22..571393f617 100644
--- a/osu.Game/Overlays/Dashboard/CurrentlyPlayingDisplay.cs
+++ b/osu.Game/Overlays/Dashboard/CurrentlyPlayingDisplay.cs
@@ -203,7 +203,7 @@ namespace osu.Game.Overlays.Dashboard
                                 Anchor = Anchor.TopCentre,
                                 Origin = Anchor.TopCentre,
                             },
-                            new PurpleTriangleButton
+                            new PurpleRoundedButton
                             {
                                 RelativeSizeAxes = Axes.X,
                                 Text = "Spectate",
diff --git a/osu.Game/Overlays/Settings/Sections/Input/KeyBindingRow.cs b/osu.Game/Overlays/Settings/Sections/Input/KeyBindingRow.cs
index 25ab8cfad2..386fee9d55 100644
--- a/osu.Game/Overlays/Settings/Sections/Input/KeyBindingRow.cs
+++ b/osu.Game/Overlays/Settings/Sections/Input/KeyBindingRow.cs
@@ -22,6 +22,7 @@ using osu.Game.Database;
 using osu.Game.Graphics;
 using osu.Game.Graphics.Sprites;
 using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 using osu.Game.Input;
 using osu.Game.Input.Bindings;
 using osu.Game.Resources.Localisation.Web;
@@ -446,7 +447,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input
             isDefault.Value = bindings.Select(b => b.KeyCombination).SequenceEqual(Defaults);
         }
 
-        private class CancelButton : TriangleButton
+        private class CancelButton : RoundedButton
         {
             public CancelButton()
             {
@@ -455,7 +456,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input
             }
         }
 
-        public class ClearButton : DangerousTriangleButton
+        public class ClearButton : DangerousRoundedButton
         {
             public ClearButton()
             {
diff --git a/osu.Game/Overlays/Settings/Sections/Maintenance/DirectorySelectScreen.cs b/osu.Game/Overlays/Settings/Sections/Maintenance/DirectorySelectScreen.cs
index 1c9a758c6f..539600c7ca 100644
--- a/osu.Game/Overlays/Settings/Sections/Maintenance/DirectorySelectScreen.cs
+++ b/osu.Game/Overlays/Settings/Sections/Maintenance/DirectorySelectScreen.cs
@@ -13,7 +13,6 @@ using osuTK;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Shapes;
 using osu.Framework.Localisation;
-using osu.Game.Graphics.UserInterface;
 using osu.Framework.Screens;
 using osu.Game.Graphics.Containers;
 using osu.Game.Localisation;
@@ -22,7 +21,7 @@ namespace osu.Game.Overlays.Settings.Sections.Maintenance
 {
     public abstract class DirectorySelectScreen : OsuScreen
     {
-        private TriangleButton selectionButton;
+        private RoundedButton selectionButton;
 
         private OsuDirectorySelector directorySelector;
 
@@ -101,7 +100,7 @@ namespace osu.Game.Overlays.Settings.Sections.Maintenance
                             },
                             new Drawable[]
                             {
-                                selectionButton = new TriangleButton
+                                selectionButton = new RoundedButton
                                 {
                                     Anchor = Anchor.Centre,
                                     Origin = Anchor.Centre,
diff --git a/osu.Game/Overlays/Settings/SettingsButton.cs b/osu.Game/Overlays/Settings/SettingsButton.cs
index 5f2a416f58..10aea92b22 100644
--- a/osu.Game/Overlays/Settings/SettingsButton.cs
+++ b/osu.Game/Overlays/Settings/SettingsButton.cs
@@ -1,16 +1,11 @@
 // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
 // See the LICENCE file in the repository root for full licence text.
 
-#nullable disable
-
 using System.Collections.Generic;
 using System.Linq;
-using JetBrains.Annotations;
-using osu.Framework.Allocation;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Cursor;
 using osu.Framework.Localisation;
-using osu.Game.Graphics;
 using osu.Game.Graphics.UserInterfaceV2;
 
 namespace osu.Game.Overlays.Settings
@@ -23,12 +18,6 @@ namespace osu.Game.Overlays.Settings
             Padding = new MarginPadding { Left = SettingsPanel.CONTENT_MARGINS, Right = SettingsPanel.CONTENT_MARGINS };
         }
 
-        [BackgroundDependencyLoader(true)]
-        private void load([CanBeNull] OverlayColourProvider overlayColourProvider, OsuColour colours)
-        {
-            DefaultBackgroundColour = overlayColourProvider?.Highlight1 ?? colours.Blue3;
-        }
-
         public LocalisableString TooltipText { get; set; }
 
         public override IEnumerable<LocalisableString> FilterTerms
diff --git a/osu.Game/Rulesets/Edit/ExpandableButton.cs b/osu.Game/Rulesets/Edit/ExpandableButton.cs
index a66600bd58..91bcc21c1b 100644
--- a/osu.Game/Rulesets/Edit/ExpandableButton.cs
+++ b/osu.Game/Rulesets/Edit/ExpandableButton.cs
@@ -86,6 +86,7 @@ namespace osu.Game.Rulesets.Edit
                     SpriteText.Font = OsuFont.GetFont(weight: FontWeight.Bold);
                     base.Height = actualHeight;
                     Background.Show();
+                    Triangles?.Show();
                 }
                 else
                 {
@@ -94,6 +95,7 @@ namespace osu.Game.Rulesets.Edit
                     SpriteText.Font = OsuFont.GetFont(weight: FontWeight.Regular);
                     base.Height = actualHeight / 2;
                     Background.Hide();
+                    Triangles?.Hide();
                 }
             }, true);
         }
diff --git a/osu.Game/Screens/Import/FileImportScreen.cs b/osu.Game/Screens/Import/FileImportScreen.cs
index e3d8de2dfd..e63fb95fc0 100644
--- a/osu.Game/Screens/Import/FileImportScreen.cs
+++ b/osu.Game/Screens/Import/FileImportScreen.cs
@@ -14,7 +14,6 @@ using osu.Framework.Graphics.Shapes;
 using osu.Framework.Screens;
 using osu.Game.Graphics;
 using osu.Game.Graphics.Containers;
-using osu.Game.Graphics.UserInterface;
 using osu.Game.Graphics.UserInterfaceV2;
 using osuTK;
 
@@ -28,7 +27,7 @@ namespace osu.Game.Screens.Import
         private Container contentContainer;
         private TextFlowContainer currentFileText;
 
-        private TriangleButton importButton;
+        private RoundedButton importButton;
 
         private const float duration = 300;
         private const float button_height = 50;
@@ -100,7 +99,7 @@ namespace osu.Game.Screens.Import
                                     }
                                 },
                             },
-                            importButton = new TriangleButton
+                            importButton = new RoundedButton
                             {
                                 Text = "Import",
                                 Anchor = Anchor.BottomCentre,
diff --git a/osu.Game/Screens/OnlinePlay/Components/MatchBeatmapDetailArea.cs b/osu.Game/Screens/OnlinePlay/Components/MatchBeatmapDetailArea.cs
index 9a48769405..6d477be568 100644
--- a/osu.Game/Screens/OnlinePlay/Components/MatchBeatmapDetailArea.cs
+++ b/osu.Game/Screens/OnlinePlay/Components/MatchBeatmapDetailArea.cs
@@ -9,7 +9,7 @@ using osu.Framework.Allocation;
 using osu.Framework.Bindables;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
-using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 using osu.Game.Online.Rooms;
 using osu.Game.Screens.OnlinePlay.Playlists;
 using osu.Game.Screens.Select;
@@ -54,7 +54,7 @@ namespace osu.Game.Screens.OnlinePlay.Components
                         },
                         new Drawable[]
                         {
-                            new TriangleButton
+                            new RoundedButton
                             {
                                 Text = "Add new playlist entry",
                                 RelativeSizeAxes = Axes.Both,
diff --git a/osu.Game/Screens/OnlinePlay/Components/ReadyButton.cs b/osu.Game/Screens/OnlinePlay/Components/ReadyButton.cs
index 0871fc9a72..ae0f8cb3e4 100644
--- a/osu.Game/Screens/OnlinePlay/Components/ReadyButton.cs
+++ b/osu.Game/Screens/OnlinePlay/Components/ReadyButton.cs
@@ -7,13 +7,13 @@ using osu.Framework.Allocation;
 using osu.Framework.Bindables;
 using osu.Framework.Graphics.Cursor;
 using osu.Framework.Localisation;
-using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 using osu.Game.Online;
 using osu.Game.Online.Rooms;
 
 namespace osu.Game.Screens.OnlinePlay.Components
 {
-    public abstract class ReadyButton : TriangleButton, IHasTooltip
+    public abstract class ReadyButton : RoundedButton, IHasTooltip
     {
         public new readonly BindableBool Enabled = new BindableBool();
 
diff --git a/osu.Game/Screens/OnlinePlay/Lounge/DrawableLoungeRoom.cs b/osu.Game/Screens/OnlinePlay/Lounge/DrawableLoungeRoom.cs
index 8a2aeb9e5e..c53324288d 100644
--- a/osu.Game/Screens/OnlinePlay/Lounge/DrawableLoungeRoom.cs
+++ b/osu.Game/Screens/OnlinePlay/Lounge/DrawableLoungeRoom.cs
@@ -197,7 +197,7 @@ namespace osu.Game.Screens.OnlinePlay.Lounge
             }
 
             private OsuPasswordTextBox passwordTextBox;
-            private TriangleButton joinButton;
+            private RoundedButton joinButton;
             private OsuSpriteText errorText;
             private Sample sampleJoinFail;
 
@@ -226,7 +226,7 @@ namespace osu.Game.Screens.OnlinePlay.Lounge
                                     Width = 200,
                                     PlaceholderText = "password",
                                 },
-                                joinButton = new TriangleButton
+                                joinButton = new RoundedButton
                                 {
                                     Width = 80,
                                     Text = "Join Room",
diff --git a/osu.Game/Screens/OnlinePlay/Match/Components/CreateRoomButton.cs b/osu.Game/Screens/OnlinePlay/Match/Components/CreateRoomButton.cs
index 3d0c181d9d..4f42540146 100644
--- a/osu.Game/Screens/OnlinePlay/Match/Components/CreateRoomButton.cs
+++ b/osu.Game/Screens/OnlinePlay/Match/Components/CreateRoomButton.cs
@@ -10,13 +10,12 @@ using osu.Framework.Input.Events;
 
 namespace osu.Game.Screens.OnlinePlay.Match.Components
 {
-    public abstract class CreateRoomButton : PurpleTriangleButton, IKeyBindingHandler<PlatformAction>
+    public abstract class CreateRoomButton : PurpleRoundedButton, IKeyBindingHandler<PlatformAction>
     {
         [BackgroundDependencyLoader]
         private void load()
         {
             SpriteText.Font = SpriteText.Font.With(size: 14);
-            Triangles.TriangleScale = 1.5f;
         }
 
         public bool OnPressed(KeyBindingPressEvent<PlatformAction> e)
diff --git a/osu.Game/Screens/OnlinePlay/Match/Components/PurpleTriangleButton.cs b/osu.Game/Screens/OnlinePlay/Match/Components/PurpleRoundedButton.cs
similarity index 63%
rename from osu.Game/Screens/OnlinePlay/Match/Components/PurpleTriangleButton.cs
rename to osu.Game/Screens/OnlinePlay/Match/Components/PurpleRoundedButton.cs
index 5c751f238f..869806d21f 100644
--- a/osu.Game/Screens/OnlinePlay/Match/Components/PurpleTriangleButton.cs
+++ b/osu.Game/Screens/OnlinePlay/Match/Components/PurpleRoundedButton.cs
@@ -1,22 +1,18 @@
 // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
 // See the LICENCE file in the repository root for full licence text.
 
-#nullable disable
-
 using osu.Framework.Allocation;
 using osu.Framework.Extensions.Color4Extensions;
-using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 
 namespace osu.Game.Screens.OnlinePlay.Match.Components
 {
-    public class PurpleTriangleButton : TriangleButton
+    public class PurpleRoundedButton : RoundedButton
     {
         [BackgroundDependencyLoader]
         private void load()
         {
             BackgroundColour = Color4Extensions.FromHex(@"593790");
-            Triangles.ColourLight = Color4Extensions.FromHex(@"7247b6");
-            Triangles.ColourDark = Color4Extensions.FromHex(@"593790");
         }
     }
 }
diff --git a/osu.Game/Screens/OnlinePlay/Match/DrawableMatchRoom.cs b/osu.Game/Screens/OnlinePlay/Match/DrawableMatchRoom.cs
index 7c444b9bbd..7b0b0bdaa4 100644
--- a/osu.Game/Screens/OnlinePlay/Match/DrawableMatchRoom.cs
+++ b/osu.Game/Screens/OnlinePlay/Match/DrawableMatchRoom.cs
@@ -48,7 +48,7 @@ namespace osu.Game.Screens.OnlinePlay.Match
         {
             if (allowEdit)
             {
-                ButtonsContainer.Add(editButton = new PurpleTriangleButton
+                ButtonsContainer.Add(editButton = new PurpleRoundedButton
                 {
                     RelativeSizeAxes = Axes.Y,
                     Size = new Vector2(100, 1),
diff --git a/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs b/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs
index 00c819e5e4..a4ef0297cf 100644
--- a/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs
+++ b/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs
@@ -517,7 +517,7 @@ namespace osu.Game.Screens.OnlinePlay.Match
         /// <param name="room">The room to change the settings of.</param>
         protected abstract RoomSettingsOverlay CreateRoomSettingsOverlay(Room room);
 
-        public class UserModSelectButton : PurpleTriangleButton, IKeyBindingHandler<GlobalAction>
+        public class UserModSelectButton : PurpleRoundedButton, IKeyBindingHandler<GlobalAction>
         {
             public bool OnPressed(KeyBindingPressEvent<GlobalAction> e)
             {
diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerCountdownButton.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerCountdownButton.cs
index cd94b47d9e..c28e6d36e9 100644
--- a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerCountdownButton.cs
+++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerCountdownButton.cs
@@ -109,7 +109,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
 
             foreach (var duration in available_delays)
             {
-                flow.Add(new OsuButton
+                flow.Add(new RoundedButton
                 {
                     RelativeSizeAxes = Axes.X,
                     Text = $"Start match in {duration.Humanize()}",
@@ -124,7 +124,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
 
             if (multiplayerClient.Room?.ActiveCountdowns.Any(c => c is MatchStartCountdown) == true && multiplayerClient.IsHost)
             {
-                flow.Add(new OsuButton
+                flow.Add(new RoundedButton
                 {
                     RelativeSizeAxes = Axes.X,
                     Text = "Stop countdown",
diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerMatchSettingsOverlay.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerMatchSettingsOverlay.cs
index bbdfed0a00..ea4df23c4a 100644
--- a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerMatchSettingsOverlay.cs
+++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerMatchSettingsOverlay.cs
@@ -16,6 +16,7 @@ using osu.Game.Graphics;
 using osu.Game.Graphics.Containers;
 using osu.Game.Graphics.Sprites;
 using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 using osu.Game.Online.Multiplayer;
 using osu.Game.Online.Rooms;
 using osu.Game.Overlays;
@@ -64,7 +65,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
             public OsuEnumDropdown<QueueMode> QueueModeDropdown = null!;
             public OsuTextBox PasswordTextBox = null!;
             public OsuCheckbox AutoSkipCheckbox = null!;
-            public TriangleButton ApplyButton = null!;
+            public RoundedButton ApplyButton = null!;
 
             public OsuSpriteText ErrorText = null!;
 
@@ -274,7 +275,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
                                                             RelativeSizeAxes = Axes.X,
                                                             Height = DrawableRoomPlaylistItem.HEIGHT
                                                         },
-                                                        new PurpleTriangleButton
+                                                        new RoundedButton
                                                         {
                                                             RelativeSizeAxes = Axes.X,
                                                             Height = 40,
@@ -460,7 +461,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
             });
         }
 
-        public class CreateOrUpdateButton : TriangleButton
+        public class CreateOrUpdateButton : RoundedButton
         {
             [Resolved(typeof(Room), nameof(Room.RoomID))]
             private Bindable<long?> roomId { get; set; } = null!;
@@ -474,9 +475,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
             [BackgroundDependencyLoader]
             private void load(OsuColour colours)
             {
-                BackgroundColour = colours.Yellow;
-                Triangles.ColourLight = colours.YellowLight;
-                Triangles.ColourDark = colours.YellowDark;
+                BackgroundColour = colours.YellowDark;
             }
         }
 
diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerReadyButton.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerReadyButton.cs
index b4ff34cbc2..5f2ae82f55 100644
--- a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerReadyButton.cs
+++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerReadyButton.cs
@@ -12,7 +12,6 @@ using osu.Framework.Audio.Sample;
 using osu.Framework.Localisation;
 using osu.Framework.Threading;
 using osu.Game.Graphics;
-using osu.Game.Graphics.Backgrounds;
 using osu.Game.Online.Multiplayer;
 using osu.Game.Screens.OnlinePlay.Components;
 
@@ -20,8 +19,6 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
 {
     public class MultiplayerReadyButton : ReadyButton
     {
-        public new Triangles Triangles => base.Triangles;
-
         [Resolved]
         private MultiplayerClient multiplayerClient { get; set; }
 
@@ -212,15 +209,11 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
             void setYellow()
             {
                 BackgroundColour = colours.YellowDark;
-                Triangles.ColourDark = colours.YellowDark;
-                Triangles.ColourLight = colours.Yellow;
             }
 
             void setGreen()
             {
                 BackgroundColour = colours.Green;
-                Triangles.ColourDark = colours.Green;
-                Triangles.ColourLight = colours.GreenLight;
             }
         }
 
diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerSpectateButton.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerSpectateButton.cs
index b55a7d0731..89b3e980e6 100644
--- a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerSpectateButton.cs
+++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerSpectateButton.cs
@@ -7,8 +7,7 @@ using osu.Framework.Allocation;
 using osu.Framework.Bindables;
 using osu.Framework.Graphics;
 using osu.Game.Graphics;
-using osu.Game.Graphics.Backgrounds;
-using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 using osu.Game.Online.Multiplayer;
 using osuTK;
 
@@ -24,11 +23,11 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
 
         private IBindable<bool> operationInProgress;
 
-        private readonly ButtonWithTrianglesExposed button;
+        private readonly RoundedButton button;
 
         public MultiplayerSpectateButton()
         {
-            InternalChild = button = new ButtonWithTrianglesExposed
+            InternalChild = button = new RoundedButton
             {
                 RelativeSizeAxes = Axes.Both,
                 Size = Vector2.One,
@@ -67,15 +66,11 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
                 default:
                     button.Text = "Spectate";
                     button.BackgroundColour = colours.BlueDark;
-                    button.Triangles.ColourDark = colours.BlueDarker;
-                    button.Triangles.ColourLight = colours.Blue;
                     break;
 
                 case MultiplayerUserState.Spectating:
                     button.Text = "Stop spectating";
                     button.BackgroundColour = colours.Gray4;
-                    button.Triangles.ColourDark = colours.Gray5;
-                    button.Triangles.ColourLight = colours.Gray6;
                     break;
             }
 
@@ -83,10 +78,5 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
                                    && Client.Room.State != MultiplayerRoomState.Closed
                                    && !operationInProgress.Value;
         }
-
-        private class ButtonWithTrianglesExposed : TriangleButton
-        {
-            public new Triangles Triangles => base.Triangles;
-        }
     }
 }
diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs
index db752f2b42..969b8e61d3 100644
--- a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs
+++ b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs
@@ -430,7 +430,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
             modSettingChangeTracker?.Dispose();
         }
 
-        public class AddItemButton : PurpleTriangleButton
+        public class AddItemButton : PurpleRoundedButton
         {
         }
     }
diff --git a/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsReadyButton.cs b/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsReadyButton.cs
index b8ab514721..79933e606e 100644
--- a/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsReadyButton.cs
+++ b/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsReadyButton.cs
@@ -38,8 +38,6 @@ namespace osu.Game.Screens.OnlinePlay.Playlists
         private void load(OsuColour colours)
         {
             BackgroundColour = colours.Green;
-            Triangles.ColourDark = colours.Green;
-            Triangles.ColourLight = colours.GreenLight;
         }
 
         private bool hasRemainingAttempts = true;
diff --git a/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsRoomSettingsOverlay.cs b/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsRoomSettingsOverlay.cs
index cd52981528..2ee55da77b 100644
--- a/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsRoomSettingsOverlay.cs
+++ b/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsRoomSettingsOverlay.cs
@@ -16,6 +16,7 @@ using osu.Game.Graphics;
 using osu.Game.Graphics.Containers;
 using osu.Game.Graphics.Sprites;
 using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 using osu.Game.Online.API;
 using osu.Game.Online.API.Requests.Responses;
 using osu.Game.Online.Rooms;
@@ -58,7 +59,7 @@ namespace osu.Game.Screens.OnlinePlay.Playlists
             public OsuTextBox NameField = null!, MaxParticipantsField = null!, MaxAttemptsField = null!;
             public OsuDropdown<TimeSpan> DurationField = null!;
             public RoomAvailabilityPicker AvailabilityPicker = null!;
-            public TriangleButton ApplyButton = null!;
+            public RoundedButton ApplyButton = null!;
 
             public bool IsLoading => loadingLayer.State.Value == Visibility.Visible;
 
@@ -68,7 +69,7 @@ namespace osu.Game.Screens.OnlinePlay.Playlists
             private DrawableRoomPlaylist playlist = null!;
             private OsuSpriteText playlistLength = null!;
 
-            private PurpleTriangleButton editPlaylistButton = null!;
+            private PurpleRoundedButton editPlaylistButton = null!;
 
             [Resolved]
             private IRoomManager? manager { get; set; }
@@ -222,7 +223,7 @@ namespace osu.Game.Screens.OnlinePlay.Playlists
                                                                     },
                                                                     new Drawable[]
                                                                     {
-                                                                        editPlaylistButton = new PurpleTriangleButton
+                                                                        editPlaylistButton = new PurpleRoundedButton
                                                                         {
                                                                             RelativeSizeAxes = Axes.X,
                                                                             Height = 40,
@@ -414,7 +415,7 @@ namespace osu.Game.Screens.OnlinePlay.Playlists
             }
         }
 
-        public class CreateRoomButton : TriangleButton
+        public class CreateRoomButton : RoundedButton
         {
             public CreateRoomButton()
             {
@@ -424,9 +425,7 @@ namespace osu.Game.Screens.OnlinePlay.Playlists
             [BackgroundDependencyLoader]
             private void load(OsuColour colours)
             {
-                BackgroundColour = colours.Yellow;
-                Triangles.ColourLight = colours.YellowLight;
-                Triangles.ColourDark = colours.YellowDark;
+                BackgroundColour = colours.YellowDark;
             }
         }
 
diff --git a/osu.Game/Screens/Play/SoloSpectator.cs b/osu.Game/Screens/Play/SoloSpectator.cs
index 9ef05c3a05..2f1c86e639 100644
--- a/osu.Game/Screens/Play/SoloSpectator.cs
+++ b/osu.Game/Screens/Play/SoloSpectator.cs
@@ -18,7 +18,7 @@ using osu.Game.Beatmaps.Drawables.Cards;
 using osu.Game.Configuration;
 using osu.Game.Graphics;
 using osu.Game.Graphics.Sprites;
-using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 using osu.Game.Online.API;
 using osu.Game.Online.API.Requests;
 using osu.Game.Online.API.Requests.Responses;
@@ -54,7 +54,7 @@ namespace osu.Game.Screens.Play
         private OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Purple);
 
         private Container beatmapPanelContainer;
-        private TriangleButton watchButton;
+        private RoundedButton watchButton;
         private SettingsCheckbox automaticDownload;
 
         /// <summary>
@@ -147,7 +147,7 @@ namespace osu.Game.Screens.Play
                                 Anchor = Anchor.Centre,
                                 Origin = Anchor.Centre,
                             },
-                            watchButton = new PurpleTriangleButton
+                            watchButton = new PurpleRoundedButton
                             {
                                 Text = "Start Watching",
                                 Width = 250,
diff --git a/osu.Game/Tests/Visual/OsuManualInputManagerTestScene.cs b/osu.Game/Tests/Visual/OsuManualInputManagerTestScene.cs
index e56c546bac..3c569038b4 100644
--- a/osu.Game/Tests/Visual/OsuManualInputManagerTestScene.cs
+++ b/osu.Game/Tests/Visual/OsuManualInputManagerTestScene.cs
@@ -12,7 +12,7 @@ using osu.Framework.Testing;
 using osu.Framework.Testing.Input;
 using osu.Game.Graphics.Cursor;
 using osu.Game.Graphics.Sprites;
-using osu.Game.Graphics.UserInterface;
+using osu.Game.Graphics.UserInterfaceV2;
 using osu.Game.Input.Bindings;
 using osuTK;
 using osuTK.Graphics;
@@ -27,8 +27,8 @@ namespace osu.Game.Tests.Visual
 
         protected readonly ManualInputManager InputManager;
 
-        private readonly TriangleButton buttonTest;
-        private readonly TriangleButton buttonLocal;
+        private readonly RoundedButton buttonTest;
+        private readonly RoundedButton buttonLocal;
 
         /// <summary>
         /// Whether to create a nested container to handle <see cref="GlobalAction"/>s that result from local (manual) test input.
@@ -110,13 +110,13 @@ namespace osu.Game.Tests.Visual
 
                                     Children = new Drawable[]
                                     {
-                                        buttonLocal = new TriangleButton
+                                        buttonLocal = new RoundedButton
                                         {
                                             Text = "local",
                                             Size = new Vector2(50, 30),
                                             Action = returnUserInput
                                         },
-                                        buttonTest = new TriangleButton
+                                        buttonTest = new RoundedButton
                                         {
                                             Text = "test",
                                             Size = new Vector2(50, 30),