From c73a1ae058fa03bd5c5708b738fc0052936343fe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Fri, 14 Jul 2017 16:46:00 +0300
Subject: [PATCH 01/30] Use TransformTo in rolling counters

---
 .../Graphics/UserInterface/RollingCounter.cs   | 18 ++----------------
 osu.Game/Screens/Play/HUD/ComboCounter.cs      | 15 +--------------
 2 files changed, 3 insertions(+), 30 deletions(-)

diff --git a/osu.Game/Graphics/UserInterface/RollingCounter.cs b/osu.Game/Graphics/UserInterface/RollingCounter.cs
index db6e6ff44f..2afa4da058 100644
--- a/osu.Game/Graphics/UserInterface/RollingCounter.cs
+++ b/osu.Game/Graphics/UserInterface/RollingCounter.cs
@@ -15,6 +15,7 @@ using OpenTK.Graphics;
 namespace osu.Game.Graphics.UserInterface
 {
     public abstract class RollingCounter<T> : Container, IHasAccentColour
+        where T : struct, IEquatable<T>
     {
         /// <summary>
         /// The current value.
@@ -193,27 +194,12 @@ namespace osu.Game.Graphics.UserInterface
         /// </summary>
         protected void TransformCount(Transform<T, Drawable> transform, T currentValue, T newValue)
         {
-            Type type = transform.GetType();
-
-            Flush(false, type);
-
-            if (RollingDuration < 1)
-            {
-                DisplayedCount = Current;
-                return;
-            }
-
             double rollingTotalDuration =
                 IsRollingProportional
                     ? GetProportionalDuration(currentValue, newValue)
                     : RollingDuration;
 
-            transform.StartTime = TransformStartTime;
-            transform.EndTime = TransformStartTime + rollingTotalDuration;
-            transform.EndValue = newValue;
-            transform.Easing = RollingEasing;
-
-            Transforms.Add(transform);
+            TransformTo(newValue, rollingTotalDuration, RollingEasing, transform);
         }
     }
 }
diff --git a/osu.Game/Screens/Play/HUD/ComboCounter.cs b/osu.Game/Screens/Play/HUD/ComboCounter.cs
index f527eaacaf..4a9ea0fa59 100644
--- a/osu.Game/Screens/Play/HUD/ComboCounter.cs
+++ b/osu.Game/Screens/Play/HUD/ComboCounter.cs
@@ -188,20 +188,7 @@ namespace osu.Game.Screens.Play.HUD
 
         private void transformRoll(TransformComboRoll transform, int currentValue, int newValue)
         {
-            Flush(false, typeof(TransformComboRoll));
-
-            if (RollingDuration < 1)
-            {
-                DisplayedCount = Current;
-                return;
-            }
-
-            transform.StartTime = Time.Current;
-            transform.EndTime = Time.Current + getProportionalDuration(currentValue, newValue);
-            transform.EndValue = newValue;
-            transform.Easing = RollingEasing;
-
-            Transforms.Add(transform);
+            TransformTo(newValue, getProportionalDuration(currentValue, newValue), RollingEasing, new TransformComboRoll());
         }
 
         protected class TransformComboRoll : Transform<int, Drawable>

From fd58c6e835557c14d4f5033a2192e95609a157b0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Fri, 14 Jul 2017 19:14:07 +0300
Subject: [PATCH 02/30] Nicer generic rolling counters

---
 .../UserInterface/PercentageCounter.cs        | 20 --------
 .../Graphics/UserInterface/RollingCounter.cs  | 48 ++++++++++++-------
 .../Graphics/UserInterface/ScoreCounter.cs    | 20 --------
 .../UserInterface/SimpleComboCounter.cs       | 20 --------
 .../Screens/Play/HUD/ComboResultCounter.cs    | 28 ++---------
 5 files changed, 34 insertions(+), 102 deletions(-)

diff --git a/osu.Game/Graphics/UserInterface/PercentageCounter.cs b/osu.Game/Graphics/UserInterface/PercentageCounter.cs
index b51dd2287b..4065978de8 100644
--- a/osu.Game/Graphics/UserInterface/PercentageCounter.cs
+++ b/osu.Game/Graphics/UserInterface/PercentageCounter.cs
@@ -13,8 +13,6 @@ namespace osu.Game.Graphics.UserInterface
     /// </summary>
     public class PercentageCounter : RollingCounter<double>
     {
-        protected override Type TransformType => typeof(TransformAccuracy);
-
         protected override double RollingDuration => 750;
 
         private float epsilon => 1e-10f;
@@ -44,23 +42,5 @@ namespace osu.Game.Graphics.UserInterface
         {
             Current.Value = Current + amount;
         }
-
-        protected class TransformAccuracy : Transform<double, Drawable>
-        {
-            public virtual double CurrentValue
-            {
-                get
-                {
-                    double time = Time?.Current ?? 0;
-                    if (time < StartTime) return StartValue;
-                    if (time >= EndTime) return EndValue;
-
-                    return Interpolation.ValueAt(time, (float)StartValue, (float)EndValue, StartTime, EndTime, Easing);
-                }
-            }
-
-            public override void Apply(Drawable d) => ((PercentageCounter)d).DisplayedCount = CurrentValue;
-            public override void ReadIntoStartValue(Drawable d) => StartValue = ((PercentageCounter)d).DisplayedCount;
-        }
     }
 }
diff --git a/osu.Game/Graphics/UserInterface/RollingCounter.cs b/osu.Game/Graphics/UserInterface/RollingCounter.cs
index 2afa4da058..ac4e877ae1 100644
--- a/osu.Game/Graphics/UserInterface/RollingCounter.cs
+++ b/osu.Game/Graphics/UserInterface/RollingCounter.cs
@@ -11,6 +11,7 @@ using System;
 using System.Collections.Generic;
 using System.Diagnostics;
 using OpenTK.Graphics;
+using osu.Framework.MathUtils;
 
 namespace osu.Game.Graphics.UserInterface
 {
@@ -22,14 +23,6 @@ namespace osu.Game.Graphics.UserInterface
         /// </summary>
         public Bindable<T> Current = new Bindable<T>();
 
-        /// <summary>
-        /// Type of the Transform to use.
-        /// </summary>
-        /// <remarks>
-        /// Must be a subclass of Transform(T)
-        /// </remarks>
-        protected virtual Type TransformType => typeof(Transform<T, Drawable>);
-
         protected SpriteText DisplayedCountSpriteText;
 
         /// <summary>
@@ -59,7 +52,8 @@ namespace osu.Game.Graphics.UserInterface
             {
                 return displayedCount;
             }
-            protected set
+
+            set
             {
                 if (EqualityComparer<T>.Default.Equals(displayedCount, value))
                     return;
@@ -134,7 +128,7 @@ namespace osu.Game.Graphics.UserInterface
         /// </summary>
         public virtual void StopRolling()
         {
-            Flush(false, TransformType);
+            Flush(false, typeof(TransformRollingCounter));
             DisplayedCount = Current;
         }
 
@@ -181,25 +175,43 @@ namespace osu.Game.Graphics.UserInterface
         /// <seealso cref="TransformType"/>
         protected virtual void TransformCount(T currentValue, T newValue)
         {
-            Debug.Assert(
-                typeof(Transform<T, Drawable>).IsAssignableFrom(TransformType),
-                @"transformType should be a subclass of Transform<T>."
-            );
-
-            TransformCount((Transform<T, Drawable>)Activator.CreateInstance(TransformType), currentValue, newValue);
+            TransformCount(new TransformRollingCounter(this), currentValue, newValue);
         }
 
         /// <summary>
         /// Intended to be used by TransformCount(T currentValue, T newValue).
         /// </summary>
-        protected void TransformCount(Transform<T, Drawable> transform, T currentValue, T newValue)
+        protected void TransformCount(TransformRollingCounter transform, T currentValue, T newValue)
         {
             double rollingTotalDuration =
                 IsRollingProportional
                     ? GetProportionalDuration(currentValue, newValue)
                     : RollingDuration;
 
-            TransformTo(newValue, rollingTotalDuration, RollingEasing, transform);
+            this.TransformTo(newValue, rollingTotalDuration, RollingEasing, transform);
+        }
+
+        protected class TransformRollingCounter : Transform<T, RollingCounter<T>>
+        {
+            public TransformRollingCounter(RollingCounter<T> target) : base(target)
+            {
+            }
+
+            public T CurrentValue
+            {
+                get
+                {
+                    double time = Time?.Current ?? 0;
+                    if (time < StartTime) return StartValue;
+                    if (time >= EndTime) return EndValue;
+
+                    double result = Interpolation.ValueAt(time, Convert.ToDouble(StartValue), Convert.ToDouble(EndValue), StartTime, EndTime, Easing);
+                    return (T)Convert.ChangeType(result, typeof(T), null);
+                }
+            }
+
+            public override void Apply(RollingCounter<T> d) => d.DisplayedCount = CurrentValue;
+            public override void ReadIntoStartValue(RollingCounter<T> d) => StartValue = d.DisplayedCount;
         }
     }
 }
diff --git a/osu.Game/Graphics/UserInterface/ScoreCounter.cs b/osu.Game/Graphics/UserInterface/ScoreCounter.cs
index 6fe43e1fcc..604185d930 100644
--- a/osu.Game/Graphics/UserInterface/ScoreCounter.cs
+++ b/osu.Game/Graphics/UserInterface/ScoreCounter.cs
@@ -10,8 +10,6 @@ namespace osu.Game.Graphics.UserInterface
 {
     public class ScoreCounter : RollingCounter<double>
     {
-        protected override Type TransformType => typeof(TransformScore);
-
         protected override double RollingDuration => 1000;
         protected override EasingTypes RollingEasing => EasingTypes.Out;
 
@@ -55,23 +53,5 @@ namespace osu.Game.Graphics.UserInterface
         {
             Current.Value = Current + amount;
         }
-
-        protected class TransformScore : Transform<double, Drawable>
-        {
-            public virtual double CurrentValue
-            {
-                get
-                {
-                    double time = Time?.Current ?? 0;
-                    if (time < StartTime) return StartValue;
-                    if (time >= EndTime) return EndValue;
-
-                    return Interpolation.ValueAt(time, (float)StartValue, (float)EndValue, StartTime, EndTime, Easing);
-                }
-            }
-
-            public override void Apply(Drawable d) => ((ScoreCounter)d).DisplayedCount = CurrentValue;
-            public override void ReadIntoStartValue(Drawable d) => StartValue = ((ScoreCounter)d).DisplayedCount;
-        }
     }
 }
diff --git a/osu.Game/Graphics/UserInterface/SimpleComboCounter.cs b/osu.Game/Graphics/UserInterface/SimpleComboCounter.cs
index 7664eeee40..16ba8c6d76 100644
--- a/osu.Game/Graphics/UserInterface/SimpleComboCounter.cs
+++ b/osu.Game/Graphics/UserInterface/SimpleComboCounter.cs
@@ -13,8 +13,6 @@ namespace osu.Game.Graphics.UserInterface
     /// </summary>
     public class SimpleComboCounter : RollingCounter<int>
     {
-        protected override Type TransformType => typeof(TransformCounterCount);
-
         protected override double RollingDuration => 750;
 
         public SimpleComboCounter()
@@ -36,23 +34,5 @@ namespace osu.Game.Graphics.UserInterface
         {
             Current.Value = Current + amount;
         }
-
-        private class TransformCounterCount : Transform<int, Drawable>
-        {
-            public int CurrentValue
-            {
-                get
-                {
-                    double time = Time?.Current ?? 0;
-                    if (time < StartTime) return StartValue;
-                    if (time >= EndTime) return EndValue;
-
-                    return (int)Interpolation.ValueAt(time, StartValue, EndValue, StartTime, EndTime, Easing);
-                }
-            }
-
-            public override void Apply(Drawable d) => ((SimpleComboCounter)d).DisplayedCount = CurrentValue;
-            public override void ReadIntoStartValue(Drawable d) => StartValue = ((SimpleComboCounter)d).DisplayedCount;
-        }
     }
 }
\ No newline at end of file
diff --git a/osu.Game/Screens/Play/HUD/ComboResultCounter.cs b/osu.Game/Screens/Play/HUD/ComboResultCounter.cs
index c280702390..e658658306 100644
--- a/osu.Game/Screens/Play/HUD/ComboResultCounter.cs
+++ b/osu.Game/Screens/Play/HUD/ComboResultCounter.cs
@@ -12,44 +12,24 @@ namespace osu.Game.Screens.Play.HUD
     /// <summary>
     /// Used to display combo with a roll-up animation in results screen.
     /// </summary>
-    public class ComboResultCounter : RollingCounter<ulong>
+    public class ComboResultCounter : RollingCounter<long>
     {
-        protected override Type TransformType => typeof(TransformComboResult);
-
         protected override double RollingDuration => 500;
         protected override EasingTypes RollingEasing => EasingTypes.Out;
 
-        protected override double GetProportionalDuration(ulong currentValue, ulong newValue)
+        protected override double GetProportionalDuration(long currentValue, long newValue)
         {
             return currentValue > newValue ? currentValue - newValue : newValue - currentValue;
         }
 
-        protected override string FormatCount(ulong count)
+        protected override string FormatCount(long count)
         {
             return $@"{count}x";
         }
 
-        public override void Increment(ulong amount)
+        public override void Increment(long amount)
         {
             Current.Value = Current + amount;
         }
-
-        protected class TransformComboResult : Transform<ulong, Drawable>
-        {
-            public virtual ulong CurrentValue
-            {
-                get
-                {
-                    double time = Time?.Current ?? 0;
-                    if (time < StartTime) return StartValue;
-                    if (time >= EndTime) return EndValue;
-
-                    return (ulong)Interpolation.ValueAt(time, StartValue, EndValue, StartTime, EndTime, Easing);
-                }
-            }
-
-            public override void Apply(Drawable d) => ((ComboResultCounter)d).DisplayedCount = CurrentValue;
-            public override void ReadIntoStartValue(Drawable d) => StartValue = ((ComboResultCounter)d).DisplayedCount;
-        }
     }
 }

From a5e610a7baf8a9b7f91d8092b2fd5c54bfa59c2f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Fri, 14 Jul 2017 19:18:12 +0300
Subject: [PATCH 03/30] Update framework and fix compilation

Most issues were related to BeginLoopedSequence usage and lack of
"this." in front of transform helpers.
---
 osu-framework                                 |  2 +-
 .../Tests/TestCaseBeatSyncedContainer.cs      |  1 +
 .../Tests/TestCaseContextMenu.cs              | 30 ++++++++-----------
 .../Tests/TestCaseKeyCounter.cs               |  1 +
 .../Tests/TestCaseScrollingHitObjects.cs      |  3 +-
 .../Tests/TestCaseTaikoPlayfield.cs           |  1 +
 osu.Desktop/Overlays/VersionManager.cs        |  2 +-
 osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs  | 19 ++++--------
 .../Objects/Drawables/DrawableHitCircle.cs    |  8 ++---
 .../Objects/Drawables/DrawableOsuHitObject.cs |  3 +-
 .../Objects/Drawables/DrawableSlider.cs       |  2 +-
 .../Objects/Drawables/DrawableSliderTick.cs   | 18 +++++------
 .../Objects/Drawables/DrawableSpinner.cs      |  6 ++--
 .../Objects/Drawables/Pieces/SliderBouncer.cs |  3 +-
 .../Objects/Drawables/Pieces/SpinnerDisc.cs   |  2 +-
 .../Objects/Drawables/DrawableBarLine.cs      |  4 +--
 .../Objects/Drawables/DrawableHit.cs          | 10 +++----
 .../Objects/Drawables/DrawableSwell.cs        |  2 +-
 .../UI/DrawableTaikoJudgement.cs              |  3 +-
 osu.Game.Rulesets.Taiko/UI/HitExplosion.cs    |  6 ++--
 .../UI/KiaiHitExplosion.cs                    |  4 +--
 osu.Game/Beatmaps/Drawables/Panel.cs          |  4 +--
 .../Graphics/Cursor/OsuTooltipContainer.cs    |  6 ++--
 osu.Game/Graphics/IHasAccentColour.cs         |  8 ++---
 .../Graphics/Transforms/TransformAccent.cs    | 11 ++++---
 .../UserInterface/BreadcrumbControl.cs        |  8 ++---
 .../UserInterface/LoadingAnimation.cs         |  7 ++---
 osu.Game/Graphics/UserInterface/Nub.cs        |  6 ++--
 .../Graphics/UserInterface/OsuContextMenu.cs  |  6 ++--
 osu.Game/Graphics/UserInterface/OsuMenu.cs    |  6 ++--
 .../UserInterface/PercentageCounter.cs        |  3 --
 .../Graphics/UserInterface/RollingCounter.cs  |  1 -
 .../Graphics/UserInterface/ScoreCounter.cs    |  3 --
 .../UserInterface/SimpleComboCounter.cs       |  3 --
 .../Graphics/UserInterface/TwoLayerButton.cs  |  4 +--
 .../UserInterface/Volume/VolumeControl.cs     |  4 +--
 osu.Game/Overlays/Chat/ChannelListItem.cs     |  6 ++--
 osu.Game/Overlays/Chat/ChannelSection.cs      |  2 +-
 .../Overlays/Chat/ChannelSelectionOverlay.cs  | 10 +++----
 osu.Game/Overlays/Chat/ChatTabControl.cs      |  4 +--
 osu.Game/Overlays/ChatOverlay.cs              |  8 ++---
 osu.Game/Overlays/DialogOverlay.cs            |  4 +--
 osu.Game/Overlays/Direct/DirectGridPanel.cs   |  2 +-
 osu.Game/Overlays/Direct/DirectListPanel.cs   |  2 +-
 osu.Game/Overlays/DragBar.cs                  |  6 +++-
 osu.Game/Overlays/LoginOverlay.cs             |  4 +--
 osu.Game/Overlays/MedalOverlay.cs             | 15 ++++------
 .../Overlays/MedalSplash/DrawableMedal.cs     |  8 ++---
 osu.Game/Overlays/Music/PlaylistItem.cs       |  2 +-
 osu.Game/Overlays/Music/PlaylistOverlay.cs    |  8 ++---
 osu.Game/Overlays/MusicController.cs          |  4 +--
 osu.Game/Overlays/NotificationManager.cs      |  8 ++---
 .../Overlays/Notifications/Notification.cs    | 17 +++++------
 .../Notifications/ProgressNotification.cs     |  4 +--
 osu.Game/Overlays/Settings/SettingsItem.cs    |  2 +-
 osu.Game/Overlays/Settings/SettingsSection.cs |  2 +-
 .../Overlays/Settings/SettingsSubsection.cs   |  2 +-
 osu.Game/Overlays/Settings/Sidebar.cs         |  4 +--
 osu.Game/Overlays/SettingsOverlay.cs          |  4 +--
 osu.Game/Overlays/Toolbar/Toolbar.cs          |  8 ++---
 .../Overlays/Toolbar/ToolbarModeSelector.cs   |  2 +-
 osu.Game/Overlays/WaveOverlayContainer.cs     | 12 ++++----
 .../Rulesets/Judgements/DrawableJudgement.cs  | 18 +++++------
 osu.Game/Screens/Edit/Editor.cs               |  1 +
 osu.Game/Screens/Menu/Button.cs               |  8 ++---
 osu.Game/Screens/Multiplayer/Match.cs         |  1 +
 osu.Game/Screens/Play/HUD/ComboCounter.cs     | 21 ++++---------
 .../Screens/Play/HUD/ComboResultCounter.cs    |  3 --
 .../Screens/Play/HUD/StandardComboCounter.cs  |  1 +
 osu.Game/Screens/Play/KeyCounterCollection.cs |  2 +-
 osu.Game/Screens/Play/MenuOverlay.cs          |  4 +--
 osu.Game/Screens/Play/PlayerLoader.cs         |  2 +-
 osu.Game/Screens/Play/SkipButton.cs           |  8 ++---
 osu.Game/Screens/Play/SongProgress.cs         |  6 ++--
 osu.Game/Screens/Select/BeatmapInfoWedge.cs   | 10 +++----
 .../Select/Leaderboards/LeaderboardScore.cs   |  2 +-
 .../Select/Options/BeatmapOptionsOverlay.cs   |  4 +--
 .../Tournament/ScrollingTeamContainer.cs      | 12 +++++---
 osu.Game/Users/UserPanel.cs                   |  4 +--
 79 files changed, 220 insertions(+), 247 deletions(-)

diff --git a/osu-framework b/osu-framework
index 991177da4f..cb2c9dd8b6 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 991177da4fbed2dd8260c215f2d341ebc858b03e
+Subproject commit cb2c9dd8b6213cd8f91cc37892da6335ca3bce10
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs b/osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs
index 909ee9b134..8b682d14ce 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs
@@ -15,6 +15,7 @@ using osu.Game.Graphics.Sprites;
 using osu.Framework.Lists;
 using System;
 using osu.Framework.Extensions.Color4Extensions;
+using osu.Framework.Graphics.Transforms;
 
 namespace osu.Desktop.VisualTests.Tests
 {
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs b/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
index f9dc424153..cfb618e5d1 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
@@ -7,6 +7,7 @@ using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Cursor;
 using osu.Framework.Graphics.Shapes;
+using osu.Framework.Graphics.Transforms;
 using osu.Framework.Graphics.UserInterface;
 using osu.Framework.Testing;
 using osu.Game.Graphics.UserInterface;
@@ -59,20 +60,13 @@ namespace osu.Desktop.VisualTests.Tests
         {
             base.LoadComplete();
 
-            using (container.BeginLoopedSequence())
-            {
-                container.MoveTo(new Vector2(0, 100), duration);
-                using (container.BeginDelayedSequence(duration))
-                {
-                    container.MoveTo(new Vector2(100, 100), duration);
-                    using (container.BeginDelayedSequence(duration))
-                    {
-                        container.MoveTo(new Vector2(100, 0), duration);
-                        using (container.BeginDelayedSequence(duration))
-                            container.MoveTo(Vector2.Zero, duration);
-                    }
-                }
-            }
+            // Move box along a square trajectory
+            container.Loop(b => b
+                .MoveTo(new Vector2(0, 100), duration)
+                .Then().MoveTo(new Vector2(100, 100), duration)
+                .Then().MoveTo(new Vector2(100, 0), duration)
+                .Then().MoveTo(Vector2.Zero, duration)
+            );
         }
 
         private class MyContextMenuContainer : Container, IHasContextMenu
@@ -95,10 +89,10 @@ namespace osu.Desktop.VisualTests.Tests
             {
                 new OsuContextMenuItem(@"Simple option"),
                 new OsuContextMenuItem(@"Simple very very long option"),
-                new OsuContextMenuItem(@"Change width", MenuItemType.Highlighted) { Action = () => ResizeWidthTo(Width * 2, 100, EasingTypes.OutQuint) },
-                new OsuContextMenuItem(@"Change height", MenuItemType.Highlighted) { Action = () => ResizeHeightTo(Height * 2, 100, EasingTypes.OutQuint) },
-                new OsuContextMenuItem(@"Change width back", MenuItemType.Destructive) { Action = () => ResizeWidthTo(Width / 2, 100, EasingTypes.OutQuint) },
-                new OsuContextMenuItem(@"Change height back", MenuItemType.Destructive) { Action = () => ResizeHeightTo(Height / 2, 100, EasingTypes.OutQuint) },
+                new OsuContextMenuItem(@"Change width", MenuItemType.Highlighted) { Action = () => this.ResizeWidthTo(Width * 2, 100, EasingTypes.OutQuint) },
+                new OsuContextMenuItem(@"Change height", MenuItemType.Highlighted) { Action = () => this.ResizeHeightTo(Height * 2, 100, EasingTypes.OutQuint) },
+                new OsuContextMenuItem(@"Change width back", MenuItemType.Destructive) { Action = () => this.ResizeWidthTo(Width / 2, 100, EasingTypes.OutQuint) },
+                new OsuContextMenuItem(@"Change height back", MenuItemType.Destructive) { Action = () => this.ResizeHeightTo(Height / 2, 100, EasingTypes.OutQuint) },
             };
         }
     }
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseKeyCounter.cs b/osu.Desktop.VisualTests/Tests/TestCaseKeyCounter.cs
index 87a40a76ca..7a4584d4f8 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseKeyCounter.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseKeyCounter.cs
@@ -13,6 +13,7 @@ using osu.Framework.MathUtils;
 using osu.Framework.Graphics.Shapes;
 using osu.Framework.Graphics.Sprites;
 using osu.Game.Screens.Play;
+using osu.Framework.Graphics.Transforms;
 
 namespace osu.Desktop.VisualTests.Tests
 {
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseScrollingHitObjects.cs b/osu.Desktop.VisualTests/Tests/TestCaseScrollingHitObjects.cs
index 8e5cf8687c..33b7399343 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseScrollingHitObjects.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseScrollingHitObjects.cs
@@ -8,6 +8,7 @@ using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Shapes;
 using osu.Framework.Graphics.Sprites;
+using osu.Framework.Graphics.Transforms;
 using osu.Framework.Graphics.UserInterface;
 using osu.Framework.Testing;
 using osu.Game.Graphics.Sprites;
@@ -196,7 +197,7 @@ namespace osu.Desktop.VisualTests.Tests
             protected override void LoadComplete()
             {
                 base.LoadComplete();
-                FadeInFromZero(250, EasingTypes.OutQuint);
+                this.FadeInFromZero(250, EasingTypes.OutQuint);
             }
 
             protected override void Update()
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs b/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
index 00929c06c2..4fd27220bc 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
@@ -4,6 +4,7 @@
 using OpenTK;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Transforms;
 using osu.Framework.MathUtils;
 using osu.Framework.Testing;
 using osu.Framework.Timing;
diff --git a/osu.Desktop/Overlays/VersionManager.cs b/osu.Desktop/Overlays/VersionManager.cs
index a8ab97ce37..5b79ecfaf1 100644
--- a/osu.Desktop/Overlays/VersionManager.cs
+++ b/osu.Desktop/Overlays/VersionManager.cs
@@ -175,7 +175,7 @@ namespace osu.Desktop.Overlays
 
         protected override void PopIn()
         {
-            FadeIn(1000);
+            this.FadeIn(1000);
         }
 
         protected override void PopOut()
diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
index 3feb448752..133e1ba861 100644
--- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
+++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
@@ -17,7 +17,6 @@ using System.Collections.Generic;
 using osu.Game.Rulesets.Objects.Drawables;
 using osu.Framework.Input;
 using osu.Framework.Graphics.Transforms;
-using osu.Framework.MathUtils;
 using osu.Game.Rulesets.Mania.Objects.Drawables;
 using osu.Game.Rulesets.Timing;
 using osu.Framework.Configuration;
@@ -235,7 +234,7 @@ namespace osu.Game.Rulesets.Mania.UI
 
         private void transformVisibleTimeRangeTo(double newTimeRange, double duration = 0, EasingTypes easing = EasingTypes.None)
         {
-            TransformTo(newTimeRange, duration, easing, new TransformTimeSpan());
+            this.TransformTo(newTimeRange, duration, easing, new TransformTimeSpan(this));
         }
 
         protected override void Update()
@@ -245,22 +244,14 @@ namespace osu.Game.Rulesets.Mania.UI
             barLineContainer.Width = columns.Width;
         }
 
-        private class TransformTimeSpan : Transform<double, Drawable>
+        private class TransformTimeSpan : TransformDouble<ManiaPlayfield>
         {
-            public double CurrentValue
+            public TransformTimeSpan(ManiaPlayfield target) : base(target)
             {
-                get
-                {
-                    double time = Time?.Current ?? 0;
-                    if (time < StartTime) return StartValue;
-                    if (time >= EndTime) return EndValue;
-
-                    return Interpolation.ValueAt(time, StartValue, EndValue, StartTime, EndTime, Easing);
-                }
             }
 
-            public override void Apply(Drawable d) => ((ManiaPlayfield)d).visibleTimeRange.Value = (float)CurrentValue;
-            public override void ReadIntoStartValue(Drawable d) => StartValue = ((ManiaPlayfield)d).visibleTimeRange.Value;
+            public override void Apply(ManiaPlayfield d) => d.visibleTimeRange.Value = CurrentValue;
+            public override void ReadIntoStartValue(ManiaPlayfield d) => StartValue = d.visibleTimeRange.Value;
         }
     }
 }
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
index 75b2dc0a32..947af733ec 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
@@ -119,12 +119,12 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             {
                 case ArmedState.Idle:
                     using (BeginDelayedSequence(duration + TIME_PREEMPT))
-                        FadeOut(TIME_FADEOUT);
+                        this.FadeOut(TIME_FADEOUT);
                     Expire(true);
                     break;
                 case ArmedState.Miss:
                     ApproachCircle.FadeOut(50);
-                    FadeOut(TIME_FADEOUT / 5);
+                    this.FadeOut(TIME_FADEOUT / 5);
                     Expire();
                     break;
                 case ArmedState.Hit:
@@ -145,8 +145,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
                         circle.FadeOut();
                         number.FadeOut();
 
-                        FadeOut(800);
-                        ScaleTo(Scale * 1.5f, 400, EasingTypes.OutQuad);
+                        this.FadeOut(800);
+                        this.ScaleTo(Scale * 1.5f, 400, EasingTypes.OutQuad);
                     }
 
                     Expire();
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
index 2711ec1a62..e09b6bd997 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
@@ -4,6 +4,7 @@
 using System.ComponentModel;
 using osu.Game.Rulesets.Objects.Drawables;
 using osu.Game.Rulesets.Osu.Judgements;
+using osu.Framework.Graphics;
 
 namespace osu.Game.Rulesets.Osu.Objects.Drawables
 {
@@ -44,7 +45,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
 
         protected virtual void UpdatePreemptState()
         {
-            FadeIn(TIME_FADEIN);
+            this.FadeIn(TIME_FADEIN);
         }
 
         protected virtual void UpdateCurrentState(ArmedState state)
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
index c6c009e8f2..c3c7d8862f 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
@@ -163,7 +163,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             body.FadeOut(160);
             ball.FadeOut(160);
 
-            FadeOut(800);
+            this.FadeOut(800);
 
             Expire();
         }
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
index 28fbf46a92..6ced16930b 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
@@ -62,12 +62,12 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
         {
             var animIn = Math.Min(150, sliderTick.StartTime - FadeInTime);
 
-            ScaleTo(0.5f);
-            ScaleTo(1.2f, animIn);
-            FadeIn(animIn);
+            this.ScaleTo(0.5f);
+            this.ScaleTo(1.2f, animIn);
+            this.FadeIn(animIn);
 
             Delay(animIn);
-            ScaleTo(1, 150, EasingTypes.Out);
+            this.ScaleTo(1, 150, EasingTypes.Out);
 
             Delay(-animIn);
         }
@@ -78,15 +78,15 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             {
                 case ArmedState.Idle:
                     Delay(FadeOutTime - sliderTick.StartTime);
-                    FadeOut();
+                    this.FadeOut();
                     break;
                 case ArmedState.Miss:
-                    FadeOut(160);
-                    FadeColour(Color4.Red, 80);
+                    this.FadeOut(160);
+                    this.FadeColour(Color4.Red, 80);
                     break;
                 case ArmedState.Hit:
-                    FadeOut(120, EasingTypes.OutQuint);
-                    ScaleTo(Scale * 1.5f, 120, EasingTypes.OutQuint);
+                    this.FadeOut(120, EasingTypes.OutQuint);
+                    this.ScaleTo(Scale * 1.5f, 120, EasingTypes.OutQuint);
                     break;
             }
         }
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index 840acb8221..0ac790c520 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -200,16 +200,16 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
         {
             Delay(spinner.Duration, true);
 
-            FadeOut(160);
+            this.FadeOut(160);
 
             switch (state)
             {
                 case ArmedState.Hit:
-                    ScaleTo(Scale * 1.2f, 320, EasingTypes.Out);
+                    this.ScaleTo(Scale * 1.2f, 320, EasingTypes.Out);
                     Expire();
                     break;
                 case ArmedState.Miss:
-                    ScaleTo(Scale * 0.8f, 320, EasingTypes.In);
+                    this.ScaleTo(Scale * 0.8f, 320, EasingTypes.In);
                     Expire();
                     break;
             }
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBouncer.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBouncer.cs
index a34ff30a43..a15812054f 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBouncer.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBouncer.cs
@@ -37,8 +37,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
         protected override void LoadComplete()
         {
             base.LoadComplete();
-            using (icon.BeginLoopedSequence())
-                icon.RotateTo(360, 1000);
+            icon.Spin(1000);
         }
 
         public void UpdateProgress(double progress, int repeat)
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
index f3ddf683d2..a30b03fa63 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
@@ -133,7 +133,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
                 background.FadeTo(tracking_alpha, 250, EasingTypes.OutQuint);
             }
 
-            RotateTo(currentRotation / 2, validAndTracking ? 500 : 1500, EasingTypes.OutExpo);
+            this.RotateTo(currentRotation / 2, validAndTracking ? 500 : 1500, EasingTypes.OutExpo);
         }
     }
 }
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs
index 5d627f2b50..841964b743 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs
@@ -65,10 +65,10 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
         {
             base.LoadComplete();
             Delay(BarLine.StartTime - Time.Current);
-            FadeOut(base_fadeout_time * BarLine.ScrollTime / 1000);
+            this.FadeOut(base_fadeout_time * BarLine.ScrollTime / 1000);
         }
 
-        private void updateScrollPosition(double time) => MoveToX((float)((BarLine.StartTime - time) / BarLine.ScrollTime));
+        private void updateScrollPosition(double time) => this.MoveToX((float)((BarLine.StartTime - time) / BarLine.ScrollTime));
 
         protected override void Update()
         {
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
index a4a46e3b48..53518a28de 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
@@ -77,10 +77,10 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
                     Delay(HitObject.HitWindowMiss);
                     break;
                 case ArmedState.Miss:
-                    FadeOut(100);
+                    this.FadeOut(100);
                     break;
                 case ArmedState.Hit:
-                    FadeOut(600);
+                    this.FadeOut(600);
 
                     var flash = circlePiece?.FlashBox;
                     if (flash != null)
@@ -90,16 +90,16 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
                     }
 
 
-                    FadeOut(800);
+                    this.FadeOut(800);
 
                     const float gravity_time = 300;
                     const float gravity_travel_height = 200;
 
                     Content.ScaleTo(0.8f, gravity_time * 2, EasingTypes.OutQuad);
 
-                    MoveToY(-gravity_travel_height, gravity_time, EasingTypes.Out);
+                    this.MoveToY(-gravity_travel_height, gravity_time, EasingTypes.Out);
                     Delay(gravity_time, true);
-                    MoveToY(gravity_travel_height * 2, gravity_time * 2, EasingTypes.In);
+                    this.MoveToY(gravity_travel_height * 2, gravity_time * 2, EasingTypes.In);
                     break;
             }
 
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
index 1c72f2a7dd..43f6bc930c 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
@@ -198,7 +198,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
                     break;
             }
 
-            FadeOut(out_transition_time, EasingTypes.Out);
+            this.FadeOut(out_transition_time, EasingTypes.Out);
 
             Expire();
         }
diff --git a/osu.Game.Rulesets.Taiko/UI/DrawableTaikoJudgement.cs b/osu.Game.Rulesets.Taiko/UI/DrawableTaikoJudgement.cs
index 08fd8dbecc..779471b8dc 100644
--- a/osu.Game.Rulesets.Taiko/UI/DrawableTaikoJudgement.cs
+++ b/osu.Game.Rulesets.Taiko/UI/DrawableTaikoJudgement.cs
@@ -6,6 +6,7 @@ using osu.Game.Rulesets.Objects.Drawables;
 using osu.Framework.Allocation;
 using osu.Game.Graphics;
 using osu.Game.Rulesets.Judgements;
+using osu.Framework.Graphics;
 
 namespace osu.Game.Rulesets.Taiko.UI
 {
@@ -47,7 +48,7 @@ namespace osu.Game.Rulesets.Taiko.UI
             switch (Judgement.Result)
             {
                 case HitResult.Hit:
-                    MoveToY(-100, 500);
+                    this.MoveToY(-100, 500);
                     break;
             }
 
diff --git a/osu.Game.Rulesets.Taiko/UI/HitExplosion.cs b/osu.Game.Rulesets.Taiko/UI/HitExplosion.cs
index 4d39ba0ead..8766f7b9f5 100644
--- a/osu.Game.Rulesets.Taiko/UI/HitExplosion.cs
+++ b/osu.Game.Rulesets.Taiko/UI/HitExplosion.cs
@@ -62,8 +62,8 @@ namespace osu.Game.Rulesets.Taiko.UI
         {
             base.LoadComplete();
 
-            ScaleTo(3f, 1000, EasingTypes.OutQuint);
-            FadeOut(500);
+            this.ScaleTo(3f, 1000, EasingTypes.OutQuint);
+            this.FadeOut(500);
 
             Expire();
         }
@@ -73,7 +73,7 @@ namespace osu.Game.Rulesets.Taiko.UI
         /// </summary>
         public void VisualiseSecondHit()
         {
-            ResizeTo(new Vector2(TaikoPlayfield.HIT_TARGET_OFFSET + TaikoHitObject.DEFAULT_STRONG_CIRCLE_DIAMETER), 50);
+            this.ResizeTo(new Vector2(TaikoPlayfield.HIT_TARGET_OFFSET + TaikoHitObject.DEFAULT_STRONG_CIRCLE_DIAMETER), 50);
         }
     }
 }
diff --git a/osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs b/osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs
index b4aec7057b..346f435e5d 100644
--- a/osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs
+++ b/osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs
@@ -59,8 +59,8 @@ namespace osu.Game.Rulesets.Taiko.UI
         {
             base.LoadComplete();
 
-            ScaleTo(new Vector2(1, 3f), 500, EasingTypes.OutQuint);
-            FadeOut(250);
+            this.ScaleTo(new Vector2(1, 3f), 500, EasingTypes.OutQuint);
+            this.FadeOut(250);
 
             Expire();
         }
diff --git a/osu.Game/Beatmaps/Drawables/Panel.cs b/osu.Game/Beatmaps/Drawables/Panel.cs
index 3dac50732c..10eeba53e0 100644
--- a/osu.Game/Beatmaps/Drawables/Panel.cs
+++ b/osu.Game/Beatmaps/Drawables/Panel.cs
@@ -64,9 +64,9 @@ namespace osu.Game.Beatmaps.Drawables
             }
 
             if (state == PanelSelectedState.Hidden)
-                FadeOut(300, EasingTypes.OutQuint);
+                this.FadeOut(300, EasingTypes.OutQuint);
             else
-                FadeIn(250);
+                this.FadeIn(250);
         }
 
         private PanelSelectedState state = PanelSelectedState.NotSelected;
diff --git a/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs b/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs
index 7608a366dc..5ce836bbe5 100644
--- a/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs
+++ b/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs
@@ -83,13 +83,13 @@ namespace osu.Game.Graphics.Cursor
             protected override void PopIn()
             {
                 instantMovement |= !IsPresent;
-                FadeIn(500, EasingTypes.OutQuint);
+                this.FadeIn(500, EasingTypes.OutQuint);
             }
 
             protected override void PopOut()
             {
                 using (BeginDelayedSequence(150))
-                    FadeOut(500, EasingTypes.OutQuint);
+                    this.FadeOut(500, EasingTypes.OutQuint);
             }
 
             public override void Move(Vector2 pos)
@@ -101,7 +101,7 @@ namespace osu.Game.Graphics.Cursor
                 }
                 else
                 {
-                    MoveTo(pos, 200, EasingTypes.OutQuint);
+                    this.MoveTo(pos, 200, EasingTypes.OutQuint);
                 }
             }
         }
diff --git a/osu.Game/Graphics/IHasAccentColour.cs b/osu.Game/Graphics/IHasAccentColour.cs
index 9eb66d8fac..46f9ec4235 100644
--- a/osu.Game/Graphics/IHasAccentColour.cs
+++ b/osu.Game/Graphics/IHasAccentColour.cs
@@ -27,10 +27,8 @@ namespace osu.Game.Graphics
         /// <param name="newColour">The new accent colour.</param>
         /// <param name="duration">The tween duration.</param>
         /// <param name="easing">The tween easing.</param>
-        public static void FadeAccent<T>(this T accentedDrawable, Color4 newColour, double duration = 0, EasingTypes easing = EasingTypes.None)
-            where T : Transformable<Drawable>, IHasAccentColour
-        {
-            accentedDrawable.TransformTo(newColour, duration, easing, new TransformAccent());
-        }
+        public static TransformContinuation<T> FadeAccent<T>(this T accentedDrawable, Color4 newColour, double duration = 0, EasingTypes easing = EasingTypes.None)
+            where T : IHasAccentColour
+            => accentedDrawable.TransformTo(newColour, duration, easing, new TransformAccent(accentedDrawable));
     }
 }
diff --git a/osu.Game/Graphics/Transforms/TransformAccent.cs b/osu.Game/Graphics/Transforms/TransformAccent.cs
index 53a452ad8a..e609649fd0 100644
--- a/osu.Game/Graphics/Transforms/TransformAccent.cs
+++ b/osu.Game/Graphics/Transforms/TransformAccent.cs
@@ -2,14 +2,17 @@
 // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
 
 using OpenTK.Graphics;
-using osu.Framework.Graphics;
 using osu.Framework.Graphics.Transforms;
 using osu.Framework.MathUtils;
 
 namespace osu.Game.Graphics.Transforms
 {
-    public class TransformAccent : Transform<Color4, Drawable>
+    public class TransformAccent : Transform<Color4, IHasAccentColour>
     {
+        public TransformAccent(IHasAccentColour target) : base(target)
+        {
+        }
+
         /// <summary>
         /// Current value of the transformed colour in linear colour space.
         /// </summary>
@@ -25,7 +28,7 @@ namespace osu.Game.Graphics.Transforms
             }
         }
 
-        public override void Apply(Drawable d) => ((IHasAccentColour)d).AccentColour = CurrentValue;
-        public override void ReadIntoStartValue(Drawable d) => StartValue = ((IHasAccentColour)d).AccentColour;
+        public override void Apply(IHasAccentColour d) => d.AccentColour = CurrentValue;
+        public override void ReadIntoStartValue(IHasAccentColour d) => StartValue = d.AccentColour;
     }
 }
diff --git a/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs b/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs
index 155b08fde8..e69f9e3f42 100644
--- a/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs
+++ b/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs
@@ -54,13 +54,13 @@ namespace osu.Game.Graphics.UserInterface
 
                     if (State == Visibility.Visible)
                     {
-                        FadeIn(transition_duration, EasingTypes.OutQuint);
-                        ScaleTo(new Vector2(1f), transition_duration, EasingTypes.OutQuint);
+                        this.FadeIn(transition_duration, EasingTypes.OutQuint);
+                        this.ScaleTo(new Vector2(1f), transition_duration, EasingTypes.OutQuint);
                     }
                     else
                     {
-                        FadeOut(transition_duration, EasingTypes.OutQuint);
-                        ScaleTo(new Vector2(0.8f, 1f), transition_duration, EasingTypes.OutQuint);
+                        this.FadeOut(transition_duration, EasingTypes.OutQuint);
+                        this.ScaleTo(new Vector2(0.8f, 1f), transition_duration, EasingTypes.OutQuint);
                     }
                 }
             }
diff --git a/osu.Game/Graphics/UserInterface/LoadingAnimation.cs b/osu.Game/Graphics/UserInterface/LoadingAnimation.cs
index eed5061abd..5e293eff03 100644
--- a/osu.Game/Graphics/UserInterface/LoadingAnimation.cs
+++ b/osu.Game/Graphics/UserInterface/LoadingAnimation.cs
@@ -34,14 +34,13 @@ namespace osu.Game.Graphics.UserInterface
         {
             base.LoadComplete();
 
-            using (spinner.BeginLoopedSequence())
-                spinner.RotateTo(360, 2000);
+            spinner.Spin(2000);
         }
 
         private const float transition_duration = 500;
 
-        protected override void PopIn() => FadeIn(transition_duration * 5, EasingTypes.OutQuint);
+        protected override void PopIn() => this.FadeIn(transition_duration * 5, EasingTypes.OutQuint);
 
-        protected override void PopOut() => FadeOut(transition_duration, EasingTypes.OutQuint);
+        protected override void PopOut() => this.FadeOut(transition_duration, EasingTypes.OutQuint);
     }
 }
diff --git a/osu.Game/Graphics/UserInterface/Nub.cs b/osu.Game/Graphics/UserInterface/Nub.cs
index d5059945c6..298badcb77 100644
--- a/osu.Game/Graphics/UserInterface/Nub.cs
+++ b/osu.Game/Graphics/UserInterface/Nub.cs
@@ -80,13 +80,13 @@ namespace osu.Game.Graphics.UserInterface
 
                 if (value)
                 {
-                    FadeColour(GlowingAccentColour, 500, EasingTypes.OutQuint);
+                    this.FadeColour(GlowingAccentColour, 500, EasingTypes.OutQuint);
                     FadeEdgeEffectTo(1, 500, EasingTypes.OutQuint);
                 }
                 else
                 {
                     FadeEdgeEffectTo(0, 500);
-                    FadeColour(AccentColour, 500);
+                    this.FadeColour(AccentColour, 500);
                 }
             }
         }
@@ -95,7 +95,7 @@ namespace osu.Game.Graphics.UserInterface
         {
             set
             {
-                ResizeTo(new Vector2(value ? EXPANDED_SIZE : COLLAPSED_SIZE, 12), 500, EasingTypes.OutQuint);
+                this.ResizeTo(new Vector2(value ? EXPANDED_SIZE : COLLAPSED_SIZE, 12), 500, EasingTypes.OutQuint);
             }
         }
 
diff --git a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs
index e17ce2a5b2..66c214f6a3 100644
--- a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs
+++ b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs
@@ -39,13 +39,13 @@ namespace osu.Game.Graphics.UserInterface
                 Background.Colour = colours.ContextMenuGray;
             }
 
-            protected override void AnimateOpen() => FadeIn(fade_duration, EasingTypes.OutQuint);
-            protected override void AnimateClose() => FadeOut(fade_duration, EasingTypes.OutQuint);
+            protected override void AnimateOpen() => this.FadeIn(fade_duration, EasingTypes.OutQuint);
+            protected override void AnimateClose() => this.FadeOut(fade_duration, EasingTypes.OutQuint);
 
             protected override void UpdateContentHeight()
             {
                 var actualHeight = (RelativeSizeAxes & Axes.Y) > 0 ? 1 : ContentHeight;
-                ResizeTo(new Vector2(1, State == MenuState.Opened ? actualHeight : 0), 300, EasingTypes.OutQuint);
+                this.ResizeTo(new Vector2(1, State == MenuState.Opened ? actualHeight : 0), 300, EasingTypes.OutQuint);
             }
         }
     }
diff --git a/osu.Game/Graphics/UserInterface/OsuMenu.cs b/osu.Game/Graphics/UserInterface/OsuMenu.cs
index 84b88da96e..2bcf0a467c 100644
--- a/osu.Game/Graphics/UserInterface/OsuMenu.cs
+++ b/osu.Game/Graphics/UserInterface/OsuMenu.cs
@@ -19,14 +19,14 @@ namespace osu.Game.Graphics.UserInterface
             ItemsContainer.Padding = new MarginPadding(5);
         }
 
-        protected override void AnimateOpen() => FadeIn(300, EasingTypes.OutQuint);
+        protected override void AnimateOpen() => this.FadeIn(300, EasingTypes.OutQuint);
 
-        protected override void AnimateClose() => FadeOut(300, EasingTypes.OutQuint);
+        protected override void AnimateClose() => this.FadeOut(300, EasingTypes.OutQuint);
 
         protected override void UpdateContentHeight()
         {
             var actualHeight = (RelativeSizeAxes & Axes.Y) > 0 ? 1 : ContentHeight;
-            ResizeTo(new Vector2(1, State == MenuState.Opened ? actualHeight : 0), 300, EasingTypes.OutQuint);
+            this.ResizeTo(new Vector2(1, State == MenuState.Opened ? actualHeight : 0), 300, EasingTypes.OutQuint);
         }
     }
 }
diff --git a/osu.Game/Graphics/UserInterface/PercentageCounter.cs b/osu.Game/Graphics/UserInterface/PercentageCounter.cs
index 4065978de8..0a402f9045 100644
--- a/osu.Game/Graphics/UserInterface/PercentageCounter.cs
+++ b/osu.Game/Graphics/UserInterface/PercentageCounter.cs
@@ -1,9 +1,6 @@
 // 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.Transforms;
-using osu.Framework.MathUtils;
 using System;
 
 namespace osu.Game.Graphics.UserInterface
diff --git a/osu.Game/Graphics/UserInterface/RollingCounter.cs b/osu.Game/Graphics/UserInterface/RollingCounter.cs
index ac4e877ae1..47346ce440 100644
--- a/osu.Game/Graphics/UserInterface/RollingCounter.cs
+++ b/osu.Game/Graphics/UserInterface/RollingCounter.cs
@@ -9,7 +9,6 @@ using osu.Framework.Graphics.Transforms;
 using osu.Game.Graphics.Sprites;
 using System;
 using System.Collections.Generic;
-using System.Diagnostics;
 using OpenTK.Graphics;
 using osu.Framework.MathUtils;
 
diff --git a/osu.Game/Graphics/UserInterface/ScoreCounter.cs b/osu.Game/Graphics/UserInterface/ScoreCounter.cs
index 604185d930..a1fa48e3cd 100644
--- a/osu.Game/Graphics/UserInterface/ScoreCounter.cs
+++ b/osu.Game/Graphics/UserInterface/ScoreCounter.cs
@@ -2,9 +2,6 @@
 // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
 
 using osu.Framework.Graphics;
-using osu.Framework.Graphics.Transforms;
-using osu.Framework.MathUtils;
-using System;
 
 namespace osu.Game.Graphics.UserInterface
 {
diff --git a/osu.Game/Graphics/UserInterface/SimpleComboCounter.cs b/osu.Game/Graphics/UserInterface/SimpleComboCounter.cs
index 16ba8c6d76..211de72efc 100644
--- a/osu.Game/Graphics/UserInterface/SimpleComboCounter.cs
+++ b/osu.Game/Graphics/UserInterface/SimpleComboCounter.cs
@@ -2,9 +2,6 @@
 // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
 
 using System;
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Transforms;
-using osu.Framework.MathUtils;
 
 namespace osu.Game.Graphics.UserInterface
 {
diff --git a/osu.Game/Graphics/UserInterface/TwoLayerButton.cs b/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
index 7f2bbb8f9f..5713f5fe27 100644
--- a/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
+++ b/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
@@ -173,7 +173,7 @@ namespace osu.Game.Graphics.UserInterface
 
         protected override bool OnHover(InputState state)
         {
-            ResizeTo(SIZE_EXTENDED, transform_time, EasingTypes.OutElastic);
+            this.ResizeTo(SIZE_EXTENDED, transform_time, EasingTypes.OutElastic);
             IconLayer.FadeColour(HoverColour, transform_time, EasingTypes.OutElastic);
 
             bouncingIcon.ScaleTo(1.1f, transform_time, EasingTypes.OutElastic);
@@ -183,7 +183,7 @@ namespace osu.Game.Graphics.UserInterface
 
         protected override void OnHoverLost(InputState state)
         {
-            ResizeTo(SIZE_RETRACTED, transform_time, EasingTypes.OutElastic);
+            this.ResizeTo(SIZE_RETRACTED, transform_time, EasingTypes.OutElastic);
             IconLayer.FadeColour(TextLayer.Colour, transform_time, EasingTypes.OutElastic);
 
             bouncingIcon.ScaleTo(1, transform_time, EasingTypes.OutElastic);
diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs
index a758d5fdef..fd2a7742f8 100644
--- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs
+++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs
@@ -93,14 +93,14 @@ namespace osu.Game.Graphics.UserInterface.Volume
         protected override void PopIn()
         {
             ClearTransforms();
-            FadeIn(100);
+            this.FadeIn(100);
 
             schedulePopOut();
         }
 
         protected override void PopOut()
         {
-            FadeOut(100);
+            this.FadeOut(100);
         }
 
         private void schedulePopOut()
diff --git a/osu.Game/Overlays/Chat/ChannelListItem.cs b/osu.Game/Overlays/Chat/ChannelListItem.cs
index aca65bbc17..7b11ba2de0 100644
--- a/osu.Game/Overlays/Chat/ChannelListItem.cs
+++ b/osu.Game/Overlays/Chat/ChannelListItem.cs
@@ -39,7 +39,7 @@ namespace osu.Game.Overlays.Chat
         {
             set
             {
-                FadeTo(value ? 1f : 0f, 100);
+                this.FadeTo(value ? 1f : 0f, 100);
             }
         }
 
@@ -175,14 +175,14 @@ namespace osu.Game.Overlays.Chat
                 joinedCheckmark.FadeTo(1f, transition_duration);
                 topic.FadeTo(0.8f, transition_duration);
                 topic.FadeColour(Color4.White, transition_duration);
-                FadeColour(joinedColour, transition_duration);
+                this.FadeColour(joinedColour, transition_duration);
             }
             else
             {
                 joinedCheckmark.FadeTo(0f, transition_duration);
                 topic.FadeTo(1f, transition_duration);
                 topic.FadeColour(topicColour, transition_duration);
-                FadeColour(Color4.White, transition_duration);
+                this.FadeColour(Color4.White, transition_duration);
             }
         }
     }
diff --git a/osu.Game/Overlays/Chat/ChannelSection.cs b/osu.Game/Overlays/Chat/ChannelSection.cs
index cafb88b6ac..1f046aff2a 100644
--- a/osu.Game/Overlays/Chat/ChannelSection.cs
+++ b/osu.Game/Overlays/Chat/ChannelSection.cs
@@ -23,7 +23,7 @@ namespace osu.Game.Overlays.Chat
         {
             set
             {
-                FadeTo(value ? 1f : 0f, 100);
+                this.FadeTo(value ? 1f : 0f, 100);
             }
         }
 
diff --git a/osu.Game/Overlays/Chat/ChannelSelectionOverlay.cs b/osu.Game/Overlays/Chat/ChannelSelectionOverlay.cs
index 135f8f43b9..380275475b 100644
--- a/osu.Game/Overlays/Chat/ChannelSelectionOverlay.cs
+++ b/osu.Game/Overlays/Chat/ChannelSelectionOverlay.cs
@@ -158,10 +158,10 @@ namespace osu.Game.Overlays.Chat
 
         protected override void PopIn()
         {
-            if (Alpha == 0) MoveToY(DrawHeight);
+            if (Alpha == 0) this.MoveToY(DrawHeight);
 
-            FadeIn(transition_duration, EasingTypes.OutQuint);
-            MoveToY(0, transition_duration, EasingTypes.OutQuint);
+            this.FadeIn(transition_duration, EasingTypes.OutQuint);
+            this.MoveToY(0, transition_duration, EasingTypes.OutQuint);
 
             search.HoldFocus = true;
             base.PopIn();
@@ -169,8 +169,8 @@ namespace osu.Game.Overlays.Chat
 
         protected override void PopOut()
         {
-            FadeOut(transition_duration, EasingTypes.InSine);
-            MoveToY(DrawHeight, transition_duration, EasingTypes.InSine);
+            this.FadeOut(transition_duration, EasingTypes.InSine);
+            this.MoveToY(DrawHeight, transition_duration, EasingTypes.InSine);
 
             search.HoldFocus = false;
             base.PopOut();
diff --git a/osu.Game/Overlays/Chat/ChatTabControl.cs b/osu.Game/Overlays/Chat/ChatTabControl.cs
index 92147db57f..cb85bdb0c9 100644
--- a/osu.Game/Overlays/Chat/ChatTabControl.cs
+++ b/osu.Game/Overlays/Chat/ChatTabControl.cs
@@ -86,7 +86,7 @@ namespace osu.Game.Overlays.Chat
 
             private void fadeActive()
             {
-                ResizeTo(new Vector2(Width, 1.1f), transition_length, EasingTypes.OutQuint);
+                this.ResizeTo(new Vector2(Width, 1.1f), transition_length, EasingTypes.OutQuint);
 
                 box.FadeColour(backgroundActive, transition_length, EasingTypes.OutQuint);
                 highlightBox.FadeIn(transition_length, EasingTypes.OutQuint);
@@ -97,7 +97,7 @@ namespace osu.Game.Overlays.Chat
 
             private void fadeInactive()
             {
-                ResizeTo(new Vector2(Width, 1), transition_length, EasingTypes.OutQuint);
+                this.ResizeTo(new Vector2(Width, 1), transition_length, EasingTypes.OutQuint);
 
                 box.FadeColour(backgroundInactive, transition_length, EasingTypes.OutQuint);
                 highlightBox.FadeOut(transition_length, EasingTypes.OutQuint);
diff --git a/osu.Game/Overlays/ChatOverlay.cs b/osu.Game/Overlays/ChatOverlay.cs
index 700889ed26..a6bd8a47e6 100644
--- a/osu.Game/Overlays/ChatOverlay.cs
+++ b/osu.Game/Overlays/ChatOverlay.cs
@@ -235,8 +235,8 @@ namespace osu.Game.Overlays
 
         protected override void PopIn()
         {
-            MoveToY(0, transition_length, EasingTypes.OutQuint);
-            FadeIn(transition_length, EasingTypes.OutQuint);
+            this.MoveToY(0, transition_length, EasingTypes.OutQuint);
+            this.FadeIn(transition_length, EasingTypes.OutQuint);
 
             inputTextBox.HoldFocus = true;
             base.PopIn();
@@ -244,8 +244,8 @@ namespace osu.Game.Overlays
 
         protected override void PopOut()
         {
-            MoveToY(Height, transition_length, EasingTypes.InSine);
-            FadeOut(transition_length, EasingTypes.InSine);
+            this.MoveToY(Height, transition_length, EasingTypes.InSine);
+            this.FadeOut(transition_length, EasingTypes.InSine);
 
             inputTextBox.HoldFocus = false;
             base.PopOut();
diff --git a/osu.Game/Overlays/DialogOverlay.cs b/osu.Game/Overlays/DialogOverlay.cs
index f1a6bc1681..71015bf810 100644
--- a/osu.Game/Overlays/DialogOverlay.cs
+++ b/osu.Game/Overlays/DialogOverlay.cs
@@ -45,13 +45,13 @@ namespace osu.Game.Overlays
         protected override void PopIn()
         {
             base.PopIn();
-            FadeIn(PopupDialog.ENTER_DURATION, EasingTypes.OutQuint);
+            this.FadeIn(PopupDialog.ENTER_DURATION, EasingTypes.OutQuint);
         }
 
         protected override void PopOut()
         {
             base.PopOut();
-            FadeOut(PopupDialog.EXIT_DURATION, EasingTypes.InSine);
+            this.FadeOut(PopupDialog.EXIT_DURATION, EasingTypes.InSine);
         }
 
         public DialogOverlay()
diff --git a/osu.Game/Overlays/Direct/DirectGridPanel.cs b/osu.Game/Overlays/Direct/DirectGridPanel.cs
index 3c464af05d..cc7d57e04b 100644
--- a/osu.Game/Overlays/Direct/DirectGridPanel.cs
+++ b/osu.Game/Overlays/Direct/DirectGridPanel.cs
@@ -41,7 +41,7 @@ namespace osu.Game.Overlays.Direct
         {
             base.LoadComplete();
 
-            FadeInFromZero(200, EasingTypes.Out);
+            this.FadeInFromZero(200, EasingTypes.Out);
             bottomPanel.LayoutDuration = 200;
             bottomPanel.LayoutEasing = EasingTypes.Out;
             bottomPanel.Origin = Anchor.BottomLeft;
diff --git a/osu.Game/Overlays/Direct/DirectListPanel.cs b/osu.Game/Overlays/Direct/DirectListPanel.cs
index f693998563..1b36798639 100644
--- a/osu.Game/Overlays/Direct/DirectListPanel.cs
+++ b/osu.Game/Overlays/Direct/DirectListPanel.cs
@@ -43,7 +43,7 @@ namespace osu.Game.Overlays.Direct
         {
             base.LoadComplete();
 
-            FadeInFromZero(200, EasingTypes.Out);
+            this.FadeInFromZero(200, EasingTypes.Out);
         }
 
         [BackgroundDependencyLoader]
diff --git a/osu.Game/Overlays/DragBar.cs b/osu.Game/Overlays/DragBar.cs
index 89bb81c70b..2ae017c592 100644
--- a/osu.Game/Overlays/DragBar.cs
+++ b/osu.Game/Overlays/DragBar.cs
@@ -75,7 +75,7 @@ namespace osu.Game.Overlays
         private void updatePosition(float position, bool easing = true)
         {
             position = MathHelper.Clamp(position, 0, 1);
-            Fill.TransformTo(position, easing ? 200 : 0, EasingTypes.OutQuint, new TransformSeek());
+            Fill.TransformTo(position, easing ? 200 : 0, EasingTypes.OutQuint, new TransformSeek(this));
         }
 
         protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
@@ -100,6 +100,10 @@ namespace osu.Game.Overlays
 
         private class TransformSeek : TransformFloat<Drawable>
         {
+            public TransformSeek(Drawable target) : base(target)
+            {
+            }
+
             public override void Apply(Drawable d) => d.Width = CurrentValue;
             public override void ReadIntoStartValue(Drawable d) => StartValue = d.Width;
         }
diff --git a/osu.Game/Overlays/LoginOverlay.cs b/osu.Game/Overlays/LoginOverlay.cs
index 790530342f..3a3bb362d2 100644
--- a/osu.Game/Overlays/LoginOverlay.cs
+++ b/osu.Game/Overlays/LoginOverlay.cs
@@ -66,7 +66,7 @@ namespace osu.Game.Overlays
             base.PopIn();
 
             settingsSection.Bounding = true;
-            FadeIn(transition_time, EasingTypes.OutQuint);
+            this.FadeIn(transition_time, EasingTypes.OutQuint);
 
             InputManager.ChangeFocus(settingsSection);
         }
@@ -76,7 +76,7 @@ namespace osu.Game.Overlays
             base.PopOut();
 
             settingsSection.Bounding = false;
-            FadeOut(transition_time);
+            this.FadeOut(transition_time);
         }
     }
 }
diff --git a/osu.Game/Overlays/MedalOverlay.cs b/osu.Game/Overlays/MedalOverlay.cs
index 5f85474ede..fce4604d9d 100644
--- a/osu.Game/Overlays/MedalOverlay.cs
+++ b/osu.Game/Overlays/MedalOverlay.cs
@@ -194,16 +194,13 @@ namespace osu.Game.Overlays
         {
             base.PopIn();
 
-            FadeIn(200);
+            this.FadeIn(200);
             background.FlashColour(Color4.White.Opacity(0.25f), 400);
 
             getSample.Play();
 
-            using (innerSpin.BeginLoopedSequence())
-                innerSpin.RotateTo(360, 20000);
-
-            using (outerSpin.BeginLoopedSequence())
-                outerSpin.RotateTo(360, 40000);
+            innerSpin.Spin(20000);
+            outerSpin.Spin(40000);
 
             using (BeginDelayedSequence(200, true))
             {
@@ -233,7 +230,7 @@ namespace osu.Game.Overlays
         protected override void PopOut()
         {
             base.PopOut();
-            FadeOut(200);
+            this.FadeOut(200);
         }
 
         private void dismiss()
@@ -295,8 +292,8 @@ namespace osu.Game.Overlays
                     Radius = 5,
                 };
 
-                MoveTo(positionForOffset(DISC_SIZE / 2 + 200), 500);
-                FadeOut(500);
+                this.MoveTo(positionForOffset(DISC_SIZE / 2 + 200), 500);
+                this.FadeOut(500);
                 Expire();
             }
         }
diff --git a/osu.Game/Overlays/MedalSplash/DrawableMedal.cs b/osu.Game/Overlays/MedalSplash/DrawableMedal.cs
index 7d7ffbd12a..bba58e1a26 100644
--- a/osu.Game/Overlays/MedalSplash/DrawableMedal.cs
+++ b/osu.Game/Overlays/MedalSplash/DrawableMedal.cs
@@ -154,16 +154,16 @@ namespace osu.Game.Overlays.MedalSplash
                     medalContainer.ScaleTo(1);
                     medalContainer.Show();
 
-                    ScaleTo(scale_when_unlocked, duration, EasingTypes.OutExpo);
-                    MoveToY(MedalOverlay.DISC_SIZE / 2 - 30, duration, EasingTypes.OutExpo);
+                    this.ScaleTo(scale_when_unlocked, duration, EasingTypes.OutExpo);
+                    this.MoveToY(MedalOverlay.DISC_SIZE / 2 - 30, duration, EasingTypes.OutExpo);
                     unlocked.FadeInFromZero(duration);
                     break;
                 case DisplayState.Full:
                     medalContainer.ScaleTo(1);
                     medalContainer.Show();
 
-                    ScaleTo(scale_when_full, duration, EasingTypes.OutExpo);
-                    MoveToY(MedalOverlay.DISC_SIZE / 2 - 60, duration, EasingTypes.OutExpo);
+                    this.ScaleTo(scale_when_full, duration, EasingTypes.OutExpo);
+                    this.MoveToY(MedalOverlay.DISC_SIZE / 2 - 60, duration, EasingTypes.OutExpo);
                     name.FadeInFromZero(duration + 100);
                     description.FadeInFromZero(duration * 2);
                     break;
diff --git a/osu.Game/Overlays/Music/PlaylistItem.cs b/osu.Game/Overlays/Music/PlaylistItem.cs
index 69cb9c3464..de459cd0f8 100644
--- a/osu.Game/Overlays/Music/PlaylistItem.cs
+++ b/osu.Game/Overlays/Music/PlaylistItem.cs
@@ -144,7 +144,7 @@ namespace osu.Game.Overlays.Music
 
                 matching = value;
 
-                FadeTo(matching ? 1 : 0, 200);
+                this.FadeTo(matching ? 1 : 0, 200);
             }
         }
     }
diff --git a/osu.Game/Overlays/Music/PlaylistOverlay.cs b/osu.Game/Overlays/Music/PlaylistOverlay.cs
index e5dc66fc75..ee5c50eb1a 100644
--- a/osu.Game/Overlays/Music/PlaylistOverlay.cs
+++ b/osu.Game/Overlays/Music/PlaylistOverlay.cs
@@ -105,16 +105,16 @@ namespace osu.Game.Overlays.Music
             filter.Search.HoldFocus = true;
             Schedule(() => inputManager.ChangeFocus(filter.Search));
 
-            ResizeTo(new Vector2(1, playlist_height), transition_duration, EasingTypes.OutQuint);
-            FadeIn(transition_duration, EasingTypes.OutQuint);
+            this.ResizeTo(new Vector2(1, playlist_height), transition_duration, EasingTypes.OutQuint);
+            this.FadeIn(transition_duration, EasingTypes.OutQuint);
         }
 
         protected override void PopOut()
         {
             filter.Search.HoldFocus = false;
 
-            ResizeTo(new Vector2(1, 0), transition_duration, EasingTypes.OutQuint);
-            FadeOut(transition_duration);
+            this.ResizeTo(new Vector2(1, 0), transition_duration, EasingTypes.OutQuint);
+            this.FadeOut(transition_duration);
         }
 
         private void itemSelected(BeatmapSetInfo set)
diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs
index baf58ae26c..d30c66e03d 100644
--- a/osu.Game/Overlays/MusicController.cs
+++ b/osu.Game/Overlays/MusicController.cs
@@ -370,7 +370,7 @@ namespace osu.Game.Overlays
         {
             base.PopIn();
 
-            FadeIn(transition_length, EasingTypes.OutQuint);
+            this.FadeIn(transition_length, EasingTypes.OutQuint);
             dragContainer.ScaleTo(1, transition_length, EasingTypes.OutElastic);
         }
 
@@ -378,7 +378,7 @@ namespace osu.Game.Overlays
         {
             base.PopOut();
 
-            FadeOut(transition_length, EasingTypes.OutQuint);
+            this.FadeOut(transition_length, EasingTypes.OutQuint);
             dragContainer.ScaleTo(0.9f, transition_length, EasingTypes.OutQuint);
         }
 
diff --git a/osu.Game/Overlays/NotificationManager.cs b/osu.Game/Overlays/NotificationManager.cs
index 18cb49f335..f83aeb1275 100644
--- a/osu.Game/Overlays/NotificationManager.cs
+++ b/osu.Game/Overlays/NotificationManager.cs
@@ -90,8 +90,8 @@ namespace osu.Game.Overlays
             base.PopIn();
 
             scrollContainer.MoveToX(0, TRANSITION_LENGTH, EasingTypes.OutQuint);
-            MoveToX(0, TRANSITION_LENGTH, EasingTypes.OutQuint);
-            FadeTo(1, TRANSITION_LENGTH / 2);
+            this.MoveToX(0, TRANSITION_LENGTH, EasingTypes.OutQuint);
+            this.FadeTo(1, TRANSITION_LENGTH / 2);
         }
 
         private void markAllRead()
@@ -105,8 +105,8 @@ namespace osu.Game.Overlays
 
             markAllRead();
 
-            MoveToX(width, TRANSITION_LENGTH, EasingTypes.OutQuint);
-            FadeTo(0, TRANSITION_LENGTH / 2);
+            this.MoveToX(width, TRANSITION_LENGTH, EasingTypes.OutQuint);
+            this.FadeTo(0, TRANSITION_LENGTH / 2);
         }
     }
 }
\ No newline at end of file
diff --git a/osu.Game/Overlays/Notifications/Notification.cs b/osu.Game/Overlays/Notifications/Notification.cs
index f5613d6656..4337989a13 100644
--- a/osu.Game/Overlays/Notifications/Notification.cs
+++ b/osu.Game/Overlays/Notifications/Notification.cs
@@ -135,7 +135,7 @@ namespace osu.Game.Overlays.Notifications
         protected override void LoadComplete()
         {
             base.LoadComplete();
-            FadeInFromZero(200);
+            this.FadeInFromZero(200);
             NotificationContent.MoveToX(DrawSize.X);
             NotificationContent.MoveToX(0, 500, EasingTypes.OutQuint);
         }
@@ -148,7 +148,7 @@ namespace osu.Game.Overlays.Notifications
             wasClosed = true;
 
             Closed?.Invoke();
-            FadeOut(100);
+            this.FadeOut(100);
             Expire();
         }
 
@@ -181,13 +181,13 @@ namespace osu.Game.Overlays.Notifications
 
             protected override bool OnHover(InputState state)
             {
-                FadeColour(hoverColour, 200);
+                this.FadeColour(hoverColour, 200);
                 return base.OnHover(state);
             }
 
             protected override void OnHoverLost(InputState state)
             {
-                FadeColour(OsuColour.Gray(0.2f), 200);
+                this.FadeColour(OsuColour.Gray(0.2f), 200);
                 base.OnHoverLost(state);
             }
         }
@@ -212,12 +212,9 @@ namespace osu.Game.Overlays.Notifications
                     if (pulsate)
                     {
                         const float length = 1000;
-                        using (pulsateLayer.BeginLoopedSequence(length / 2))
-                        {
-                            pulsateLayer.FadeTo(0.4f, length, EasingTypes.In);
-                            using (pulsateLayer.BeginDelayedSequence(length))
-                                pulsateLayer.FadeTo(1, length, EasingTypes.Out);
-                        }
+                        pulsateLayer.Loop(length / 2,
+                            p => p.FadeTo(0.4f, length, EasingTypes.In).Then().FadeTo(1, length, EasingTypes.Out)
+                        );
                     }
                 }
             }
diff --git a/osu.Game/Overlays/Notifications/ProgressNotification.cs b/osu.Game/Overlays/Notifications/ProgressNotification.cs
index f0fa7e6da1..18ad148702 100644
--- a/osu.Game/Overlays/Notifications/ProgressNotification.cs
+++ b/osu.Game/Overlays/Notifications/ProgressNotification.cs
@@ -78,7 +78,7 @@ namespace osu.Game.Overlays.Notifications
                     {
                         case ProgressNotificationState.Completed:
                             NotificationContent.MoveToY(-DrawSize.Y / 2, 200, EasingTypes.OutQuint);
-                            FadeTo(0.01f, 200); //don't completely fade out or our scheduled task won't run.
+                            this.FadeTo(0.01f, 200); //don't completely fade out or our scheduled task won't run.
 
                             Delay(100);
                             Schedule(Completed);
@@ -196,7 +196,7 @@ namespace osu.Game.Overlays.Notifications
                 set
                 {
                     active = value;
-                    FadeColour(active ? colourActive : colourInactive, 100);
+                    this.FadeColour(active ? colourActive : colourInactive, 100);
                 }
             }
 
diff --git a/osu.Game/Overlays/Settings/SettingsItem.cs b/osu.Game/Overlays/Settings/SettingsItem.cs
index f80fef4a99..c74f4070e7 100644
--- a/osu.Game/Overlays/Settings/SettingsItem.cs
+++ b/osu.Game/Overlays/Settings/SettingsItem.cs
@@ -60,7 +60,7 @@ namespace osu.Game.Overlays.Settings
             set
             {
                 // probably needs a better transition.
-                FadeTo(value ? 1 : 0);
+                this.FadeTo(value ? 1 : 0);
             }
         }
 
diff --git a/osu.Game/Overlays/Settings/SettingsSection.cs b/osu.Game/Overlays/Settings/SettingsSection.cs
index 77bf87f718..68ebde6b28 100644
--- a/osu.Game/Overlays/Settings/SettingsSection.cs
+++ b/osu.Game/Overlays/Settings/SettingsSection.cs
@@ -29,7 +29,7 @@ namespace osu.Game.Overlays.Settings
         {
             set
             {
-                FadeTo(value ? 1 : 0);
+                this.FadeTo(value ? 1 : 0);
             }
         }
 
diff --git a/osu.Game/Overlays/Settings/SettingsSubsection.cs b/osu.Game/Overlays/Settings/SettingsSubsection.cs
index 0a9f7ba5d0..ac6d2fa239 100644
--- a/osu.Game/Overlays/Settings/SettingsSubsection.cs
+++ b/osu.Game/Overlays/Settings/SettingsSubsection.cs
@@ -24,7 +24,7 @@ namespace osu.Game.Overlays.Settings
         {
             set
             {
-                FadeTo(value ? 1 : 0);
+                this.FadeTo(value ? 1 : 0);
             }
         }
 
diff --git a/osu.Game/Overlays/Settings/Sidebar.cs b/osu.Game/Overlays/Settings/Sidebar.cs
index 44d296a079..f5ab3b301b 100644
--- a/osu.Game/Overlays/Settings/Sidebar.cs
+++ b/osu.Game/Overlays/Settings/Sidebar.cs
@@ -94,10 +94,10 @@ namespace osu.Game.Overlays.Settings
                 switch (state)
                 {
                     default:
-                        ResizeTo(new Vector2(DEFAULT_WIDTH, Height), 500, EasingTypes.OutQuint);
+                        this.ResizeTo(new Vector2(DEFAULT_WIDTH, Height), 500, EasingTypes.OutQuint);
                         break;
                     case ExpandedState.Expanded:
-                        ResizeTo(new Vector2(EXPANDED_WIDTH, Height), 500, EasingTypes.OutQuint);
+                        this.ResizeTo(new Vector2(EXPANDED_WIDTH, Height), 500, EasingTypes.OutQuint);
                         break;
                 }
             }
diff --git a/osu.Game/Overlays/SettingsOverlay.cs b/osu.Game/Overlays/SettingsOverlay.cs
index 66b15234c3..d7d45371ff 100644
--- a/osu.Game/Overlays/SettingsOverlay.cs
+++ b/osu.Game/Overlays/SettingsOverlay.cs
@@ -127,7 +127,7 @@ namespace osu.Game.Overlays
 
             sectionsContainer.MoveToX(0, TRANSITION_LENGTH, EasingTypes.OutQuint);
             sidebar.MoveToX(0, TRANSITION_LENGTH, EasingTypes.OutQuint);
-            FadeTo(1, TRANSITION_LENGTH / 2);
+            this.FadeTo(1, TRANSITION_LENGTH / 2);
 
             searchTextBox.HoldFocus = true;
         }
@@ -138,7 +138,7 @@ namespace osu.Game.Overlays
 
             sectionsContainer.MoveToX(-width, TRANSITION_LENGTH, EasingTypes.OutQuint);
             sidebar.MoveToX(-SIDEBAR_WIDTH, TRANSITION_LENGTH, EasingTypes.OutQuint);
-            FadeTo(0, TRANSITION_LENGTH / 2);
+            this.FadeTo(0, TRANSITION_LENGTH / 2);
 
             searchTextBox.HoldFocus = false;
             if (searchTextBox.HasFocus)
diff --git a/osu.Game/Overlays/Toolbar/Toolbar.cs b/osu.Game/Overlays/Toolbar/Toolbar.cs
index a7e5f8dcc4..9070bc45ad 100644
--- a/osu.Game/Overlays/Toolbar/Toolbar.cs
+++ b/osu.Game/Overlays/Toolbar/Toolbar.cs
@@ -121,16 +121,16 @@ namespace osu.Game.Overlays.Toolbar
 
         protected override void PopIn()
         {
-            MoveToY(0, transition_time, EasingTypes.OutQuint);
-            FadeIn(transition_time / 2, EasingTypes.OutQuint);
+            this.MoveToY(0, transition_time, EasingTypes.OutQuint);
+            this.FadeIn(transition_time / 2, EasingTypes.OutQuint);
         }
 
         protected override void PopOut()
         {
             userArea?.LoginOverlay.Hide();
 
-            MoveToY(-DrawSize.Y, transition_time, EasingTypes.OutQuint);
-            FadeOut(transition_time);
+            this.MoveToY(-DrawSize.Y, transition_time, EasingTypes.OutQuint);
+            this.FadeOut(transition_time);
         }
     }
 }
diff --git a/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs b/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs
index 95906464ec..3ecf0fd83c 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs
@@ -86,7 +86,7 @@ namespace osu.Game.Overlays.Toolbar
 
         public override bool HandleInput => !ruleset.Disabled;
 
-        private void disabledChanged(bool isDisabled) => FadeColour(isDisabled ? Color4.Gray : Color4.White, 300);
+        private void disabledChanged(bool isDisabled) => this.FadeColour(isDisabled ? Color4.Gray : Color4.White, 300);
 
         protected override void Update()
         {
diff --git a/osu.Game/Overlays/WaveOverlayContainer.cs b/osu.Game/Overlays/WaveOverlayContainer.cs
index 1bb7813d90..ce587c9ed2 100644
--- a/osu.Game/Overlays/WaveOverlayContainer.cs
+++ b/osu.Game/Overlays/WaveOverlayContainer.cs
@@ -137,23 +137,23 @@ namespace osu.Game.Overlays
             foreach (var w in wavesContainer.Children)
                 w.State = Visibility.Visible;
 
-            FadeIn(100, EasingTypes.OutQuint);
+            this.FadeIn(100, EasingTypes.OutQuint);
             contentContainer.MoveToY(0, APPEAR_DURATION, EasingTypes.OutQuint);
 
-            FadeIn(100, EasingTypes.OutQuint);
+            this.FadeIn(100, EasingTypes.OutQuint);
         }
 
         protected override void PopOut()
         {
             base.PopOut();
 
-            FadeOut(DISAPPEAR_DURATION, EasingTypes.InQuint);
+            this.FadeOut(DISAPPEAR_DURATION, EasingTypes.InQuint);
             contentContainer.MoveToY(DrawHeight * 2f, DISAPPEAR_DURATION, EasingTypes.In);
 
             foreach (var w in wavesContainer.Children)
                 w.State = Visibility.Hidden;
 
-            FadeOut(DISAPPEAR_DURATION, EasingTypes.InQuint);
+            this.FadeOut(DISAPPEAR_DURATION, EasingTypes.InQuint);
         }
 
         protected override void UpdateAfterChildren()
@@ -210,10 +210,10 @@ namespace osu.Game.Overlays
                     switch (value)
                     {
                         case Visibility.Hidden:
-                            MoveToY(Parent.Parent.DrawSize.Y, DISAPPEAR_DURATION, easing_hide);
+                            this.MoveToY(Parent.Parent.DrawSize.Y, DISAPPEAR_DURATION, easing_hide);
                             break;
                         case Visibility.Visible:
-                            MoveToY(FinalPosition, APPEAR_DURATION, easing_show);
+                            this.MoveToY(FinalPosition, APPEAR_DURATION, easing_show);
                             break;
                     }
                 }
diff --git a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
index 3a82827497..ad21650f36 100644
--- a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
+++ b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
@@ -64,26 +64,26 @@ namespace osu.Game.Rulesets.Judgements
         {
             base.LoadComplete();
 
-            FadeInFromZero(100, EasingTypes.OutQuint);
+            this.FadeInFromZero(100, EasingTypes.OutQuint);
 
             switch (Judgement.Result)
             {
                 case HitResult.Miss:
-                    ScaleTo(1.6f);
-                    ScaleTo(1, 100, EasingTypes.In);
+                    this.ScaleTo(1.6f);
+                    this.ScaleTo(1, 100, EasingTypes.In);
 
-                    MoveToOffset(new Vector2(0, 100), 800, EasingTypes.InQuint);
-                    RotateTo(40, 800, EasingTypes.InQuint);
+                    this.MoveToOffset(new Vector2(0, 100), 800, EasingTypes.InQuint);
+                    this.RotateTo(40, 800, EasingTypes.InQuint);
 
                     Delay(600);
-                    FadeOut(200);
+                    this.FadeOut(200);
                     break;
                 case HitResult.Hit:
-                    ScaleTo(0.9f);
-                    ScaleTo(1, 500, EasingTypes.OutElastic);
+                    this.ScaleTo(0.9f);
+                    this.ScaleTo(1, 500, EasingTypes.OutElastic);
 
                     Delay(100);
-                    FadeOut(400);
+                    this.FadeOut(400);
                     break;
             }
 
diff --git a/osu.Game/Screens/Edit/Editor.cs b/osu.Game/Screens/Edit/Editor.cs
index 2582c68296..8580d043fe 100644
--- a/osu.Game/Screens/Edit/Editor.cs
+++ b/osu.Game/Screens/Edit/Editor.cs
@@ -7,6 +7,7 @@ using OpenTK.Graphics;
 using osu.Framework.Screens;
 using osu.Game.Screens.Backgrounds;
 using osu.Game.Screens.Select;
+using osu.Framework.Graphics;
 
 namespace osu.Game.Screens.Edit
 {
diff --git a/osu.Game/Screens/Menu/Button.cs b/osu.Game/Screens/Menu/Button.cs
index 8dad83bd0e..aa866574cc 100644
--- a/osu.Game/Screens/Menu/Button.cs
+++ b/osu.Game/Screens/Menu/Button.cs
@@ -248,23 +248,23 @@ namespace osu.Game.Screens.Menu
                         {
                             default:
                                 box.ScaleTo(new Vector2(0, 1), 500, EasingTypes.OutExpo);
-                                FadeOut(500);
+                                this.FadeOut(500);
                                 break;
                             case 1:
                                 box.ScaleTo(new Vector2(0, 1), 400, EasingTypes.InSine);
-                                FadeOut(800);
+                                this.FadeOut(800);
                                 break;
                         }
                         break;
                     case ButtonState.Expanded:
                         const int expand_duration = 500;
                         box.ScaleTo(new Vector2(1, 1), expand_duration, EasingTypes.OutExpo);
-                        FadeIn(expand_duration / 6f);
+                        this.FadeIn(expand_duration / 6f);
                         break;
                     case ButtonState.Exploded:
                         const int explode_duration = 200;
                         box.ScaleTo(new Vector2(2, 1), explode_duration, EasingTypes.OutExpo);
-                        FadeOut(explode_duration / 4f * 3);
+                        this.FadeOut(explode_duration / 4f * 3);
                         break;
                 }
             }
diff --git a/osu.Game/Screens/Multiplayer/Match.cs b/osu.Game/Screens/Multiplayer/Match.cs
index ec6a66062d..a0843bfcae 100644
--- a/osu.Game/Screens/Multiplayer/Match.cs
+++ b/osu.Game/Screens/Multiplayer/Match.cs
@@ -8,6 +8,7 @@ using osu.Game.Screens.Backgrounds;
 using osu.Game.Screens.Play;
 using OpenTK.Graphics;
 using osu.Game.Screens.Select;
+using osu.Framework.Graphics;
 
 namespace osu.Game.Screens.Multiplayer
 {
diff --git a/osu.Game/Screens/Play/HUD/ComboCounter.cs b/osu.Game/Screens/Play/HUD/ComboCounter.cs
index 4a9ea0fa59..a7c91bd90a 100644
--- a/osu.Game/Screens/Play/HUD/ComboCounter.cs
+++ b/osu.Game/Screens/Play/HUD/ComboCounter.cs
@@ -6,7 +6,6 @@ using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Sprites;
 using osu.Framework.Graphics.Transforms;
-using osu.Framework.MathUtils;
 using osu.Game.Graphics.Sprites;
 
 namespace osu.Game.Screens.Play.HUD
@@ -130,7 +129,7 @@ namespace osu.Game.Screens.Play.HUD
 
         protected virtual void OnCountRolling(int currentValue, int newValue)
         {
-            transformRoll(new TransformComboRoll(), currentValue, newValue);
+            transformRoll(new TransformComboRoll(this), currentValue, newValue);
         }
 
         protected virtual void OnCountIncrement(int currentValue, int newValue)
@@ -188,25 +187,17 @@ namespace osu.Game.Screens.Play.HUD
 
         private void transformRoll(TransformComboRoll transform, int currentValue, int newValue)
         {
-            TransformTo(newValue, getProportionalDuration(currentValue, newValue), RollingEasing, new TransformComboRoll());
+            this.TransformTo(newValue, getProportionalDuration(currentValue, newValue), RollingEasing, new TransformComboRoll(this));
         }
 
-        protected class TransformComboRoll : Transform<int, Drawable>
+        protected class TransformComboRoll : TransformInt<ComboCounter>
         {
-            public virtual int CurrentValue
+            public TransformComboRoll(ComboCounter target) : base(target)
             {
-                get
-                {
-                    double time = Time?.Current ?? 0;
-                    if (time < StartTime) return StartValue;
-                    if (time >= EndTime) return EndValue;
-
-                    return (int)Interpolation.ValueAt(time, StartValue, EndValue, StartTime, EndTime, Easing);
-                }
             }
 
-            public override void Apply(Drawable d) => ((ComboCounter)d).DisplayedCount = CurrentValue;
-            public override void ReadIntoStartValue(Drawable d) => StartValue = ((ComboCounter)d).DisplayedCount;
+            public override void Apply(ComboCounter d) => d.DisplayedCount = CurrentValue;
+            public override void ReadIntoStartValue(ComboCounter d) => StartValue = d.DisplayedCount;
         }
 
         protected abstract void OnDisplayedCountRolling(int currentValue, int newValue);
diff --git a/osu.Game/Screens/Play/HUD/ComboResultCounter.cs b/osu.Game/Screens/Play/HUD/ComboResultCounter.cs
index e658658306..1686b6174d 100644
--- a/osu.Game/Screens/Play/HUD/ComboResultCounter.cs
+++ b/osu.Game/Screens/Play/HUD/ComboResultCounter.cs
@@ -1,10 +1,7 @@
 // Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
 // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
 
-using System;
 using osu.Framework.Graphics;
-using osu.Framework.Graphics.Transforms;
-using osu.Framework.MathUtils;
 using osu.Game.Graphics.UserInterface;
 
 namespace osu.Game.Screens.Play.HUD
diff --git a/osu.Game/Screens/Play/HUD/StandardComboCounter.cs b/osu.Game/Screens/Play/HUD/StandardComboCounter.cs
index 525e52d207..04fe78116e 100644
--- a/osu.Game/Screens/Play/HUD/StandardComboCounter.cs
+++ b/osu.Game/Screens/Play/HUD/StandardComboCounter.cs
@@ -2,6 +2,7 @@
 // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
 
 using OpenTK;
+using osu.Framework.Graphics;
 
 namespace osu.Game.Screens.Play.HUD
 {
diff --git a/osu.Game/Screens/Play/KeyCounterCollection.cs b/osu.Game/Screens/Play/KeyCounterCollection.cs
index b4b2691390..01e20fdbd7 100644
--- a/osu.Game/Screens/Play/KeyCounterCollection.cs
+++ b/osu.Game/Screens/Play/KeyCounterCollection.cs
@@ -44,7 +44,7 @@ namespace osu.Game.Screens.Play
         private void load(OsuConfigManager config)
         {
             showKeyCounter = config.GetBindable<bool>(OsuSetting.KeyOverlay);
-            showKeyCounter.ValueChanged += keyCounterVisibility => FadeTo(keyCounterVisibility ? 1 : 0, duration);
+            showKeyCounter.ValueChanged += keyCounterVisibility => this.FadeTo(keyCounterVisibility ? 1 : 0, duration);
             showKeyCounter.TriggerChange();
         }
 
diff --git a/osu.Game/Screens/Play/MenuOverlay.cs b/osu.Game/Screens/Play/MenuOverlay.cs
index aedbffbab9..ee08bcc031 100644
--- a/osu.Game/Screens/Play/MenuOverlay.cs
+++ b/osu.Game/Screens/Play/MenuOverlay.cs
@@ -76,8 +76,8 @@ namespace osu.Game.Screens.Play
 
         public override bool HandleInput => State == Visibility.Visible;
 
-        protected override void PopIn() => FadeIn(transition_duration, EasingTypes.In);
-        protected override void PopOut() => FadeOut(transition_duration, EasingTypes.In);
+        protected override void PopIn() => this.FadeIn(transition_duration, EasingTypes.In);
+        protected override void PopOut() => this.FadeOut(transition_duration, EasingTypes.In);
 
         // Don't let mouse down events through the overlay or people can click circles while paused.
         protected override bool OnMouseDown(InputState state, MouseDownEventArgs args) => true;
diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs
index f2ed378e7c..35502c2d4a 100644
--- a/osu.Game/Screens/Play/PlayerLoader.cs
+++ b/osu.Game/Screens/Play/PlayerLoader.cs
@@ -143,7 +143,7 @@ namespace osu.Game.Screens.Play
         protected override bool OnExiting(Screen next)
         {
             Content.ScaleTo(0.7f, 150, EasingTypes.InQuint);
-            FadeOut(150);
+            this.FadeOut(150);
 
             return base.OnExiting(next);
         }
diff --git a/osu.Game/Screens/Play/SkipButton.cs b/osu.Game/Screens/Play/SkipButton.cs
index b0e3de0ea4..6637680c15 100644
--- a/osu.Game/Screens/Play/SkipButton.cs
+++ b/osu.Game/Screens/Play/SkipButton.cs
@@ -100,9 +100,9 @@ namespace osu.Game.Screens.Play
                 return;
             }
 
-            FadeInFromZero(fade_time);
+            this.FadeInFromZero(fade_time);
             using (BeginAbsoluteSequence(beginFadeTime))
-                FadeOut(fade_time);
+                this.FadeOut(fade_time);
 
             button.Action = () => AudioClock?.Seek(startTime - skip_required_cutoff - fade_time);
 
@@ -154,14 +154,14 @@ namespace osu.Game.Screens.Play
                     {
                         case Visibility.Visible:
                             if (lastState == Visibility.Hidden)
-                                FadeIn(500, EasingTypes.OutExpo);
+                                this.FadeIn(500, EasingTypes.OutExpo);
 
                             if (!IsHovered)
                                 using (BeginDelayedSequence(1000))
                                     scheduledHide = Schedule(() => State = Visibility.Hidden);
                             break;
                         case Visibility.Hidden:
-                            FadeOut(1000, EasingTypes.OutExpo);
+                            this.FadeOut(1000, EasingTypes.OutExpo);
                             break;
                     }
                 }
diff --git a/osu.Game/Screens/Play/SongProgress.cs b/osu.Game/Screens/Play/SongProgress.cs
index e5b18292ab..88c30f8c1a 100644
--- a/osu.Game/Screens/Play/SongProgress.cs
+++ b/osu.Game/Screens/Play/SongProgress.cs
@@ -123,18 +123,18 @@ namespace osu.Game.Screens.Play
         private void updateBarVisibility()
         {
             bar.FadeTo(allowSeeking ? 1 : 0, transition_duration, EasingTypes.In);
-            MoveTo(new Vector2(0, allowSeeking ? 0 : bottom_bar_height), transition_duration, EasingTypes.In);
+            this.MoveTo(new Vector2(0, allowSeeking ? 0 : bottom_bar_height), transition_duration, EasingTypes.In);
         }
 
         protected override void PopIn()
         {
             updateBarVisibility();
-            FadeIn(500, EasingTypes.OutQuint);
+            this.FadeIn(500, EasingTypes.OutQuint);
         }
 
         protected override void PopOut()
         {
-            FadeOut(100);
+            this.FadeOut(100);
         }
 
         protected override void Update()
diff --git a/osu.Game/Screens/Select/BeatmapInfoWedge.cs b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
index 42f9598096..72f4a215d0 100644
--- a/osu.Game/Screens/Select/BeatmapInfoWedge.cs
+++ b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
@@ -51,14 +51,14 @@ namespace osu.Game.Screens.Select
 
         protected override void PopIn()
         {
-            MoveToX(0, 800, EasingTypes.OutQuint);
-            RotateTo(0, 800, EasingTypes.OutQuint);
+            this.MoveToX(0, 800, EasingTypes.OutQuint);
+            this.RotateTo(0, 800, EasingTypes.OutQuint);
         }
 
         protected override void PopOut()
         {
-            MoveToX(-100, 800, EasingTypes.InQuint);
-            RotateTo(10, 800, EasingTypes.InQuint);
+            this.MoveToX(-100, 800, EasingTypes.InQuint);
+            this.RotateTo(10, 800, EasingTypes.InQuint);
         }
 
         public void UpdateBeatmap(WorkingBeatmap beatmap)
@@ -84,7 +84,7 @@ namespace osu.Game.Screens.Select
                     Shear = -Shear,
                     OnLoadComplete = d =>
                     {
-                        FadeIn(250);
+                        this.FadeIn(250);
 
                         lastContainer?.FadeOut(250);
                         lastContainer?.Expire();
diff --git a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
index 48de4c2d3a..7a211e406c 100644
--- a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
+++ b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
@@ -61,7 +61,7 @@ namespace osu.Game.Screens.Select.Leaderboards
                         nameLabel.MoveToX(150);
                         break;
                     case Visibility.Visible:
-                        FadeIn(200);
+                        this.FadeIn(200);
                         content.MoveToY(0, 800, EasingTypes.OutQuint);
 
                         Delay(100, true);
diff --git a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
index 6345807ea3..4b9a85f7f8 100644
--- a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
+++ b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
@@ -29,7 +29,7 @@ namespace osu.Game.Screens.Select.Options
         {
             base.PopIn();
 
-            FadeIn(transition_duration, EasingTypes.OutQuint);
+            this.FadeIn(transition_duration, EasingTypes.OutQuint);
 
             if (buttonsContainer.Position.X == 1 || Alpha == 0)
                 buttonsContainer.MoveToX(x_position - x_movement);
@@ -49,7 +49,7 @@ namespace osu.Game.Screens.Select.Options
             buttonsContainer.MoveToX(x_position + x_movement, transition_duration, EasingTypes.InSine);
             buttonsContainer.TransformSpacingTo(new Vector2(200f, 0f), transition_duration, EasingTypes.InSine);
 
-            FadeOut(transition_duration, EasingTypes.InQuint);
+            this.FadeOut(transition_duration, EasingTypes.InQuint);
         }
 
         public BeatmapOptionsOverlay()
diff --git a/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs b/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
index 30f109e598..171b404cd9 100644
--- a/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
+++ b/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
@@ -297,7 +297,7 @@ namespace osu.Game.Screens.Tournament
             }
         }
 
-        private void speedTo(float value, double duration = 0, EasingTypes easing = EasingTypes.None) => TransformTo(value, duration, easing, new TransformScrollSpeed());
+        private void speedTo(float value, double duration = 0, EasingTypes easing = EasingTypes.None) => this.TransformTo(value, duration, easing, new TransformScrollSpeed(this));
 
         private enum ScrollState
         {
@@ -308,10 +308,14 @@ namespace osu.Game.Screens.Tournament
             Scrolling
         }
 
-        public class TransformScrollSpeed : TransformFloat<Drawable>
+        public class TransformScrollSpeed : TransformFloat<ScrollingTeamContainer>
         {
-            public override void Apply(Drawable d) => ((ScrollingTeamContainer)d).speed = CurrentValue;
-            public override void ReadIntoStartValue(Drawable d) => StartValue = ((ScrollingTeamContainer)d).speed;
+            public TransformScrollSpeed(ScrollingTeamContainer target) : base(target)
+            {
+            }
+
+            public override void Apply(ScrollingTeamContainer d) => d.speed = CurrentValue;
+            public override void ReadIntoStartValue(ScrollingTeamContainer d) => StartValue = d.speed;
         }
 
         public class ScrollingTeam : Container
diff --git a/osu.Game/Users/UserPanel.cs b/osu.Game/Users/UserPanel.cs
index 881aaf2e07..46aadb9580 100644
--- a/osu.Game/Users/UserPanel.cs
+++ b/osu.Game/Users/UserPanel.cs
@@ -183,13 +183,13 @@ namespace osu.Game.Users
             {
                 statusBar.ResizeHeightTo(0f, transition_duration, EasingTypes.OutQuint);
                 statusBar.FadeOut(transition_duration, EasingTypes.OutQuint);
-                ResizeHeightTo(height - status_height, transition_duration, EasingTypes.OutQuint);
+                this.ResizeHeightTo(height - status_height, transition_duration, EasingTypes.OutQuint);
             }
             else
             {
                 statusBar.ResizeHeightTo(status_height, transition_duration, EasingTypes.OutQuint);
                 statusBar.FadeIn(transition_duration, EasingTypes.OutQuint);
-                ResizeHeightTo(height, transition_duration, EasingTypes.OutQuint);
+                this.ResizeHeightTo(height, transition_duration, EasingTypes.OutQuint);
 
                 statusBg.FadeColour(status.GetAppropriateColour(colours), 500, EasingTypes.OutQuint);
                 statusMessage.Text = status.Message;

From 5372b9467432beaa04079db6117123cbb0c29a08 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Fri, 14 Jul 2017 19:35:44 +0300
Subject: [PATCH 04/30] Remove some unnecessary usings

---
 osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs | 1 -
 osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs         | 1 -
 osu.Desktop.VisualTests/Tests/TestCaseKeyCounter.cs          | 1 -
 osu.Desktop.VisualTests/Tests/TestCaseScrollingHitObjects.cs | 1 -
 osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs      | 1 -
 5 files changed, 5 deletions(-)

diff --git a/osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs b/osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs
index 8b682d14ce..909ee9b134 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs
@@ -15,7 +15,6 @@ using osu.Game.Graphics.Sprites;
 using osu.Framework.Lists;
 using System;
 using osu.Framework.Extensions.Color4Extensions;
-using osu.Framework.Graphics.Transforms;
 
 namespace osu.Desktop.VisualTests.Tests
 {
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs b/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
index cfb618e5d1..112a11d400 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
@@ -7,7 +7,6 @@ using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Cursor;
 using osu.Framework.Graphics.Shapes;
-using osu.Framework.Graphics.Transforms;
 using osu.Framework.Graphics.UserInterface;
 using osu.Framework.Testing;
 using osu.Game.Graphics.UserInterface;
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseKeyCounter.cs b/osu.Desktop.VisualTests/Tests/TestCaseKeyCounter.cs
index 7a4584d4f8..87a40a76ca 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseKeyCounter.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseKeyCounter.cs
@@ -13,7 +13,6 @@ using osu.Framework.MathUtils;
 using osu.Framework.Graphics.Shapes;
 using osu.Framework.Graphics.Sprites;
 using osu.Game.Screens.Play;
-using osu.Framework.Graphics.Transforms;
 
 namespace osu.Desktop.VisualTests.Tests
 {
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseScrollingHitObjects.cs b/osu.Desktop.VisualTests/Tests/TestCaseScrollingHitObjects.cs
index 33b7399343..eed2fa95c1 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseScrollingHitObjects.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseScrollingHitObjects.cs
@@ -8,7 +8,6 @@ using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Shapes;
 using osu.Framework.Graphics.Sprites;
-using osu.Framework.Graphics.Transforms;
 using osu.Framework.Graphics.UserInterface;
 using osu.Framework.Testing;
 using osu.Game.Graphics.Sprites;
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs b/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
index 4fd27220bc..00929c06c2 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
@@ -4,7 +4,6 @@
 using OpenTK;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
-using osu.Framework.Graphics.Transforms;
 using osu.Framework.MathUtils;
 using osu.Framework.Testing;
 using osu.Framework.Timing;

From 6063219b72db39da7ca158817daeb13553304bae Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sun, 16 Jul 2017 13:59:26 +0300
Subject: [PATCH 05/30] Update framework

---
 osu-framework                                 |  2 +-
 osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs  | 12 +------
 .../Objects/Drawables/DrawableOsuHitObject.cs |  1 +
 .../Objects/Drawables/Pieces/SpinnerDisc.cs   |  2 +-
 osu.Game/Graphics/IHasAccentColour.cs         |  5 ++-
 .../Graphics/Transforms/TransformAccent.cs    | 34 ------------------
 .../Graphics/UserInterface/RollingCounter.cs  | 35 ++-----------------
 osu.Game/Overlays/DragBar.cs                  | 12 +------
 osu.Game/Screens/Play/HUD/ComboCounter.cs     | 18 +++-------
 .../Tournament/ScrollingTeamContainer.cs      | 13 ++-----
 osu.Game/osu.Game.csproj                      |  1 -
 11 files changed, 15 insertions(+), 120 deletions(-)
 delete mode 100644 osu.Game/Graphics/Transforms/TransformAccent.cs

diff --git a/osu-framework b/osu-framework
index cb2c9dd8b6..1b65081418 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit cb2c9dd8b6213cd8f91cc37892da6335ca3bce10
+Subproject commit 1b650814183065be20f10d7df7dce2045cad754e
diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
index 133e1ba861..0d79bb7109 100644
--- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
+++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
@@ -234,7 +234,7 @@ namespace osu.Game.Rulesets.Mania.UI
 
         private void transformVisibleTimeRangeTo(double newTimeRange, double duration = 0, EasingTypes easing = EasingTypes.None)
         {
-            this.TransformTo(newTimeRange, duration, easing, new TransformTimeSpan(this));
+            this.TransformTo(nameof(visibleTimeRange), newTimeRange, duration, easing);
         }
 
         protected override void Update()
@@ -243,15 +243,5 @@ namespace osu.Game.Rulesets.Mania.UI
             // While masking on effectively only the Y-axis, so we need to set the width of the bar line container manually
             barLineContainer.Width = columns.Width;
         }
-
-        private class TransformTimeSpan : TransformDouble<ManiaPlayfield>
-        {
-            public TransformTimeSpan(ManiaPlayfield target) : base(target)
-            {
-            }
-
-            public override void Apply(ManiaPlayfield d) => d.visibleTimeRange.Value = CurrentValue;
-            public override void ReadIntoStartValue(ManiaPlayfield d) => StartValue = d.visibleTimeRange.Value;
-        }
     }
 }
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
index e09b6bd997..ced50bd0e6 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
@@ -26,6 +26,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
         protected sealed override void UpdateState(ArmedState state)
         {
             Flush();
+            DelayReset();
 
             using (BeginAbsoluteSequence(HitObject.StartTime - TIME_PREEMPT, true))
             {
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
index a30b03fa63..26f503340f 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
@@ -127,7 +127,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
 
             if (Complete && updateCompleteTick())
             {
-                background.Flush(flushType: typeof(TransformAlpha));
+                background.Flush(false, nameof(Alpha));
                 background.FadeTo(tracking_alpha + 0.2f, 60, EasingTypes.OutExpo);
                 background.Delay(60);
                 background.FadeTo(tracking_alpha, 250, EasingTypes.OutQuint);
diff --git a/osu.Game/Graphics/IHasAccentColour.cs b/osu.Game/Graphics/IHasAccentColour.cs
index 46f9ec4235..0edd2c3ac4 100644
--- a/osu.Game/Graphics/IHasAccentColour.cs
+++ b/osu.Game/Graphics/IHasAccentColour.cs
@@ -4,7 +4,6 @@
 using OpenTK.Graphics;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Transforms;
-using osu.Game.Graphics.Transforms;
 
 namespace osu.Game.Graphics
 {
@@ -27,8 +26,8 @@ namespace osu.Game.Graphics
         /// <param name="newColour">The new accent colour.</param>
         /// <param name="duration">The tween duration.</param>
         /// <param name="easing">The tween easing.</param>
-        public static TransformContinuation<T> FadeAccent<T>(this T accentedDrawable, Color4 newColour, double duration = 0, EasingTypes easing = EasingTypes.None)
+        public static TransformSequence<T> FadeAccent<T>(this T accentedDrawable, Color4 newColour, double duration = 0, EasingTypes easing = EasingTypes.None)
             where T : IHasAccentColour
-            => accentedDrawable.TransformTo(newColour, duration, easing, new TransformAccent(accentedDrawable));
+            => accentedDrawable.TransformTo(nameof(accentedDrawable.AccentColour), newColour, duration, easing);
     }
 }
diff --git a/osu.Game/Graphics/Transforms/TransformAccent.cs b/osu.Game/Graphics/Transforms/TransformAccent.cs
deleted file mode 100644
index e609649fd0..0000000000
--- a/osu.Game/Graphics/Transforms/TransformAccent.cs
+++ /dev/null
@@ -1,34 +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.Graphics;
-using osu.Framework.Graphics.Transforms;
-using osu.Framework.MathUtils;
-
-namespace osu.Game.Graphics.Transforms
-{
-    public class TransformAccent : Transform<Color4, IHasAccentColour>
-    {
-        public TransformAccent(IHasAccentColour target) : base(target)
-        {
-        }
-
-        /// <summary>
-        /// Current value of the transformed colour in linear colour space.
-        /// </summary>
-        public virtual Color4 CurrentValue
-        {
-            get
-            {
-                double time = Time?.Current ?? 0;
-                if (time < StartTime) return StartValue;
-                if (time >= EndTime) return EndValue;
-
-                return Interpolation.ValueAt(time, StartValue, EndValue, StartTime, EndTime, Easing);
-            }
-        }
-
-        public override void Apply(IHasAccentColour d) => d.AccentColour = CurrentValue;
-        public override void ReadIntoStartValue(IHasAccentColour d) => StartValue = d.AccentColour;
-    }
-}
diff --git a/osu.Game/Graphics/UserInterface/RollingCounter.cs b/osu.Game/Graphics/UserInterface/RollingCounter.cs
index 47346ce440..bc7b49ab6a 100644
--- a/osu.Game/Graphics/UserInterface/RollingCounter.cs
+++ b/osu.Game/Graphics/UserInterface/RollingCounter.cs
@@ -127,7 +127,7 @@ namespace osu.Game.Graphics.UserInterface
         /// </summary>
         public virtual void StopRolling()
         {
-            Flush(false, typeof(TransformRollingCounter));
+            Flush(false, nameof(DisplayedCount));
             DisplayedCount = Current;
         }
 
@@ -173,44 +173,13 @@ namespace osu.Game.Graphics.UserInterface
         /// <param name="newValue">Expected count value after modification-</param>
         /// <seealso cref="TransformType"/>
         protected virtual void TransformCount(T currentValue, T newValue)
-        {
-            TransformCount(new TransformRollingCounter(this), currentValue, newValue);
-        }
-
-        /// <summary>
-        /// Intended to be used by TransformCount(T currentValue, T newValue).
-        /// </summary>
-        protected void TransformCount(TransformRollingCounter transform, T currentValue, T newValue)
         {
             double rollingTotalDuration =
                 IsRollingProportional
                     ? GetProportionalDuration(currentValue, newValue)
                     : RollingDuration;
 
-            this.TransformTo(newValue, rollingTotalDuration, RollingEasing, transform);
-        }
-
-        protected class TransformRollingCounter : Transform<T, RollingCounter<T>>
-        {
-            public TransformRollingCounter(RollingCounter<T> target) : base(target)
-            {
-            }
-
-            public T CurrentValue
-            {
-                get
-                {
-                    double time = Time?.Current ?? 0;
-                    if (time < StartTime) return StartValue;
-                    if (time >= EndTime) return EndValue;
-
-                    double result = Interpolation.ValueAt(time, Convert.ToDouble(StartValue), Convert.ToDouble(EndValue), StartTime, EndTime, Easing);
-                    return (T)Convert.ChangeType(result, typeof(T), null);
-                }
-            }
-
-            public override void Apply(RollingCounter<T> d) => d.DisplayedCount = CurrentValue;
-            public override void ReadIntoStartValue(RollingCounter<T> d) => StartValue = d.DisplayedCount;
+            this.TransformTo(nameof(DisplayedCount), newValue, rollingTotalDuration, RollingEasing);
         }
     }
 }
diff --git a/osu.Game/Overlays/DragBar.cs b/osu.Game/Overlays/DragBar.cs
index 2ae017c592..28aa331ec1 100644
--- a/osu.Game/Overlays/DragBar.cs
+++ b/osu.Game/Overlays/DragBar.cs
@@ -75,7 +75,7 @@ namespace osu.Game.Overlays
         private void updatePosition(float position, bool easing = true)
         {
             position = MathHelper.Clamp(position, 0, 1);
-            Fill.TransformTo(position, easing ? 200 : 0, EasingTypes.OutQuint, new TransformSeek(this));
+            Fill.ResizeWidthTo(position, easing ? 200 : 0, EasingTypes.OutQuint);
         }
 
         protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
@@ -97,15 +97,5 @@ namespace osu.Game.Overlays
             IsSeeking = false;
             return true;
         }
-
-        private class TransformSeek : TransformFloat<Drawable>
-        {
-            public TransformSeek(Drawable target) : base(target)
-            {
-            }
-
-            public override void Apply(Drawable d) => d.Width = CurrentValue;
-            public override void ReadIntoStartValue(Drawable d) => StartValue = d.Width;
-        }
     }
 }
diff --git a/osu.Game/Screens/Play/HUD/ComboCounter.cs b/osu.Game/Screens/Play/HUD/ComboCounter.cs
index a7c91bd90a..1bfc7599f7 100644
--- a/osu.Game/Screens/Play/HUD/ComboCounter.cs
+++ b/osu.Game/Screens/Play/HUD/ComboCounter.cs
@@ -129,7 +129,7 @@ namespace osu.Game.Screens.Play.HUD
 
         protected virtual void OnCountRolling(int currentValue, int newValue)
         {
-            transformRoll(new TransformComboRoll(this), currentValue, newValue);
+            transformRoll(currentValue, newValue);
         }
 
         protected virtual void OnCountIncrement(int currentValue, int newValue)
@@ -169,7 +169,7 @@ namespace osu.Game.Screens.Play.HUD
 
             if (!rolling)
             {
-                Flush(false, typeof(TransformComboRoll));
+                Flush(false, nameof(DisplayedCount));
                 IsRolling = false;
                 DisplayedCount = prev;
 
@@ -185,19 +185,9 @@ namespace osu.Game.Screens.Play.HUD
             }
         }
 
-        private void transformRoll(TransformComboRoll transform, int currentValue, int newValue)
+        private void transformRoll(int currentValue, int newValue)
         {
-            this.TransformTo(newValue, getProportionalDuration(currentValue, newValue), RollingEasing, new TransformComboRoll(this));
-        }
-
-        protected class TransformComboRoll : TransformInt<ComboCounter>
-        {
-            public TransformComboRoll(ComboCounter target) : base(target)
-            {
-            }
-
-            public override void Apply(ComboCounter d) => d.DisplayedCount = CurrentValue;
-            public override void ReadIntoStartValue(ComboCounter d) => StartValue = d.DisplayedCount;
+            this.TransformTo(nameof(DisplayedCount), newValue, getProportionalDuration(currentValue, newValue), RollingEasing);
         }
 
         protected abstract void OnDisplayedCountRolling(int currentValue, int newValue);
diff --git a/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs b/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
index 171b404cd9..65ea195da6 100644
--- a/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
+++ b/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
@@ -297,7 +297,8 @@ namespace osu.Game.Screens.Tournament
             }
         }
 
-        private void speedTo(float value, double duration = 0, EasingTypes easing = EasingTypes.None) => this.TransformTo(value, duration, easing, new TransformScrollSpeed(this));
+        private void speedTo(float value, double duration = 0, EasingTypes easing = EasingTypes.None) =>
+            this.TransformTo(nameof(speed), value, duration, easing);
 
         private enum ScrollState
         {
@@ -308,16 +309,6 @@ namespace osu.Game.Screens.Tournament
             Scrolling
         }
 
-        public class TransformScrollSpeed : TransformFloat<ScrollingTeamContainer>
-        {
-            public TransformScrollSpeed(ScrollingTeamContainer target) : base(target)
-            {
-            }
-
-            public override void Apply(ScrollingTeamContainer d) => d.speed = CurrentValue;
-            public override void ReadIntoStartValue(ScrollingTeamContainer d) => StartValue = d.speed;
-        }
-
         public class ScrollingTeam : Container
         {
             public const float WIDTH = 58;
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 4f8d77367a..7011fa9006 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -119,7 +119,6 @@
     <Compile Include="Graphics\Cursor\GameplayCursor.cs" />
     <Compile Include="Graphics\IHasAccentColour.cs" />
     <Compile Include="Graphics\Sprites\OsuSpriteText.cs" />
-    <Compile Include="Graphics\Transforms\TransformAccent.cs" />
     <Compile Include="Graphics\UserInterface\BackButton.cs" />
     <Compile Include="Graphics\UserInterface\Bar.cs" />
     <Compile Include="Graphics\UserInterface\FocusedTextBox.cs" />

From 71105bb9ee8c0b8ac571eee64bc50fa40e911843 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sun, 16 Jul 2017 14:06:46 +0300
Subject: [PATCH 06/30] Delay -> ApplyDelay; DelayReset -> ResetDelay

---
 osu-framework                                          |  2 +-
 .../Tests/TestCaseNotificationManager.cs               |  2 +-
 .../Tests/TestCaseTaikoPlayfield.cs                    |  2 +-
 .../Drawables/Connections/FollowPointRenderer.cs       |  2 +-
 .../Objects/Drawables/DrawableOsuHitObject.cs          |  2 +-
 .../Objects/Drawables/DrawableSlider.cs                |  2 +-
 .../Objects/Drawables/DrawableSliderTick.cs            |  6 +++---
 .../Objects/Drawables/DrawableSpinner.cs               |  4 ++--
 .../Objects/Drawables/Pieces/SpinnerDisc.cs            |  2 +-
 .../Objects/Drawables/DrawableBarLine.cs               |  2 +-
 .../Objects/Drawables/DrawableHit.cs                   |  6 +++---
 .../Objects/Drawables/DrawableSwell.cs                 |  6 +++---
 osu.Game.Rulesets.Taiko/UI/InputDrum.cs                |  4 ++--
 osu.Game/Graphics/UserInterface/DialogButton.cs        |  2 +-
 .../Graphics/UserInterface/Volume/VolumeControl.cs     |  2 +-
 osu.Game/OsuGame.cs                                    |  2 +-
 osu.Game/Overlays/DialogOverlay.cs                     |  2 +-
 .../Overlays/Notifications/ProgressNotification.cs     |  2 +-
 osu.Game/Rulesets/Judgements/DrawableJudgement.cs      |  4 ++--
 osu.Game/Screens/Menu/Disclaimer.cs                    |  6 +++---
 osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs     |  2 +-
 osu.Game/Screens/Play/PauseContainer.cs                |  2 +-
 osu.Game/Screens/Play/PlayerLoader.cs                  | 10 +++++-----
 osu.Game/Screens/Ranking/ResultsPage.cs                |  2 +-
 osu.Game/Screens/Ranking/ResultsPageScore.cs           |  2 +-
 osu.Game/Screens/ScreenWhiteBox.cs                     |  2 +-
 osu.Game/Screens/Select/Leaderboards/Leaderboard.cs    |  2 +-
 .../Screens/Select/Leaderboards/LeaderboardScore.cs    |  6 +++---
 28 files changed, 45 insertions(+), 45 deletions(-)

diff --git a/osu-framework b/osu-framework
index 1b65081418..0bdb38e12e 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 1b650814183065be20f10d7df7dce2045cad754e
+Subproject commit 0bdb38e12e99716e563d27035737ba167d17763d
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseNotificationManager.cs b/osu.Desktop.VisualTests/Tests/TestCaseNotificationManager.cs
index 4ba50c8220..4d9a0fe9a2 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseNotificationManager.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseNotificationManager.cs
@@ -57,7 +57,7 @@ namespace osu.Desktop.VisualTests.Tests
 
             if (remaining > 0)
             {
-                Delay(80);
+                ApplyDelay(80);
                 Schedule(() => sendBarrage(remaining - 1));
             }
         }
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs b/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
index 00929c06c2..46ad7acb52 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
@@ -84,7 +84,7 @@ namespace osu.Desktop.VisualTests.Tests
                     break;
                 case 5:
                     addSwell(1000);
-                    playfieldContainer.Delay(scroll_time - 100);
+                    playfieldContainer.ApplyDelay(scroll_time - 100);
                     break;
             }
 
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs
index 925767b851..3a32d9765e 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs
@@ -98,7 +98,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Connections
 
                             fp.MoveTo(pointEndPosition, DrawableOsuHitObject.TIME_FADEIN, EasingTypes.Out);
 
-                            fp.Delay(fadeOutTime - fadeInTime);
+                            fp.ApplyDelay(fadeOutTime - fadeInTime);
                             fp.FadeOut(DrawableOsuHitObject.TIME_FADEIN);
                         }
 
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
index ced50bd0e6..1bc6070c33 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
@@ -26,7 +26,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
         protected sealed override void UpdateState(ArmedState state)
         {
             Flush();
-            DelayReset();
+            ResetDelay(true);
 
             using (BeginAbsoluteSequence(HitObject.StartTime - TIME_PREEMPT, true))
             {
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
index c3c7d8862f..63721dee4f 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
@@ -158,7 +158,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
         {
             ball.FadeIn();
 
-            Delay(slider.Duration, true);
+            ApplyDelay(slider.Duration, true);
 
             body.FadeOut(160);
             ball.FadeOut(160);
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
index 6ced16930b..d0e141db6c 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
@@ -66,10 +66,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             this.ScaleTo(1.2f, animIn);
             this.FadeIn(animIn);
 
-            Delay(animIn);
+            ApplyDelay(animIn);
             this.ScaleTo(1, 150, EasingTypes.Out);
 
-            Delay(-animIn);
+            ApplyDelay(-animIn);
         }
 
         protected override void UpdateCurrentState(ArmedState state)
@@ -77,7 +77,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             switch (state)
             {
                 case ArmedState.Idle:
-                    Delay(FadeOutTime - sliderTick.StartTime);
+                    ApplyDelay(FadeOutTime - sliderTick.StartTime);
                     this.FadeOut();
                     break;
                 case ArmedState.Miss:
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index 0ac790c520..0bb2f718d3 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -192,13 +192,13 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             mainContainer.ScaleTo(0);
             mainContainer.ScaleTo(spinner.Scale * circle.DrawHeight / DrawHeight * 1.4f, TIME_PREEMPT - 150, EasingTypes.OutQuint);
 
-            mainContainer.Delay(TIME_PREEMPT - 150);
+            mainContainer.ApplyDelay(TIME_PREEMPT - 150);
             mainContainer.ScaleTo(1, 500, EasingTypes.OutQuint);
         }
 
         protected override void UpdateCurrentState(ArmedState state)
         {
-            Delay(spinner.Duration, true);
+            ApplyDelay(spinner.Duration, true);
 
             this.FadeOut(160);
 
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
index 26f503340f..ee2ecfa8b1 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
@@ -129,7 +129,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
             {
                 background.Flush(false, nameof(Alpha));
                 background.FadeTo(tracking_alpha + 0.2f, 60, EasingTypes.OutExpo);
-                background.Delay(60);
+                background.ApplyDelay(60);
                 background.FadeTo(tracking_alpha, 250, EasingTypes.OutQuint);
             }
 
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs
index 841964b743..bd713ec8b7 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs
@@ -64,7 +64,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
         protected override void LoadComplete()
         {
             base.LoadComplete();
-            Delay(BarLine.StartTime - Time.Current);
+            ApplyDelay(BarLine.StartTime - Time.Current);
             this.FadeOut(base_fadeout_time * BarLine.ScrollTime / 1000);
         }
 
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
index 53518a28de..31e92e4c70 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
@@ -65,7 +65,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
 
         protected override void UpdateState(ArmedState state)
         {
-            Delay(HitObject.StartTime - Time.Current + Judgement.TimeOffset, true);
+            ApplyDelay(HitObject.StartTime - Time.Current + Judgement.TimeOffset, true);
 
             var circlePiece = MainPiece as CirclePiece;
 
@@ -74,7 +74,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
             switch (State)
             {
                 case ArmedState.Idle:
-                    Delay(HitObject.HitWindowMiss);
+                    ApplyDelay(HitObject.HitWindowMiss);
                     break;
                 case ArmedState.Miss:
                     this.FadeOut(100);
@@ -98,7 +98,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
                     Content.ScaleTo(0.8f, gravity_time * 2, EasingTypes.OutQuad);
 
                     this.MoveToY(-gravity_travel_height, gravity_time, EasingTypes.Out);
-                    Delay(gravity_time, true);
+                    ApplyDelay(gravity_time, true);
                     this.MoveToY(gravity_travel_height * 2, gravity_time * 2, EasingTypes.In);
                     break;
             }
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
index 43f6bc930c..90e1d594e9 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
@@ -181,13 +181,13 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
         {
             const float preempt = 100;
 
-            Delay(HitObject.StartTime - Time.Current - preempt, true);
+            ApplyDelay(HitObject.StartTime - Time.Current - preempt, true);
 
             targetRing.ScaleTo(target_ring_scale, preempt * 4, EasingTypes.OutQuint);
 
-            Delay(preempt, true);
+            ApplyDelay(preempt, true);
 
-            Delay(Judgement.TimeOffset + HitObject.Duration, true);
+            ApplyDelay(Judgement.TimeOffset + HitObject.Duration, true);
 
             const float out_transition_time = 300;
 
diff --git a/osu.Game.Rulesets.Taiko/UI/InputDrum.cs b/osu.Game.Rulesets.Taiko/UI/InputDrum.cs
index 999d76ab0b..279092424b 100644
--- a/osu.Game.Rulesets.Taiko/UI/InputDrum.cs
+++ b/osu.Game.Rulesets.Taiko/UI/InputDrum.cs
@@ -150,12 +150,12 @@ namespace osu.Game.Rulesets.Taiko.UI
                     const float up_time = 1000;
 
                     back.ScaleTo(target.Scale.X - scale_amount, down_time, EasingTypes.OutQuint);
-                    back.Delay(down_time);
+                    back.ApplyDelay(down_time);
                     back.ScaleTo(1, up_time, EasingTypes.OutQuint);
 
                     target.ScaleTo(target.Scale.X - scale_amount, down_time, EasingTypes.OutQuint);
                     target.FadeTo(Math.Min(target.Alpha + alpha_amount, 1), down_time, EasingTypes.OutQuint);
-                    target.Delay(down_time);
+                    target.ApplyDelay(down_time);
                     target.ScaleTo(1, up_time, EasingTypes.OutQuint);
                     target.FadeOut(up_time, EasingTypes.OutQuint);
                 }
diff --git a/osu.Game/Graphics/UserInterface/DialogButton.cs b/osu.Game/Graphics/UserInterface/DialogButton.cs
index 3f1b81893d..bb85c9681d 100644
--- a/osu.Game/Graphics/UserInterface/DialogButton.cs
+++ b/osu.Game/Graphics/UserInterface/DialogButton.cs
@@ -99,7 +99,7 @@ namespace osu.Game.Graphics.UserInterface
             colourContainer.ResizeTo(new Vector2(1.5f, 1f), click_duration, EasingTypes.In);
             flash();
 
-            Delay(click_duration);
+            ApplyDelay(click_duration);
             Schedule(delegate {
                 colourContainer.ResizeTo(new Vector2(0.8f, 1f));
                 spriteText.Spacing = Vector2.Zero;
diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs
index fd2a7742f8..19af0991f5 100644
--- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs
+++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs
@@ -106,7 +106,7 @@ namespace osu.Game.Graphics.UserInterface.Volume
         private void schedulePopOut()
         {
             popOutDelegate?.Cancel();
-            Delay(1000);
+            ApplyDelay(1000);
             popOutDelegate = Schedule(Hide);
         }
     }
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 843861c0da..7f9ddb685d 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -119,7 +119,7 @@ namespace osu.Game
             if (!menu.IsCurrentScreen)
             {
                 menu.MakeCurrent();
-                Delay(500);
+                ApplyDelay(500);
                 scoreLoad = Schedule(() => LoadScore(s));
                 return;
             }
diff --git a/osu.Game/Overlays/DialogOverlay.cs b/osu.Game/Overlays/DialogOverlay.cs
index 71015bf810..5580287276 100644
--- a/osu.Game/Overlays/DialogOverlay.cs
+++ b/osu.Game/Overlays/DialogOverlay.cs
@@ -35,7 +35,7 @@ namespace osu.Game.Overlays
             if (v != Visibility.Hidden) return;
 
             //handle the dialog being dismissed.
-            dialog.Delay(PopupDialog.EXIT_DURATION);
+            dialog.ApplyDelay(PopupDialog.EXIT_DURATION);
             dialog.Expire();
 
             if (dialog == currentDialog)
diff --git a/osu.Game/Overlays/Notifications/ProgressNotification.cs b/osu.Game/Overlays/Notifications/ProgressNotification.cs
index 18ad148702..1d76990859 100644
--- a/osu.Game/Overlays/Notifications/ProgressNotification.cs
+++ b/osu.Game/Overlays/Notifications/ProgressNotification.cs
@@ -80,7 +80,7 @@ namespace osu.Game.Overlays.Notifications
                             NotificationContent.MoveToY(-DrawSize.Y / 2, 200, EasingTypes.OutQuint);
                             this.FadeTo(0.01f, 200); //don't completely fade out or our scheduled task won't run.
 
-                            Delay(100);
+                            ApplyDelay(100);
                             Schedule(Completed);
                             break;
                     }
diff --git a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
index ad21650f36..d5075ec400 100644
--- a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
+++ b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
@@ -75,14 +75,14 @@ namespace osu.Game.Rulesets.Judgements
                     this.MoveToOffset(new Vector2(0, 100), 800, EasingTypes.InQuint);
                     this.RotateTo(40, 800, EasingTypes.InQuint);
 
-                    Delay(600);
+                    ApplyDelay(600);
                     this.FadeOut(200);
                     break;
                 case HitResult.Hit:
                     this.ScaleTo(0.9f);
                     this.ScaleTo(1, 500, EasingTypes.OutElastic);
 
-                    Delay(100);
+                    ApplyDelay(100);
                     this.FadeOut(400);
                     break;
             }
diff --git a/osu.Game/Screens/Menu/Disclaimer.cs b/osu.Game/Screens/Menu/Disclaimer.cs
index beaaa373b6..718fe5d8be 100644
--- a/osu.Game/Screens/Menu/Disclaimer.cs
+++ b/osu.Game/Screens/Menu/Disclaimer.cs
@@ -100,14 +100,14 @@ namespace osu.Game.Screens.Menu
 
             Content.FadeInFromZero(500);
 
-            icon.Delay(1500);
+            icon.ApplyDelay(1500);
             icon.FadeColour(iconColour, 200);
 
-            Delay(6000, true);
+            ApplyDelay(6000, true);
 
             Content.FadeOut(250);
 
-            Delay(250);
+            ApplyDelay(250);
 
             Schedule(() => Push(intro));
         }
diff --git a/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs b/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs
index cac1f1a71b..a5c4f262f8 100644
--- a/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs
+++ b/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs
@@ -98,7 +98,7 @@ namespace osu.Game.Screens.Play.HUD
                 return;
 
             fill.FadeEdgeEffectTo(Math.Min(1, fill.EdgeEffect.Colour.Linear.A + (1f - base_glow_opacity) / glow_max_hits), 50, EasingTypes.OutQuint);
-            fill.Delay(glow_fade_delay);
+            fill.ApplyDelay(glow_fade_delay);
             fill.FadeEdgeEffectTo(base_glow_opacity, glow_fade_time, EasingTypes.OutQuint);
         }
 
diff --git a/osu.Game/Screens/Play/PauseContainer.cs b/osu.Game/Screens/Play/PauseContainer.cs
index f052bafd63..7a257a4b6d 100644
--- a/osu.Game/Screens/Play/PauseContainer.cs
+++ b/osu.Game/Screens/Play/PauseContainer.cs
@@ -58,7 +58,7 @@ namespace osu.Game.Screens.Play
             {
                 OnResume = delegate
                 {
-                    Delay(400);
+                    ApplyDelay(400);
                     Schedule(Resume);
                 },
                 OnRetry = () => OnRetry(),
diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs
index 35502c2d4a..ba92fb095d 100644
--- a/osu.Game/Screens/Play/PlayerLoader.cs
+++ b/osu.Game/Screens/Play/PlayerLoader.cs
@@ -77,7 +77,7 @@ namespace osu.Game.Screens.Play
                 Beatmap = player.Beatmap,
             });
 
-            Delay(400);
+            ApplyDelay(400);
 
             Schedule(pushWhenLoaded);
         }
@@ -104,14 +104,14 @@ namespace osu.Game.Screens.Play
 
             contentIn();
 
-            Delay(500, true);
+            ApplyDelay(500, true);
 
             logo.MoveToOffset(new Vector2(0, -180), 500, EasingTypes.InOutExpo);
-            Delay(250, true);
+            ApplyDelay(250, true);
 
             info.FadeIn(500);
 
-            Delay(1400, true);
+            ApplyDelay(1400, true);
 
             Schedule(pushWhenLoaded);
         }
@@ -123,7 +123,7 @@ namespace osu.Game.Screens.Play
 
             contentOut();
 
-            Delay(250);
+            ApplyDelay(250);
 
             Schedule(() =>
             {
diff --git a/osu.Game/Screens/Ranking/ResultsPage.cs b/osu.Game/Screens/Ranking/ResultsPage.cs
index 59173748ed..55e71cfcc4 100644
--- a/osu.Game/Screens/Ranking/ResultsPage.cs
+++ b/osu.Game/Screens/Ranking/ResultsPage.cs
@@ -33,7 +33,7 @@ namespace osu.Game.Screens.Ranking
         protected override void LoadComplete()
         {
             base.LoadComplete();
-            fill.Delay(400);
+            fill.ApplyDelay(400);
             fill.FadeInFromZero(600);
         }
 
diff --git a/osu.Game/Screens/Ranking/ResultsPageScore.cs b/osu.Game/Screens/Ranking/ResultsPageScore.cs
index 96e63585bf..6f96ef500e 100644
--- a/osu.Game/Screens/Ranking/ResultsPageScore.cs
+++ b/osu.Game/Screens/Ranking/ResultsPageScore.cs
@@ -179,7 +179,7 @@ namespace osu.Game.Screens.Ranking
                 foreach (var s in statisticsContainer.Children)
                 {
                     s.FadeOut();
-                    s.Delay(delay += 200);
+                    s.ApplyDelay(delay += 200);
                     s.FadeIn(300 + delay, EasingTypes.Out);
                 }
             });
diff --git a/osu.Game/Screens/ScreenWhiteBox.cs b/osu.Game/Screens/ScreenWhiteBox.cs
index 21239e8030..e6c25ff6f4 100644
--- a/osu.Game/Screens/ScreenWhiteBox.cs
+++ b/osu.Game/Screens/ScreenWhiteBox.cs
@@ -44,7 +44,7 @@ namespace osu.Game.Screens
             boxContainer.ScaleTo(0.2f);
             boxContainer.RotateTo(-20);
 
-            Content.Delay(300, true);
+            Content.ApplyDelay(300, true);
 
             boxContainer.ScaleTo(1, transition_time, EasingTypes.OutElastic);
             boxContainer.RotateTo(0, transition_time / 2, EasingTypes.OutQuint);
diff --git a/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs b/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
index 2a8e4ca5fb..dcf39a7880 100644
--- a/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
+++ b/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
@@ -63,7 +63,7 @@ namespace osu.Game.Screens.Select.Leaderboards
                     };
                     scrollFlow.Add(ls);
 
-                    ls.Delay(i++ * 50, true);
+                    ls.ApplyDelay(i++ * 50, true);
                     ls.Show();
                 }
 
diff --git a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
index 7a211e406c..02d6833d3f 100644
--- a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
+++ b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
@@ -64,18 +64,18 @@ namespace osu.Game.Screens.Select.Leaderboards
                         this.FadeIn(200);
                         content.MoveToY(0, 800, EasingTypes.OutQuint);
 
-                        Delay(100, true);
+                        ApplyDelay(100, true);
                         avatar.FadeIn(300, EasingTypes.OutQuint);
                         nameLabel.FadeIn(350, EasingTypes.OutQuint);
 
                         avatar.MoveToX(0, 300, EasingTypes.OutQuint);
                         nameLabel.MoveToX(0, 350, EasingTypes.OutQuint);
 
-                        Delay(250, true);
+                        ApplyDelay(250, true);
                         scoreLabel.FadeIn(200);
                         scoreRank.FadeIn(200);
 
-                        Delay(50, true);
+                        ApplyDelay(50, true);
                         var drawables = new Drawable[] { flagBadgeContainer, maxCombo, accuracy, modsContainer, };
 
                         for (int i = 0; i < drawables.Length; i++)

From 99221260c4fecdfe042f43b983daaf2d313d8cdc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sun, 16 Jul 2017 17:37:59 +0300
Subject: [PATCH 07/30] Replace several usages of BeginDelayedSequence with
 LINQ-style

---
 osu-framework                                 |  2 +-
 .../Tests/TestCaseContextMenu.cs              |  4 +--
 .../Objects/Drawables/DrawableHitCircle.cs    | 26 +++++--------------
 .../Objects/Drawables/DrawableSwell.cs        |  5 ++--
 .../Objects/Drawables/Pieces/CirclePiece.cs   |  5 ++--
 .../Graphics/Cursor/OsuTooltipContainer.cs    |  6 +----
 .../Graphics/UserInterface/StarCounter.cs     |  8 ++----
 .../Graphics/UserInterface/TwoLayerButton.cs  |  5 ++--
 osu.Game/Overlays/MedalOverlay.cs             | 24 ++++++++++-------
 .../Overlays/MedalSplash/DrawableMedal.cs     |  9 +++----
 osu.Game/Overlays/Mods/ModButton.cs           |  7 ++---
 osu.Game/Overlays/OnScreenDisplay.cs          | 13 ++++------
 osu.Game/Screens/Menu/Button.cs               | 13 ++++------
 osu.Game/Screens/Menu/ButtonSystem.cs         |  6 +----
 osu.Game/Screens/Menu/MenuSideFlashes.cs      |  5 ++--
 osu.Game/Screens/Menu/OsuLogo.cs              | 25 +++++-------------
 osu.Game/Screens/Play/HUDOverlay.cs           |  5 +---
 osu.Game/Screens/Play/Player.cs               | 19 +++++---------
 osu.Game/Screens/Ranking/Results.cs           | 10 +++----
 19 files changed, 70 insertions(+), 127 deletions(-)

diff --git a/osu-framework b/osu-framework
index 0bdb38e12e..c2a20bd8b3 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 0bdb38e12e99716e563d27035737ba167d17763d
+Subproject commit c2a20bd8b31144c6d196ab6ae0e8858acabbe032
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs b/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
index 112a11d400..d89397e793 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
@@ -60,12 +60,12 @@ namespace osu.Desktop.VisualTests.Tests
             base.LoadComplete();
 
             // Move box along a square trajectory
-            container.Loop(b => b
+            container
                 .MoveTo(new Vector2(0, 100), duration)
                 .Then().MoveTo(new Vector2(100, 100), duration)
                 .Then().MoveTo(new Vector2(100, 0), duration)
                 .Then().MoveTo(Vector2.Zero, duration)
-            );
+                .Loop();
         }
 
         private class MyContextMenuContainer : Container, IHasContextMenu
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
index 947af733ec..ec047d2aa8 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
@@ -112,14 +112,12 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
         {
             double duration = ((HitObject as IHasEndTime)?.EndTime ?? HitObject.StartTime) - HitObject.StartTime;
 
-            using (glow.BeginDelayedSequence(duration))
-                glow.FadeOut(400);
+            glow.Delay(duration).FadeOut(400);
 
             switch (state)
             {
                 case ArmedState.Idle:
-                    using (BeginDelayedSequence(duration + TIME_PREEMPT))
-                        this.FadeOut(TIME_FADEOUT);
+                    this.Delay(duration + TIME_PREEMPT).FadeOut(TIME_FADEOUT);
                     Expire(true);
                     break;
                 case ArmedState.Miss:
@@ -131,23 +129,13 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
                     ApproachCircle.FadeOut(50);
 
                     const double flash_in = 40;
-
-                    flash.FadeTo(0.8f, flash_in);
-                    using (flash.BeginDelayedSequence(flash_in))
-                        flash.FadeOut(100);
-
+                    flash.FadeTo(0.8f, flash_in).Then().FadeOut(100);
                     explode.FadeIn(flash_in);
 
-                    using (BeginDelayedSequence(flash_in, true))
-                    {
-                        //after the flash, we can hide some elements that were behind it
-                        ring.FadeOut();
-                        circle.FadeOut();
-                        number.FadeOut();
-
-                        this.FadeOut(800);
-                        this.ScaleTo(Scale * 1.5f, 400, EasingTypes.OutQuad);
-                    }
+                    ring.Delay(flash_in).FadeOut();
+                    circle.Delay(flash_in).FadeOut();
+                    number.Delay(flash_in).FadeOut();
+                    this.Delay(flash_in).FadeOut(800).ScaleTo(Scale * 1.5f, 400, EasingTypes.OutQuad);
 
                     Expire();
                     break;
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
index 90e1d594e9..4cb5f211e4 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
@@ -147,9 +147,8 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
 
                 var completion = (float)userHits / HitObject.RequiredHits;
 
-                expandingRing.FadeTo(expandingRing.Alpha + MathHelper.Clamp(completion / 16, 0.1f, 0.6f), 50);
-                using (expandingRing.BeginDelayedSequence(50))
-                    expandingRing.FadeTo(completion / 8, 2000, EasingTypes.OutQuint);
+                expandingRing.FadeTo(expandingRing.Alpha + MathHelper.Clamp(completion / 16, 0.1f, 0.6f), 50)
+                    .Then().FadeTo(completion / 8, 2000, EasingTypes.OutQuint);
 
                 symbol.RotateTo((float)(completion * HitObject.Duration / 8), 4000, EasingTypes.OutQuint);
 
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/CirclePiece.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/CirclePiece.cs
index 3f8249f5a9..cd7e70eff3 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/CirclePiece.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/CirclePiece.cs
@@ -166,9 +166,8 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces
 
             double duration = timingPoint.BeatLength * 2;
 
-            background.FadeEdgeEffectTo(1, pre_beat_transition_time, EasingTypes.OutQuint);
-            using (background.BeginDelayedSequence(pre_beat_transition_time))
-                background.FadeEdgeEffectTo(edge_alpha_kiai, duration, EasingTypes.OutQuint);
+            background.FadeEdgeEffectTo(1, pre_beat_transition_time, EasingTypes.OutQuint)
+                .Then().FadeEdgeEffectTo(edge_alpha_kiai, duration, EasingTypes.OutQuint);
         }
     }
 }
\ No newline at end of file
diff --git a/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs b/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs
index 5ce836bbe5..d3d01a5bc8 100644
--- a/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs
+++ b/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs
@@ -86,11 +86,7 @@ namespace osu.Game.Graphics.Cursor
                 this.FadeIn(500, EasingTypes.OutQuint);
             }
 
-            protected override void PopOut()
-            {
-                using (BeginDelayedSequence(150))
-                    this.FadeOut(500, EasingTypes.OutQuint);
-            }
+            protected override void PopOut() => this.Delay(150).FadeOut(500, EasingTypes.OutQuint);
 
             public override void Move(Vector2 pos)
             {
diff --git a/osu.Game/Graphics/UserInterface/StarCounter.cs b/osu.Game/Graphics/UserInterface/StarCounter.cs
index 490ea6e64a..41ecb56db4 100644
--- a/osu.Game/Graphics/UserInterface/StarCounter.cs
+++ b/osu.Game/Graphics/UserInterface/StarCounter.cs
@@ -133,12 +133,8 @@ namespace osu.Game.Graphics.UserInterface
                 star.ClearTransforms(true);
 
                 var delay = (countStars <= newValue ? Math.Max(i - countStars, 0) : Math.Max(countStars - 1 - i, 0)) * animationDelay;
-
-                using (BeginDelayedSequence(delay, true))
-                {
-                    star.FadeTo(i < newValue ? 1.0f : minStarAlpha, fadingDuration);
-                    star.Icon.ScaleTo(getStarScale(i, newValue), scalingDuration, scalingEasing);
-                }
+                star.Delay(delay).FadeTo(i < newValue ? 1.0f : minStarAlpha, fadingDuration);
+                star.Icon.Delay(delay).ScaleTo(getStarScale(i, newValue), scalingDuration, scalingEasing);
 
                 i++;
             }
diff --git a/osu.Game/Graphics/UserInterface/TwoLayerButton.cs b/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
index 5713f5fe27..32903b4eaf 100644
--- a/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
+++ b/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
@@ -245,9 +245,8 @@ namespace osu.Game.Graphics.UserInterface
 
                 if (beatIndex < 0) return;
 
-                icon.ScaleTo(1 - 0.1f * amplitudeAdjust, beat_in_time, EasingTypes.Out);
-                using (icon.BeginDelayedSequence(beat_in_time))
-                    icon.ScaleTo(1, beatLength * 2, EasingTypes.OutQuint);
+                icon.ScaleTo(1 - 0.1f * amplitudeAdjust, beat_in_time, EasingTypes.Out)
+                    .Then().ScaleTo(1, beatLength * 2, EasingTypes.OutQuint);
             }
         }
     }
diff --git a/osu.Game/Overlays/MedalOverlay.cs b/osu.Game/Overlays/MedalOverlay.cs
index fce4604d9d..627e485993 100644
--- a/osu.Game/Overlays/MedalOverlay.cs
+++ b/osu.Game/Overlays/MedalOverlay.cs
@@ -204,25 +204,31 @@ namespace osu.Game.Overlays
 
             using (BeginDelayedSequence(200, true))
             {
-                disc.FadeIn(initial_duration);
+                disc.FadeIn(initial_duration).ScaleTo(1f, initial_duration * 2, EasingTypes.OutElastic);
                 particleContainer.FadeIn(initial_duration);
                 outerSpin.FadeTo(0.1f, initial_duration * 2);
-                disc.ScaleTo(1f, initial_duration * 2, EasingTypes.OutElastic);
 
                 using (BeginDelayedSequence(initial_duration + 200, true))
                 {
                     backgroundStrip.FadeIn(step_duration);
                     leftStrip.ResizeWidthTo(1f, step_duration, EasingTypes.OutQuint);
                     rightStrip.ResizeWidthTo(1f, step_duration, EasingTypes.OutQuint);
-                    Schedule(() => { if (drawableMedal.State != DisplayState.Full) drawableMedal.State = DisplayState.Icon; });
 
-                    using (BeginDelayedSequence(step_duration, true))
+                    this.Animate().Schedule(() =>
                     {
-                        Schedule(() => { if (drawableMedal.State != DisplayState.Full) drawableMedal.State = DisplayState.MedalUnlocked; });
-
-                        using (BeginDelayedSequence(step_duration, true))
-                            Schedule(() => { if (drawableMedal.State != DisplayState.Full) drawableMedal.State = DisplayState.Full; });
-                    }
+                        if (drawableMedal.State != DisplayState.Full)
+                            drawableMedal.State = DisplayState.Icon;
+                    })
+                    .Delay(step_duration).Schedule(() =>
+                    {
+                        if (drawableMedal.State != DisplayState.Full)
+                            drawableMedal.State = DisplayState.MedalUnlocked;
+                    })
+                    .Delay(step_duration).Schedule(() =>
+                    {
+                        if (drawableMedal.State != DisplayState.Full)
+                            drawableMedal.State = DisplayState.Full;
+                    });
                 }
             }
         }
diff --git a/osu.Game/Overlays/MedalSplash/DrawableMedal.cs b/osu.Game/Overlays/MedalSplash/DrawableMedal.cs
index bba58e1a26..166b8e8d41 100644
--- a/osu.Game/Overlays/MedalSplash/DrawableMedal.cs
+++ b/osu.Game/Overlays/MedalSplash/DrawableMedal.cs
@@ -147,20 +147,17 @@ namespace osu.Game.Overlays.MedalSplash
                     medalContainer.ScaleTo(0);
                     break;
                 case DisplayState.Icon:
-                    medalContainer.ScaleTo(1, duration, EasingTypes.OutElastic);
-                    medalContainer.FadeIn(duration);
+                    medalContainer.FadeIn(duration).ScaleTo(1, duration, EasingTypes.OutElastic);
                     break;
                 case DisplayState.MedalUnlocked:
-                    medalContainer.ScaleTo(1);
-                    medalContainer.Show();
+                    medalContainer.FadeTo(1).ScaleTo(1);
 
                     this.ScaleTo(scale_when_unlocked, duration, EasingTypes.OutExpo);
                     this.MoveToY(MedalOverlay.DISC_SIZE / 2 - 30, duration, EasingTypes.OutExpo);
                     unlocked.FadeInFromZero(duration);
                     break;
                 case DisplayState.Full:
-                    medalContainer.ScaleTo(1);
-                    medalContainer.Show();
+                    medalContainer.FadeTo(1).ScaleTo(1);
 
                     this.ScaleTo(scale_when_full, duration, EasingTypes.OutExpo);
                     this.MoveToY(MedalOverlay.DISC_SIZE / 2 - 60, duration, EasingTypes.OutExpo);
diff --git a/osu.Game/Overlays/Mods/ModButton.cs b/osu.Game/Overlays/Mods/ModButton.cs
index aca73d2828..45da537a60 100644
--- a/osu.Game/Overlays/Mods/ModButton.cs
+++ b/osu.Game/Overlays/Mods/ModButton.cs
@@ -81,11 +81,8 @@ namespace osu.Game.Overlays.Mods
                     backgroundIcon.Icon = modAfter.Icon;
                     using (BeginDelayedSequence(mod_switch_duration, true))
                     {
-                        foregroundIcon.RotateTo(-rotate_angle * direction);
-                        foregroundIcon.RotateTo(0f, mod_switch_duration, mod_switch_easing);
-
-                        backgroundIcon.RotateTo(rotate_angle * direction);
-                        backgroundIcon.RotateTo(0f, mod_switch_duration, mod_switch_easing);
+                        foregroundIcon.RotateTo(-rotate_angle * direction).RotateTo(0f, mod_switch_duration, mod_switch_easing);
+                        backgroundIcon.RotateTo(rotate_angle * direction).RotateTo(0f, mod_switch_duration, mod_switch_easing);
 
                         Schedule(() => displayMod(modAfter));
                     }
diff --git a/osu.Game/Overlays/OnScreenDisplay.cs b/osu.Game/Overlays/OnScreenDisplay.cs
index 464c9893d1..93e2cdfbbc 100644
--- a/osu.Game/Overlays/OnScreenDisplay.cs
+++ b/osu.Game/Overlays/OnScreenDisplay.cs
@@ -154,14 +154,11 @@ namespace osu.Game.Overlays
                 textLine2.Text = settingValue;
                 textLine3.Text = shortcut.ToUpper();
 
-                box.FadeIn(500, EasingTypes.OutQuint);
-                box.ResizeHeightTo(height, 500, EasingTypes.OutQuint);
-
-                using (box.BeginDelayedSequence(500))
-                {
-                    box.FadeOutFromOne(1500, EasingTypes.InQuint);
-                    box.ResizeHeightTo(height_contracted, 1500, EasingTypes.InQuint);
-                }
+                box.Animate(
+                    b => b.FadeIn(500, EasingTypes.OutQuint).ResizeHeightTo(height, 500, EasingTypes.OutQuint)
+                ).Then(
+                    b => b.FadeOutFromOne(1500, EasingTypes.InQuint).ResizeHeightTo(height_contracted, 1500, EasingTypes.InQuint)
+                );
 
                 int optionCount = 0;
                 int selectedOption = -1;
diff --git a/osu.Game/Screens/Menu/Button.cs b/osu.Game/Screens/Menu/Button.cs
index aa866574cc..4b5d815c02 100644
--- a/osu.Game/Screens/Menu/Button.cs
+++ b/osu.Game/Screens/Menu/Button.cs
@@ -130,14 +130,11 @@ namespace osu.Game.Screens.Menu
 
             icon.RotateTo(rightward ? 10 : -10, duration * 2, EasingTypes.InOutSine);
 
-            icon.MoveToY(-10, duration, EasingTypes.Out);
-            icon.ScaleTo(Vector2.One, duration, EasingTypes.Out);
-
-            using (icon.BeginDelayedSequence(duration))
-            {
-                icon.MoveToY(0, duration, EasingTypes.In);
-                icon.ScaleTo(new Vector2(1, 0.9f), duration, EasingTypes.In);
-            }
+            icon.Animate(
+                i => i.MoveToY(-10, duration, EasingTypes.Out).ScaleTo(1, duration, EasingTypes.Out)
+            ).Then(
+                i => i.MoveToY(0, duration, EasingTypes.In).ScaleTo(new Vector2(1, 0.9f), duration, EasingTypes.In)
+            );
         }
 
         protected override bool OnHover(InputState state)
diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs
index 24fee10195..e27cf666c0 100644
--- a/osu.Game/Screens/Menu/ButtonSystem.cs
+++ b/osu.Game/Screens/Menu/ButtonSystem.cs
@@ -229,11 +229,7 @@ namespace osu.Game.Screens.Menu
                             buttonAreaBackground.ScaleTo(Vector2.One, 500, EasingTypes.Out);
                             buttonArea.FadeOut(300);
 
-                            using (osuLogo.BeginDelayedSequence(150))
-                            {
-                                osuLogo.MoveTo(Vector2.Zero, 800, EasingTypes.OutExpo);
-                                osuLogo.ScaleTo(1, 800, EasingTypes.OutExpo);
-                            }
+                            osuLogo.Delay(150).ScaleTo(1, 800, EasingTypes.OutExpo).MoveTo(Vector2.Zero, 800, EasingTypes.OutExpo);
 
                             foreach (Button b in buttonsTopLevel)
                                 b.State = ButtonState.Contracted;
diff --git a/osu.Game/Screens/Menu/MenuSideFlashes.cs b/osu.Game/Screens/Menu/MenuSideFlashes.cs
index 065c7c5be0..4b7c2a0e00 100644
--- a/osu.Game/Screens/Menu/MenuSideFlashes.cs
+++ b/osu.Game/Screens/Menu/MenuSideFlashes.cs
@@ -90,9 +90,8 @@ namespace osu.Game.Screens.Menu
 
         private void flash(Drawable d, double beatLength, bool kiai, TrackAmplitudes amplitudes)
         {
-            d.FadeTo(Math.Max(0, ((d.Equals(leftBox) ? amplitudes.LeftChannel : amplitudes.RightChannel) - amplitude_dead_zone) / (kiai ? kiai_multiplier : alpha_multiplier)), box_fade_in_time);
-            using (d.BeginDelayedSequence(box_fade_in_time))
-                d.FadeOut(beatLength, EasingTypes.In);
+            d.FadeTo(Math.Max(0, ((d.Equals(leftBox) ? amplitudes.LeftChannel : amplitudes.RightChannel) - amplitude_dead_zone) / (kiai ? kiai_multiplier : alpha_multiplier)), box_fade_in_time)
+                .Then().FadeOut(beatLength, EasingTypes.In);
         }
     }
 }
diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs
index efbd106cb5..db2bffa079 100644
--- a/osu.Game/Screens/Menu/OsuLogo.cs
+++ b/osu.Game/Screens/Menu/OsuLogo.cs
@@ -237,34 +237,23 @@ namespace osu.Game.Screens.Menu
             if (beatIndex < 0) return;
 
             if (IsHovered)
-            {
-                using (BeginDelayedSequence(early_activation))
-                    Schedule(() => sampleBeat.Play());
-            }
+                this.Delay(early_activation).Schedule(() => sampleBeat.Play());
 
-            logoBeatContainer.ScaleTo(1 - 0.02f * amplitudeAdjust, early_activation, EasingTypes.Out);
-            using (logoBeatContainer.BeginDelayedSequence(early_activation))
-                logoBeatContainer.ScaleTo(1, beatLength * 2, EasingTypes.OutQuint);
+            logoBeatContainer.ScaleTo(1 - 0.02f * amplitudeAdjust, early_activation, EasingTypes.Out)
+                .Then().ScaleTo(1, beatLength * 2, EasingTypes.OutQuint);
 
             ripple.ClearTransforms();
 
-            ripple.ScaleTo(logoAmplitudeContainer.Scale);
-            ripple.Alpha = 0.15f * amplitudeAdjust;
-
-            ripple.ScaleTo(logoAmplitudeContainer.Scale * (1 + 0.04f * amplitudeAdjust), beatLength, EasingTypes.OutQuint);
-            ripple.FadeOut(beatLength, EasingTypes.OutQuint);
+            ripple.ScaleTo(logoAmplitudeContainer.Scale).ScaleTo(logoAmplitudeContainer.Scale * (1 + 0.04f * amplitudeAdjust), beatLength, EasingTypes.OutQuint);
+            ripple.FadeTo(0.15f * amplitudeAdjust).FadeOut(beatLength, EasingTypes.OutQuint);
 
             if (effectPoint.KiaiMode && flashLayer.Alpha < 0.4f)
             {
                 flashLayer.ClearTransforms();
                 visualizer.ClearTransforms();
 
-                flashLayer.FadeTo(0.2f * amplitudeAdjust, early_activation, EasingTypes.Out);
-                visualizer.FadeTo(0.9f * amplitudeAdjust, early_activation, EasingTypes.Out);
-                using (flashLayer.BeginDelayedSequence(early_activation))
-                    flashLayer.FadeOut(beatLength);
-                using (visualizer.BeginDelayedSequence(early_activation))
-                    visualizer.FadeTo(0.5f, beatLength);
+                flashLayer.FadeTo(0.2f * amplitudeAdjust, early_activation, EasingTypes.Out).Then().FadeOut(beatLength);
+                visualizer.FadeTo(0.9f * amplitudeAdjust, early_activation, EasingTypes.Out).Then().FadeTo(0.5f, beatLength);
             }
         }
 
diff --git a/osu.Game/Screens/Play/HUDOverlay.cs b/osu.Game/Screens/Play/HUDOverlay.cs
index 3248495b61..70093a1407 100644
--- a/osu.Game/Screens/Play/HUDOverlay.cs
+++ b/osu.Game/Screens/Play/HUDOverlay.cs
@@ -98,10 +98,7 @@ namespace osu.Game.Screens.Play
 
             // in the case a replay isn't loaded, we want some elements to only appear briefly.
             if (!replayLoaded)
-            {
-                using (ModDisplay.BeginDelayedSequence(2000))
-                    ModDisplay.FadeOut(200);
-            }
+                ModDisplay.Delay(2000).FadeOut(200);
         }
 
         protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index c9ca91faa0..aafe459800 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -272,19 +272,14 @@ namespace osu.Game.Screens.Play
 
             dimLevel.ValueChanged += newDim => Background?.FadeTo(1 - (float)newDim, 800);
 
-            Content.ScaleTo(0.7f);
+            Content.ScaleTo(0.7f).ScaleTo(1, 750, EasingTypes.OutQuint);
+            Content.Delay(250).FadeIn(250);
 
-            using (Content.BeginDelayedSequence(250))
-                Content.FadeIn(250);
-
-            Content.ScaleTo(1, 750, EasingTypes.OutQuint);
-
-            using (BeginDelayedSequence(750))
-                Schedule(() =>
-                {
-                    if (!pauseContainer.IsPaused)
-                        decoupledClock.Start();
-                });
+            this.Delay(750).Schedule(() =>
+            {
+                if (!pauseContainer.IsPaused)
+                    decoupledClock.Start();
+            });
 
             pauseContainer.Alpha = 0;
             pauseContainer.FadeIn(750, EasingTypes.OutQuint);
diff --git a/osu.Game/Screens/Ranking/Results.cs b/osu.Game/Screens/Ranking/Results.cs
index 636851e14d..34e9cd186f 100644
--- a/osu.Game/Screens/Ranking/Results.cs
+++ b/osu.Game/Screens/Ranking/Results.cs
@@ -67,20 +67,16 @@ namespace osu.Game.Screens.Ranking
             modeChangeButtons.FadeOut();
             currentPage.FadeOut();
 
-            circleOuterBackground.ScaleTo(1, transition_time, EasingTypes.OutQuint);
-            circleOuterBackground.FadeTo(1, transition_time, EasingTypes.OutQuint);
+            circleOuterBackground.FadeIn(transition_time, EasingTypes.OutQuint).ScaleTo(1, transition_time, EasingTypes.OutQuint);
 
             using (BeginDelayedSequence(transition_time * 0.25f, true))
             {
-                circleOuter.ScaleTo(1, transition_time, EasingTypes.OutQuint);
-                circleOuter.FadeTo(1, transition_time, EasingTypes.OutQuint);
+                circleOuter.FadeIn(transition_time, EasingTypes.OutQuint).ScaleTo(1, transition_time, EasingTypes.OutQuint);
 
                 using (BeginDelayedSequence(transition_time * 0.3f, true))
                 {
                     backgroundParallax.FadeIn(transition_time, EasingTypes.OutQuint);
-
-                    circleInner.ScaleTo(1, transition_time, EasingTypes.OutQuint);
-                    circleInner.FadeTo(1, transition_time, EasingTypes.OutQuint);
+                    circleInner.FadeIn(transition_time, EasingTypes.OutQuint).ScaleTo(1, transition_time, EasingTypes.OutQuint);
 
                     using (BeginDelayedSequence(transition_time * 0.4f, true))
                     {

From 032e9df67bda26d6120511b2490d057dafbbb058 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sun, 16 Jul 2017 17:47:29 +0300
Subject: [PATCH 08/30] ApplyDelay -> AddDelay

---
 osu-framework                                          |  2 +-
 .../Tests/TestCaseNotificationManager.cs               |  2 +-
 .../Tests/TestCaseTaikoPlayfield.cs                    |  2 +-
 .../Drawables/Connections/FollowPointRenderer.cs       |  2 +-
 .../Objects/Drawables/DrawableSlider.cs                |  2 +-
 .../Objects/Drawables/DrawableSliderTick.cs            |  6 +++---
 .../Objects/Drawables/DrawableSpinner.cs               |  4 ++--
 .../Objects/Drawables/Pieces/SpinnerDisc.cs            |  2 +-
 .../Objects/Drawables/DrawableBarLine.cs               |  2 +-
 .../Objects/Drawables/DrawableHit.cs                   |  6 +++---
 .../Objects/Drawables/DrawableSwell.cs                 |  6 +++---
 osu.Game.Rulesets.Taiko/UI/InputDrum.cs                |  4 ++--
 osu.Game/Graphics/UserInterface/DialogButton.cs        |  2 +-
 .../Graphics/UserInterface/Volume/VolumeControl.cs     |  2 +-
 osu.Game/OsuGame.cs                                    |  2 +-
 osu.Game/Overlays/DialogOverlay.cs                     |  2 +-
 .../Overlays/Notifications/ProgressNotification.cs     |  2 +-
 osu.Game/Rulesets/Judgements/DrawableJudgement.cs      |  4 ++--
 osu.Game/Screens/Menu/Disclaimer.cs                    |  6 +++---
 osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs     |  2 +-
 osu.Game/Screens/Play/PauseContainer.cs                |  2 +-
 osu.Game/Screens/Play/PlayerLoader.cs                  | 10 +++++-----
 osu.Game/Screens/Ranking/ResultsPage.cs                |  2 +-
 osu.Game/Screens/Ranking/ResultsPageScore.cs           |  2 +-
 osu.Game/Screens/ScreenWhiteBox.cs                     |  2 +-
 osu.Game/Screens/Select/Leaderboards/Leaderboard.cs    |  2 +-
 .../Screens/Select/Leaderboards/LeaderboardScore.cs    |  6 +++---
 27 files changed, 44 insertions(+), 44 deletions(-)

diff --git a/osu-framework b/osu-framework
index c2a20bd8b3..23f971f90e 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit c2a20bd8b31144c6d196ab6ae0e8858acabbe032
+Subproject commit 23f971f90eef75108932c961738bec93a0627e1c
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseNotificationManager.cs b/osu.Desktop.VisualTests/Tests/TestCaseNotificationManager.cs
index 4d9a0fe9a2..837545b114 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseNotificationManager.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseNotificationManager.cs
@@ -57,7 +57,7 @@ namespace osu.Desktop.VisualTests.Tests
 
             if (remaining > 0)
             {
-                ApplyDelay(80);
+                AddDelay(80);
                 Schedule(() => sendBarrage(remaining - 1));
             }
         }
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs b/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
index 46ad7acb52..434689641f 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
@@ -84,7 +84,7 @@ namespace osu.Desktop.VisualTests.Tests
                     break;
                 case 5:
                     addSwell(1000);
-                    playfieldContainer.ApplyDelay(scroll_time - 100);
+                    playfieldContainer.AddDelay(scroll_time - 100);
                     break;
             }
 
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs
index 3a32d9765e..be901a5748 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs
@@ -98,7 +98,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Connections
 
                             fp.MoveTo(pointEndPosition, DrawableOsuHitObject.TIME_FADEIN, EasingTypes.Out);
 
-                            fp.ApplyDelay(fadeOutTime - fadeInTime);
+                            fp.AddDelay(fadeOutTime - fadeInTime);
                             fp.FadeOut(DrawableOsuHitObject.TIME_FADEIN);
                         }
 
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
index 63721dee4f..0d2b200c76 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
@@ -158,7 +158,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
         {
             ball.FadeIn();
 
-            ApplyDelay(slider.Duration, true);
+            AddDelay(slider.Duration, true);
 
             body.FadeOut(160);
             ball.FadeOut(160);
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
index d0e141db6c..92c7ff6f2a 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
@@ -66,10 +66,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             this.ScaleTo(1.2f, animIn);
             this.FadeIn(animIn);
 
-            ApplyDelay(animIn);
+            AddDelay(animIn);
             this.ScaleTo(1, 150, EasingTypes.Out);
 
-            ApplyDelay(-animIn);
+            AddDelay(-animIn);
         }
 
         protected override void UpdateCurrentState(ArmedState state)
@@ -77,7 +77,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             switch (state)
             {
                 case ArmedState.Idle:
-                    ApplyDelay(FadeOutTime - sliderTick.StartTime);
+                    AddDelay(FadeOutTime - sliderTick.StartTime);
                     this.FadeOut();
                     break;
                 case ArmedState.Miss:
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index 0bb2f718d3..d7fe0e32bf 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -192,13 +192,13 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             mainContainer.ScaleTo(0);
             mainContainer.ScaleTo(spinner.Scale * circle.DrawHeight / DrawHeight * 1.4f, TIME_PREEMPT - 150, EasingTypes.OutQuint);
 
-            mainContainer.ApplyDelay(TIME_PREEMPT - 150);
+            mainContainer.AddDelay(TIME_PREEMPT - 150);
             mainContainer.ScaleTo(1, 500, EasingTypes.OutQuint);
         }
 
         protected override void UpdateCurrentState(ArmedState state)
         {
-            ApplyDelay(spinner.Duration, true);
+            AddDelay(spinner.Duration, true);
 
             this.FadeOut(160);
 
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
index ee2ecfa8b1..d0f953ea1f 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
@@ -129,7 +129,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
             {
                 background.Flush(false, nameof(Alpha));
                 background.FadeTo(tracking_alpha + 0.2f, 60, EasingTypes.OutExpo);
-                background.ApplyDelay(60);
+                background.AddDelay(60);
                 background.FadeTo(tracking_alpha, 250, EasingTypes.OutQuint);
             }
 
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs
index bd713ec8b7..3b5ecf244d 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs
@@ -64,7 +64,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
         protected override void LoadComplete()
         {
             base.LoadComplete();
-            ApplyDelay(BarLine.StartTime - Time.Current);
+            AddDelay(BarLine.StartTime - Time.Current);
             this.FadeOut(base_fadeout_time * BarLine.ScrollTime / 1000);
         }
 
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
index 31e92e4c70..2e8f9d945b 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
@@ -65,7 +65,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
 
         protected override void UpdateState(ArmedState state)
         {
-            ApplyDelay(HitObject.StartTime - Time.Current + Judgement.TimeOffset, true);
+            AddDelay(HitObject.StartTime - Time.Current + Judgement.TimeOffset, true);
 
             var circlePiece = MainPiece as CirclePiece;
 
@@ -74,7 +74,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
             switch (State)
             {
                 case ArmedState.Idle:
-                    ApplyDelay(HitObject.HitWindowMiss);
+                    AddDelay(HitObject.HitWindowMiss);
                     break;
                 case ArmedState.Miss:
                     this.FadeOut(100);
@@ -98,7 +98,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
                     Content.ScaleTo(0.8f, gravity_time * 2, EasingTypes.OutQuad);
 
                     this.MoveToY(-gravity_travel_height, gravity_time, EasingTypes.Out);
-                    ApplyDelay(gravity_time, true);
+                    AddDelay(gravity_time, true);
                     this.MoveToY(gravity_travel_height * 2, gravity_time * 2, EasingTypes.In);
                     break;
             }
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
index 4cb5f211e4..5f989579a2 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
@@ -180,13 +180,13 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
         {
             const float preempt = 100;
 
-            ApplyDelay(HitObject.StartTime - Time.Current - preempt, true);
+            AddDelay(HitObject.StartTime - Time.Current - preempt, true);
 
             targetRing.ScaleTo(target_ring_scale, preempt * 4, EasingTypes.OutQuint);
 
-            ApplyDelay(preempt, true);
+            AddDelay(preempt, true);
 
-            ApplyDelay(Judgement.TimeOffset + HitObject.Duration, true);
+            AddDelay(Judgement.TimeOffset + HitObject.Duration, true);
 
             const float out_transition_time = 300;
 
diff --git a/osu.Game.Rulesets.Taiko/UI/InputDrum.cs b/osu.Game.Rulesets.Taiko/UI/InputDrum.cs
index 279092424b..737f5d344e 100644
--- a/osu.Game.Rulesets.Taiko/UI/InputDrum.cs
+++ b/osu.Game.Rulesets.Taiko/UI/InputDrum.cs
@@ -150,12 +150,12 @@ namespace osu.Game.Rulesets.Taiko.UI
                     const float up_time = 1000;
 
                     back.ScaleTo(target.Scale.X - scale_amount, down_time, EasingTypes.OutQuint);
-                    back.ApplyDelay(down_time);
+                    back.AddDelay(down_time);
                     back.ScaleTo(1, up_time, EasingTypes.OutQuint);
 
                     target.ScaleTo(target.Scale.X - scale_amount, down_time, EasingTypes.OutQuint);
                     target.FadeTo(Math.Min(target.Alpha + alpha_amount, 1), down_time, EasingTypes.OutQuint);
-                    target.ApplyDelay(down_time);
+                    target.AddDelay(down_time);
                     target.ScaleTo(1, up_time, EasingTypes.OutQuint);
                     target.FadeOut(up_time, EasingTypes.OutQuint);
                 }
diff --git a/osu.Game/Graphics/UserInterface/DialogButton.cs b/osu.Game/Graphics/UserInterface/DialogButton.cs
index bb85c9681d..67202c9e0d 100644
--- a/osu.Game/Graphics/UserInterface/DialogButton.cs
+++ b/osu.Game/Graphics/UserInterface/DialogButton.cs
@@ -99,7 +99,7 @@ namespace osu.Game.Graphics.UserInterface
             colourContainer.ResizeTo(new Vector2(1.5f, 1f), click_duration, EasingTypes.In);
             flash();
 
-            ApplyDelay(click_duration);
+            AddDelay(click_duration);
             Schedule(delegate {
                 colourContainer.ResizeTo(new Vector2(0.8f, 1f));
                 spriteText.Spacing = Vector2.Zero;
diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs
index 19af0991f5..8c5347bd23 100644
--- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs
+++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs
@@ -106,7 +106,7 @@ namespace osu.Game.Graphics.UserInterface.Volume
         private void schedulePopOut()
         {
             popOutDelegate?.Cancel();
-            ApplyDelay(1000);
+            AddDelay(1000);
             popOutDelegate = Schedule(Hide);
         }
     }
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 7f9ddb685d..e45f030fd1 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -119,7 +119,7 @@ namespace osu.Game
             if (!menu.IsCurrentScreen)
             {
                 menu.MakeCurrent();
-                ApplyDelay(500);
+                AddDelay(500);
                 scoreLoad = Schedule(() => LoadScore(s));
                 return;
             }
diff --git a/osu.Game/Overlays/DialogOverlay.cs b/osu.Game/Overlays/DialogOverlay.cs
index 5580287276..c558ac5933 100644
--- a/osu.Game/Overlays/DialogOverlay.cs
+++ b/osu.Game/Overlays/DialogOverlay.cs
@@ -35,7 +35,7 @@ namespace osu.Game.Overlays
             if (v != Visibility.Hidden) return;
 
             //handle the dialog being dismissed.
-            dialog.ApplyDelay(PopupDialog.EXIT_DURATION);
+            dialog.AddDelay(PopupDialog.EXIT_DURATION);
             dialog.Expire();
 
             if (dialog == currentDialog)
diff --git a/osu.Game/Overlays/Notifications/ProgressNotification.cs b/osu.Game/Overlays/Notifications/ProgressNotification.cs
index 1d76990859..098088191f 100644
--- a/osu.Game/Overlays/Notifications/ProgressNotification.cs
+++ b/osu.Game/Overlays/Notifications/ProgressNotification.cs
@@ -80,7 +80,7 @@ namespace osu.Game.Overlays.Notifications
                             NotificationContent.MoveToY(-DrawSize.Y / 2, 200, EasingTypes.OutQuint);
                             this.FadeTo(0.01f, 200); //don't completely fade out or our scheduled task won't run.
 
-                            ApplyDelay(100);
+                            AddDelay(100);
                             Schedule(Completed);
                             break;
                     }
diff --git a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
index d5075ec400..5d471cb700 100644
--- a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
+++ b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
@@ -75,14 +75,14 @@ namespace osu.Game.Rulesets.Judgements
                     this.MoveToOffset(new Vector2(0, 100), 800, EasingTypes.InQuint);
                     this.RotateTo(40, 800, EasingTypes.InQuint);
 
-                    ApplyDelay(600);
+                    AddDelay(600);
                     this.FadeOut(200);
                     break;
                 case HitResult.Hit:
                     this.ScaleTo(0.9f);
                     this.ScaleTo(1, 500, EasingTypes.OutElastic);
 
-                    ApplyDelay(100);
+                    AddDelay(100);
                     this.FadeOut(400);
                     break;
             }
diff --git a/osu.Game/Screens/Menu/Disclaimer.cs b/osu.Game/Screens/Menu/Disclaimer.cs
index 718fe5d8be..908b64a3aa 100644
--- a/osu.Game/Screens/Menu/Disclaimer.cs
+++ b/osu.Game/Screens/Menu/Disclaimer.cs
@@ -100,14 +100,14 @@ namespace osu.Game.Screens.Menu
 
             Content.FadeInFromZero(500);
 
-            icon.ApplyDelay(1500);
+            icon.AddDelay(1500);
             icon.FadeColour(iconColour, 200);
 
-            ApplyDelay(6000, true);
+            AddDelay(6000, true);
 
             Content.FadeOut(250);
 
-            ApplyDelay(250);
+            AddDelay(250);
 
             Schedule(() => Push(intro));
         }
diff --git a/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs b/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs
index a5c4f262f8..229c05859f 100644
--- a/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs
+++ b/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs
@@ -98,7 +98,7 @@ namespace osu.Game.Screens.Play.HUD
                 return;
 
             fill.FadeEdgeEffectTo(Math.Min(1, fill.EdgeEffect.Colour.Linear.A + (1f - base_glow_opacity) / glow_max_hits), 50, EasingTypes.OutQuint);
-            fill.ApplyDelay(glow_fade_delay);
+            fill.AddDelay(glow_fade_delay);
             fill.FadeEdgeEffectTo(base_glow_opacity, glow_fade_time, EasingTypes.OutQuint);
         }
 
diff --git a/osu.Game/Screens/Play/PauseContainer.cs b/osu.Game/Screens/Play/PauseContainer.cs
index 7a257a4b6d..6683ba8fd5 100644
--- a/osu.Game/Screens/Play/PauseContainer.cs
+++ b/osu.Game/Screens/Play/PauseContainer.cs
@@ -58,7 +58,7 @@ namespace osu.Game.Screens.Play
             {
                 OnResume = delegate
                 {
-                    ApplyDelay(400);
+                    AddDelay(400);
                     Schedule(Resume);
                 },
                 OnRetry = () => OnRetry(),
diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs
index ba92fb095d..50287ebe7d 100644
--- a/osu.Game/Screens/Play/PlayerLoader.cs
+++ b/osu.Game/Screens/Play/PlayerLoader.cs
@@ -77,7 +77,7 @@ namespace osu.Game.Screens.Play
                 Beatmap = player.Beatmap,
             });
 
-            ApplyDelay(400);
+            AddDelay(400);
 
             Schedule(pushWhenLoaded);
         }
@@ -104,14 +104,14 @@ namespace osu.Game.Screens.Play
 
             contentIn();
 
-            ApplyDelay(500, true);
+            AddDelay(500, true);
 
             logo.MoveToOffset(new Vector2(0, -180), 500, EasingTypes.InOutExpo);
-            ApplyDelay(250, true);
+            AddDelay(250, true);
 
             info.FadeIn(500);
 
-            ApplyDelay(1400, true);
+            AddDelay(1400, true);
 
             Schedule(pushWhenLoaded);
         }
@@ -123,7 +123,7 @@ namespace osu.Game.Screens.Play
 
             contentOut();
 
-            ApplyDelay(250);
+            AddDelay(250);
 
             Schedule(() =>
             {
diff --git a/osu.Game/Screens/Ranking/ResultsPage.cs b/osu.Game/Screens/Ranking/ResultsPage.cs
index 55e71cfcc4..b88e993886 100644
--- a/osu.Game/Screens/Ranking/ResultsPage.cs
+++ b/osu.Game/Screens/Ranking/ResultsPage.cs
@@ -33,7 +33,7 @@ namespace osu.Game.Screens.Ranking
         protected override void LoadComplete()
         {
             base.LoadComplete();
-            fill.ApplyDelay(400);
+            fill.AddDelay(400);
             fill.FadeInFromZero(600);
         }
 
diff --git a/osu.Game/Screens/Ranking/ResultsPageScore.cs b/osu.Game/Screens/Ranking/ResultsPageScore.cs
index 6f96ef500e..4e3458e522 100644
--- a/osu.Game/Screens/Ranking/ResultsPageScore.cs
+++ b/osu.Game/Screens/Ranking/ResultsPageScore.cs
@@ -179,7 +179,7 @@ namespace osu.Game.Screens.Ranking
                 foreach (var s in statisticsContainer.Children)
                 {
                     s.FadeOut();
-                    s.ApplyDelay(delay += 200);
+                    s.AddDelay(delay += 200);
                     s.FadeIn(300 + delay, EasingTypes.Out);
                 }
             });
diff --git a/osu.Game/Screens/ScreenWhiteBox.cs b/osu.Game/Screens/ScreenWhiteBox.cs
index e6c25ff6f4..2ec721f0c0 100644
--- a/osu.Game/Screens/ScreenWhiteBox.cs
+++ b/osu.Game/Screens/ScreenWhiteBox.cs
@@ -44,7 +44,7 @@ namespace osu.Game.Screens
             boxContainer.ScaleTo(0.2f);
             boxContainer.RotateTo(-20);
 
-            Content.ApplyDelay(300, true);
+            Content.AddDelay(300, true);
 
             boxContainer.ScaleTo(1, transition_time, EasingTypes.OutElastic);
             boxContainer.RotateTo(0, transition_time / 2, EasingTypes.OutQuint);
diff --git a/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs b/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
index dcf39a7880..4a00ef71a0 100644
--- a/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
+++ b/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
@@ -63,7 +63,7 @@ namespace osu.Game.Screens.Select.Leaderboards
                     };
                     scrollFlow.Add(ls);
 
-                    ls.ApplyDelay(i++ * 50, true);
+                    ls.AddDelay(i++ * 50, true);
                     ls.Show();
                 }
 
diff --git a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
index 02d6833d3f..3867d4e379 100644
--- a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
+++ b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
@@ -64,18 +64,18 @@ namespace osu.Game.Screens.Select.Leaderboards
                         this.FadeIn(200);
                         content.MoveToY(0, 800, EasingTypes.OutQuint);
 
-                        ApplyDelay(100, true);
+                        AddDelay(100, true);
                         avatar.FadeIn(300, EasingTypes.OutQuint);
                         nameLabel.FadeIn(350, EasingTypes.OutQuint);
 
                         avatar.MoveToX(0, 300, EasingTypes.OutQuint);
                         nameLabel.MoveToX(0, 350, EasingTypes.OutQuint);
 
-                        ApplyDelay(250, true);
+                        AddDelay(250, true);
                         scoreLabel.FadeIn(200);
                         scoreRank.FadeIn(200);
 
-                        ApplyDelay(50, true);
+                        AddDelay(50, true);
                         var drawables = new Drawable[] { flagBadgeContainer, maxCombo, accuracy, modsContainer, };
 
                         for (int i = 0; i < drawables.Length; i++)

From e6916ec57b0834c392e2b61123e3836a8904eafd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sun, 16 Jul 2017 17:48:47 +0300
Subject: [PATCH 09/30] Update framework

---
 osu-framework | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/osu-framework b/osu-framework
index 23f971f90e..a3ed5b642f 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 23f971f90eef75108932c961738bec93a0627e1c
+Subproject commit a3ed5b642fcce039483801ca01fdbbf9117cec15

From 19fb03e73763cdfda42a5dafe5d39c153b11e6a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sun, 16 Jul 2017 18:28:20 +0300
Subject: [PATCH 10/30] Try different formatting style

---
 .../Tests/TestCaseContextMenu.cs              | 12 ++++-----
 .../Objects/Drawables/DrawableHitCircle.cs    | 19 ++++++++++----
 .../Objects/Drawables/DrawableSwell.cs        |  6 +++--
 .../Objects/Drawables/Pieces/CirclePiece.cs   |  6 +++--
 .../Graphics/UserInterface/TwoLayerButton.cs  |  3 ++-
 osu.Game/Overlays/MedalOverlay.cs             |  4 ++-
 .../Overlays/MedalSplash/DrawableMedal.cs     | 12 ++++++---
 osu.Game/Overlays/Mods/ModButton.cs           |  9 +++++--
 osu.Game/Overlays/OnScreenDisplay.cs          |  6 +++--
 osu.Game/Screens/Menu/Button.cs               |  6 +++--
 osu.Game/Screens/Menu/ButtonSystem.cs         |  4 ++-
 osu.Game/Screens/Menu/MenuSideFlashes.cs      |  3 ++-
 osu.Game/Screens/Menu/OsuLogo.cs              | 25 +++++++++++++------
 osu.Game/Screens/Play/Player.cs               |  7 ++++--
 osu.Game/Screens/Ranking/Results.cs           | 13 +++++++---
 15 files changed, 94 insertions(+), 41 deletions(-)

diff --git a/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs b/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
index d89397e793..bf8f9bf7f4 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
@@ -60,12 +60,12 @@ namespace osu.Desktop.VisualTests.Tests
             base.LoadComplete();
 
             // Move box along a square trajectory
-            container
-                .MoveTo(new Vector2(0, 100), duration)
-                .Then().MoveTo(new Vector2(100, 100), duration)
-                .Then().MoveTo(new Vector2(100, 0), duration)
-                .Then().MoveTo(Vector2.Zero, duration)
-                .Loop();
+            container.Loop(c => c
+                .MoveTo(new Vector2(0, 100), duration).Then()
+                .MoveTo(new Vector2(100, 100), duration).Then()
+                .MoveTo(new Vector2(100, 0), duration).Then()
+                .MoveTo(Vector2.Zero, duration)
+            );
         }
 
         private class MyContextMenuContainer : Container, IHasContextMenu
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
index ec047d2aa8..a890a0cdb4 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
@@ -129,13 +129,22 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
                     ApproachCircle.FadeOut(50);
 
                     const double flash_in = 40;
-                    flash.FadeTo(0.8f, flash_in).Then().FadeOut(100);
+                    flash.FadeTo(0.8f, flash_in)
+                         .Then()
+                         .FadeOut(100);
+
                     explode.FadeIn(flash_in);
 
-                    ring.Delay(flash_in).FadeOut();
-                    circle.Delay(flash_in).FadeOut();
-                    number.Delay(flash_in).FadeOut();
-                    this.Delay(flash_in).FadeOut(800).ScaleTo(Scale * 1.5f, 400, EasingTypes.OutQuad);
+                    using (BeginDelayedSequence(flash_in, true))
+                    {
+                        //after the flash, we can hide some elements that were behind it
+                        ring.FadeOut();
+                        circle.FadeOut();
+                        number.FadeOut();
+
+                        this.FadeOut(800)
+                            .ScaleTo(Scale * 1.5f, 400, EasingTypes.OutQuad);
+                    }
 
                     Expire();
                     break;
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
index 5f989579a2..363dcae883 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
@@ -147,8 +147,10 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
 
                 var completion = (float)userHits / HitObject.RequiredHits;
 
-                expandingRing.FadeTo(expandingRing.Alpha + MathHelper.Clamp(completion / 16, 0.1f, 0.6f), 50)
-                    .Then().FadeTo(completion / 8, 2000, EasingTypes.OutQuint);
+                expandingRing
+                    .FadeTo(expandingRing.Alpha + MathHelper.Clamp(completion / 16, 0.1f, 0.6f), 50)
+                    .Then()
+                    .FadeTo(completion / 8, 2000, EasingTypes.OutQuint);
 
                 symbol.RotateTo((float)(completion * HitObject.Duration / 8), 4000, EasingTypes.OutQuint);
 
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/CirclePiece.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/CirclePiece.cs
index cd7e70eff3..a4cd026e4c 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/CirclePiece.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/CirclePiece.cs
@@ -166,8 +166,10 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces
 
             double duration = timingPoint.BeatLength * 2;
 
-            background.FadeEdgeEffectTo(1, pre_beat_transition_time, EasingTypes.OutQuint)
-                .Then().FadeEdgeEffectTo(edge_alpha_kiai, duration, EasingTypes.OutQuint);
+            background
+                .FadeEdgeEffectTo(1, pre_beat_transition_time, EasingTypes.OutQuint)
+                .Then()
+                .FadeEdgeEffectTo(edge_alpha_kiai, duration, EasingTypes.OutQuint);
         }
     }
 }
\ No newline at end of file
diff --git a/osu.Game/Graphics/UserInterface/TwoLayerButton.cs b/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
index 32903b4eaf..b763cd7971 100644
--- a/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
+++ b/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
@@ -246,7 +246,8 @@ namespace osu.Game.Graphics.UserInterface
                 if (beatIndex < 0) return;
 
                 icon.ScaleTo(1 - 0.1f * amplitudeAdjust, beat_in_time, EasingTypes.Out)
-                    .Then().ScaleTo(1, beatLength * 2, EasingTypes.OutQuint);
+                    .Then()
+                    .ScaleTo(1, beatLength * 2, EasingTypes.OutQuint);
             }
         }
     }
diff --git a/osu.Game/Overlays/MedalOverlay.cs b/osu.Game/Overlays/MedalOverlay.cs
index 627e485993..c3825e32b8 100644
--- a/osu.Game/Overlays/MedalOverlay.cs
+++ b/osu.Game/Overlays/MedalOverlay.cs
@@ -204,7 +204,9 @@ namespace osu.Game.Overlays
 
             using (BeginDelayedSequence(200, true))
             {
-                disc.FadeIn(initial_duration).ScaleTo(1f, initial_duration * 2, EasingTypes.OutElastic);
+                disc.FadeIn(initial_duration)
+                    .ScaleTo(1f, initial_duration * 2, EasingTypes.OutElastic);
+
                 particleContainer.FadeIn(initial_duration);
                 outerSpin.FadeTo(0.1f, initial_duration * 2);
 
diff --git a/osu.Game/Overlays/MedalSplash/DrawableMedal.cs b/osu.Game/Overlays/MedalSplash/DrawableMedal.cs
index 166b8e8d41..89e991f5ef 100644
--- a/osu.Game/Overlays/MedalSplash/DrawableMedal.cs
+++ b/osu.Game/Overlays/MedalSplash/DrawableMedal.cs
@@ -147,17 +147,23 @@ namespace osu.Game.Overlays.MedalSplash
                     medalContainer.ScaleTo(0);
                     break;
                 case DisplayState.Icon:
-                    medalContainer.FadeIn(duration).ScaleTo(1, duration, EasingTypes.OutElastic);
+                    medalContainer
+                        .FadeIn(duration)
+                        .ScaleTo(1, duration, EasingTypes.OutElastic);
                     break;
                 case DisplayState.MedalUnlocked:
-                    medalContainer.FadeTo(1).ScaleTo(1);
+                    medalContainer
+                        .FadeTo(1)
+                        .ScaleTo(1);
 
                     this.ScaleTo(scale_when_unlocked, duration, EasingTypes.OutExpo);
                     this.MoveToY(MedalOverlay.DISC_SIZE / 2 - 30, duration, EasingTypes.OutExpo);
                     unlocked.FadeInFromZero(duration);
                     break;
                 case DisplayState.Full:
-                    medalContainer.FadeTo(1).ScaleTo(1);
+                    medalContainer
+                        .FadeTo(1)
+                        .ScaleTo(1);
 
                     this.ScaleTo(scale_when_full, duration, EasingTypes.OutExpo);
                     this.MoveToY(MedalOverlay.DISC_SIZE / 2 - 60, duration, EasingTypes.OutExpo);
diff --git a/osu.Game/Overlays/Mods/ModButton.cs b/osu.Game/Overlays/Mods/ModButton.cs
index 45da537a60..bea0aae57e 100644
--- a/osu.Game/Overlays/Mods/ModButton.cs
+++ b/osu.Game/Overlays/Mods/ModButton.cs
@@ -81,8 +81,13 @@ namespace osu.Game.Overlays.Mods
                     backgroundIcon.Icon = modAfter.Icon;
                     using (BeginDelayedSequence(mod_switch_duration, true))
                     {
-                        foregroundIcon.RotateTo(-rotate_angle * direction).RotateTo(0f, mod_switch_duration, mod_switch_easing);
-                        backgroundIcon.RotateTo(rotate_angle * direction).RotateTo(0f, mod_switch_duration, mod_switch_easing);
+                        foregroundIcon
+                            .RotateTo(-rotate_angle * direction)
+                            .RotateTo(0f, mod_switch_duration, mod_switch_easing);
+
+                        backgroundIcon
+                            .RotateTo(rotate_angle * direction)
+                            .RotateTo(0f, mod_switch_duration, mod_switch_easing);
 
                         Schedule(() => displayMod(modAfter));
                     }
diff --git a/osu.Game/Overlays/OnScreenDisplay.cs b/osu.Game/Overlays/OnScreenDisplay.cs
index 93e2cdfbbc..e6a55800ef 100644
--- a/osu.Game/Overlays/OnScreenDisplay.cs
+++ b/osu.Game/Overlays/OnScreenDisplay.cs
@@ -155,9 +155,11 @@ namespace osu.Game.Overlays
                 textLine3.Text = shortcut.ToUpper();
 
                 box.Animate(
-                    b => b.FadeIn(500, EasingTypes.OutQuint).ResizeHeightTo(height, 500, EasingTypes.OutQuint)
+                    b => b.FadeIn(500, EasingTypes.OutQuint),
+                    b => b.ResizeHeightTo(height, 500, EasingTypes.OutQuint)
                 ).Then(
-                    b => b.FadeOutFromOne(1500, EasingTypes.InQuint).ResizeHeightTo(height_contracted, 1500, EasingTypes.InQuint)
+                    b => b.FadeOutFromOne(1500, EasingTypes.InQuint),
+                    b => b.ResizeHeightTo(height_contracted, 1500, EasingTypes.InQuint)
                 );
 
                 int optionCount = 0;
diff --git a/osu.Game/Screens/Menu/Button.cs b/osu.Game/Screens/Menu/Button.cs
index 4b5d815c02..e04e3ce66b 100644
--- a/osu.Game/Screens/Menu/Button.cs
+++ b/osu.Game/Screens/Menu/Button.cs
@@ -131,9 +131,11 @@ namespace osu.Game.Screens.Menu
             icon.RotateTo(rightward ? 10 : -10, duration * 2, EasingTypes.InOutSine);
 
             icon.Animate(
-                i => i.MoveToY(-10, duration, EasingTypes.Out).ScaleTo(1, duration, EasingTypes.Out)
+                i => i.MoveToY(-10, duration, EasingTypes.Out),
+                i => i.ScaleTo(1, duration, EasingTypes.Out)
             ).Then(
-                i => i.MoveToY(0, duration, EasingTypes.In).ScaleTo(new Vector2(1, 0.9f), duration, EasingTypes.In)
+                i => i.MoveToY(0, duration, EasingTypes.In),
+                i => i.ScaleTo(new Vector2(1, 0.9f), duration, EasingTypes.In)
             );
         }
 
diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs
index e27cf666c0..87f8e32abd 100644
--- a/osu.Game/Screens/Menu/ButtonSystem.cs
+++ b/osu.Game/Screens/Menu/ButtonSystem.cs
@@ -229,7 +229,9 @@ namespace osu.Game.Screens.Menu
                             buttonAreaBackground.ScaleTo(Vector2.One, 500, EasingTypes.Out);
                             buttonArea.FadeOut(300);
 
-                            osuLogo.Delay(150).ScaleTo(1, 800, EasingTypes.OutExpo).MoveTo(Vector2.Zero, 800, EasingTypes.OutExpo);
+                            osuLogo.Delay(150)
+                                .ScaleTo(1, 800, EasingTypes.OutExpo)
+                                .MoveTo(Vector2.Zero, 800, EasingTypes.OutExpo);
 
                             foreach (Button b in buttonsTopLevel)
                                 b.State = ButtonState.Contracted;
diff --git a/osu.Game/Screens/Menu/MenuSideFlashes.cs b/osu.Game/Screens/Menu/MenuSideFlashes.cs
index 4b7c2a0e00..fdacccd913 100644
--- a/osu.Game/Screens/Menu/MenuSideFlashes.cs
+++ b/osu.Game/Screens/Menu/MenuSideFlashes.cs
@@ -91,7 +91,8 @@ namespace osu.Game.Screens.Menu
         private void flash(Drawable d, double beatLength, bool kiai, TrackAmplitudes amplitudes)
         {
             d.FadeTo(Math.Max(0, ((d.Equals(leftBox) ? amplitudes.LeftChannel : amplitudes.RightChannel) - amplitude_dead_zone) / (kiai ? kiai_multiplier : alpha_multiplier)), box_fade_in_time)
-                .Then().FadeOut(beatLength, EasingTypes.In);
+             .Then()
+             .FadeOut(beatLength, EasingTypes.In);
         }
     }
 }
diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs
index db2bffa079..c5d4cbb9b1 100644
--- a/osu.Game/Screens/Menu/OsuLogo.cs
+++ b/osu.Game/Screens/Menu/OsuLogo.cs
@@ -239,21 +239,30 @@ namespace osu.Game.Screens.Menu
             if (IsHovered)
                 this.Delay(early_activation).Schedule(() => sampleBeat.Play());
 
-            logoBeatContainer.ScaleTo(1 - 0.02f * amplitudeAdjust, early_activation, EasingTypes.Out)
-                .Then().ScaleTo(1, beatLength * 2, EasingTypes.OutQuint);
+            logoBeatContainer
+                .ScaleTo(1 - 0.02f * amplitudeAdjust, early_activation, EasingTypes.Out)
+                .Then()
+                .ScaleTo(1, beatLength * 2, EasingTypes.OutQuint);
 
             ripple.ClearTransforms();
-
-            ripple.ScaleTo(logoAmplitudeContainer.Scale).ScaleTo(logoAmplitudeContainer.Scale * (1 + 0.04f * amplitudeAdjust), beatLength, EasingTypes.OutQuint);
-            ripple.FadeTo(0.15f * amplitudeAdjust).FadeOut(beatLength, EasingTypes.OutQuint);
+            ripple
+                .ScaleTo(logoAmplitudeContainer.Scale)
+                .ScaleTo(logoAmplitudeContainer.Scale * (1 + 0.04f * amplitudeAdjust), beatLength, EasingTypes.OutQuint)
+                .FadeTo(0.15f * amplitudeAdjust).FadeOut(beatLength, EasingTypes.OutQuint);
 
             if (effectPoint.KiaiMode && flashLayer.Alpha < 0.4f)
             {
                 flashLayer.ClearTransforms();
-                visualizer.ClearTransforms();
+                flashLayer
+                    .FadeTo(0.2f * amplitudeAdjust, early_activation, EasingTypes.Out)
+                    .Then()
+                    .FadeOut(beatLength);
 
-                flashLayer.FadeTo(0.2f * amplitudeAdjust, early_activation, EasingTypes.Out).Then().FadeOut(beatLength);
-                visualizer.FadeTo(0.9f * amplitudeAdjust, early_activation, EasingTypes.Out).Then().FadeTo(0.5f, beatLength);
+                visualizer.ClearTransforms();
+                visualizer
+                    .FadeTo(0.9f * amplitudeAdjust, early_activation, EasingTypes.Out)
+                    .Then()
+                    .FadeTo(0.5f, beatLength);
             }
         }
 
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index aafe459800..6ccc80beb3 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -272,8 +272,11 @@ namespace osu.Game.Screens.Play
 
             dimLevel.ValueChanged += newDim => Background?.FadeTo(1 - (float)newDim, 800);
 
-            Content.ScaleTo(0.7f).ScaleTo(1, 750, EasingTypes.OutQuint);
-            Content.Delay(250).FadeIn(250);
+            Content
+                .ScaleTo(0.7f)
+                .ScaleTo(1, 750, EasingTypes.OutQuint)
+                .Delay(250)
+                .FadeIn(250);
 
             this.Delay(750).Schedule(() =>
             {
diff --git a/osu.Game/Screens/Ranking/Results.cs b/osu.Game/Screens/Ranking/Results.cs
index 34e9cd186f..7b29cab027 100644
--- a/osu.Game/Screens/Ranking/Results.cs
+++ b/osu.Game/Screens/Ranking/Results.cs
@@ -67,16 +67,23 @@ namespace osu.Game.Screens.Ranking
             modeChangeButtons.FadeOut();
             currentPage.FadeOut();
 
-            circleOuterBackground.FadeIn(transition_time, EasingTypes.OutQuint).ScaleTo(1, transition_time, EasingTypes.OutQuint);
+            circleOuterBackground
+                .FadeIn(transition_time, EasingTypes.OutQuint)
+                .ScaleTo(1, transition_time, EasingTypes.OutQuint);
 
             using (BeginDelayedSequence(transition_time * 0.25f, true))
             {
-                circleOuter.FadeIn(transition_time, EasingTypes.OutQuint).ScaleTo(1, transition_time, EasingTypes.OutQuint);
+                circleOuter
+                    .FadeIn(transition_time, EasingTypes.OutQuint)
+                    .ScaleTo(1, transition_time, EasingTypes.OutQuint);
 
                 using (BeginDelayedSequence(transition_time * 0.3f, true))
                 {
                     backgroundParallax.FadeIn(transition_time, EasingTypes.OutQuint);
-                    circleInner.FadeIn(transition_time, EasingTypes.OutQuint).ScaleTo(1, transition_time, EasingTypes.OutQuint);
+
+                    circleInner
+                        .FadeIn(transition_time, EasingTypes.OutQuint)
+                        .ScaleTo(1, transition_time, EasingTypes.OutQuint);
 
                     using (BeginDelayedSequence(transition_time * 0.4f, true))
                     {

From 87bcd526f3637ff4dbe5d395df1cab92cfee7da8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Mon, 17 Jul 2017 16:51:21 +0300
Subject: [PATCH 11/30] Get rid of raw AddDelay calls within osu.Game

---
 osu-framework                                 |  2 +-
 .../Tests/TestCaseNotificationManager.cs      |  5 +--
 .../Tests/TestCaseTaikoPlayfield.cs           |  8 +++--
 .../Objects/Drawables/DrawableSliderTick.cs   | 14 ++++----
 .../Graphics/UserInterface/DialogButton.cs    |  3 +-
 .../UserInterface/Volume/VolumeControl.cs     |  3 +-
 osu.Game/OsuGame.cs                           |  3 +-
 osu.Game/Overlays/DialogOverlay.cs            |  3 +-
 .../Notifications/ProgressNotification.cs     |  5 +--
 .../Rulesets/Judgements/DrawableJudgement.cs  |  6 ++--
 osu.Game/Screens/Menu/Disclaimer.cs           | 17 ++++-----
 .../Screens/Play/HUD/StandardHealthDisplay.cs |  6 ++--
 osu.Game/Screens/Play/PauseContainer.cs       |  6 +---
 osu.Game/Screens/Play/PlayerLoader.cs         | 21 +++--------
 osu.Game/Screens/Ranking/ResultsPage.cs       |  3 +-
 osu.Game/Screens/Ranking/ResultsPageScore.cs  |  6 ++--
 osu.Game/Screens/ScreenWhiteBox.cs            | 13 +++----
 .../Select/Leaderboards/Leaderboard.cs        |  4 +--
 .../Select/Leaderboards/LeaderboardScore.cs   | 35 ++++++++++---------
 19 files changed, 67 insertions(+), 96 deletions(-)

diff --git a/osu-framework b/osu-framework
index a3ed5b642f..8463ba949b 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit a3ed5b642fcce039483801ca01fdbbf9117cec15
+Subproject commit 8463ba949b0a4a54c9aca157b2b24a8b0277608a
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseNotificationManager.cs b/osu.Desktop.VisualTests/Tests/TestCaseNotificationManager.cs
index 837545b114..849df1263e 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseNotificationManager.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseNotificationManager.cs
@@ -56,10 +56,7 @@ namespace osu.Desktop.VisualTests.Tests
             }
 
             if (remaining > 0)
-            {
-                AddDelay(80);
-                Schedule(() => sendBarrage(remaining - 1));
-            }
+                Scheduler.AddDelayed(() => sendBarrage(remaining - 1), 80);
         }
 
         protected override void Update()
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs b/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
index 434689641f..8ca129eb91 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs
@@ -67,6 +67,8 @@ namespace osu.Desktop.VisualTests.Tests
 
         private void changePlayfieldSize(int step)
         {
+            double delay = 0;
+
             // Add new hits
             switch (step)
             {
@@ -84,7 +86,7 @@ namespace osu.Desktop.VisualTests.Tests
                     break;
                 case 5:
                     addSwell(1000);
-                    playfieldContainer.AddDelay(scroll_time - 100);
+                    delay = scroll_time - 100;
                     break;
             }
 
@@ -92,10 +94,10 @@ namespace osu.Desktop.VisualTests.Tests
             switch (step)
             {
                 default:
-                    playfieldContainer.ResizeTo(new Vector2(1, rng.Next(25, 400)), 500);
+                    playfieldContainer.Delay(delay).ResizeTo(new Vector2(1, rng.Next(25, 400)), 500);
                     break;
                 case 6:
-                    playfieldContainer.ResizeTo(new Vector2(1, TaikoPlayfield.DEFAULT_PLAYFIELD_HEIGHT), 500);
+                    playfieldContainer.Delay(delay).ResizeTo(new Vector2(1, TaikoPlayfield.DEFAULT_PLAYFIELD_HEIGHT), 500);
                     break;
             }
         }
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
index 92c7ff6f2a..f2631cf01c 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
@@ -62,14 +62,12 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
         {
             var animIn = Math.Min(150, sliderTick.StartTime - FadeInTime);
 
-            this.ScaleTo(0.5f);
-            this.ScaleTo(1.2f, animIn);
-            this.FadeIn(animIn);
-
-            AddDelay(animIn);
-            this.ScaleTo(1, 150, EasingTypes.Out);
-
-            AddDelay(-animIn);
+            this.Animate(
+                d => d.FadeIn(animIn),
+                d => d.ScaleTo(0.5f).ScaleTo(1.2f, animIn)
+            ).Then(
+                d => d.ScaleTo(1, 150, EasingTypes.Out)
+            );
         }
 
         protected override void UpdateCurrentState(ArmedState state)
diff --git a/osu.Game/Graphics/UserInterface/DialogButton.cs b/osu.Game/Graphics/UserInterface/DialogButton.cs
index 67202c9e0d..460f4cea41 100644
--- a/osu.Game/Graphics/UserInterface/DialogButton.cs
+++ b/osu.Game/Graphics/UserInterface/DialogButton.cs
@@ -99,8 +99,7 @@ namespace osu.Game.Graphics.UserInterface
             colourContainer.ResizeTo(new Vector2(1.5f, 1f), click_duration, EasingTypes.In);
             flash();
 
-            AddDelay(click_duration);
-            Schedule(delegate {
+            this.Delay(click_duration).Schedule(delegate {
                 colourContainer.ResizeTo(new Vector2(0.8f, 1f));
                 spriteText.Spacing = Vector2.Zero;
                 glowContainer.FadeOut();
diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs
index 8c5347bd23..fa192b0825 100644
--- a/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs
+++ b/osu.Game/Graphics/UserInterface/Volume/VolumeControl.cs
@@ -106,8 +106,7 @@ namespace osu.Game.Graphics.UserInterface.Volume
         private void schedulePopOut()
         {
             popOutDelegate?.Cancel();
-            AddDelay(1000);
-            popOutDelegate = Schedule(Hide);
+            this.Delay(1000).Schedule(Hide, out popOutDelegate);
         }
     }
 }
\ No newline at end of file
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index e45f030fd1..0ab63c972f 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -119,8 +119,7 @@ namespace osu.Game
             if (!menu.IsCurrentScreen)
             {
                 menu.MakeCurrent();
-                AddDelay(500);
-                scoreLoad = Schedule(() => LoadScore(s));
+                this.Delay(500).Schedule(() => LoadScore(s), out scoreLoad);
                 return;
             }
 
diff --git a/osu.Game/Overlays/DialogOverlay.cs b/osu.Game/Overlays/DialogOverlay.cs
index c558ac5933..b384e110f9 100644
--- a/osu.Game/Overlays/DialogOverlay.cs
+++ b/osu.Game/Overlays/DialogOverlay.cs
@@ -35,8 +35,7 @@ namespace osu.Game.Overlays
             if (v != Visibility.Hidden) return;
 
             //handle the dialog being dismissed.
-            dialog.AddDelay(PopupDialog.EXIT_DURATION);
-            dialog.Expire();
+            dialog.Delay(PopupDialog.EXIT_DURATION).Expire();
 
             if (dialog == currentDialog)
                 State = Visibility.Hidden;
diff --git a/osu.Game/Overlays/Notifications/ProgressNotification.cs b/osu.Game/Overlays/Notifications/ProgressNotification.cs
index 098088191f..bd7b8bf844 100644
--- a/osu.Game/Overlays/Notifications/ProgressNotification.cs
+++ b/osu.Game/Overlays/Notifications/ProgressNotification.cs
@@ -78,10 +78,7 @@ namespace osu.Game.Overlays.Notifications
                     {
                         case ProgressNotificationState.Completed:
                             NotificationContent.MoveToY(-DrawSize.Y / 2, 200, EasingTypes.OutQuint);
-                            this.FadeTo(0.01f, 200); //don't completely fade out or our scheduled task won't run.
-
-                            AddDelay(100);
-                            Schedule(Completed);
+                            this.FadeOut(200).Finally(d => Completed());
                             break;
                     }
                 }
diff --git a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
index 5d471cb700..ac8a8e2005 100644
--- a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
+++ b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
@@ -75,15 +75,13 @@ namespace osu.Game.Rulesets.Judgements
                     this.MoveToOffset(new Vector2(0, 100), 800, EasingTypes.InQuint);
                     this.RotateTo(40, 800, EasingTypes.InQuint);
 
-                    AddDelay(600);
-                    this.FadeOut(200);
+                    this.Delay(600).FadeOut(200);
                     break;
                 case HitResult.Hit:
                     this.ScaleTo(0.9f);
                     this.ScaleTo(1, 500, EasingTypes.OutElastic);
 
-                    AddDelay(100);
-                    this.FadeOut(400);
+                    this.Delay(100).FadeOut(400);
                     break;
             }
 
diff --git a/osu.Game/Screens/Menu/Disclaimer.cs b/osu.Game/Screens/Menu/Disclaimer.cs
index 908b64a3aa..6a176898a2 100644
--- a/osu.Game/Screens/Menu/Disclaimer.cs
+++ b/osu.Game/Screens/Menu/Disclaimer.cs
@@ -98,18 +98,13 @@ namespace osu.Game.Screens.Menu
         {
             base.OnEntering(last);
 
-            Content.FadeInFromZero(500);
+            icon.Delay(1500).FadeColour(iconColour, 200);
 
-            icon.AddDelay(1500);
-            icon.FadeColour(iconColour, 200);
-
-            AddDelay(6000, true);
-
-            Content.FadeOut(250);
-
-            AddDelay(250);
-
-            Schedule(() => Push(intro));
+            Content
+                .FadeInFromZero(500)
+                .Then(5500)
+                .FadeOut(250)
+                .Finally(d => Push(intro));
         }
     }
 }
diff --git a/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs b/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs
index 229c05859f..b4b3bd885e 100644
--- a/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs
+++ b/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs
@@ -97,9 +97,9 @@ namespace osu.Game.Screens.Play.HUD
             if (judgement.Result == HitResult.Miss)
                 return;
 
-            fill.FadeEdgeEffectTo(Math.Min(1, fill.EdgeEffect.Colour.Linear.A + (1f - base_glow_opacity) / glow_max_hits), 50, EasingTypes.OutQuint);
-            fill.AddDelay(glow_fade_delay);
-            fill.FadeEdgeEffectTo(base_glow_opacity, glow_fade_time, EasingTypes.OutQuint);
+            fill.FadeEdgeEffectTo(Math.Min(1, fill.EdgeEffect.Colour.Linear.A + (1f - base_glow_opacity) / glow_max_hits), 50, EasingTypes.OutQuint)
+                .Delay(glow_fade_delay)
+                .FadeEdgeEffectTo(base_glow_opacity, glow_fade_time, EasingTypes.OutQuint);
         }
 
         protected override void SetHealth(float value) => fill.ResizeTo(new Vector2(value, 1), 200, EasingTypes.OutQuint);
diff --git a/osu.Game/Screens/Play/PauseContainer.cs b/osu.Game/Screens/Play/PauseContainer.cs
index 6683ba8fd5..eed5cd1c20 100644
--- a/osu.Game/Screens/Play/PauseContainer.cs
+++ b/osu.Game/Screens/Play/PauseContainer.cs
@@ -56,11 +56,7 @@ namespace osu.Game.Screens.Play
 
             AddInternal(pauseOverlay = new PauseOverlay
             {
-                OnResume = delegate
-                {
-                    AddDelay(400);
-                    Schedule(Resume);
-                },
+                OnResume = () => this.Delay(400).Schedule(Resume),
                 OnRetry = () => OnRetry(),
                 OnQuit = () => OnQuit(),
             });
diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs
index 50287ebe7d..9045067bd9 100644
--- a/osu.Game/Screens/Play/PlayerLoader.cs
+++ b/osu.Game/Screens/Play/PlayerLoader.cs
@@ -77,9 +77,7 @@ namespace osu.Game.Screens.Play
                 Beatmap = player.Beatmap,
             });
 
-            AddDelay(400);
-
-            Schedule(pushWhenLoaded);
+            this.Delay(400).Schedule(pushWhenLoaded);
         }
 
         private void contentIn()
@@ -104,16 +102,9 @@ namespace osu.Game.Screens.Play
 
             contentIn();
 
-            AddDelay(500, true);
-
-            logo.MoveToOffset(new Vector2(0, -180), 500, EasingTypes.InOutExpo);
-            AddDelay(250, true);
-
-            info.FadeIn(500);
-
-            AddDelay(1400, true);
-
-            Schedule(pushWhenLoaded);
+            logo.Delay(500).MoveToOffset(new Vector2(0, -180), 500, EasingTypes.InOutExpo);
+            info.Delay(750).FadeIn(500);
+            this.Delay(2150).Schedule(pushWhenLoaded);
         }
 
         private void pushWhenLoaded()
@@ -123,9 +114,7 @@ namespace osu.Game.Screens.Play
 
             contentOut();
 
-            AddDelay(250);
-
-            Schedule(() =>
+            this.Delay(250).Schedule(() =>
             {
                 if (!IsCurrentScreen) return;
 
diff --git a/osu.Game/Screens/Ranking/ResultsPage.cs b/osu.Game/Screens/Ranking/ResultsPage.cs
index b88e993886..7f381ebf99 100644
--- a/osu.Game/Screens/Ranking/ResultsPage.cs
+++ b/osu.Game/Screens/Ranking/ResultsPage.cs
@@ -33,8 +33,7 @@ namespace osu.Game.Screens.Ranking
         protected override void LoadComplete()
         {
             base.LoadComplete();
-            fill.AddDelay(400);
-            fill.FadeInFromZero(600);
+            fill.Delay(400).FadeInFromZero(600);
         }
 
         [BackgroundDependencyLoader]
diff --git a/osu.Game/Screens/Ranking/ResultsPageScore.cs b/osu.Game/Screens/Ranking/ResultsPageScore.cs
index 4e3458e522..09db835144 100644
--- a/osu.Game/Screens/Ranking/ResultsPageScore.cs
+++ b/osu.Game/Screens/Ranking/ResultsPageScore.cs
@@ -178,9 +178,9 @@ namespace osu.Game.Screens.Ranking
                 int delay = 0;
                 foreach (var s in statisticsContainer.Children)
                 {
-                    s.FadeOut();
-                    s.AddDelay(delay += 200);
-                    s.FadeIn(300 + delay, EasingTypes.Out);
+                    s.FadeOut()
+                     .Then(delay += 200)
+                     .FadeIn(300 + delay, EasingTypes.Out);
                 }
             });
         }
diff --git a/osu.Game/Screens/ScreenWhiteBox.cs b/osu.Game/Screens/ScreenWhiteBox.cs
index 2ec721f0c0..7eac2407e9 100644
--- a/osu.Game/Screens/ScreenWhiteBox.cs
+++ b/osu.Game/Screens/ScreenWhiteBox.cs
@@ -44,13 +44,14 @@ namespace osu.Game.Screens
             boxContainer.ScaleTo(0.2f);
             boxContainer.RotateTo(-20);
 
-            Content.AddDelay(300, true);
+            using (Content.BeginDelayedSequence(300, true))
+            {
+                boxContainer.ScaleTo(1, transition_time, EasingTypes.OutElastic);
+                boxContainer.RotateTo(0, transition_time / 2, EasingTypes.OutQuint);
 
-            boxContainer.ScaleTo(1, transition_time, EasingTypes.OutElastic);
-            boxContainer.RotateTo(0, transition_time / 2, EasingTypes.OutQuint);
-
-            textContainer.MoveTo(Vector2.Zero, transition_time, EasingTypes.OutExpo);
-            Content.FadeIn(transition_time, EasingTypes.OutExpo);
+                textContainer.MoveTo(Vector2.Zero, transition_time, EasingTypes.OutExpo);
+                Content.FadeIn(transition_time, EasingTypes.OutExpo);
+            }
         }
 
         protected override bool OnExiting(Screen next)
diff --git a/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs b/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
index 4a00ef71a0..91bc55f143 100644
--- a/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
+++ b/osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
@@ -63,8 +63,8 @@ namespace osu.Game.Screens.Select.Leaderboards
                     };
                     scrollFlow.Add(ls);
 
-                    ls.AddDelay(i++ * 50, true);
-                    ls.Show();
+                    using (BeginDelayedSequence(i++ * 50, true))
+                        ls.Show();
                 }
 
                 scrollContainer.ScrollTo(0f, false);
diff --git a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
index 3867d4e379..b0e234e5a2 100644
--- a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
+++ b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
@@ -64,23 +64,26 @@ namespace osu.Game.Screens.Select.Leaderboards
                         this.FadeIn(200);
                         content.MoveToY(0, 800, EasingTypes.OutQuint);
 
-                        AddDelay(100, true);
-                        avatar.FadeIn(300, EasingTypes.OutQuint);
-                        nameLabel.FadeIn(350, EasingTypes.OutQuint);
-
-                        avatar.MoveToX(0, 300, EasingTypes.OutQuint);
-                        nameLabel.MoveToX(0, 350, EasingTypes.OutQuint);
-
-                        AddDelay(250, true);
-                        scoreLabel.FadeIn(200);
-                        scoreRank.FadeIn(200);
-
-                        AddDelay(50, true);
-                        var drawables = new Drawable[] { flagBadgeContainer, maxCombo, accuracy, modsContainer, };
-
-                        for (int i = 0; i < drawables.Length; i++)
+                        using (BeginDelayedSequence(100, true))
                         {
-                            drawables[i].FadeIn(100 + i * 50);
+                            avatar.FadeIn(300, EasingTypes.OutQuint);
+                            nameLabel.FadeIn(350, EasingTypes.OutQuint);
+
+                            avatar.MoveToX(0, 300, EasingTypes.OutQuint);
+                            nameLabel.MoveToX(0, 350, EasingTypes.OutQuint);
+
+                            using (BeginDelayedSequence(250, true))
+                            {
+                                scoreLabel.FadeIn(200);
+                                scoreRank.FadeIn(200);
+
+                                using (BeginDelayedSequence(50, true))
+                                {
+                                    var drawables = new Drawable[] { flagBadgeContainer, maxCombo, accuracy, modsContainer, };
+                                    for (int i = 0; i < drawables.Length; i++)
+                                        drawables[i].FadeIn(100 + i * 50);
+                                }
+                            }
                         }
 
                         break;

From 546efc0181f7d1984b96f13317123691b38e1510 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Mon, 17 Jul 2017 17:05:24 +0300
Subject: [PATCH 12/30] Get rid of AddDelay & ResetDelay in
 osu.Game.Rulesets.Osu

---
 .../Connections/FollowPointRenderer.cs        |  3 +--
 .../Objects/Drawables/DrawableOsuHitObject.cs |  1 -
 .../Objects/Drawables/DrawableSlider.cs       | 14 ++++++------
 .../Objects/Drawables/DrawableSliderTick.cs   | 11 +++++-----
 .../Objects/Drawables/DrawableSpinner.cs      | 22 +++++++++----------
 .../Objects/Drawables/Pieces/SpinnerDisc.cs   |  7 +++---
 6 files changed, 27 insertions(+), 31 deletions(-)

diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs
index be901a5748..42c148b525 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs
@@ -98,8 +98,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Connections
 
                             fp.MoveTo(pointEndPosition, DrawableOsuHitObject.TIME_FADEIN, EasingTypes.Out);
 
-                            fp.AddDelay(fadeOutTime - fadeInTime);
-                            fp.FadeOut(DrawableOsuHitObject.TIME_FADEIN);
+                            fp.Delay(fadeOutTime - fadeInTime).FadeOut(DrawableOsuHitObject.TIME_FADEIN);
                         }
 
                         fp.Expire(true);
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
index 1bc6070c33..e09b6bd997 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
@@ -26,7 +26,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
         protected sealed override void UpdateState(ArmedState state)
         {
             Flush();
-            ResetDelay(true);
 
             using (BeginAbsoluteSequence(HitObject.StartTime - TIME_PREEMPT, true))
             {
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
index 0d2b200c76..d5583b0d9d 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
@@ -158,14 +158,14 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
         {
             ball.FadeIn();
 
-            AddDelay(slider.Duration, true);
+            using (BeginDelayedSequence(slider.Duration, true))
+            {
+                body.FadeOut(160);
+                ball.FadeOut(160);
 
-            body.FadeOut(160);
-            ball.FadeOut(160);
-
-            this.FadeOut(800);
-
-            Expire();
+                this.FadeOut(800)
+                    .Expire();
+            }
         }
 
         public Drawable ProxiedLayer => initialCircle.ApproachCircle;
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
index f2631cf01c..4220299a25 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
@@ -75,16 +75,15 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             switch (state)
             {
                 case ArmedState.Idle:
-                    AddDelay(FadeOutTime - sliderTick.StartTime);
-                    this.FadeOut();
+                    this.Delay(FadeOutTime - sliderTick.StartTime).FadeOut();
                     break;
                 case ArmedState.Miss:
-                    this.FadeOut(160);
-                    this.FadeColour(Color4.Red, 80);
+                    this.FadeOut(160)
+                        .FadeColour(Color4.Red, 80);
                     break;
                 case ArmedState.Hit:
-                    this.FadeOut(120, EasingTypes.OutQuint);
-                    this.ScaleTo(Scale * 1.5f, 120, EasingTypes.OutQuint);
+                    this.FadeOut(120, EasingTypes.OutQuint)
+                        .ScaleTo(Scale * 1.5f, 120, EasingTypes.OutQuint);
                     break;
             }
         }
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index d7fe0e32bf..208705b723 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -189,30 +189,28 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             disc.RotateTo(-720);
             symbol.RotateTo(-720);
 
-            mainContainer.ScaleTo(0);
-            mainContainer.ScaleTo(spinner.Scale * circle.DrawHeight / DrawHeight * 1.4f, TIME_PREEMPT - 150, EasingTypes.OutQuint);
-
-            mainContainer.AddDelay(TIME_PREEMPT - 150);
-            mainContainer.ScaleTo(1, 500, EasingTypes.OutQuint);
+            mainContainer
+                .ScaleTo(0)
+                .ScaleTo(spinner.Scale * circle.DrawHeight / DrawHeight * 1.4f, TIME_PREEMPT - 150, EasingTypes.OutQuint)
+                .Then()
+                .ScaleTo(1, 500, EasingTypes.OutQuint);
         }
 
         protected override void UpdateCurrentState(ArmedState state)
         {
-            AddDelay(spinner.Duration, true);
-
-            this.FadeOut(160);
+            var sequence = this.Delay(spinner.Duration).FadeOut(160);
 
             switch (state)
             {
                 case ArmedState.Hit:
-                    this.ScaleTo(Scale * 1.2f, 320, EasingTypes.Out);
-                    Expire();
+                    sequence.ScaleTo(Scale * 1.2f, 320, EasingTypes.Out);
                     break;
                 case ArmedState.Miss:
-                    this.ScaleTo(Scale * 0.8f, 320, EasingTypes.In);
-                    Expire();
+                    sequence.ScaleTo(Scale * 0.8f, 320, EasingTypes.In);
                     break;
             }
+
+            sequence.Expire();
         }
     }
 }
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
index d0f953ea1f..68bf1cbcdb 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
@@ -128,9 +128,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
             if (Complete && updateCompleteTick())
             {
                 background.Flush(false, nameof(Alpha));
-                background.FadeTo(tracking_alpha + 0.2f, 60, EasingTypes.OutExpo);
-                background.AddDelay(60);
-                background.FadeTo(tracking_alpha, 250, EasingTypes.OutQuint);
+                background
+                    .FadeTo(tracking_alpha + 0.2f, 60, EasingTypes.OutExpo)
+                    .Then()
+                    .FadeTo(tracking_alpha, 250, EasingTypes.OutQuint);
             }
 
             this.RotateTo(currentRotation / 2, validAndTracking ? 500 : 1500, EasingTypes.OutExpo);

From 440878945e03c5f089e5ae07eb194bbe551c78c1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Mon, 17 Jul 2017 18:16:15 +0300
Subject: [PATCH 13/30] Remove remaining usages of AddDelay

---
 osu-framework                                 |  2 +-
 .../Objects/Drawables/DrawableSpinner.cs      |  2 +-
 .../Objects/Drawables/DrawableBarLine.cs      |  3 +-
 .../Objects/Drawables/DrawableHit.cs          | 57 +++++++++----------
 .../Objects/Drawables/DrawableSwell.cs        | 19 +++----
 osu.Game.Rulesets.Taiko/UI/InputDrum.cs       | 18 +++---
 6 files changed, 47 insertions(+), 54 deletions(-)

diff --git a/osu-framework b/osu-framework
index 8463ba949b..2410eba0d4 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 8463ba949b0a4a54c9aca157b2b24a8b0277608a
+Subproject commit 2410eba0d4b0cdcfe8b7e0636d490a258ddebc6c
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index 208705b723..c7d838e517 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -210,7 +210,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
                     break;
             }
 
-            sequence.Expire();
+            Expire();
         }
     }
 }
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs
index 3b5ecf244d..7507ee600e 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableBarLine.cs
@@ -64,8 +64,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
         protected override void LoadComplete()
         {
             base.LoadComplete();
-            AddDelay(BarLine.StartTime - Time.Current);
-            this.FadeOut(base_fadeout_time * BarLine.ScrollTime / 1000);
+            this.Delay(BarLine.StartTime - Time.Current).FadeOut(base_fadeout_time * BarLine.ScrollTime / 1000);
         }
 
         private void updateScrollPosition(double time) => this.MoveToX((float)((BarLine.StartTime - time) / BarLine.ScrollTime));
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
index 2e8f9d945b..b9d67d8d6a 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
@@ -65,45 +65,42 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
 
         protected override void UpdateState(ArmedState state)
         {
-            AddDelay(HitObject.StartTime - Time.Current + Judgement.TimeOffset, true);
-
             var circlePiece = MainPiece as CirclePiece;
-
             circlePiece?.FlashBox.Flush();
 
-            switch (State)
+            using (BeginDelayedSequence(HitObject.StartTime - Time.Current + Judgement.TimeOffset, true))
             {
-                case ArmedState.Idle:
-                    AddDelay(HitObject.HitWindowMiss);
-                    break;
-                case ArmedState.Miss:
-                    this.FadeOut(100);
-                    break;
-                case ArmedState.Hit:
-                    this.FadeOut(600);
+                switch (State)
+                {
+                    case ArmedState.Idle:
+                        this.Delay(HitObject.HitWindowMiss).Expire();
+                        break;
+                    case ArmedState.Miss:
+                        this.FadeOut(100)
+                            .Expire();
+                        break;
+                    case ArmedState.Hit:
+                        var flash = circlePiece?.FlashBox;
+                        if (flash != null)
+                        {
+                            flash.FadeTo(0.9f);
+                            flash.FadeOut(300);
+                        }
 
-                    var flash = circlePiece?.FlashBox;
-                    if (flash != null)
-                    {
-                        flash.FadeTo(0.9f);
-                        flash.FadeOut(300);
-                    }
+                        const float gravity_time = 300;
+                        const float gravity_travel_height = 200;
 
+                        Content.ScaleTo(0.8f, gravity_time * 2, EasingTypes.OutQuad);
 
-                    this.FadeOut(800);
+                        this.FadeOut(800)
+                            .MoveToY(-gravity_travel_height, gravity_time, EasingTypes.Out)
+                            .Then()
+                            .MoveToY(gravity_travel_height * 2, gravity_time * 2, EasingTypes.In);
 
-                    const float gravity_time = 300;
-                    const float gravity_travel_height = 200;
-
-                    Content.ScaleTo(0.8f, gravity_time * 2, EasingTypes.OutQuad);
-
-                    this.MoveToY(-gravity_travel_height, gravity_time, EasingTypes.Out);
-                    AddDelay(gravity_time, true);
-                    this.MoveToY(gravity_travel_height * 2, gravity_time * 2, EasingTypes.In);
-                    break;
+                        Expire();
+                        break;
+                }
             }
-
-            Expire();
         }
     }
 }
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
index 363dcae883..521d225abe 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
@@ -181,26 +181,21 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
         protected override void UpdateState(ArmedState state)
         {
             const float preempt = 100;
-
-            AddDelay(HitObject.StartTime - Time.Current - preempt, true);
-
-            targetRing.ScaleTo(target_ring_scale, preempt * 4, EasingTypes.OutQuint);
-
-            AddDelay(preempt, true);
-
-            AddDelay(Judgement.TimeOffset + HitObject.Duration, true);
-
             const float out_transition_time = 300;
 
+            double untilStartTime = HitObject.StartTime - Time.Current;
+            double untilJudgement = untilStartTime + Judgement.TimeOffset + HitObject.Duration;
+
+            targetRing.Delay(untilStartTime - preempt).ScaleTo(target_ring_scale, preempt * 4, EasingTypes.OutQuint);
+            this.Delay(untilJudgement).FadeOut(out_transition_time, EasingTypes.Out);
+
             switch (state)
             {
                 case ArmedState.Hit:
-                    bodyContainer.ScaleTo(1.4f, out_transition_time);
+                    bodyContainer.Delay(untilJudgement).ScaleTo(1.4f, out_transition_time);
                     break;
             }
 
-            this.FadeOut(out_transition_time, EasingTypes.Out);
-
             Expire();
         }
 
diff --git a/osu.Game.Rulesets.Taiko/UI/InputDrum.cs b/osu.Game.Rulesets.Taiko/UI/InputDrum.cs
index 737f5d344e..a413d77d16 100644
--- a/osu.Game.Rulesets.Taiko/UI/InputDrum.cs
+++ b/osu.Game.Rulesets.Taiko/UI/InputDrum.cs
@@ -149,15 +149,17 @@ namespace osu.Game.Rulesets.Taiko.UI
                     const float down_time = 40;
                     const float up_time = 1000;
 
-                    back.ScaleTo(target.Scale.X - scale_amount, down_time, EasingTypes.OutQuint);
-                    back.AddDelay(down_time);
-                    back.ScaleTo(1, up_time, EasingTypes.OutQuint);
+                    back.ScaleTo(target.Scale.X - scale_amount, down_time, EasingTypes.OutQuint)
+                        .Then()
+                        .ScaleTo(1, up_time, EasingTypes.OutQuint);
 
-                    target.ScaleTo(target.Scale.X - scale_amount, down_time, EasingTypes.OutQuint);
-                    target.FadeTo(Math.Min(target.Alpha + alpha_amount, 1), down_time, EasingTypes.OutQuint);
-                    target.AddDelay(down_time);
-                    target.ScaleTo(1, up_time, EasingTypes.OutQuint);
-                    target.FadeOut(up_time, EasingTypes.OutQuint);
+                    target.Animate(
+                        t => t.ScaleTo(target.Scale.X - scale_amount, down_time, EasingTypes.OutQuint),
+                        t => t.FadeTo(Math.Min(target.Alpha + alpha_amount, 1), down_time, EasingTypes.OutQuint)
+                    ).Then(
+                        t => t.ScaleTo(1, up_time, EasingTypes.OutQuint),
+                        t => t.FadeOut(up_time, EasingTypes.OutQuint)
+                    );
                 }
 
                 return false;

From ed793328f1fe386d6b537a28b348e3a92993771a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Tue, 18 Jul 2017 15:20:00 +0300
Subject: [PATCH 14/30] Update framework

---
 osu-framework | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/osu-framework b/osu-framework
index b932ddd4fe..adf23f8395 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit b932ddd4fe5cf38dd3e96760741c98eed92a3e36
+Subproject commit adf23f83954461d912f3ef0c2170a031d436a55d

From b40c897dbd7d224bef22642d9db202b7e4f4dbd1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Tue, 18 Jul 2017 15:28:56 +0300
Subject: [PATCH 15/30] Fix osu logo shockwave playing when transition is
 aborted

This is a very nice use-case scenario for TransformSequence.OnComplete
---
 osu.Game/Screens/Menu/ButtonSystem.cs | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs
index 87f8e32abd..7ff514203e 100644
--- a/osu.Game/Screens/Menu/ButtonSystem.cs
+++ b/osu.Game/Screens/Menu/ButtonSystem.cs
@@ -250,15 +250,13 @@ namespace osu.Game.Screens.Menu
                         case MenuState.TopLevel:
                             buttonAreaBackground.ScaleTo(Vector2.One, 200, EasingTypes.Out);
 
-                            osuLogo.ClearTransforms();
                             osuLogo.MoveTo(buttonFlow.DrawPosition, 200, EasingTypes.In);
-                            osuLogo.ScaleTo(0.5f, 200, EasingTypes.In);
-
-                            buttonArea.FadeIn(300);
+                            var sequence = osuLogo.ScaleTo(0.5f, 200, EasingTypes.In);
 
                             if (fromInitial && osuLogo.Scale.X > 0.5f)
-                                using (osuLogo.BeginDelayedSequence(200, true))
-                                    osuLogo.Impact();
+                                sequence.OnComplete(o => o.Impact());
+
+                            buttonArea.FadeIn(300);
 
                             Scheduler.AddDelayed(() => toolbar?.Show(), 150);
 

From 3ba119c115ab895f607b8657228dfb8078220a4b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Tue, 18 Jul 2017 17:09:53 +0300
Subject: [PATCH 16/30] Ensure toolbar disappears when osu logo transition is
 cancelled

---
 osu.Game/Screens/Menu/ButtonSystem.cs | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs
index 7ff514203e..cd0d51b15e 100644
--- a/osu.Game/Screens/Menu/ButtonSystem.cs
+++ b/osu.Game/Screens/Menu/ButtonSystem.cs
@@ -224,12 +224,11 @@ namespace osu.Game.Screens.Menu
                     {
                         case MenuState.Exit:
                         case MenuState.Initial:
-                            toolbar?.Hide();
-
                             buttonAreaBackground.ScaleTo(Vector2.One, 500, EasingTypes.Out);
                             buttonArea.FadeOut(300);
 
                             osuLogo.Delay(150)
+                                .Schedule(() => toolbar?.Hide())
                                 .ScaleTo(1, 800, EasingTypes.OutExpo)
                                 .MoveTo(Vector2.Zero, 800, EasingTypes.OutExpo);
 
@@ -250,16 +249,19 @@ namespace osu.Game.Screens.Menu
                         case MenuState.TopLevel:
                             buttonAreaBackground.ScaleTo(Vector2.One, 200, EasingTypes.Out);
 
-                            osuLogo.MoveTo(buttonFlow.DrawPosition, 200, EasingTypes.In);
-                            var sequence = osuLogo.ScaleTo(0.5f, 200, EasingTypes.In);
+                            var sequence = osuLogo
+                                .ScaleTo(0.5f, 200, EasingTypes.In)
+                                .MoveTo(buttonFlow.DrawPosition, 200, EasingTypes.In);
 
                             if (fromInitial && osuLogo.Scale.X > 0.5f)
-                                sequence.OnComplete(o => o.Impact());
+                                sequence.OnComplete(o =>
+                                {
+                                    o.Impact();
+                                    toolbar?.Show();
+                                });
 
                             buttonArea.FadeIn(300);
 
-                            Scheduler.AddDelayed(() => toolbar?.Show(), 150);
-
                             foreach (Button b in buttonsTopLevel)
                                 b.State = ButtonState.Expanded;
 
From a7dc8a892b66eeb29f3dd9a7fe50b7a5f028fbf0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Fri, 21 Jul 2017 17:24:09 +0200
Subject: [PATCH 17/30] Update framework

---
 osu-framework                                                 | 2 +-
 .../Objects/Drawables/DrawableOsuHitObject.cs                 | 2 +-
 osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs | 2 +-
 osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs      | 2 +-
 osu.Game/Graphics/UserInterface/RollingCounter.cs             | 2 +-
 osu.Game/Overlays/MedalOverlay.cs                             | 2 +-
 osu.Game/Overlays/Music/PlaylistItem.cs                       | 2 +-
 osu.Game/Overlays/OnScreenDisplay.cs                          | 2 +-
 osu.Game/Overlays/Profile/ProfileHeader.cs                    | 4 ++--
 osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs       | 2 +-
 osu.Game/Screens/Menu/ButtonSystem.cs                         | 2 +-
 osu.Game/Screens/Play/HUD/ComboCounter.cs                     | 2 +-
 osu.Game/Screens/Play/HUD/ModDisplay.cs                       | 2 +-
 13 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/osu-framework b/osu-framework
index 8204403880..d09246eeb0 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 82044038805e640ae4602be2fe4772bf09d23e94
+Subproject commit d09246eeb0e7e30bc31cc017af3847ee09b4df08
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
index e09b6bd997..ca1b44e1c7 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs
@@ -25,7 +25,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
 
         protected sealed override void UpdateState(ArmedState state)
         {
-            Flush();
+            FinishTransforms();
 
             using (BeginAbsoluteSequence(HitObject.StartTime - TIME_PREEMPT, true))
             {
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
index 68bf1cbcdb..4c5aa36640 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
@@ -127,7 +127,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
 
             if (Complete && updateCompleteTick())
             {
-                background.Flush(false, nameof(Alpha));
+                background.FinishTransforms(false, nameof(Alpha));
                 background
                     .FadeTo(tracking_alpha + 0.2f, 60, EasingTypes.OutExpo)
                     .Then()
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
index b9d67d8d6a..1d614b4adb 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
@@ -66,7 +66,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
         protected override void UpdateState(ArmedState state)
         {
             var circlePiece = MainPiece as CirclePiece;
-            circlePiece?.FlashBox.Flush();
+            circlePiece?.FlashBox.FinishTransforms();
 
             using (BeginDelayedSequence(HitObject.StartTime - Time.Current + Judgement.TimeOffset, true))
             {
diff --git a/osu.Game/Graphics/UserInterface/RollingCounter.cs b/osu.Game/Graphics/UserInterface/RollingCounter.cs
index bc7b49ab6a..1ca25491e9 100644
--- a/osu.Game/Graphics/UserInterface/RollingCounter.cs
+++ b/osu.Game/Graphics/UserInterface/RollingCounter.cs
@@ -127,7 +127,7 @@ namespace osu.Game.Graphics.UserInterface
         /// </summary>
         public virtual void StopRolling()
         {
-            Flush(false, nameof(DisplayedCount));
+            FinishTransforms(false, nameof(DisplayedCount));
             DisplayedCount = Current;
         }
 
diff --git a/osu.Game/Overlays/MedalOverlay.cs b/osu.Game/Overlays/MedalOverlay.cs
index c3825e32b8..a8974866a7 100644
--- a/osu.Game/Overlays/MedalOverlay.cs
+++ b/osu.Game/Overlays/MedalOverlay.cs
@@ -247,7 +247,7 @@ namespace osu.Game.Overlays
             {
                 // if we haven't yet, play out the animation fully
                 drawableMedal.State = DisplayState.Full;
-                Flush(true);
+                FinishTransforms(true);
                 return;
             }
 
diff --git a/osu.Game/Overlays/Music/PlaylistItem.cs b/osu.Game/Overlays/Music/PlaylistItem.cs
index 2b658e0c54..128dddbce5 100644
--- a/osu.Game/Overlays/Music/PlaylistItem.cs
+++ b/osu.Game/Overlays/Music/PlaylistItem.cs
@@ -41,7 +41,7 @@ namespace osu.Game.Overlays.Music
                 if (value == selected) return;
                 selected = value;
 
-                Flush(true);
+                FinishTransforms(true);
                 foreach (SpriteText s in titleSprites)
                     s.FadeColour(Selected ? hoverColour : Color4.White, fade_duration);
             }
diff --git a/osu.Game/Overlays/OnScreenDisplay.cs b/osu.Game/Overlays/OnScreenDisplay.cs
index e6a55800ef..65bef22295 100644
--- a/osu.Game/Overlays/OnScreenDisplay.cs
+++ b/osu.Game/Overlays/OnScreenDisplay.cs
@@ -260,7 +260,7 @@ namespace osu.Game.Overlays
                 };
 
                 updateGlow();
-                Flush(true);
+                FinishTransforms(true);
             }
         }
     }
diff --git a/osu.Game/Overlays/Profile/ProfileHeader.cs b/osu.Game/Overlays/Profile/ProfileHeader.cs
index 21bfd5afd6..aa57816701 100644
--- a/osu.Game/Overlays/Profile/ProfileHeader.cs
+++ b/osu.Game/Overlays/Profile/ProfileHeader.cs
@@ -517,13 +517,13 @@ namespace osu.Game.Overlays.Profile
 
                 protected override bool OnHover(InputState state)
                 {
-                    FadeColour(hoverColour, 500, EasingTypes.OutQuint);
+                    this.FadeColour(hoverColour, 500, EasingTypes.OutQuint);
                     return base.OnHover(state);
                 }
 
                 protected override void OnHoverLost(InputState state)
                 {
-                    FadeColour(Color4.White, 500, EasingTypes.OutQuint);
+                    this.FadeColour(Color4.White, 500, EasingTypes.OutQuint);
                     base.OnHoverLost(state);
                 }
 
diff --git a/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs b/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs
index 7e2c0305a9..ac5ea04ecc 100644
--- a/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs
+++ b/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs
@@ -40,7 +40,7 @@ namespace osu.Game.Screens.Backgrounds
                         if (background != null)
                         {
                             newDepth = background.Depth + 1;
-                            background.Flush();
+                            background.FinishTransforms();
                             background.FadeOut(250);
                             background.Expire();
                         }
diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs
index cd0d51b15e..65ba555630 100644
--- a/osu.Game/Screens/Menu/ButtonSystem.cs
+++ b/osu.Game/Screens/Menu/ButtonSystem.cs
@@ -216,7 +216,7 @@ namespace osu.Game.Screens.Menu
                 bool fromInitial = lastState == MenuState.Initial;
 
                 if (state == MenuState.TopLevel)
-                    buttonArea.Flush(true);
+                    buttonArea.FinishTransforms(true);
 
                 using (buttonArea.BeginDelayedSequence(fromInitial ? 150 : 0, true))
                 {
diff --git a/osu.Game/Screens/Play/HUD/ComboCounter.cs b/osu.Game/Screens/Play/HUD/ComboCounter.cs
index 1bfc7599f7..f37b8fc434 100644
--- a/osu.Game/Screens/Play/HUD/ComboCounter.cs
+++ b/osu.Game/Screens/Play/HUD/ComboCounter.cs
@@ -169,7 +169,7 @@ namespace osu.Game.Screens.Play.HUD
 
             if (!rolling)
             {
-                Flush(false, nameof(DisplayedCount));
+                FinishTransforms(false, nameof(DisplayedCount));
                 IsRolling = false;
                 DisplayedCount = prev;
 
diff --git a/osu.Game/Screens/Play/HUD/ModDisplay.cs b/osu.Game/Screens/Play/HUD/ModDisplay.cs
index f8235e5bcf..e72310f1fe 100644
--- a/osu.Game/Screens/Play/HUD/ModDisplay.cs
+++ b/osu.Game/Screens/Play/HUD/ModDisplay.cs
@@ -80,7 +80,7 @@ namespace osu.Game.Screens.Play.HUD
             else
                 unrankedText.Hide();
 
-            iconsContainer.Flush();
+            iconsContainer.FinishTransforms();
             iconsContainer.FadeInFromZero(fade_duration, EasingTypes.OutQuint);
             expand();
             using (iconsContainer.BeginDelayedSequence(1200))

From 0f2bcb2904a0e753c47e3c5e246c00f17f9fd6f9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Fri, 21 Jul 2017 18:23:01 +0200
Subject: [PATCH 18/30] Update framework

---
 osu-framework                                                 | 2 +-
 .../Objects/Drawables/Pieces/SliderBouncer.cs                 | 2 +-
 osu.Game/Graphics/UserInterface/LoadingAnimation.cs           | 2 +-
 osu.Game/Overlays/MedalOverlay.cs                             | 4 ++--
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/osu-framework b/osu-framework
index d09246eeb0..69000e416b 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit d09246eeb0e7e30bc31cc017af3847ee09b4df08
+Subproject commit 69000e416b7f29a1eaf0aaa7e60f452edb843948
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBouncer.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBouncer.cs
index a15812054f..10d14b5485 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBouncer.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBouncer.cs
@@ -37,7 +37,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
         protected override void LoadComplete()
         {
             base.LoadComplete();
-            icon.Spin(1000);
+            icon.Spin(1000, RotationDirection.Clockwise);
         }
 
         public void UpdateProgress(double progress, int repeat)
diff --git a/osu.Game/Graphics/UserInterface/LoadingAnimation.cs b/osu.Game/Graphics/UserInterface/LoadingAnimation.cs
index 5e293eff03..4f348ebb56 100644
--- a/osu.Game/Graphics/UserInterface/LoadingAnimation.cs
+++ b/osu.Game/Graphics/UserInterface/LoadingAnimation.cs
@@ -34,7 +34,7 @@ namespace osu.Game.Graphics.UserInterface
         {
             base.LoadComplete();
 
-            spinner.Spin(2000);
+            spinner.Spin(2000, RotationDirection.Clockwise);
         }
 
         private const float transition_duration = 500;
diff --git a/osu.Game/Overlays/MedalOverlay.cs b/osu.Game/Overlays/MedalOverlay.cs
index a8974866a7..6e9ad3fafe 100644
--- a/osu.Game/Overlays/MedalOverlay.cs
+++ b/osu.Game/Overlays/MedalOverlay.cs
@@ -199,8 +199,8 @@ namespace osu.Game.Overlays
 
             getSample.Play();
 
-            innerSpin.Spin(20000);
-            outerSpin.Spin(40000);
+            innerSpin.Spin(20000, RotationDirection.Clockwise);
+            outerSpin.Spin(40000, RotationDirection.Clockwise);
 
             using (BeginDelayedSequence(200, true))
             {

From e469a114a6f9ef256c656056883a0111f958948e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Fri, 21 Jul 2017 19:03:43 +0200
Subject: [PATCH 19/30] Update dependency caching according to framework

---
 osu-framework                           |  2 +-
 osu.Game/OsuGame.cs                     | 21 +++++++++++++--------
 osu.Game/OsuGameBase.cs                 | 21 +++++++++++++--------
 osu.Game/Screens/Tournament/Drawings.cs |  5 ++++-
 4 files changed, 31 insertions(+), 18 deletions(-)

diff --git a/osu-framework b/osu-framework
index 2d2e2fe698..a914c8e62b 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 2d2e2fe698ab32d80d5e856f52c8c398ceb35540
+Subproject commit a914c8e62b000c2a796116ecd1cb5e1922ac715f
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 4e99a44a07..f59bd10dc5 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -80,6 +80,11 @@ namespace osu.Game
 
         public void ToggleDirect() => direct.ToggleVisibility();
 
+        private DependencyContainer dependencies;
+
+        protected override IReadOnlyDependencyContainer CreateLocalDependencies(IReadOnlyDependencyContainer parent) =>
+            dependencies = new DependencyContainer(base.CreateLocalDependencies(parent));
+
         [BackgroundDependencyLoader]
         private void load(FrameworkConfigManager frameworkConfig)
         {
@@ -97,7 +102,7 @@ namespace osu.Game
                 Task.Run(() => BeatmapDatabase.Import(paths.ToArray()));
             }
 
-            Dependencies.Cache(this);
+            dependencies.Cache(this);
 
             configRuleset = LocalConfig.GetBindable<int>(OsuSetting.Ruleset);
             Ruleset.Value = RulesetDatabase.GetRuleset(configRuleset.Value);
@@ -207,13 +212,13 @@ namespace osu.Game
                 });
             };
 
-            Dependencies.Cache(settings);
-            Dependencies.Cache(social);
-            Dependencies.Cache(chat);
-            Dependencies.Cache(userProfile);
-            Dependencies.Cache(musicController);
-            Dependencies.Cache(notificationManager);
-            Dependencies.Cache(dialogOverlay);
+            dependencies.Cache(settings);
+            dependencies.Cache(social);
+            dependencies.Cache(chat);
+            dependencies.Cache(userProfile);
+            dependencies.Cache(musicController);
+            dependencies.Cache(notificationManager);
+            dependencies.Cache(dialogOverlay);
 
             // ensure both overlays aren't presented at the same time
             chat.StateChanged += (container, state) => social.State = state == Visibility.Visible ? Visibility.Hidden : social.State;
diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs
index 7a2d91d733..27ad4f20f9 100644
--- a/osu.Game/OsuGameBase.cs
+++ b/osu.Game/OsuGameBase.cs
@@ -81,21 +81,26 @@ namespace osu.Game
             Name = @"osu!lazer";
         }
 
+        private DependencyContainer dependencies;
+
+        protected override IReadOnlyDependencyContainer CreateLocalDependencies(IReadOnlyDependencyContainer parent) =>
+            dependencies = new DependencyContainer(base.CreateLocalDependencies(parent));
+
         [BackgroundDependencyLoader]
         private void load()
         {
-            Dependencies.Cache(this);
-            Dependencies.Cache(LocalConfig);
+            dependencies.Cache(this);
+            dependencies.Cache(LocalConfig);
 
             SQLiteConnection connection = Host.Storage.GetDatabase(@"client");
 
-            Dependencies.Cache(RulesetDatabase = new RulesetDatabase(Host.Storage, connection));
-            Dependencies.Cache(BeatmapDatabase = new BeatmapDatabase(Host.Storage, connection, RulesetDatabase, Host));
-            Dependencies.Cache(ScoreDatabase = new ScoreDatabase(Host.Storage, connection, Host, BeatmapDatabase));
-            Dependencies.Cache(new OsuColour());
+            dependencies.Cache(RulesetDatabase = new RulesetDatabase(Host.Storage, connection));
+            dependencies.Cache(BeatmapDatabase = new BeatmapDatabase(Host.Storage, connection, RulesetDatabase, Host));
+            dependencies.Cache(ScoreDatabase = new ScoreDatabase(Host.Storage, connection, Host, BeatmapDatabase));
+            dependencies.Cache(new OsuColour());
 
             //this completely overrides the framework default. will need to change once we make a proper FontStore.
-            Dependencies.Cache(Fonts = new FontStore { ScaleAdjust = 100 }, true);
+            dependencies.Cache(Fonts = new FontStore { ScaleAdjust = 100 }, true);
 
             Fonts.AddStore(new GlyphStore(Resources, @"Fonts/FontAwesome"));
             Fonts.AddStore(new GlyphStore(Resources, @"Fonts/osuFont"));
@@ -127,7 +132,7 @@ namespace osu.Game
 
             OszArchiveReader.Register();
 
-            Dependencies.Cache(API = new APIAccess
+            dependencies.Cache(API = new APIAccess
             {
                 Username = LocalConfig.Get<string>(OsuSetting.Username),
                 Token = LocalConfig.Get<string>(OsuSetting.Token)
diff --git a/osu.Game/Screens/Tournament/Drawings.cs b/osu.Game/Screens/Tournament/Drawings.cs
index 246fa17e85..78b0940b67 100644
--- a/osu.Game/Screens/Tournament/Drawings.cs
+++ b/osu.Game/Screens/Tournament/Drawings.cs
@@ -47,7 +47,10 @@ namespace osu.Game.Screens.Tournament
 
         public ITeamList TeamList;
 
-        protected override DependencyContainer CreateLocalDependencies(DependencyContainer parent) => new DependencyContainer(parent);
+        private DependencyContainer dependencies;
+
+        protected override IReadOnlyDependencyContainer CreateLocalDependencies(IReadOnlyDependencyContainer parent) =>
+            dependencies = new DependencyContainer(base.CreateLocalDependencies(parent));
 
         [BackgroundDependencyLoader]
         private void load(TextureStore textures, Storage storage, DependencyContainer dependencies)

From 7549d3a2c4b6e1eeb4fa21f80a8f67e9d1c44dab Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Sat, 22 Jul 2017 17:18:20 +0900
Subject: [PATCH 20/30] Allow ChatLines to exist without UserProfileOverlay

Fixes testcases failing when logged in.
---
 osu.Game/Overlays/Chat/ChatLine.cs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/osu.Game/Overlays/Chat/ChatLine.cs b/osu.Game/Overlays/Chat/ChatLine.cs
index c08e62428b..809e771840 100644
--- a/osu.Game/Overlays/Chat/ChatLine.cs
+++ b/osu.Game/Overlays/Chat/ChatLine.cs
@@ -78,7 +78,7 @@ namespace osu.Game.Overlays.Chat
             Padding = new MarginPadding { Left = padding, Right = padding };
         }
 
-        [BackgroundDependencyLoader]
+        [BackgroundDependencyLoader(true)]
         private void load(OsuColour colours, UserProfileOverlay profile)
         {
             customUsernameColour = colours.ChatBlue;

From 4755529d430a9ec6f131a488dc9ef5d598bb31bd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sat, 22 Jul 2017 10:48:15 +0200
Subject: [PATCH 21/30] Minor refactor of TestCaseBeatSyncedContainer

---
 osu-framework                                                | 2 +-
 osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs | 4 +---
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/osu-framework b/osu-framework
index 69000e416b..80850a0949 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 69000e416b7f29a1eaf0aaa7e60f452edb843948
+Subproject commit 80850a09494e5f2df3e41c37a1e17af55ff3dce4
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs b/osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs
index 5e9b976c8a..50d1df9964 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseBeatSyncedContainer.cs
@@ -177,9 +177,7 @@ namespace osu.Desktop.VisualTests.Tests
                 beatsPerMinute.Value = 60000 / timingPoint.BeatLength;
                 adjustedBeatLength.Value = timingPoint.BeatLength;
 
-                flashLayer.ClearTransforms();
-                flashLayer.FadeTo(1);
-                flashLayer.FadeTo(0, timingPoint.BeatLength);
+                flashLayer.FadeOutFromOne(timingPoint.BeatLength);
             }
         }
 

From a4dfe3f1fae915f4a2bb32638323063a747508d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sat, 22 Jul 2017 11:06:07 +0200
Subject: [PATCH 22/30] Update framework

---
 osu-framework | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/osu-framework b/osu-framework
index a914c8e62b..94e887669a 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit a914c8e62b000c2a796116ecd1cb5e1922ac715f
+Subproject commit 94e887669ab4d1784d568c564400c60ff5b865df

From dae0f61b2b5f354674eae382a4ce11040a093471 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sat, 22 Jul 2017 11:09:13 +0200
Subject: [PATCH 23/30] Don't obtain DependencyContainer via DI

---
 osu.Game/Screens/Tournament/Drawings.cs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/osu.Game/Screens/Tournament/Drawings.cs b/osu.Game/Screens/Tournament/Drawings.cs
index 78b0940b67..7cd81a924d 100644
--- a/osu.Game/Screens/Tournament/Drawings.cs
+++ b/osu.Game/Screens/Tournament/Drawings.cs
@@ -53,7 +53,7 @@ namespace osu.Game.Screens.Tournament
             dependencies = new DependencyContainer(base.CreateLocalDependencies(parent));
 
         [BackgroundDependencyLoader]
-        private void load(TextureStore textures, Storage storage, DependencyContainer dependencies)
+        private void load(TextureStore textures, Storage storage)
         {
             this.storage = storage;
 

From 598b3f051e5bfd22c6bb8478af25ed238f5a43a3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sat, 22 Jul 2017 11:15:31 +0200
Subject: [PATCH 24/30] Address CI concerns and update framework

---
 osu-framework                                                | 2 +-
 osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs                 | 1 -
 .../Objects/Drawables/Pieces/SpinnerDisc.cs                  | 1 -
 osu.Game/Graphics/UserInterface/RollingCounter.cs            | 5 +----
 osu.Game/Graphics/UserInterface/StarCounter.cs               | 2 +-
 osu.Game/Screens/Play/HUD/ComboCounter.cs                    | 1 -
 osu.Game/Screens/Tournament/ScrollingTeamContainer.cs        | 1 -
 7 files changed, 3 insertions(+), 10 deletions(-)

diff --git a/osu-framework b/osu-framework
index 80850a0949..4298dcc170 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 80850a09494e5f2df3e41c37a1e17af55ff3dce4
+Subproject commit 4298dcc170f800a6fbe0d3afa3f713df22a95d31
diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
index 0d79bb7109..e74ad69d23 100644
--- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
+++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
@@ -16,7 +16,6 @@ using System.Linq;
 using System.Collections.Generic;
 using osu.Game.Rulesets.Objects.Drawables;
 using osu.Framework.Input;
-using osu.Framework.Graphics.Transforms;
 using osu.Game.Rulesets.Mania.Objects.Drawables;
 using osu.Game.Rulesets.Timing;
 using osu.Framework.Configuration;
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
index 4c5aa36640..98b243b375 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
@@ -4,7 +4,6 @@
 using System;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
-using osu.Framework.Graphics.Transforms;
 using osu.Framework.Input;
 using osu.Game.Graphics;
 using OpenTK;
diff --git a/osu.Game/Graphics/UserInterface/RollingCounter.cs b/osu.Game/Graphics/UserInterface/RollingCounter.cs
index 1ca25491e9..cb657825de 100644
--- a/osu.Game/Graphics/UserInterface/RollingCounter.cs
+++ b/osu.Game/Graphics/UserInterface/RollingCounter.cs
@@ -5,12 +5,10 @@ using osu.Framework.Configuration;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Sprites;
-using osu.Framework.Graphics.Transforms;
 using osu.Game.Graphics.Sprites;
 using System;
 using System.Collections.Generic;
 using OpenTK.Graphics;
-using osu.Framework.MathUtils;
 
 namespace osu.Game.Graphics.UserInterface
 {
@@ -170,8 +168,7 @@ namespace osu.Game.Graphics.UserInterface
         /// implement the rollover animation).
         /// </summary>
         /// <param name="currentValue">Count value before modification.</param>
-        /// <param name="newValue">Expected count value after modification-</param>
-        /// <seealso cref="TransformType"/>
+        /// <param name="newValue">Expected count value after modification.</param>
         protected virtual void TransformCount(T currentValue, T newValue)
         {
             double rollingTotalDuration =
diff --git a/osu.Game/Graphics/UserInterface/StarCounter.cs b/osu.Game/Graphics/UserInterface/StarCounter.cs
index 41ecb56db4..c4f98dcbb7 100644
--- a/osu.Game/Graphics/UserInterface/StarCounter.cs
+++ b/osu.Game/Graphics/UserInterface/StarCounter.cs
@@ -122,7 +122,7 @@ namespace osu.Game.Graphics.UserInterface
             if (value <= i)
                 return minStarScale;
 
-            return i + 1 <= value ? 1.0f : (float)Interpolation.ValueAt(value, minStarScale, 1.0f, i, i + 1);
+            return i + 1 <= value ? 1.0f : Interpolation.ValueAt(value, minStarScale, 1.0f, i, i + 1);
         }
 
         private void transformCount(float newValue)
diff --git a/osu.Game/Screens/Play/HUD/ComboCounter.cs b/osu.Game/Screens/Play/HUD/ComboCounter.cs
index f37b8fc434..c6b1bbcf31 100644
--- a/osu.Game/Screens/Play/HUD/ComboCounter.cs
+++ b/osu.Game/Screens/Play/HUD/ComboCounter.cs
@@ -5,7 +5,6 @@ using osu.Framework.Configuration;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Sprites;
-using osu.Framework.Graphics.Transforms;
 using osu.Game.Graphics.Sprites;
 
 namespace osu.Game.Screens.Play.HUD
diff --git a/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs b/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
index 65ea195da6..8920ca2be8 100644
--- a/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
+++ b/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
@@ -12,7 +12,6 @@ using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Shapes;
 using osu.Framework.Graphics.Sprites;
 using osu.Framework.Graphics.Textures;
-using osu.Framework.Graphics.Transforms;
 using osu.Framework.Threading;
 using OpenTK;
 using OpenTK.Graphics;

From 7e895f66e016b8c3711856b79c1e5d3ce9c1ef3b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sat, 22 Jul 2017 11:09:13 +0200
Subject: [PATCH 25/30] Don't obtain DependencyContainer via DI

---
 osu.Game/Screens/Tournament/Drawings.cs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/osu.Game/Screens/Tournament/Drawings.cs b/osu.Game/Screens/Tournament/Drawings.cs
index 78b0940b67..7cd81a924d 100644
--- a/osu.Game/Screens/Tournament/Drawings.cs
+++ b/osu.Game/Screens/Tournament/Drawings.cs
@@ -53,7 +53,7 @@ namespace osu.Game.Screens.Tournament
             dependencies = new DependencyContainer(base.CreateLocalDependencies(parent));
 
         [BackgroundDependencyLoader]
-        private void load(TextureStore textures, Storage storage, DependencyContainer dependencies)
+        private void load(TextureStore textures, Storage storage)
         {
             this.storage = storage;
 

From 96675965d87dfc50ee083065ed6852e1d63c5944 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sat, 22 Jul 2017 12:16:46 +0200
Subject: [PATCH 26/30] Fix broken test case

---
 osu-framework                                 |  2 +-
 .../Beatmaps/IO/ImportBeatmapTest.cs          | 37 ++++++++++---------
 2 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/osu-framework b/osu-framework
index 94e887669a..921175c209 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 94e887669ab4d1784d568c564400c60ff5b865df
+Subproject commit 921175c209840ba0787338be9e4aada6e95be7a5
diff --git a/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs b/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
index e467df0c53..24970b8dab 100644
--- a/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
+++ b/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
@@ -12,6 +12,7 @@ using osu.Framework.Desktop.Platform;
 using osu.Framework.Platform;
 using osu.Game.Database;
 using osu.Game.IPC;
+using osu.Framework.Allocation;
 
 namespace osu.Game.Tests.Beatmaps.IO
 {
@@ -26,15 +27,15 @@ namespace osu.Game.Tests.Beatmaps.IO
             //unfortunately for the time being we need to reference osu.Framework.Desktop for a game host here.
             using (HeadlessGameHost host = new HeadlessGameHost())
             {
-                loadOsu(host);
+                var osu = loadOsu(host);
 
                 var temp = prepareTempCopy(osz_path);
 
                 Assert.IsTrue(File.Exists(temp));
 
-                host.Dependencies.Get<BeatmapDatabase>().Import(temp);
+                osu.Dependencies.Get<BeatmapDatabase>().Import(temp);
 
-                ensureLoaded(host);
+                ensureLoaded(osu);
 
                 Assert.IsFalse(File.Exists(temp));
             }
@@ -49,7 +50,7 @@ namespace osu.Game.Tests.Beatmaps.IO
                 Assert.IsTrue(host.IsPrimaryInstance);
                 Assert.IsTrue(!client.IsPrimaryInstance);
 
-                loadOsu(host);
+                var osu = loadOsu(host);
 
                 var temp = prepareTempCopy(osz_path);
 
@@ -59,7 +60,7 @@ namespace osu.Game.Tests.Beatmaps.IO
                 if (!importer.ImportAsync(temp).Wait(10000))
                     Assert.Fail(@"IPC took too long to send");
 
-                ensureLoaded(host);
+                ensureLoaded(osu);
 
                 Assert.IsFalse(File.Exists(temp));
             }
@@ -71,16 +72,16 @@ namespace osu.Game.Tests.Beatmaps.IO
             //unfortunately for the time being we need to reference osu.Framework.Desktop for a game host here.
             using (HeadlessGameHost host = new HeadlessGameHost())
             {
-                loadOsu(host);
+                var osu = loadOsu(host);
 
                 var temp = prepareTempCopy(osz_path);
 
                 Assert.IsTrue(File.Exists(temp), "Temporary file copy never substantiated");
 
                 using (File.OpenRead(temp))
-                    host.Dependencies.Get<BeatmapDatabase>().Import(temp);
+                    osu.Dependencies.Get<BeatmapDatabase>().Import(temp);
 
-                ensureLoaded(host);
+                ensureLoaded(osu);
 
                 File.Delete(temp);
 
@@ -103,19 +104,19 @@ namespace osu.Game.Tests.Beatmaps.IO
                 Thread.Sleep(1);
 
             //reset beatmap database (sqlite and storage backing)
-            host.Dependencies.Get<RulesetDatabase>().Reset();
-            host.Dependencies.Get<BeatmapDatabase>().Reset();
+            osu.Dependencies.Get<RulesetDatabase>().Reset();
+            osu.Dependencies.Get<BeatmapDatabase>().Reset();
 
             return osu;
         }
 
-        private void ensureLoaded(GameHost host, int timeout = 60000)
+        private void ensureLoaded(OsuGameBase osu, int timeout = 60000)
         {
             IEnumerable<BeatmapSetInfo> resultSets = null;
 
             Action waitAction = () =>
             {
-                while (!(resultSets = host.Dependencies.Get<BeatmapDatabase>()
+                while (!(resultSets = osu.Dependencies.Get<BeatmapDatabase>()
                     .Query<BeatmapSetInfo>().Where(s => s.OnlineBeatmapSetID == 241526)).Any())
                     Thread.Sleep(50);
             };
@@ -132,7 +133,7 @@ namespace osu.Game.Tests.Beatmaps.IO
             //if we don't re-check here, the set will be inserted but the beatmaps won't be present yet.
             waitAction = () =>
             {
-                while ((resultBeatmaps = host.Dependencies.Get<BeatmapDatabase>()
+                while ((resultBeatmaps = osu.Dependencies.Get<BeatmapDatabase>()
                     .GetAllWithChildren<BeatmapInfo>(s => s.OnlineBeatmapSetID == 241526 && s.BaseDifficultyID > 0)).Count() != 12)
                     Thread.Sleep(50);
             };
@@ -140,7 +141,7 @@ namespace osu.Game.Tests.Beatmaps.IO
             Assert.IsTrue(waitAction.BeginInvoke(null, null).AsyncWaitHandle.WaitOne(timeout),
                 @"Beatmaps did not import to the database in allocated time");
 
-            var set = host.Dependencies.Get<BeatmapDatabase>().GetChildren(resultSets.First());
+            var set = osu.Dependencies.Get<BeatmapDatabase>().GetChildren(resultSets.First());
 
             Assert.IsTrue(set.Beatmaps.Count == resultBeatmaps.Count(),
                 $@"Incorrect database beatmap count post-import ({resultBeatmaps.Count()} but should be {set.Beatmaps.Count}).");
@@ -150,16 +151,16 @@ namespace osu.Game.Tests.Beatmaps.IO
 
             Assert.IsTrue(set.Beatmaps.Count > 0);
 
-            var beatmap = host.Dependencies.Get<BeatmapDatabase>().GetWorkingBeatmap(set.Beatmaps.First(b => b.RulesetID == 0))?.Beatmap;
+            var beatmap = osu.Dependencies.Get<BeatmapDatabase>().GetWorkingBeatmap(set.Beatmaps.First(b => b.RulesetID == 0))?.Beatmap;
             Assert.IsTrue(beatmap?.HitObjects.Count > 0);
 
-            beatmap = host.Dependencies.Get<BeatmapDatabase>().GetWorkingBeatmap(set.Beatmaps.First(b => b.RulesetID == 1))?.Beatmap;
+            beatmap = osu.Dependencies.Get<BeatmapDatabase>().GetWorkingBeatmap(set.Beatmaps.First(b => b.RulesetID == 1))?.Beatmap;
             Assert.IsTrue(beatmap?.HitObjects.Count > 0);
 
-            beatmap = host.Dependencies.Get<BeatmapDatabase>().GetWorkingBeatmap(set.Beatmaps.First(b => b.RulesetID == 2))?.Beatmap;
+            beatmap = osu.Dependencies.Get<BeatmapDatabase>().GetWorkingBeatmap(set.Beatmaps.First(b => b.RulesetID == 2))?.Beatmap;
             Assert.IsTrue(beatmap?.HitObjects.Count > 0);
 
-            beatmap = host.Dependencies.Get<BeatmapDatabase>().GetWorkingBeatmap(set.Beatmaps.First(b => b.RulesetID == 3))?.Beatmap;
+            beatmap = osu.Dependencies.Get<BeatmapDatabase>().GetWorkingBeatmap(set.Beatmaps.First(b => b.RulesetID == 3))?.Beatmap;
             Assert.IsTrue(beatmap?.HitObjects.Count > 0);
         }
     }

From c08cb43b9c6be83dd8c921bdc68f10b481a79210 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sat, 22 Jul 2017 13:49:41 +0200
Subject: [PATCH 27/30] Update framework

---
 osu-framework | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/osu-framework b/osu-framework
index 921175c209..8fde46d214 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 921175c209840ba0787338be9e4aada6e95be7a5
+Subproject commit 8fde46d214e4ababb46100d2e4488ca26a9d43a3

From e68675f970103ba18c75dfee3cb80c4874f7cde8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas94@gmx.net>
Date: Sat, 22 Jul 2017 20:50:25 +0200
Subject: [PATCH 28/30] Rename EasingTypes to Easing

---
 osu-framework                                 |  2 +-
 .../Tests/TestCaseContextMenu.cs              |  8 ++--
 .../Tests/TestCaseKeyCounter.cs               |  2 +-
 .../Tests/TestCaseScrollingHitObjects.cs      |  2 +-
 osu.Game.Rulesets.Mania/UI/Column.cs          |  8 ++--
 osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs  |  6 +--
 .../Connections/FollowPointRenderer.cs        |  4 +-
 .../Objects/Drawables/DrawableHitCircle.cs    |  2 +-
 .../Objects/Drawables/DrawableOsuJudgement.cs |  2 +-
 .../Objects/Drawables/DrawableSliderTick.cs   |  6 +--
 .../Objects/Drawables/DrawableSpinner.cs      | 14 +++----
 .../Objects/Drawables/Pieces/SliderBall.cs    |  4 +-
 .../Objects/Drawables/Pieces/SpinnerDisc.cs   |  6 +--
 .../Replays/OsuAutoGenerator.cs               |  8 ++--
 .../Objects/Drawables/DrawableDrumRollTick.cs |  2 +-
 .../Objects/Drawables/DrawableHit.cs          |  6 +--
 .../Objects/Drawables/DrawableSwell.cs        | 10 ++---
 .../Objects/Drawables/Pieces/CirclePiece.cs   |  4 +-
 osu.Game.Rulesets.Taiko/UI/HitExplosion.cs    |  2 +-
 osu.Game.Rulesets.Taiko/UI/InputDrum.cs       | 12 +++---
 .../UI/KiaiHitExplosion.cs                    |  2 +-
 .../Beatmaps/Drawables/BeatmapSetHeader.cs    |  2 +-
 osu.Game/Beatmaps/Drawables/Panel.cs          |  2 +-
 .../Graphics/Containers/ParallaxContainer.cs  |  4 +-
 osu.Game/Graphics/Cursor/GameplayCursor.cs    |  4 +-
 osu.Game/Graphics/Cursor/MenuCursor.cs        | 22 +++++------
 .../Graphics/Cursor/OsuTooltipContainer.cs    | 10 ++---
 osu.Game/Graphics/IHasAccentColour.cs         |  2 +-
 osu.Game/Graphics/UserInterface/Bar.cs        |  2 +-
 .../UserInterface/BreadcrumbControl.cs        | 10 ++---
 .../Graphics/UserInterface/DialogButton.cs    | 14 +++----
 osu.Game/Graphics/UserInterface/IconButton.cs | 10 ++---
 osu.Game/Graphics/UserInterface/LineGraph.cs  |  2 +-
 .../UserInterface/LoadingAnimation.cs         |  4 +-
 osu.Game/Graphics/UserInterface/Nub.cs        | 10 ++---
 osu.Game/Graphics/UserInterface/OsuButton.cs  |  4 +-
 .../Graphics/UserInterface/OsuContextMenu.cs  |  6 +--
 .../UserInterface/OsuContextMenuItem.cs       |  8 ++--
 osu.Game/Graphics/UserInterface/OsuMenu.cs    |  6 +--
 .../UserInterface/OsuPasswordTextBox.cs       |  4 +-
 .../Graphics/UserInterface/OsuSliderBar.cs    |  2 +-
 .../Graphics/UserInterface/OsuTabControl.cs   |  8 ++--
 .../UserInterface/OsuTabControlCheckbox.cs    |  8 ++--
 .../Graphics/UserInterface/RollingCounter.cs  |  2 +-
 .../Graphics/UserInterface/ScoreCounter.cs    |  2 +-
 .../Graphics/UserInterface/StarCounter.cs     |  2 +-
 .../Graphics/UserInterface/TwoLayerButton.cs  | 18 ++++-----
 .../UserInterface/Volume/VolumeMeter.cs       |  2 +-
 osu.Game/OsuGame.cs                           |  4 +-
 osu.Game/Overlays/Chat/ChannelListItem.cs     |  2 +-
 .../Overlays/Chat/ChannelSelectionOverlay.cs  | 10 ++---
 osu.Game/Overlays/Chat/ChatTabControl.cs      | 22 +++++------
 osu.Game/Overlays/ChatOverlay.cs              | 16 ++++----
 osu.Game/Overlays/Dialog/PopupDialog.cs       | 10 ++---
 osu.Game/Overlays/DialogOverlay.cs            |  4 +-
 osu.Game/Overlays/Direct/DirectGridPanel.cs   |  4 +-
 osu.Game/Overlays/Direct/DirectListPanel.cs   | 10 ++---
 osu.Game/Overlays/Direct/DirectPanel.cs       |  2 +-
 osu.Game/Overlays/DirectOverlay.cs            |  2 +-
 osu.Game/Overlays/LoginOverlay.cs             |  4 +-
 osu.Game/Overlays/MedalOverlay.cs             |  6 +--
 .../Overlays/MedalSplash/DrawableMedal.cs     | 10 ++---
 osu.Game/Overlays/Mods/ModButton.cs           |  6 +--
 osu.Game/Overlays/Mods/ModSelectOverlay.cs    | 20 +++++-----
 osu.Game/Overlays/Music/PlaylistList.cs       |  2 +-
 osu.Game/Overlays/Music/PlaylistOverlay.cs    |  6 +--
 osu.Game/Overlays/MusicController.cs          | 20 +++++-----
 osu.Game/Overlays/NotificationManager.cs      |  6 +--
 .../Overlays/Notifications/Notification.cs    |  4 +-
 .../Notifications/NotificationSection.cs      |  2 +-
 .../Notifications/ProgressNotification.cs     |  4 +-
 osu.Game/Overlays/OnScreenDisplay.cs          | 16 ++++----
 osu.Game/Overlays/Profile/ProfileHeader.cs    |  4 +-
 osu.Game/Overlays/Profile/RankChart.cs        |  4 +-
 .../Sections/General/LoginSettings.cs         |  2 +-
 .../Sections/Graphics/LayoutSettings.cs       |  4 +-
 osu.Game/Overlays/Settings/Sidebar.cs         |  4 +-
 osu.Game/Overlays/SettingsOverlay.cs          |  8 ++--
 osu.Game/Overlays/Toolbar/Toolbar.cs          | 14 +++----
 osu.Game/Overlays/Toolbar/ToolbarButton.cs    |  2 +-
 .../Overlays/Toolbar/ToolbarModeSelector.cs   |  2 +-
 osu.Game/Overlays/UserProfileOverlay.cs       |  4 +-
 osu.Game/Overlays/WaveOverlayContainer.cs     | 16 ++++----
 .../Rulesets/Judgements/DrawableJudgement.cs  | 10 ++---
 osu.Game/Screens/BackgroundScreen.cs          | 12 +++---
 .../Backgrounds/BackgroundScreenBeatmap.cs    |  2 +-
 .../Backgrounds/BackgroundScreenDefault.cs    |  2 +-
 osu.Game/Screens/Menu/Button.cs               | 38 +++++++++----------
 osu.Game/Screens/Menu/ButtonSystem.cs         | 14 +++----
 osu.Game/Screens/Menu/Intro.cs                |  4 +-
 osu.Game/Screens/Menu/MainMenu.cs             | 12 +++---
 osu.Game/Screens/Menu/MenuSideFlashes.cs      |  2 +-
 osu.Game/Screens/Menu/OsuLogo.cs              | 26 ++++++-------
 osu.Game/Screens/Multiplayer/DrawableRoom.cs  |  2 +-
 osu.Game/Screens/Multiplayer/RoomInspector.cs |  2 +-
 osu.Game/Screens/Play/HUD/ComboCounter.cs     |  4 +-
 .../Screens/Play/HUD/ComboResultCounter.cs    |  2 +-
 osu.Game/Screens/Play/HUD/ModDisplay.cs       |  8 ++--
 .../Screens/Play/HUD/StandardHealthDisplay.cs |  6 +--
 osu.Game/Screens/Play/HotkeyRetryOverlay.cs   |  4 +-
 osu.Game/Screens/Play/MenuOverlay.cs          |  4 +-
 osu.Game/Screens/Play/Player.cs               | 10 ++---
 osu.Game/Screens/Play/PlayerLoader.cs         |  8 ++--
 .../Play/ReplaySettings/ReplayGroup.cs        |  6 +--
 osu.Game/Screens/Play/SkipButton.cs           | 26 ++++++-------
 osu.Game/Screens/Play/SongProgress.cs         |  6 +--
 osu.Game/Screens/Ranking/ResultModeButton.cs  |  4 +-
 osu.Game/Screens/Ranking/Results.cs           | 22 +++++------
 osu.Game/Screens/Ranking/ResultsPageScore.cs  |  6 +--
 osu.Game/Screens/ScreenWhiteBox.cs            | 20 +++++-----
 osu.Game/Screens/Select/BeatmapCarousel.cs    | 10 ++---
 osu.Game/Screens/Select/BeatmapDetails.cs     | 10 ++---
 osu.Game/Screens/Select/BeatmapInfoWedge.cs   |  8 ++--
 osu.Game/Screens/Select/Footer.cs             |  2 +-
 osu.Game/Screens/Select/FooterButton.cs       | 14 +++----
 .../Select/Leaderboards/LeaderboardScore.cs   | 14 +++----
 .../Select/Options/BeatmapOptionsButton.cs    |  6 +--
 .../Select/Options/BeatmapOptionsOverlay.cs   | 16 ++++----
 osu.Game/Screens/Select/SongSelect.cs         |  4 +-
 .../Tournament/ScrollingTeamContainer.cs      |  2 +-
 osu.Game/Users/UserPanel.cs                   | 14 +++----
 121 files changed, 450 insertions(+), 450 deletions(-)

diff --git a/osu-framework b/osu-framework
index 8fde46d214..eda38950b5 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 8fde46d214e4ababb46100d2e4488ca26a9d43a3
+Subproject commit eda38950b57fe0693e1faa6ad8e55f2da9665f91
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs b/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
index bf8f9bf7f4..0b4e8a5799 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseContextMenu.cs
@@ -88,10 +88,10 @@ namespace osu.Desktop.VisualTests.Tests
             {
                 new OsuContextMenuItem(@"Simple option"),
                 new OsuContextMenuItem(@"Simple very very long option"),
-                new OsuContextMenuItem(@"Change width", MenuItemType.Highlighted) { Action = () => this.ResizeWidthTo(Width * 2, 100, EasingTypes.OutQuint) },
-                new OsuContextMenuItem(@"Change height", MenuItemType.Highlighted) { Action = () => this.ResizeHeightTo(Height * 2, 100, EasingTypes.OutQuint) },
-                new OsuContextMenuItem(@"Change width back", MenuItemType.Destructive) { Action = () => this.ResizeWidthTo(Width / 2, 100, EasingTypes.OutQuint) },
-                new OsuContextMenuItem(@"Change height back", MenuItemType.Destructive) { Action = () => this.ResizeHeightTo(Height / 2, 100, EasingTypes.OutQuint) },
+                new OsuContextMenuItem(@"Change width", MenuItemType.Highlighted) { Action = () => this.ResizeWidthTo(Width * 2, 100, Easing.OutQuint) },
+                new OsuContextMenuItem(@"Change height", MenuItemType.Highlighted) { Action = () => this.ResizeHeightTo(Height * 2, 100, Easing.OutQuint) },
+                new OsuContextMenuItem(@"Change width back", MenuItemType.Destructive) { Action = () => this.ResizeWidthTo(Width / 2, 100, Easing.OutQuint) },
+                new OsuContextMenuItem(@"Change height back", MenuItemType.Destructive) { Action = () => this.ResizeHeightTo(Height / 2, 100, Easing.OutQuint) },
             };
         }
     }
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseKeyCounter.cs b/osu.Desktop.VisualTests/Tests/TestCaseKeyCounter.cs
index 87a40a76ca..f65dbe7a64 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseKeyCounter.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseKeyCounter.cs
@@ -96,7 +96,7 @@ namespace osu.Desktop.VisualTests.Tests
             {
                 SelectionBox.ScaleTo(
                     new Vector2(value, 1),
-                    300, EasingTypes.OutQuint);
+                    300, Easing.OutQuint);
             }
         }
     }
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseScrollingHitObjects.cs b/osu.Desktop.VisualTests/Tests/TestCaseScrollingHitObjects.cs
index eed2fa95c1..43f30a96b0 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseScrollingHitObjects.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseScrollingHitObjects.cs
@@ -196,7 +196,7 @@ namespace osu.Desktop.VisualTests.Tests
             protected override void LoadComplete()
             {
                 base.LoadComplete();
-                this.FadeInFromZero(250, EasingTypes.OutQuint);
+                this.FadeInFromZero(250, Easing.OutQuint);
             }
 
             protected override void Update()
diff --git a/osu.Game.Rulesets.Mania/UI/Column.cs b/osu.Game.Rulesets.Mania/UI/Column.cs
index 12b6f61a12..a4d292ec45 100644
--- a/osu.Game.Rulesets.Mania/UI/Column.cs
+++ b/osu.Game.Rulesets.Mania/UI/Column.cs
@@ -206,8 +206,8 @@ namespace osu.Game.Rulesets.Mania.UI
 
             if (args.Key == Key)
             {
-                background.FadeTo(background.Alpha + 0.2f, 50, EasingTypes.OutQuint);
-                keyIcon.ScaleTo(1.4f, 50, EasingTypes.OutQuint);
+                background.FadeTo(background.Alpha + 0.2f, 50, Easing.OutQuint);
+                keyIcon.ScaleTo(1.4f, 50, Easing.OutQuint);
             }
 
             return false;
@@ -217,8 +217,8 @@ namespace osu.Game.Rulesets.Mania.UI
         {
             if (args.Key == Key)
             {
-                background.FadeTo(0.2f, 800, EasingTypes.OutQuart);
-                keyIcon.ScaleTo(1f, 400, EasingTypes.OutQuart);
+                background.FadeTo(0.2f, 800, Easing.OutQuart);
+                keyIcon.ScaleTo(1f, 400, Easing.OutQuart);
             }
 
             return false;
diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
index e74ad69d23..03b6e18856 100644
--- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
+++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
@@ -220,10 +220,10 @@ namespace osu.Game.Rulesets.Mania.UI
                 switch (args.Key)
                 {
                     case Key.Minus:
-                        transformVisibleTimeRangeTo(visibleTimeRange + time_span_step, 200, EasingTypes.OutQuint);
+                        transformVisibleTimeRangeTo(visibleTimeRange + time_span_step, 200, Easing.OutQuint);
                         break;
                     case Key.Plus:
-                        transformVisibleTimeRangeTo(visibleTimeRange - time_span_step, 200, EasingTypes.OutQuint);
+                        transformVisibleTimeRangeTo(visibleTimeRange - time_span_step, 200, Easing.OutQuint);
                         break;
                 }
             }
@@ -231,7 +231,7 @@ namespace osu.Game.Rulesets.Mania.UI
             return false;
         }
 
-        private void transformVisibleTimeRangeTo(double newTimeRange, double duration = 0, EasingTypes easing = EasingTypes.None)
+        private void transformVisibleTimeRangeTo(double newTimeRange, double duration = 0, Easing easing = Easing.None)
         {
             this.TransformTo(nameof(visibleTimeRange), newTimeRange, duration, easing);
         }
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs
index 42c148b525..2396e5d129 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Connections/FollowPointRenderer.cs
@@ -94,9 +94,9 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Connections
                         using (fp.BeginAbsoluteSequence(fadeInTime))
                         {
                             fp.FadeIn(DrawableOsuHitObject.TIME_FADEIN);
-                            fp.ScaleTo(1, DrawableOsuHitObject.TIME_FADEIN, EasingTypes.Out);
+                            fp.ScaleTo(1, DrawableOsuHitObject.TIME_FADEIN, Easing.Out);
 
-                            fp.MoveTo(pointEndPosition, DrawableOsuHitObject.TIME_FADEIN, EasingTypes.Out);
+                            fp.MoveTo(pointEndPosition, DrawableOsuHitObject.TIME_FADEIN, Easing.Out);
 
                             fp.Delay(fadeOutTime - fadeInTime).FadeOut(DrawableOsuHitObject.TIME_FADEIN);
                         }
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
index a890a0cdb4..f68a7a765b 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs
@@ -143,7 +143,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
                         number.FadeOut();
 
                         this.FadeOut(800)
-                            .ScaleTo(Scale * 1.5f, 400, EasingTypes.OutQuad);
+                            .ScaleTo(Scale * 1.5f, 400, Easing.OutQuad);
                     }
 
                     Expire();
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuJudgement.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuJudgement.cs
index eaa0bb7d27..892d106b02 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuJudgement.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuJudgement.cs
@@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
         protected override void LoadComplete()
         {
             if (Judgement.Result != HitResult.Miss)
-                JudgementText.TransformSpacingTo(new Vector2(14, 0), 1800, EasingTypes.OutQuint);
+                JudgementText.TransformSpacingTo(new Vector2(14, 0), 1800, Easing.OutQuint);
 
             base.LoadComplete();
         }
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
index 4220299a25..2a50b23047 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs
@@ -66,7 +66,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
                 d => d.FadeIn(animIn),
                 d => d.ScaleTo(0.5f).ScaleTo(1.2f, animIn)
             ).Then(
-                d => d.ScaleTo(1, 150, EasingTypes.Out)
+                d => d.ScaleTo(1, 150, Easing.Out)
             );
         }
 
@@ -82,8 +82,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
                         .FadeColour(Color4.Red, 80);
                     break;
                 case ArmedState.Hit:
-                    this.FadeOut(120, EasingTypes.OutQuint)
-                        .ScaleTo(Scale * 1.5f, 120, EasingTypes.OutQuint);
+                    this.FadeOut(120, Easing.OutQuint)
+                        .ScaleTo(Scale * 1.5f, 120, Easing.OutQuint);
                     break;
             }
         }
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index c7d838e517..2aae1bb24e 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -174,9 +174,9 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             ticks.Rotation = disc.Rotation;
 
             float relativeCircleScale = spinner.Scale * circle.DrawHeight / mainContainer.DrawHeight;
-            disc.ScaleTo(relativeCircleScale + (1 - relativeCircleScale) * Progress, 200, EasingTypes.OutQuint);
+            disc.ScaleTo(relativeCircleScale + (1 - relativeCircleScale) * Progress, 200, Easing.OutQuint);
 
-            symbol.RotateTo(disc.Rotation / 2, 500, EasingTypes.OutQuint);
+            symbol.RotateTo(disc.Rotation / 2, 500, Easing.OutQuint);
         }
 
         protected override void UpdatePreemptState()
@@ -184,16 +184,16 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             base.UpdatePreemptState();
 
             circleContainer.ScaleTo(spinner.Scale * 0.3f);
-            circleContainer.ScaleTo(spinner.Scale, TIME_PREEMPT / 1.4f, EasingTypes.OutQuint);
+            circleContainer.ScaleTo(spinner.Scale, TIME_PREEMPT / 1.4f, Easing.OutQuint);
 
             disc.RotateTo(-720);
             symbol.RotateTo(-720);
 
             mainContainer
                 .ScaleTo(0)
-                .ScaleTo(spinner.Scale * circle.DrawHeight / DrawHeight * 1.4f, TIME_PREEMPT - 150, EasingTypes.OutQuint)
+                .ScaleTo(spinner.Scale * circle.DrawHeight / DrawHeight * 1.4f, TIME_PREEMPT - 150, Easing.OutQuint)
                 .Then()
-                .ScaleTo(1, 500, EasingTypes.OutQuint);
+                .ScaleTo(1, 500, Easing.OutQuint);
         }
 
         protected override void UpdateCurrentState(ArmedState state)
@@ -203,10 +203,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
             switch (state)
             {
                 case ArmedState.Hit:
-                    sequence.ScaleTo(Scale * 1.2f, 320, EasingTypes.Out);
+                    sequence.ScaleTo(Scale * 1.2f, 320, Easing.Out);
                     break;
                 case ArmedState.Miss:
-                    sequence.ScaleTo(Scale * 0.8f, 320, EasingTypes.In);
+                    sequence.ScaleTo(Scale * 0.8f, 320, Easing.In);
                     break;
             }
 
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBall.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBall.cs
index 9a114aa72c..dbfd9b291b 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBall.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBall.cs
@@ -106,8 +106,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
 
                 tracking = value;
 
-                follow.ScaleTo(tracking ? 2.8f : 1, 300, EasingTypes.OutQuint);
-                follow.FadeTo(tracking ? 0.2f : 0, 300, EasingTypes.OutQuint);
+                follow.ScaleTo(tracking ? 2.8f : 1, 300, Easing.OutQuint);
+                follow.FadeTo(tracking ? 0.2f : 0, 300, Easing.OutQuint);
             }
         }
 
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
index 98b243b375..cd808abe9d 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs
@@ -128,12 +128,12 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
             {
                 background.FinishTransforms(false, nameof(Alpha));
                 background
-                    .FadeTo(tracking_alpha + 0.2f, 60, EasingTypes.OutExpo)
+                    .FadeTo(tracking_alpha + 0.2f, 60, Easing.OutExpo)
                     .Then()
-                    .FadeTo(tracking_alpha, 250, EasingTypes.OutQuint);
+                    .FadeTo(tracking_alpha, 250, Easing.OutQuint);
             }
 
-            this.RotateTo(currentRotation / 2, validAndTracking ? 500 : 1500, EasingTypes.OutExpo);
+            this.RotateTo(currentRotation / 2, validAndTracking ? 500 : 1500, Easing.OutExpo);
         }
     }
 }
diff --git a/osu.Game.Rulesets.Osu/Replays/OsuAutoGenerator.cs b/osu.Game.Rulesets.Osu/Replays/OsuAutoGenerator.cs
index 5ede3f56f5..b92f1bc60a 100644
--- a/osu.Game.Rulesets.Osu/Replays/OsuAutoGenerator.cs
+++ b/osu.Game.Rulesets.Osu/Replays/OsuAutoGenerator.cs
@@ -36,7 +36,7 @@ namespace osu.Game.Rulesets.Osu.Replays
         /// <summary>
         /// What easing to use when moving between hitobjects
         /// </summary>
-        private EasingTypes preferredEasing => DelayedMovements ? EasingTypes.InOutCubic : EasingTypes.Out;
+        private Easing preferredEasing => DelayedMovements ? Easing.InOutCubic : Easing.Out;
 
         #endregion
 
@@ -110,7 +110,7 @@ namespace osu.Game.Rulesets.Osu.Replays
         {
             // Default values for circles/sliders
             Vector2 startPosition = h.StackedPosition;
-            EasingTypes easing = preferredEasing;
+            Easing easing = preferredEasing;
             float spinnerDirection = -1;
 
             // The startPosition for the slider should not be its .Position, but the point on the circle whose tangent crosses the current cursor position
@@ -125,7 +125,7 @@ namespace osu.Game.Rulesets.Osu.Replays
                 if (spinCentreOffset.Length > SPIN_RADIUS)
                 {
                     // If moving in from the outside, don't ease out (default eases out). This means auto will "start" spinning immediately after moving into position.
-                    easing = EasingTypes.In;
+                    easing = Easing.In;
                 }
             }
 
@@ -190,7 +190,7 @@ namespace osu.Game.Rulesets.Osu.Replays
             }
         }
 
-        private void moveToHitObject(double targetTime, Vector2 targetPos, double hitObjectRadius, EasingTypes easing)
+        private void moveToHitObject(double targetTime, Vector2 targetPos, double hitObjectRadius, Easing easing)
         {
             ReplayFrame lastFrame = Frames[Frames.Count - 1];
 
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs
index 56a747467e..b64bc64d9b 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs
@@ -41,7 +41,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
             switch (state)
             {
                 case ArmedState.Hit:
-                    Content.ScaleTo(0, 100, EasingTypes.OutQuint);
+                    Content.ScaleTo(0, 100, Easing.OutQuint);
                     break;
             }
         }
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
index 1d614b4adb..0d5c8d2a25 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs
@@ -90,12 +90,12 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
                         const float gravity_time = 300;
                         const float gravity_travel_height = 200;
 
-                        Content.ScaleTo(0.8f, gravity_time * 2, EasingTypes.OutQuad);
+                        Content.ScaleTo(0.8f, gravity_time * 2, Easing.OutQuad);
 
                         this.FadeOut(800)
-                            .MoveToY(-gravity_travel_height, gravity_time, EasingTypes.Out)
+                            .MoveToY(-gravity_travel_height, gravity_time, Easing.Out)
                             .Then()
-                            .MoveToY(gravity_travel_height * 2, gravity_time * 2, EasingTypes.In);
+                            .MoveToY(gravity_travel_height * 2, gravity_time * 2, Easing.In);
 
                         Expire();
                         break;
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
index 521d225abe..a565f92fac 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
@@ -150,11 +150,11 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
                 expandingRing
                     .FadeTo(expandingRing.Alpha + MathHelper.Clamp(completion / 16, 0.1f, 0.6f), 50)
                     .Then()
-                    .FadeTo(completion / 8, 2000, EasingTypes.OutQuint);
+                    .FadeTo(completion / 8, 2000, Easing.OutQuint);
 
-                symbol.RotateTo((float)(completion * HitObject.Duration / 8), 4000, EasingTypes.OutQuint);
+                symbol.RotateTo((float)(completion * HitObject.Duration / 8), 4000, Easing.OutQuint);
 
-                expandingRing.ScaleTo(1f + Math.Min(target_ring_scale - 1f, (target_ring_scale - 1f) * completion * 1.3f), 260, EasingTypes.OutQuint);
+                expandingRing.ScaleTo(1f + Math.Min(target_ring_scale - 1f, (target_ring_scale - 1f) * completion * 1.3f), 260, Easing.OutQuint);
 
                 if (userHits == HitObject.RequiredHits)
                 {
@@ -186,8 +186,8 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
             double untilStartTime = HitObject.StartTime - Time.Current;
             double untilJudgement = untilStartTime + Judgement.TimeOffset + HitObject.Duration;
 
-            targetRing.Delay(untilStartTime - preempt).ScaleTo(target_ring_scale, preempt * 4, EasingTypes.OutQuint);
-            this.Delay(untilJudgement).FadeOut(out_transition_time, EasingTypes.Out);
+            targetRing.Delay(untilStartTime - preempt).ScaleTo(target_ring_scale, preempt * 4, Easing.OutQuint);
+            this.Delay(untilJudgement).FadeOut(out_transition_time, Easing.Out);
 
             switch (state)
             {
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/CirclePiece.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/CirclePiece.cs
index a4cd026e4c..698939e278 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/CirclePiece.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/Pieces/CirclePiece.cs
@@ -167,9 +167,9 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces
             double duration = timingPoint.BeatLength * 2;
 
             background
-                .FadeEdgeEffectTo(1, pre_beat_transition_time, EasingTypes.OutQuint)
+                .FadeEdgeEffectTo(1, pre_beat_transition_time, Easing.OutQuint)
                 .Then()
-                .FadeEdgeEffectTo(edge_alpha_kiai, duration, EasingTypes.OutQuint);
+                .FadeEdgeEffectTo(edge_alpha_kiai, duration, Easing.OutQuint);
         }
     }
 }
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Taiko/UI/HitExplosion.cs b/osu.Game.Rulesets.Taiko/UI/HitExplosion.cs
index 8766f7b9f5..c372ac1809 100644
--- a/osu.Game.Rulesets.Taiko/UI/HitExplosion.cs
+++ b/osu.Game.Rulesets.Taiko/UI/HitExplosion.cs
@@ -62,7 +62,7 @@ namespace osu.Game.Rulesets.Taiko.UI
         {
             base.LoadComplete();
 
-            this.ScaleTo(3f, 1000, EasingTypes.OutQuint);
+            this.ScaleTo(3f, 1000, Easing.OutQuint);
             this.FadeOut(500);
 
             Expire();
diff --git a/osu.Game.Rulesets.Taiko/UI/InputDrum.cs b/osu.Game.Rulesets.Taiko/UI/InputDrum.cs
index a413d77d16..60881f3c24 100644
--- a/osu.Game.Rulesets.Taiko/UI/InputDrum.cs
+++ b/osu.Game.Rulesets.Taiko/UI/InputDrum.cs
@@ -149,16 +149,16 @@ namespace osu.Game.Rulesets.Taiko.UI
                     const float down_time = 40;
                     const float up_time = 1000;
 
-                    back.ScaleTo(target.Scale.X - scale_amount, down_time, EasingTypes.OutQuint)
+                    back.ScaleTo(target.Scale.X - scale_amount, down_time, Easing.OutQuint)
                         .Then()
-                        .ScaleTo(1, up_time, EasingTypes.OutQuint);
+                        .ScaleTo(1, up_time, Easing.OutQuint);
 
                     target.Animate(
-                        t => t.ScaleTo(target.Scale.X - scale_amount, down_time, EasingTypes.OutQuint),
-                        t => t.FadeTo(Math.Min(target.Alpha + alpha_amount, 1), down_time, EasingTypes.OutQuint)
+                        t => t.ScaleTo(target.Scale.X - scale_amount, down_time, Easing.OutQuint),
+                        t => t.FadeTo(Math.Min(target.Alpha + alpha_amount, 1), down_time, Easing.OutQuint)
                     ).Then(
-                        t => t.ScaleTo(1, up_time, EasingTypes.OutQuint),
-                        t => t.FadeOut(up_time, EasingTypes.OutQuint)
+                        t => t.ScaleTo(1, up_time, Easing.OutQuint),
+                        t => t.FadeOut(up_time, Easing.OutQuint)
                     );
                 }
 
diff --git a/osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs b/osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs
index 346f435e5d..524490fac3 100644
--- a/osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs
+++ b/osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs
@@ -59,7 +59,7 @@ namespace osu.Game.Rulesets.Taiko.UI
         {
             base.LoadComplete();
 
-            this.ScaleTo(new Vector2(1, 3f), 500, EasingTypes.OutQuint);
+            this.ScaleTo(new Vector2(1, 3f), 500, Easing.OutQuint);
             this.FadeOut(250);
 
             Expire();
diff --git a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs
index b59dbac722..5b263e4798 100644
--- a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs
+++ b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs
@@ -35,7 +35,7 @@ namespace osu.Game.Beatmaps.Drawables
                     new PanelBackground(beatmap)
                     {
                         RelativeSizeAxes = Axes.Both,
-                        OnLoadComplete = d => d.FadeInFromZero(400, EasingTypes.Out),
+                        OnLoadComplete = d => d.FadeInFromZero(400, Easing.Out),
                     }
                 )
                 {
diff --git a/osu.Game/Beatmaps/Drawables/Panel.cs b/osu.Game/Beatmaps/Drawables/Panel.cs
index 10eeba53e0..d07be88392 100644
--- a/osu.Game/Beatmaps/Drawables/Panel.cs
+++ b/osu.Game/Beatmaps/Drawables/Panel.cs
@@ -64,7 +64,7 @@ namespace osu.Game.Beatmaps.Drawables
             }
 
             if (state == PanelSelectedState.Hidden)
-                this.FadeOut(300, EasingTypes.OutQuint);
+                this.FadeOut(300, Easing.OutQuint);
             else
                 this.FadeIn(250);
         }
diff --git a/osu.Game/Graphics/Containers/ParallaxContainer.cs b/osu.Game/Graphics/Containers/ParallaxContainer.cs
index 19475b00c9..ec9d30f244 100644
--- a/osu.Game/Graphics/Containers/ParallaxContainer.cs
+++ b/osu.Game/Graphics/Containers/ParallaxContainer.cs
@@ -42,7 +42,7 @@ namespace osu.Game.Graphics.Containers
             {
                 if (!parallaxEnabled)
                 {
-                    content.MoveTo(Vector2.Zero, firstUpdate ? 0 : 1000, EasingTypes.OutQuint);
+                    content.MoveTo(Vector2.Zero, firstUpdate ? 0 : 1000, Easing.OutQuint);
                     content.Scale = new Vector2(1 + ParallaxAmount);
                 }
             };
@@ -57,7 +57,7 @@ namespace osu.Game.Graphics.Containers
             if (parallaxEnabled)
             {
                 Vector2 offset = input.CurrentState.Mouse == null ? Vector2.Zero : ToLocalSpace(input.CurrentState.Mouse.NativeState.Position) - DrawSize / 2;
-                content.MoveTo(offset * ParallaxAmount, firstUpdate ? 0 : 1000, EasingTypes.OutQuint);
+                content.MoveTo(offset * ParallaxAmount, firstUpdate ? 0 : 1000, Easing.OutQuint);
                 content.Scale = new Vector2(1 + ParallaxAmount);
             }
 
diff --git a/osu.Game/Graphics/Cursor/GameplayCursor.cs b/osu.Game/Graphics/Cursor/GameplayCursor.cs
index da3975f606..e74222f136 100644
--- a/osu.Game/Graphics/Cursor/GameplayCursor.cs
+++ b/osu.Game/Graphics/Cursor/GameplayCursor.cs
@@ -29,14 +29,14 @@ namespace osu.Game.Graphics.Cursor
         protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
         {
             ActiveCursor.Scale = new Vector2(1);
-            ActiveCursor.ScaleTo(1.2f, 100, EasingTypes.OutQuad);
+            ActiveCursor.ScaleTo(1.2f, 100, Easing.OutQuad);
             return base.OnMouseDown(state, args);
         }
 
         protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
         {
             if (!state.Mouse.HasMainButtonPressed)
-                ActiveCursor.ScaleTo(1, 200, EasingTypes.OutQuad);
+                ActiveCursor.ScaleTo(1, 200, Easing.OutQuad);
             return base.OnMouseUp(state, args);
         }
 
diff --git a/osu.Game/Graphics/Cursor/MenuCursor.cs b/osu.Game/Graphics/Cursor/MenuCursor.cs
index 82ae424ab0..9658cfdb09 100644
--- a/osu.Game/Graphics/Cursor/MenuCursor.cs
+++ b/osu.Game/Graphics/Cursor/MenuCursor.cs
@@ -34,7 +34,7 @@ namespace osu.Game.Graphics.Cursor
                 if (diff > 180) diff -= 360;
                 degrees = ActiveCursor.Rotation + diff;
 
-                ActiveCursor.RotateTo(degrees, 600, EasingTypes.OutQuint);
+                ActiveCursor.RotateTo(degrees, 600, Easing.OutQuint);
             }
 
             return base.OnMouseMove(state);
@@ -49,10 +49,10 @@ namespace osu.Game.Graphics.Cursor
         protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
         {
             ActiveCursor.Scale = new Vector2(1);
-            ActiveCursor.ScaleTo(0.90f, 800, EasingTypes.OutQuint);
+            ActiveCursor.ScaleTo(0.90f, 800, Easing.OutQuint);
 
             ((Cursor)ActiveCursor).AdditiveLayer.Alpha = 0;
-            ((Cursor)ActiveCursor).AdditiveLayer.FadeInFromZero(800, EasingTypes.OutQuint);
+            ((Cursor)ActiveCursor).AdditiveLayer.FadeInFromZero(800, Easing.OutQuint);
             return base.OnMouseDown(state, args);
         }
 
@@ -62,9 +62,9 @@ namespace osu.Game.Graphics.Cursor
             {
                 dragging = false;
 
-                ((Cursor)ActiveCursor).AdditiveLayer.FadeOut(500, EasingTypes.OutQuint);
-                ActiveCursor.RotateTo(0, 600 * (1 + Math.Abs(ActiveCursor.Rotation / 720)), EasingTypes.OutElasticHalf);
-                ActiveCursor.ScaleTo(1, 500, EasingTypes.OutElastic);
+                ((Cursor)ActiveCursor).AdditiveLayer.FadeOut(500, Easing.OutQuint);
+                ActiveCursor.RotateTo(0, 600 * (1 + Math.Abs(ActiveCursor.Rotation / 720)), Easing.OutElasticHalf);
+                ActiveCursor.ScaleTo(1, 500, Easing.OutElastic);
             }
 
             return base.OnMouseUp(state, args);
@@ -72,21 +72,21 @@ namespace osu.Game.Graphics.Cursor
 
         protected override bool OnClick(InputState state)
         {
-            ((Cursor)ActiveCursor).AdditiveLayer.FadeOutFromOne(500, EasingTypes.OutQuint);
+            ((Cursor)ActiveCursor).AdditiveLayer.FadeOutFromOne(500, Easing.OutQuint);
 
             return base.OnClick(state);
         }
 
         protected override void PopIn()
         {
-            ActiveCursor.FadeTo(1, 250, EasingTypes.OutQuint);
-            ActiveCursor.ScaleTo(1, 400, EasingTypes.OutQuint);
+            ActiveCursor.FadeTo(1, 250, Easing.OutQuint);
+            ActiveCursor.ScaleTo(1, 400, Easing.OutQuint);
         }
 
         protected override void PopOut()
         {
-            ActiveCursor.FadeTo(0, 900, EasingTypes.OutQuint);
-            ActiveCursor.ScaleTo(0, 500, EasingTypes.In);
+            ActiveCursor.FadeTo(0, 900, Easing.OutQuint);
+            ActiveCursor.ScaleTo(0, 500, Easing.In);
         }
 
         public class Cursor : Container
diff --git a/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs b/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs
index d3d01a5bc8..e9d84b28a3 100644
--- a/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs
+++ b/osu.Game/Graphics/Cursor/OsuTooltipContainer.cs
@@ -37,7 +37,7 @@ namespace osu.Game.Graphics.Cursor
                     if (IsPresent)
                     {
                         AutoSizeDuration = 250;
-                        background.FlashColour(OsuColour.Gray(0.4f), 1000, EasingTypes.OutQuint);
+                        background.FlashColour(OsuColour.Gray(0.4f), 1000, Easing.OutQuint);
                     }
                     else
                         AutoSizeDuration = 0;
@@ -48,7 +48,7 @@ namespace osu.Game.Graphics.Cursor
 
             public OsuTooltip()
             {
-                AutoSizeEasing = EasingTypes.OutQuint;
+                AutoSizeEasing = Easing.OutQuint;
 
                 CornerRadius = 5;
                 Masking = true;
@@ -83,10 +83,10 @@ namespace osu.Game.Graphics.Cursor
             protected override void PopIn()
             {
                 instantMovement |= !IsPresent;
-                this.FadeIn(500, EasingTypes.OutQuint);
+                this.FadeIn(500, Easing.OutQuint);
             }
 
-            protected override void PopOut() => this.Delay(150).FadeOut(500, EasingTypes.OutQuint);
+            protected override void PopOut() => this.Delay(150).FadeOut(500, Easing.OutQuint);
 
             public override void Move(Vector2 pos)
             {
@@ -97,7 +97,7 @@ namespace osu.Game.Graphics.Cursor
                 }
                 else
                 {
-                    this.MoveTo(pos, 200, EasingTypes.OutQuint);
+                    this.MoveTo(pos, 200, Easing.OutQuint);
                 }
             }
         }
diff --git a/osu.Game/Graphics/IHasAccentColour.cs b/osu.Game/Graphics/IHasAccentColour.cs
index 0edd2c3ac4..ac2117c517 100644
--- a/osu.Game/Graphics/IHasAccentColour.cs
+++ b/osu.Game/Graphics/IHasAccentColour.cs
@@ -26,7 +26,7 @@ namespace osu.Game.Graphics
         /// <param name="newColour">The new accent colour.</param>
         /// <param name="duration">The tween duration.</param>
         /// <param name="easing">The tween easing.</param>
-        public static TransformSequence<T> FadeAccent<T>(this T accentedDrawable, Color4 newColour, double duration = 0, EasingTypes easing = EasingTypes.None)
+        public static TransformSequence<T> FadeAccent<T>(this T accentedDrawable, Color4 newColour, double duration = 0, Easing easing = Easing.None)
             where T : IHasAccentColour
             => accentedDrawable.TransformTo(nameof(accentedDrawable.AccentColour), newColour, duration, easing);
     }
diff --git a/osu.Game/Graphics/UserInterface/Bar.cs b/osu.Game/Graphics/UserInterface/Bar.cs
index 1da73a60a2..20df553142 100644
--- a/osu.Game/Graphics/UserInterface/Bar.cs
+++ b/osu.Game/Graphics/UserInterface/Bar.cs
@@ -17,7 +17,7 @@ namespace osu.Game.Graphics.UserInterface
 
         private const int resize_duration = 250;
 
-        private const EasingTypes easing = EasingTypes.InOutCubic;
+        private const Easing easing = Easing.InOutCubic;
 
         private float length;
         /// <summary>
diff --git a/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs b/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs
index e69f9e3f42..f61192a1a6 100644
--- a/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs
+++ b/osu.Game/Graphics/UserInterface/BreadcrumbControl.cs
@@ -28,7 +28,7 @@ namespace osu.Game.Graphics.UserInterface
                     var tabIndex = TabContainer.IndexOf(TabMap[tab]);
 
                     t.State = tIndex < tabIndex ? Visibility.Hidden : Visibility.Visible;
-                    t.Chevron.FadeTo(tIndex <= tabIndex ? 0f : 1f, 500, EasingTypes.OutQuint);
+                    t.Chevron.FadeTo(tIndex <= tabIndex ? 0f : 1f, 500, Easing.OutQuint);
                 }
             };
         }
@@ -54,13 +54,13 @@ namespace osu.Game.Graphics.UserInterface
 
                     if (State == Visibility.Visible)
                     {
-                        this.FadeIn(transition_duration, EasingTypes.OutQuint);
-                        this.ScaleTo(new Vector2(1f), transition_duration, EasingTypes.OutQuint);
+                        this.FadeIn(transition_duration, Easing.OutQuint);
+                        this.ScaleTo(new Vector2(1f), transition_duration, Easing.OutQuint);
                     }
                     else
                     {
-                        this.FadeOut(transition_duration, EasingTypes.OutQuint);
-                        this.ScaleTo(new Vector2(0.8f, 1f), transition_duration, EasingTypes.OutQuint);
+                        this.FadeOut(transition_duration, Easing.OutQuint);
+                        this.ScaleTo(new Vector2(0.8f, 1f), transition_duration, Easing.OutQuint);
                     }
                 }
             }
diff --git a/osu.Game/Graphics/UserInterface/DialogButton.cs b/osu.Game/Graphics/UserInterface/DialogButton.cs
index 460f4cea41..4e688999dc 100644
--- a/osu.Game/Graphics/UserInterface/DialogButton.cs
+++ b/osu.Game/Graphics/UserInterface/DialogButton.cs
@@ -96,7 +96,7 @@ namespace osu.Game.Graphics.UserInterface
         protected override bool OnClick(Framework.Input.InputState state)
         {
             didClick = true;
-            colourContainer.ResizeTo(new Vector2(1.5f, 1f), click_duration, EasingTypes.In);
+            colourContainer.ResizeTo(new Vector2(1.5f, 1f), click_duration, Easing.In);
             flash();
 
             this.Delay(click_duration).Schedule(delegate {
@@ -110,10 +110,10 @@ namespace osu.Game.Graphics.UserInterface
 
         protected override bool OnHover(Framework.Input.InputState state)
         {
-            spriteText.TransformSpacingTo(hoverSpacing, hover_duration, EasingTypes.OutElastic);
+            spriteText.TransformSpacingTo(hoverSpacing, hover_duration, Easing.OutElastic);
 
-            colourContainer.ResizeTo(new Vector2(hover_width, 1f), hover_duration, EasingTypes.OutElastic);
-            glowContainer.FadeIn(glow_fade_duration, EasingTypes.Out);
+            colourContainer.ResizeTo(new Vector2(hover_width, 1f), hover_duration, Easing.OutElastic);
+            glowContainer.FadeIn(glow_fade_duration, Easing.Out);
             base.OnHover(state);
             return true;
         }
@@ -122,9 +122,9 @@ namespace osu.Game.Graphics.UserInterface
         {
             if (!didClick)
             {
-                colourContainer.ResizeTo(new Vector2(0.8f, 1f), hover_duration, EasingTypes.OutElastic);
-                spriteText.TransformSpacingTo(Vector2.Zero, hover_duration, EasingTypes.OutElastic);
-                glowContainer.FadeOut(glow_fade_duration, EasingTypes.Out);
+                colourContainer.ResizeTo(new Vector2(0.8f, 1f), hover_duration, Easing.OutElastic);
+                spriteText.TransformSpacingTo(Vector2.Zero, hover_duration, Easing.OutElastic);
+                glowContainer.FadeOut(glow_fade_duration, Easing.Out);
             }
 
             didClick = false;
diff --git a/osu.Game/Graphics/UserInterface/IconButton.cs b/osu.Game/Graphics/UserInterface/IconButton.cs
index 84904c10db..1598ace9df 100644
--- a/osu.Game/Graphics/UserInterface/IconButton.cs
+++ b/osu.Game/Graphics/UserInterface/IconButton.cs
@@ -84,31 +84,31 @@ namespace osu.Game.Graphics.UserInterface
 
         protected override bool OnHover(InputState state)
         {
-            hover.FadeIn(500, EasingTypes.OutQuint);
+            hover.FadeIn(500, Easing.OutQuint);
             return base.OnHover(state);
         }
 
         protected override void OnHoverLost(InputState state)
         {
-            hover.FadeOut(500, EasingTypes.OutQuint);
+            hover.FadeOut(500, Easing.OutQuint);
             base.OnHoverLost(state);
         }
 
         protected override bool OnClick(InputState state)
         {
-            hover.FlashColour(flashColour, 800, EasingTypes.OutQuint);
+            hover.FlashColour(flashColour, 800, Easing.OutQuint);
             return base.OnClick(state);
         }
 
         protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
         {
-            content.ScaleTo(0.75f, 2000, EasingTypes.OutQuint);
+            content.ScaleTo(0.75f, 2000, Easing.OutQuint);
             return base.OnMouseDown(state, args);
         }
 
         protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
         {
-            content.ScaleTo(1, 1000, EasingTypes.OutElastic);
+            content.ScaleTo(1, 1000, Easing.OutElastic);
             return base.OnMouseUp(state, args);
         }
     }
diff --git a/osu.Game/Graphics/UserInterface/LineGraph.cs b/osu.Game/Graphics/UserInterface/LineGraph.cs
index cd8ba96dc8..aa9256e576 100644
--- a/osu.Game/Graphics/UserInterface/LineGraph.cs
+++ b/osu.Game/Graphics/UserInterface/LineGraph.cs
@@ -49,7 +49,7 @@ namespace osu.Game.Graphics.UserInterface
                 values = value.ToArray();
                 applyPath();
                 maskingContainer.Width = 0;
-                maskingContainer.ResizeWidthTo(1, transform_duration, EasingTypes.OutQuint);
+                maskingContainer.ResizeWidthTo(1, transform_duration, Easing.OutQuint);
             }
         }
 
diff --git a/osu.Game/Graphics/UserInterface/LoadingAnimation.cs b/osu.Game/Graphics/UserInterface/LoadingAnimation.cs
index 4f348ebb56..56ee47a7e6 100644
--- a/osu.Game/Graphics/UserInterface/LoadingAnimation.cs
+++ b/osu.Game/Graphics/UserInterface/LoadingAnimation.cs
@@ -39,8 +39,8 @@ namespace osu.Game.Graphics.UserInterface
 
         private const float transition_duration = 500;
 
-        protected override void PopIn() => this.FadeIn(transition_duration * 5, EasingTypes.OutQuint);
+        protected override void PopIn() => this.FadeIn(transition_duration * 5, Easing.OutQuint);
 
-        protected override void PopOut() => this.FadeOut(transition_duration, EasingTypes.OutQuint);
+        protected override void PopOut() => this.FadeOut(transition_duration, Easing.OutQuint);
     }
 }
diff --git a/osu.Game/Graphics/UserInterface/Nub.cs b/osu.Game/Graphics/UserInterface/Nub.cs
index 298badcb77..f7df6cd4f4 100644
--- a/osu.Game/Graphics/UserInterface/Nub.cs
+++ b/osu.Game/Graphics/UserInterface/Nub.cs
@@ -43,9 +43,9 @@ namespace osu.Game.Graphics.UserInterface
             Current.ValueChanged += newValue =>
             {
                 if (newValue)
-                    fill.FadeIn(200, EasingTypes.OutQuint);
+                    fill.FadeIn(200, Easing.OutQuint);
                 else
-                    fill.FadeTo(0.01f, 200, EasingTypes.OutQuint); //todo: remove once we figure why containers aren't drawing at all times
+                    fill.FadeTo(0.01f, 200, Easing.OutQuint); //todo: remove once we figure why containers aren't drawing at all times
             };
         }
 
@@ -80,8 +80,8 @@ namespace osu.Game.Graphics.UserInterface
 
                 if (value)
                 {
-                    this.FadeColour(GlowingAccentColour, 500, EasingTypes.OutQuint);
-                    FadeEdgeEffectTo(1, 500, EasingTypes.OutQuint);
+                    this.FadeColour(GlowingAccentColour, 500, Easing.OutQuint);
+                    FadeEdgeEffectTo(1, 500, Easing.OutQuint);
                 }
                 else
                 {
@@ -95,7 +95,7 @@ namespace osu.Game.Graphics.UserInterface
         {
             set
             {
-                this.ResizeTo(new Vector2(value ? EXPANDED_SIZE : COLLAPSED_SIZE, 12), 500, EasingTypes.OutQuint);
+                this.ResizeTo(new Vector2(value ? EXPANDED_SIZE : COLLAPSED_SIZE, 12), 500, Easing.OutQuint);
             }
         }
 
diff --git a/osu.Game/Graphics/UserInterface/OsuButton.cs b/osu.Game/Graphics/UserInterface/OsuButton.cs
index 18156f8e76..ecbf51f8b9 100644
--- a/osu.Game/Graphics/UserInterface/OsuButton.cs
+++ b/osu.Game/Graphics/UserInterface/OsuButton.cs
@@ -91,13 +91,13 @@ namespace osu.Game.Graphics.UserInterface
 
         protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
         {
-            Content.ScaleTo(0.9f, 4000, EasingTypes.OutQuint);
+            Content.ScaleTo(0.9f, 4000, Easing.OutQuint);
             return base.OnMouseDown(state, args);
         }
 
         protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
         {
-            Content.ScaleTo(1, 1000, EasingTypes.OutElastic);
+            Content.ScaleTo(1, 1000, Easing.OutElastic);
             return base.OnMouseUp(state, args);
         }
     }
diff --git a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs
index 66c214f6a3..d4882cce1e 100644
--- a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs
+++ b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs
@@ -39,13 +39,13 @@ namespace osu.Game.Graphics.UserInterface
                 Background.Colour = colours.ContextMenuGray;
             }
 
-            protected override void AnimateOpen() => this.FadeIn(fade_duration, EasingTypes.OutQuint);
-            protected override void AnimateClose() => this.FadeOut(fade_duration, EasingTypes.OutQuint);
+            protected override void AnimateOpen() => this.FadeIn(fade_duration, Easing.OutQuint);
+            protected override void AnimateClose() => this.FadeOut(fade_duration, Easing.OutQuint);
 
             protected override void UpdateContentHeight()
             {
                 var actualHeight = (RelativeSizeAxes & Axes.Y) > 0 ? 1 : ContentHeight;
-                this.ResizeTo(new Vector2(1, State == MenuState.Opened ? actualHeight : 0), 300, EasingTypes.OutQuint);
+                this.ResizeTo(new Vector2(1, State == MenuState.Opened ? actualHeight : 0), 300, Easing.OutQuint);
             }
         }
     }
diff --git a/osu.Game/Graphics/UserInterface/OsuContextMenuItem.cs b/osu.Game/Graphics/UserInterface/OsuContextMenuItem.cs
index 5d12dadf5f..196e905bdc 100644
--- a/osu.Game/Graphics/UserInterface/OsuContextMenuItem.cs
+++ b/osu.Game/Graphics/UserInterface/OsuContextMenuItem.cs
@@ -93,15 +93,15 @@ namespace osu.Game.Graphics.UserInterface
         protected override bool OnHover(InputState state)
         {
             sampleHover.Play();
-            textBold.FadeIn(transition_length, EasingTypes.OutQuint);
-            text.FadeOut(transition_length, EasingTypes.OutQuint);
+            textBold.FadeIn(transition_length, Easing.OutQuint);
+            text.FadeOut(transition_length, Easing.OutQuint);
             return base.OnHover(state);
         }
 
         protected override void OnHoverLost(InputState state)
         {
-            textBold.FadeOut(transition_length, EasingTypes.OutQuint);
-            text.FadeIn(transition_length, EasingTypes.OutQuint);
+            textBold.FadeOut(transition_length, Easing.OutQuint);
+            text.FadeIn(transition_length, Easing.OutQuint);
             base.OnHoverLost(state);
         }
 
diff --git a/osu.Game/Graphics/UserInterface/OsuMenu.cs b/osu.Game/Graphics/UserInterface/OsuMenu.cs
index 2bcf0a467c..e597bc44b5 100644
--- a/osu.Game/Graphics/UserInterface/OsuMenu.cs
+++ b/osu.Game/Graphics/UserInterface/OsuMenu.cs
@@ -19,14 +19,14 @@ namespace osu.Game.Graphics.UserInterface
             ItemsContainer.Padding = new MarginPadding(5);
         }
 
-        protected override void AnimateOpen() => this.FadeIn(300, EasingTypes.OutQuint);
+        protected override void AnimateOpen() => this.FadeIn(300, Easing.OutQuint);
 
-        protected override void AnimateClose() => this.FadeOut(300, EasingTypes.OutQuint);
+        protected override void AnimateClose() => this.FadeOut(300, Easing.OutQuint);
 
         protected override void UpdateContentHeight()
         {
             var actualHeight = (RelativeSizeAxes & Axes.Y) > 0 ? 1 : ContentHeight;
-            this.ResizeTo(new Vector2(1, State == MenuState.Opened ? actualHeight : 0), 300, EasingTypes.OutQuint);
+            this.ResizeTo(new Vector2(1, State == MenuState.Opened ? actualHeight : 0), 300, Easing.OutQuint);
         }
     }
 }
diff --git a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs
index dc52fd0f62..b7ca25b95a 100644
--- a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs
+++ b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs
@@ -47,8 +47,8 @@ namespace osu.Game.Graphics.UserInterface
             protected override void LoadComplete()
             {
                 base.LoadComplete();
-                circle.FadeIn(500, EasingTypes.OutQuint);
-                circle.ResizeTo(new Vector2(0.8f), 500, EasingTypes.OutQuint);
+                circle.FadeIn(500, Easing.OutQuint);
+                circle.ResizeTo(new Vector2(0.8f), 500, Easing.OutQuint);
             }
         }
     }
diff --git a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
index 673a23afac..3dd3596c30 100644
--- a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
+++ b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
@@ -166,7 +166,7 @@ namespace osu.Game.Graphics.UserInterface
 
         protected override void UpdateValue(float value)
         {
-            Nub.MoveToX(RangePadding + UsableWidth * value, 250, EasingTypes.OutQuint);
+            Nub.MoveToX(RangePadding + UsableWidth * value, 250, Easing.OutQuint);
         }
     }
 }
diff --git a/osu.Game/Graphics/UserInterface/OsuTabControl.cs b/osu.Game/Graphics/UserInterface/OsuTabControl.cs
index 602aee3c58..8c16c048ea 100644
--- a/osu.Game/Graphics/UserInterface/OsuTabControl.cs
+++ b/osu.Game/Graphics/UserInterface/OsuTabControl.cs
@@ -77,14 +77,14 @@ namespace osu.Game.Graphics.UserInterface
 
             private void fadeActive()
             {
-                box.FadeIn(transition_length, EasingTypes.OutQuint);
-                Text.FadeColour(Color4.White, transition_length, EasingTypes.OutQuint);
+                box.FadeIn(transition_length, Easing.OutQuint);
+                Text.FadeColour(Color4.White, transition_length, Easing.OutQuint);
             }
 
             private void fadeInactive()
             {
-                box.FadeOut(transition_length, EasingTypes.OutQuint);
-                Text.FadeColour(AccentColour, transition_length, EasingTypes.OutQuint);
+                box.FadeOut(transition_length, Easing.OutQuint);
+                Text.FadeColour(AccentColour, transition_length, Easing.OutQuint);
             }
 
             protected override bool OnHover(InputState state)
diff --git a/osu.Game/Graphics/UserInterface/OsuTabControlCheckbox.cs b/osu.Game/Graphics/UserInterface/OsuTabControlCheckbox.cs
index 940d9b4943..57a87dc74b 100644
--- a/osu.Game/Graphics/UserInterface/OsuTabControlCheckbox.cs
+++ b/osu.Game/Graphics/UserInterface/OsuTabControlCheckbox.cs
@@ -49,14 +49,14 @@ namespace osu.Game.Graphics.UserInterface
 
         private void fadeIn()
         {
-            box.FadeIn(transition_length, EasingTypes.OutQuint);
-            text.FadeColour(Color4.White, transition_length, EasingTypes.OutQuint);
+            box.FadeIn(transition_length, Easing.OutQuint);
+            text.FadeColour(Color4.White, transition_length, Easing.OutQuint);
         }
 
         private void fadeOut()
         {
-            box.FadeOut(transition_length, EasingTypes.OutQuint);
-            text.FadeColour(AccentColour, transition_length, EasingTypes.OutQuint);
+            box.FadeOut(transition_length, Easing.OutQuint);
+            text.FadeColour(AccentColour, transition_length, Easing.OutQuint);
         }
 
         protected override bool OnHover(InputState state)
diff --git a/osu.Game/Graphics/UserInterface/RollingCounter.cs b/osu.Game/Graphics/UserInterface/RollingCounter.cs
index cb657825de..ce8d190dc0 100644
--- a/osu.Game/Graphics/UserInterface/RollingCounter.cs
+++ b/osu.Game/Graphics/UserInterface/RollingCounter.cs
@@ -36,7 +36,7 @@ namespace osu.Game.Graphics.UserInterface
         /// <summary>
         /// Easing for the counter rollover animation.
         /// </summary>
-        protected virtual EasingTypes RollingEasing => EasingTypes.OutQuint;
+        protected virtual Easing RollingEasing => Easing.OutQuint;
 
         private T displayedCount;
 
diff --git a/osu.Game/Graphics/UserInterface/ScoreCounter.cs b/osu.Game/Graphics/UserInterface/ScoreCounter.cs
index a1fa48e3cd..ee4fc912f3 100644
--- a/osu.Game/Graphics/UserInterface/ScoreCounter.cs
+++ b/osu.Game/Graphics/UserInterface/ScoreCounter.cs
@@ -8,7 +8,7 @@ namespace osu.Game.Graphics.UserInterface
     public class ScoreCounter : RollingCounter<double>
     {
         protected override double RollingDuration => 1000;
-        protected override EasingTypes RollingEasing => EasingTypes.Out;
+        protected override Easing RollingEasing => Easing.Out;
 
         public bool UseCommaSeparator;
 
diff --git a/osu.Game/Graphics/UserInterface/StarCounter.cs b/osu.Game/Graphics/UserInterface/StarCounter.cs
index c4f98dcbb7..6c5204fed4 100644
--- a/osu.Game/Graphics/UserInterface/StarCounter.cs
+++ b/osu.Game/Graphics/UserInterface/StarCounter.cs
@@ -24,7 +24,7 @@ namespace osu.Game.Graphics.UserInterface
         private double animationDelay => 80;
 
         private double scalingDuration => 1000;
-        private EasingTypes scalingEasing => EasingTypes.OutElasticHalf;
+        private Easing scalingEasing => Easing.OutElasticHalf;
         private float minStarScale => 0.4f;
 
         private double fadingDuration => 100;
diff --git a/osu.Game/Graphics/UserInterface/TwoLayerButton.cs b/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
index b763cd7971..f290f4fadd 100644
--- a/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
+++ b/osu.Game/Graphics/UserInterface/TwoLayerButton.cs
@@ -173,20 +173,20 @@ namespace osu.Game.Graphics.UserInterface
 
         protected override bool OnHover(InputState state)
         {
-            this.ResizeTo(SIZE_EXTENDED, transform_time, EasingTypes.OutElastic);
-            IconLayer.FadeColour(HoverColour, transform_time, EasingTypes.OutElastic);
+            this.ResizeTo(SIZE_EXTENDED, transform_time, Easing.OutElastic);
+            IconLayer.FadeColour(HoverColour, transform_time, Easing.OutElastic);
 
-            bouncingIcon.ScaleTo(1.1f, transform_time, EasingTypes.OutElastic);
+            bouncingIcon.ScaleTo(1.1f, transform_time, Easing.OutElastic);
 
             return true;
         }
 
         protected override void OnHoverLost(InputState state)
         {
-            this.ResizeTo(SIZE_RETRACTED, transform_time, EasingTypes.OutElastic);
-            IconLayer.FadeColour(TextLayer.Colour, transform_time, EasingTypes.OutElastic);
+            this.ResizeTo(SIZE_RETRACTED, transform_time, Easing.OutElastic);
+            IconLayer.FadeColour(TextLayer.Colour, transform_time, Easing.OutElastic);
 
-            bouncingIcon.ScaleTo(1, transform_time, EasingTypes.OutElastic);
+            bouncingIcon.ScaleTo(1, transform_time, Easing.OutElastic);
         }
 
         protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
@@ -205,7 +205,7 @@ namespace osu.Game.Graphics.UserInterface
             Add(flash);
 
             flash.Alpha = 1;
-            flash.FadeOut(500, EasingTypes.OutQuint);
+            flash.FadeOut(500, Easing.OutQuint);
             flash.Expire();
 
             return base.OnClick(state);
@@ -245,9 +245,9 @@ namespace osu.Game.Graphics.UserInterface
 
                 if (beatIndex < 0) return;
 
-                icon.ScaleTo(1 - 0.1f * amplitudeAdjust, beat_in_time, EasingTypes.Out)
+                icon.ScaleTo(1 - 0.1f * amplitudeAdjust, beat_in_time, Easing.Out)
                     .Then()
-                    .ScaleTo(1, beatLength * 2, EasingTypes.OutQuint);
+                    .ScaleTo(1, beatLength * 2, Easing.OutQuint);
             }
         }
     }
diff --git a/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs b/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs
index 57eea71086..41fa60bec2 100644
--- a/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs
+++ b/osu.Game/Graphics/UserInterface/Volume/VolumeMeter.cs
@@ -82,6 +82,6 @@ namespace osu.Game.Graphics.UserInterface.Volume
             return true;
         }
 
-        private void updateFill() => meterFill.ScaleTo(new Vector2(1, (float)Volume), 300, EasingTypes.OutQuint);
+        private void updateFill() => meterFill.ScaleTo(new Vector2(1, (float)Volume), 300, Easing.OutQuint);
     }
 }
\ No newline at end of file
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 881ee891c1..2cfd1f8214 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -234,10 +234,10 @@ namespace osu.Game
                 switch (settings.State)
                 {
                     case Visibility.Hidden:
-                        intro.MoveToX(0, SettingsOverlay.TRANSITION_LENGTH, EasingTypes.OutQuint);
+                        intro.MoveToX(0, SettingsOverlay.TRANSITION_LENGTH, Easing.OutQuint);
                         break;
                     case Visibility.Visible:
-                        intro.MoveToX(SettingsOverlay.SIDEBAR_WIDTH / 2, SettingsOverlay.TRANSITION_LENGTH, EasingTypes.OutQuint);
+                        intro.MoveToX(SettingsOverlay.SIDEBAR_WIDTH / 2, SettingsOverlay.TRANSITION_LENGTH, Easing.OutQuint);
                         break;
                 }
             };
diff --git a/osu.Game/Overlays/Chat/ChannelListItem.cs b/osu.Game/Overlays/Chat/ChannelListItem.cs
index 7b11ba2de0..791377187b 100644
--- a/osu.Game/Overlays/Chat/ChannelListItem.cs
+++ b/osu.Game/Overlays/Chat/ChannelListItem.cs
@@ -156,7 +156,7 @@ namespace osu.Game.Overlays.Chat
         protected override bool OnHover(InputState state)
         {
             if (!channel.Joined.Value)
-                name.FadeColour(hoverColour, 50, EasingTypes.OutQuint);
+                name.FadeColour(hoverColour, 50, Easing.OutQuint);
 
             return base.OnHover(state);
         }
diff --git a/osu.Game/Overlays/Chat/ChannelSelectionOverlay.cs b/osu.Game/Overlays/Chat/ChannelSelectionOverlay.cs
index 380275475b..368d3cc5ef 100644
--- a/osu.Game/Overlays/Chat/ChannelSelectionOverlay.cs
+++ b/osu.Game/Overlays/Chat/ChannelSelectionOverlay.cs
@@ -92,7 +92,7 @@ namespace osu.Game.Overlays.Chat
                                     AutoSizeAxes = Axes.Y,
                                     Direction = FillDirection.Vertical,
                                     LayoutDuration = 200,
-                                    LayoutEasing = EasingTypes.OutQuint,
+                                    LayoutEasing = Easing.OutQuint,
                                     Spacing = new Vector2(0f, 20f),
                                     Padding = new MarginPadding { Vertical = 20, Left = WIDTH_PADDING },
                                 },
@@ -160,8 +160,8 @@ namespace osu.Game.Overlays.Chat
         {
             if (Alpha == 0) this.MoveToY(DrawHeight);
 
-            this.FadeIn(transition_duration, EasingTypes.OutQuint);
-            this.MoveToY(0, transition_duration, EasingTypes.OutQuint);
+            this.FadeIn(transition_duration, Easing.OutQuint);
+            this.MoveToY(0, transition_duration, Easing.OutQuint);
 
             search.HoldFocus = true;
             base.PopIn();
@@ -169,8 +169,8 @@ namespace osu.Game.Overlays.Chat
 
         protected override void PopOut()
         {
-            this.FadeOut(transition_duration, EasingTypes.InSine);
-            this.MoveToY(DrawHeight, transition_duration, EasingTypes.InSine);
+            this.FadeOut(transition_duration, Easing.InSine);
+            this.MoveToY(DrawHeight, transition_duration, Easing.InSine);
 
             search.HoldFocus = false;
             base.PopOut();
diff --git a/osu.Game/Overlays/Chat/ChatTabControl.cs b/osu.Game/Overlays/Chat/ChatTabControl.cs
index cb85bdb0c9..c3c930eba0 100644
--- a/osu.Game/Overlays/Chat/ChatTabControl.cs
+++ b/osu.Game/Overlays/Chat/ChatTabControl.cs
@@ -86,30 +86,30 @@ namespace osu.Game.Overlays.Chat
 
             private void fadeActive()
             {
-                this.ResizeTo(new Vector2(Width, 1.1f), transition_length, EasingTypes.OutQuint);
+                this.ResizeTo(new Vector2(Width, 1.1f), transition_length, Easing.OutQuint);
 
-                box.FadeColour(backgroundActive, transition_length, EasingTypes.OutQuint);
-                highlightBox.FadeIn(transition_length, EasingTypes.OutQuint);
+                box.FadeColour(backgroundActive, transition_length, Easing.OutQuint);
+                highlightBox.FadeIn(transition_length, Easing.OutQuint);
 
-                text.FadeOut(transition_length, EasingTypes.OutQuint);
-                textBold.FadeIn(transition_length, EasingTypes.OutQuint);
+                text.FadeOut(transition_length, Easing.OutQuint);
+                textBold.FadeIn(transition_length, Easing.OutQuint);
             }
 
             private void fadeInactive()
             {
-                this.ResizeTo(new Vector2(Width, 1), transition_length, EasingTypes.OutQuint);
+                this.ResizeTo(new Vector2(Width, 1), transition_length, Easing.OutQuint);
 
-                box.FadeColour(backgroundInactive, transition_length, EasingTypes.OutQuint);
-                highlightBox.FadeOut(transition_length, EasingTypes.OutQuint);
+                box.FadeColour(backgroundInactive, transition_length, Easing.OutQuint);
+                highlightBox.FadeOut(transition_length, Easing.OutQuint);
 
-                text.FadeIn(transition_length, EasingTypes.OutQuint);
-                textBold.FadeOut(transition_length, EasingTypes.OutQuint);
+                text.FadeIn(transition_length, Easing.OutQuint);
+                textBold.FadeOut(transition_length, Easing.OutQuint);
             }
 
             protected override bool OnHover(InputState state)
             {
                 if (!Active)
-                    box.FadeColour(backgroundHover, transition_length, EasingTypes.OutQuint);
+                    box.FadeColour(backgroundHover, transition_length, Easing.OutQuint);
                 return true;
             }
 
diff --git a/osu.Game/Overlays/ChatOverlay.cs b/osu.Game/Overlays/ChatOverlay.cs
index fd1e78e801..53d926fb4f 100644
--- a/osu.Game/Overlays/ChatOverlay.cs
+++ b/osu.Game/Overlays/ChatOverlay.cs
@@ -177,8 +177,8 @@ namespace osu.Game.Overlays
                     inputTextBox.HoldFocus = false;
                     if (1f - chatHeight.Value < channel_selection_min_height)
                     {
-                        chatContainer.ResizeHeightTo(1f - channel_selection_min_height, 800, EasingTypes.OutQuint);
-                        channelSelectionContainer.ResizeHeightTo(channel_selection_min_height, 800, EasingTypes.OutQuint);
+                        chatContainer.ResizeHeightTo(1f - channel_selection_min_height, 800, Easing.OutQuint);
+                        channelSelectionContainer.ResizeHeightTo(channel_selection_min_height, 800, Easing.OutQuint);
                         channelSelection.Show();
                         chatHeight.Value = 1f - channel_selection_min_height;
                     }
@@ -235,8 +235,8 @@ namespace osu.Game.Overlays
 
         protected override void PopIn()
         {
-            this.MoveToY(0, transition_length, EasingTypes.OutQuint);
-            this.FadeIn(transition_length, EasingTypes.OutQuint);
+            this.MoveToY(0, transition_length, Easing.OutQuint);
+            this.FadeIn(transition_length, Easing.OutQuint);
 
             inputTextBox.HoldFocus = true;
             base.PopIn();
@@ -244,8 +244,8 @@ namespace osu.Game.Overlays
 
         protected override void PopOut()
         {
-            this.MoveToY(Height, transition_length, EasingTypes.InSine);
-            this.FadeOut(transition_length, EasingTypes.InSine);
+            this.MoveToY(Height, transition_length, Easing.InSine);
+            this.FadeOut(transition_length, Easing.InSine);
 
             inputTextBox.HoldFocus = false;
             base.PopOut();
@@ -328,7 +328,7 @@ namespace osu.Game.Overlays
                 var loaded = loadedChannels.Find(d => d.Channel == value);
                 if (loaded == null)
                 {
-                    currentChannelContainer.FadeOut(500, EasingTypes.OutQuint);
+                    currentChannelContainer.FadeOut(500, Easing.OutQuint);
                     loading.Show();
 
                     loaded = new DrawableChannel(currentChannel);
@@ -340,7 +340,7 @@ namespace osu.Game.Overlays
 
                         currentChannelContainer.Clear(false);
                         currentChannelContainer.Add(loaded);
-                        currentChannelContainer.FadeIn(500, EasingTypes.OutQuint);
+                        currentChannelContainer.FadeIn(500, Easing.OutQuint);
                     });
                 }
                 else
diff --git a/osu.Game/Overlays/Dialog/PopupDialog.cs b/osu.Game/Overlays/Dialog/PopupDialog.cs
index 39338ba3e1..97aae2f49c 100644
--- a/osu.Game/Overlays/Dialog/PopupDialog.cs
+++ b/osu.Game/Overlays/Dialog/PopupDialog.cs
@@ -115,17 +115,17 @@ namespace osu.Game.Overlays.Dialog
                 ring.ResizeTo(ringMinifiedSize);
             }
 
-            content.FadeIn(ENTER_DURATION, EasingTypes.OutQuint);
-            ring.ResizeTo(ringSize, ENTER_DURATION, EasingTypes.OutQuint);
-            buttonsContainer.TransformSpacingTo(Vector2.Zero, ENTER_DURATION, EasingTypes.OutQuint);
-            buttonsContainer.MoveToY(0, ENTER_DURATION, EasingTypes.OutQuint);
+            content.FadeIn(ENTER_DURATION, Easing.OutQuint);
+            ring.ResizeTo(ringSize, ENTER_DURATION, Easing.OutQuint);
+            buttonsContainer.TransformSpacingTo(Vector2.Zero, ENTER_DURATION, Easing.OutQuint);
+            buttonsContainer.MoveToY(0, ENTER_DURATION, Easing.OutQuint);
         }
 
         protected override void PopOut()
         {
             base.PopOut();
 
-            content.FadeOut(EXIT_DURATION, EasingTypes.InSine);
+            content.FadeOut(EXIT_DURATION, Easing.InSine);
         }
 
         public PopupDialog()
diff --git a/osu.Game/Overlays/DialogOverlay.cs b/osu.Game/Overlays/DialogOverlay.cs
index b384e110f9..012e93f10d 100644
--- a/osu.Game/Overlays/DialogOverlay.cs
+++ b/osu.Game/Overlays/DialogOverlay.cs
@@ -44,13 +44,13 @@ namespace osu.Game.Overlays
         protected override void PopIn()
         {
             base.PopIn();
-            this.FadeIn(PopupDialog.ENTER_DURATION, EasingTypes.OutQuint);
+            this.FadeIn(PopupDialog.ENTER_DURATION, Easing.OutQuint);
         }
 
         protected override void PopOut()
         {
             base.PopOut();
-            this.FadeOut(PopupDialog.EXIT_DURATION, EasingTypes.InSine);
+            this.FadeOut(PopupDialog.EXIT_DURATION, Easing.InSine);
         }
 
         public DialogOverlay()
diff --git a/osu.Game/Overlays/Direct/DirectGridPanel.cs b/osu.Game/Overlays/Direct/DirectGridPanel.cs
index cc7d57e04b..b7631d5794 100644
--- a/osu.Game/Overlays/Direct/DirectGridPanel.cs
+++ b/osu.Game/Overlays/Direct/DirectGridPanel.cs
@@ -41,9 +41,9 @@ namespace osu.Game.Overlays.Direct
         {
             base.LoadComplete();
 
-            this.FadeInFromZero(200, EasingTypes.Out);
+            this.FadeInFromZero(200, Easing.Out);
             bottomPanel.LayoutDuration = 200;
-            bottomPanel.LayoutEasing = EasingTypes.Out;
+            bottomPanel.LayoutEasing = Easing.Out;
             bottomPanel.Origin = Anchor.BottomLeft;
         }
 
diff --git a/osu.Game/Overlays/Direct/DirectListPanel.cs b/osu.Game/Overlays/Direct/DirectListPanel.cs
index 1b36798639..8319270b8e 100644
--- a/osu.Game/Overlays/Direct/DirectListPanel.cs
+++ b/osu.Game/Overlays/Direct/DirectListPanel.cs
@@ -43,7 +43,7 @@ namespace osu.Game.Overlays.Direct
         {
             base.LoadComplete();
 
-            this.FadeInFromZero(200, EasingTypes.Out);
+            this.FadeInFromZero(200, Easing.Out);
         }
 
         [BackgroundDependencyLoader]
@@ -171,25 +171,25 @@ namespace osu.Game.Overlays.Direct
 
             protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
             {
-                icon.ScaleTo(0.9f, 1000, EasingTypes.Out);
+                icon.ScaleTo(0.9f, 1000, Easing.Out);
                 return base.OnMouseDown(state, args);
             }
 
             protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
             {
-                icon.ScaleTo(1f, 500, EasingTypes.OutElastic);
+                icon.ScaleTo(1f, 500, Easing.OutElastic);
                 return base.OnMouseUp(state, args);
             }
 
             protected override bool OnHover(InputState state)
             {
-                icon.ScaleTo(1.1f, 500, EasingTypes.OutElastic);
+                icon.ScaleTo(1.1f, 500, Easing.OutElastic);
                 return base.OnHover(state);
             }
 
             protected override void OnHoverLost(InputState state)
             {
-                icon.ScaleTo(1f, 500, EasingTypes.OutElastic);
+                icon.ScaleTo(1f, 500, Easing.OutElastic);
             }
         }
     }
diff --git a/osu.Game/Overlays/Direct/DirectPanel.cs b/osu.Game/Overlays/Direct/DirectPanel.cs
index 4fc9a922a8..09b634de81 100644
--- a/osu.Game/Overlays/Direct/DirectPanel.cs
+++ b/osu.Game/Overlays/Direct/DirectPanel.cs
@@ -38,7 +38,7 @@ namespace osu.Game.Overlays.Direct
             Origin = Anchor.Centre,
             RelativeSizeAxes = Axes.Both,
             FillMode = FillMode.Fill,
-            OnLoadComplete = d => d.FadeInFromZero(400, EasingTypes.Out),
+            OnLoadComplete = d => d.FadeInFromZero(400, Easing.Out),
         })
         {
             RelativeSizeAxes = Axes.Both,
diff --git a/osu.Game/Overlays/DirectOverlay.cs b/osu.Game/Overlays/DirectOverlay.cs
index 5fa90ab1d6..f10d542830 100644
--- a/osu.Game/Overlays/DirectOverlay.cs
+++ b/osu.Game/Overlays/DirectOverlay.cs
@@ -169,7 +169,7 @@ namespace osu.Game.Overlays
 
         private void updateResultCounts()
         {
-            resultCountsContainer.FadeTo(ResultAmounts == null ? 0f : 1f, 200, EasingTypes.OutQuint);
+            resultCountsContainer.FadeTo(ResultAmounts == null ? 0f : 1f, 200, Easing.OutQuint);
             if (ResultAmounts == null) return;
 
             resultCountsText.Text = pluralize("Artist", ResultAmounts.Artists) + ", " +
diff --git a/osu.Game/Overlays/LoginOverlay.cs b/osu.Game/Overlays/LoginOverlay.cs
index 0f53fb2d5c..95e0fef9aa 100644
--- a/osu.Game/Overlays/LoginOverlay.cs
+++ b/osu.Game/Overlays/LoginOverlay.cs
@@ -40,7 +40,7 @@ namespace osu.Game.Overlays
                     AutoSizeAxes = Axes.Y,
                     Masking = true,
                     AutoSizeDuration = transition_time,
-                    AutoSizeEasing = EasingTypes.OutQuint,
+                    AutoSizeEasing = Easing.OutQuint,
                     Children = new Drawable[]
                     {
                         settingsSection = new LoginSettings
@@ -67,7 +67,7 @@ namespace osu.Game.Overlays
             base.PopIn();
 
             settingsSection.Bounding = true;
-            this.FadeIn(transition_time, EasingTypes.OutQuint);
+            this.FadeIn(transition_time, Easing.OutQuint);
 
             InputManager.ChangeFocus(settingsSection);
         }
diff --git a/osu.Game/Overlays/MedalOverlay.cs b/osu.Game/Overlays/MedalOverlay.cs
index 6e9ad3fafe..064f42ecaf 100644
--- a/osu.Game/Overlays/MedalOverlay.cs
+++ b/osu.Game/Overlays/MedalOverlay.cs
@@ -205,7 +205,7 @@ namespace osu.Game.Overlays
             using (BeginDelayedSequence(200, true))
             {
                 disc.FadeIn(initial_duration)
-                    .ScaleTo(1f, initial_duration * 2, EasingTypes.OutElastic);
+                    .ScaleTo(1f, initial_duration * 2, Easing.OutElastic);
 
                 particleContainer.FadeIn(initial_duration);
                 outerSpin.FadeTo(0.1f, initial_duration * 2);
@@ -213,8 +213,8 @@ namespace osu.Game.Overlays
                 using (BeginDelayedSequence(initial_duration + 200, true))
                 {
                     backgroundStrip.FadeIn(step_duration);
-                    leftStrip.ResizeWidthTo(1f, step_duration, EasingTypes.OutQuint);
-                    rightStrip.ResizeWidthTo(1f, step_duration, EasingTypes.OutQuint);
+                    leftStrip.ResizeWidthTo(1f, step_duration, Easing.OutQuint);
+                    rightStrip.ResizeWidthTo(1f, step_duration, Easing.OutQuint);
 
                     this.Animate().Schedule(() =>
                     {
diff --git a/osu.Game/Overlays/MedalSplash/DrawableMedal.cs b/osu.Game/Overlays/MedalSplash/DrawableMedal.cs
index 89e991f5ef..56b26e7176 100644
--- a/osu.Game/Overlays/MedalSplash/DrawableMedal.cs
+++ b/osu.Game/Overlays/MedalSplash/DrawableMedal.cs
@@ -149,15 +149,15 @@ namespace osu.Game.Overlays.MedalSplash
                 case DisplayState.Icon:
                     medalContainer
                         .FadeIn(duration)
-                        .ScaleTo(1, duration, EasingTypes.OutElastic);
+                        .ScaleTo(1, duration, Easing.OutElastic);
                     break;
                 case DisplayState.MedalUnlocked:
                     medalContainer
                         .FadeTo(1)
                         .ScaleTo(1);
 
-                    this.ScaleTo(scale_when_unlocked, duration, EasingTypes.OutExpo);
-                    this.MoveToY(MedalOverlay.DISC_SIZE / 2 - 30, duration, EasingTypes.OutExpo);
+                    this.ScaleTo(scale_when_unlocked, duration, Easing.OutExpo);
+                    this.MoveToY(MedalOverlay.DISC_SIZE / 2 - 30, duration, Easing.OutExpo);
                     unlocked.FadeInFromZero(duration);
                     break;
                 case DisplayState.Full:
@@ -165,8 +165,8 @@ namespace osu.Game.Overlays.MedalSplash
                         .FadeTo(1)
                         .ScaleTo(1);
 
-                    this.ScaleTo(scale_when_full, duration, EasingTypes.OutExpo);
-                    this.MoveToY(MedalOverlay.DISC_SIZE / 2 - 60, duration, EasingTypes.OutExpo);
+                    this.ScaleTo(scale_when_full, duration, Easing.OutExpo);
+                    this.MoveToY(MedalOverlay.DISC_SIZE / 2 - 60, duration, Easing.OutExpo);
                     name.FadeInFromZero(duration + 100);
                     description.FadeInFromZero(duration * 2);
                     break;
diff --git a/osu.Game/Overlays/Mods/ModButton.cs b/osu.Game/Overlays/Mods/ModButton.cs
index bea0aae57e..3ca4a204a5 100644
--- a/osu.Game/Overlays/Mods/ModButton.cs
+++ b/osu.Game/Overlays/Mods/ModButton.cs
@@ -35,7 +35,7 @@ namespace osu.Game.Overlays.Mods
 
         public string TooltipText => (SelectedMod?.Description ?? Mods.FirstOrDefault()?.Description) ?? string.Empty;
 
-        private const EasingTypes mod_switch_easing = EasingTypes.InOutSine;
+        private const Easing mod_switch_easing = Easing.InOutSine;
         private const double mod_switch_duration = 120;
 
         // A selected index of -1 means not selected.
@@ -67,8 +67,8 @@ namespace osu.Game.Overlays.Mods
 
                 if (beforeSelected != Selected)
                 {
-                    iconsContainer.RotateTo(Selected ? 5f : 0f, 300, EasingTypes.OutElastic);
-                    iconsContainer.ScaleTo(Selected ? 1.1f : 1f, 300, EasingTypes.OutElastic);
+                    iconsContainer.RotateTo(Selected ? 5f : 0f, 300, Easing.OutElastic);
+                    iconsContainer.ScaleTo(Selected ? 1.1f : 1f, 300, Easing.OutElastic);
                 }
 
                 if (modBefore != modAfter)
diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
index ca74189c86..703deea382 100644
--- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs
+++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
@@ -66,14 +66,14 @@ namespace osu.Game.Overlays.Mods
         {
             base.PopOut();
 
-            rankedMultiplerContainer.MoveToX(rankedMultiplerContainer.DrawSize.X, APPEAR_DURATION, EasingTypes.InSine);
-            rankedMultiplerContainer.FadeOut(APPEAR_DURATION, EasingTypes.InSine);
+            rankedMultiplerContainer.MoveToX(rankedMultiplerContainer.DrawSize.X, APPEAR_DURATION, Easing.InSine);
+            rankedMultiplerContainer.FadeOut(APPEAR_DURATION, Easing.InSine);
 
             foreach (ModSection section in modSectionsContainer.Children)
             {
-                section.ButtonsContainer.TransformSpacingTo(new Vector2(100f, 0f), APPEAR_DURATION, EasingTypes.InSine);
-                section.ButtonsContainer.MoveToX(100f, APPEAR_DURATION, EasingTypes.InSine);
-                section.ButtonsContainer.FadeOut(APPEAR_DURATION, EasingTypes.InSine);
+                section.ButtonsContainer.TransformSpacingTo(new Vector2(100f, 0f), APPEAR_DURATION, Easing.InSine);
+                section.ButtonsContainer.MoveToX(100f, APPEAR_DURATION, Easing.InSine);
+                section.ButtonsContainer.FadeOut(APPEAR_DURATION, Easing.InSine);
             }
         }
 
@@ -81,14 +81,14 @@ namespace osu.Game.Overlays.Mods
         {
             base.PopIn();
 
-            rankedMultiplerContainer.MoveToX(0, ranked_multiplier_duration, EasingTypes.OutQuint);
-            rankedMultiplerContainer.FadeIn(ranked_multiplier_duration, EasingTypes.OutQuint);
+            rankedMultiplerContainer.MoveToX(0, ranked_multiplier_duration, Easing.OutQuint);
+            rankedMultiplerContainer.FadeIn(ranked_multiplier_duration, Easing.OutQuint);
 
             foreach (ModSection section in modSectionsContainer.Children)
             {
-                section.ButtonsContainer.TransformSpacingTo(new Vector2(50f, 0f), button_duration, EasingTypes.OutQuint);
-                section.ButtonsContainer.MoveToX(0, button_duration, EasingTypes.OutQuint);
-                section.ButtonsContainer.FadeIn(button_duration, EasingTypes.OutQuint);
+                section.ButtonsContainer.TransformSpacingTo(new Vector2(50f, 0f), button_duration, Easing.OutQuint);
+                section.ButtonsContainer.MoveToX(0, button_duration, Easing.OutQuint);
+                section.ButtonsContainer.FadeIn(button_duration, Easing.OutQuint);
             }
         }
 
diff --git a/osu.Game/Overlays/Music/PlaylistList.cs b/osu.Game/Overlays/Music/PlaylistList.cs
index ca46bdea95..a0198fe435 100644
--- a/osu.Game/Overlays/Music/PlaylistList.cs
+++ b/osu.Game/Overlays/Music/PlaylistList.cs
@@ -90,7 +90,7 @@ namespace osu.Game.Overlays.Music
             public ItemSearchContainer()
             {
                 LayoutDuration = 200;
-                LayoutEasing = EasingTypes.OutQuint;
+                LayoutEasing = Easing.OutQuint;
             }
         }
     }
diff --git a/osu.Game/Overlays/Music/PlaylistOverlay.cs b/osu.Game/Overlays/Music/PlaylistOverlay.cs
index d6a69c1a80..75503067c8 100644
--- a/osu.Game/Overlays/Music/PlaylistOverlay.cs
+++ b/osu.Game/Overlays/Music/PlaylistOverlay.cs
@@ -101,15 +101,15 @@ namespace osu.Game.Overlays.Music
             filter.Search.HoldFocus = true;
             Schedule(() => inputManager.ChangeFocus(filter.Search));
 
-            this.ResizeTo(new Vector2(1, playlist_height), transition_duration, EasingTypes.OutQuint);
-            this.FadeIn(transition_duration, EasingTypes.OutQuint);
+            this.ResizeTo(new Vector2(1, playlist_height), transition_duration, Easing.OutQuint);
+            this.FadeIn(transition_duration, Easing.OutQuint);
         }
 
         protected override void PopOut()
         {
             filter.Search.HoldFocus = false;
 
-            this.ResizeTo(new Vector2(1, 0), transition_duration, EasingTypes.OutQuint);
+            this.ResizeTo(new Vector2(1, 0), transition_duration, Easing.OutQuint);
             this.FadeOut(transition_duration);
         }
 
diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs
index 9d726b3952..b435c505c9 100644
--- a/osu.Game/Overlays/MusicController.cs
+++ b/osu.Game/Overlays/MusicController.cs
@@ -82,7 +82,7 @@ namespace osu.Game.Overlays
 
         protected override bool OnDragEnd(InputState state)
         {
-            dragContainer.MoveTo(Vector2.Zero, 800, EasingTypes.OutElastic);
+            dragContainer.MoveTo(Vector2.Zero, 800, Easing.OutElastic);
             return base.OnDragEnd(state);
         }
 
@@ -204,7 +204,7 @@ namespace osu.Game.Overlays
 
             beatmapBacking.BindTo(game.Beatmap);
 
-            playlist.StateChanged += (c, s) => playlistButton.FadeColour(s == Visibility.Visible ? colours.Yellow : Color4.White, 200, EasingTypes.OutQuint);
+            playlist.StateChanged += (c, s) => playlistButton.FadeColour(s == Visibility.Visible ? colours.Yellow : Color4.White, 200, Easing.OutQuint);
         }
 
         protected override void LoadComplete()
@@ -345,13 +345,13 @@ namespace osu.Game.Overlays
                         {
                             case TransformDirection.Next:
                                 d.Position = new Vector2(400, 0);
-                                d.MoveToX(0, 500, EasingTypes.OutCubic);
-                                currentBackground.MoveToX(-400, 500, EasingTypes.OutCubic);
+                                d.MoveToX(0, 500, Easing.OutCubic);
+                                currentBackground.MoveToX(-400, 500, Easing.OutCubic);
                                 break;
                             case TransformDirection.Prev:
                                 d.Position = new Vector2(-400, 0);
-                                d.MoveToX(0, 500, EasingTypes.OutCubic);
-                                currentBackground.MoveToX(400, 500, EasingTypes.OutCubic);
+                                d.MoveToX(0, 500, Easing.OutCubic);
+                                currentBackground.MoveToX(400, 500, Easing.OutCubic);
                                 break;
                         }
                         currentBackground.Expire();
@@ -368,16 +368,16 @@ namespace osu.Game.Overlays
         {
             base.PopIn();
 
-            this.FadeIn(transition_length, EasingTypes.OutQuint);
-            dragContainer.ScaleTo(1, transition_length, EasingTypes.OutElastic);
+            this.FadeIn(transition_length, Easing.OutQuint);
+            dragContainer.ScaleTo(1, transition_length, Easing.OutElastic);
         }
 
         protected override void PopOut()
         {
             base.PopOut();
 
-            this.FadeOut(transition_length, EasingTypes.OutQuint);
-            dragContainer.ScaleTo(0.9f, transition_length, EasingTypes.OutQuint);
+            this.FadeOut(transition_length, Easing.OutQuint);
+            dragContainer.ScaleTo(0.9f, transition_length, Easing.OutQuint);
         }
 
         private enum TransformDirection
diff --git a/osu.Game/Overlays/NotificationManager.cs b/osu.Game/Overlays/NotificationManager.cs
index f83aeb1275..ad0236ae1f 100644
--- a/osu.Game/Overlays/NotificationManager.cs
+++ b/osu.Game/Overlays/NotificationManager.cs
@@ -89,8 +89,8 @@ namespace osu.Game.Overlays
         {
             base.PopIn();
 
-            scrollContainer.MoveToX(0, TRANSITION_LENGTH, EasingTypes.OutQuint);
-            this.MoveToX(0, TRANSITION_LENGTH, EasingTypes.OutQuint);
+            scrollContainer.MoveToX(0, TRANSITION_LENGTH, Easing.OutQuint);
+            this.MoveToX(0, TRANSITION_LENGTH, Easing.OutQuint);
             this.FadeTo(1, TRANSITION_LENGTH / 2);
         }
 
@@ -105,7 +105,7 @@ namespace osu.Game.Overlays
 
             markAllRead();
 
-            this.MoveToX(width, TRANSITION_LENGTH, EasingTypes.OutQuint);
+            this.MoveToX(width, TRANSITION_LENGTH, Easing.OutQuint);
             this.FadeTo(0, TRANSITION_LENGTH / 2);
         }
     }
diff --git a/osu.Game/Overlays/Notifications/Notification.cs b/osu.Game/Overlays/Notifications/Notification.cs
index 4337989a13..a590507f41 100644
--- a/osu.Game/Overlays/Notifications/Notification.cs
+++ b/osu.Game/Overlays/Notifications/Notification.cs
@@ -137,7 +137,7 @@ namespace osu.Game.Overlays.Notifications
             base.LoadComplete();
             this.FadeInFromZero(200);
             NotificationContent.MoveToX(DrawSize.X);
-            NotificationContent.MoveToX(0, 500, EasingTypes.OutQuint);
+            NotificationContent.MoveToX(0, 500, Easing.OutQuint);
         }
 
         private bool wasClosed;
@@ -213,7 +213,7 @@ namespace osu.Game.Overlays.Notifications
                     {
                         const float length = 1000;
                         pulsateLayer.Loop(length / 2,
-                            p => p.FadeTo(0.4f, length, EasingTypes.In).Then().FadeTo(1, length, EasingTypes.Out)
+                            p => p.FadeTo(0.4f, length, Easing.In).Then().FadeTo(1, length, Easing.Out)
                         );
                     }
                 }
diff --git a/osu.Game/Overlays/Notifications/NotificationSection.cs b/osu.Game/Overlays/Notifications/NotificationSection.cs
index 831b09e7e9..efd3b39ee2 100644
--- a/osu.Game/Overlays/Notifications/NotificationSection.cs
+++ b/osu.Game/Overlays/Notifications/NotificationSection.cs
@@ -114,7 +114,7 @@ namespace osu.Game.Overlays.Notifications
                     AutoSizeAxes = Axes.Y,
                     RelativeSizeAxes = Axes.X,
                     LayoutDuration = 150,
-                    LayoutEasing = EasingTypes.OutQuart,
+                    LayoutEasing = Easing.OutQuart,
                     Spacing = new Vector2(3),
                 }
             });
diff --git a/osu.Game/Overlays/Notifications/ProgressNotification.cs b/osu.Game/Overlays/Notifications/ProgressNotification.cs
index bd7b8bf844..98aac3a02d 100644
--- a/osu.Game/Overlays/Notifications/ProgressNotification.cs
+++ b/osu.Game/Overlays/Notifications/ProgressNotification.cs
@@ -77,7 +77,7 @@ namespace osu.Game.Overlays.Notifications
                     switch (state)
                     {
                         case ProgressNotificationState.Completed:
-                            NotificationContent.MoveToY(-DrawSize.Y / 2, 200, EasingTypes.OutQuint);
+                            NotificationContent.MoveToY(-DrawSize.Y / 2, 200, Easing.OutQuint);
                             this.FadeOut(200).Finally(d => Completed());
                             break;
                     }
@@ -181,7 +181,7 @@ namespace osu.Game.Overlays.Notifications
                     if (progress == value) return;
 
                     progress = value;
-                    box.ResizeTo(new Vector2(progress, 1), 100, EasingTypes.OutQuad);
+                    box.ResizeTo(new Vector2(progress, 1), 100, Easing.OutQuad);
                 }
             }
 
diff --git a/osu.Game/Overlays/OnScreenDisplay.cs b/osu.Game/Overlays/OnScreenDisplay.cs
index 65bef22295..746b6dd50f 100644
--- a/osu.Game/Overlays/OnScreenDisplay.cs
+++ b/osu.Game/Overlays/OnScreenDisplay.cs
@@ -155,11 +155,11 @@ namespace osu.Game.Overlays
                 textLine3.Text = shortcut.ToUpper();
 
                 box.Animate(
-                    b => b.FadeIn(500, EasingTypes.OutQuint),
-                    b => b.ResizeHeightTo(height, 500, EasingTypes.OutQuint)
+                    b => b.FadeIn(500, Easing.OutQuint),
+                    b => b.ResizeHeightTo(height, 500, Easing.OutQuint)
                 ).Then(
-                    b => b.FadeOutFromOne(1500, EasingTypes.InQuint),
-                    b => b.ResizeHeightTo(height_contracted, 1500, EasingTypes.InQuint)
+                    b => b.FadeOutFromOne(1500, Easing.InQuint),
+                    b => b.ResizeHeightTo(height_contracted, 1500, Easing.InQuint)
                 );
 
                 int optionCount = 0;
@@ -231,13 +231,13 @@ namespace osu.Game.Overlays
             {
                 if (glowing)
                 {
-                    fill.FadeColour(glowingColour, transition_speed, EasingTypes.OutQuint);
-                    FadeEdgeEffectTo(glow_strength, transition_speed, EasingTypes.OutQuint);
+                    fill.FadeColour(glowingColour, transition_speed, Easing.OutQuint);
+                    FadeEdgeEffectTo(glow_strength, transition_speed, Easing.OutQuint);
                 }
                 else
                 {
-                    FadeEdgeEffectTo(0, transition_speed, EasingTypes.OutQuint);
-                    fill.FadeColour(idleColour, transition_speed, EasingTypes.OutQuint);
+                    FadeEdgeEffectTo(0, transition_speed, Easing.OutQuint);
+                    fill.FadeColour(idleColour, transition_speed, Easing.OutQuint);
                 }
             }
 
diff --git a/osu.Game/Overlays/Profile/ProfileHeader.cs b/osu.Game/Overlays/Profile/ProfileHeader.cs
index aa57816701..d42ebc3384 100644
--- a/osu.Game/Overlays/Profile/ProfileHeader.cs
+++ b/osu.Game/Overlays/Profile/ProfileHeader.cs
@@ -517,13 +517,13 @@ namespace osu.Game.Overlays.Profile
 
                 protected override bool OnHover(InputState state)
                 {
-                    this.FadeColour(hoverColour, 500, EasingTypes.OutQuint);
+                    this.FadeColour(hoverColour, 500, Easing.OutQuint);
                     return base.OnHover(state);
                 }
 
                 protected override void OnHoverLost(InputState state)
                 {
-                    this.FadeColour(Color4.White, 500, EasingTypes.OutQuint);
+                    this.FadeColour(Color4.White, 500, Easing.OutQuint);
                     base.OnHoverLost(state);
                 }
 
diff --git a/osu.Game/Overlays/Profile/RankChart.cs b/osu.Game/Overlays/Profile/RankChart.cs
index dfd2219e1f..416bcedfea 100644
--- a/osu.Game/Overlays/Profile/RankChart.cs
+++ b/osu.Game/Overlays/Profile/RankChart.cs
@@ -138,7 +138,7 @@ namespace osu.Game.Overlays.Profile
 
             public void ResetBall()
             {
-                ball.MoveTo(new Vector2(1, GetYPosition(Values.Last())), ballShown ? transform_duration : 0, EasingTypes.OutQuint);
+                ball.MoveTo(new Vector2(1, GetYPosition(Values.Last())), ballShown ? transform_duration : 0, Easing.OutQuint);
                 ball.Show();
                 BallRelease();
                 ballShown = true;
@@ -158,7 +158,7 @@ namespace osu.Game.Overlays.Profile
                         float y = GetYPosition(values[i]);
                         if (Math.Abs(y * DrawHeight - position.Y) <= 8f)
                         {
-                            ball.MoveTo(new Vector2(index / (float)(count - 1), y), transform_duration, EasingTypes.OutQuint);
+                            ball.MoveTo(new Vector2(index / (float)(count - 1), y), transform_duration, Easing.OutQuint);
                             BallMove(i);
                         }
                     }
diff --git a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs
index bbecdff29a..6268a9753a 100644
--- a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs
@@ -291,7 +291,7 @@ namespace osu.Game.Overlays.Settings.Sections.General
                 {
                     set
                     {
-                        statusIcon.FadeColour(value, 500, EasingTypes.OutQuint);
+                        statusIcon.FadeColour(value, 500, Easing.OutQuint);
                     }
                 }
 
diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
index 5f8900449a..c4ce742153 100644
--- a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
@@ -41,7 +41,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
                     RelativeSizeAxes = Axes.X,
                     AutoSizeAxes = Axes.Y,
                     AutoSizeDuration = transition_duration,
-                    AutoSizeEasing = EasingTypes.OutQuint,
+                    AutoSizeEasing = Easing.OutQuint,
                     Masking = true,
 
                     Children = new Drawable[]
@@ -66,7 +66,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
                 letterboxSettings.AutoSizeAxes = isVisible ? Axes.Y : Axes.None;
 
                 if (!isVisible)
-                    letterboxSettings.ResizeHeightTo(0, transition_duration, EasingTypes.OutQuint);
+                    letterboxSettings.ResizeHeightTo(0, transition_duration, Easing.OutQuint);
             };
             letterboxing.TriggerChange();
         }
diff --git a/osu.Game/Overlays/Settings/Sidebar.cs b/osu.Game/Overlays/Settings/Sidebar.cs
index f5ab3b301b..6eafc65d12 100644
--- a/osu.Game/Overlays/Settings/Sidebar.cs
+++ b/osu.Game/Overlays/Settings/Sidebar.cs
@@ -94,10 +94,10 @@ namespace osu.Game.Overlays.Settings
                 switch (state)
                 {
                     default:
-                        this.ResizeTo(new Vector2(DEFAULT_WIDTH, Height), 500, EasingTypes.OutQuint);
+                        this.ResizeTo(new Vector2(DEFAULT_WIDTH, Height), 500, Easing.OutQuint);
                         break;
                     case ExpandedState.Expanded:
-                        this.ResizeTo(new Vector2(EXPANDED_WIDTH, Height), 500, EasingTypes.OutQuint);
+                        this.ResizeTo(new Vector2(EXPANDED_WIDTH, Height), 500, Easing.OutQuint);
                         break;
                 }
             }
diff --git a/osu.Game/Overlays/SettingsOverlay.cs b/osu.Game/Overlays/SettingsOverlay.cs
index 1fdab08112..1dcabbfa15 100644
--- a/osu.Game/Overlays/SettingsOverlay.cs
+++ b/osu.Game/Overlays/SettingsOverlay.cs
@@ -125,8 +125,8 @@ namespace osu.Game.Overlays
         {
             base.PopIn();
 
-            sectionsContainer.MoveToX(0, TRANSITION_LENGTH, EasingTypes.OutQuint);
-            sidebar.MoveToX(0, TRANSITION_LENGTH, EasingTypes.OutQuint);
+            sectionsContainer.MoveToX(0, TRANSITION_LENGTH, Easing.OutQuint);
+            sidebar.MoveToX(0, TRANSITION_LENGTH, Easing.OutQuint);
             this.FadeTo(1, TRANSITION_LENGTH / 2);
 
             searchTextBox.HoldFocus = true;
@@ -136,8 +136,8 @@ namespace osu.Game.Overlays
         {
             base.PopOut();
 
-            sectionsContainer.MoveToX(-width, TRANSITION_LENGTH, EasingTypes.OutQuint);
-            sidebar.MoveToX(-SIDEBAR_WIDTH, TRANSITION_LENGTH, EasingTypes.OutQuint);
+            sectionsContainer.MoveToX(-width, TRANSITION_LENGTH, Easing.OutQuint);
+            sidebar.MoveToX(-SIDEBAR_WIDTH, TRANSITION_LENGTH, Easing.OutQuint);
             this.FadeTo(0, TRANSITION_LENGTH / 2);
 
             searchTextBox.HoldFocus = false;
diff --git a/osu.Game/Overlays/Toolbar/Toolbar.cs b/osu.Game/Overlays/Toolbar/Toolbar.cs
index 9070bc45ad..bef9de6b6b 100644
--- a/osu.Game/Overlays/Toolbar/Toolbar.cs
+++ b/osu.Game/Overlays/Toolbar/Toolbar.cs
@@ -107,29 +107,29 @@ namespace osu.Game.Overlays.Toolbar
 
             protected override bool OnHover(InputState state)
             {
-                solidBackground.FadeTo(alpha_hovering, transition_time, EasingTypes.OutQuint);
-                gradientBackground.FadeIn(transition_time, EasingTypes.OutQuint);
+                solidBackground.FadeTo(alpha_hovering, transition_time, Easing.OutQuint);
+                gradientBackground.FadeIn(transition_time, Easing.OutQuint);
                 return true;
             }
 
             protected override void OnHoverLost(InputState state)
             {
-                solidBackground.FadeTo(alpha_normal, transition_time, EasingTypes.OutQuint);
-                gradientBackground.FadeOut(transition_time, EasingTypes.OutQuint);
+                solidBackground.FadeTo(alpha_normal, transition_time, Easing.OutQuint);
+                gradientBackground.FadeOut(transition_time, Easing.OutQuint);
             }
         }
 
         protected override void PopIn()
         {
-            this.MoveToY(0, transition_time, EasingTypes.OutQuint);
-            this.FadeIn(transition_time / 2, EasingTypes.OutQuint);
+            this.MoveToY(0, transition_time, Easing.OutQuint);
+            this.FadeIn(transition_time / 2, Easing.OutQuint);
         }
 
         protected override void PopOut()
         {
             userArea?.LoginOverlay.Hide();
 
-            this.MoveToY(-DrawSize.Y, transition_time, EasingTypes.OutQuint);
+            this.MoveToY(-DrawSize.Y, transition_time, Easing.OutQuint);
             this.FadeOut(transition_time);
         }
     }
diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs
index 38fd954fe3..b5e832d381 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs
@@ -135,7 +135,7 @@ namespace osu.Game.Overlays.Toolbar
 
         protected override bool OnClick(InputState state)
         {
-            HoverBackground.FlashColour(Color4.White.Opacity(100), 500, EasingTypes.OutQuint);
+            HoverBackground.FlashColour(Color4.White.Opacity(100), 500, Easing.OutQuint);
             return base.OnClick(state);
         }
 
diff --git a/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs b/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs
index 3ecf0fd83c..f48cb681a8 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs
@@ -115,7 +115,7 @@ namespace osu.Game.Overlays.Toolbar
 
             if (!activeMode.IsValid)
             {
-                modeButtonLine.MoveToX(activeButton.DrawPosition.X, 200, EasingTypes.OutQuint);
+                modeButtonLine.MoveToX(activeButton.DrawPosition.X, 200, Easing.OutQuint);
                 activeMode.Validate();
             }
         }
diff --git a/osu.Game/Overlays/UserProfileOverlay.cs b/osu.Game/Overlays/UserProfileOverlay.cs
index f26b143088..f604eb5cd2 100644
--- a/osu.Game/Overlays/UserProfileOverlay.cs
+++ b/osu.Game/Overlays/UserProfileOverlay.cs
@@ -73,13 +73,13 @@ namespace osu.Game.Overlays
         protected override void PopIn()
         {
             base.PopIn();
-            FadeEdgeEffectTo(0.5f, APPEAR_DURATION, EasingTypes.In);
+            FadeEdgeEffectTo(0.5f, APPEAR_DURATION, Easing.In);
         }
 
         protected override void PopOut()
         {
             base.PopOut();
-            FadeEdgeEffectTo(0, DISAPPEAR_DURATION, EasingTypes.Out);
+            FadeEdgeEffectTo(0, DISAPPEAR_DURATION, Easing.Out);
         }
 
         public void ShowUser(User user, bool fetchOnline = true)
diff --git a/osu.Game/Overlays/WaveOverlayContainer.cs b/osu.Game/Overlays/WaveOverlayContainer.cs
index ce587c9ed2..fd89dcfbc4 100644
--- a/osu.Game/Overlays/WaveOverlayContainer.cs
+++ b/osu.Game/Overlays/WaveOverlayContainer.cs
@@ -17,8 +17,8 @@ namespace osu.Game.Overlays
         protected const float APPEAR_DURATION = 800;
         protected const float DISAPPEAR_DURATION = 500;
 
-        private const EasingTypes easing_show = EasingTypes.OutSine;
-        private const EasingTypes easing_hide = EasingTypes.InSine;
+        private const Easing easing_show = Easing.OutSine;
+        private const Easing easing_hide = Easing.InSine;
 
         private readonly Wave firstWave;
         private readonly Wave secondWave;
@@ -137,23 +137,23 @@ namespace osu.Game.Overlays
             foreach (var w in wavesContainer.Children)
                 w.State = Visibility.Visible;
 
-            this.FadeIn(100, EasingTypes.OutQuint);
-            contentContainer.MoveToY(0, APPEAR_DURATION, EasingTypes.OutQuint);
+            this.FadeIn(100, Easing.OutQuint);
+            contentContainer.MoveToY(0, APPEAR_DURATION, Easing.OutQuint);
 
-            this.FadeIn(100, EasingTypes.OutQuint);
+            this.FadeIn(100, Easing.OutQuint);
         }
 
         protected override void PopOut()
         {
             base.PopOut();
 
-            this.FadeOut(DISAPPEAR_DURATION, EasingTypes.InQuint);
-            contentContainer.MoveToY(DrawHeight * 2f, DISAPPEAR_DURATION, EasingTypes.In);
+            this.FadeOut(DISAPPEAR_DURATION, Easing.InQuint);
+            contentContainer.MoveToY(DrawHeight * 2f, DISAPPEAR_DURATION, Easing.In);
 
             foreach (var w in wavesContainer.Children)
                 w.State = Visibility.Hidden;
 
-            this.FadeOut(DISAPPEAR_DURATION, EasingTypes.InQuint);
+            this.FadeOut(DISAPPEAR_DURATION, Easing.InQuint);
         }
 
         protected override void UpdateAfterChildren()
diff --git a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
index ac8a8e2005..f0a53d677b 100644
--- a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
+++ b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs
@@ -64,22 +64,22 @@ namespace osu.Game.Rulesets.Judgements
         {
             base.LoadComplete();
 
-            this.FadeInFromZero(100, EasingTypes.OutQuint);
+            this.FadeInFromZero(100, Easing.OutQuint);
 
             switch (Judgement.Result)
             {
                 case HitResult.Miss:
                     this.ScaleTo(1.6f);
-                    this.ScaleTo(1, 100, EasingTypes.In);
+                    this.ScaleTo(1, 100, Easing.In);
 
-                    this.MoveToOffset(new Vector2(0, 100), 800, EasingTypes.InQuint);
-                    this.RotateTo(40, 800, EasingTypes.InQuint);
+                    this.MoveToOffset(new Vector2(0, 100), 800, Easing.InQuint);
+                    this.RotateTo(40, 800, Easing.InQuint);
 
                     this.Delay(600).FadeOut(200);
                     break;
                 case HitResult.Hit:
                     this.ScaleTo(0.9f);
-                    this.ScaleTo(1, 500, EasingTypes.OutElastic);
+                    this.ScaleTo(1, 500, Easing.OutElastic);
 
                     this.Delay(100).FadeOut(400);
                     break;
diff --git a/osu.Game/Screens/BackgroundScreen.cs b/osu.Game/Screens/BackgroundScreen.cs
index a9cb93876c..c5bbf04075 100644
--- a/osu.Game/Screens/BackgroundScreen.cs
+++ b/osu.Game/Screens/BackgroundScreen.cs
@@ -56,29 +56,29 @@ namespace osu.Game.Screens
             Content.FadeOut();
             Content.MoveToX(x_movement_amount);
 
-            Content.FadeIn(transition_length, EasingTypes.InOutQuart);
-            Content.MoveToX(0, transition_length, EasingTypes.InOutQuart);
+            Content.FadeIn(transition_length, Easing.InOutQuart);
+            Content.MoveToX(0, transition_length, Easing.InOutQuart);
 
             base.OnEntering(last);
         }
 
         protected override void OnSuspending(Screen next)
         {
-            Content.MoveToX(-x_movement_amount, transition_length, EasingTypes.InOutQuart);
+            Content.MoveToX(-x_movement_amount, transition_length, Easing.InOutQuart);
             base.OnSuspending(next);
         }
 
         protected override bool OnExiting(Screen next)
         {
-            Content.FadeOut(transition_length, EasingTypes.OutExpo);
-            Content.MoveToX(x_movement_amount, transition_length, EasingTypes.OutExpo);
+            Content.FadeOut(transition_length, Easing.OutExpo);
+            Content.MoveToX(x_movement_amount, transition_length, Easing.OutExpo);
 
             return base.OnExiting(next);
         }
 
         protected override void OnResuming(Screen last)
         {
-            Content.MoveToX(0, transition_length, EasingTypes.OutExpo);
+            Content.MoveToX(0, transition_length, Easing.OutExpo);
             base.OnResuming(last);
         }
     }
diff --git a/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs b/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs
index ac5ea04ecc..29a422892f 100644
--- a/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs
+++ b/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs
@@ -58,7 +58,7 @@ namespace osu.Game.Screens.Backgrounds
             Beatmap = beatmap;
         }
 
-        public void BlurTo(Vector2 sigma, double duration, EasingTypes easing = EasingTypes.None)
+        public void BlurTo(Vector2 sigma, double duration, Easing easing = Easing.None)
         {
             background?.BlurTo(sigma, duration, easing);
             blurTarget = sigma;
diff --git a/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs b/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs
index bab267a24a..de84e90baf 100644
--- a/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs
+++ b/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs
@@ -24,7 +24,7 @@ namespace osu.Game.Screens.Backgrounds
 
         private void display(Background newBackground)
         {
-            current?.FadeOut(800, EasingTypes.OutQuint);
+            current?.FadeOut(800, Easing.OutQuint);
             current?.Expire();
 
             Add(current = newBackground);
diff --git a/osu.Game/Screens/Menu/Button.cs b/osu.Game/Screens/Menu/Button.cs
index e04e3ce66b..e55c4ef4fe 100644
--- a/osu.Game/Screens/Menu/Button.cs
+++ b/osu.Game/Screens/Menu/Button.cs
@@ -128,14 +128,14 @@ namespace osu.Game.Screens.Menu
             bool rightward = beatIndex % 2 == 1;
             double duration = timingPoint.BeatLength / 2;
 
-            icon.RotateTo(rightward ? 10 : -10, duration * 2, EasingTypes.InOutSine);
+            icon.RotateTo(rightward ? 10 : -10, duration * 2, Easing.InOutSine);
 
             icon.Animate(
-                i => i.MoveToY(-10, duration, EasingTypes.Out),
-                i => i.ScaleTo(1, duration, EasingTypes.Out)
+                i => i.MoveToY(-10, duration, Easing.Out),
+                i => i.ScaleTo(1, duration, Easing.Out)
             ).Then(
-                i => i.MoveToY(0, duration, EasingTypes.In),
-                i => i.ScaleTo(new Vector2(1, 0.9f), duration, EasingTypes.In)
+                i => i.MoveToY(0, duration, Easing.In),
+                i => i.ScaleTo(new Vector2(1, 0.9f), duration, Easing.In)
             );
         }
 
@@ -145,25 +145,25 @@ namespace osu.Game.Screens.Menu
 
             sampleHover?.Play();
 
-            box.ScaleTo(new Vector2(1.5f, 1), 500, EasingTypes.OutElastic);
+            box.ScaleTo(new Vector2(1.5f, 1), 500, Easing.OutElastic);
 
             double duration = TimeUntilNextBeat;
 
             icon.ClearTransforms();
-            icon.RotateTo(10, duration, EasingTypes.InOutSine);
-            icon.ScaleTo(new Vector2(1, 0.9f), duration, EasingTypes.Out);
+            icon.RotateTo(10, duration, Easing.InOutSine);
+            icon.ScaleTo(new Vector2(1, 0.9f), duration, Easing.Out);
             return true;
         }
 
         protected override void OnHoverLost(InputState state)
         {
             icon.ClearTransforms();
-            icon.RotateTo(0, 500, EasingTypes.Out);
-            icon.MoveTo(Vector2.Zero, 500, EasingTypes.Out);
-            icon.ScaleTo(Vector2.One, 200, EasingTypes.Out);
+            icon.RotateTo(0, 500, Easing.Out);
+            icon.MoveTo(Vector2.Zero, 500, Easing.Out);
+            icon.ScaleTo(Vector2.One, 200, Easing.Out);
 
             if (State == ButtonState.Expanded)
-                box.ScaleTo(new Vector2(1, 1), 500, EasingTypes.OutElastic);
+                box.ScaleTo(new Vector2(1, 1), 500, Easing.OutElastic);
         }
 
         [BackgroundDependencyLoader]
@@ -176,13 +176,13 @@ namespace osu.Game.Screens.Menu
 
         protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
         {
-            boxHoverLayer.FadeTo(0.1f, 1000, EasingTypes.OutQuint);
+            boxHoverLayer.FadeTo(0.1f, 1000, Easing.OutQuint);
             return base.OnMouseDown(state, args);
         }
 
         protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
         {
-            boxHoverLayer.FadeTo(0, 1000, EasingTypes.OutQuint);
+            boxHoverLayer.FadeTo(0, 1000, Easing.OutQuint);
             return base.OnMouseUp(state, args);
         }
 
@@ -214,7 +214,7 @@ namespace osu.Game.Screens.Menu
 
             boxHoverLayer.ClearTransforms();
             boxHoverLayer.Alpha = 0.9f;
-            boxHoverLayer.FadeOut(800, EasingTypes.OutExpo);
+            boxHoverLayer.FadeOut(800, Easing.OutExpo);
         }
 
         public override bool HandleInput => state != ButtonState.Exploded && box.Scale.X >= 0.8f;
@@ -246,23 +246,23 @@ namespace osu.Game.Screens.Menu
                         switch (ContractStyle)
                         {
                             default:
-                                box.ScaleTo(new Vector2(0, 1), 500, EasingTypes.OutExpo);
+                                box.ScaleTo(new Vector2(0, 1), 500, Easing.OutExpo);
                                 this.FadeOut(500);
                                 break;
                             case 1:
-                                box.ScaleTo(new Vector2(0, 1), 400, EasingTypes.InSine);
+                                box.ScaleTo(new Vector2(0, 1), 400, Easing.InSine);
                                 this.FadeOut(800);
                                 break;
                         }
                         break;
                     case ButtonState.Expanded:
                         const int expand_duration = 500;
-                        box.ScaleTo(new Vector2(1, 1), expand_duration, EasingTypes.OutExpo);
+                        box.ScaleTo(new Vector2(1, 1), expand_duration, Easing.OutExpo);
                         this.FadeIn(expand_duration / 6f);
                         break;
                     case ButtonState.Exploded:
                         const int explode_duration = 200;
-                        box.ScaleTo(new Vector2(2, 1), explode_duration, EasingTypes.OutExpo);
+                        box.ScaleTo(new Vector2(2, 1), explode_duration, Easing.OutExpo);
                         this.FadeOut(explode_duration / 4f * 3);
                         break;
                 }
diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs
index 65ba555630..71f2a16c09 100644
--- a/osu.Game/Screens/Menu/ButtonSystem.cs
+++ b/osu.Game/Screens/Menu/ButtonSystem.cs
@@ -224,13 +224,13 @@ namespace osu.Game.Screens.Menu
                     {
                         case MenuState.Exit:
                         case MenuState.Initial:
-                            buttonAreaBackground.ScaleTo(Vector2.One, 500, EasingTypes.Out);
+                            buttonAreaBackground.ScaleTo(Vector2.One, 500, Easing.Out);
                             buttonArea.FadeOut(300);
 
                             osuLogo.Delay(150)
                                 .Schedule(() => toolbar?.Hide())
-                                .ScaleTo(1, 800, EasingTypes.OutExpo)
-                                .MoveTo(Vector2.Zero, 800, EasingTypes.OutExpo);
+                                .ScaleTo(1, 800, Easing.OutExpo)
+                                .MoveTo(Vector2.Zero, 800, Easing.OutExpo);
 
                             foreach (Button b in buttonsTopLevel)
                                 b.State = ButtonState.Contracted;
@@ -247,11 +247,11 @@ namespace osu.Game.Screens.Menu
                                 sampleBack?.Play();
                             break;
                         case MenuState.TopLevel:
-                            buttonAreaBackground.ScaleTo(Vector2.One, 200, EasingTypes.Out);
+                            buttonAreaBackground.ScaleTo(Vector2.One, 200, Easing.Out);
 
                             var sequence = osuLogo
-                                .ScaleTo(0.5f, 200, EasingTypes.In)
-                                .MoveTo(buttonFlow.DrawPosition, 200, EasingTypes.In);
+                                .ScaleTo(0.5f, 200, Easing.In)
+                                .MoveTo(buttonFlow.DrawPosition, 200, Easing.In);
 
                             if (fromInitial && osuLogo.Scale.X > 0.5f)
                                 sequence.OnComplete(o =>
@@ -276,7 +276,7 @@ namespace osu.Game.Screens.Menu
                                 b.State = ButtonState.Expanded;
                             break;
                         case MenuState.EnteringMode:
-                            buttonAreaBackground.ScaleTo(new Vector2(2, 0), 300, EasingTypes.InSine);
+                            buttonAreaBackground.ScaleTo(new Vector2(2, 0), 300, Easing.InSine);
 
                             buttonsTopLevel.ForEach(b => b.ContractStyle = 1);
                             buttonsPlay.ForEach(b => b.ContractStyle = 1);
diff --git a/osu.Game/Screens/Menu/Intro.cs b/osu.Game/Screens/Menu/Intro.cs
index 6e42a1bae9..7b16e7e7ad 100644
--- a/osu.Game/Screens/Menu/Intro.cs
+++ b/osu.Game/Screens/Menu/Intro.cs
@@ -134,8 +134,8 @@ namespace osu.Game.Screens.Menu
             logo.ScaleTo(0.4f);
             logo.FadeOut();
 
-            logo.ScaleTo(1, 4400, EasingTypes.OutQuint);
-            logo.FadeIn(20000, EasingTypes.OutQuint);
+            logo.ScaleTo(1, 4400, Easing.OutQuint);
+            logo.FadeIn(20000, Easing.OutQuint);
         }
 
         protected override void OnSuspending(Screen next)
diff --git a/osu.Game/Screens/Menu/MainMenu.cs b/osu.Game/Screens/Menu/MainMenu.cs
index def9c13c10..2544cc2837 100644
--- a/osu.Game/Screens/Menu/MainMenu.cs
+++ b/osu.Game/Screens/Menu/MainMenu.cs
@@ -118,10 +118,10 @@ namespace osu.Game.Screens.Menu
 
             buttons.State = MenuState.EnteringMode;
 
-            Content.FadeOut(length, EasingTypes.InSine);
-            Content.MoveTo(new Vector2(-800, 0), length, EasingTypes.InSine);
+            Content.FadeOut(length, Easing.InSine);
+            Content.MoveTo(new Vector2(-800, 0), length, Easing.InSine);
 
-            sideFlashes.FadeOut(length / 4, EasingTypes.OutQuint);
+            sideFlashes.FadeOut(length / 4, Easing.OutQuint);
         }
 
         protected override void OnResuming(Screen last)
@@ -137,10 +137,10 @@ namespace osu.Game.Screens.Menu
 
             buttons.State = MenuState.TopLevel;
 
-            Content.FadeIn(length, EasingTypes.OutQuint);
-            Content.MoveTo(new Vector2(0, 0), length, EasingTypes.OutQuint);
+            Content.FadeIn(length, Easing.OutQuint);
+            Content.MoveTo(new Vector2(0, 0), length, Easing.OutQuint);
 
-            sideFlashes.FadeIn(length / 4, EasingTypes.InQuint);
+            sideFlashes.FadeIn(length / 4, Easing.InQuint);
         }
 
         protected override bool OnExiting(Screen next)
diff --git a/osu.Game/Screens/Menu/MenuSideFlashes.cs b/osu.Game/Screens/Menu/MenuSideFlashes.cs
index fdacccd913..4ecf78e764 100644
--- a/osu.Game/Screens/Menu/MenuSideFlashes.cs
+++ b/osu.Game/Screens/Menu/MenuSideFlashes.cs
@@ -92,7 +92,7 @@ namespace osu.Game.Screens.Menu
         {
             d.FadeTo(Math.Max(0, ((d.Equals(leftBox) ? amplitudes.LeftChannel : amplitudes.RightChannel) - amplitude_dead_zone) / (kiai ? kiai_multiplier : alpha_multiplier)), box_fade_in_time)
              .Then()
-             .FadeOut(beatLength, EasingTypes.In);
+             .FadeOut(beatLength, Easing.In);
         }
     }
 }
diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs
index 0b05b68080..64c28816d8 100644
--- a/osu.Game/Screens/Menu/OsuLogo.cs
+++ b/osu.Game/Screens/Menu/OsuLogo.cs
@@ -240,27 +240,27 @@ namespace osu.Game.Screens.Menu
                 this.Delay(early_activation).Schedule(() => sampleBeat.Play());
 
             logoBeatContainer
-                .ScaleTo(1 - 0.02f * amplitudeAdjust, early_activation, EasingTypes.Out)
+                .ScaleTo(1 - 0.02f * amplitudeAdjust, early_activation, Easing.Out)
                 .Then()
-                .ScaleTo(1, beatLength * 2, EasingTypes.OutQuint);
+                .ScaleTo(1, beatLength * 2, Easing.OutQuint);
 
             ripple.ClearTransforms();
             ripple
                 .ScaleTo(logoAmplitudeContainer.Scale)
-                .ScaleTo(logoAmplitudeContainer.Scale * (1 + 0.04f * amplitudeAdjust), beatLength, EasingTypes.OutQuint)
-                .FadeTo(0.15f * amplitudeAdjust).FadeOut(beatLength, EasingTypes.OutQuint);
+                .ScaleTo(logoAmplitudeContainer.Scale * (1 + 0.04f * amplitudeAdjust), beatLength, Easing.OutQuint)
+                .FadeTo(0.15f * amplitudeAdjust).FadeOut(beatLength, Easing.OutQuint);
 
             if (effectPoint.KiaiMode && flashLayer.Alpha < 0.4f)
             {
                 flashLayer.ClearTransforms();
                 flashLayer
-                    .FadeTo(0.2f * amplitudeAdjust, early_activation, EasingTypes.Out)
+                    .FadeTo(0.2f * amplitudeAdjust, early_activation, Easing.Out)
                     .Then()
                     .FadeOut(beatLength);
 
                 visualizer.ClearTransforms();
                 visualizer
-                    .FadeTo(0.9f * amplitudeAdjust, early_activation, EasingTypes.Out)
+                    .FadeTo(0.9f * amplitudeAdjust, early_activation, Easing.Out)
                     .Then()
                     .FadeTo(0.5f, beatLength);
             }
@@ -274,7 +274,7 @@ namespace osu.Game.Screens.Menu
             const float velocity_adjust_cutoff = 0.98f;
 
             var maxAmplitude = lastBeatIndex >= 0 ? Beatmap.Value.Track?.CurrentAmplitudes.Maximum ?? 0 : 0;
-            logoAmplitudeContainer.ScaleTo(1 - Math.Max(0, maxAmplitude - scale_adjust_cutoff) * 0.04f, 75, EasingTypes.OutQuint);
+            logoAmplitudeContainer.ScaleTo(1 - Math.Max(0, maxAmplitude - scale_adjust_cutoff) * 0.04f, 75, Easing.OutQuint);
 
             if (maxAmplitude > velocity_adjust_cutoff)
                 triangles.Velocity = 1 + Math.Max(0, maxAmplitude - velocity_adjust_cutoff) * 50;
@@ -286,13 +286,13 @@ namespace osu.Game.Screens.Menu
         {
             if (!Interactive) return false;
 
-            logoBounceContainer.ScaleTo(0.9f, 1000, EasingTypes.Out);
+            logoBounceContainer.ScaleTo(0.9f, 1000, Easing.Out);
             return true;
         }
 
         protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
         {
-            logoBounceContainer.ScaleTo(1f, 500, EasingTypes.OutElastic);
+            logoBounceContainer.ScaleTo(1f, 500, Easing.OutElastic);
             return true;
         }
 
@@ -304,7 +304,7 @@ namespace osu.Game.Screens.Menu
 
             flashLayer.ClearTransforms();
             flashLayer.Alpha = 0.4f;
-            flashLayer.FadeOut(1500, EasingTypes.OutExpo);
+            flashLayer.FadeOut(1500, Easing.OutExpo);
 
             Action?.Invoke();
             return true;
@@ -314,18 +314,18 @@ namespace osu.Game.Screens.Menu
         {
             if (!Interactive) return false;
 
-            logoHoverContainer.ScaleTo(1.1f, 500, EasingTypes.OutElastic);
+            logoHoverContainer.ScaleTo(1.1f, 500, Easing.OutElastic);
             return true;
         }
 
         protected override void OnHoverLost(InputState state)
         {
-            logoHoverContainer.ScaleTo(1, 500, EasingTypes.OutElastic);
+            logoHoverContainer.ScaleTo(1, 500, Easing.OutElastic);
         }
 
         public void Impact()
         {
-            impactContainer.FadeOutFromOne(250, EasingTypes.In);
+            impactContainer.FadeOutFromOne(250, Easing.In);
             impactContainer.ScaleTo(0.96f);
             impactContainer.ScaleTo(1.12f, 250);
         }
diff --git a/osu.Game/Screens/Multiplayer/DrawableRoom.cs b/osu.Game/Screens/Multiplayer/DrawableRoom.cs
index d8963be116..8e2d9e0200 100644
--- a/osu.Game/Screens/Multiplayer/DrawableRoom.cs
+++ b/osu.Game/Screens/Multiplayer/DrawableRoom.cs
@@ -235,7 +235,7 @@ namespace osu.Game.Screens.Multiplayer
                         Anchor = Anchor.Centre,
                         Origin = Anchor.Centre,
                         FillMode = FillMode.Fill,
-                        OnLoadComplete = d => d.FadeInFromZero(400, EasingTypes.Out),
+                        OnLoadComplete = d => d.FadeInFromZero(400, Easing.Out),
                     }) { RelativeSizeAxes = Axes.Both },
                 };
 
diff --git a/osu.Game/Screens/Multiplayer/RoomInspector.cs b/osu.Game/Screens/Multiplayer/RoomInspector.cs
index 83950b4387..5a9b3e4d11 100644
--- a/osu.Game/Screens/Multiplayer/RoomInspector.cs
+++ b/osu.Game/Screens/Multiplayer/RoomInspector.cs
@@ -337,7 +337,7 @@ namespace osu.Game.Screens.Multiplayer
                         Anchor = Anchor.Centre,
                         Origin = Anchor.Centre,
                         FillMode = FillMode.Fill,
-                        OnLoadComplete = d => d.FadeInFromZero(400, EasingTypes.Out),
+                        OnLoadComplete = d => d.FadeInFromZero(400, Easing.Out),
                     }) { RelativeSizeAxes = Axes.Both },
                 };
 
diff --git a/osu.Game/Screens/Play/HUD/ComboCounter.cs b/osu.Game/Screens/Play/HUD/ComboCounter.cs
index c6b1bbcf31..47099f96e9 100644
--- a/osu.Game/Screens/Play/HUD/ComboCounter.cs
+++ b/osu.Game/Screens/Play/HUD/ComboCounter.cs
@@ -22,7 +22,7 @@ namespace osu.Game.Screens.Play.HUD
 
         protected virtual double PopOutDuration => 150;
         protected virtual float PopOutScale => 2.0f;
-        protected virtual EasingTypes PopOutEasing => EasingTypes.None;
+        protected virtual Easing PopOutEasing => Easing.None;
         protected virtual float PopOutInitialAlpha => 0.75f;
 
         protected virtual double FadeOutDuration => 100;
@@ -35,7 +35,7 @@ namespace osu.Game.Screens.Play.HUD
         /// <summary>
         /// Easing for the counter rollover animation.
         /// </summary>
-        protected EasingTypes RollingEasing => EasingTypes.None;
+        protected Easing RollingEasing => Easing.None;
 
         protected SpriteText DisplayedCountSpriteText;
 
diff --git a/osu.Game/Screens/Play/HUD/ComboResultCounter.cs b/osu.Game/Screens/Play/HUD/ComboResultCounter.cs
index 1686b6174d..a4732f6796 100644
--- a/osu.Game/Screens/Play/HUD/ComboResultCounter.cs
+++ b/osu.Game/Screens/Play/HUD/ComboResultCounter.cs
@@ -12,7 +12,7 @@ namespace osu.Game.Screens.Play.HUD
     public class ComboResultCounter : RollingCounter<long>
     {
         protected override double RollingDuration => 500;
-        protected override EasingTypes RollingEasing => EasingTypes.Out;
+        protected override Easing RollingEasing => Easing.Out;
 
         protected override double GetProportionalDuration(long currentValue, long newValue)
         {
diff --git a/osu.Game/Screens/Play/HUD/ModDisplay.cs b/osu.Game/Screens/Play/HUD/ModDisplay.cs
index e72310f1fe..18a3096d7c 100644
--- a/osu.Game/Screens/Play/HUD/ModDisplay.cs
+++ b/osu.Game/Screens/Play/HUD/ModDisplay.cs
@@ -76,20 +76,20 @@ namespace osu.Game.Screens.Play.HUD
         private void appearTransform()
         {
             if (mods.Value.Any(m => !m.Ranked))
-                unrankedText.FadeInFromZero(fade_duration, EasingTypes.OutQuint);
+                unrankedText.FadeInFromZero(fade_duration, Easing.OutQuint);
             else
                 unrankedText.Hide();
 
             iconsContainer.FinishTransforms();
-            iconsContainer.FadeInFromZero(fade_duration, EasingTypes.OutQuint);
+            iconsContainer.FadeInFromZero(fade_duration, Easing.OutQuint);
             expand();
             using (iconsContainer.BeginDelayedSequence(1200))
                 contract();
         }
 
-        private void expand() => iconsContainer.TransformSpacingTo(new Vector2(5, 0), 500, EasingTypes.OutQuint);
+        private void expand() => iconsContainer.TransformSpacingTo(new Vector2(5, 0), 500, Easing.OutQuint);
 
-        private void contract() => iconsContainer.TransformSpacingTo(new Vector2(-25, 0), 500, EasingTypes.OutQuint);
+        private void contract() => iconsContainer.TransformSpacingTo(new Vector2(-25, 0), 500, Easing.OutQuint);
 
         protected override bool OnHover(InputState state)
         {
diff --git a/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs b/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs
index b4b3bd885e..06ef87276a 100644
--- a/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs
+++ b/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs
@@ -97,11 +97,11 @@ namespace osu.Game.Screens.Play.HUD
             if (judgement.Result == HitResult.Miss)
                 return;
 
-            fill.FadeEdgeEffectTo(Math.Min(1, fill.EdgeEffect.Colour.Linear.A + (1f - base_glow_opacity) / glow_max_hits), 50, EasingTypes.OutQuint)
+            fill.FadeEdgeEffectTo(Math.Min(1, fill.EdgeEffect.Colour.Linear.A + (1f - base_glow_opacity) / glow_max_hits), 50, Easing.OutQuint)
                 .Delay(glow_fade_delay)
-                .FadeEdgeEffectTo(base_glow_opacity, glow_fade_time, EasingTypes.OutQuint);
+                .FadeEdgeEffectTo(base_glow_opacity, glow_fade_time, Easing.OutQuint);
         }
 
-        protected override void SetHealth(float value) => fill.ResizeTo(new Vector2(value, 1), 200, EasingTypes.OutQuint);
+        protected override void SetHealth(float value) => fill.ResizeTo(new Vector2(value, 1), 200, Easing.OutQuint);
     }
 }
diff --git a/osu.Game/Screens/Play/HotkeyRetryOverlay.cs b/osu.Game/Screens/Play/HotkeyRetryOverlay.cs
index c4d956ebce..11f9a484dd 100644
--- a/osu.Game/Screens/Play/HotkeyRetryOverlay.cs
+++ b/osu.Game/Screens/Play/HotkeyRetryOverlay.cs
@@ -46,7 +46,7 @@ namespace osu.Game.Screens.Play
 
             if (args.Key == Key.Tilde)
             {
-                overlay.FadeIn(activate_delay, EasingTypes.Out);
+                overlay.FadeIn(activate_delay, Easing.Out);
                 return true;
             }
 
@@ -57,7 +57,7 @@ namespace osu.Game.Screens.Play
         {
             if (args.Key == Key.Tilde && !fired)
             {
-                overlay.FadeOut(fadeout_delay, EasingTypes.Out);
+                overlay.FadeOut(fadeout_delay, Easing.Out);
                 return true;
             }
 
diff --git a/osu.Game/Screens/Play/MenuOverlay.cs b/osu.Game/Screens/Play/MenuOverlay.cs
index ee08bcc031..a0f867d248 100644
--- a/osu.Game/Screens/Play/MenuOverlay.cs
+++ b/osu.Game/Screens/Play/MenuOverlay.cs
@@ -76,8 +76,8 @@ namespace osu.Game.Screens.Play
 
         public override bool HandleInput => State == Visibility.Visible;
 
-        protected override void PopIn() => this.FadeIn(transition_duration, EasingTypes.In);
-        protected override void PopOut() => this.FadeOut(transition_duration, EasingTypes.In);
+        protected override void PopIn() => this.FadeIn(transition_duration, Easing.In);
+        protected override void PopOut() => this.FadeOut(transition_duration, Easing.In);
 
         // Don't let mouse down events through the overlay or people can click circles while paused.
         protected override bool OnMouseDown(InputState state, MouseDownEventArgs args) => true;
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index c22a02ed35..cda4713575 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -262,8 +262,8 @@ namespace osu.Game.Screens.Play
             if (!loadedSuccessfully)
                 return;
 
-            (Background as BackgroundScreenBeatmap)?.BlurTo(Vector2.Zero, 1500, EasingTypes.OutQuint);
-            Background?.FadeTo(1 - (float)dimLevel, 1500, EasingTypes.OutQuint);
+            (Background as BackgroundScreenBeatmap)?.BlurTo(Vector2.Zero, 1500, Easing.OutQuint);
+            Background?.FadeTo(1 - (float)dimLevel, 1500, Easing.OutQuint);
 
             Content.Alpha = 0;
 
@@ -271,7 +271,7 @@ namespace osu.Game.Screens.Play
 
             Content
                 .ScaleTo(0.7f)
-                .ScaleTo(1, 750, EasingTypes.OutQuint)
+                .ScaleTo(1, 750, Easing.OutQuint)
                 .Delay(250)
                 .FadeIn(250);
 
@@ -282,7 +282,7 @@ namespace osu.Game.Screens.Play
             });
 
             pauseContainer.Alpha = 0;
-            pauseContainer.FadeIn(750, EasingTypes.OutQuint);
+            pauseContainer.FadeIn(750, Easing.OutQuint);
         }
 
         protected override void OnSuspending(Screen next)
@@ -314,7 +314,7 @@ namespace osu.Game.Screens.Play
             HitRenderer?.FadeOut(fade_out_duration);
             Content.FadeOut(fade_out_duration);
 
-            hudOverlay?.ScaleTo(0.7f, fade_out_duration * 3, EasingTypes.In);
+            hudOverlay?.ScaleTo(0.7f, fade_out_duration * 3, Easing.In);
 
             Background?.FadeTo(1f, fade_out_duration);
         }
diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs
index bd4ca768b8..d9bdb50ef0 100644
--- a/osu.Game/Screens/Play/PlayerLoader.cs
+++ b/osu.Game/Screens/Play/PlayerLoader.cs
@@ -82,13 +82,13 @@ namespace osu.Game.Screens.Play
 
         private void contentIn()
         {
-            Content.ScaleTo(1, 650, EasingTypes.OutQuint);
+            Content.ScaleTo(1, 650, Easing.OutQuint);
             Content.FadeInFromZero(400);
         }
 
         private void contentOut()
         {
-            Content.ScaleTo(0.7f, 300, EasingTypes.InQuint);
+            Content.ScaleTo(0.7f, 300, Easing.InQuint);
             Content.FadeOut(250);
         }
 
@@ -102,7 +102,7 @@ namespace osu.Game.Screens.Play
 
             contentIn();
 
-            logo.Delay(500).MoveToOffset(new Vector2(0, -180), 500, EasingTypes.InOutExpo);
+            logo.Delay(500).MoveToOffset(new Vector2(0, -180), 500, Easing.InOutExpo);
             info.Delay(750).FadeIn(500);
             this.Delay(2150).Schedule(pushWhenLoaded);
         }
@@ -131,7 +131,7 @@ namespace osu.Game.Screens.Play
 
         protected override bool OnExiting(Screen next)
         {
-            Content.ScaleTo(0.7f, 150, EasingTypes.InQuint);
+            Content.ScaleTo(0.7f, 150, Easing.InQuint);
             this.FadeOut(150);
 
             return base.OnExiting(next);
diff --git a/osu.Game/Screens/Play/ReplaySettings/ReplayGroup.cs b/osu.Game/Screens/Play/ReplaySettings/ReplayGroup.cs
index a2494d3a69..06cd783cae 100644
--- a/osu.Game/Screens/Play/ReplaySettings/ReplayGroup.cs
+++ b/osu.Game/Screens/Play/ReplaySettings/ReplayGroup.cs
@@ -94,7 +94,7 @@ namespace osu.Game.Screens.Play.ReplaySettings
                             Direction = FillDirection.Vertical,
                             RelativeSizeAxes = Axes.X,
                             AutoSizeDuration = transition_duration,
-                            AutoSizeEasing = EasingTypes.OutQuint,
+                            AutoSizeEasing = Easing.OutQuint,
                             AutoSizeAxes = Axes.Y,
                             Padding = new MarginPadding(15),
                             Spacing = new Vector2(0, 15),
@@ -123,10 +123,10 @@ namespace osu.Game.Screens.Play.ReplaySettings
             else
             {
                 content.AutoSizeAxes = Axes.None;
-                content.ResizeHeightTo(0, transition_duration, EasingTypes.OutQuint);
+                content.ResizeHeightTo(0, transition_duration, Easing.OutQuint);
             }
 
-            button.FadeColour(expanded ? buttonActiveColour : Color4.White, 200, EasingTypes.OutQuint);
+            button.FadeColour(expanded ? buttonActiveColour : Color4.White, 200, Easing.OutQuint);
         }
     }
 }
diff --git a/osu.Game/Screens/Play/SkipButton.cs b/osu.Game/Screens/Play/SkipButton.cs
index 6637680c15..b2d5abe71a 100644
--- a/osu.Game/Screens/Play/SkipButton.cs
+++ b/osu.Game/Screens/Play/SkipButton.cs
@@ -114,7 +114,7 @@ namespace osu.Game.Screens.Play
         protected override void Update()
         {
             base.Update();
-            remainingTimeBox.ResizeWidthTo((float)Math.Max(0, 1 - (Time.Current - displayTime) / (beginFadeTime - displayTime)), 120, EasingTypes.OutQuint);
+            remainingTimeBox.ResizeWidthTo((float)Math.Max(0, 1 - (Time.Current - displayTime) / (beginFadeTime - displayTime)), 120, Easing.OutQuint);
         }
 
         protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
@@ -154,14 +154,14 @@ namespace osu.Game.Screens.Play
                     {
                         case Visibility.Visible:
                             if (lastState == Visibility.Hidden)
-                                this.FadeIn(500, EasingTypes.OutExpo);
+                                this.FadeIn(500, Easing.OutExpo);
 
                             if (!IsHovered)
                                 using (BeginDelayedSequence(1000))
                                     scheduledHide = Schedule(() => State = Visibility.Hidden);
                             break;
                         case Visibility.Hidden:
-                            this.FadeOut(1000, EasingTypes.OutExpo);
+                            this.FadeOut(1000, Easing.OutExpo);
                             break;
                     }
                 }
@@ -249,29 +249,29 @@ namespace osu.Game.Screens.Play
 
             protected override bool OnHover(InputState state)
             {
-                flow.TransformSpacingTo(new Vector2(5), 500, EasingTypes.OutQuint);
-                box.FadeColour(colourHover, 500, EasingTypes.OutQuint);
-                background.FadeTo(0.4f, 500, EasingTypes.OutQuint);
+                flow.TransformSpacingTo(new Vector2(5), 500, Easing.OutQuint);
+                box.FadeColour(colourHover, 500, Easing.OutQuint);
+                background.FadeTo(0.4f, 500, Easing.OutQuint);
                 return base.OnHover(state);
             }
 
             protected override void OnHoverLost(InputState state)
             {
-                flow.TransformSpacingTo(new Vector2(0), 500, EasingTypes.OutQuint);
-                box.FadeColour(colourNormal, 500, EasingTypes.OutQuint);
-                background.FadeTo(0.2f, 500, EasingTypes.OutQuint);
+                flow.TransformSpacingTo(new Vector2(0), 500, Easing.OutQuint);
+                box.FadeColour(colourNormal, 500, Easing.OutQuint);
+                background.FadeTo(0.2f, 500, Easing.OutQuint);
                 base.OnHoverLost(state);
             }
 
             protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
             {
-                aspect.ScaleTo(0.75f, 2000, EasingTypes.OutQuint);
+                aspect.ScaleTo(0.75f, 2000, Easing.OutQuint);
                 return base.OnMouseDown(state, args);
             }
 
             protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
             {
-                aspect.ScaleTo(1, 1000, EasingTypes.OutElastic);
+                aspect.ScaleTo(1, 1000, Easing.OutElastic);
                 return base.OnMouseUp(state, args);
             }
 
@@ -280,8 +280,8 @@ namespace osu.Game.Screens.Play
                 if (!Enabled)
                     return false;
 
-                box.FlashColour(Color4.White, 500, EasingTypes.OutQuint);
-                aspect.ScaleTo(1.2f, 2000, EasingTypes.OutQuint);
+                box.FlashColour(Color4.White, 500, Easing.OutQuint);
+                aspect.ScaleTo(1.2f, 2000, Easing.OutQuint);
 
                 bool result = base.OnClick(state);
 
diff --git a/osu.Game/Screens/Play/SongProgress.cs b/osu.Game/Screens/Play/SongProgress.cs
index b0684b80cc..c513daf3d9 100644
--- a/osu.Game/Screens/Play/SongProgress.cs
+++ b/osu.Game/Screens/Play/SongProgress.cs
@@ -121,14 +121,14 @@ namespace osu.Game.Screens.Play
 
         private void updateBarVisibility()
         {
-            bar.FadeTo(allowSeeking ? 1 : 0, transition_duration, EasingTypes.In);
-            this.MoveTo(new Vector2(0, allowSeeking ? 0 : bottom_bar_height), transition_duration, EasingTypes.In);
+            bar.FadeTo(allowSeeking ? 1 : 0, transition_duration, Easing.In);
+            this.MoveTo(new Vector2(0, allowSeeking ? 0 : bottom_bar_height), transition_duration, Easing.In);
         }
 
         protected override void PopIn()
         {
             updateBarVisibility();
-            this.FadeIn(500, EasingTypes.OutQuint);
+            this.FadeIn(500, Easing.OutQuint);
         }
 
         protected override void PopOut()
diff --git a/osu.Game/Screens/Ranking/ResultModeButton.cs b/osu.Game/Screens/Ranking/ResultModeButton.cs
index 4789a5abb7..50be5c8d00 100644
--- a/osu.Game/Screens/Ranking/ResultModeButton.cs
+++ b/osu.Game/Screens/Ranking/ResultModeButton.cs
@@ -92,8 +92,8 @@ namespace osu.Game.Screens.Ranking
             };
         }
 
-        protected override void OnActivated() => colouredPart.FadeColour(activeColour, 200, EasingTypes.OutQuint);
+        protected override void OnActivated() => colouredPart.FadeColour(activeColour, 200, Easing.OutQuint);
 
-        protected override void OnDeactivated() => colouredPart.FadeColour(inactiveColour, 200, EasingTypes.OutQuint);
+        protected override void OnDeactivated() => colouredPart.FadeColour(inactiveColour, 200, Easing.OutQuint);
     }
 }
diff --git a/osu.Game/Screens/Ranking/Results.cs b/osu.Game/Screens/Ranking/Results.cs
index a0bf42599b..60ad484673 100644
--- a/osu.Game/Screens/Ranking/Results.cs
+++ b/osu.Game/Screens/Ranking/Results.cs
@@ -55,7 +55,7 @@ namespace osu.Game.Screens.Ranking
         protected override void OnEntering(Screen last)
         {
             base.OnEntering(last);
-            (Background as BackgroundScreenBeatmap)?.BlurTo(background_blur, 2500, EasingTypes.OutQuint);
+            (Background as BackgroundScreenBeatmap)?.BlurTo(background_blur, 2500, Easing.OutQuint);
 
             allCircles.ForEach(c =>
             {
@@ -68,27 +68,27 @@ namespace osu.Game.Screens.Ranking
             currentPage.FadeOut();
 
             circleOuterBackground
-                .FadeIn(transition_time, EasingTypes.OutQuint)
-                .ScaleTo(1, transition_time, EasingTypes.OutQuint);
+                .FadeIn(transition_time, Easing.OutQuint)
+                .ScaleTo(1, transition_time, Easing.OutQuint);
 
             using (BeginDelayedSequence(transition_time * 0.25f, true))
             {
                 circleOuter
-                    .FadeIn(transition_time, EasingTypes.OutQuint)
-                    .ScaleTo(1, transition_time, EasingTypes.OutQuint);
+                    .FadeIn(transition_time, Easing.OutQuint)
+                    .ScaleTo(1, transition_time, Easing.OutQuint);
 
                 using (BeginDelayedSequence(transition_time * 0.3f, true))
                 {
-                    backgroundParallax.FadeIn(transition_time, EasingTypes.OutQuint);
+                    backgroundParallax.FadeIn(transition_time, Easing.OutQuint);
 
                     circleInner
-                        .FadeIn(transition_time, EasingTypes.OutQuint)
-                        .ScaleTo(1, transition_time, EasingTypes.OutQuint);
+                        .FadeIn(transition_time, Easing.OutQuint)
+                        .ScaleTo(1, transition_time, Easing.OutQuint);
 
                     using (BeginDelayedSequence(transition_time * 0.4f, true))
                     {
-                        modeChangeButtons.FadeIn(transition_time, EasingTypes.OutQuint);
-                        currentPage.FadeIn(transition_time, EasingTypes.OutQuint);
+                        modeChangeButtons.FadeIn(transition_time, Easing.OutQuint);
+                        currentPage.FadeIn(transition_time, Easing.OutQuint);
                     }
                 }
             }
@@ -98,7 +98,7 @@ namespace osu.Game.Screens.Ranking
         {
             allCircles.ForEach(c =>
             {
-                c.ScaleTo(0, transition_time, EasingTypes.OutSine);
+                c.ScaleTo(0, transition_time, Easing.OutSine);
             });
 
             Content.FadeOut(transition_time / 4);
diff --git a/osu.Game/Screens/Ranking/ResultsPageScore.cs b/osu.Game/Screens/Ranking/ResultsPageScore.cs
index 09db835144..c5b7b85cf4 100644
--- a/osu.Game/Screens/Ranking/ResultsPageScore.cs
+++ b/osu.Game/Screens/Ranking/ResultsPageScore.cs
@@ -158,7 +158,7 @@ namespace osu.Game.Screens.Ranking
                             Origin = Anchor.TopCentre,
                             Direction = FillDirection.Horizontal,
                             LayoutDuration = 200,
-                            LayoutEasing = EasingTypes.OutQuint
+                            LayoutEasing = Easing.OutQuint
                         }
                     }
                 }
@@ -180,7 +180,7 @@ namespace osu.Game.Screens.Ranking
                 {
                     s.FadeOut()
                      .Then(delay += 200)
-                     .FadeIn(300 + delay, EasingTypes.Out);
+                     .FadeIn(300 + delay, Easing.Out);
                 }
             });
         }
@@ -372,7 +372,7 @@ namespace osu.Game.Screens.Ranking
         {
             protected override double RollingDuration => 3000;
 
-            protected override EasingTypes RollingEasing => EasingTypes.OutPow10;
+            protected override Easing RollingEasing => Easing.OutPow10;
 
             public SlowScoreCounter(uint leading = 0) : base(leading)
             {
diff --git a/osu.Game/Screens/ScreenWhiteBox.cs b/osu.Game/Screens/ScreenWhiteBox.cs
index 7eac2407e9..5596f345d5 100644
--- a/osu.Game/Screens/ScreenWhiteBox.cs
+++ b/osu.Game/Screens/ScreenWhiteBox.cs
@@ -46,18 +46,18 @@ namespace osu.Game.Screens
 
             using (Content.BeginDelayedSequence(300, true))
             {
-                boxContainer.ScaleTo(1, transition_time, EasingTypes.OutElastic);
-                boxContainer.RotateTo(0, transition_time / 2, EasingTypes.OutQuint);
+                boxContainer.ScaleTo(1, transition_time, Easing.OutElastic);
+                boxContainer.RotateTo(0, transition_time / 2, Easing.OutQuint);
 
-                textContainer.MoveTo(Vector2.Zero, transition_time, EasingTypes.OutExpo);
-                Content.FadeIn(transition_time, EasingTypes.OutExpo);
+                textContainer.MoveTo(Vector2.Zero, transition_time, Easing.OutExpo);
+                Content.FadeIn(transition_time, Easing.OutExpo);
             }
         }
 
         protected override bool OnExiting(Screen next)
         {
-            textContainer.MoveTo(new Vector2(DrawSize.X / 16, 0), transition_time, EasingTypes.OutExpo);
-            Content.FadeOut(transition_time, EasingTypes.OutExpo);
+            textContainer.MoveTo(new Vector2(DrawSize.X / 16, 0), transition_time, Easing.OutExpo);
+            Content.FadeOut(transition_time, Easing.OutExpo);
 
             return base.OnExiting(next);
         }
@@ -66,16 +66,16 @@ namespace osu.Game.Screens
         {
             base.OnSuspending(next);
 
-            textContainer.MoveTo(new Vector2(-(DrawSize.X / 16), 0), transition_time, EasingTypes.OutExpo);
-            Content.FadeOut(transition_time, EasingTypes.OutExpo);
+            textContainer.MoveTo(new Vector2(-(DrawSize.X / 16), 0), transition_time, Easing.OutExpo);
+            Content.FadeOut(transition_time, Easing.OutExpo);
         }
 
         protected override void OnResuming(Screen last)
         {
             base.OnResuming(last);
 
-            textContainer.MoveTo(Vector2.Zero, transition_time, EasingTypes.OutExpo);
-            Content.FadeIn(transition_time, EasingTypes.OutExpo);
+            textContainer.MoveTo(Vector2.Zero, transition_time, Easing.OutExpo);
+            Content.FadeIn(transition_time, Easing.OutExpo);
         }
 
         public ScreenWhiteBox()
diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs
index b696d637e6..7f49109bd0 100644
--- a/osu.Game/Screens/Select/BeatmapCarousel.cs
+++ b/osu.Game/Screens/Select/BeatmapCarousel.cs
@@ -341,7 +341,7 @@ namespace osu.Game.Screens.Select
 
                 if (group.State == BeatmapGroupState.Expanded)
                 {
-                    group.Header.MoveToX(-100, 500, EasingTypes.OutExpo);
+                    group.Header.MoveToX(-100, 500, Easing.OutExpo);
                     var headerY = group.Header.Position.Y;
 
                     foreach (BeatmapPanel panel in group.BeatmapPanels)
@@ -349,7 +349,7 @@ namespace osu.Game.Screens.Select
                         if (panel == selectedPanel)
                             selectedY = currentY + panel.DrawHeight / 2 - DrawHeight / 2;
 
-                        panel.MoveToX(-50, 500, EasingTypes.OutExpo);
+                        panel.MoveToX(-50, 500, Easing.OutExpo);
 
                         //on first display we want to begin hidden under our group's header.
                         if (panel.Alpha == 0)
@@ -360,11 +360,11 @@ namespace osu.Game.Screens.Select
                 }
                 else
                 {
-                    group.Header.MoveToX(0, 500, EasingTypes.OutExpo);
+                    group.Header.MoveToX(0, 500, Easing.OutExpo);
 
                     foreach (BeatmapPanel panel in group.BeatmapPanels)
                     {
-                        panel.MoveToX(0, 500, EasingTypes.OutExpo);
+                        panel.MoveToX(0, 500, Easing.OutExpo);
                         movePanel(panel, false, animated, ref currentY);
                     }
                 }
@@ -379,7 +379,7 @@ namespace osu.Game.Screens.Select
         private void movePanel(Panel panel, bool advance, bool animated, ref float currentY)
         {
             yPositions.Add(currentY);
-            panel.MoveToY(currentY, animated ? 750 : 0, EasingTypes.OutExpo);
+            panel.MoveToY(currentY, animated ? 750 : 0, Easing.OutExpo);
 
             if (advance)
                 currentY += panel.DrawHeight + 5;
diff --git a/osu.Game/Screens/Select/BeatmapDetails.cs b/osu.Game/Screens/Select/BeatmapDetails.cs
index 9ad932ff26..972d563ca5 100644
--- a/osu.Game/Screens/Select/BeatmapDetails.cs
+++ b/osu.Game/Screens/Select/BeatmapDetails.cs
@@ -119,12 +119,12 @@ namespace osu.Game.Screens.Select
 
                 ratingsGraph.Values = ratings.Select(rating => (float)rating);
 
-                ratingsContainer.FadeColour(Color4.White, 500, EasingTypes.Out);
+                ratingsContainer.FadeColour(Color4.White, 500, Easing.Out);
             }
             else if (failOnMissing)
                 ratingsGraph.Values = new float[10];
             else
-                ratingsContainer.FadeColour(Color4.Gray, 500, EasingTypes.Out);
+                ratingsContainer.FadeColour(Color4.Gray, 500, Easing.Out);
 
             if (hasRetriesFails)
             {
@@ -139,7 +139,7 @@ namespace osu.Game.Screens.Select
                 failGraph.Values = fails.Select(fail => (float)fail);
                 retryGraph.Values = retries.Zip(fails, (retry, fail) => retry + MathHelper.Clamp(fail, 0, maxValue));
 
-                retryFailContainer.FadeColour(Color4.White, 500, EasingTypes.Out);
+                retryFailContainer.FadeColour(Color4.White, 500, Easing.Out);
             }
             else if (failOnMissing)
             {
@@ -147,7 +147,7 @@ namespace osu.Game.Screens.Select
                 retryGraph.Values = new float[100];
             }
             else
-                retryFailContainer.FadeColour(Color4.Gray, 500, EasingTypes.Out);
+                retryFailContainer.FadeColour(Color4.Gray, 500, Easing.Out);
         }
 
         public BeatmapDetails()
@@ -169,7 +169,7 @@ namespace osu.Game.Screens.Select
                     Width = 0.4f,
                     Direction = FillDirection.Vertical,
                     LayoutDuration = 200,
-                    LayoutEasing = EasingTypes.OutQuint,
+                    LayoutEasing = Easing.OutQuint,
                     Children = new[]
                     {
                         description = new MetadataSegment("Description"),
diff --git a/osu.Game/Screens/Select/BeatmapInfoWedge.cs b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
index fbe0015d52..c2282beae8 100644
--- a/osu.Game/Screens/Select/BeatmapInfoWedge.cs
+++ b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
@@ -57,14 +57,14 @@ namespace osu.Game.Screens.Select
 
         protected override void PopIn()
         {
-            this.MoveToX(0, 800, EasingTypes.OutQuint);
-            this.RotateTo(0, 800, EasingTypes.OutQuint);
+            this.MoveToX(0, 800, Easing.OutQuint);
+            this.RotateTo(0, 800, Easing.OutQuint);
         }
 
         protected override void PopOut()
         {
-            this.MoveToX(-100, 800, EasingTypes.InQuint);
-            this.RotateTo(10, 800, EasingTypes.InQuint);
+            this.MoveToX(-100, 800, Easing.InQuint);
+            this.RotateTo(10, 800, Easing.InQuint);
         }
 
         public void UpdateBeatmap(WorkingBeatmap beatmap)
diff --git a/osu.Game/Screens/Select/Footer.cs b/osu.Game/Screens/Select/Footer.cs
index 33252f78f8..bb6d16da0f 100644
--- a/osu.Game/Screens/Select/Footer.cs
+++ b/osu.Game/Screens/Select/Footer.cs
@@ -58,7 +58,7 @@ namespace osu.Game.Screens.Select
             Action = action,
         });
 
-        private void updateModeLight() => modeLight.FadeColour(buttons.FirstOrDefault(b => b.IsHovered)?.SelectedColour ?? Color4.Transparent, TRANSITION_LENGTH, EasingTypes.OutQuint);
+        private void updateModeLight() => modeLight.FadeColour(buttons.FirstOrDefault(b => b.IsHovered)?.SelectedColour ?? Color4.Transparent, TRANSITION_LENGTH, Easing.OutQuint);
 
         public Footer()
         {
diff --git a/osu.Game/Screens/Select/FooterButton.cs b/osu.Game/Screens/Select/FooterButton.cs
index 536bf3971a..ae6c7d3c1e 100644
--- a/osu.Game/Screens/Select/FooterButton.cs
+++ b/osu.Game/Screens/Select/FooterButton.cs
@@ -89,27 +89,27 @@ namespace osu.Game.Screens.Select
         protected override bool OnHover(InputState state)
         {
             Hovered?.Invoke();
-            light.ScaleTo(new Vector2(1, 2), Footer.TRANSITION_LENGTH, EasingTypes.OutQuint);
-            light.FadeColour(SelectedColour, Footer.TRANSITION_LENGTH, EasingTypes.OutQuint);
+            light.ScaleTo(new Vector2(1, 2), Footer.TRANSITION_LENGTH, Easing.OutQuint);
+            light.FadeColour(SelectedColour, Footer.TRANSITION_LENGTH, Easing.OutQuint);
             return true;
         }
 
         protected override void OnHoverLost(InputState state)
         {
             HoverLost?.Invoke();
-            light.ScaleTo(new Vector2(1, 1), Footer.TRANSITION_LENGTH, EasingTypes.OutQuint);
-            light.FadeColour(DeselectedColour, Footer.TRANSITION_LENGTH, EasingTypes.OutQuint);
+            light.ScaleTo(new Vector2(1, 1), Footer.TRANSITION_LENGTH, Easing.OutQuint);
+            light.FadeColour(DeselectedColour, Footer.TRANSITION_LENGTH, Easing.OutQuint);
         }
 
         protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
         {
-            box.FadeTo(0.3f, Footer.TRANSITION_LENGTH * 2, EasingTypes.OutQuint);
+            box.FadeTo(0.3f, Footer.TRANSITION_LENGTH * 2, Easing.OutQuint);
             return base.OnMouseDown(state, args);
         }
 
         protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
         {
-            box.FadeOut(Footer.TRANSITION_LENGTH, EasingTypes.OutQuint);
+            box.FadeOut(Footer.TRANSITION_LENGTH, Easing.OutQuint);
             return base.OnMouseUp(state, args);
         }
 
@@ -117,7 +117,7 @@ namespace osu.Game.Screens.Select
         {
             box.ClearTransforms();
             box.Alpha = 1;
-            box.FadeOut(Footer.TRANSITION_LENGTH * 3, EasingTypes.OutQuint);
+            box.FadeOut(Footer.TRANSITION_LENGTH * 3, Easing.OutQuint);
             return base.OnClick(state);
         }
 
diff --git a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
index b0e234e5a2..c2d2f82b5c 100644
--- a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
+++ b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs
@@ -62,15 +62,15 @@ namespace osu.Game.Screens.Select.Leaderboards
                         break;
                     case Visibility.Visible:
                         this.FadeIn(200);
-                        content.MoveToY(0, 800, EasingTypes.OutQuint);
+                        content.MoveToY(0, 800, Easing.OutQuint);
 
                         using (BeginDelayedSequence(100, true))
                         {
-                            avatar.FadeIn(300, EasingTypes.OutQuint);
-                            nameLabel.FadeIn(350, EasingTypes.OutQuint);
+                            avatar.FadeIn(300, Easing.OutQuint);
+                            nameLabel.FadeIn(350, Easing.OutQuint);
 
-                            avatar.MoveToX(0, 300, EasingTypes.OutQuint);
-                            nameLabel.MoveToX(0, 350, EasingTypes.OutQuint);
+                            avatar.MoveToX(0, 300, Easing.OutQuint);
+                            nameLabel.MoveToX(0, 350, Easing.OutQuint);
 
                             using (BeginDelayedSequence(250, true))
                             {
@@ -269,13 +269,13 @@ namespace osu.Game.Screens.Select.Leaderboards
 
         protected override bool OnHover(Framework.Input.InputState state)
         {
-            background.FadeTo(0.5f, 300, EasingTypes.OutQuint);
+            background.FadeTo(0.5f, 300, Easing.OutQuint);
             return base.OnHover(state);
         }
 
         protected override void OnHoverLost(Framework.Input.InputState state)
         {
-            background.FadeTo(background_alpha, 200, EasingTypes.OutQuint);
+            background.FadeTo(background_alpha, 200, Easing.OutQuint);
             base.OnHoverLost(state);
         }
 
diff --git a/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs b/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs
index 58ce5ac564..ab02e8678f 100644
--- a/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs
+++ b/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs
@@ -54,13 +54,13 @@ namespace osu.Game.Screens.Select.Options
 
         protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
         {
-            flash.FadeTo(0.1f, 1000, EasingTypes.OutQuint);
+            flash.FadeTo(0.1f, 1000, Easing.OutQuint);
             return base.OnMouseDown(state, args);
         }
 
         protected override bool OnMouseUp(InputState state, MouseUpEventArgs args)
         {
-            flash.FadeTo(0, 1000, EasingTypes.OutQuint);
+            flash.FadeTo(0, 1000, Easing.OutQuint);
             return base.OnMouseUp(state, args);
         }
 
@@ -68,7 +68,7 @@ namespace osu.Game.Screens.Select.Options
         {
             flash.ClearTransforms();
             flash.Alpha = 0.9f;
-            flash.FadeOut(800, EasingTypes.OutExpo);
+            flash.FadeOut(800, Easing.OutExpo);
 
             return base.OnClick(state);
         }
diff --git a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
index 4b9a85f7f8..0a410f0e0f 100644
--- a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
+++ b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
@@ -29,27 +29,27 @@ namespace osu.Game.Screens.Select.Options
         {
             base.PopIn();
 
-            this.FadeIn(transition_duration, EasingTypes.OutQuint);
+            this.FadeIn(transition_duration, Easing.OutQuint);
 
             if (buttonsContainer.Position.X == 1 || Alpha == 0)
                 buttonsContainer.MoveToX(x_position - x_movement);
 
-            holder.ScaleTo(new Vector2(1, 1), transition_duration / 2, EasingTypes.OutQuint);
+            holder.ScaleTo(new Vector2(1, 1), transition_duration / 2, Easing.OutQuint);
 
-            buttonsContainer.MoveToX(x_position, transition_duration, EasingTypes.OutQuint);
-            buttonsContainer.TransformSpacingTo(Vector2.Zero, transition_duration, EasingTypes.OutQuint);
+            buttonsContainer.MoveToX(x_position, transition_duration, Easing.OutQuint);
+            buttonsContainer.TransformSpacingTo(Vector2.Zero, transition_duration, Easing.OutQuint);
         }
 
         protected override void PopOut()
         {
             base.PopOut();
 
-            holder.ScaleTo(new Vector2(1, 0), transition_duration / 2, EasingTypes.InSine);
+            holder.ScaleTo(new Vector2(1, 0), transition_duration / 2, Easing.InSine);
 
-            buttonsContainer.MoveToX(x_position + x_movement, transition_duration, EasingTypes.InSine);
-            buttonsContainer.TransformSpacingTo(new Vector2(200f, 0f), transition_duration, EasingTypes.InSine);
+            buttonsContainer.MoveToX(x_position + x_movement, transition_duration, Easing.InSine);
+            buttonsContainer.TransformSpacingTo(new Vector2(200f, 0f), transition_duration, Easing.InSine);
 
-            this.FadeOut(transition_duration, EasingTypes.InQuint);
+            this.FadeOut(transition_duration, Easing.InQuint);
         }
 
         public BeatmapOptionsOverlay()
diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs
index baa0f180f5..09fd22ecbe 100644
--- a/osu.Game/Screens/Select/SongSelect.cs
+++ b/osu.Game/Screens/Select/SongSelect.cs
@@ -312,14 +312,14 @@ namespace osu.Game.Screens.Select
 
             Content.FadeIn(250);
 
-            Content.ScaleTo(1, 250, EasingTypes.OutSine);
+            Content.ScaleTo(1, 250, Easing.OutSine);
 
             FilterControl.Activate();
         }
 
         protected override void OnSuspending(Screen next)
         {
-            Content.ScaleTo(1.1f, 250, EasingTypes.InSine);
+            Content.ScaleTo(1.1f, 250, Easing.InSine);
 
             Content.FadeOut(250);
 
diff --git a/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs b/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
index 8920ca2be8..8dc0110312 100644
--- a/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
+++ b/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
@@ -296,7 +296,7 @@ namespace osu.Game.Screens.Tournament
             }
         }
 
-        private void speedTo(float value, double duration = 0, EasingTypes easing = EasingTypes.None) =>
+        private void speedTo(float value, double duration = 0, Easing easing = Easing.None) =>
             this.TransformTo(nameof(speed), value, duration, easing);
 
         private enum ScrollState
diff --git a/osu.Game/Users/UserPanel.cs b/osu.Game/Users/UserPanel.cs
index b3c227855d..d51df8ccaa 100644
--- a/osu.Game/Users/UserPanel.cs
+++ b/osu.Game/Users/UserPanel.cs
@@ -169,7 +169,7 @@ namespace osu.Game.Users
         private void load(OsuColour colours, UserProfileOverlay profile)
         {
             Status.ValueChanged += displayStatus;
-            Status.ValueChanged += status => statusBg.FadeColour(status?.GetAppropriateColour(colours) ?? colours.Gray5, 500, EasingTypes.OutQuint);
+            Status.ValueChanged += status => statusBg.FadeColour(status?.GetAppropriateColour(colours) ?? colours.Gray5, 500, Easing.OutQuint);
 
             base.Action = () =>
             {
@@ -190,15 +190,15 @@ namespace osu.Game.Users
 
             if (status == null)
             {
-                statusBar.ResizeHeightTo(0f, transition_duration, EasingTypes.OutQuint);
-                statusBar.FadeOut(transition_duration, EasingTypes.OutQuint);
-                this.ResizeHeightTo(height - status_height, transition_duration, EasingTypes.OutQuint);
+                statusBar.ResizeHeightTo(0f, transition_duration, Easing.OutQuint);
+                statusBar.FadeOut(transition_duration, Easing.OutQuint);
+                this.ResizeHeightTo(height - status_height, transition_duration, Easing.OutQuint);
             }
             else
             {
-                statusBar.ResizeHeightTo(status_height, transition_duration, EasingTypes.OutQuint);
-                statusBar.FadeIn(transition_duration, EasingTypes.OutQuint);
-                this.ResizeHeightTo(height, transition_duration, EasingTypes.OutQuint);
+                statusBar.ResizeHeightTo(status_height, transition_duration, Easing.OutQuint);
+                statusBar.FadeIn(transition_duration, Easing.OutQuint);
+                this.ResizeHeightTo(height, transition_duration, Easing.OutQuint);
 
                 statusMessage.Text = status.Message;
             }

From c6250e1da52bbf19b865baf75f0e86e96fc5da2f Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Sun, 23 Jul 2017 11:34:09 +0900
Subject: [PATCH 29/30] Supress compiler warning

I don't think this is a sustainable solution if we start doing this in more places.
---
 osu.Game/Screens/Tournament/ScrollingTeamContainer.cs | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs b/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
index 8920ca2be8..ae0f6e4b3f 100644
--- a/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
+++ b/osu.Game/Screens/Tournament/ScrollingTeamContainer.cs
@@ -28,7 +28,11 @@ namespace osu.Game.Screens.Tournament
 
         private readonly Container tracker;
 
+#pragma warning disable 649
+        // set via reflection.
         private float speed;
+#pragma warning restore 649
+
         private int expiredCount;
 
         private float offset;

From 436e155e23dc40c3199b797237b278d87edea3a2 Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Sun, 23 Jul 2017 13:47:48 +0900
Subject: [PATCH 30/30] Update framework

---
 osu-framework | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/osu-framework b/osu-framework
index eda38950b5..b2d10ab19b 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit eda38950b57fe0693e1faa6ad8e55f2da9665f91
+Subproject commit b2d10ab19b74ecd38911f8bdf278b42379da0530