diff --git a/osu-framework b/osu-framework
index 0f3db5da09..e5f0cf73c1 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 0f3db5da09d0e7c4d2ef3057030e018f34ba536e
+Subproject commit e5f0cf73c1e0bbcbd04194bf175d73af47fc850a
diff --git a/osu.Game/Graphics/UserInterface/FocusedTextBox.cs b/osu.Game/Graphics/UserInterface/FocusedTextBox.cs
index fe1d255bba..42fff0f258 100644
--- a/osu.Game/Graphics/UserInterface/FocusedTextBox.cs
+++ b/osu.Game/Graphics/UserInterface/FocusedTextBox.cs
@@ -37,11 +37,10 @@ namespace osu.Game.Graphics.UserInterface
             this.inputManager = inputManager;
         }
 
-        protected override bool OnFocus(InputState state)
+        protected override void OnFocus(InputState state)
         {
-            var result = base.OnFocus(state);
+            base.OnFocus(state);
             BorderThickness = 0;
-            return result;
         }
 
         protected override void OnFocusLost(InputState state)
@@ -56,6 +55,6 @@ namespace osu.Game.Graphics.UserInterface
             base.OnFocusLost(state);
         }
 
-        public override bool RequestingFocus => HoldFocus;
+        public override bool RequestsFocus => HoldFocus;
     }
 }
diff --git a/osu.Game/Graphics/UserInterface/OsuTextBox.cs b/osu.Game/Graphics/UserInterface/OsuTextBox.cs
index 97c38f6b85..3512b4cdb1 100644
--- a/osu.Game/Graphics/UserInterface/OsuTextBox.cs
+++ b/osu.Game/Graphics/UserInterface/OsuTextBox.cs
@@ -45,11 +45,10 @@ namespace osu.Game.Graphics.UserInterface
             BorderColour = colour.Yellow;
         }
 
-        protected override bool OnFocus(InputState state)
+        protected override void OnFocus(InputState state)
         {
             BorderThickness = 3;
-
-            return base.OnFocus(state);
+            base.OnFocus(state);
         }
 
         protected override void OnFocusLost(InputState state)
diff --git a/osu.Game/Overlays/ChatOverlay.cs b/osu.Game/Overlays/ChatOverlay.cs
index 5b2c01151c..a9970e5e95 100644
--- a/osu.Game/Overlays/ChatOverlay.cs
+++ b/osu.Game/Overlays/ChatOverlay.cs
@@ -167,11 +167,15 @@ namespace osu.Game.Overlays
             }
         }
 
-        protected override bool OnFocus(InputState state)
+        public override bool AcceptsFocus => true;
+
+        protected override bool OnClick(InputState state) => true;
+
+        protected override void OnFocus(InputState state)
         {
             //this is necessary as inputTextBox is masked away and therefore can't get focus :(
             InputManager.ChangeFocus(inputTextBox);
-            return false;
+            base.OnFocus(state);
         }
 
         protected override void PopIn()
