diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs
index 3b801cba01..b0e2f4e3da 100644
--- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs
+++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs
@@ -1,7 +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.Extensions.Color4Extensions;
 using osu.Game.Rulesets.Objects.Drawables;
 using osu.Framework.Graphics;
 using osu.Game.Rulesets.Mania.Objects.Drawables.Pieces;
@@ -10,7 +9,6 @@ using OpenTK;
 using osu.Framework.Graphics.Containers;
 using osu.Game.Rulesets.Mania.Judgements;
 using osu.Framework.Extensions.IEnumerableExtensions;
-using osu.Framework.Graphics.Shapes;
 using osu.Framework.Input.Bindings;
 
 namespace osu.Game.Rulesets.Mania.Objects.Drawables
@@ -23,9 +21,10 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
         private readonly DrawableNote head;
         private readonly DrawableNote tail;
 
+        private readonly GlowPiece glowPiece;
         private readonly BodyPiece bodyPiece;
         private readonly Container<DrawableHoldNoteTick> tickContainer;
-        private readonly Container glowContainer;
+        private readonly Container fullHeightContainer;
 
         /// <summary>
         /// Time at which the user started holding this hold note. Null if the user is not holding this hold note.
@@ -45,6 +44,13 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
 
             AddRange(new Drawable[]
             {
+                // The hit object itself cannot be used for various elements because the tail overshoots it
+                // So a specialized container that is updated to contain the tail height is used
+                fullHeightContainer = new Container
+                {
+                    RelativeSizeAxes = Axes.X,
+                    Child = glowPiece = new GlowPiece()
+                },
                 bodyPiece = new BodyPiece
                 {
                     Anchor = Anchor.TopCentre,
@@ -66,19 +72,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
                 {
                     Anchor = Anchor.BottomCentre,
                     Origin = Anchor.TopCentre
-                },
-                // The hit object itself cannot be used for the glow because the tail overshoots it
-                // So a specialized container that is updated to contain the tail height is used
-                glowContainer = new Container
-                {
-                    RelativeSizeAxes = Axes.X,
-                    Masking = true,
-                    Child = new Box
-                    {
-                        RelativeSizeAxes = Axes.Both,
-                        Alpha = 0,
-                        AlwaysPresent = true
-                    }
                 }
             });
 
@@ -97,13 +90,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
             AddNested(tail);
         }
 
-        protected override void LoadComplete()
-        {
-            base.LoadComplete();
-
-            updateGlow();
-        }
-
         public override Color4 AccentColour
         {
             get { return base.AccentColour; }
@@ -115,28 +101,13 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
 
                 tickContainer.Children.ForEach(t => t.AccentColour = value);
 
+                glowPiece.AccentColour = value;
                 bodyPiece.AccentColour = value;
                 head.AccentColour = value;
                 tail.AccentColour = value;
-
-                updateGlow();
             }
         }
 
-        private void updateGlow()
-        {
-            if (!IsLoaded)
-                return;
-
-            glowContainer.EdgeEffect = new EdgeEffectParameters
-            {
-                Type = EdgeEffectType.Glow,
-                Colour = AccentColour.Opacity(0.5f),
-                Radius = 10,
-                Hollow = true
-            };
-        }
-
         protected override void UpdateState(ArmedState state)
         {
         }
@@ -149,9 +120,9 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
             bodyPiece.Y = head.Height;
             bodyPiece.Height = DrawHeight - head.Height;
 
-            // Make the glowContainer "contain" the height of the tail note, keeping in mind
+            // Make the fullHeightContainer "contain" the height of the tail note, keeping in mind
             // that the tail note overshoots the height of this hit object
-            glowContainer.Height = DrawHeight + tail.Height;
+            fullHeightContainer.Height = DrawHeight + tail.Height;
         }
 
         public bool OnPressed(ManiaAction action)
@@ -208,7 +179,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
                 LifetimeStart = double.MinValue;
                 LifetimeEnd = double.MaxValue;
 
-                ApplyGlow = false;
+                GlowPiece.Alpha = 0;
             }
 
             public override bool OnPressed(ManiaAction action)
@@ -251,7 +222,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
                 LifetimeStart = double.MinValue;
                 LifetimeEnd = double.MaxValue;
 
-                ApplyGlow = false;
+                GlowPiece.Alpha = 0;
             }
 
             protected override ManiaJudgement CreateJudgement() => new HoldNoteTailJudgement();
diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs
index 37d7566e43..ff2d4e8817 100644
--- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs
+++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs
@@ -2,10 +2,8 @@
 // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
 
 using System;
-using osu.Framework.Extensions.Color4Extensions;
 using OpenTK.Graphics;
 using osu.Framework.Graphics;
-using osu.Framework.Graphics.Containers;
 using osu.Framework.Input.Bindings;
 using osu.Game.Rulesets.Mania.Judgements;
 using osu.Game.Rulesets.Mania.Objects.Drawables.Pieces;
