diff --git a/osu-framework b/osu-framework
index e5f0cf73c1..c76d8b811b 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit e5f0cf73c1e0bbcbd04194bf175d73af47fc850a
+Subproject commit c76d8b811b93d0c0862f342ebbab70a461006e13
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseTooltip.cs b/osu.Desktop.VisualTests/Tests/TestCaseTooltip.cs
deleted file mode 100644
index c536672314..0000000000
--- a/osu.Desktop.VisualTests/Tests/TestCaseTooltip.cs
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
-// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Containers;
-using osu.Framework.Testing;
-using osu.Game.Graphics.Sprites;
-using osu.Game.Graphics.UserInterface;
-using osu.Framework.Configuration;
-using OpenTK;
-using osu.Game.Graphics;
-
-namespace osu.Desktop.VisualTests.Tests
-{
-    internal class TestCaseTooltip : TestCase
-    {
-        public override string Description => "tests tooltips on various elements";
-
-        public override void Reset()
-        {
-            base.Reset();
-            OsuSliderBar<int> slider;
-            OsuSliderBar<double> sliderDouble;
-
-            const float width = 400;
-
-            Children = new Drawable[]
-            {
-                new FillFlowContainer
-                {
-                    RelativeSizeAxes = Axes.Both,
-                    Direction = FillDirection.Vertical,
-                    Spacing = new Vector2(0, 10),
-                    Children = new Drawable[]
-                    {
-                        new TooltipTextContainer("text with a tooltip"),
-                        new TooltipTextContainer("more text with another tooltip"),
-                        new TooltipTextbox
-                        {
-                            Text = "a textbox with a tooltip",
-                            Size = new Vector2(width,30),
-                        },
-                        slider = new OsuSliderBar<int>
-                        {
-                            Width = width,
-                        },
-                        sliderDouble = new OsuSliderBar<double>
-                        {
-                            Width = width,
-                        },
-                    },
-                },
-            };
-
-            slider.Current.BindTo(new BindableInt(5)
-            {
-                MaxValue = 10,
-                MinValue = 0
-            });
-
-            sliderDouble.Current.BindTo(new BindableDouble(0.5)
-            {
-                MaxValue = 1,
-                MinValue = 0
-            });
-        }
-
-        private class TooltipTextContainer : Container, IHasTooltip
-        {
-            private readonly OsuSpriteText text;
-
-            public string TooltipText => text.Text;
-
-            public TooltipTextContainer(string tooltipText)
-            {
-                AutoSizeAxes = Axes.Both;
-                Children = new[]
-                {
-                    text = new OsuSpriteText
-                    {
-                        Text = tooltipText,
-                    }
-                };
-            }
-        }
-
-        private class TooltipTextbox : OsuTextBox, IHasTooltip
-        {
-            public string TooltipText => Text;
-        }
-    }
-}
diff --git a/osu.Desktop.VisualTests/osu.Desktop.VisualTests.csproj b/osu.Desktop.VisualTests/osu.Desktop.VisualTests.csproj
index 8b4edb3192..34ab04fc49 100644
--- a/osu.Desktop.VisualTests/osu.Desktop.VisualTests.csproj
+++ b/osu.Desktop.VisualTests/osu.Desktop.VisualTests.csproj
@@ -209,7 +209,6 @@
     <Compile Include="Tests\TestCaseTaikoPlayfield.cs" />
     <Compile Include="Tests\TestCaseTextAwesome.cs" />
     <Compile Include="Tests\TestCasePlaySongSelect.cs" />
-    <Compile Include="Tests\TestCaseTooltip.cs" />
     <Compile Include="Tests\TestCaseTwoLayerButton.cs" />
     <Compile Include="VisualTestGame.cs" />
     <Compile Include="Platform\TestStorage.cs" />
diff --git a/osu.Game/Graphics/Containers/ReverseDepthFillFlowContainer.cs b/osu.Game/Graphics/Containers/ReverseDepthFillFlowContainer.cs
index 2b52b06abc..89b4a90010 100644
--- a/osu.Game/Graphics/Containers/ReverseDepthFillFlowContainer.cs
+++ b/osu.Game/Graphics/Containers/ReverseDepthFillFlowContainer.cs
@@ -11,6 +11,6 @@ namespace osu.Game.Graphics.Containers
     public class ReverseDepthFillFlowContainer<T> : FillFlowContainer<T> where T : Drawable
     {
         protected override IComparer<Drawable> DepthComparer => new ReverseCreationOrderDepthComparer();
-        protected override IEnumerable<T> FlowingChildren => base.FlowingChildren.Reverse();
+        protected override IEnumerable<Drawable> FlowingChildren => base.FlowingChildren.Reverse();
     }
 }
