Implemented show/hide key bound shortcuts.
Implemented show/hide key bound shortcuts.

--- a/Documents/CHANGES.txt
+++ b/Documents/CHANGES.txt
@@ -1,3 +1,19 @@
+1.0.9.0
+	Added: Build Engineer now implements the '\' backslash show/hide shortcut.
+	Added: New readouts to the vessel category:
+		- Current Stage DeltaV
+		- Surface Thrust to Weight Ratio
+
+	Added: New editor overlay system.
+		- Sleeker design.
+		- Hover over part information options:
+			- Name only
+			- Middle click to show
+			- Always show
+		- Slide out overlay displays:
+			- Vessel information
+			- Resources display
+
 1.0.8.1
 	Fixed: Bug which caused rendezvous readouts to freeze the game or show all zeros.
 

--- a/KerbalEngineer/Editor/BuildAdvanced.cs
+++ b/KerbalEngineer/Editor/BuildAdvanced.cs
@@ -124,35 +124,16 @@
 
         #endregion
 
-        #region Methods: private
-
-        private void Awake()
-        {
-            Instance = this;
-            this.bodiesList = this.gameObject.AddComponent<DropDown>();
-            this.bodiesList.DrawCallback = this.DrawBodiesList;
-            this.Load();
-        }
-
-        /// <summary>
-        ///     Checks whether the editor should be locked to stop click-through.
-        /// </summary>
-        private void CheckEditorLock()
+        #region Methods: protected
+
+        protected void Awake()
         {
             try
             {
-                if ((this.position.MouseIsOver() || this.bodiesList.Position.MouseIsOver()) && !this.isEditorLocked)
-                {
-                    EditorLogic.fetch.Lock(true, true, true, "KER_BuildAdvanced");
-                    BuildOverlay.BuildOverlayPartInfo.Hidden = true;
-                    this.isEditorLocked = true;
-                }
-                else if (!this.position.MouseIsOver() && !this.bodiesList.Position.MouseIsOver() && this.isEditorLocked)
-                {
-                    EditorLogic.fetch.Unlock("KER_BuildAdvanced");
-                    BuildOverlay.BuildOverlayPartInfo.Hidden = false;
-                    this.isEditorLocked = false;
-                }
+                Instance = this;
+                this.bodiesList = this.gameObject.AddComponent<DropDown>();
+                this.bodiesList.DrawCallback = this.DrawBodiesList;
+                this.Load();
             }
             catch (Exception ex)
             {
@@ -161,481 +142,9 @@
         }
 
         /// <summary>
-        ///     Draws the atmospheric settings.
-        /// </summary>
-        private void DrawAtmosphericDetails()
-        {
-            try
-            {
-                GUILayout.BeginHorizontal();
-                GUILayout.Label("Pressure: " + (this.atmosphericPercentage * 100.0f).ToString("F1") + "%", this.settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset));
-                GUI.skin = HighLogic.Skin;
-                GUILayout.BeginVertical();
-                GUILayout.FlexibleSpace();
-                this.atmosphericPercentage = GUILayout.HorizontalSlider(this.atmosphericPercentage, 0, 1.0f);
-                GUILayout.FlexibleSpace();
-                GUILayout.EndVertical();
-                GUI.skin = null;
-                GUILayout.EndHorizontal();
-
-                GUILayout.Space(5.0f);
-
-                GUILayout.BeginHorizontal();
-                GUILayout.Label("Velocity: " + this.atmosphericVelocity.ToString("F1") + "m/s", this.settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset));
-                GUI.skin = HighLogic.Skin;
-                GUILayout.BeginVertical();
-                GUILayout.FlexibleSpace();
-                this.atmosphericVelocity = GUILayout.HorizontalSlider(this.atmosphericVelocity, 0, 2500f);
-                GUILayout.FlexibleSpace();
-                GUILayout.EndVertical();
-                GUI.skin = null;
-                GUILayout.EndHorizontal();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawAtmosphericDetails");
-            }
-        }
-
-        private void DrawBodiesList()
-        {
-            try
-            {
-                if (CelestialBodies.SystemBody == CelestialBodies.SelectedBody)
-                {
-                    this.DrawBody(CelestialBodies.SystemBody);
-                }
-                else
-                {
-                    foreach (var body in CelestialBodies.SystemBody.Children)
-                    {
-                        this.DrawBody(body);
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        private void DrawBody(CelestialBodies.BodyInfo bodyInfo, int depth = 0)
-        {
-            try
-            {
-                GUILayout.BeginHorizontal();
-                GUILayout.Space(20.0f * depth);
-                if (GUILayout.Button(bodyInfo.Children.Count > 0 ? bodyInfo.Name + " [" + bodyInfo.Children.Count + "]" : bodyInfo.Name, bodyInfo.Selected && bodyInfo.SelectedDepth == 0 ? this.bodiesButtonActiveStyle : this.bodiesButtonStyle))
-                {
-                    CelestialBodies.SetSelectedBody(bodyInfo.Name);
-                    this.bodiesList.Resize = true;
-                }
-                GUILayout.EndHorizontal();
-
-                if (bodyInfo.Selected)
-                {
-                    foreach (var body in bodyInfo.Children)
-                    {
-                        this.DrawBody(body, depth + 1);
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        /// <summary>
-        ///     Draws the burn time column.
-        /// </summary>
-        private void DrawBurnTime()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("BURN", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(TimeFormatter.ConvertToString(stage.time), this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawBurnTime");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the cost column.
-        /// </summary>
-        private void DrawCost()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(110.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("COST", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(stage.cost.ToString("N0") + " / " + stage.totalCost.ToString("N0"), this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawCost");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the deltaV column.
-        /// </summary>
-        private void DrawDeltaV()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("DELTA-V", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(stage.deltaV.ToString("N0") + " / " + stage.inverseTotalDeltaV.ToString("N0") + "m/s", this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawDeltaV");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the specific impluse column.
-        /// </summary>
-        private void DrawIsp()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("ISP", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(stage.isp.ToString("F1") + "s", this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawIsp");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the mass column.
-        /// </summary>
-        private void DrawMass()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(110.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("MASS", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(Units.ToMass(stage.mass, stage.totalMass), this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawMass");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the part count column.
-        /// </summary>
-        private void DrawPartCount()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(50.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("PARTS", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(stage.partCount.ToString("N0"), this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawPartCount");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the settings panel.
-        /// </summary>
-        private void DrawSettings()
-        {
-            try
-            {
-                GUILayout.BeginHorizontal();
-                GUILayout.Label("Compact mode collapses to the:", this.settingStyle);
-                this.compactCollapseRight = !GUILayout.Toggle(!this.compactCollapseRight, "LEFT", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                this.compactCollapseRight = GUILayout.Toggle(this.compactCollapseRight, "RIGHT", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                GUILayout.EndHorizontal();
-
-                GUILayout.BeginHorizontal();
-                GUILayout.Label("Build Engineer Overlay:", this.settingStyle);
-                BuildOverlay.Visible = GUILayout.Toggle(BuildOverlay.Visible, "VISIBLE", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                BuildOverlay.BuildOverlayPartInfo.NamesOnly = GUILayout.Toggle(BuildOverlay.BuildOverlayPartInfo.NamesOnly, "NAMES ONLY", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                BuildOverlay.BuildOverlayPartInfo.ClickToOpen = GUILayout.Toggle(BuildOverlay.BuildOverlayPartInfo.ClickToOpen, "CLICK TO OPEN", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                GUILayout.EndHorizontal();
-
-                GUILayout.BeginHorizontal();
-                GUILayout.Label("Flight Engineer activation mode:", this.settingStyle);
-                FlightEngineerPartless.IsPartless = GUILayout.Toggle(FlightEngineerPartless.IsPartless, "PARTLESS", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                FlightEngineerPartless.IsPartless = !GUILayout.Toggle(!FlightEngineerPartless.IsPartless, "MODULE", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                GUILayout.EndHorizontal();
-
-                GUILayout.BeginHorizontal();
-                GUILayout.Label("GUI Size: " + GuiDisplaySize.Increment, this.settingStyle);
-                if (GUILayout.Button("<", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)))
-                {
-                    GuiDisplaySize.Increment--;
-                }
-                if (GUILayout.Button(">", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)))
-                {
-                    GuiDisplaySize.Increment++;
-                }
-                GUILayout.EndHorizontal();
-
-                GUILayout.Label("Minimum delay between simulations: " + SimManager.minSimTime + "ms", this.settingStyle);
-                GUI.skin = HighLogic.Skin;
-                SimManager.minSimTime = (long)GUILayout.HorizontalSlider(SimManager.minSimTime, 0, 2000.0f);
-                GUI.skin = null;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawSettings");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the stage number column.
-        /// </summary>
-        private void DrawStageNumbers()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(30.0f * GuiDisplaySize.Offset));
-                GUILayout.Label(string.Empty, this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label("S" + stage.number, this.titleStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawStageNumbers");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the thrust column.
-        /// </summary>
-        private void DrawThrust()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("THRUST", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(stage.thrust.ToForce(), this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawThrust");
-            }
-        }
-
-        /// <summary>
-        ///     Drwas the thrust to weight ratio column.
-        /// </summary>
-        private void DrawTwr()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("TWR (MAX)", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(stage.thrustToWeight.ToString("F2") + " (" + stage.maxThrustToWeight.ToString("F2") + ")", this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawTwr");
-            }
-        }
-
-        /// <summary>
-        ///     Initialises all the styles that are required.
-        /// </summary>
-        private void InitialiseStyles()
-        {
-            try
-            {
-                this.windowStyle = new GUIStyle(HighLogic.Skin.window)
-                {
-                    alignment = TextAnchor.UpperLeft
-                };
-
-                this.areaStyle = new GUIStyle(HighLogic.Skin.box)
-                {
-                    padding = new RectOffset(0, 0, 9, 0)
-                };
-
-                this.areaSettingStyle = new GUIStyle(HighLogic.Skin.box)
-                {
-                    padding = new RectOffset(10, 10, 10, 10)
-                };
-
-                this.buttonStyle = new GUIStyle(HighLogic.Skin.button)
-                {
-                    normal =
-                    {
-                        textColor = Color.white
-                    },
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    alignment = TextAnchor.MiddleCenter
-                };
-
-                this.titleStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    normal =
-                    {
-                        textColor = Color.white
-                    },
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    alignment = TextAnchor.MiddleCenter,
-                    stretchWidth = true,
-                };
-
-                this.infoStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    alignment = TextAnchor.MiddleCenter,
-                    stretchWidth = true
-                };
-
-                this.settingStyle = new GUIStyle(this.titleStyle)
-                {
-                    alignment = TextAnchor.MiddleLeft,
-                    stretchWidth = true,
-                    stretchHeight = true
-                };
-
-                this.settingAtmoStyle = new GUIStyle(this.titleStyle)
-                {
-                    margin = new RectOffset(),
-                    padding = new RectOffset(),
-                    alignment = TextAnchor.UpperLeft
-                };
-
-                this.bodiesButtonStyle = new GUIStyle(HighLogic.Skin.button)
-                {
-                    margin = new RectOffset(0, 0, 2, 0),
-                    padding = new RectOffset(5, 5, 5, 5),
-                    normal =
-                    {
-                        textColor = Color.white
-                    },
-                    active =
-                    {
-                        textColor = Color.white
-                    },
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    alignment = TextAnchor.MiddleCenter,
-                    fixedHeight = 20.0f
-                };
-
-                this.bodiesButtonActiveStyle = new GUIStyle(this.bodiesButtonStyle)
-                {
-                    normal = this.bodiesButtonStyle.onNormal,
-                    hover = this.bodiesButtonStyle.onHover
-                };
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->InitialiseStyles");
-            }
-        }
-
-        /// <summary>
-        ///     Loads the settings when this object is created.
-        /// </summary>
-        private void Load()
-        {
-            try
-            {
-                var handler = SettingHandler.Load("BuildAdvanced.xml");
-                handler.Get("visible", ref this.visible);
-                this.position.x = handler.Get("windowPositionX", this.position.x);
-                this.position.y = handler.Get("windowPositionY", this.position.y);
-                handler.Get("compactMode", ref this.compactMode);
-                handler.Get("compactCollapseRight", ref this.compactCollapseRight);
-                handler.Get("showAllStages", ref this.showAllStages);
-                handler.Get("showAtmosphericDetails", ref this.showAtmosphericDetails);
-                handler.Get("showSettings", ref this.showSettings);
-                CelestialBodies.SetSelectedBody(handler.Get("selectedBodyName", CelestialBodies.SelectedBody.Name));
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->Load");
-            }
-        }
-
-        /// <summary>
         ///     Saves the settings when this object is destroyed.
         /// </summary>
-        private void OnDestroy()
+        protected void OnDestroy()
         {
             try
             {
@@ -654,11 +163,11 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "BuildAdvanced->OnDestroy");
-            }
-        }
-
-        private void OnGUI()
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void OnGUI()
         {
             try
             {
@@ -711,7 +220,453 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "BuildAdvanced->OnDraw");
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Start()
+        {
+            try
+            {
+                this.InitialiseStyles();
+                GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Update()
+        {
+            try
+            {
+                if (Input.GetKeyDown(KeyBinder.EditorShowHide))
+                {
+                    this.visible = !this.visible;
+                }
+
+                if (!this.visible || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0)
+                {
+                    this.bodiesList.enabled = false;
+                    return;
+                }
+
+                // Configure the simulation parameters based on the selected reference body.
+                SimManager.Gravity = CelestialBodies.SelectedBody.Gravity;
+
+                if (this.showAtmosphericDetails)
+                {
+                    SimManager.Atmosphere = CelestialBodies.SelectedBody.Atmosphere * 0.01d * this.atmosphericPercentage;
+                }
+                else
+                {
+                    SimManager.Atmosphere = 0;
+                }
+
+                SimManager.Velocity = this.atmosphericVelocity;
+                SimManager.TryStartSimulation();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "BuildAdvanced->Update");
+            }
+        }
+
+        #endregion
+
+        #region Methods: private
+
+        /// <summary>
+        ///     Checks whether the editor should be locked to stop click-through.
+        /// </summary>
+        private void CheckEditorLock()
+        {
+            if ((this.position.MouseIsOver() || this.bodiesList.Position.MouseIsOver()) && !this.isEditorLocked)
+            {
+                EditorLogic.fetch.Lock(true, true, true, "KER_BuildAdvanced");
+                BuildOverlay.BuildOverlayPartInfo.Hidden = true;
+                this.isEditorLocked = true;
+            }
+            else if (!this.position.MouseIsOver() && !this.bodiesList.Position.MouseIsOver() && this.isEditorLocked)
+            {
+                EditorLogic.fetch.Unlock("KER_BuildAdvanced");
+                BuildOverlay.BuildOverlayPartInfo.Hidden = false;
+                this.isEditorLocked = false;
+            }
+        }
+
+        /// <summary>
+        ///     Draws the atmospheric settings.
+        /// </summary>
+        private void DrawAtmosphericDetails()
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("Pressure: " + (this.atmosphericPercentage * 100.0f).ToString("F1") + "%", this.settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset));
+            GUI.skin = HighLogic.Skin;
+            GUILayout.BeginVertical();
+            GUILayout.FlexibleSpace();
+            this.atmosphericPercentage = GUILayout.HorizontalSlider(this.atmosphericPercentage, 0, 1.0f);
+            GUILayout.FlexibleSpace();
+            GUILayout.EndVertical();
+            GUI.skin = null;
+            GUILayout.EndHorizontal();
+
+            GUILayout.Space(5.0f);
+
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("Velocity: " + this.atmosphericVelocity.ToString("F1") + "m/s", this.settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset));
+            GUI.skin = HighLogic.Skin;
+            GUILayout.BeginVertical();
+            GUILayout.FlexibleSpace();
+            this.atmosphericVelocity = GUILayout.HorizontalSlider(this.atmosphericVelocity, 0, 2500f);
+            GUILayout.FlexibleSpace();
+            GUILayout.EndVertical();
+            GUI.skin = null;
+            GUILayout.EndHorizontal();
+        }
+
+        private void DrawBodiesList()
+        {
+            if (CelestialBodies.SystemBody == CelestialBodies.SelectedBody)
+            {
+                this.DrawBody(CelestialBodies.SystemBody);
+            }
+            else
+            {
+                foreach (var body in CelestialBodies.SystemBody.Children)
+                {
+                    this.DrawBody(body);
+                }
+            }
+        }
+
+        private void DrawBody(CelestialBodies.BodyInfo bodyInfo, int depth = 0)
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Space(20.0f * depth);
+            if (GUILayout.Button(bodyInfo.Children.Count > 0 ? bodyInfo.Name + " [" + bodyInfo.Children.Count + "]" : bodyInfo.Name, bodyInfo.Selected && bodyInfo.SelectedDepth == 0 ? this.bodiesButtonActiveStyle : this.bodiesButtonStyle))
+            {
+                CelestialBodies.SetSelectedBody(bodyInfo.Name);
+                this.bodiesList.Resize = true;
+            }
+            GUILayout.EndHorizontal();
+
+            if (bodyInfo.Selected)
+            {
+                foreach (var body in bodyInfo.Children)
+                {
+                    this.DrawBody(body, depth + 1);
+                }
+            }
+        }
+
+        /// <summary>
+        ///     Draws the burn time column.
+        /// </summary>
+        private void DrawBurnTime()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("BURN", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(TimeFormatter.ConvertToString(stage.time), this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the cost column.
+        /// </summary>
+        private void DrawCost()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(110.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("COST", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(stage.cost.ToString("N0") + " / " + stage.totalCost.ToString("N0"), this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the deltaV column.
+        /// </summary>
+        private void DrawDeltaV()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("DELTA-V", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(stage.deltaV.ToString("N0") + " / " + stage.inverseTotalDeltaV.ToString("N0") + "m/s", this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the specific impluse column.
+        /// </summary>
+        private void DrawIsp()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("ISP", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(stage.isp.ToString("F1") + "s", this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the mass column.
+        /// </summary>
+        private void DrawMass()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(110.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("MASS", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(Units.ToMass(stage.mass, stage.totalMass), this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the part count column.
+        /// </summary>
+        private void DrawPartCount()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(50.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("PARTS", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(stage.partCount.ToString("N0"), this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the settings panel.
+        /// </summary>
+        private void DrawSettings()
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("Compact mode collapses to the:", this.settingStyle);
+            this.compactCollapseRight = !GUILayout.Toggle(!this.compactCollapseRight, "LEFT", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            this.compactCollapseRight = GUILayout.Toggle(this.compactCollapseRight, "RIGHT", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("Build Engineer Overlay:", this.settingStyle);
+            BuildOverlay.Visible = GUILayout.Toggle(BuildOverlay.Visible, "VISIBLE", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            BuildOverlay.BuildOverlayPartInfo.NamesOnly = GUILayout.Toggle(BuildOverlay.BuildOverlayPartInfo.NamesOnly, "NAMES ONLY", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            BuildOverlay.BuildOverlayPartInfo.ClickToOpen = GUILayout.Toggle(BuildOverlay.BuildOverlayPartInfo.ClickToOpen, "CLICK TO OPEN", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("Flight Engineer activation mode:", this.settingStyle);
+            FlightEngineerPartless.IsPartless = GUILayout.Toggle(FlightEngineerPartless.IsPartless, "PARTLESS", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            FlightEngineerPartless.IsPartless = !GUILayout.Toggle(!FlightEngineerPartless.IsPartless, "MODULE", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("GUI Size: " + GuiDisplaySize.Increment, this.settingStyle);
+            if (GUILayout.Button("<", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)))
+            {
+                GuiDisplaySize.Increment--;
+            }
+            if (GUILayout.Button(">", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)))
+            {
+                GuiDisplaySize.Increment++;
+            }
+            GUILayout.EndHorizontal();
+
+            GUILayout.Label("Minimum delay between simulations: " + SimManager.minSimTime + "ms", this.settingStyle);
+            GUI.skin = HighLogic.Skin;
+            SimManager.minSimTime = (long)GUILayout.HorizontalSlider(SimManager.minSimTime, 0, 2000.0f);
+            GUI.skin = null;
+        }
+
+        /// <summary>
+        ///     Draws the stage number column.
+        /// </summary>
+        private void DrawStageNumbers()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(30.0f * GuiDisplaySize.Offset));
+            GUILayout.Label(string.Empty, this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label("S" + stage.number, this.titleStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the thrust column.
+        /// </summary>
+        private void DrawThrust()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("THRUST", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(stage.thrust.ToForce(), this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Drwas the thrust to weight ratio column.
+        /// </summary>
+        private void DrawTwr()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("TWR (MAX)", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(stage.thrustToWeight.ToString("F2") + " (" + stage.maxThrustToWeight.ToString("F2") + ")", this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Initialises all the styles that are required.
+        /// </summary>
+        private void InitialiseStyles()
+        {
+            this.windowStyle = new GUIStyle(HighLogic.Skin.window)
+            {
+                alignment = TextAnchor.UpperLeft
+            };
+
+            this.areaStyle = new GUIStyle(HighLogic.Skin.box)
+            {
+                padding = new RectOffset(0, 0, 9, 0)
+            };
+
+            this.areaSettingStyle = new GUIStyle(HighLogic.Skin.box)
+            {
+                padding = new RectOffset(10, 10, 10, 10)
+            };
+
+            this.buttonStyle = new GUIStyle(HighLogic.Skin.button)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                alignment = TextAnchor.MiddleCenter
+            };
+
+            this.titleStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                alignment = TextAnchor.MiddleCenter,
+                stretchWidth = true,
+            };
+
+            this.infoStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                alignment = TextAnchor.MiddleCenter,
+                stretchWidth = true
+            };
+
+            this.settingStyle = new GUIStyle(this.titleStyle)
+            {
+                alignment = TextAnchor.MiddleLeft,
+                stretchWidth = true,
+                stretchHeight = true
+            };
+
+            this.settingAtmoStyle = new GUIStyle(this.titleStyle)
+            {
+                margin = new RectOffset(),
+                padding = new RectOffset(),
+                alignment = TextAnchor.UpperLeft
+            };
+
+            this.bodiesButtonStyle = new GUIStyle(HighLogic.Skin.button)
+            {
+                margin = new RectOffset(0, 0, 2, 0),
+                padding = new RectOffset(5, 5, 5, 5),
+                normal =
+                {
+                    textColor = Color.white
+                },
+                active =
+                {
+                    textColor = Color.white
+                },
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                alignment = TextAnchor.MiddleCenter,
+                fixedHeight = 20.0f
+            };
+
+            this.bodiesButtonActiveStyle = new GUIStyle(this.bodiesButtonStyle)
+            {
+                normal = this.bodiesButtonStyle.onNormal,
+                hover = this.bodiesButtonStyle.onHover
+            };
+        }
+
+        /// <summary>
+        ///     Loads the settings when this object is created.
+        /// </summary>
+        private void Load()
+        {
+            try
+            {
+                var handler = SettingHandler.Load("BuildAdvanced.xml");
+                handler.Get("visible", ref this.visible);
+                this.position.x = handler.Get("windowPositionX", this.position.x);
+                this.position.y = handler.Get("windowPositionY", this.position.y);
+                handler.Get("compactMode", ref this.compactMode);
+                handler.Get("compactCollapseRight", ref this.compactCollapseRight);
+                handler.Get("showAllStages", ref this.showAllStages);
+                handler.Get("showAtmosphericDetails", ref this.showAtmosphericDetails);
+                handler.Get("showSettings", ref this.showSettings);
+                CelestialBodies.SetSelectedBody(handler.Get("selectedBodyName", CelestialBodies.SelectedBody.Name));
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "BuildAdvanced->Load");
             }
         }
 
@@ -719,43 +674,6 @@
         {
             this.InitialiseStyles();
             this.hasChanged = true;
-        }
-
-        private void Start()
-        {
-            this.InitialiseStyles();
-            GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
-        }
-
-        private void Update()
-        {
-            try
-            {
-                if (!this.visible || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0)
-                {
-                    this.bodiesList.enabled = false;
-                    return;
-                }
-
-                // Configure the simulation parameters based on the selected reference body.
-                SimManager.Gravity = CelestialBodies.SelectedBody.Gravity;
-
-                if (this.showAtmosphericDetails)
-                {
-                    SimManager.Atmosphere = CelestialBodies.SelectedBody.Atmosphere * 0.01d * this.atmosphericPercentage;
-                }
-                else
-                {
-                    SimManager.Atmosphere = 0;
-                }
-
-                SimManager.Velocity = this.atmosphericVelocity;
-                SimManager.TryStartSimulation();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->Update");
-            }
         }
 
         /// <summary>
@@ -842,7 +760,7 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "BuildAdvanced->Window");
+                Logger.Exception(ex);
             }
         }
 

--- a/KerbalEngineer/Flight/DisplayStack.cs
+++ b/KerbalEngineer/Flight/DisplayStack.cs
@@ -39,30 +39,57 @@
     [KSPAddon(KSPAddon.Startup.Flight, false)]
     public class DisplayStack : MonoBehaviour
     {
-        #region Instance
-
-        /// <summary>
-        ///     Gets the current instance of the DisplayStack.
-        /// </summary>
-        public static DisplayStack Instance { get; private set; }
-
-        #endregion
-
         #region Fields
 
+        private GUIStyle buttonStyle;
         private int numberOfStackSections;
         private bool resizeRequested;
+        private bool showControlBar = true;
+        private GUIStyle titleStyle;
         private int windowId;
         private Rect windowPosition;
-
-        #endregion
-
-        #region Constructors
+        private GUIStyle windowStyle;
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        ///     Gets the current instance of the DisplayStack.
+        /// </summary>
+        public static DisplayStack Instance { get; private set; }
+
+        public bool Hidden { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the visibility of the control bar.
+        /// </summary>
+        public bool ShowControlBar
+        {
+            get { return this.showControlBar; }
+            set { this.showControlBar = value; }
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        /// <summary>
+        ///     Request that the display stack's size is reset in the next draw call.
+        /// </summary>
+        public void RequestResize()
+        {
+            this.resizeRequested = true;
+        }
+
+        #endregion
+
+        #region Methods: protected
 
         /// <summary>
         ///     Sets the instance to this object.
         /// </summary>
-        private void Awake()
+        protected void Awake()
         {
             try
             {
@@ -79,14 +106,31 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "DisplayStack->Awake");
-            }
+                Logger.Exception(ex);
+            }
+        }
+
+        /// <summary>
+        ///     Runs when the object is destroyed.
+        /// </summary>
+        protected void OnDestroy()
+        {
+            try
+            {
+                this.Save();
+                RenderingManager.RemoveFromPostDrawQueue(0, this.Draw);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+            Logger.Log("ActionMenu->OnDestroy");
         }
 
         /// <summary>
         ///     Initialises the object's state on creation.
         /// </summary>
-        private void Start()
+        protected void Start()
         {
             try
             {
@@ -98,90 +142,11 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "DisplayStack->Start");
-            }
-        }
-
-        #endregion
-
-        #region Properties
-
-        private bool showControlBar = true;
-
-        /// <summary>
-        ///     Gets and sets the visibility of the control bar.
-        /// </summary>
-        public bool ShowControlBar
-        {
-            get { return this.showControlBar; }
-            set { this.showControlBar = value; }
-        }
-
-        public bool Hidden { get; set; }
-
-        #endregion
-
-        #region GUIStyles
-
-        private GUIStyle buttonStyle;
-        private GUIStyle titleStyle;
-        private GUIStyle windowStyle;
-
-        /// <summary>
-        ///     Initialises all the styles required for this object.
-        /// </summary>
-        private void InitialiseStyles()
-        {
-            try
-            {
-                this.windowStyle = new GUIStyle(HighLogic.Skin.window)
-                {
-                    margin = new RectOffset(),
-                    padding = new RectOffset(5, 5, 0, 5)
-                };
-
-                this.titleStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    margin = new RectOffset(0, 0, 5, 3),
-                    padding = new RectOffset(),
-                    alignment = TextAnchor.MiddleCenter,
-                    fontSize = (int)(13 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    stretchWidth = true
-                };
-
-                this.buttonStyle = new GUIStyle(HighLogic.Skin.button)
-                {
-                    normal =
-                    {
-                        textColor = Color.white
-                    },
-                    margin = new RectOffset(),
-                    padding = new RectOffset(),
-                    alignment = TextAnchor.MiddleCenter,
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    fixedWidth = 60.0f * GuiDisplaySize.Offset,
-                    fixedHeight = 25.0f * GuiDisplaySize.Offset,
-                };
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->InitialiseStyles");
-            }
-        }
-
-        private void OnSizeChanged()
-        {
-            this.InitialiseStyles();
-            this.RequestResize();
-        }
-
-        #endregion
-
-        #region Updating
-
-        private void Update()
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Update()
         {
             try
             {
@@ -190,20 +155,20 @@
                     return;
                 }
 
-                if (Input.GetKeyDown(KeyCode.Backslash))
+                if (Input.GetKeyDown(KeyBinder.FlightShowHide))
                 {
                     this.Hidden = !this.Hidden;
                 }
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "DisplayStack->Update");
-            }
-        }
-
-        #endregion
-
-        #region Drawing
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Methods: private
 
         /// <summary>
         ///     Called to draw the display stack when the UI is enabled.
@@ -238,33 +203,7 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "DisplayStack->Draw");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the display stack window.
-        /// </summary>
-        private void Window(int windowId)
-        {
-            try
-            {
-                if (this.ShowControlBar)
-                {
-                    this.DrawControlBar();
-                }
-
-                if (SectionLibrary.NumberOfStackSections > 0)
-                {
-                    this.DrawSections(SectionLibrary.StockSections);
-                    this.DrawSections(SectionLibrary.CustomSections);
-                }
-
-                GUI.DragWindow();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->Widnow");
+                Logger.Exception(ex);
             }
         }
 
@@ -273,17 +212,10 @@
         /// </summary>
         private void DrawControlBar()
         {
-            try
-            {
-                GUILayout.Label("FLIGHT ENGINEER " + EngineerGlobals.AssemblyVersion, this.titleStyle);
-
-                this.DrawControlBarButtons(SectionLibrary.StockSections);
-                this.DrawControlBarButtons(SectionLibrary.CustomSections);
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->DrawControlBar");
-            }
+            GUILayout.Label("FLIGHT ENGINEER " + EngineerGlobals.AssemblyVersion, this.titleStyle);
+
+            this.DrawControlBarButtons(SectionLibrary.StockSections);
+            this.DrawControlBarButtons(SectionLibrary.CustomSections);
         }
 
         /// <summary>
@@ -291,30 +223,23 @@
         /// </summary>
         private void DrawControlBarButtons(IEnumerable<SectionModule> sections)
         {
-            try
-            {
-                var index = 0;
-                foreach (var section in sections.Where(s => !string.IsNullOrEmpty(s.Abbreviation) || !s.IsCustom))
-                {
-                    if (index % 4 == 0)
+            var index = 0;
+            foreach (var section in sections.Where(s => !string.IsNullOrEmpty(s.Abbreviation) || !s.IsCustom))
+            {
+                if (index % 4 == 0)
+                {
+                    if (index > 0)
                     {
-                        if (index > 0)
-                        {
-                            GUILayout.EndHorizontal();
-                        }
-                        GUILayout.BeginHorizontal();
+                        GUILayout.EndHorizontal();
                     }
-                    section.IsVisible = GUILayout.Toggle(section.IsVisible, section.Abbreviation.ToUpper(), this.buttonStyle);
-                    index++;
-                }
-                if (index > 0)
-                {
-                    GUILayout.EndHorizontal();
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->DrawControlBarButtons");
+                    GUILayout.BeginHorizontal();
+                }
+                section.IsVisible = GUILayout.Toggle(section.IsVisible, section.Abbreviation.ToUpper(), this.buttonStyle);
+                index++;
+            }
+            if (index > 0)
+            {
+                GUILayout.EndHorizontal();
             }
         }
 
@@ -323,46 +248,75 @@
         /// </summary>
         private void DrawSections(IEnumerable<SectionModule> sections)
         {
-            try
-            {
-                foreach (var section in sections)
-                {
-                    if (!section.IsFloating)
-                    {
-                        section.Draw();
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->DrawSections");
-            }
-        }
-
-        #endregion
-
-        #region Destruction
-
-        /// <summary>
-        ///     Runs when the object is destroyed.
-        /// </summary>
-        private void OnDestroy()
-        {
-            try
-            {
-                this.Save();
-                RenderingManager.RemoveFromPostDrawQueue(0, this.Draw);
-                Logger.Log("ActionMenu->OnDestroy");
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->OnDestroy");
-            }
-        }
-
-        #endregion
-
-        #region Saving and Loading
+            foreach (var section in sections)
+            {
+                if (!section.IsFloating)
+                {
+                    section.Draw();
+                }
+            }
+        }
+
+        /// <summary>
+        ///     Initialises all the styles required for this object.
+        /// </summary>
+        private void InitialiseStyles()
+        {
+            this.windowStyle = new GUIStyle(HighLogic.Skin.window)
+            {
+                margin = new RectOffset(),
+                padding = new RectOffset(5, 5, 0, 5)
+            };
+
+            this.titleStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                margin = new RectOffset(0, 0, 5, 3),
+                padding = new RectOffset(),
+                alignment = TextAnchor.MiddleCenter,
+                fontSize = (int)(13 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                stretchWidth = true
+            };
+
+            this.buttonStyle = new GUIStyle(HighLogic.Skin.button)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                margin = new RectOffset(),
+                padding = new RectOffset(),
+                alignment = TextAnchor.MiddleCenter,
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                fixedWidth = 60.0f * GuiDisplaySize.Offset,
+                fixedHeight = 25.0f * GuiDisplaySize.Offset,
+            };
+        }
+
+        /// <summary>
+        ///     Load the stack's state.
+        /// </summary>
+        private void Load()
+        {
+            try
+            {
+                var handler = SettingHandler.Load("DisplayStack.xml");
+                this.ShowControlBar = handler.Get("showControlBar", this.ShowControlBar);
+                this.windowPosition.x = handler.Get("windowPositionX", this.windowPosition.x);
+                this.windowPosition.y = handler.Get("windowPositionY", this.windowPosition.y);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->Load");
+            }
+        }
+
+        private void OnSizeChanged()
+        {
+            this.InitialiseStyles();
+            this.RequestResize();
+        }
 
         /// <summary>
         ///     Saves the stack's state.
@@ -384,33 +338,29 @@
         }
 
         /// <summary>
-        ///     Load the stack's state.
-        /// </summary>
-        private void Load()
-        {
-            try
-            {
-                var handler = SettingHandler.Load("DisplayStack.xml");
-                this.ShowControlBar = handler.Get("showControlBar", this.ShowControlBar);
-                this.windowPosition.x = handler.Get("windowPositionX", this.windowPosition.x);
-                this.windowPosition.y = handler.Get("windowPositionY", this.windowPosition.y);
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->Load");
-            }
-        }
-
-        #endregion
-
-        #region Methods
-
-        /// <summary>
-        ///     Request that the display stack's size is reset in the next draw call.
-        /// </summary>
-        public void RequestResize()
-        {
-            this.resizeRequested = true;
+        ///     Draws the display stack window.
+        /// </summary>
+        private void Window(int windowId)
+        {
+            try
+            {
+                if (this.ShowControlBar)
+                {
+                    this.DrawControlBar();
+                }
+
+                if (SectionLibrary.NumberOfStackSections > 0)
+                {
+                    this.DrawSections(SectionLibrary.StockSections);
+                    this.DrawSections(SectionLibrary.CustomSections);
+                }
+
+                GUI.DragWindow();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->Widnow");
+            }
         }
 
         #endregion

--- a/KerbalEngineer/KerbalEngineer.csproj
+++ b/KerbalEngineer/KerbalEngineer.csproj
@@ -107,6 +107,7 @@
     <Compile Include="Helpers\TextureHelper.cs" />
     <Compile Include="Helpers\Units.cs" />
     <Compile Include="Helpers\TimeFormatter.cs" />
+    <Compile Include="KeyBinder.cs" />
     <Compile Include="UIControls\DropDown.cs" />
     <Compile Include="Logger.cs" />
     <Compile Include="EngineerGlobals.cs" />

--- /dev/null
+++ b/KerbalEngineer/KeyBinder.cs
@@ -1,1 +1,35 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+using UnityEngine;
+
+namespace KerbalEngineer
+{
+    public class KeyBinder
+    {
+        public static KeyCode EditorShowHide { get; set; }
+
+        public static KeyCode FlightShowHide { get; set; }
+
+        static KeyBinder()
+        {
+            EditorShowHide = FlightShowHide = KeyCode.Backslash;
+        }
+    }
+}

 Binary files a/Output/KerbalEngineer/KerbalEngineer.dll and b/Output/KerbalEngineer/KerbalEngineer.dll differ