@@ -18,11 +16,9 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
     /// </summary>
     public class DrawableNote : DrawableManiaHitObject<Note>, IKeyBindingHandler<ManiaAction>
     {
-        /// <summary>
-        /// Gets or sets whether this <see cref="DrawableNote"/> should apply glow to itself.
-        /// </summary>
-        protected bool ApplyGlow = true;
+        protected readonly GlowPiece GlowPiece;
 
+        private readonly LaneGlowPiece laneGlowPiece;
         private readonly NotePiece headPiece;
 
         public DrawableNote(Note hitObject, ManiaAction action)
@@ -31,19 +27,20 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
             RelativeSizeAxes = Axes.X;
             AutoSizeAxes = Axes.Y;
 
-            Add(headPiece = new NotePiece
+            Children = new Drawable[]
             {
-                Anchor = Anchor.TopCentre,
-                Origin = Anchor.TopCentre,
-                Masking = true
-            });
-        }
-
-        protected override void LoadComplete()
-        {
-            base.LoadComplete();
-
-            updateGlow();
+                laneGlowPiece = new LaneGlowPiece
+                {
+                    Anchor = Anchor.Centre,
+                    Origin = Anchor.Centre
+                },
+                GlowPiece = new GlowPiece(),
+                headPiece = new NotePiece
+                {
+                    Anchor = Anchor.TopCentre,
+                    Origin = Anchor.TopCentre
+                }
+            };
         }
 
         public override Color4 AccentColour
@@ -55,29 +52,12 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
                     return;
                 base.AccentColour = value;
 
+                laneGlowPiece.AccentColour = value;
+                GlowPiece.AccentColour = value;
                 headPiece.AccentColour = value;
-
-                updateGlow();
             }
         }
 