diff --git a/osu.Game/Overlays/DirectOverlay.cs b/osu.Game/Overlays/DirectOverlay.cs
index b1bc7e0c04..b7f6572bcc 100644
--- a/osu.Game/Overlays/DirectOverlay.cs
+++ b/osu.Game/Overlays/DirectOverlay.cs
@@ -98,7 +98,7 @@ namespace osu.Game.Overlays
                         new ScrollContainer
                         {
                             RelativeSizeAxes = Axes.Both,
-                            ScrollDraggerVisible = false,
+                            ScrollbarVisible = false,
                             Children = new Drawable[]
                             {
                                 new FillFlowContainer
@@ -187,10 +187,14 @@ namespace osu.Game.Overlays
             panels.Children = BeatmapSets.Select(b => displayStyle == PanelDisplayStyle.Grid ? (DirectPanel)new DirectGridPanel(b) { Width = 400 } : new DirectListPanel(b));
         }
 
-        protected override bool OnFocus(InputState state)
+        public override bool AcceptsFocus => true;
+
+        protected override bool OnClick(InputState state) => true;
+
+        protected override void OnFocus(InputState state)
         {
             InputManager.ChangeFocus(filter.Search);
-            return false;
+            base.OnFocus(state);
         }
 
         protected override void PopIn()
diff --git a/osu.Game/Overlays/Music/PlaylistItem.cs b/osu.Game/Overlays/Music/PlaylistItem.cs
index 9b72cfce42..0618f96cac 100644
--- a/osu.Game/Overlays/Music/PlaylistItem.cs
+++ b/osu.Game/Overlays/Music/PlaylistItem.cs
@@ -135,7 +135,7 @@ namespace osu.Game.Overlays.Music
 
         private bool matching = true;
 
-        public bool MatchingCurrentFilter
+        public bool MatchingFilter
         {
             set
             {
diff --git a/osu.Game/Overlays/Music/PlaylistList.cs b/osu.Game/Overlays/Music/PlaylistList.cs
index ffe59a9d93..eeb072fb00 100644
--- a/osu.Game/Overlays/Music/PlaylistList.cs
+++ b/osu.Game/Overlays/Music/PlaylistList.cs
@@ -22,7 +22,7 @@ namespace osu.Game.Overlays.Music
             }
         }
 
-        public BeatmapSetInfo FirstVisibleSet => items.Children.FirstOrDefault(i => i.MatchingCurrentFilter)?.BeatmapSetInfo;
+        public BeatmapSetInfo FirstVisibleSet => items.Children.FirstOrDefault(i => i.MatchingFilter)?.BeatmapSetInfo;
 
         private void itemSelected(BeatmapSetInfo b)
         {
@@ -75,7 +75,7 @@ namespace osu.Game.Overlays.Music
         private class ItemSearchContainer : FillFlowContainer<PlaylistItem>, IHasFilterableChildren
         {
             public string[] FilterTerms => new string[] { };
-            public bool MatchingCurrentFilter
+            public bool MatchingFilter
             {
                 set
                 {
diff --git a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs
index f336566680..11a964d179 100644
--- a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs
@@ -166,10 +166,14 @@ namespace osu.Game.Overlays.Settings.Sections.General
             if (form != null) inputManager.ChangeFocus(form);
         }
 
-        protected override bool OnFocus(InputState state)
+        public override bool AcceptsFocus => true;
+
+        protected override bool OnClick(InputState state) => true;
+
+        protected override void OnFocus(InputState state)
         {
             if (form != null) inputManager.ChangeFocus(form);
-            return base.OnFocus(state);
+            base.OnFocus(state);
         }
 
         private class LoginForm : FillFlowContainer
@@ -235,10 +239,13 @@ namespace osu.Game.Overlays.Settings.Sections.General
                 };
             }
 
-            protected override bool OnFocus(InputState state)
+            public override bool AcceptsFocus => true;
+
+            protected override bool OnClick(InputState state) => true;
+
+            protected override void OnFocus(InputState state)
             {
                 Schedule(() => { inputManager.ChangeFocus(string.IsNullOrEmpty(username.Text) ? username : password); });
-                return base.OnFocus(state);
             }
         }
 
diff --git a/osu.Game/Overlays/Settings/SettingsItem.cs b/osu.Game/Overlays/Settings/SettingsItem.cs
index e592ca9e37..7cddefb755 100644
--- a/osu.Game/Overlays/Settings/SettingsItem.cs
+++ b/osu.Game/Overlays/Settings/SettingsItem.cs
@@ -55,7 +55,7 @@ namespace osu.Game.Overlays.Settings
 
         public string[] FilterTerms => new[] { LabelText };
 
-        public bool MatchingCurrentFilter
+        public bool MatchingFilter
         {
             set
             {
diff --git a/osu.Game/Overlays/Settings/SettingsSection.cs b/osu.Game/Overlays/Settings/SettingsSection.cs
index 8b95c72412..e65b7f19d9 100644
--- a/osu.Game/Overlays/Settings/SettingsSection.cs
+++ b/osu.Game/Overlays/Settings/SettingsSection.cs
@@ -24,7 +24,7 @@ namespace osu.Game.Overlays.Settings
 
         public IEnumerable<IFilterable> FilterableChildren => Children.OfType<IFilterable>();
         public string[] FilterTerms => new[] { Header };
-        public bool MatchingCurrentFilter
+        public bool MatchingFilter
         {
             set
             {
diff --git a/osu.Game/Overlays/Settings/SettingsSubsection.cs b/osu.Game/Overlays/Settings/SettingsSubsection.cs
index 30abbc3805..44328ae867 100644
--- a/osu.Game/Overlays/Settings/SettingsSubsection.cs
+++ b/osu.Game/Overlays/Settings/SettingsSubsection.cs
@@ -20,7 +20,7 @@ namespace osu.Game.Overlays.Settings
 
         public IEnumerable<IFilterable> FilterableChildren => Children.OfType<IFilterable>();
         public string[] FilterTerms => new[] { Header };
-        public bool MatchingCurrentFilter
+        public bool MatchingFilter
         {
             set
             {
diff --git a/osu.Game/Overlays/SettingsOverlay.cs b/osu.Game/Overlays/SettingsOverlay.cs
index 474631fd1e..87f6d836af 100644
--- a/osu.Game/Overlays/SettingsOverlay.cs
+++ b/osu.Game/Overlays/SettingsOverlay.cs
@@ -138,10 +138,14 @@ namespace osu.Game.Overlays
                 InputManager.ChangeFocus(null);
         }
 
-        protected override bool OnFocus(InputState state)
+        public override bool AcceptsFocus => true;
+
+        protected override bool OnClick(InputState state) => true;
+
+        protected override void OnFocus(InputState state)
         {
             InputManager.ChangeFocus(searchTextBox);
-            return false;
+            base.OnFocus(state);
         }
 
         private class SettingsSectionsContainer : SectionsContainer
@@ -159,7 +163,7 @@ namespace osu.Game.Overlays
 
             public SettingsSectionsContainer()
             {
-                ScrollContainer.ScrollDraggerVisible = false;
+                ScrollContainer.ScrollbarVisible = false;
                 Add(headerBackground = new Box
                 {
                     Colour = Color4.Black,
diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs
index 6a0e37ca6f..de9c698f2a 100644
--- a/osu.Game/Screens/OsuScreen.cs
+++ b/osu.Game/Screens/OsuScreen.cs
@@ -131,7 +131,15 @@ namespace osu.Game.Screens
                     Background.Exit();
             }
 
-            return base.OnExiting(next);
+            if (base.OnExiting(next))
+                return true;
+
+            // while this is not necessary as we are constructing our own bindable, there are cases where
+            // the GC doesn't run as fast as expected and this is triggered post-exit.
+            // added to resolve https://github.com/ppy/osu/issues/829
+            beatmap.ValueChanged -= OnBeatmapChanged;
+
+            return false;
         }
     }
 }
diff --git a/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs b/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
index a7aa752d65..7d97581a29 100644
--- a/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
+++ b/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
@@ -74,7 +74,7 @@ namespace osu.Game.Screens.Select.Leaderboards
                 scrollContainer = new ScrollContainer
                 {
                     RelativeSizeAxes = Axes.Both,
-                    ScrollDraggerVisible = false,
+                    ScrollbarVisible = false,
                     Children = new Drawable[]
                     {
                         scrollFlow = new FillFlowContainer<LeaderboardScore>