Added TimeFormatter helper.
Added TimeFormatter helper.

--- a/KerbalEngineer/Editor/BuildAdvanced.cs
+++ b/KerbalEngineer/Editor/BuildAdvanced.cs
@@ -24,6 +24,7 @@
 
 using KerbalEngineer.Extensions;
 using KerbalEngineer.Flight;
+using KerbalEngineer.Helpers;
 using KerbalEngineer.Settings;
 using KerbalEngineer.UIControls;
 using KerbalEngineer.VesselSimulator;
@@ -37,54 +38,80 @@
     [KSPAddon(KSPAddon.Startup.EditorAny, false)]
     public class BuildAdvanced : MonoBehaviour
     {
-        #region Instance
-
-        /// <summary>
-        ///     Gets the current instance if started or returns null.
-        /// </summary>
-        public static BuildAdvanced Instance { get; private set; }
-
-        #endregion
-
         #region Fields
 
+        private GUIStyle areaSettingStyle;
+        private GUIStyle areaStyle;
         private float atmosphericPercentage = 1.0f;
         private float atmosphericVelocity;
+        private GUIStyle bodiesButtonActiveStyle;
+        private GUIStyle bodiesButtonStyle;
         private DropDown bodiesList;
+        private Rect bodiesListPosition;
+        private GUIStyle buttonStyle;
         private int compactCheck;
         private bool compactCollapseRight;
+        private bool compactMode;
         private float compactRight;
         private bool hasChanged;
+        private GUIStyle infoStyle;
         private bool isEditorLocked;
         private int numberOfStages;
-        private Stage[] stages;
         private Rect position = new Rect(265.0f, 45.0f, 0, 0);
-        private Rect bodiesListPosition;
-
-        #region Styles
-
-        private GUIStyle areaSettingStyle;
-        private GUIStyle areaStyle;
-        private GUIStyle buttonStyle;
-        private GUIStyle infoStyle;
         private GUIStyle settingAtmoStyle;
         private GUIStyle settingStyle;
-        private GUIStyle titleStyle;
-        private GUIStyle windowStyle;
-        private GUIStyle bodiesButtonStyle;
-        private GUIStyle bodiesButtonActiveStyle;
-
-        #endregion
-
-        #endregion
-
-        #region Properties
-
-        private bool compactMode;
         private bool showAllStages;
         private bool showAtmosphericDetails;
         private bool showSettings;
+        private Stage[] stages;
+        private GUIStyle titleStyle;
         private bool visible = true;
+        private GUIStyle windowStyle;
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        ///     Gets the current instance if started or returns null.
+        /// </summary>
+        public static BuildAdvanced Instance { get; private set; }
+
+        /// <summary>
+        ///     Gets and sets whether to show in compact mode.
+        /// </summary>
+        public bool CompactMode
+        {
+            get { return this.compactMode; }
+            set { this.compactMode = value; }
+        }
+
+        /// <summary>
+        ///     Gets and sets whether to show all stages.
+        /// </summary>
+        public bool ShowAllStages
+        {
+            get { return this.showAllStages; }
+            set { this.showAllStages = value; }
+        }
+
+        /// <summary>
+        ///     Gets and sets whether to use atmospheric details.
+        /// </summary>
+        public bool ShowAtmosphericDetails
+        {
+            get { return this.showAtmosphericDetails; }
+            set { this.showAtmosphericDetails = value; }
+        }
+
+        /// <summary>
+        ///     Gets and sets whether to show the settings display.
+        /// </summary>
+        public bool ShowSettings
+        {
+            get { return this.showSettings; }
+            set { this.showSettings = value; }
+        }
 
         /// <summary>
         ///     Gets and sets whether the display is enabled.
@@ -95,45 +122,9 @@
             set { this.visible = value; }
         }
 
-        /// <summary>
-        ///     Gets and sets whether to show in compact mode.
-        /// </summary>
-        public bool CompactMode
-        {
-            get { return this.compactMode; }
-            set { this.compactMode = value; }
-        }
-
-        /// <summary>
-        ///     Gets and sets whether to show all stages.
-        /// </summary>
-        public bool ShowAllStages
-        {
-            get { return this.showAllStages; }
-            set { this.showAllStages = value; }
-        }
-
-        /// <summary>
-        ///     Gets and sets whether to use atmospheric details.
-        /// </summary>
-        public bool ShowAtmosphericDetails
-        {
-            get { return this.showAtmosphericDetails; }
-            set { this.showAtmosphericDetails = value; }
-        }
-
-        /// <summary>
-        ///     Gets and sets whether to show the settings display.
-        /// </summary>
-        public bool ShowSettings
-        {
-            get { return this.showSettings; }
-            set { this.showSettings = value; }
-        }
-
         #endregion
 
-        #region Initialisation
+        #region Methods: private
 
         private void Awake()
         {
@@ -143,207 +134,6 @@
             this.Load();
         }
 
