diff --git a/osu.Game/Overlays/Toolbar/Toolbar.cs b/osu.Game/Overlays/Toolbar/Toolbar.cs
index 74cfc10e75..948b9c96fc 100644
--- a/osu.Game/Overlays/Toolbar/Toolbar.cs
+++ b/osu.Game/Overlays/Toolbar/Toolbar.cs
@@ -55,7 +55,10 @@ namespace osu.Game.Overlays.Toolbar
                         },
                         modeSelector = new ToolbarModeSelector
                         {
-                            OnPlayModeChange = OnPlayModeChange
+                            OnPlayModeChange = (PlayMode mode) =>
+                            {
+                                OnPlayModeChange?.Invoke(mode);
+                            }
                         }
                     }
                 },
diff --git a/osu.Game/Screens/Select/CarouselContainer.cs b/osu.Game/Screens/Select/CarouselContainer.cs
index bb391c2eb7..5d8c11d223 100644
--- a/osu.Game/Screens/Select/CarouselContainer.cs
+++ b/osu.Game/Screens/Select/CarouselContainer.cs
@@ -192,8 +192,10 @@ namespace osu.Game.Screens.Select
             ScrollTo(selectedY, animated);
         }
 
-        public void Sort(FilterControl.SortMode mode) {
-            switch (mode) { 
+        public void Sort(FilterControl.SortMode mode)
+        {
+            switch (mode)
+            {
                 case FilterControl.SortMode.Artist:
                     groups.Sort((x, y) => string.Compare(x.BeatmapSet.Metadata.Artist, y.BeatmapSet.Metadata.Artist));
                     break;
@@ -206,15 +208,17 @@ namespace osu.Game.Screens.Select
                 case FilterControl.SortMode.Difficulty:
                     groups.Sort((x, y) =>
                     {
-                        float xAverage=0, yAverage=0;
-                        int counter=0;
-                        foreach (BeatmapInfo set in x.BeatmapSet.Beatmaps) {
+                        float xAverage = 0, yAverage = 0;
+                        int counter = 0;
+                        foreach (BeatmapInfo set in x.BeatmapSet.Beatmaps)
+                        {
                             xAverage += set.StarDifficulty;
                             counter++;
                         }
                         xAverage /= counter;
                         counter = 0;
-                        foreach (BeatmapInfo set in y.BeatmapSet.Beatmaps) {
+                        foreach (BeatmapInfo set in y.BeatmapSet.Beatmaps)
+                        {
                             yAverage += set.StarDifficulty;
                             counter++;
                         }
@@ -241,7 +245,7 @@ namespace osu.Game.Screens.Select
                     scrollableContent.Add(panel);
                 }
             }
-            SelectGroup(groups.FirstOrDefault(), groups.First().BeatmapPanels.FirstOrDefault());
+
         }
 
         private static float offsetX(float dist, float halfHeight)
@@ -344,7 +348,7 @@ namespace osu.Game.Screens.Select
 
         public void SelectNext(int direction = 1, bool skipDifficulties = true)
         {
-            if (!skipDifficulties)
+            if (!skipDifficulties && SelectedGroup != null)
             {
                 int i = SelectedGroup.BeatmapPanels.IndexOf(SelectedPanel) + direction;
 
diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs
index 4252de2978..1e60e74470 100644
--- a/osu.Game/Screens/Select/PlaySongSelect.cs
+++ b/osu.Game/Screens/Select/PlaySongSelect.cs
@@ -33,7 +33,7 @@ namespace osu.Game.Screens.Select
 {
     public class PlaySongSelect : OsuScreen
     {
-        private Bindable<PlayMode> playMode;
+        private Bindable<PlayMode> playMode = new Bindable<PlayMode>();
         private BeatmapDatabase database;
         protected override BackgroundScreen CreateBackground() => new BackgroundScreenBeatmap(Beatmap);
 
@@ -75,7 +75,7 @@ namespace osu.Game.Screens.Select
 
         [BackgroundDependencyLoader(permitNulls: true)]
         private void load(BeatmapDatabase beatmaps, AudioManager audio, DialogOverlay dialog, Framework.Game game,
-            OsuGame osuGame, OsuColour colours)
+            OsuGame osu, OsuColour colours)
         {
             const float carousel_width = 640;
             const float filter_height = 100;
@@ -111,7 +111,7 @@ namespace osu.Game.Screens.Select
                 {
                     RelativeSizeAxes = Axes.X,
                     Height = filter_height,
-                    FilterChanged = filterChanged,
+                    FilterChanged = () => filterChanged(),
                     Exit = Exit,
                 },
                 beatmapInfoWedge = new BeatmapInfoWedge
@@ -146,11 +146,9 @@ namespace osu.Game.Screens.Select
             footer.AddButton(@"random", colours.Green, carousel.SelectRandom);
             footer.AddButton(@"options", colours.Blue, null);
 
-            if (osuGame != null)
-            {
-                playMode = osuGame.PlayMode;
-                playMode.ValueChanged += playMode_ValueChanged;
-            }
+            if (osu != null)
+                playMode.BindTo(osu.PlayMode);
+            playMode.ValueChanged += playMode_ValueChanged;
 
             if (database == null)
                 database = beatmaps;
@@ -171,7 +169,7 @@ namespace osu.Game.Screens.Select
 
         private ScheduledDelegate filterTask;
 
-        private void filterChanged()
+        private void filterChanged(bool debounce = true, bool eagerSelection = true)
         {
             filterTask?.Cancel();
             filterTask = Scheduler.AddDelayed(() =>
@@ -183,25 +181,42 @@ namespace osu.Game.Screens.Select
                 foreach (var beatmapGroup in carousel)
                 {
                     var set = beatmapGroup.BeatmapSet;
-                    bool match = string.IsNullOrEmpty(search)
+
+                    bool hasCurrentMode = set.Beatmaps.Any(bm => bm.Mode == playMode);
+
+                    bool match = hasCurrentMode;
+
+                    match &= string.IsNullOrEmpty(search)
                         || (set.Metadata.Artist ?? "").IndexOf(search, StringComparison.InvariantCultureIgnoreCase) != -1
                         || (set.Metadata.ArtistUnicode ?? "").IndexOf(search, StringComparison.InvariantCultureIgnoreCase) != -1
                         || (set.Metadata.Title ?? "").IndexOf(search, StringComparison.InvariantCultureIgnoreCase) != -1
                         || (set.Metadata.TitleUnicode ?? "").IndexOf(search, StringComparison.InvariantCultureIgnoreCase) != -1;
+
                     if (match)
                     {
-                        beatmapGroup.State = BeatmapGroupState.Collapsed;
                         if (newSelection == null || beatmapGroup.BeatmapSet.OnlineBeatmapSetID == Beatmap.BeatmapSetInfo.OnlineBeatmapSetID)
+                        {
+                            if (newSelection != null)
+                                newSelection.State = BeatmapGroupState.Collapsed;
                             newSelection = beatmapGroup;
+                        }
+                        else
+                            beatmapGroup.State = BeatmapGroupState.Collapsed;
                     }
                     else
                     {
                         beatmapGroup.State = BeatmapGroupState.Hidden;
                     }
                 }
+
                 if (newSelection != null)
-                    carousel.SelectBeatmap(newSelection.BeatmapSet.Beatmaps[0], false);
-            }, 250);
+                {
+                    if (newSelection.BeatmapPanels.Any(b => b.Beatmap.ID == Beatmap.BeatmapInfo.ID))
+                        carousel.SelectBeatmap(Beatmap.BeatmapInfo, false);
+                    else if (eagerSelection)
+                        carousel.SelectBeatmap(newSelection.BeatmapSet.Beatmaps[0], false);
+                }
+            }, debounce ? 250 : 0);
         }
 
         private void onBeatmapSetAdded(BeatmapSetInfo s) => Schedule(() => addBeatmapSet(s, Game, true));
@@ -262,8 +277,6 @@ namespace osu.Game.Screens.Select
         protected override void Dispose(bool isDisposing)
         {
             base.Dispose(isDisposing);
-            if (playMode != null)
-                playMode.ValueChanged -= playMode_ValueChanged;
 
             database.BeatmapSetAdded -= onBeatmapSetAdded;
             database.BeatmapSetRemoved -= onBeatmapSetRemoved;
@@ -273,6 +286,7 @@ namespace osu.Game.Screens.Select
 
         private void playMode_ValueChanged(object sender, EventArgs e)
         {
+            filterChanged(false);
         }
 
         private void changeBackground(WorkingBeatmap beatmap)
@@ -358,6 +372,8 @@ namespace osu.Game.Screens.Select
 
                 carousel.AddGroup(group);
 
+                filterChanged(false, false);
+
                 if (Beatmap == null || select)
                     carousel.SelectBeatmap(beatmapSet.Beatmaps.First());
                 else
@@ -391,7 +407,6 @@ namespace osu.Game.Screens.Select
                 if (token.IsCancellationRequested) return;
                 addBeatmapSet(beatmapSet, game);
             }
-            filterChanged();
         }
 
         protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)