diff --git a/osu.Game/Graphics/Cursor/MenuCursor.cs b/osu.Game/Graphics/Cursor/MenuCursor.cs
index b48ab879a6..82ae424ab0 100644
--- a/osu.Game/Graphics/Cursor/MenuCursor.cs
+++ b/osu.Game/Graphics/Cursor/MenuCursor.cs
@@ -93,6 +93,7 @@ namespace osu.Game.Graphics.Cursor
         {
             private Container cursorContainer;
             private Bindable<double> cursorScale;
+            private const float base_scale = 0.15f;
 
             public Sprite AdditiveLayer;
 
@@ -108,17 +109,15 @@ namespace osu.Game.Graphics.Cursor
                 {
                     cursorContainer = new Container
                     {
-                        Size = new Vector2(32),
+                        AutoSizeAxes = Axes.Both,
                         Children = new Drawable[]
                         {
                             new Sprite
                             {
-                                FillMode = FillMode.Fit,
                                 Texture = textures.Get(@"Cursor/menu-cursor"),
                             },
                             AdditiveLayer = new Sprite
                             {
-                                FillMode = FillMode.Fit,
                                 BlendingMode = BlendingMode.Additive,
                                 Colour = colour.Pink,
                                 Alpha = 0,
@@ -129,7 +128,7 @@ namespace osu.Game.Graphics.Cursor
                 };
 
                 cursorScale = config.GetBindable<double>(OsuSetting.MenuCursorSize);
-                cursorScale.ValueChanged += newScale => cursorContainer.Scale = new Vector2((float)newScale);
+                cursorScale.ValueChanged += newScale => cursorContainer.Scale = new Vector2((float)newScale * base_scale);
                 cursorScale.TriggerChange();
             }
         }
diff --git a/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs b/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs
new file mode 100644
index 0000000000..46addf5ac2
--- /dev/null
+++ b/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs
@@ -0,0 +1,93 @@
+// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using OpenTK.Graphics;
+using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Cursor;
+using osu.Framework.Graphics.Sprites;
+using osu.Game.Graphics.Sprites;
+
+namespace osu.Game.Graphics.Cursor
+{
+    public class OsuTooltipContainer : TooltipContainer
+    {
+        protected override Tooltip CreateTooltip() => new OsuTooltip();
+
+        public OsuTooltipContainer(CursorContainer cursor) : base(cursor)
+        {
+        }
+
+        public class OsuTooltip : Tooltip
+        {
+            private readonly Box background;
+            private readonly OsuSpriteText text;
+
+            public override string TooltipText
+            {
+                set
+                {
+                    if (value == text.Text) return;
+
+                    text.Text = value;
+                    if (Alpha > 0)
+                    {
+                        AutoSizeDuration = 250;
+                        background.FlashColour(OsuColour.Gray(0.4f), 1000, EasingTypes.OutQuint);
+                    }
+                    else
+                        AutoSizeDuration = 0;
+                }
+            }
+
+            private const float text_size = 16;
+
+            public OsuTooltip()
+            {
+                AutoSizeEasing = EasingTypes.OutQuint;
+
+                CornerRadius = 5;
+                Masking = true;
+                EdgeEffect = new EdgeEffect
+                {
+                    Type = EdgeEffectType.Shadow,
+                    Colour = Color4.Black.Opacity(40),
+                    Radius = 5,
+                };
+                Children = new Drawable[]
+                {
+                    background = new Box
+                    {
+                        RelativeSizeAxes = Axes.Both,
+                        Alpha = 0.9f,
+                    },
+                    text = new OsuSpriteText
+                    {
+                        TextSize = text_size,
+                        Padding = new MarginPadding(5),
+                        Font = @"Exo2.0-Regular",
+                    }
+                };
+            }
+
+            [BackgroundDependencyLoader]
+            private void load(OsuColour colour)
+            {
+                background.Colour = colour.Gray3;
+            }
+
+            protected override void PopIn()
+            {
+                FadeIn(500, EasingTypes.OutQuint);
+            }
+
+            protected override void PopOut()
+            {
+                using (BeginDelayedSequence(150))
+                    FadeOut(500, EasingTypes.OutQuint);
+            }
+        }
+    }
+}
diff --git a/osu.Game/Graphics/Cursor/TooltipContainer.cs b/osu.Game/Graphics/Cursor/TooltipContainer.cs
deleted file mode 100644
index c5b8382816..0000000000
--- a/osu.Game/Graphics/Cursor/TooltipContainer.cs
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
-// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-
-using OpenTK;
-using OpenTK.Graphics;
-using osu.Framework.Allocation;
-using osu.Framework.Extensions.Color4Extensions;
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Containers;
-using osu.Framework.Graphics.Cursor;
-using osu.Framework.Graphics.Sprites;
-using osu.Framework.Input;
-using osu.Framework.Threading;
-using osu.Game.Graphics.Sprites;
-using System.Linq;
-
-namespace osu.Game.Graphics.Cursor
-{
-    public class TooltipContainer : Container
-    {
-        private readonly CursorContainer cursor;
-        private readonly Tooltip tooltip;
-
-        private ScheduledDelegate findTooltipTask;
-        private UserInputManager inputManager;
-
-        private const int default_appear_delay = 220;
-
-        private IHasTooltip currentlyDisplayed;
-
-        public TooltipContainer(CursorContainer cursor)
-        {
-            this.cursor = cursor;
-            AlwaysPresent = true;
-            RelativeSizeAxes = Axes.Both;
-            Add(tooltip = new Tooltip { Alpha = 0 });
-        }
-
-        [BackgroundDependencyLoader]
-        private void load(UserInputManager input)
-        {
-            inputManager = input;
-        }
-
-        protected override void Update()
-        {
-            if (tooltip.IsPresent)
-            {
-                if (currentlyDisplayed != null)
-                    tooltip.TooltipText = currentlyDisplayed.TooltipText;
-
-                //update the position of the displayed tooltip.
-                tooltip.Position = ToLocalSpace(cursor.ActiveCursor.ScreenSpaceDrawQuad.Centre) + new Vector2(10);
-            }
-        }
-
-        protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
-        {
-            updateTooltipState(state);
-            return base.OnMouseUp(state, args);
-        }
-
-        protected override bool OnMouseMove(InputState state)
-        {
-            updateTooltipState(state);
-            return base.OnMouseMove(state);
-        }
-
-        private void updateTooltipState(InputState state)
-        {
-            if (currentlyDisplayed?.Hovering != true)
-            {
-                if (currentlyDisplayed != null && !state.Mouse.HasMainButtonPressed)
-                {
-                    tooltip.Delay(150);
-                    tooltip.FadeOut(500, EasingTypes.OutQuint);
-                    currentlyDisplayed = null;
-                }
-
-                findTooltipTask?.Cancel();
-                findTooltipTask = Scheduler.AddDelayed(delegate
-                {
-                    var tooltipTarget = inputManager.HoveredDrawables.OfType<IHasTooltip>().FirstOrDefault();
-
-                    if (tooltipTarget == null) return;
-
-                    tooltip.TooltipText = tooltipTarget.TooltipText;
-                    tooltip.FadeIn(500, EasingTypes.OutQuint);
-
-                    currentlyDisplayed = tooltipTarget;
-                }, (1 - tooltip.Alpha) * default_appear_delay);
-            }
-        }
-
-        public class Tooltip : Container
-        {
-            private readonly Box background;
-            private readonly OsuSpriteText text;
-
-            public string TooltipText
-            {
-                set
-                {
-                    if (value == text.Text) return;
-
-                    text.Text = value;
-                    if (Alpha > 0)
-                    {
-                        AutoSizeDuration = 250;
-                        background.FlashColour(OsuColour.Gray(0.4f), 1000, EasingTypes.OutQuint);
-                    }
-                    else
-                        AutoSizeDuration = 0;
-                }
-            }
-
-            public override bool HandleInput => false;
-
-            private const float text_size = 16;
-
-            public Tooltip()
-            {
-                AutoSizeEasing = EasingTypes.OutQuint;
-                AutoSizeAxes = Axes.Both;
-
-                CornerRadius = 5;
-                Masking = true;
-                EdgeEffect = new EdgeEffect
-                {
-                    Type = EdgeEffectType.Shadow,
-                    Colour = Color4.Black.Opacity(40),
-                    Radius = 5,
-                };
-                Children = new Drawable[]
-                {
-                    background = new Box
-                    {
-                        RelativeSizeAxes = Axes.Both,
-                        Alpha = 0.9f,
-                    },
-                    text = new OsuSpriteText
-                    {
-                        TextSize = text_size,
-                        Padding = new MarginPadding(5),
-                        Font = @"Exo2.0-Regular",
-                    }
-                };
-            }
-
-            [BackgroundDependencyLoader]
-            private void load(OsuColour colour)
-            {
-                background.Colour = colour.Gray3;
-            }
-        }
-    }
-}
diff --git a/osu.Game/Graphics/IHasTooltip.cs b/osu.Game/Graphics/IHasTooltip.cs
deleted file mode 100644
index dd51d68c41..0000000000
--- a/osu.Game/Graphics/IHasTooltip.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
-// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-
-using osu.Framework.Graphics;
-
-namespace osu.Game.Graphics
-{
-    public interface IHasTooltip : IDrawable
-    {
-        /// <summary>
-        /// Tooltip that shows when hovering the drawable
-        /// </summary>
-        string TooltipText { get; }
-    }
-}
diff --git a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
index 6cf7b2dfa5..c8be085b51 100644
--- a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
+++ b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
@@ -11,6 +11,7 @@ using osu.Framework.Graphics;
 using osu.Framework.Graphics.Sprites;
 using osu.Framework.Graphics.UserInterface;
 using osu.Framework.Input;
+using osu.Framework.Graphics.Cursor;
 
 namespace osu.Game.Graphics.UserInterface
 {
diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs
index 2c39a82245..b228b6485a 100644
--- a/osu.Game/OsuGameBase.cs
+++ b/osu.Game/OsuGameBase.cs
@@ -158,7 +158,7 @@ namespace osu.Game
                         Children = new Drawable[]
                         {
                             Cursor = new MenuCursor(),
-                            new TooltipContainer(Cursor) { Depth = -1 },
+                            new OsuTooltipContainer(Cursor) { Depth = -1 },
                         }
                     },
                 }
diff --git a/osu.Game/Overlays/Mods/ModButton.cs b/osu.Game/Overlays/Mods/ModButton.cs
index f7df67b66d..dd135e43ef 100644
--- a/osu.Game/Overlays/Mods/ModButton.cs
+++ b/osu.Game/Overlays/Mods/ModButton.cs
@@ -16,7 +16,7 @@ using osu.Game.Rulesets.Mods;
 using osu.Game.Rulesets.UI;
 using System;
 using System.Linq;
-using osu.Game.Graphics;
+using osu.Framework.Graphics.Cursor;
 
 namespace osu.Game.Overlays.Mods
 {
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index b58e2f8c41..6b3b4d01ba 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -105,7 +105,6 @@
     <Compile Include="Graphics\Cursor\CursorTrail.cs" />
     <Compile Include="Graphics\Cursor\GameplayCursor.cs" />
     <Compile Include="Graphics\IHasAccentColour.cs" />
-    <Compile Include="Graphics\IHasTooltip.cs" />
     <Compile Include="Graphics\Sprites\OsuSpriteText.cs" />
     <Compile Include="Graphics\Transforms\TransformAccent.cs" />
     <Compile Include="Graphics\UserInterface\BackButton.cs" />
@@ -118,7 +117,7 @@
     <Compile Include="Graphics\UserInterface\OsuTextBox.cs" />
     <Compile Include="Graphics\UserInterface\SimpleComboCounter.cs" />
     <Compile Include="Graphics\UserInterface\TwoLayerButton.cs" />
-    <Compile Include="Graphics\Cursor\TooltipContainer.cs" />
+    <Compile Include="Graphics\Cursor\OsuTooltipContainer.cs" />
     <Compile Include="Input\Handlers\ReplayInputHandler.cs" />
     <Compile Include="IO\Legacy\ILegacySerializable.cs" />
     <Compile Include="IO\Legacy\SerializationReader.cs" />