-        private void Start()
-        {
-            this.InitialiseStyles();
-            GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
-        }
-
-        /// <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");
-            }
-        }
-
-        private void OnSizeChanged()
-        {
-            this.InitialiseStyles();
-            this.hasChanged = true;
-        }
-
-        #endregion
-
-        #region Update and Drawing
-
-        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");
-            }
-        }
-
-        private void OnGUI()
-        {
-            try
-            {
-                if (!this.visible || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0 || EditorLogic.fetch.editorScreen != EditorLogic.EditorScreen.Parts)
-                {
-                    return;
-                }
-
-                if (SimManager.ResultsReady())
-                {
-                    this.stages = SimManager.Stages;
-                }
-
-                SimManager.RequestSimulation();
-
-                if (this.stages == null)
-                {
-                    return;
-                }
-
-                // Change the window title based on whether in compact mode or not.
-                var title = !this.compactMode ? "KERBAL ENGINEER REDUX " + EngineerGlobals.AssemblyVersion : "K.E.R. " + EngineerGlobals.AssemblyVersion;
-
-                // Reset the window size when the staging or something else has changed.
-                var stageCount = this.stages.Count(stage => this.showAllStages || stage.deltaV > 0);
-                if (this.hasChanged || stageCount != this.numberOfStages)
-                {
-                    this.hasChanged = false;
-                    this.numberOfStages = stageCount;
-
-                    this.position.width = 0;
-                    this.position.height = 0;
-                }
-
-                GUI.skin = null;
-                this.position = GUILayout.Window(this.GetInstanceID(), this.position, this.Window, title, this.windowStyle).ClampToScreen();
-
-                if (this.compactCheck > 0 && this.compactCollapseRight)
-                {
-                    this.position.x = this.compactRight - this.position.width;
-                    this.compactCheck--;
-                }
-                else if (this.compactCheck > 0)
-                {
-                    this.compactCheck = 0;
-                }
-
-                // Check editor lock to manage click-through.
-                this.CheckEditorLock();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->OnDraw");
-            }
-        }
-
         /// <summary>
         ///     Checks whether the editor should be locked to stop click-through.
         /// </summary>
@@ -365,94 +155,6 @@
             catch (Exception ex)
             {
                 Logger.Exception(ex, "BuildAdvanced->CheckEditorLock");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the OnGUI window.
-        /// </summary>
-        private void Window(int windowId)
-        {
-            try
-            {
-                // Draw the compact mode toggle.
-                if (GUI.Toggle(new Rect(this.position.width - 70.0f * GuiDisplaySize.Offset, 5.0f, 65.0f * GuiDisplaySize.Offset, 20.0f), this.compactMode, "COMPACT", this.buttonStyle) != this.compactMode)
-                {
-                    this.hasChanged = true;
-                    this.compactCheck = 2;
-                    this.compactRight = this.position.xMax;
-                    this.compactMode = !this.compactMode;
-                }
-
-                // When not in compact mode draw the 'All Stages' and 'Atmospheric' toggles.
-                if (!this.compactMode)
-                {
-                    if (GUI.Toggle(new Rect(this.position.width - 143.0f * GuiDisplaySize.Offset, 5.0f, 70.0f * GuiDisplaySize.Offset, 20.0f), this.showSettings, "SETTINGS", this.buttonStyle) != this.showSettings)
-                    {
-                        this.hasChanged = true;
-                        this.showSettings = !this.showSettings;
-                    }
-
-                    if (GUI.Toggle(new Rect(this.position.width - 226.0f * GuiDisplaySize.Offset, 5.0f, 80.0f * GuiDisplaySize.Offset, 20.0f), this.showAllStages, "ALL STAGES", this.buttonStyle) != this.showAllStages)
-                    {
-                        this.hasChanged = true;
-                        this.showAllStages = !this.showAllStages;
-                    }
-
-                    if (GUI.Toggle(new Rect(this.position.width - 324.0f * GuiDisplaySize.Offset, 5.0f, 95.0f * GuiDisplaySize.Offset, 20.0f), this.showAtmosphericDetails, "ATMOSPHERIC", this.buttonStyle) != this.showAtmosphericDetails)
-                    {
-                        this.hasChanged = true;
-                        this.showAtmosphericDetails = !this.showAtmosphericDetails;
-                    }
-
-                    this.bodiesListPosition = new Rect(this.position.width - 452.0f * GuiDisplaySize.Offset, 5.0f, 125.0f * GuiDisplaySize.Offset, 20.0f);
-                    this.bodiesList.enabled = GUI.Toggle(this.bodiesListPosition, this.bodiesList.enabled, "BODY: " + CelestialBodies.SelectedBody.Name.ToUpper(), this.buttonStyle);
-                    this.bodiesList.SetPosition(this.bodiesListPosition.Translate(this.position));
-                }
-
-                // Draw the main informational display box.
-                if (!this.compactMode)
-                {
-                    GUILayout.BeginHorizontal(this.areaStyle);
-                    this.DrawStageNumbers();
-                    //this.DrawPartCount();
-                    this.DrawCost();
-                    this.DrawMass();
-                    this.DrawIsp();
-                    this.DrawThrust();
-                    this.DrawTwr();
-                    this.DrawDeltaV();
-                    this.DrawBurnTime();
-                    GUILayout.EndHorizontal();
-
-                    if (this.showAtmosphericDetails)
-                    {
-                        GUILayout.BeginVertical(this.areaSettingStyle);
-                        this.DrawAtmosphericDetails();
-                        GUILayout.EndVertical();
-                    }
-
-                    if (this.showSettings)
-                    {
-                        GUILayout.BeginVertical(this.areaSettingStyle);
-                        this.DrawSettings();
-                        GUILayout.EndVertical();
-                    }
-                }
-                else // Draw only a few details when in compact mode.
-                {
-                    GUILayout.BeginHorizontal(this.areaStyle);
-                    this.DrawStageNumbers();
-                    this.DrawTwr();
-                    this.DrawDeltaV();
-                    GUILayout.EndHorizontal();
-                }
-
-                GUI.DragWindow();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->Window");
             }
         }
 
@@ -493,6 +195,199 @@
             }
         }
 
