Update unit helpers.
Update unit helpers.

--- a/KerbalEngineer/Editor/BuildOverlay.cs
+++ b/KerbalEngineer/Editor/BuildOverlay.cs
@@ -35,49 +35,31 @@
     [KSPAddon(KSPAddon.Startup.EditorAny, false)]
     public class BuildOverlay : MonoBehaviour
     {
-        #region Instance
+        #region Fields
+
+        private readonly Stopwatch tooltipInfoTimer = new Stopwatch();
+        private GUIStyle infoStyle;
+        private Stage lastStage;
+
+        private Part selectedPart;
+        private GUIStyle titleStyle;
+        private float tooltipInfoDelay = 0.5f;
+        private GUIStyle tooltipInfoStyle;
+        private GUIStyle tooltipTitleStyle;
+        private bool visible = true;
+        private int windowId;
+        private Rect windowPosition = new Rect(300.0f, 0, 0, 0);
+        private GUIStyle windowStyle;
+
+        #endregion
+
+        #region Properties
 
         /// <summary>
         ///     Gets the current instance if started or returns null.
         /// </summary>
         public static BuildOverlay Instance { get; private set; }
 
-        #endregion
-
-        #region Fields
-
-        private readonly Stopwatch tooltipInfoTimer = new Stopwatch();
-        private Stage lastStage;
-
-        private Part selectedPart;
-        private int windowId;
-        private Rect windowPosition = new Rect(300.0f, 0, 0, 0);
-
-        #endregion
-
-        #region Constructors
-
-        private void Awake()
-        {
-            Instance = this;
-            GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
-        }
-
-        private void Start()
-        {
-            this.windowId = this.GetHashCode();
-            this.InitialiseStyles();
-            this.Load();
-            RenderingManager.AddToPostDrawQueue(0, this.OnDraw);
-        }
-
-        #endregion
-
-        #region Properties
-
-        private float tooltipInfoDelay = 0.5f;
-        private bool visible = true;
-
         public float TooltipInfoDelay
         {
             get { return this.tooltipInfoDelay; }
@@ -90,120 +72,43 @@
         public bool Visible
         {
             get { return this.visible; }
-            set
-            {
-                this.visible = value;
-                Logger.Log("BuildOverlay->Visible = " + value);
-            }
+            set { this.visible = value; }
         }
 
         #endregion
 
-        #region GUIStyles
-
-        private GUIStyle infoStyle;
-        private GUIStyle titleStyle;
-        private GUIStyle tooltipInfoStyle;
-        private GUIStyle tooltipTitleStyle;
-        private GUIStyle windowStyle;
-
-        private void InitialiseStyles()
-        {
-            try
-            {
-                this.windowStyle = new GUIStyle(GUIStyle.none)
-                {
-                    margin = new RectOffset(),
-                    padding = new RectOffset()
-                };
-
-                this.titleStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    normal =
-                    {
-                        textColor = Color.white
-                    },
-                    margin = new RectOffset(),
-                    padding = new RectOffset(),
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    stretchWidth = true
-                };
-
-                this.infoStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    margin = new RectOffset(),
-                    padding = new RectOffset(),
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    stretchWidth = true
-                };
-
-                this.tooltipTitleStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    normal =
-                    {
-                        textColor = Color.white
-                    },
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    stretchWidth = true
-                };
-
-                this.tooltipInfoStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    stretchWidth = true
-                };
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildOverlay->InitialiseStyles");
-            }
-        }
-
-        private void OnSizeChanged()
-        {
-            this.InitialiseStyles();
-            this.windowPosition.width = 0;
-            this.windowPosition.height = 0;
-        }
-
-        #endregion
-
-        #region Update and Drawing
-
-        private void Update()
-        {
-            try
-            {
-                if (!this.visible || BuildAdvanced.Instance == null || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0 || EditorLogic.fetch.editorScreen != EditorLogic.EditorScreen.Parts)
-                {
-                    return;
-                }
-
-                // Configure the simulation parameters based on the selected reference body.
-                SimManager.Gravity = CelestialBodies.SelectedBody.Gravity;
-
-                if (BuildAdvanced.Instance.ShowAtmosphericDetails)
-                {
-                    SimManager.Atmosphere = CelestialBodies.SelectedBody.Atmosphere * 0.01d;
-                }
-                else
-                {
-                    SimManager.Atmosphere = 0;
-                }
-
-                SimManager.TryStartSimulation();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildOverlay->Update");
-            }
-        }
-
-        private void OnDraw()
+        #region Methods: protected
+
+        protected void Awake()
+        {
+            try
+            {
+                Instance = this;
+                GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        /// <summary>
+        ///     Saves the settings when this object is destroyed.
+        /// </summary>
+        protected void OnDestroy()
+        {
+            try
+            {
+                this.Save();
+                GuiDisplaySize.OnSizeChanged -= this.OnSizeChanged;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void OnGUI()
         {
             try
             {
@@ -276,8 +181,270 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "BuildOverlay->OnDraw");
-            }
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Start()
+        {
+            try
+            {
+                this.windowId = this.GetHashCode();
+                this.InitialiseStyles();
+                this.Load();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Update()
+        {
+            try
+            {
+                if (!this.visible || BuildAdvanced.Instance == null || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0 || EditorLogic.fetch.editorScreen != EditorLogic.EditorScreen.Parts)
+                {
+                    return;
+                }
+
+                // Configure the simulation parameters based on the selected reference body.
+                SimManager.Gravity = CelestialBodies.SelectedBody.Gravity;
+
+                if (BuildAdvanced.Instance.ShowAtmosphericDetails)
+                {
+                    SimManager.Atmosphere = CelestialBodies.SelectedBody.Atmosphere * 0.01d;
+                }
+                else
+                {
+                    SimManager.Atmosphere = 0;
+                }
+
+                SimManager.TryStartSimulation();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Methods: private
+
+        /// <summary>
+        ///     Draws the tooltip details of the selected/highlighted part.
+        /// </summary>
+        private void DrawTooltip(Part part)
+        {
+            // Tooltip title (name of part).
+            var content = new GUIContent(part.partInfo.title);
+            var size = this.tooltipTitleStyle.CalcSize(content);
+            var position = new Rect(Event.current.mousePosition.x + 16.0f, Event.current.mousePosition.y, size.x, size.y).ClampInsideScreen();
+
+            if (position.x < Event.current.mousePosition.x + 16.0f)
+            {
+                position.y += 16.0f;
+            }
+            GUI.Label(position, content, this.tooltipTitleStyle);
+
+            // After hovering for a period of time, show extended information.
+            if (this.tooltipInfoTimer.Elapsed.TotalSeconds >= this.tooltipInfoDelay)
+            {
+                // Stop the timer as it is no longer needed.
+                if (this.tooltipInfoTimer.IsRunning)
+                {
+                    this.tooltipInfoTimer.Stop();
+                }
+
+                // Show the dry mass of the part if applicable.
+                if (part.physicalSignificance == Part.PhysicalSignificance.FULL)
+                {
+                    this.DrawTooltipInfo(ref position, "Dry Mass: " + part.GetDryMass().ToMass());
+                }
+
+                // Show resources contained within the part.
+                if (part.ContainsResources())
+                {
+                    // Show the wet mass of the part if applicable.
+                    if (part.GetResourceMass() > 0)
+                    {
+                        this.DrawTooltipInfo(ref position, "Wet Mass: " + part.GetWetMass().ToMass());
+                    }
+
+                    // List all the resources contained within the part.
+                    foreach (PartResource resource in part.Resources)
+                    {
+                        if (resource.GetDensity() > 0)
+                        {
+                            this.DrawTooltipInfo(ref position, resource.info.name + ": " + resource.GetMass().ToMass() + " (" + resource.amount + ")");
+                        }
+                        else
+                        {
+                            this.DrawTooltipInfo(ref position, resource.info.name + ": " + resource.amount);
+                        }
+                    }
+                }
+
+                // Show details for engines.
+                if (part.IsEngine())
+                {
+                    this.DrawTooltipInfo(ref position, "Maximum Thrust: " + part.GetMaxThrust().ToForce());
+                    this.DrawTooltipInfo(ref position, "Specific Impulse: " + part.GetSpecificImpulse(1f) + " / " + part.GetSpecificImpulse(0f) + "s");
+
+                    // Thrust vectoring.
+                    if (part.HasModule("ModuleGimbal"))
+                    {
+                        this.DrawTooltipInfo(ref position, "Thrust Vectoring Enabled");
+                    }
+
+                    // Contains alternator.
+                    if (part.HasModule("ModuleAlternator"))
+                    {
+                        this.DrawTooltipInfo(ref position, "Contains Alternator");
+                    }
+                }
+
+                // Show details for RCS.
+                if (part.IsRcsModule())
+                {
+                    var moduleRcs = part.GetModuleRcs();
+                    this.DrawTooltipInfo(ref position, "Thrust Power: " + moduleRcs.thrusterPower.ToForce());
+                    this.DrawTooltipInfo(ref position, "Specific Impulse: " + moduleRcs.atmosphereCurve.Evaluate(1f) + " / " + moduleRcs.atmosphereCurve.Evaluate(0f) + "s");
+                }
+
+                // Show details for solar panels.
+                if (part.IsSolarPanel())
+                {
+                    this.DrawTooltipInfo(ref position, "Charge Rate: " + part.GetModuleDeployableSolarPanel().chargeRate.ToRate());
+                }
+
+                // Show details for generators.
+                if (part.IsGenerator())
+                {
+                    foreach (var resource in part.GetModuleGenerator().inputList)
+                    {
+                        this.DrawTooltipInfo(ref position, "Input: " + resource.name + " (" + resource.rate.ToRate() + ")");
+                    }
+
+                    foreach (var resource in part.GetModuleGenerator().outputList)
+                    {
+                        this.DrawTooltipInfo(ref position, "Output: " + resource.name + " (" + resource.rate.ToRate() + ")");
+                    }
+                }
+
+                // Show details for parachutes.
+                if (part.IsParachute())
+                {
+                    var module = part.GetModuleParachute();
+                    this.DrawTooltipInfo(ref position, "Semi Deployed Drag: " + module.semiDeployedDrag);
+                    this.DrawTooltipInfo(ref position, "Fully Deployed Drag: " + module.fullyDeployedDrag);
+                    this.DrawTooltipInfo(ref position, "Deployment Altitude: " + module.deployAltitude.ToDistance());
+                }
+
+                // Contains stability augmentation system.
+                if (part.HasModule("ModuleSAS"))
+                {
+                    this.DrawTooltipInfo(ref position, "Contains SAS");
+                }
+
+                // Contains reaction wheels.
+                if (part.HasModule("ModuleReactionWheel"))
+                {
+                    this.DrawTooltipInfo(ref position, "Contains Reaction Wheels");
+                }
+
+                // Show if the part has an animation that can only be used once.
+                if (part.HasOneShotAnimation())
+                {
+                    this.DrawTooltipInfo(ref position, "Single Activation Only");
+                }
+            }
+        }
+
+        /// <summary>
+        ///     Draws a line of extended information below the previous.
+        /// </summary>
+        private void DrawTooltipInfo(ref Rect position, string value)
+        {
+            var content = new GUIContent(value);
+            var size = this.tooltipInfoStyle.CalcSize(content);
+
+            position.y += 16.0f * GuiDisplaySize.Offset;
+            position.width = size.x;
+            position.height = size.y;
+            GUI.Label(position, content, this.tooltipInfoStyle);
+        }
+
+        private void InitialiseStyles()
+        {
+            this.windowStyle = new GUIStyle(GUIStyle.none)
+            {
+                margin = new RectOffset(),
+                padding = new RectOffset()
+            };
+
+            this.titleStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                margin = new RectOffset(),
+                padding = new RectOffset(),
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                stretchWidth = true
+            };
+
+            this.infoStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                margin = new RectOffset(),
+                padding = new RectOffset(),
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                stretchWidth = true
+            };
+
+            this.tooltipTitleStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                stretchWidth = true
+            };
+
+            this.tooltipInfoStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                stretchWidth = true
+            };
+        }
+
+        private void Load()
+        {
+            var handler = SettingHandler.Load("BuildOverlay.xml");
+            handler.Get("visible", ref this.visible);
+            handler.Get("tooltipInfoDelay", ref this.tooltipInfoDelay);
+        }
+
+        private void OnSizeChanged()
+        {
+            this.InitialiseStyles();
+            this.windowPosition.width = 0;
+            this.windowPosition.height = 0;
+        }
+
+        private void Save()
+        {
+            var handler = new SettingHandler();
+            handler.Set("visible", this.visible);
+            handler.Set("tooltipInfoDelay", this.tooltipInfoDelay);
+            handler.Save("BuildOverlay.xml");
         }
 
         private void Window(int windowId)
@@ -304,205 +471,7 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "BuildOverlay->Window");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the tooltip details of the selected/highlighted part.
-        /// </summary>
-        private void DrawTooltip(Part part)
-        {
-            try
-            {
-                // Tooltip title (name of part).
-                var content = new GUIContent(part.partInfo.title);
-                var size = this.tooltipTitleStyle.CalcSize(content);
-                var position = new Rect(Event.current.mousePosition.x + 16.0f, Event.current.mousePosition.y, size.x, size.y).ClampInsideScreen();
-
-                if (position.x < Event.current.mousePosition.x + 16.0f)
-                {
-                    position.y += 16.0f;
-                }
-                GUI.Label(position, content, this.tooltipTitleStyle);
-
-                // After hovering for a period of time, show extended information.
-                if (this.tooltipInfoTimer.Elapsed.TotalSeconds >= this.tooltipInfoDelay)
-                {
-                    // Stop the timer as it is no longer needed.
-                    if (this.tooltipInfoTimer.IsRunning)
-                    {
-                        this.tooltipInfoTimer.Stop();
-                    }
-
-                    // Show the dry mass of the part if applicable.
-                    if (part.physicalSignificance == Part.PhysicalSignificance.FULL)
-                    {
-                        this.DrawTooltipInfo(ref position, "Dry Mass: " + part.GetDryMass().ToMass());
-                    }
-
-                    // Show resources contained within the part.
-                    if (part.ContainsResources())
-                    {
-                        // Show the wet mass of the part if applicable.
-                        if (part.GetResourceMass() > 0)
-                        {
-                            this.DrawTooltipInfo(ref position, "Wet Mass: " + part.GetWetMass().ToMass());
-                        }
-
-                        // List all the resources contained within the part.
-                        foreach (PartResource resource in part.Resources)
-                        {
-                            if (resource.GetDensity() > 0)
-                            {
-                                this.DrawTooltipInfo(ref position, resource.info.name + ": " + resource.GetMass().ToMass() + " (" + resource.amount + ")");
-                            }
-                            else
-                            {
-                                this.DrawTooltipInfo(ref position, resource.info.name + ": " + resource.amount);
-                            }
-                        }
-                    }
-
-                    // Show details for engines.
-                    if (part.IsEngine())
-                    {
-                        this.DrawTooltipInfo(ref position, "Maximum Thrust: " + part.GetMaxThrust().ToForce());
-                        this.DrawTooltipInfo(ref position, "Specific Impulse: " + part.GetSpecificImpulse(1f) + " / " + part.GetSpecificImpulse(0f) + "s");
-
-                        // Thrust vectoring.
-                        if (part.HasModule("ModuleGimbal"))
-                        {
-                            this.DrawTooltipInfo(ref position, "Thrust Vectoring Enabled");
-                        }
-
-                        // Contains alternator.
-                        if (part.HasModule("ModuleAlternator"))
-                        {
-                            this.DrawTooltipInfo(ref position, "Contains Alternator");
-                        }
-                    }
-
-                    // Show details for RCS.
-                    if (part.IsRcsModule())
-                    {
-                        var moduleRcs = part.GetModuleRcs();
-                        this.DrawTooltipInfo(ref position, "Thrust Power: " + moduleRcs.thrusterPower.ToDouble().ToForce());
-                        this.DrawTooltipInfo(ref position, "Specific Impulse: " + moduleRcs.atmosphereCurve.Evaluate(1f) + " / " + moduleRcs.atmosphereCurve.Evaluate(0f) + "s");
-                    }
-
-                    // Show details for solar panels.
-                    if (part.IsSolarPanel())
-                    {
-                        this.DrawTooltipInfo(ref position, "Charge Rate: " + part.GetModuleDeployableSolarPanel().chargeRate.ToDouble().ToRate());
-                    }
-
-                    // Show details for generators.
-                    if (part.IsGenerator())
-                    {
-                        foreach (var resource in part.GetModuleGenerator().inputList)
-                        {
-                            this.DrawTooltipInfo(ref position, "Input: " + resource.name + " (" + resource.rate.ToDouble().ToRate() + ")");
-                        }
-
-                        foreach (var resource in part.GetModuleGenerator().outputList)
-                        {
-                            this.DrawTooltipInfo(ref position, "Output: " + resource.name + " (" + resource.rate.ToDouble().ToRate() + ")");
-                        }
-                    }
-
-                    // Show details for parachutes.
-                    if (part.IsParachute())
-                    {
-                        var module = part.GetModuleParachute();
-                        this.DrawTooltipInfo(ref position, "Semi Deployed Drag: " + module.semiDeployedDrag);
-                        this.DrawTooltipInfo(ref position, "Fully Deployed Drag: " + module.fullyDeployedDrag);
-                        this.DrawTooltipInfo(ref position, "Deployment Altitude: " + module.deployAltitude.ToDouble().ToDistance());
-                    }
-
-                    // Contains stability augmentation system.
-                    if (part.HasModule("ModuleSAS"))
-                    {
-                        this.DrawTooltipInfo(ref position, "Contains SAS");
-                    }
-
-                    // Contains reaction wheels.
-                    if (part.HasModule("ModuleReactionWheel"))
-                    {
-                        this.DrawTooltipInfo(ref position, "Contains Reaction Wheels");
-                    }
-
-                    // Show if the part has an animation that can only be used once.
-                    if (part.HasOneShotAnimation())
-                    {
-                        this.DrawTooltipInfo(ref position, "Single Activation Only");
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildOverlay->DrawTooltip");
-            }
-        }
-
-        /// <summary>
-        ///     Draws a line of extended information below the previous.
-        /// </summary>
-        private void DrawTooltipInfo(ref Rect position, string value)
-        {
-            try
-            {
-                var content = new GUIContent(value);
-                var size = this.tooltipInfoStyle.CalcSize(content);
-
-                position.y += 16.0f * GuiDisplaySize.Offset;
-                position.width = size.x;
-                position.height = size.y;
-                GUI.Label(position, content, this.tooltipInfoStyle);
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildOverlay->DrawTooltipInfo");
-            }
-        }
-
-        #endregion
-
-        #region Save and Load
-
-        /// <summary>
-        ///     Saves the settings when this object is destroyed.
-        /// </summary>
-        private void OnDestroy()
-        {
-            try
-            {
-                var handler = new SettingHandler();
-                handler.Set("visible", this.visible);
-                handler.Set("tooltipInfoDelay", this.tooltipInfoDelay);
-                handler.Save("BuildOverlay.xml");
-                GuiDisplaySize.OnSizeChanged -= this.OnSizeChanged;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildOverlay->OnDestroy");
-            }
-        }
-
-        /// <summary>
-        ///     Loads the settings when this object is created.
-        /// </summary>
-        private void Load()
-        {
-            try
-            {
-                var handler = SettingHandler.Load("BuildOverlay.xml");
-                handler.Get("visible", ref this.visible);
-                handler.Get("tooltipInfoDelay", ref this.tooltipInfoDelay);
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildOverlay->Load");
+                Logger.Exception(ex);
             }
         }
 

--- a/KerbalEngineer/Extensions/DoubleExtensions.cs
+++ b/KerbalEngineer/Extensions/DoubleExtensions.cs
@@ -19,8 +19,6 @@
 
 #region Using Directives
 
-using System;
-
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -30,21 +28,6 @@
     public static class DoubleExtensions
     {
         #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;
-        }
 
         public static string ToAcceleration(this double value)
         {
@@ -61,19 +44,6 @@
             return Units.ToDistance(value);
         }
 
-        public static float ToFloat(this double value)
-        {
-            try
-            {
-                return (float)value;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToFloat");
-                return 0;
-            }
-        }
-
         public static string ToForce(this double value)
         {
             return Units.ToForce(value);
@@ -86,15 +56,7 @@
 
         public static string ToRate(this double value)
         {
-            try
-            {
-                return value > 0 ? value.ToString("F1") + "/sec" : (60.0f * value).ToString("F1") + "/min";
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToRate");
-                return "ERR";
-            }
+            return Units.ToRate(value);
         }
 
         public static string ToSpeed(this double value)

--- a/KerbalEngineer/Extensions/FloatExtensions.cs
+++ b/KerbalEngineer/Extensions/FloatExtensions.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using System;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -29,177 +29,39 @@
     {
         #region Methods: public
 
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as acceleration.
-        /// </summary>
-        public static string ToAcceleration(this float value, bool showNotation = true)
+        public static string ToAcceleration(this float value)
         {
-            try
-            {
-                return showNotation ? value.ToString("N2") + "m/s²" : value.ToString("N2");
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-                return "ERR";
-            }
+            return Units.ToAcceleration(value);
         }
 
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as an angle.
-        /// </summary>
-        public static string ToAngle(this float value, string format = "F3")
+        public static string ToAngle(this float value)
         {
-            try
-            {
-                return value.ToString(format) + "°";
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FloatExtentions->ToAngle");
-                return "ERR";
-            }
+            return Units.ToAngle(value);
         }
 
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as a distance.
-        /// </summary>
-        public static string ToDistance(this float value, string format = "N1")
+        public static string ToDistance(this float value)
         {
-            try
-            {
-                var negative = value < 0;
-
-                if (negative)
-                {
-                    value = -value;
-                }
-
-                if (value < 1000000.0f)
-                {
-                    if (value < 1.0f)
-                    {
-                        value *= 1000.0f;
-
-                        if (negative)
-                        {
-                            value = -value;
-                        }
-                        return value.ToString(format) + "mm";
-                    }
-
-                    if (negative)
-                    {
-                        value = -value;
-                    }
-                    return value.ToString(format) + "m";
-                }
-
-                value /= 1000.0f;
-                if (value >= 1000000.0f)
-                {
-                    value /= 1000.0f;
-
-                    if (negative)
-                    {
-                        value = -value;
-                    }
-                    return value.ToString(format) + "Mm";
-                }
-
-                if (negative)
-                {
-                    value = -value;
-                }
-                return value.ToString(format) + "km";
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FloatExtentions->ToDistance");
-                return "ERR";
-            }
+            return Units.ToDistance(value);
         }
 
-        /// <summary>
-        ///     Convert to a double precision floating point number.
-        /// </summary>
-        public static double ToDouble(this float value)
+        public static string ToForce(this float value)
         {
-            try
-            {
-                return value;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FloatExtentions->ToDouble");
-                return 0;
-            }
+            return Units.ToForce(value);
         }
 
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as a force.
-        /// </summary>
-        public static string ToForce(this float value, bool showNotation = true)
+        public static string ToMass(this float value)
         {
-            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";
-            }
+            return Units.ToMass(value);
         }
 
-        /// <summary>
-        ///     Convert to a ReadoutCategory formatted as a mass.
-        /// </summary>
-        public static string ToMass(this float value, bool showNotation = true)
+        public static string ToRate(this float value)
         {
-            try
-            {
-                value *= 1000;
-                return showNotation ? value.ToString("N0") + "kg" : value.ToString("N0");
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FloatExtentions->ToMass");
-                return "ERR";
-            }
+            return Units.ToRate(value);
         }
 
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as a rate.
-        /// </summary>
-        public static string ToRate(this float value)
+        public static string ToSpeed(this float value)
         {
-            try
-            {
-                return value > 0 ? value.ToString("F1") + "/sec" : (60.0f * value).ToString("F1") + "/min";
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FloatExtentions->ToRate");
-                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";
-            }
+            return Units.ToSpeed(value);
         }
 
         #endregion

--- a/KerbalEngineer/Extensions/OrbitExtensions.cs
+++ b/KerbalEngineer/Extensions/OrbitExtensions.cs
@@ -59,7 +59,7 @@
             var angle = AngleHelper.GetAngleBetweenVectors(orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime()),
                                             Vector3d.Exclude(orbit.GetOrbitNormal(), orbit.referenceBody.orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime())));
 
-            angle = (angle + 90.0).ClampTo(0.0, 360.0);
+            angle = AngleHelper.Clamp360(angle + 90.0);
 
             return orbit.inclination <= 90.0 ? angle : 360.0 - angle;
         }
@@ -74,14 +74,14 @@
             var angle = AngleHelper.GetAngleBetweenVectors(orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime()),
                                             Vector3d.Exclude(orbit.GetOrbitNormal(), orbit.referenceBody.orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime())));
 
-            angle = (angle - 90.0).ClampTo(0.0, 360.0);
+            angle = AngleHelper.Clamp360(angle - 90.0);
 
             return orbit.inclination <= 90.0 ? angle : 360.0 - angle;
         }
 