-        private void updateGlow()
-        {
-            if (!IsLoaded)
-                return;
-
-            if (!ApplyGlow)
-                return;
-
-            headPiece.EdgeEffect = new EdgeEffectParameters
-            {
-                Type = EdgeEffectType.Glow,
-                Colour = AccentColour.Opacity(0.5f),
-                Radius = 10,
-                Hollow = true
-            };
-        }
-
         protected override void CheckJudgement(bool userTriggered)
         {
             if (!userTriggered)
diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/GlowPiece.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/GlowPiece.cs
new file mode 100644
index 0000000000..6f022f452f
--- /dev/null
+++ b/osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/GlowPiece.cs
@@ -0,0 +1,65 @@
+// 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.Extensions.Color4Extensions;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Shapes;
+using osu.Game.Graphics;
+using OpenTK.Graphics;
+
+namespace osu.Game.Rulesets.Mania.Objects.Drawables.Pieces
+{
+    public class GlowPiece : CompositeDrawable, IHasAccentColour
+    {
+        private const float glow_alpha = 0.7f;
+        private const float glow_radius = 5;
+
+        public GlowPiece()
+        {
+            RelativeSizeAxes = Axes.Both;
+            Masking = true;
+
+            InternalChild = new Box
+            {
+                RelativeSizeAxes = Axes.Both,
+                Alpha = 0,
+                AlwaysPresent = true
+            };
+        }
+
+        protected override void LoadComplete()
+        {
+            base.LoadComplete();
+            updateGlow();
+        }
+
+        private Color4 accentColour;
+        public Color4 AccentColour
+        {
+            get { return accentColour; }
+            set
+            {
+                if (accentColour == value)
+                    return;
+                accentColour = value;
+
+                updateGlow();
+            }
+        }
+
+        private void updateGlow()
+        {
+            if (!IsLoaded)
+                return;
+
+            EdgeEffect = new EdgeEffectParameters
+            {
+                Type = EdgeEffectType.Glow,
+                Colour = AccentColour.Opacity(glow_alpha),
+                Radius = glow_radius,
+                Hollow = true
+            };
+        }
+    }
+}
diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/LaneGlowPiece.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/LaneGlowPiece.cs
new file mode 100644
index 0000000000..6d4ac2fb61
--- /dev/null
+++ b/osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/LaneGlowPiece.cs
@@ -0,0 +1,85 @@
+// 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.Extensions.Color4Extensions;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Colour;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Shapes;
+using osu.Game.Graphics;
+
+namespace osu.Game.Rulesets.Mania.Objects.Drawables.Pieces
+{
+    public class LaneGlowPiece : CompositeDrawable, IHasAccentColour
+    {
+        private const float total_height = 100;
+        private const float glow_height = 50;
+        private const float glow_alpha = 0.4f;
+        private const float edge_alpha = 0.3f;
+
+        public LaneGlowPiece()
+        {
+            BypassAutoSizeAxes = Axes.Both;
+            RelativeSizeAxes = Axes.X;
+            Height = total_height;
+
+            InternalChildren = new[]
+            {
+                new Container
+                {
+                    Name = "Left edge",
+                    RelativeSizeAxes = Axes.Y,
+                    Width = 1,
+                    Children = createGradient(edge_alpha)
+                },
+                new Container
+                {
+                    Name = "Right edge",
+                    Anchor = Anchor.TopRight,
+                    Origin = Anchor.TopRight,
+                    RelativeSizeAxes = Axes.Y,
+                    Width = 1,
+                    Children = createGradient(edge_alpha)
+                },
+                new Container
+                {
+                    Name = "Glow",
+                    Anchor = Anchor.Centre,
+                    Origin = Anchor.Centre,
+                    RelativeSizeAxes = Axes.X,
+                    Height = glow_height,
+                    Children = createGradient(glow_alpha)
+                }
+            };
+        }
+
+        private Drawable[] createGradient(float alpha) => new Drawable[]
+        {
+            new Box
+            {
+                Name = "Top",
+                RelativeSizeAxes = Axes.Both,
+                Height = 0.5f,
+                Blending = BlendingMode.Additive,
+                Colour = ColourInfo.GradientVertical(Color4.Transparent, Color4.White.Opacity(alpha))
+            },
+            new Box
+            {
+                Name = "Bottom",
+                Anchor = Anchor.BottomLeft,
+                Origin = Anchor.BottomLeft,
+                RelativeSizeAxes = Axes.Both,
+                Height = 0.5f,
+                Blending = BlendingMode.Additive,
+                Colour = ColourInfo.GradientVertical(Color4.White.Opacity(alpha), Color4.Transparent)
+            }
+        };
+
+        public Color4 AccentColour
+        {
+            get { return Colour; }
+            set { Colour = value; }
+        }
+    }
+}
diff --git a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj
index ef098a023d..8fc10b7cc4 100644
--- a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj
+++ b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj
@@ -70,6 +70,8 @@
     <Compile Include="Objects\Drawables\DrawableManiaHitObject.cs" />
     <Compile Include="Objects\Drawables\DrawableNote.cs" />
     <Compile Include="Objects\Drawables\Pieces\BodyPiece.cs" />
+    <Compile Include="Objects\Drawables\Pieces\GlowPiece.cs" />
+    <Compile Include="Objects\Drawables\Pieces\LaneGlowPiece.cs" />
     <Compile Include="Objects\Drawables\Pieces\NotePiece.cs" />
     <Compile Include="Objects\Types\IHasColumn.cs" />
     <Compile Include="Scoring\ManiaScoreProcessor.cs" />
diff --git a/osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs b/osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs
index f1c0afc675..1be91a7d94 100644
--- a/osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/TaikoHitObject.cs
@@ -1,8 +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.Game.Beatmaps;
-using osu.Game.Beatmaps.ControlPoints;
 using osu.Game.Rulesets.Objects;
 
 namespace osu.Game.Rulesets.Taiko.Objects
@@ -29,19 +27,5 @@ namespace osu.Game.Rulesets.Taiko.Objects
         /// Strong hit objects give more points for hitting the hit object with both keys.
         /// </summary>
         public bool IsStrong;
-
-        /// <summary>
-        /// Whether this HitObject is in Kiai time.
-        /// </summary>
-        public bool Kiai { get; protected set; }
-
-        public override void ApplyDefaults(ControlPointInfo controlPointInfo, BeatmapDifficulty difficulty)
-        {
-            base.ApplyDefaults(controlPointInfo, difficulty);
-
-            EffectControlPoint effectPoint = controlPointInfo.EffectPointAt(StartTime);
-
-            Kiai |= effectPoint.KiaiMode;
-        }
     }
-}
\ No newline at end of file
+}
diff --git a/osu.Game/Rulesets/Objects/HitObject.cs b/osu.Game/Rulesets/Objects/HitObject.cs
index c343cdaf33..c69979d4cf 100644
--- a/osu.Game/Rulesets/Objects/HitObject.cs
+++ b/osu.Game/Rulesets/Objects/HitObject.cs
@@ -30,6 +30,11 @@ namespace osu.Game.Rulesets.Objects
         /// </summary>
         public SampleInfoList Samples = new SampleInfoList();
 
+        /// <summary>
+        /// Whether this <see cref="HitObject"/> is in Kiai time.
+        /// </summary>
+        public bool Kiai { get; private set; }
+
         /// <summary>
         /// Applies default values to this HitObject.
         /// </summary>
@@ -38,6 +43,9 @@ namespace osu.Game.Rulesets.Objects
         public virtual void ApplyDefaults(ControlPointInfo controlPointInfo, BeatmapDifficulty difficulty)
         {
             SoundControlPoint soundPoint = controlPointInfo.SoundPointAt(StartTime);
+            EffectControlPoint effectPoint = controlPointInfo.EffectPointAt(StartTime);
+
+            Kiai |= effectPoint.KiaiMode;
 
             // Initialize first sample
             Samples.ForEach(s => initializeSampleInfo(s, soundPoint));