+        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(stage.mass.ToMass(false) + " / " + stage.totalMass.ToMass(), 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>
@@ -571,102 +466,6 @@
         }
 
         /// <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 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 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(stage.mass.ToMass(false) + " / " + stage.totalMass.ToMass(), this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawMass");
-            }
-        }
-
-        /// <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 thrust column.
         /// </summary>
         private void DrawThrust()
@@ -715,105 +514,125 @@
         }
 
         /// <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 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(stage.time.ToTime(), this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawBurnTime");
-            }
-        }
-
-        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);
-            }
-        }
-
-        #endregion
-
-        #region Save and Load
+        ///     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.
@@ -841,27 +660,191 @@
             }
         }
 
-        /// <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");
+        private void OnGUI()
+        {
+            try
+            {
+                if (!this.visible || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0 || EditorLogic.fetch.editorScreen != EditorLogic.EditorScreen.Parts)
+                {
+                    return;
+                }
+
+                if (SimManager.ResultsReady())
+                {
+                    this.stages = SimManager.Stages;
+                }
+
+                SimManager.RequestSimulation();
+
+                if (this.stages == null)
+                {
+                    return;
+                }
+
+                // Change the window title based on whether in compact mode or not.
+                var title = !this.compactMode ? "KERBAL ENGINEER REDUX " + EngineerGlobals.AssemblyVersion : "K.E.R. " + EngineerGlobals.AssemblyVersion;
+
+                // Reset the window size when the staging or something else has changed.
+                var stageCount = this.stages.Count(stage => this.showAllStages || stage.deltaV > 0);
+                if (this.hasChanged || stageCount != this.numberOfStages)
+                {
+                    this.hasChanged = false;
+                    this.numberOfStages = stageCount;
+
+                    this.position.width = 0;
+                    this.position.height = 0;
+                }
+
+                GUI.skin = null;
+                this.position = GUILayout.Window(this.GetInstanceID(), this.position, this.Window, title, this.windowStyle).ClampToScreen();
+
+                if (this.compactCheck > 0 && this.compactCollapseRight)
+                {
+                    this.position.x = this.compactRight - this.position.width;
+                    this.compactCheck--;
+                }
+                else if (this.compactCheck > 0)
+                {
+                    this.compactCheck = 0;
+                }
+
+                // Check editor lock to manage click-through.
+                this.CheckEditorLock();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "BuildAdvanced->OnDraw");
+            }
+        }
+
+        private void OnSizeChanged()
+        {
+            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>
+        ///     Draws the OnGUI window.
+        /// </summary>
+        private void Window(int windowId)
+        {
+            try
+            {
+                // Draw the compact mode toggle.
+                if (GUI.Toggle(new Rect(this.position.width - 70.0f * GuiDisplaySize.Offset, 5.0f, 65.0f * GuiDisplaySize.Offset, 20.0f), this.compactMode, "COMPACT", this.buttonStyle) != this.compactMode)
+                {
+                    this.hasChanged = true;
+                    this.compactCheck = 2;
+                    this.compactRight = this.position.xMax;
+                    this.compactMode = !this.compactMode;
+                }
+
+                // When not in compact mode draw the 'All Stages' and 'Atmospheric' toggles.
+                if (!this.compactMode)
+                {
+                    if (GUI.Toggle(new Rect(this.position.width - 143.0f * GuiDisplaySize.Offset, 5.0f, 70.0f * GuiDisplaySize.Offset, 20.0f), this.showSettings, "SETTINGS", this.buttonStyle) != this.showSettings)
+                    {
+                        this.hasChanged = true;
+                        this.showSettings = !this.showSettings;
+                    }
+
+                    if (GUI.Toggle(new Rect(this.position.width - 226.0f * GuiDisplaySize.Offset, 5.0f, 80.0f * GuiDisplaySize.Offset, 20.0f), this.showAllStages, "ALL STAGES", this.buttonStyle) != this.showAllStages)
+                    {
+                        this.hasChanged = true;
+                        this.showAllStages = !this.showAllStages;
+                    }
+
+                    if (GUI.Toggle(new Rect(this.position.width - 324.0f * GuiDisplaySize.Offset, 5.0f, 95.0f * GuiDisplaySize.Offset, 20.0f), this.showAtmosphericDetails, "ATMOSPHERIC", this.buttonStyle) != this.showAtmosphericDetails)
+                    {
+                        this.hasChanged = true;
+                        this.showAtmosphericDetails = !this.showAtmosphericDetails;
+                    }
+
+                    this.bodiesListPosition = new Rect(this.position.width - 452.0f * GuiDisplaySize.Offset, 5.0f, 125.0f * GuiDisplaySize.Offset, 20.0f);
+                    this.bodiesList.enabled = GUI.Toggle(this.bodiesListPosition, this.bodiesList.enabled, "BODY: " + CelestialBodies.SelectedBody.Name.ToUpper(), this.buttonStyle);
+                    this.bodiesList.SetPosition(this.bodiesListPosition.Translate(this.position));
+                }
+
+                // Draw the main informational display box.
+                if (!this.compactMode)
+                {
+                    GUILayout.BeginHorizontal(this.areaStyle);
+                    this.DrawStageNumbers();
+                    //this.DrawPartCount();
+                    this.DrawCost();
+                    this.DrawMass();
+                    this.DrawIsp();
+                    this.DrawThrust();
+                    this.DrawTwr();
+                    this.DrawDeltaV();
+                    this.DrawBurnTime();
+                    GUILayout.EndHorizontal();
+
+                    if (this.showAtmosphericDetails)
+                    {
+                        GUILayout.BeginVertical(this.areaSettingStyle);
+                        this.DrawAtmosphericDetails();
+                        GUILayout.EndVertical();
+                    }
+
+                    if (this.showSettings)
+                    {
+                        GUILayout.BeginVertical(this.areaSettingStyle);
+                        this.DrawSettings();
+                        GUILayout.EndVertical();
+                    }
+                }
+                else // Draw only a few details when in compact mode.
+                {
+                    GUILayout.BeginHorizontal(this.areaStyle);
+                    this.DrawStageNumbers();
+                    this.DrawTwr();
+                    this.DrawDeltaV();
+                    GUILayout.EndHorizontal();
+                }
+
+                GUI.DragWindow();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "BuildAdvanced->Window");
             }
         }
 