-        public static double GetAngleToTrueAnomaly(this Orbit orbit, double tA)
+        public static double GetAngleToTrueAnomaly(this Orbit orbit, double trueAnomaly)
         {
-            return (tA - orbit.trueAnomaly).ClampTo(0.0, 360.0);
+            return AngleHelper.Clamp360(trueAnomaly - orbit.trueAnomaly);
         }
 
         public static double GetAngleToVector(this Orbit orbit, Vector3d vector)
@@ -111,9 +111,9 @@
             return GetTimeToTrueAnomaly(orbit, GetTrueAnomalyOfDescendingNode(orbit));
         }
 
-        public static double GetTimeToTrueAnomaly(this Orbit orbit, double tA)
+        public static double GetTimeToTrueAnomaly(this Orbit orbit, double trueAnomaly)
         {
-            var time = orbit.GetDTforTrueAnomaly(tA * Mathf.Deg2Rad, orbit.period);
+            var time = orbit.GetDTforTrueAnomaly(trueAnomaly * Mathf.Deg2Rad, orbit.period);
             return time < 0.0 ? time + orbit.period : time;
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/RendezvousProcessor.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/RendezvousProcessor.cs
@@ -23,8 +23,6 @@
 
 using KerbalEngineer.Extensions;
 using KerbalEngineer.Helpers;
-
-using UnityEngine;
 
 #endregion
 
@@ -102,14 +100,14 @@
         public static double RelativeInclination { get; private set; }
 
         /// <summary>
+        ///     Gets the relative orbital speed between the vessel and target.
+        /// </summary>
+        public static double RelativeSpeed { get; private set; }
+
+        /// <summary>
         ///     Gets the relative orbital velocity between the vessel and target.
         /// </summary>
         public static double RelativeVelocity { get; private set; }
-
-        /// <summary>
-        ///     Gets the relative orbital speed between the vessel and target.
-        /// </summary>
-        public static double RelativeSpeed { get; private set; }
 
         /// <summary>
         ///     Gets the semi-major axis of the target orbit.
@@ -211,7 +209,7 @@
             // Only works when going into higher orbits.  Need to figure out a way for it to work with lower orbits.
             var angle = 180.0 * (1.0 - Math.Pow((this.originOrbit.radius + this.targetOrbit.radius) / (2.0 * this.targetOrbit.radius), 1.5));
             angle = PhaseAngle - angle;
-            return RelativeInclination < 90.0 ? angle.ClampTo(0.0, 360.0) : (360.0 - (180.0 - angle)).ClampTo(0.0, 360.0);
+            return RelativeInclination < 90.0 ? AngleHelper.Clamp360(angle) : AngleHelper.Clamp360(360.0 - (180.0 - angle));
         }
 
         private Vector3d GetAscendingNode()

