diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs
index d9e46f4720..f9d027e7ce 100644
--- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs
+++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs
@@ -5,6 +5,8 @@ using osu.Game.Rulesets.Objects.Drawables;
 using osu.Framework.Graphics;
 using osu.Game.Rulesets.Mania.Objects.Drawables.Pieces;
 using OpenTK.Graphics;
+using osu.Framework.Configuration;
+using OpenTK.Input;
 
 namespace osu.Game.Rulesets.Mania.Objects.Drawables
 {
@@ -14,8 +16,8 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
         private readonly BodyPiece bodyPiece;
         private readonly NotePiece tailPiece;
 
-        public DrawableHoldNote(HoldNote hitObject)
-            : base(hitObject)
+        public DrawableHoldNote(HoldNote hitObject, Bindable<Key> key = null)
+            : base(hitObject, key)
         {
             RelativeSizeAxes = Axes.Both;
             Height = (float)HitObject.Duration;
diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs
index d33a8c48ee..4e276fddb7 100644
--- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs
+++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs
@@ -2,6 +2,8 @@
 // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
 
 using OpenTK.Graphics;
+using OpenTK.Input;
+using osu.Framework.Configuration;
 using osu.Framework.Graphics;
 using osu.Game.Rulesets.Mania.Judgements;
 using osu.Game.Rulesets.Objects.Drawables;
@@ -11,13 +13,21 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
     public abstract class DrawableManiaHitObject<TObject> : DrawableHitObject<ManiaHitObject, ManiaJudgement>
         where TObject : ManiaHitObject
     {
+        /// <summary>
+        /// The key that will trigger input for this hit object.
+        /// </summary>
+        protected Bindable<Key> Key { get; private set; } = new Bindable<Key>();
+
         public new TObject HitObject;
 
-        protected DrawableManiaHitObject(TObject hitObject)
+        protected DrawableManiaHitObject(TObject hitObject, Bindable<Key> key = null)
             : base(hitObject)
         {
             HitObject = hitObject;
 
+            if (key != null)
+                Key.BindTo(key);
+
             RelativePositionAxes = Axes.Y;
             Y = (float)HitObject.StartTime;
         }
diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs
index b216c362f5..d0519c61a8 100644
--- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs
+++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs
@@ -2,6 +2,8 @@
 // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
 
 using OpenTK.Graphics;
+using OpenTK.Input;
+using osu.Framework.Configuration;
 using osu.Framework.Graphics;
 using osu.Game.Rulesets.Mania.Objects.Drawables.Pieces;
 using osu.Game.Rulesets.Objects.Drawables;
@@ -12,8 +14,8 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
     {
         private readonly NotePiece headPiece;
 
-        public DrawableNote(Note hitObject)
-            : base(hitObject)
+        public DrawableNote(Note hitObject, Bindable<Key> key = null)
+            : base(hitObject, key)
         {
             RelativeSizeAxes = Axes.Both;
             Height = 100;
diff --git a/osu.Game.Rulesets.Mania/UI/Column.cs b/osu.Game.Rulesets.Mania/UI/Column.cs
index e1a925937d..72c60b28c9 100644
--- a/osu.Game.Rulesets.Mania/UI/Column.cs
+++ b/osu.Game.Rulesets.Mania/UI/Column.cs
@@ -18,6 +18,8 @@ using osu.Game.Rulesets.Objects.Drawables;
 using osu.Game.Rulesets.Mania.Objects;
 using osu.Game.Rulesets.Mania.Judgements;
 using osu.Game.Beatmaps.Timing;
+using System;
+using osu.Framework.Configuration;
 
 namespace osu.Game.Rulesets.Mania.UI
 {
@@ -33,7 +35,10 @@ namespace osu.Game.Rulesets.Mania.UI
         private const float column_width = 45;
         private const float special_column_width = 70;
 
-        public Key Key;
+        /// <summary>
+        /// The key that will trigger input actions for this column and hit objects contained inside it.
+        /// </summary>
+        public Bindable<Key> Key = new Bindable<Key>();
 
         private readonly Box background;
         private readonly Container hitTargetBar;
diff --git a/osu.Game.Rulesets.Mania/UI/ManiaHitRenderer.cs b/osu.Game.Rulesets.Mania/UI/ManiaHitRenderer.cs
index c67866dc10..4d734d231f 100644
--- a/osu.Game.Rulesets.Mania/UI/ManiaHitRenderer.cs
+++ b/osu.Game.Rulesets.Mania/UI/ManiaHitRenderer.cs
@@ -4,6 +4,8 @@
 using System;
 using System.Linq;
 using OpenTK;
+using OpenTK.Input;
+using osu.Framework.Configuration;
 using osu.Framework.Graphics;
 using osu.Game.Beatmaps;
 using osu.Game.Beatmaps.Timing;
@@ -76,13 +78,19 @@ namespace osu.Game.Rulesets.Mania.UI
 
         protected override DrawableHitObject<ManiaHitObject, ManiaJudgement> GetVisualRepresentation(ManiaHitObject h)
         {
+            var maniaPlayfield = Playfield as ManiaPlayfield;
+            if (maniaPlayfield == null)
+                return null;
+
+            Bindable<Key> key = maniaPlayfield.Columns.ElementAt(h.Column).Key;
+
             var holdNote = h as HoldNote;
             if (holdNote != null)
-                return new DrawableHoldNote(holdNote);
+                return new DrawableHoldNote(holdNote, key);
 
             var note = h as Note;
             if (note != null)
-                return new DrawableNote(note);
+                return new DrawableNote(note, key);
 
             return null;
         }
diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
index 56a86873e9..70bdd3b13c 100644
--- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
+++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs
@@ -55,7 +55,8 @@ namespace osu.Game.Rulesets.Mania.UI
             }
         }
 
-        public readonly FlowContainer<Column> Columns;
+        private readonly FlowContainer<Column> columns;
+        public IEnumerable<Column> Columns => columns.Children;
 
         private readonly ControlPointContainer barlineContainer;
 
@@ -87,7 +88,7 @@ namespace osu.Game.Rulesets.Mania.UI
                             RelativeSizeAxes = Axes.Both,
                             Colour = Color4.Black
                         },
-                        Columns = new FillFlowContainer<Column>
+                        columns = new FillFlowContainer<Column>
                         {
                             Name = "Columns",
                             RelativeSizeAxes = Axes.Y,
@@ -114,7 +115,7 @@ namespace osu.Game.Rulesets.Mania.UI
             };
 
             for (int i = 0; i < columnCount; i++)
-                Columns.Add(new Column(timingChanges));
+                columns.Add(new Column(timingChanges));
 
             TimeSpan = time_span_default;
         }
@@ -133,17 +134,17 @@ namespace osu.Game.Rulesets.Mania.UI
             // Set the special column + colour + key
             for (int i = 0; i < columnCount; i++)
             {
-                Column column = Columns.Children.ElementAt(i);
+                Column column = Columns.ElementAt(i);
                 column.IsSpecial = isSpecialColumn(i);
 
                 if (!column.IsSpecial)
                     continue;
 
-                column.Key = Key.Space;
+                column.Key.Value = Key.Space;
                 column.AccentColour = specialColumnColour;
             }
 
-            var nonSpecialColumns = Columns.Children.Where(c => !c.IsSpecial).ToList();
+            var nonSpecialColumns = Columns.Where(c => !c.IsSpecial).ToList();
 
             // We'll set the colours of the non-special columns in a separate loop, because the non-special
             // column colours are mirrored across their centre and special styles mess with this
@@ -162,11 +163,11 @@ namespace osu.Game.Rulesets.Mania.UI
 
                 int keyOffset = default_keys.Length / 2 - nonSpecialColumns.Count / 2 + i;
                 if (keyOffset >= 0 && keyOffset < default_keys.Length)
-                    column.Key = default_keys[keyOffset];
+                    column.Key.Value = default_keys[keyOffset];
                 else
                     // There is no default key defined for this column. Let's set this to Unknown for now
                     // however note that this will be gone after bindings are in place
-                    column.Key = Key.Unknown;
+                    column.Key.Value = Key.Unknown;
             }
         }
 
@@ -189,7 +190,7 @@ namespace osu.Game.Rulesets.Mania.UI
             }
         }
 
-        public override void Add(DrawableHitObject<ManiaHitObject, ManiaJudgement> h) => Columns.Children.ElementAt(h.HitObject.Column).Add(h);
+        public override void Add(DrawableHitObject<ManiaHitObject, ManiaJudgement> h) => Columns.ElementAt(h.HitObject.Column).Add(h);
 
         protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
         {
@@ -225,7 +226,7 @@ namespace osu.Game.Rulesets.Mania.UI
                 timeSpan = MathHelper.Clamp(timeSpan, time_span_min, time_span_max);
 
                 barlineContainer.TimeSpan = value;
-                Columns.Children.ForEach(c => c.ControlPointContainer.TimeSpan = value);
+                Columns.ForEach(c => c.ControlPointContainer.TimeSpan = value);
             }
         }