--- a/KerbalEngineer/Extensions/DoubleExtensions.cs
+++ b/KerbalEngineer/Extensions/DoubleExtensions.cs
@@ -27,70 +27,21 @@
 {
     public static class DoubleExtensions
     {
-        /// <summary>
-        ///     Convert to a single precision floating point number.
-        /// </summary>
-        public static float ToFloat(this double value)
-        {
-            try
-            {
-                return (float)value;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToFloat");
-                return 0;
-            }
-        }
-
-        /// <summary>
-        ///     Convert to a ReadoutCategory formatted as a mass.
-        /// </summary>
-        public static string ToMass(this double value, bool showNotation = true)
-        {
-            try
-            {
-                value *= 1000;
-                return showNotation ? value.ToString("N0") + "kg" : value.ToString("N0");
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToMass");
-                return "ERR";
-            }
-        }
-
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as a force.
-        /// </summary>
-        public static string ToForce(this double value, bool showNotation = true)
-        {
-            try
-            {
-                var format = (value < 100000) ? (value < 10000) ? (value < 100) ? "N3" : "N2" : "N1" : "N0";
-                return showNotation ? value.ToString(format) + "kN" : value.ToString(format);
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToForce");
-                return "ERR";
-            }
-        }
-
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as a speed.
-        /// </summary>
-        public static string ToSpeed(this double value, bool showNotation = true)
-        {
-            try
-            {
-                return showNotation ? value.ToString("N2") + "m/s" : value.ToString("N2");
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToSpeed");
-                return "ERR";
-            }
+        #region Methods: public
+
+        public static double ClampTo(this double value, double min, double max)
+        {
+            while (value < min)
+            {
+                value += max;
+            }
+
+            while (value > max)
+            {
+                value -= max;
+            }
+
+            return value;
         }
 
         /// <summary>
@@ -105,6 +56,22 @@
             catch (Exception ex)
             {
                 Logger.Exception(ex);
+                return "ERR";
+            }
+        }
+
+        /// <summary>
+        ///     Convert to ReadoutCategory formatted as an angle.
+        /// </summary>
+        public static string ToAngle(this double value, string format = "F3")
+        {
+            try
+            {
+                return value.ToString(format) + "°";
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DoubleExtentions->ToAngle");
                 return "ERR";
             }
         }
@@ -169,6 +136,56 @@
         }
 
         /// <summary>
+        ///     Convert to a single precision floating point number.
+        /// </summary>
+        public static float ToFloat(this double value)
+        {
+            try
+            {
+                return (float)value;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DoubleExtentions->ToFloat");
+                return 0;
+            }
+        }
+
+        /// <summary>
+        ///     Convert to ReadoutCategory formatted as a force.
+        /// </summary>
+        public static string ToForce(this double value, bool showNotation = true)
+        {
+            try
+            {
+                var format = (value < 100000) ? (value < 10000) ? (value < 100) ? "N3" : "N2" : "N1" : "N0";
+                return showNotation ? value.ToString(format) + "kN" : value.ToString(format);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DoubleExtentions->ToForce");
+                return "ERR";
+            }
+        }
+
+        /// <summary>
+        ///     Convert to a ReadoutCategory formatted as a mass.
+        /// </summary>
+        public static string ToMass(this double value, bool showNotation = true)
+        {
+            try
+            {
+                value *= 1000;
+                return showNotation ? value.ToString("N0") + "kg" : value.ToString("N0");
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DoubleExtentions->ToMass");
+                return "ERR";
+            }
+        }
+
+        /// <summary>
         ///     Convert to ReadoutCategory formatted as a rate.
         /// </summary>
         public static string ToRate(this double value)
@@ -185,104 +202,21 @@
         }
 
         /// <summary>