--- a/KerbalEngineer/Helpers/AngleHelper.cs
+++ b/KerbalEngineer/Helpers/AngleHelper.cs
@@ -29,6 +29,26 @@
     {
         #region Methods: public
 
+        public static double Clamp360(double value)
+        {
+            return ClampBetween(value, 0.0, 360.0);
+        }
+
+        public static double ClampBetween(double value, double minimum, double maximum)
+        {
+            while (value < minimum)
+            {
+                value += maximum;
+            }
+
+            while (value > maximum)
+            {
+                value -= maximum;
+            }
+
+            return value;
+        }
+
         public static double GetAngleBetweenVectors(Vector3d vector1, Vector3d vector2)
         {
             var angle = Vector3d.Angle(vector1, vector2);

--- a/KerbalEngineer/Helpers/Units.cs
+++ b/KerbalEngineer/Helpers/Units.cs
@@ -22,8 +22,6 @@
 using System;
 
 #endregion
-
-
 
 namespace KerbalEngineer.Helpers
 {
@@ -50,26 +48,29 @@
         {
             if (Math.Abs(value) < 1000000.0)
             {
-                if (Math.Abs(value) < 10.0)
+                if (Math.Abs(value) >= 10.0)
                 {
-                    value *= 100.0;
-                    if (Math.Abs(value) < 100.0)
-                    {
-                        value *= 10.0;
-                        return value.ToString("N" + decimals) + "mm";
-                    }
+                    return value.ToString("N" + decimals) + "m";
+                }
+
+                value *= 100.0;
+                if (Math.Abs(value) >= 100.0)
+                {
                     return value.ToString("N" + decimals) + "cm";
                 }
-                return value.ToString("N" + decimals) + "m";
+
+                value *= 10.0;
+                return value.ToString("N" + decimals) + "mm";
             }
 
             value /= 1000.0;
-            if (Math.Abs(value) >= 1000000.0)
+            if (Math.Abs(value) < 1000000.0)
             {
-                value /= 1000.0;
-                return value.ToString("N" + decimals) + "Mm";
+                return value.ToString("N" + decimals) + "km";
             }
-            return value.ToString("N" + decimals) + "km";
+
+            value /= 1000.0;
+            return value.ToString("N" + decimals) + "Mm";
         }
 
         public static string ToForce(double value)
@@ -96,6 +97,11 @@
             return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals) + "kg";
         }
 
+        public static string ToRate(double value, int decimals = 1)
+        {
+            return value > 0 ? value.ToString("F" + decimals) + "/sec" : (value * 60.0).ToString("F" + decimals);
+        }
+
         public static string ToSpeed(double value, int decimals = 2)
         {
             if (Math.Abs(value) < 1.0)

--- a/KerbalEngineer/KerbalEngineer.csproj
+++ b/KerbalEngineer/KerbalEngineer.csproj
@@ -60,6 +60,7 @@
     <Compile Include="Editor\BuildOverlay.cs" />
     <Compile Include="CelestialBodies.cs" />
     <Compile Include="Editor\BuildToolbar.cs" />
+    <Compile Include="Extensions\FloatExtensions.cs" />
     <Compile Include="Extensions\OrbitExtensions.cs" />
     <Compile Include="Flight\ActionMenuGui.cs" />
     <Compile Include="Flight\FlightEngineerPartless.cs" />
@@ -101,7 +102,6 @@
     <Compile Include="Logger.cs" />
     <Compile Include="EngineerGlobals.cs" />
     <Compile Include="Extensions\DoubleExtensions.cs" />
-    <Compile Include="Extensions\FloatExtensions.cs" />
     <Compile Include="Extensions\PartExtensions.cs" />
     <Compile Include="Extensions\PartResourceExtensions.cs" />
     <Compile Include="Extensions\RectExtensions.cs" />

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