-        ///     Convert to ReadoutCategory formatted as an angle.
-        /// </summary>
-        public static string ToAngle(this double value, string format = "F3")
-        {
-            try
-            {
-                return value.ToString(format) + "°";
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToAngle");
-                return "ERR";
-            }
-        }
-
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as a time.
-        /// </summary>
-        public static string ToTime(this double value, string format = "F1")
-        {
-            try
-            {
-                var s = value;
-                var m = 0;
-                var h = 0;
-                var d = 0;
-                var y = 0;
-
-                // Years
-                while (s >= 31536000)
-                {
-                    y++;
-                    s -= 31536000;
-                }
-
-                // Days
-                while (s >= 86400)
-                {
-                    d++;
-                    s -= 86400;
-                }
-
-                // Hours
-                while (s >= 3600)
-                {
-                    h++;
-                    s -= 3600;
-                }
-
-                // Minutes
-                while (s >= 60)
-                {
-                    m++;
-                    s -= 60;
-                }
-
-                if (y > 0)
-                {
-                    return y + "y " + d + "d " + h + "h " + m + "m " + s.ToString(format) + "s";
-                }
-
-                if (d > 0)
-                {
-                    return d + "d " + h + "h " + m + "m " + s.ToString(format) + "s";
-                }
-
-                if (h > 0)
-                {
-                    return h + "h " + m + "m " + s.ToString(format) + "s";
-                }
-
-                if (m > 0)
-                {
-                    return m + "m " + s.ToString(format) + "s";
-                }
-
-                return s.ToString(format) + "s";
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToTime");
-                return "ERR";
-            }
-        }
-
-        public static double ClampTo(this double value, double min, double max)
-        {
-            while (value < min)
-            {
-                value += max;
-            }
-
-            while (value > max)
-            {
-                value -= max;
-            }
-
-            return value;
-        }
+        ///     Convert to ReadoutCategory formatted as a speed.
+        /// </summary>
+        public static string ToSpeed(this double value, bool showNotation = true)
+        {
+            try
+            {
+                return showNotation ? value.ToString("N2") + "m/s" : value.ToString("N2");
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DoubleExtentions->ToSpeed");
+                return "ERR";
+            }
+        }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Extensions/FloatExtensions.cs
+++ b/KerbalEngineer/Extensions/FloatExtensions.cs
@@ -17,77 +17,17 @@
 //     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 // 
 
+#region Using Directives
+
 using System;
+
+#endregion
 
 namespace KerbalEngineer.Extensions
 {
     public static class FloatExtensions
     {
-        /// <summary>
-        ///     Convert to a double precision floating point number.
-        /// </summary>
-        public static double ToDouble(this float value)
-        {
-            try
-            {
-                return value;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FloatExtentions->ToDouble");
-                return 0;
-            }
-        }
-
-        /// <summary>
-        ///     Convert to a ReadoutCategory formatted as a mass.
-        /// </summary>
-        public static string ToMass(this float value, bool showNotation = true)
-        {
-            try
-            {
-                value *= 1000;
-                return showNotation ? value.ToString("N0") + "kg" : value.ToString("N0");
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FloatExtentions->ToMass");
-                return "ERR";
-            }
-        }
-
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as a force.
-        /// </summary>
-        public static string ToForce(this float value, bool showNotation = true)
-        {
-            try
-            {
-                var format = (value < 100000) ? (value < 10000) ? (value < 100) ? "N3" : "N2" : "N1" : "N0";
-                return showNotation ? value.ToString(format) + "kN" : value.ToString(format);
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FloatExtentions->ToForce");
-                return "ERR";
-            }
-        }
-
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as a speed.
-        /// </summary>
-        public static string ToSpeed(this float value, bool showNotation = true)
-        {
-            try
-            {
-                return showNotation ? value.ToString("N2") + "m/s" : value.ToString("N2");
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FloatExtentions->ToSpeed");
-                return "ERR";
-            }
-        }
+        #region Methods: public
 
         /// <summary>
         ///     Convert to ReadoutCategory formatted as acceleration.
@@ -101,6 +41,22 @@
             catch (Exception ex)
             {
                 Logger.Exception(ex);
+                return "ERR";
+            }
+        }
+
+        /// <summary>
+        ///     Convert to ReadoutCategory formatted as an angle.
+        /// </summary>
+        public static string ToAngle(this float value, string format = "F3")
+        {
+            try
+            {
+                return value.ToString(format) + "°";
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "FloatExtentions->ToAngle");
                 return "ERR";
             }
         }
@@ -165,6 +121,56 @@
         }
 
         /// <summary>
+        ///     Convert to a double precision floating point number.
+        /// </summary>
+        public static double ToDouble(this float value)
+        {
+            try
+            {
+                return value;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "FloatExtentions->ToDouble");
+                return 0;
+            }
+        }
+
+        /// <summary>
+        ///     Convert to ReadoutCategory formatted as a force.
+        /// </summary>
+        public static string ToForce(this float value, bool showNotation = true)
+        {
+            try
+            {
+                var format = (value < 100000) ? (value < 10000) ? (value < 100) ? "N3" : "N2" : "N1" : "N0";
+                return showNotation ? value.ToString(format) + "kN" : value.ToString(format);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "FloatExtentions->ToForce");
+                return "ERR";
+            }
+        }
+
+        /// <summary>
+        ///     Convert to a ReadoutCategory formatted as a mass.
+        /// </summary>
+        public static string ToMass(this float value, bool showNotation = true)
+        {
+            try
+            {
+                value *= 1000;
+                return showNotation ? value.ToString("N0") + "kg" : value.ToString("N0");
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "FloatExtentions->ToMass");
+                return "ERR";
+            }
+        }
+
+        /// <summary>
         ///     Convert to ReadoutCategory formatted as a rate.
         /// </summary>
         public static string ToRate(this float value)
@@ -181,89 +187,21 @@
         }
 
         /// <summary>
-        ///     Convert to ReadoutCategory formatted as an angle.
-        /// </summary>
-        public static string ToAngle(this float value, string format = "F3")
-        {
-            try
-            {
-                return value.ToString(format) + "°";
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FloatExtentions->ToAngle");
-                return "ERR";
-            }
-        }
-
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as a time.
-        /// </summary>
-        public static string ToTime(this float value, string format = "F1")
-        {
-            try
-            {
-                var s = value;
-                var m = 0;
-                var h = 0;
-                var d = 0;
-                var y = 0;
-
-                // Years
-                while (s >= 31536000)
-                {
-                    y++;
-                    s -= 31536000;
-                }
-
-                // Days
-                while (s >= 86400)
-                {
-                    d++;
-                    s -= 86400;
-                }
-
-                // Hours
-                while (s >= 3600)
-                {
-                    h++;
-                    s -= 3600;
-                }
-
-                // Minutes
-                while (s >= 60)
-                {
-                    m++;
-                    s -= 60;
-                }
-
-                if (y > 0)
-                {
-                    return y + "y " + d + "d " + h + "h " + m + "m " + s.ToString(format) + "s";
-                }
-
-                if (d > 0)
-                {
-                    return d + "d " + h + "h " + m + "m " + s.ToString(format) + "s";
-                }
-
-                if (h > 0)
-                {
-                    return h + "h " + m + "m " + s.ToString(format) + "s";
-                }
-
-                if (m > 0)
-                {
-                    return m + "m " + s.ToString(format) + "s";
-                }
-
-                return s.ToString(format) + "s";
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FloatExtensions->ToTime");
-                return "ERR";
-            }
-        }
+        ///     Convert to ReadoutCategory formatted as a speed.
+        /// </summary>
+        public static string ToSpeed(this float value, bool showNotation = true)
+        {
+            try
+            {
+                return showNotation ? value.ToString("N2") + "m/s" : value.ToString("N2");
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "FloatExtentions->ToSpeed");
+                return "ERR";
+            }
+        }
+
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Miscellaneous/TimeReference.cs
@@ -1,1 +1,65 @@
+// 
+//     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/>.
+// 
 
+#region Using Directives
+
+using System;
+
+using KerbalEngineer.Helpers;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Miscellaneous
+{
+    public class TimeReference : ReadoutModule
+    {
+        #region Constructors
+
+        public TimeReference()
+        {
+            this.Name = "Time Reference Adjuster";
+            this.Category = ReadoutCategory.GetCategory("Miscellaneous");
+            this.HelpString = String.Empty;
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw()
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("Time Ref.: " + TimeFormatter.Reference, this.NameStyle);
+            if (GUILayout.Button("Earth", this.ButtonStyle))
+            {
+                TimeFormatter.SetReference();
+            }
+            if (GUILayout.Button("Kerbin", this.ButtonStyle))
+            {
+                TimeFormatter.SetReference(PSystemManager.Instance.localBodies.Find(body => body.bodyName.Equals("Kerbin")));
+            }
+            GUILayout.EndHorizontal();
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Orbital/OrbitalPeriod.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/OrbitalPeriod.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -27,6 +27,8 @@
 {
     public class OrbitalPeriod : ReadoutModule
     {
+        #region Constructors
+
         public OrbitalPeriod()
         {
             this.Name = "Orbital Period";
@@ -35,9 +37,15 @@
             this.IsDefault = true;
         }
 
+        #endregion
+
+        #region Methods: public
+
         public override void Draw()
         {
-            this.DrawLine(FlightGlobals.ship_orbit.period.ToTime("F3"));
+            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ship_orbit.period, "F3"));
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/TimeToApoapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/TimeToApoapsis.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -27,6 +27,8 @@
 {
     public class TimeToApoapsis : ReadoutModule
     {
+        #region Constructors
+
         public TimeToApoapsis()
         {
             this.Name = "Time to Apoapsis";
@@ -35,9 +37,15 @@
             this.IsDefault = true;
         }
 
+        #endregion
+
+        #region Methods: public
+
         public override void Draw()
         {
-            this.DrawLine(FlightGlobals.ship_orbit.timeToAp.ToTime());
+            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ship_orbit.timeToAp));
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/TimeToEquatorialAscendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/TimeToEquatorialAscendingNode.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -27,6 +28,8 @@
 {
     public class TimeToEquatorialAscendingNode : ReadoutModule
     {
+        #region Constructors
+
         public TimeToEquatorialAscendingNode()
         {
             this.Name = "Time to Equ. AN";
@@ -35,9 +38,15 @@
             this.IsDefault = true;
         }
 
+        #endregion
+
+        #region Methods: public
+
         public override void Draw()
         {
-            this.DrawLine(FlightGlobals.ActiveVessel.orbit.GetTimeToAscendingNode().ToTime());
+            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ActiveVessel.orbit.GetTimeToAscendingNode()));
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/TimeToEquatorialDescendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/TimeToEquatorialDescendingNode.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -27,6 +28,8 @@
 {
     public class TimeToEquatorialDescendingNode : ReadoutModule
     {
+        #region Constructors
+
         public TimeToEquatorialDescendingNode()
         {
             this.Name = "Time to Equ. DN";
@@ -35,9 +38,15 @@
             this.IsDefault = true;
         }
 
+        #endregion
+
+        #region Methods: public
+
         public override void Draw()
         {
-            this.DrawLine(FlightGlobals.ActiveVessel.orbit.GetTimeToDescendingNode().ToTime());
+            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ActiveVessel.orbit.GetTimeToDescendingNode()));
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/TimeToPeriapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/TimeToPeriapsis.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -27,6 +27,8 @@
 {
     public class TimeToPeriapsis : ReadoutModule
     {
+        #region Constructors
+
         public TimeToPeriapsis()
         {
             this.Name = "Time to Periapsis";
@@ -35,9 +37,15 @@
             this.IsDefault = true;
         }
 
+        #endregion
+
+        #region Methods: public
+
         public override void Draw()
         {
-            this.DrawLine(FlightGlobals.ship_orbit.timeToPe.ToTime());
+            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ship_orbit.timeToPe));
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs
+++ b/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs
@@ -134,6 +134,7 @@
                 // Misc
                 readouts.Add(new Separator());
                 readouts.Add(new GuiSizeAdjustor());
+                readouts.Add(new TimeReference());
 
                 LoadHelpStrings();
             }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/OrbitalPeriod.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/OrbitalPeriod.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -45,7 +45,7 @@
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.OrbitalPeriod.ToTime("F3"));
+                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.OrbitalPeriod, "F3"));
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToApoapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToApoapsis.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -45,7 +45,7 @@
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.TimeToApoapsis.ToTime());
+                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.TimeToApoapsis));
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToPeriapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToPeriapsis.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -45,7 +45,7 @@
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.TimeToPeriapsis.ToTime());
+                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.TimeToPeriapsis));
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToRelativeAscendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToRelativeAscendingNode.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -45,7 +45,7 @@
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.TimeToAscendingNode.ToTime());
+                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.TimeToAscendingNode));
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToRelativeDescendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToRelativeDescendingNode.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -45,7 +45,7 @@
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.TimeToDescendingNode.ToTime());
+                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.TimeToDescendingNode));
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Surface/ImpactTime.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/ImpactTime.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -45,7 +45,7 @@
         {
             if (ImpactProcessor.ShowDetails)
             {
-                this.DrawLine(ImpactProcessor.Time.ToTime());
+                this.DrawLine(TimeFormatter.ConvertToString(ImpactProcessor.Time));
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Vessel/DeltaVStaged.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/DeltaVStaged.cs
@@ -19,19 +19,22 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
-using KerbalEngineer.VesselSimulator;
+using KerbalEngineer.Helpers;
 
 #endregion
-
-
 
 namespace KerbalEngineer.Flight.Readouts.Vessel
 {
     public class DeltaVStaged : ReadoutModule
     {
+        #region Fields
+
         private int numberOfStages;
         private bool showing;
+
+        #endregion
+
+        #region Constructors
 
         public DeltaVStaged()
         {
@@ -41,10 +44,9 @@
             this.IsDefault = true;
         }
 
-        public override void Update()
-        {
-            SimulationProcessor.RequestUpdate();
-        }
+        #endregion
+
+        #region Methods: public
 
         public override void Draw()
         {
@@ -56,7 +58,7 @@
                 {
                     if (stage.deltaV > 0 || stage.number == Staging.CurrentStage)
                     {
-                        this.DrawLine("DeltaV (S" + stage.number + ")", stage.deltaV.ToString("N0") + "m/s (" + stage.time.ToTime() + ")");
+                        this.DrawLine("DeltaV (S" + stage.number + ")", stage.deltaV.ToString("N0") + "m/s (" + TimeFormatter.ConvertToString(stage.time) + ")");
                         newNumberOfStages++;
                     }
                 }
@@ -78,5 +80,12 @@
         {
             FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
         }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Vessel/DeltaVTotal.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/DeltaVTotal.cs
@@ -17,10 +17,9 @@
 //     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 // 
 
-#region
+#region Using Directives
 
-using KerbalEngineer.Extensions;
-using KerbalEngineer.VesselSimulator;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -28,7 +27,13 @@
 {
     public class DeltaVTotal : ReadoutModule
     {
+        #region Fields
+
         private bool showing;
+
+        #endregion
+
+        #region Constructors
 
         public DeltaVTotal()
         {
@@ -38,27 +43,34 @@
             this.IsDefault = true;
         }
 
-        public override void Update()
-        {
-            SimulationProcessor.RequestUpdate();
-        }
+        #endregion
+
+        #region Methods: public
 
         public override void Draw()
         {
             if (SimulationProcessor.ShowDetails)
             {
                 this.showing = true;
-                this.DrawLine(SimulationProcessor.LastStage.totalDeltaV.ToString("N0") + "m/s (" + SimulationProcessor.LastStage.totalTime.ToTime() + ")");
-            } else if (this.showing)
+                this.DrawLine(SimulationProcessor.LastStage.totalDeltaV.ToString("N0") + "m/s (" + TimeFormatter.ConvertToString(SimulationProcessor.LastStage.totalTime) + ")");
+            }
+            else if (this.showing)
             {
                 this.showing = false;
                 this.ResizeRequested = true;
-            }   
+            }
         }
 
         public override void Reset()
         {
             FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
         }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Helpers/TimeFormatter.cs
@@ -1,1 +1,163 @@
+// 
+//     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/>.
+// 
 
+#region Using Directives
+
+using System;
+
+using KerbalEngineer.Settings;
+
+#endregion
+
+namespace KerbalEngineer.Helpers
+{
+    public static class TimeFormatter
+    {
+        #region Constructors
+
+        static TimeFormatter()
+        {
+            SetReference(false);
+            Load();
+        }
+
+        #endregion
+
+        #region Properties
+
+        public static string Reference { get; set; }
+
+        public static double SecondsPerDay { get; set; }
+
+        public static double SecondsPerHour { get; set; }
+
+        public static double SecondsPerMinute { get; set; }
+
+        public static double SecondsPerYear { get; set; }
+
+        #endregion
+
+        #region Methods: public
+
+        public static string ConvertToString(double seconds, string format = "F1")
+        {
+            var years = 0;
+            while (seconds >= SecondsPerYear)
+            {
+                years++;
+                seconds -= SecondsPerYear;
+            }
+
+            var days = 0;
+            while (seconds >= SecondsPerDay)
+            {
+                days++;
+                seconds -= SecondsPerDay;
+            }
+
+            var hours = 0;
+            while (seconds >= SecondsPerHour)
+            {
+                hours++;
+                seconds -= SecondsPerHour;
+            }
+
+            var minutes = 0;
+            while (seconds >= SecondsPerMinute)
+            {
+                minutes++;
+                seconds -= SecondsPerMinute;
+            }
+
+            if (years > 0)
+            {
+                return String.Format("{0}y {1}d {2}h {3}m {4}s", years, days, hours, minutes, seconds.ToString(format));
+            }
+            if (days > 0)
+            {
+                return String.Format("{0}d {1}h {2}m {3}s", days, hours, minutes, seconds.ToString(format));
+            }
+            if (hours > 0)
+            {
+                return String.Format("{0}h {1}m {2}s", hours, minutes, seconds.ToString(format));
+            }
+
+            return minutes > 0 ? String.Format("{0}m {1}s", minutes, seconds.ToString(format)) : String.Format("{0}s", seconds.ToString(format));
+        }
+
+        public static void Load()
+        {
+            var handler = SettingHandler.Load("TimeFormatter.xml");
+            SecondsPerMinute = handler.Get("SecondsPerMinute", SecondsPerMinute);
+            SecondsPerHour = handler.Get("SecondsPerHour", SecondsPerHour);
+            SecondsPerDay = handler.Get("SecondsPerDay", SecondsPerDay);
+            SecondsPerYear = handler.Get("SecondsPerYear", SecondsPerYear);
+            Reference = handler.Get("Reference", Reference);
+        }
+
+        public static void Save()
+        {
+            var handler = SettingHandler.Load("TimeFormatter.xml");
+            handler.Set("SecondsPerMinute", SecondsPerMinute);
+            handler.Set("SecondsPerHour", SecondsPerHour);
+            handler.Set("SecondsPerDay", SecondsPerDay);
+            handler.Set("SecondsPerYear", SecondsPerYear);
+            handler.Set("Reference", Reference);
+            handler.Save("TimeFormatter.xml");
+        }
+
+        public static void SetReference(bool save = true)
+        {
+            const double minute = 60.0;
+            const double hour = minute * 60.0;
+            const double day = hour * 24.0;
+            const double year = day * 365.0;
+            SetReference(minute, hour, day, year, "Earth", save);
+        }
+
+        public static void SetReference(CelestialBody body, bool save = true)
+        {
+            SetReference(SecondsPerMinute, SecondsPerHour, body.rotationPeriod, body.orbit.period, body.bodyName, save);
+        }
+
+        public static void SetReference(double minute, double hour, double day, double year, string reference, bool save = true)
+        {
+            SecondsPerMinute = minute;
+            SecondsPerHour = hour;
+            SecondsPerDay = day;
+            SecondsPerYear = year;
+            Reference = reference;
+
+            if (save)
+            {
+                Save();
+            }
+        }
+
+        public new static string ToString()
+        {
+            return String.Format("SecondsPerMinute: {0}", SecondsPerMinute) + Environment.NewLine +
+                   String.Format("SecondsPerHour: {0}", SecondsPerHour) + Environment.NewLine +
+                   String.Format("SecondsPerDay: {0}", SecondsPerDay) + Environment.NewLine +
+                   String.Format("SecondsPerYear: {0}", SecondsPerYear) + Environment.NewLine;
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/KerbalEngineer.csproj
+++ b/KerbalEngineer/KerbalEngineer.csproj
@@ -64,6 +64,7 @@
     <Compile Include="Flight\ActionMenuGui.cs" />
     <Compile Include="Flight\FlightEngineerPartless.cs" />
     <Compile Include="Flight\Presets\Preset.cs" />
+    <Compile Include="Flight\Readouts\Miscellaneous\TimeReference.cs" />
     <Compile Include="Flight\Readouts\Miscellaneous\Separator.cs" />
     <Compile Include="Flight\Readouts\Miscellaneous\GuiSizeAdjustor.cs" />
     <Compile Include="Flight\Readouts\Orbital\AngleToEquatorialDescendingNode.cs" />
@@ -84,6 +85,7 @@
     <Compile Include="Flight\Readouts\Vessel\Acceleration.cs" />
     <Compile Include="Flight\Presets\PresetLibrary.cs" />
     <Compile Include="GuiDisplaySize.cs" />
+    <Compile Include="Helpers\TimeFormatter.cs" />
     <Compile Include="UIControls\DropDown.cs" />
     <Compile Include="Logger.cs" />
     <Compile Include="EngineerGlobals.cs" />

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