Added dynamic readout categories.
Added dynamic readout categories.

--- a/KerbalEngineer/Extensions/DoubleExtensions.cs
+++ b/KerbalEngineer/Extensions/DoubleExtensions.cs
@@ -44,7 +44,7 @@
         }
 
         /// <summary>
-        ///     Convert to a string formatted as a mass.
+        ///     Convert to a ReadoutCategory formatted as a mass.
         /// </summary>
         public static string ToMass(this double value, bool showNotation = true)
         {
@@ -61,7 +61,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as a force.
+        ///     Convert to ReadoutCategory formatted as a force.
         /// </summary>
         public static string ToForce(this double value, bool showNotation = true)
         {
@@ -78,7 +78,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as a speed.
+        ///     Convert to ReadoutCategory formatted as a speed.
         /// </summary>
         public static string ToSpeed(this double value, bool showNotation = true)
         {
@@ -94,7 +94,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as acceleration.
+        ///     Convert to ReadoutCategory formatted as acceleration.
         /// </summary>
         public static string ToAcceleration(this double value, bool showNotation = true)
         {
@@ -110,7 +110,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as a distance.
+        ///     Convert to ReadoutCategory formatted as a distance.
         /// </summary>
         public static string ToDistance(this double value, string format = "N1")
         {
@@ -169,7 +169,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as a rate.
+        ///     Convert to ReadoutCategory formatted as a rate.
         /// </summary>
         public static string ToRate(this double value)
         {
@@ -185,7 +185,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as an angle.
+        ///     Convert to ReadoutCategory formatted as an angle.
         /// </summary>
         public static string ToAngle(this double value, string format = "F3")
         {
@@ -201,7 +201,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as a time.
+        ///     Convert to ReadoutCategory formatted as a time.
         /// </summary>
         public static string ToTime(this double value, string format = "F1")
         {

--- a/KerbalEngineer/Extensions/FloatExtensions.cs
+++ b/KerbalEngineer/Extensions/FloatExtensions.cs
@@ -40,7 +40,7 @@
         }
 
         /// <summary>
-        ///     Convert to a string formatted as a mass.
+        ///     Convert to a ReadoutCategory formatted as a mass.
         /// </summary>
         public static string ToMass(this float value, bool showNotation = true)
         {
@@ -57,7 +57,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as a force.
+        ///     Convert to ReadoutCategory formatted as a force.
         /// </summary>
         public static string ToForce(this float value, bool showNotation = true)
         {
@@ -74,7 +74,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as a speed.
+        ///     Convert to ReadoutCategory formatted as a speed.
         /// </summary>
         public static string ToSpeed(this float value, bool showNotation = true)
         {
@@ -90,7 +90,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as acceleration.
+        ///     Convert to ReadoutCategory formatted as acceleration.
         /// </summary>
         public static string ToAcceleration(this float value, bool showNotation = true)
         {
@@ -106,7 +106,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as a distance.
+        ///     Convert to ReadoutCategory formatted as a distance.
         /// </summary>
         public static string ToDistance(this float value, string format = "N1")
         {
@@ -165,7 +165,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as a rate.
+        ///     Convert to ReadoutCategory formatted as a rate.
         /// </summary>
         public static string ToRate(this float value)
         {
@@ -181,7 +181,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as an angle.
+        ///     Convert to ReadoutCategory formatted as an angle.
         /// </summary>
         public static string ToAngle(this float value, string format = "F3")
         {
@@ -197,7 +197,7 @@
         }
 
         /// <summary>
-        ///     Convert to string formatted as a time.
+        ///     Convert to ReadoutCategory formatted as a time.
         /// </summary>
         public static string ToTime(this float value, string format = "F1")
         {

--- a/KerbalEngineer/Flight/ActionMenuGui.cs
+++ b/KerbalEngineer/Flight/ActionMenuGui.cs
@@ -135,13 +135,13 @@
                     return;
                 }
 
-                if (this.numberOfSections < SectionLibrary.Instance.NumberOfSections)
-                {
-                    this.numberOfSections = SectionLibrary.Instance.NumberOfSections;
-                }
-                else if (this.numberOfSections > SectionLibrary.Instance.NumberOfSections)
-                {
-                    this.numberOfSections = SectionLibrary.Instance.NumberOfSections;
+                if (this.numberOfSections < SectionLibrary.NumberOfSections)
+                {
+                    this.numberOfSections = SectionLibrary.NumberOfSections;
+                }
+                else if (this.numberOfSections > SectionLibrary.NumberOfSections)
+                {
+                    this.numberOfSections = SectionLibrary.NumberOfSections;
                     this.position.height = 0;
                 }
 
@@ -166,8 +166,8 @@
 
                 this.DrawControlBarButton();
                 GUILayout.Space(5.0f);
-                this.DrawSections(SectionLibrary.Instance.StockSections);
-                this.DrawSections(SectionLibrary.Instance.CustomSections);
+                this.DrawSections(SectionLibrary.StockSections);
+                this.DrawSections(SectionLibrary.CustomSections);
                 GUILayout.Space(5.0f);
                 this.DrawNewButton();
 
@@ -233,10 +233,10 @@
 
                 if (GUILayout.Button("NEW CUSTOM SECTION", this.buttonStyle))
                 {
-                    SectionLibrary.Instance.CustomSections.Add(new SectionModule
+                    SectionLibrary.CustomSections.Add(new SectionModule
                     {
-                        Name = "Custom " + (SectionLibrary.Instance.CustomSections.Count + 1),
-                        Abbreviation = "CUST " + (SectionLibrary.Instance.CustomSections.Count + 1),
+                        Name = "Custom " + (SectionLibrary.CustomSections.Count + 1),
+                        Abbreviation = "CUST " + (SectionLibrary.CustomSections.Count + 1),
                         IsVisible = true,
                         IsCustom = true,
                         IsEditorVisible = true

--- a/KerbalEngineer/Flight/DisplayStack.cs
+++ b/KerbalEngineer/Flight/DisplayStack.cs
@@ -1,417 +1,417 @@
-// 

-//     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 System.Collections.Generic;

-

-using KerbalEngineer.Extensions;

-using KerbalEngineer.Flight.Sections;

-using KerbalEngineer.Settings;

-

-using UnityEngine;

-

-#endregion

-

-namespace KerbalEngineer.Flight

-{

-    /// <summary>

-    ///     Graphical controller for displaying stacked sections.

-    /// </summary>

-    [KSPAddon(KSPAddon.Startup.Flight, false)]

-    public class DisplayStack : MonoBehaviour

-    {

-        #region Instance

-

-        /// <summary>

-        ///     Gets the current instance of the DisplayStack.

-        /// </summary>

-        public static DisplayStack Instance { get; private set; }

-

-        #endregion

-

-        #region Fields

-

-        private int numberOfStackSections;

-        private bool resizeRequested;

-        private int windowId;

-        private Rect windowPosition;

-

-        #endregion

-

-        #region Constructors

-

-        /// <summary>

-        ///     Sets the instance to this object.

-        /// </summary>

-        private void Awake()

-        {

-            try

-            {

-                if (Instance == null)

-                {

-                    Instance = this;

-                    GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;

-                    Logger.Log("ActionMenu->Awake");

-                }

-                else

-                {

-                    Destroy(this);

-                }

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "DisplayStack->Awake");

-            }

-        }

-

-        /// <summary>

-        ///     Initialises the object's state on creation.

-        /// </summary>

-        private void Start()

-        {

-            try

-            {

-                this.windowId = this.GetHashCode();

-                this.InitialiseStyles();

-                this.Load();

-                RenderingManager.AddToPostDrawQueue(0, this.Draw);

-                Logger.Log("ActionMenu->Start");

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "DisplayStack->Start");

-            }

-        }

-

-        #endregion

-

-        #region Properties

-

-        private bool showControlBar = true;

-

-        /// <summary>

-        ///     Gets and sets the visibility of the control bar.

-        /// </summary>

-        public bool ShowControlBar

-        {

-            get { return this.showControlBar; }

-            set { this.showControlBar = value; }

-        }

-

-        public bool Hidden { get; set; }

-

-        #endregion

-

-        #region GUIStyles

-

-        private GUIStyle buttonStyle;

-        private GUIStyle titleStyle;

-        private GUIStyle windowStyle;

-

-        /// <summary>

-        ///     Initialises all the styles required for this object.

-        /// </summary>

-        private void InitialiseStyles()

-        {

-            try

-            {

-                this.windowStyle = new GUIStyle(HighLogic.Skin.window)

-                {

-                    margin = new RectOffset(),

-                    padding = new RectOffset(5, 5, 0, 5)

-                };

-

-                this.titleStyle = new GUIStyle(HighLogic.Skin.label)

-                {

-                    margin = new RectOffset(0, 0, 5, 3),

-                    padding = new RectOffset(),

-                    alignment = TextAnchor.MiddleCenter,

-                    fontSize = (int)(13 * GuiDisplaySize.Offset),

-                    fontStyle = FontStyle.Bold,

-                    stretchWidth = true

-                };

-

-                this.buttonStyle = new GUIStyle(HighLogic.Skin.button)

-                {

-                    normal =

-                    {

-                        textColor = Color.white

-                    },

-                    margin = new RectOffset(),

-                    padding = new RectOffset(),

-                    alignment = TextAnchor.MiddleCenter,

-                    fontSize = (int)(11 * GuiDisplaySize.Offset),

-                    fontStyle = FontStyle.Bold,

-                    fixedWidth = 60.0f * GuiDisplaySize.Offset,

-                    fixedHeight = 25.0f * GuiDisplaySize.Offset,

-                };

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "DisplayStack->InitialiseStyles");

-            }

-        }

-

-        private void OnSizeChanged()

-        {

-            this.InitialiseStyles();

-            this.RequestResize();

-        }

-

-        #endregion

-

-        #region Updating

-

-        private void Update()

-        {

-            try

-            {

-                if (FlightEngineerCore.Instance == null)

-                {

-                    return;

-                }

-

-                if (Input.GetKeyDown(KeyCode.Backslash))

-                {

-                    this.Hidden = !this.Hidden;

-                }

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "DisplayStack->Update");

-            }

-        }

-

-        #endregion

-

-        #region Drawing

-

-        /// <summary>

-        ///     Called to draw the display stack when the UI is enabled.

-        /// </summary>

-        private void Draw()

-        {

-            try

-            {

-                if (FlightEngineerCore.Instance == null)

-                {

-                    return;

-                }

-

-                if (this.resizeRequested || this.numberOfStackSections != SectionLibrary.Instance.NumberOfStackSections)

-                {

-                    this.numberOfStackSections = SectionLibrary.Instance.NumberOfStackSections;

-                    this.windowPosition.width = 0;

-                    this.windowPosition.height = 0;

-                    this.resizeRequested = false;

-                }

-

-                if (!this.Hidden && (SectionLibrary.Instance.NumberOfStackSections > 0 || this.ShowControlBar))

-                {

-                    var shouldCentre = this.windowPosition.min == Vector2.zero;

-                    GUI.skin = null;

-                    this.windowPosition = GUILayout.Window(this.windowId, this.windowPosition, this.Window, string.Empty, this.windowStyle).ClampToScreen();

-                    if (shouldCentre)

-                    {

-                        this.windowPosition.center = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f);

-                    }

-                }

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "DisplayStack->Draw");

-            }

-        }

-

-        /// <summary>

-        ///     Draws the display stack window.

-        /// </summary>

-        private void Window(int windowId)

-        {

-            try

-            {

-                if (this.ShowControlBar)

-                {

-                    this.DrawControlBar();

-                }

-

-                if (SectionLibrary.Instance.NumberOfStackSections > 0)

-                {

-                    this.DrawSections(SectionLibrary.Instance.StockSections);

-                    this.DrawSections(SectionLibrary.Instance.CustomSections);

-                }

-

-                GUI.DragWindow();

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "DisplayStack->Widnow");

-            }

-        }

-

-        /// <summary>

-        ///     Draws the control bar.

-        /// </summary>

-        private void DrawControlBar()

-        {

-            try

-            {

-                GUILayout.Label("FLIGHT ENGINEER " + EngineerGlobals.AssemblyVersion, this.titleStyle);

-

-                this.DrawControlBarButtons(SectionLibrary.Instance.StockSections);

-                this.DrawControlBarButtons(SectionLibrary.Instance.CustomSections);

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "DisplayStack->DrawControlBar");

-            }

-        }

-

-        /// <summary>

-        ///     Draws a button list for a set of sections.

-        /// </summary>

-        private void DrawControlBarButtons(IEnumerable<SectionModule> sections)

-        {

-            try

-            {

-                var index = 0;

-                foreach (var section in sections)

-                {

-                    if (index % 4 == 0)

-                    {

-                        if (index > 0)

-                        {

-                            GUILayout.EndHorizontal();

-                        }

-                        GUILayout.BeginHorizontal();

-                    }

-                    section.IsVisible = GUILayout.Toggle(section.IsVisible, section.Abbreviation.ToUpper(), this.buttonStyle);

-                    index++;

-                }

-                if (index > 0)

-                {

-                    GUILayout.EndHorizontal();

-                }

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "DisplayStack->DrawControlBarButtons");

-            }

-        }

-

-        /// <summary>

-        ///     Draws a list of sections.

-        /// </summary>

-        private void DrawSections(IEnumerable<SectionModule> sections)

-        {

-            try

-            {

-                foreach (var section in sections)

-                {

-                    if (!section.IsFloating)

-                    {

-                        section.Draw();

-                    }

-                }

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "DisplayStack->DrawSections");

-            }

-        }

-

-        #endregion

-

-        #region Destruction

-

-        /// <summary>

-        ///     Runs when the object is destroyed.

-        /// </summary>

-        private void OnDestroy()

-        {

-            try

-            {

-                this.Save();

-                RenderingManager.RemoveFromPostDrawQueue(0, this.Draw);

-                Logger.Log("ActionMenu->OnDestroy");

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "DisplayStack->OnDestroy");

-            }

-        }

-

-        #endregion

-

-        #region Saving and Loading

-

-        /// <summary>

-        ///     Saves the stack's state.

-        /// </summary>

-        private void Save()

-        {

-            try

-            {

-                var handler = new SettingHandler();

-                handler.Set("showControlBar", this.ShowControlBar);

-                handler.Set("windowPositionX", this.windowPosition.x);

-                handler.Set("windowPositionY", this.windowPosition.y);

-                handler.Save("DisplayStack.xml");

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "DisplayStack->Save");

-            }

-        }

-

-        /// <summary>

-        ///     Load the stack's state.

-        /// </summary>

-        private void Load()

-        {

-            try

-            {

-                var handler = SettingHandler.Load("DisplayStack.xml");

-                this.ShowControlBar = handler.Get("showControlBar", this.ShowControlBar);

-                this.windowPosition.x = handler.Get("windowPositionX", this.windowPosition.x);

-                this.windowPosition.y = handler.Get("windowPositionY", this.windowPosition.y);

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "DisplayStack->Load");

-            }

-        }

-

-        #endregion

-

-        #region Methods

-

-        /// <summary>

-        ///     Request that the display stack's size is reset in the next draw call.

-        /// </summary>

-        public void RequestResize()

-        {

-            this.resizeRequested = true;

-        }

-

-        #endregion

-    }

+// 
+//     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 System.Collections.Generic;
+
+using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Settings;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight
+{
+    /// <summary>
+    ///     Graphical controller for displaying stacked sections.
+    /// </summary>
+    [KSPAddon(KSPAddon.Startup.Flight, false)]
+    public class DisplayStack : MonoBehaviour
+    {
+        #region Instance
+
+        /// <summary>
+        ///     Gets the current instance of the DisplayStack.
+        /// </summary>
+        public static DisplayStack Instance { get; private set; }
+
+        #endregion
+
+        #region Fields
+
+        private int numberOfStackSections;
+        private bool resizeRequested;
+        private int windowId;
+        private Rect windowPosition;
+
+        #endregion
+
+        #region Constructors
+
+        /// <summary>
+        ///     Sets the instance to this object.
+        /// </summary>
+        private void Awake()
+        {
+            try
+            {
+                if (Instance == null)
+                {
+                    Instance = this;
+                    GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
+                    Logger.Log("ActionMenu->Awake");
+                }
+                else
+                {
+                    Destroy(this);
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->Awake");
+            }
+        }
+
+        /// <summary>
+        ///     Initialises the object's state on creation.
+        /// </summary>
+        private void Start()
+        {
+            try
+            {
+                this.windowId = this.GetHashCode();
+                this.InitialiseStyles();
+                this.Load();
+                RenderingManager.AddToPostDrawQueue(0, this.Draw);
+                Logger.Log("ActionMenu->Start");
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->Start");
+            }
+        }
+
+        #endregion
+
+        #region Properties
+
+        private bool showControlBar = true;
+
+        /// <summary>
+        ///     Gets and sets the visibility of the control bar.
+        /// </summary>
+        public bool ShowControlBar
+        {
+            get { return this.showControlBar; }
+            set { this.showControlBar = value; }
+        }
+
+        public bool Hidden { get; set; }
+
+        #endregion
+
+        #region GUIStyles
+
+        private GUIStyle buttonStyle;
+        private GUIStyle titleStyle;
+        private GUIStyle windowStyle;
+
+        /// <summary>
+        ///     Initialises all the styles required for this object.
+        /// </summary>
+        private void InitialiseStyles()
+        {
+            try
+            {
+                this.windowStyle = new GUIStyle(HighLogic.Skin.window)
+                {
+                    margin = new RectOffset(),
+                    padding = new RectOffset(5, 5, 0, 5)
+                };
+
+                this.titleStyle = new GUIStyle(HighLogic.Skin.label)
+                {
+                    margin = new RectOffset(0, 0, 5, 3),
+                    padding = new RectOffset(),
+                    alignment = TextAnchor.MiddleCenter,
+                    fontSize = (int)(13 * GuiDisplaySize.Offset),
+                    fontStyle = FontStyle.Bold,
+                    stretchWidth = true
+                };
+
+                this.buttonStyle = new GUIStyle(HighLogic.Skin.button)
+                {
+                    normal =
+                    {
+                        textColor = Color.white
+                    },
+                    margin = new RectOffset(),
+                    padding = new RectOffset(),
+                    alignment = TextAnchor.MiddleCenter,
+                    fontSize = (int)(11 * GuiDisplaySize.Offset),
+                    fontStyle = FontStyle.Bold,
+                    fixedWidth = 60.0f * GuiDisplaySize.Offset,
+                    fixedHeight = 25.0f * GuiDisplaySize.Offset,
+                };
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->InitialiseStyles");
+            }
+        }
+
+        private void OnSizeChanged()
+        {
+            this.InitialiseStyles();
+            this.RequestResize();
+        }
+
+        #endregion
+
+        #region Updating
+
+        private void Update()
+        {
+            try
+            {
+                if (FlightEngineerCore.Instance == null)
+                {
+                    return;
+                }
+
+                if (Input.GetKeyDown(KeyCode.Backslash))
+                {
+                    this.Hidden = !this.Hidden;
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->Update");
+            }
+        }
+
+        #endregion
+
+        #region Drawing
+
+        /// <summary>
+        ///     Called to draw the display stack when the UI is enabled.
+        /// </summary>
+        private void Draw()
+        {
+            try
+            {
+                if (FlightEngineerCore.Instance == null)
+                {
+                    return;
+                }
+
+                if (this.resizeRequested || this.numberOfStackSections != SectionLibrary.NumberOfStackSections)
+                {
+                    this.numberOfStackSections = SectionLibrary.NumberOfStackSections;
+                    this.windowPosition.width = 0;
+                    this.windowPosition.height = 0;
+                    this.resizeRequested = false;
+                }
+
+                if (!this.Hidden && (SectionLibrary.NumberOfStackSections > 0 || this.ShowControlBar))
+                {
+                    var shouldCentre = this.windowPosition.min == Vector2.zero;
+                    GUI.skin = null;
+                    this.windowPosition = GUILayout.Window(this.windowId, this.windowPosition, this.Window, string.Empty, this.windowStyle).ClampToScreen();
+                    if (shouldCentre)
+                    {
+                        this.windowPosition.center = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->Draw");
+            }
+        }
+
+        /// <summary>
+        ///     Draws the display stack window.
+        /// </summary>
+        private void Window(int windowId)
+        {
+            try
+            {
+                if (this.ShowControlBar)
+                {
+                    this.DrawControlBar();
+                }
+
+                if (SectionLibrary.NumberOfStackSections > 0)
+                {
+                    this.DrawSections(SectionLibrary.StockSections);
+                    this.DrawSections(SectionLibrary.CustomSections);
+                }
+
+                GUI.DragWindow();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->Widnow");
+            }
+        }
+
+        /// <summary>
+        ///     Draws the control bar.
+        /// </summary>
+        private void DrawControlBar()
+        {
+            try
+            {
+                GUILayout.Label("FLIGHT ENGINEER " + EngineerGlobals.AssemblyVersion, this.titleStyle);
+
+                this.DrawControlBarButtons(SectionLibrary.StockSections);
+                this.DrawControlBarButtons(SectionLibrary.CustomSections);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->DrawControlBar");
+            }
+        }
+
+        /// <summary>
+        ///     Draws a button list for a set of sections.
+        /// </summary>
+        private void DrawControlBarButtons(IEnumerable<SectionModule> sections)
+        {
+            try
+            {
+                var index = 0;
+                foreach (var section in sections)
+                {
+                    if (index % 4 == 0)
+                    {
+                        if (index > 0)
+                        {
+                            GUILayout.EndHorizontal();
+                        }
+                        GUILayout.BeginHorizontal();
+                    }
+                    section.IsVisible = GUILayout.Toggle(section.IsVisible, section.Abbreviation.ToUpper(), this.buttonStyle);
+                    index++;
+                }
+                if (index > 0)
+                {
+                    GUILayout.EndHorizontal();
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->DrawControlBarButtons");
+            }
+        }
+
+        /// <summary>
+        ///     Draws a list of sections.
+        /// </summary>
+        private void DrawSections(IEnumerable<SectionModule> sections)
+        {
+            try
+            {
+                foreach (var section in sections)
+                {
+                    if (!section.IsFloating)
+                    {
+                        section.Draw();
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->DrawSections");
+            }
+        }
+
+        #endregion
+
+        #region Destruction
+
+        /// <summary>
+        ///     Runs when the object is destroyed.
+        /// </summary>
+        private void OnDestroy()
+        {
+            try
+            {
+                this.Save();
+                RenderingManager.RemoveFromPostDrawQueue(0, this.Draw);
+                Logger.Log("ActionMenu->OnDestroy");
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->OnDestroy");
+            }
+        }
+
+        #endregion
+
+        #region Saving and Loading
+
+        /// <summary>
+        ///     Saves the stack's state.
+        /// </summary>
+        private void Save()
+        {
+            try
+            {
+                var handler = new SettingHandler();
+                handler.Set("showControlBar", this.ShowControlBar);
+                handler.Set("windowPositionX", this.windowPosition.x);
+                handler.Set("windowPositionY", this.windowPosition.y);
+                handler.Save("DisplayStack.xml");
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->Save");
+            }
+        }
+
+        /// <summary>
+        ///     Load the stack's state.
+        /// </summary>
+        private void Load()
+        {
+            try
+            {
+                var handler = SettingHandler.Load("DisplayStack.xml");
+                this.ShowControlBar = handler.Get("showControlBar", this.ShowControlBar);
+                this.windowPosition.x = handler.Get("windowPositionX", this.windowPosition.x);
+                this.windowPosition.y = handler.Get("windowPositionY", this.windowPosition.y);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->Load");
+            }
+        }
+
+        #endregion
+
+        #region Methods
+
+        /// <summary>
+        ///     Request that the display stack's size is reset in the next draw call.
+        /// </summary>
+        public void RequestResize()
+        {
+            this.resizeRequested = true;
+        }
+
+        #endregion
+    }
 }

--- a/KerbalEngineer/Flight/FlightEngineerCore.cs
+++ b/KerbalEngineer/Flight/FlightEngineerCore.cs
@@ -74,8 +74,8 @@
         {
             try
             {
-                SectionLibrary.Instance.Load();
-                ReadoutLibrary.Instance.Reset();
+                SectionLibrary.Load();
+                ReadoutLibrary.Reset();
                 Logger.Log("FlightEngineerCore->Start");
             }
             catch (Exception ex)
@@ -114,7 +114,7 @@
         {
             try
             {
-                SectionLibrary.Instance.FixedUpdate();
+                SectionLibrary.FixedUpdate();
             }
             catch (Exception ex)
             {
@@ -129,7 +129,7 @@
         {
             try
             {
-                SectionLibrary.Instance.Update();
+                SectionLibrary.Update();
                 this.UpdateModules();
             }
             catch (Exception ex)
@@ -179,7 +179,7 @@
         {
             try
             {
-                SectionLibrary.Instance.Save();
+                SectionLibrary.Save();
 
                 foreach (var window in this.SectionWindows)
                 {

--- a/KerbalEngineer/Flight/Readouts/Misc/GuiSizeAdjustor.cs
+++ /dev/null
@@ -1,49 +1,1 @@
-// 

-//     Kerbal Engineer Redux

-// 

-//     Copyright (C) 2014 CYBUTEK

-// 

-//     This program is free software: you can redistribute it and/or modify

-//     it under the terms of the GNU General Public License as published by

-//     the Free Software Foundation, either version 3 of the License, or

-//     (at your option) any later version.

-// 

-//     This program is distributed in the hope that it will be useful,

-//     but WITHOUT ANY WARRANTY; without even the implied warranty of

-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

-//     GNU General Public License for more details.

-// 

-//     You should have received a copy of the GNU General Public License

-//     along with this program.  If not, see <http://www.gnu.org/licenses/>.

-// 

-

-using UnityEngine;

-

-namespace KerbalEngineer.Flight.Readouts.Misc

-{

-    public class GuiSizeAdjustor : ReadoutModule

-    {

-        public GuiSizeAdjustor()

-        {

-            this.Name = "GUI Size Adjustor";

-            this.Category = ReadoutCategory.Misc;

-            this.HelpString = "Shows a control that will allow you to adjust the GUI size.";

-            this.IsDefault = false;

-        }

-

-        public override void Draw()

-        {

-            GUILayout.BeginHorizontal();

-            GUILayout.Label("GUI Size: " + GuiDisplaySize.Increment, this.NameStyle);

-            if (GUILayout.Button("<", this.ButtonStyle))

-            {

-                GuiDisplaySize.Increment--;

-            }

-            if (GUILayout.Button(">", this.ButtonStyle))

-            {

-                GuiDisplaySize.Increment++;

-            }

-            GUILayout.EndHorizontal();

-        }

-    }

-}
+

--- a/KerbalEngineer/Flight/Readouts/Misc/Separator.cs
+++ /dev/null
@@ -1,51 +1,1 @@
-// 

-//     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 UnityEngine;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Misc

-{

-    public class Separator : ReadoutModule

-    {

-        private readonly Texture2D texture;

-

-        public Separator()

-        {

-            this.Name = "Separator";

-            this.Category = ReadoutCategory.Misc;

-            this.HelpString = string.Empty;

-            this.IsDefault = false;

-            this.Cloneable = true;

-

-            this.texture = new Texture2D(1, 1, TextureFormat.RGBA32, false);

-            this.texture.SetPixel(0, 0, new Color(1.0f, 1.0f, 1.0f, 0.5f));

-            this.texture.Apply();

-        }

-

-        public override void Draw()

-        {

-            GUILayout.Box(string.Empty, GUIStyle.none, new[] {GUILayout.Width(this.ContentWidth), GUILayout.Height(1.0f)});

-            GUI.DrawTexture(GUILayoutUtility.GetLastRect(), this.texture, ScaleMode.StretchToFill);

-        }

-    }

-}
+

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Miscellaneous/GuiSizeAdjustor.cs
@@ -1,1 +1,49 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+using UnityEngine;
+
+namespace KerbalEngineer.Flight.Readouts.Miscellaneous
+{
+    public class GuiSizeAdjustor : ReadoutModule
+    {
+        public GuiSizeAdjustor()
+        {
+            this.Name = "GUI Size Adjustor";
+            this.Category = ReadoutCategory.GetCategory("Miscellaneous");
+            this.HelpString = "Shows a control that will allow you to adjust the GUI size.";
+            this.IsDefault = false;
+        }
+
+        public override void Draw()
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("GUI Size: " + GuiDisplaySize.Increment, this.NameStyle);
+            if (GUILayout.Button("<", this.ButtonStyle))
+            {
+                GuiDisplaySize.Increment--;
+            }
+            if (GUILayout.Button(">", this.ButtonStyle))
+            {
+                GuiDisplaySize.Increment++;
+            }
+            GUILayout.EndHorizontal();
+        }
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Miscellaneous/Separator.cs
@@ -1,1 +1,51 @@
+// 
+//     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 UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Miscellaneous
+{
+    public class Separator : ReadoutModule
+    {
+        private readonly Texture2D texture;
+
+        public Separator()
+        {
+            this.Name = "Separator";
+            this.Category = ReadoutCategory.GetCategory("Miscellaneous");
+            this.HelpString = string.Empty;
+            this.IsDefault = false;
+            this.Cloneable = true;
+
+            this.texture = new Texture2D(1, 1, TextureFormat.RGBA32, false);
+            this.texture.SetPixel(0, 0, new Color(1.0f, 1.0f, 1.0f, 0.5f));
+            this.texture.Apply();
+        }
+
+        public override void Draw()
+        {
+            GUILayout.Box(string.Empty, GUIStyle.none, new[] {GUILayout.Width(this.ContentWidth), GUILayout.Height(1.0f)});
+            GUI.DrawTexture(GUILayoutUtility.GetLastRect(), this.texture, ScaleMode.StretchToFill);
+        }
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Orbital/ApoapsisHeight.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ApoapsisHeight.cs
@@ -26,7 +26,7 @@
         public ApoapsisHeight()
         {
             this.Name = "Apoapsis Height";
-            this.Category = ReadoutCategory.Orbital;
+            this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = "Shows the vessel's apoapsis height relative to sea level.  (Apoapsis is the highest point of an orbit.)";
             this.IsDefault = true;
         }

--- a/KerbalEngineer/Flight/Readouts/Orbital/Eccentricity.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/Eccentricity.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Orbital

-{

-    public class Eccentricity : ReadoutModule

-    {

-        public Eccentricity()

-        {

-            this.Name = "Eccentricity";

-            this.Category = ReadoutCategory.Orbital;

-            this.HelpString = "Shows the vessel's orbital eccentricity.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(FlightGlobals.ship_orbit.eccentricity.ToAngle());

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital
+{
+    public class Eccentricity : ReadoutModule
+    {
+        public Eccentricity()
+        {
+            this.Name = "Eccentricity";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = "Shows the vessel's orbital eccentricity.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(FlightGlobals.ship_orbit.eccentricity.ToAngle());
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/Inclination.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/Inclination.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Orbital

-{

-    public class Inclination : ReadoutModule

-    {

-        public Inclination()

-        {

-            this.Name = "Inclination";

-            this.Category = ReadoutCategory.Orbital;

-            this.HelpString = "Shows the vessel's orbital inclination.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(FlightGlobals.ship_orbit.inclination.ToAngle());

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital
+{
+    public class Inclination : ReadoutModule
+    {
+        public Inclination()
+        {
+            this.Name = "Inclination";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = "Shows the vessel's orbital inclination.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(FlightGlobals.ship_orbit.inclination.ToAngle());
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/LongitudeOfAscendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/LongitudeOfAscendingNode.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Orbital

-{

-    public class LongitudeOfAscendingNode : ReadoutModule

-    {

-        public LongitudeOfAscendingNode()

-        {

-            this.Name = "Longitude of AN";

-            this.Category = ReadoutCategory.Orbital;

-            this.HelpString = "Shows the vessel's longitude of the ascending node.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(FlightGlobals.ship_orbit.LAN.ToAngle());

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital
+{
+    public class LongitudeOfAscendingNode : ReadoutModule
+    {
+        public LongitudeOfAscendingNode()
+        {
+            this.Name = "Longitude of AN";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = "Shows the vessel's longitude of the ascending node.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(FlightGlobals.ship_orbit.LAN.ToAngle());
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/LongitudeOfPeriapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/LongitudeOfPeriapsis.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Orbital

-{

-    public class LongitudeOfPeriapsis : ReadoutModule

-    {

-        public LongitudeOfPeriapsis()

-        {

-            this.Name = "Longitude of Pe";

-            this.Category = ReadoutCategory.Orbital;

-            this.HelpString = "Shows the vessel's longitude of periapsis.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine((FlightGlobals.ship_orbit.LAN + FlightGlobals.ship_orbit.argumentOfPeriapsis).ToAngle());

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital
+{
+    public class LongitudeOfPeriapsis : ReadoutModule
+    {
+        public LongitudeOfPeriapsis()
+        {
+            this.Name = "Longitude of Pe";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = "Shows the vessel's longitude of periapsis.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine((FlightGlobals.ship_orbit.LAN + FlightGlobals.ship_orbit.argumentOfPeriapsis).ToAngle());
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/OrbitalPeriod.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/OrbitalPeriod.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Orbital

-{

-    public class OrbitalPeriod : ReadoutModule

-    {

-        public OrbitalPeriod()

-        {

-            this.Name = "Orbital Period";

-            this.Category = ReadoutCategory.Orbital;

-            this.HelpString = "Shows the amount of time it will take to complete a full orbit.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(FlightGlobals.ship_orbit.period.ToTime("F3"));

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital
+{
+    public class OrbitalPeriod : ReadoutModule
+    {
+        public OrbitalPeriod()
+        {
+            this.Name = "Orbital Period";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = "Shows the amount of time it will take to complete a full orbit.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(FlightGlobals.ship_orbit.period.ToTime("F3"));
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/OrbitalSpeed.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/OrbitalSpeed.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Orbital

-{

-    public class OrbitalSpeed : ReadoutModule

-    {

-        public OrbitalSpeed()

-        {

-            this.Name = "Orbital Speed";

-            this.Category = ReadoutCategory.Orbital;

-            this.HelpString = "Shows the vessel's orbital speed.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(FlightGlobals.ship_obtSpeed.ToSpeed());

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital
+{
+    public class OrbitalSpeed : ReadoutModule
+    {
+        public OrbitalSpeed()
+        {
+            this.Name = "Orbital Speed";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = "Shows the vessel's orbital speed.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(FlightGlobals.ship_obtSpeed.ToSpeed());
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/PeriapsisHeight.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/PeriapsisHeight.cs
@@ -26,7 +26,7 @@
         public PeriapsisHeight()
         {
             this.Name = "Periapsis Height";
-            this.Category = ReadoutCategory.Orbital;
+            this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = "Shows the vessel's periapsis height relative to sea level. (Periapsis is the lowest point of an orbit.";
             this.IsDefault = true;
         }

--- a/KerbalEngineer/Flight/Readouts/Orbital/SemiMajorAxis.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/SemiMajorAxis.cs
@@ -30,7 +30,7 @@
         public SemiMajorAxis()
         {
             this.Name = "Semi-Major Axis";
-            this.Category = ReadoutCategory.Orbital;
+            this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = "Shows the distance from the centre of an orbit to the farthest edge.";
             this.IsDefault = true;
         }

--- a/KerbalEngineer/Flight/Readouts/Orbital/SemiMinorAxis.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/SemiMinorAxis.cs
@@ -30,7 +30,7 @@
         public SemiMinorAxis()
         {
             this.Name = "Semi-Minor Axis";
-            this.Category = ReadoutCategory.Orbital;
+            this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = "Shows the distance from the centre of an orbit to the nearest edge.";
             this.IsDefault = true;
         }

--- a/KerbalEngineer/Flight/Readouts/Orbital/TimeToApoapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/TimeToApoapsis.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Orbital

-{

-    public class TimeToApoapsis : ReadoutModule

-    {

-        public TimeToApoapsis()

-        {

-            this.Name = "Time to Apoapsis";

-            this.Category = ReadoutCategory.Orbital;

-            this.HelpString = "Shows the time until the vessel reaches apoapsis, the highest point of the orbit.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(FlightGlobals.ship_orbit.timeToAp.ToTime());

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital
+{
+    public class TimeToApoapsis : ReadoutModule
+    {
+        public TimeToApoapsis()
+        {
+            this.Name = "Time to Apoapsis";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = "Shows the time until the vessel reaches apoapsis, the highest point of the orbit.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(FlightGlobals.ship_orbit.timeToAp.ToTime());
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/TimeToPeriapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/TimeToPeriapsis.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Orbital

-{

-    public class TimeToPeriapsis : ReadoutModule

-    {

-        public TimeToPeriapsis()

-        {

-            this.Name = "Time to Periapsis";

-            this.Category = ReadoutCategory.Orbital;

-            this.HelpString = "Shows the time until the vessel reaches periapsis, the lowest point of the orbit.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(FlightGlobals.ship_orbit.timeToPe.ToTime());

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital
+{
+    public class TimeToPeriapsis : ReadoutModule
+    {
+        public TimeToPeriapsis()
+        {
+            this.Name = "Time to Periapsis";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = "Shows the time until the vessel reaches periapsis, the lowest point of the orbit.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(FlightGlobals.ship_orbit.timeToPe.ToTime());
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/ReadoutCategory.cs
+++ b/KerbalEngineer/Flight/Readouts/ReadoutCategory.cs
@@ -1,34 +1,93 @@
-// 

-//     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/>.

-// 

-

-namespace KerbalEngineer.Flight.Readouts

-{

-    /// <summary>

-    ///     Enumeration of categories that a readout module can associate with.

-    /// </summary>

-    public enum ReadoutCategory

-    {

-        None = 0,

-        Orbital = 1,

-        Surface = 2,

-        Vessel = 4,

-        Rendezvous = 8,

-        Misc = 16

-    }

+// 
+//     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 System.Collections.Generic;
+using System.Linq;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts
+{
+    public class ReadoutCategory
+    {
+        #region Constructors
+
+        static ReadoutCategory()
+        {
+            Categories = new List<ReadoutCategory>();
+        }
+
+        public ReadoutCategory(string name)
+        {
+            this.Name = name;
+        }
+
+        public ReadoutCategory(string name, string description)
+        {
+            this.Name = name;
+            this.Description = description;
+        }
+
+        #endregion
+
+        #region Properties
+
+        public static List<ReadoutCategory> Categories { get; private set; }
+
+        public string Name { get; set; }
+
+        public string Description { get; set; }
+
+        #endregion
+
+        #region Public Methods
+
+        /// <summary>
+        ///     Gets a category with the specified non-case sensitive name or creates it if required.
+        /// </summary>
+        public static ReadoutCategory GetCategory(string name)
+        {
+            if (Categories.Any(c => c.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase)))
+            {
+                return Categories.Find(c => c.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase));
+            }
+
+            var category = new ReadoutCategory(name);
+            Categories.Add(category);
+            return category;
+        }
+
+        public static void SetCategory(string name, string description)
+        {
+            var category = GetCategory(name);
+            category.Name = name;
+            category.Description = description;
+        }
+
+        public override string ToString()
+        {
+            return this.Name;
+        }
+
+        #endregion
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs
+++ b/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs
@@ -19,10 +19,11 @@
 
 #region Using Directives
 
+using System;
 using System.Collections.Generic;
 using System.Linq;
 
-using KerbalEngineer.Flight.Readouts.Misc;
+using KerbalEngineer.Flight.Readouts.Miscellaneous;
 using KerbalEngineer.Flight.Readouts.Orbital;
 using KerbalEngineer.Flight.Readouts.Rendezvous;
 using KerbalEngineer.Flight.Readouts.Surface;
@@ -40,25 +41,11 @@
 
 namespace KerbalEngineer.Flight.Readouts
 {
-    public class ReadoutLibrary
+    public static class ReadoutLibrary
     {
-        #region Instance
-
-        private static readonly ReadoutLibrary instance = new ReadoutLibrary();
-
-        /// <summary>
-        ///     Gets the current instance of the readout library.
-        /// </summary>
-        public static ReadoutLibrary Instance
-        {
-            get { return instance; }
-        }
-
-        #endregion
-
         #region Fields
 
-        private List<ReadoutModule> readoutModules = new List<ReadoutModule>();
+        private static List<ReadoutModule> readouts = new List<ReadoutModule>();
 
         #endregion
 
@@ -67,70 +54,83 @@
         /// <summary>
         ///     Sets up and populates the readout library with the stock readouts.
         /// </summary>
-        private ReadoutLibrary()
-        {
-            // Orbital
-            this.readoutModules.Add(new ApoapsisHeight());
-            this.readoutModules.Add(new PeriapsisHeight());
-            this.readoutModules.Add(new TimeToApoapsis());
-            this.readoutModules.Add(new TimeToPeriapsis());
-            this.readoutModules.Add(new Inclination());
-            this.readoutModules.Add(new Eccentricity());
-            this.readoutModules.Add(new OrbitalSpeed());
-            this.readoutModules.Add(new OrbitalPeriod());
-            this.readoutModules.Add(new LongitudeOfAscendingNode());
-            this.readoutModules.Add(new LongitudeOfPeriapsis());
-            this.readoutModules.Add(new SemiMajorAxis());
-            this.readoutModules.Add(new SemiMinorAxis());
-
-            // Surface
-            this.readoutModules.Add(new AltitudeSeaLevel());
-            this.readoutModules.Add(new AltitudeTerrain());
-            this.readoutModules.Add(new VerticalSpeed());
-            this.readoutModules.Add(new HorizontalSpeed());
-            this.readoutModules.Add(new Longitude());
-            this.readoutModules.Add(new Latitude());
-            this.readoutModules.Add(new GeeForce());
-            this.readoutModules.Add(new TerminalVelocity());
-            this.readoutModules.Add(new AtmosphericEfficiency());
-            this.readoutModules.Add(new Biome());
-            this.readoutModules.Add(new Slope());
-            this.readoutModules.Add(new ImpactTime());
-            this.readoutModules.Add(new ImpactLongitude());
-            this.readoutModules.Add(new ImpactLatitude());
-            this.readoutModules.Add(new ImpactAltitude());
-            this.readoutModules.Add(new ImpactBiome());
-
-            // Vessel
-            this.readoutModules.Add(new DeltaVStaged());
-            this.readoutModules.Add(new DeltaVTotal());
-            this.readoutModules.Add(new SpecificImpulse());
-            this.readoutModules.Add(new Mass());
-            this.readoutModules.Add(new Thrust());
-            this.readoutModules.Add(new ThrustToWeight());
-            this.readoutModules.Add(new Acceleration());
-            this.readoutModules.Add(new SimulationDelay());
-
-            // Rendezvous
-            this.readoutModules.Add(new TargetSelector());
-            this.readoutModules.Add(new PhaseAngle());
-            this.readoutModules.Add(new InterceptAngle());
-            this.readoutModules.Add(new RelativeInclination());
-            this.readoutModules.Add(new AngleToAscendingNode());
-            this.readoutModules.Add(new AngleToDescendingNode());
-            this.readoutModules.Add(new Rendezvous.AltitudeSeaLevel());
-            this.readoutModules.Add(new Rendezvous.ApoapsisHeight());
-            this.readoutModules.Add(new Rendezvous.PeriapsisHeight());
-            this.readoutModules.Add(new Rendezvous.TimeToApoapsis());
-            this.readoutModules.Add(new Rendezvous.TimeToPeriapsis());
-            this.readoutModules.Add(new Distance());
-            this.readoutModules.Add(new Rendezvous.OrbitalPeriod());
-
-            // Misc
-            this.readoutModules.Add(new Separator());
-            this.readoutModules.Add(new GuiSizeAdjustor());
-
-            this.LoadHelpStrings();
+        static ReadoutLibrary()
+        {
+            try
+            {
+                ReadoutCategory.SetCategory("Orbital", "Readouts that help with orbital manouevers.");
+                ReadoutCategory.SetCategory("Surface", "Readouts that help with surface manouevers.");
+                ReadoutCategory.SetCategory("Vessel", "Readouts that display information about the vessel.");
+                ReadoutCategory.SetCategory("Rendezvous", "Readouts that help with orbital rendezvous.");
+                ReadoutCategory.SetCategory("Miscellaneous", "Readouts that do not fit into other categories.");
+
+                // Orbital
+                readouts.Add(new ApoapsisHeight());
+                readouts.Add(new PeriapsisHeight());
+                readouts.Add(new TimeToApoapsis());
+                readouts.Add(new TimeToPeriapsis());
+                readouts.Add(new Inclination());
+                readouts.Add(new Eccentricity());
+                readouts.Add(new OrbitalSpeed());
+                readouts.Add(new OrbitalPeriod());
+                readouts.Add(new LongitudeOfAscendingNode());
+                readouts.Add(new LongitudeOfPeriapsis());
+                readouts.Add(new SemiMajorAxis());
+                readouts.Add(new SemiMinorAxis());
+
+                // Surface
+                readouts.Add(new AltitudeSeaLevel());
+                readouts.Add(new AltitudeTerrain());
+                readouts.Add(new VerticalSpeed());
+                readouts.Add(new HorizontalSpeed());
+                readouts.Add(new Longitude());
+                readouts.Add(new Latitude());
+                readouts.Add(new GeeForce());
+                readouts.Add(new TerminalVelocity());
+                readouts.Add(new AtmosphericEfficiency());
+                readouts.Add(new Biome());
+                readouts.Add(new Slope());
+                readouts.Add(new ImpactTime());
+                readouts.Add(new ImpactLongitude());
+                readouts.Add(new ImpactLatitude());
+                readouts.Add(new ImpactAltitude());
+                readouts.Add(new ImpactBiome());
+
+                // Vessel
+                readouts.Add(new DeltaVStaged());
+                readouts.Add(new DeltaVTotal());
+                readouts.Add(new SpecificImpulse());
+                readouts.Add(new Mass());
+                readouts.Add(new Thrust());
+                readouts.Add(new ThrustToWeight());
+                readouts.Add(new Acceleration());
+                readouts.Add(new SimulationDelay());
+
+                // Rendezvous
+                readouts.Add(new TargetSelector());
+                readouts.Add(new PhaseAngle());
+                readouts.Add(new InterceptAngle());
+                readouts.Add(new RelativeInclination());
+                readouts.Add(new AngleToAscendingNode());
+                readouts.Add(new AngleToDescendingNode());
+                readouts.Add(new Rendezvous.AltitudeSeaLevel());
+                readouts.Add(new Rendezvous.ApoapsisHeight());
+                readouts.Add(new Rendezvous.PeriapsisHeight());
+                readouts.Add(new Rendezvous.TimeToApoapsis());
+                readouts.Add(new Rendezvous.TimeToPeriapsis());
+                readouts.Add(new Distance());
+                readouts.Add(new Rendezvous.OrbitalPeriod());
+
+                // Misc
+                readouts.Add(new Separator());
+                readouts.Add(new GuiSizeAdjustor());
+
+                LoadHelpStrings();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
         }
 
         #endregion
@@ -140,10 +140,10 @@
         /// <summary>
         ///     Gets and sets the available readout modules.
         /// </summary>
-        public List<ReadoutModule> ReadoutModules
-        {
-            get { return this.readoutModules; }
-            set { this.readoutModules = value; }
+        public static List<ReadoutModule> Readouts
+        {
+            get { return readouts; }
+            set { readouts = value; }
         }
 
         #endregion
@@ -153,25 +153,25 @@
         /// <summary>
         ///     Gets a readout module with the specified name or class name. (Returns null if not found.)
         /// </summary>
-        public ReadoutModule GetReadoutModule(string name)
-        {
-            return this.readoutModules.FirstOrDefault(r => r.Name == name || r.GetType().Name == name || r.Category + "." + r.GetType().Name == name);
+        public static ReadoutModule GetReadout(string name)
+        {
+            return readouts.FirstOrDefault(r => r.Name == name || r.GetType().Name == name || r.Category + "." + r.GetType().Name == name);
         }
 
         /// <summary>
         ///     Gets a list of readout modules which are associated with the specified category.
         /// </summary>
-        public List<ReadoutModule> GetCategory(ReadoutCategory category)
-        {
-            return this.readoutModules.Where(r => r.Category == category).ToList();
+        public static List<ReadoutModule> GetCategory(ReadoutCategory category)
+        {
+            return readouts.Where(r => r.Category == category).ToList();
         }
 
         /// <summary>
         ///     Resets all the readout modules.
         /// </summary>
-        public void Reset()
-        {
-            foreach (var readout in this.readoutModules)
+        public static void Reset()
+        {
+            foreach (var readout in readouts)
             {
                 readout.Reset();
             }
@@ -184,16 +184,37 @@
         /// <summary>
         ///     Loads the help strings from file.
         /// </summary>
-        private void LoadHelpStrings()
-        {
-            var handler = SettingHandler.Load("HelpStrings.xml");
-            foreach (var readout in this.readoutModules)
-            {
-                readout.HelpString = handler.GetSet(readout.Category + "." + readout.GetType().Name, readout.HelpString);
-            }
-            handler.Save("HelpStrings.xml");
-        }
-
-        #endregion
+        private static void LoadHelpStrings()
+        {
+            try
+            {
+                var handler = SettingHandler.Load("HelpStrings.xml");
+                foreach (var readout in readouts)
+                {
+                    readout.HelpString = handler.GetSet(readout.Category + "." + readout.GetType().Name, readout.HelpString);
+                }
+                handler.Save("HelpStrings.xml");
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        //#region Instance
+
+        //private static readonly ReadoutLibrary instance = new ReadoutLibrary();
+
+        ///// <summary>
+        /////     Gets the current instance of the readout library.
+        ///// </summary>
+        //public static ReadoutLibrary Instance
+        //{
+        //    get { return instance; }
+        //}
+
+        //#endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/AltitudeSeaLevel.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/AltitudeSeaLevel.cs
@@ -1,58 +1,58 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Rendezvous

-{

-    public class AltitudeSeaLevel : ReadoutModule

-    {

-        public AltitudeSeaLevel()

-        {

-            this.Name = "Altitude (Sea Level)";

-            this.Category = ReadoutCategory.Rendezvous;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            RendezvousProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (!RendezvousProcessor.ShowDetails)

-            {

-                return;

-            }

-

-            this.DrawLine(RendezvousProcessor.AltitudeSeaLevel.ToDistance());

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class AltitudeSeaLevel : ReadoutModule
+    {
+        public AltitudeSeaLevel()
+        {
+            this.Name = "Altitude (Sea Level)";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (!RendezvousProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(RendezvousProcessor.AltitudeSeaLevel.ToDistance());
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/AngleToAscendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/AngleToAscendingNode.cs
@@ -1,58 +1,58 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Rendezvous

-{

-    public class AngleToAscendingNode : ReadoutModule

-    {

-        public AngleToAscendingNode()

-        {

-            this.Name = "Angle to AN";

-            this.Category = ReadoutCategory.Rendezvous;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            RendezvousProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (!RendezvousProcessor.ShowDetails)

-            {

-                return;

-            }

-

-            this.DrawLine(RendezvousProcessor.AngleToAscendingNode.ToAngle());

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class AngleToAscendingNode : ReadoutModule
+    {
+        public AngleToAscendingNode()
+        {
+            this.Name = "Angle to AN";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (!RendezvousProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(RendezvousProcessor.AngleToAscendingNode.ToAngle());
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/AngleToDescendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/AngleToDescendingNode.cs
@@ -1,58 +1,58 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Rendezvous

-{

-    public class AngleToDescendingNode : ReadoutModule

-    {

-        public AngleToDescendingNode()

-        {

-            this.Name = "Angle to DN";

-            this.Category = ReadoutCategory.Rendezvous;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            RendezvousProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (!RendezvousProcessor.ShowDetails)

-            {

-                return;

-            }

-

-            this.DrawLine(RendezvousProcessor.AngleToDescendingNode.ToAngle());

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class AngleToDescendingNode : ReadoutModule
+    {
+        public AngleToDescendingNode()
+        {
+            this.Name = "Angle to DN";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (!RendezvousProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(RendezvousProcessor.AngleToDescendingNode.ToAngle());
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/ApoapsisHeight.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/ApoapsisHeight.cs
@@ -1,58 +1,58 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Rendezvous

-{

-    public class ApoapsisHeight : ReadoutModule

-    {

-        public ApoapsisHeight()

-        {

-            this.Name = "Apoapsis Height";

-            this.Category = ReadoutCategory.Rendezvous;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            RendezvousProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (!RendezvousProcessor.ShowDetails)

-            {

-                return;

-            }

-

-            this.DrawLine(RendezvousProcessor.ApoapsisHeight.ToDistance());

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class ApoapsisHeight : ReadoutModule
+    {
+        public ApoapsisHeight()
+        {
+            this.Name = "Apoapsis Height";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (!RendezvousProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(RendezvousProcessor.ApoapsisHeight.ToDistance());
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/Distance.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/Distance.cs
@@ -1,58 +1,58 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Rendezvous

-{

-    public class Distance : ReadoutModule

-    {

-        public Distance()

-        {

-            this.Name = "Distance";

-            this.Category = ReadoutCategory.Rendezvous;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            RendezvousProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (!RendezvousProcessor.ShowDetails)

-            {

-                return;

-            }

-

-            this.DrawLine(RendezvousProcessor.Distance.ToDistance());

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class Distance : ReadoutModule
+    {
+        public Distance()
+        {
+            this.Name = "Distance";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (!RendezvousProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(RendezvousProcessor.Distance.ToDistance());
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/InterceptAngle.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/InterceptAngle.cs
@@ -1,58 +1,58 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Rendezvous

-{

-    public class InterceptAngle : ReadoutModule

-    {

-        public InterceptAngle()

-        {

-            this.Name = "Intercept Angle";

-            this.Category = ReadoutCategory.Rendezvous;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            RendezvousProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (!RendezvousProcessor.ShowDetails)

-            {

-                return;

-            }

-

-            this.DrawLine(RendezvousProcessor.InterceptAngle.ToAngle());

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class InterceptAngle : ReadoutModule
+    {
+        public InterceptAngle()
+        {
+            this.Name = "Intercept Angle";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (!RendezvousProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(RendezvousProcessor.InterceptAngle.ToAngle());
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/OrbitalPeriod.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/OrbitalPeriod.cs
@@ -1,58 +1,58 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Rendezvous

-{

-    public class OrbitalPeriod : ReadoutModule

-    {

-        public OrbitalPeriod()

-        {

-            this.Name = "Orbital Period";

-            this.Category = ReadoutCategory.Rendezvous;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            RendezvousProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (!RendezvousProcessor.ShowDetails)

-            {

-                return;

-            }

-

-            this.DrawLine(RendezvousProcessor.OrbitalPeriod.ToTime("F3"));

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class OrbitalPeriod : ReadoutModule
+    {
+        public OrbitalPeriod()
+        {
+            this.Name = "Orbital Period";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (!RendezvousProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(RendezvousProcessor.OrbitalPeriod.ToTime("F3"));
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/PeriapsisHeight.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/PeriapsisHeight.cs
@@ -1,58 +1,58 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Rendezvous

-{

-    public class PeriapsisHeight : ReadoutModule

-    {

-        public PeriapsisHeight()

-        {

-            this.Name = "Periapsis Height";

-            this.Category = ReadoutCategory.Rendezvous;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            RendezvousProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (!RendezvousProcessor.ShowDetails)

-            {

-                return;

-            }

-

-            this.DrawLine(RendezvousProcessor.PeriapsisHeight.ToDistance());

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class PeriapsisHeight : ReadoutModule
+    {
+        public PeriapsisHeight()
+        {
+            this.Name = "Periapsis Height";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (!RendezvousProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(RendezvousProcessor.PeriapsisHeight.ToDistance());
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/PhaseAngle.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/PhaseAngle.cs
@@ -1,58 +1,58 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Rendezvous

-{

-    public class PhaseAngle : ReadoutModule

-    {

-        public PhaseAngle()

-        {

-            this.Name = "Phase Angle";

-            this.Category = ReadoutCategory.Rendezvous;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            RendezvousProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (!RendezvousProcessor.ShowDetails)

-            {

-                return;

-            }

-

-            this.DrawLine(RendezvousProcessor.PhaseAngle.ToAngle());

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class PhaseAngle : ReadoutModule
+    {
+        public PhaseAngle()
+        {
+            this.Name = "Phase Angle";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (!RendezvousProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(RendezvousProcessor.PhaseAngle.ToAngle());
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/RelativeInclination.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/RelativeInclination.cs
@@ -1,58 +1,58 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Rendezvous

-{

-    public class RelativeInclination : ReadoutModule

-    {

-        public RelativeInclination()

-        {

-            this.Name = "Relative Inclination";

-            this.Category = ReadoutCategory.Rendezvous;

-            this.HelpString = "Shows the relative inclination between your vessel and the target object.";

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            RendezvousProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (!RendezvousProcessor.ShowDetails)

-            {

-                return;

-            }

-

-            this.DrawLine(RendezvousProcessor.RelativeInclination.ToAngle());

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class RelativeInclination : ReadoutModule
+    {
+        public RelativeInclination()
+        {
+            this.Name = "Relative Inclination";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = "Shows the relative inclination between your vessel and the target object.";
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (!RendezvousProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(RendezvousProcessor.RelativeInclination.ToAngle());
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/TargetSelector.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/TargetSelector.cs
@@ -1,365 +1,365 @@
-// 

-//     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 UnityEngine;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Rendezvous

-{

-    public class TargetSelector : ReadoutModule

-    {

-        #region Fields

-

-        private float typeButtonWidth;

-        private string searchQuery = string.Empty;

-        private string searchText = string.Empty;

-        private int targetCount;

-        private ITargetable targetObject;

-        private bool typeIsBody;

-        private bool usingSearch;

-        private VesselType vesselType = VesselType.Unknown;

-

-        #endregion

-

-        #region Initialisation

-

-        public TargetSelector()

-        {

-            this.Name = "Target Selector";

-            this.Category = ReadoutCategory.Rendezvous;

-            this.HelpString = "A tool to allow easy browsing, searching and selection of targets.";

-            this.IsDefault = true;

-        }

-

-        #endregion

-

-        #region Drawing

-

-        /// <summary>

-        ///     Draws the target selector structure.

-        /// </summary>

-        public override void Draw()

-        {

-            if (FlightGlobals.fetch.VesselTarget == null)

-            {

-                if (this.vesselType == VesselType.Unknown && !this.typeIsBody)

-                {

-                    this.DrawSearch();

-                    if (this.searchQuery.Length == 0)

-                    {

-                        this.DrawTypes();

-                    }

-                    else

-                    {

-                        this.DrawTargetList();

-                    }

-                }

-                else

-                {

-                    this.DrawBackToTypes();

-                    this.DrawTargetList();

-                }

-            }

-            else

-            {

-                this.DrawTarget();

-            }

-

-            if (this.targetObject != FlightGlobals.fetch.VesselTarget)

-            {

-                this.targetObject = FlightGlobals.fetch.VesselTarget;

-                this.ResizeRequested = true;

-            }

-        }

-

-        /// <summary>

-        ///     Draws the search bar.

-        /// </summary>

-        private void DrawSearch()

-        {

-            GUILayout.BeginHorizontal();

-            GUILayout.Label("SEARCH:", this.FlexiLabelStyle, GUILayout.Width(60.0f * GuiDisplaySize.Offset));

-

-            this.searchText = GUILayout.TextField(this.searchText, this.TextFieldStyle);

-

-            if (this.searchText.Length > 0 || this.searchQuery.Length > 0)

-            {

-                this.searchQuery = this.searchText.ToLower();

-

-                if (!this.usingSearch)

-                {

-                    this.usingSearch = true;

-                    this.ResizeRequested = true;

-                }

-            }

-            else if (this.usingSearch)

-            {

-                this.usingSearch = false;

-            }

-

-            GUILayout.EndHorizontal();

-        }

-

-        /// <summary>

-        ///     Draws the button list of target types.

-        /// </summary>

-        private void DrawTypes()

-        {

-            this.typeButtonWidth = Mathf.Round(this.ContentWidth * 0.5f);

-

-            GUILayout.BeginHorizontal();

-            if (GUILayout.Button("Celestial Bodies", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))

-            {

-                this.SetTypeAsBody();

-            }

-            if (GUILayout.Button("Debris", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))

-            {

-                this.SetTypeAs(VesselType.Debris);

-            }

-            GUILayout.EndHorizontal();

-

-            GUILayout.BeginHorizontal();

-            if (GUILayout.Button("Probes", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))

-            {

-                this.SetTypeAs(VesselType.Probe);

-            }

-

-            if (GUILayout.Button("Rovers", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))

-            {

-                this.SetTypeAs(VesselType.Rover);

-            }

-            GUILayout.EndHorizontal();

-

-            GUILayout.BeginHorizontal();

-            if (GUILayout.Button("Landers", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))

-            {

-                this.SetTypeAs(VesselType.Lander);

-            }

-            if (GUILayout.Button("Ships", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))

-            {

-                this.SetTypeAs(VesselType.Ship);

-            }

-            GUILayout.EndHorizontal();

-

-            GUILayout.BeginHorizontal();

-            if (GUILayout.Button("Stations", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))

-            {

-                this.SetTypeAs(VesselType.Station);

-            }

-            if (GUILayout.Button("Bases", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))

-            {

-                this.SetTypeAs(VesselType.Base);

-            }

-            GUILayout.EndHorizontal();

-

-            GUILayout.BeginHorizontal();

-            if (GUILayout.Button("EVAs", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))

-            {

-                this.SetTypeAs(VesselType.EVA);

-            }

-            if (GUILayout.Button("Flags", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))

-            {

-                this.SetTypeAs(VesselType.Flag);

-            }

-            GUILayout.EndHorizontal();

-        }

-

-        /// <summary>

-        ///     Draws the target information when selected.

-        /// </summary>

-        private void DrawTarget()

-        {

-            if (GUILayout.Button("Go Back to Target Selection", this.ButtonStyle, GUILayout.Width(this.ContentWidth)))

-            {

-                FlightGlobals.fetch.SetVesselTarget(null);

-                this.ResizeRequested = true;

-            }

-

-            GUILayout.Space(3f);

-

-            this.DrawLine("Selected Target", FlightGlobals.fetch.VesselTarget.GetName());

-        }

-

-        /// <summary>

-        ///     Draws the back to types button.

-        /// </summary>

-        private void DrawBackToTypes()

-        {

-            if (GUILayout.Button("Go Back to Type Selection", this.ButtonStyle, GUILayout.Width(this.ContentWidth)))

-            {

-                this.typeIsBody = false;

-                this.vesselType = VesselType.Unknown;

-                this.ResizeRequested = true;

-            }

-

-            GUILayout.Space(3f);

-        }

-

-        /// <summary>

-        ///     Draws the target list.

-        /// </summary>

-        private void DrawTargetList()

-        {

-            var count = 0;

-

-            if (this.searchQuery.Length == 0)

-            {

-                if (this.typeIsBody)

-                {

-                    count += this.DrawMoons();

-                    count += this.DrawPlanets();

-                }

-                else

-                {

-                    count += this.DrawVessels();

-                }

-            }

-            else

-            {

-                count += this.DrawVessels();

-                count += this.DrawMoons();

-                count += this.DrawPlanets();

-            }

-

-            if (count == 0)

-            {

-                this.DrawMessageLine("No targets found!");

-            }

-

-            if (count != this.targetCount)

-            {

-                this.targetCount = count;

-                this.ResizeRequested = true;

-            }

-        }

-

-        /// <summary>

-        ///     Draws targetable moons.

-        /// </summary>

-        private int DrawMoons()

-        {

-            var count = 0;

-

-            foreach (var body in FlightGlobals.Bodies)

-            {

-                if (FlightGlobals.ActiveVessel.mainBody != body.referenceBody || body == Planetarium.fetch.Sun)

-                {

-                    continue;

-                }

-

-                if (this.searchQuery.Length > 0 && !body.bodyName.ToLower().Contains(this.searchQuery))

-                {

-                    continue;

-                }

-

-                count++;

-                if (GUILayout.Button(body.bodyName, this.ButtonStyle, GUILayout.Width(this.ContentWidth)))

-                {

-                    this.SetTargetAs(body);

-                }

-            }

-            return count;

-        }

-

-        /// <summary>

-        ///     Draws the targetable planets.

-        /// </summary>

-        private int DrawPlanets()

-        {

-            var count = 0;

-            foreach (var body in FlightGlobals.Bodies)

-            {

-                if (FlightGlobals.ActiveVessel.mainBody.referenceBody != body.referenceBody || body == Planetarium.fetch.Sun || body == FlightGlobals.ActiveVessel.mainBody)

-                {

-                    continue;

-                }

-

-                if (this.searchQuery.Length > 0 && !body.bodyName.ToLower().Contains(this.searchQuery))

-                {

-                    continue;

-                }

-

-                count++;

-                if (GUILayout.Button(body.GetName(), this.ButtonStyle, GUILayout.Width(this.ContentWidth)))

-                {

-                    this.SetTargetAs(body);

-                }

-            }

-            return count;

-        }

-

-        /// <summary>

-        ///     Draws targetable vessels.

-        /// </summary>

-        private int DrawVessels()

-        {

-            var count = 0;

-            foreach (var vessel in FlightGlobals.Vessels)

-            {

-                if (vessel == FlightGlobals.ActiveVessel || (this.searchQuery.Length == 0 && vessel.vesselType != this.vesselType))

-                {

-                    continue;

-                }

-

-                if (this.searchQuery.Length == 0)

-                {

-                    count++;

-

-                    if (GUILayout.Button(vessel.GetName(), this.ButtonStyle, GUILayout.Width(this.ContentWidth)))

-                    {

-                        this.SetTargetAs(vessel);

-                    }

-                }

-                else if (vessel.vesselName.ToLower().Contains(this.searchQuery))

-                {

-                    count++;

-                    if (GUILayout.Button(vessel.GetName(), this.ButtonStyle, GUILayout.Width(this.ContentWidth)))

-                    {

-                        this.SetTargetAs(vessel);

-                    }

-                }

-            }

-            return count;

-        }

-

-        private void SetTypeAs(VesselType vesselType)

-        {

-            this.vesselType = vesselType;

-            this.ResizeRequested = true;

-        }

-

-        private void SetTypeAsBody()

-        {

-            this.typeIsBody = true;

-            this.ResizeRequested = true;

-        }

-

-        private void SetTargetAs(ITargetable target)

-        {

-            FlightGlobals.fetch.SetVesselTarget(target);

-            this.targetObject = target;

-            this.ResizeRequested = true;

-        }

-

-        #endregion

-    }

+// 
+//     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 UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class TargetSelector : ReadoutModule
+    {
+        #region Fields
+
+        private float typeButtonWidth;
+        private string searchQuery = string.Empty;
+        private string searchText = string.Empty;
+        private int targetCount;
+        private ITargetable targetObject;
+        private bool typeIsBody;
+        private bool usingSearch;
+        private VesselType vesselType = VesselType.Unknown;
+
+        #endregion
+
+        #region Initialisation
+
+        public TargetSelector()
+        {
+            this.Name = "Target Selector";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = "A tool to allow easy browsing, searching and selection of targets.";
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Drawing
+
+        /// <summary>
+        ///     Draws the target selector structure.
+        /// </summary>
+        public override void Draw()
+        {
+            if (FlightGlobals.fetch.VesselTarget == null)
+            {
+                if (this.vesselType == VesselType.Unknown && !this.typeIsBody)
+                {
+                    this.DrawSearch();
+                    if (this.searchQuery.Length == 0)
+                    {
+                        this.DrawTypes();
+                    }
+                    else
+                    {
+                        this.DrawTargetList();
+                    }
+                }
+                else
+                {
+                    this.DrawBackToTypes();
+                    this.DrawTargetList();
+                }
+            }
+            else
+            {
+                this.DrawTarget();
+            }
+
+            if (this.targetObject != FlightGlobals.fetch.VesselTarget)
+            {
+                this.targetObject = FlightGlobals.fetch.VesselTarget;
+                this.ResizeRequested = true;
+            }
+        }
+
+        /// <summary>
+        ///     Draws the search bar.
+        /// </summary>
+        private void DrawSearch()
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("SEARCH:", this.FlexiLabelStyle, GUILayout.Width(60.0f * GuiDisplaySize.Offset));
+
+            this.searchText = GUILayout.TextField(this.searchText, this.TextFieldStyle);
+
+            if (this.searchText.Length > 0 || this.searchQuery.Length > 0)
+            {
+                this.searchQuery = this.searchText.ToLower();
+
+                if (!this.usingSearch)
+                {
+                    this.usingSearch = true;
+                    this.ResizeRequested = true;
+                }
+            }
+            else if (this.usingSearch)
+            {
+                this.usingSearch = false;
+            }
+
+            GUILayout.EndHorizontal();
+        }
+
+        /// <summary>
+        ///     Draws the button list of target types.
+        /// </summary>
+        private void DrawTypes()
+        {
+            this.typeButtonWidth = Mathf.Round(this.ContentWidth * 0.5f);
+
+            GUILayout.BeginHorizontal();
+            if (GUILayout.Button("Celestial Bodies", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAsBody();
+            }
+            if (GUILayout.Button("Debris", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Debris);
+            }
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            if (GUILayout.Button("Probes", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Probe);
+            }
+
+            if (GUILayout.Button("Rovers", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Rover);
+            }
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            if (GUILayout.Button("Landers", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Lander);
+            }
+            if (GUILayout.Button("Ships", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Ship);
+            }
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            if (GUILayout.Button("Stations", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Station);
+            }
+            if (GUILayout.Button("Bases", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Base);
+            }
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            if (GUILayout.Button("EVAs", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.EVA);
+            }
+            if (GUILayout.Button("Flags", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Flag);
+            }
+            GUILayout.EndHorizontal();
+        }
+
+        /// <summary>
+        ///     Draws the target information when selected.
+        /// </summary>
+        private void DrawTarget()
+        {
+            if (GUILayout.Button("Go Back to Target Selection", this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
+            {
+                FlightGlobals.fetch.SetVesselTarget(null);
+                this.ResizeRequested = true;
+            }
+
+            GUILayout.Space(3f);
+
+            this.DrawLine("Selected Target", FlightGlobals.fetch.VesselTarget.GetName());
+        }
+
+        /// <summary>
+        ///     Draws the back to types button.
+        /// </summary>
+        private void DrawBackToTypes()
+        {
+            if (GUILayout.Button("Go Back to Type Selection", this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
+            {
+                this.typeIsBody = false;
+                this.vesselType = VesselType.Unknown;
+                this.ResizeRequested = true;
+            }
+
+            GUILayout.Space(3f);
+        }
+
+        /// <summary>
+        ///     Draws the target list.
+        /// </summary>
+        private void DrawTargetList()
+        {
+            var count = 0;
+
+            if (this.searchQuery.Length == 0)
+            {
+                if (this.typeIsBody)
+                {
+                    count += this.DrawMoons();
+                    count += this.DrawPlanets();
+                }
+                else
+                {
+                    count += this.DrawVessels();
+                }
+            }
+            else
+            {
+                count += this.DrawVessels();
+                count += this.DrawMoons();
+                count += this.DrawPlanets();
+            }
+
+            if (count == 0)
+            {
+                this.DrawMessageLine("No targets found!");
+            }
+
+            if (count != this.targetCount)
+            {
+                this.targetCount = count;
+                this.ResizeRequested = true;
+            }
+        }
+
+        /// <summary>
+        ///     Draws targetable moons.
+        /// </summary>
+        private int DrawMoons()
+        {
+            var count = 0;
+
+            foreach (var body in FlightGlobals.Bodies)
+            {
+                if (FlightGlobals.ActiveVessel.mainBody != body.referenceBody || body == Planetarium.fetch.Sun)
+                {
+                    continue;
+                }
+
+                if (this.searchQuery.Length > 0 && !body.bodyName.ToLower().Contains(this.searchQuery))
+                {
+                    continue;
+                }
+
+                count++;
+                if (GUILayout.Button(body.bodyName, this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
+                {
+                    this.SetTargetAs(body);
+                }
+            }
+            return count;
+        }
+
+        /// <summary>
+        ///     Draws the targetable planets.
+        /// </summary>
+        private int DrawPlanets()
+        {
+            var count = 0;
+            foreach (var body in FlightGlobals.Bodies)
+            {
+                if (FlightGlobals.ActiveVessel.mainBody.referenceBody != body.referenceBody || body == Planetarium.fetch.Sun || body == FlightGlobals.ActiveVessel.mainBody)
+                {
+                    continue;
+                }
+
+                if (this.searchQuery.Length > 0 && !body.bodyName.ToLower().Contains(this.searchQuery))
+                {
+                    continue;
+                }
+
+                count++;
+                if (GUILayout.Button(body.GetName(), this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
+                {
+                    this.SetTargetAs(body);
+                }
+            }
+            return count;
+        }
+
+        /// <summary>
+        ///     Draws targetable vessels.
+        /// </summary>
+        private int DrawVessels()
+        {
+            var count = 0;
+            foreach (var vessel in FlightGlobals.Vessels)
+            {
+                if (vessel == FlightGlobals.ActiveVessel || (this.searchQuery.Length == 0 && vessel.vesselType != this.vesselType))
+                {
+                    continue;
+                }
+
+                if (this.searchQuery.Length == 0)
+                {
+                    count++;
+
+                    if (GUILayout.Button(vessel.GetName(), this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
+                    {
+                        this.SetTargetAs(vessel);
+                    }
+                }
+                else if (vessel.vesselName.ToLower().Contains(this.searchQuery))
+                {
+                    count++;
+                    if (GUILayout.Button(vessel.GetName(), this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
+                    {
+                        this.SetTargetAs(vessel);
+                    }
+                }
+            }
+            return count;
+        }
+
+        private void SetTypeAs(VesselType vesselType)
+        {
+            this.vesselType = vesselType;
+            this.ResizeRequested = true;
+        }
+
+        private void SetTypeAsBody()
+        {
+            this.typeIsBody = true;
+            this.ResizeRequested = true;
+        }
+
+        private void SetTargetAs(ITargetable target)
+        {
+            FlightGlobals.fetch.SetVesselTarget(target);
+            this.targetObject = target;
+            this.ResizeRequested = true;
+        }
+
+        #endregion
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToApoapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToApoapsis.cs
@@ -1,58 +1,58 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Rendezvous

-{

-    public class TimeToApoapsis : ReadoutModule

-    {

-        public TimeToApoapsis()

-        {

-            this.Name = "Time to Apoapsis";

-            this.Category = ReadoutCategory.Rendezvous;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            RendezvousProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (!RendezvousProcessor.ShowDetails)

-            {

-                return;

-            }

-

-            this.DrawLine(RendezvousProcessor.TimeToApoapsis.ToTime());

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class TimeToApoapsis : ReadoutModule
+    {
+        public TimeToApoapsis()
+        {
+            this.Name = "Time to Apoapsis";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (!RendezvousProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(RendezvousProcessor.TimeToApoapsis.ToTime());
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToPeriapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToPeriapsis.cs
@@ -1,58 +1,58 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Rendezvous

-{

-    public class TimeToPeriapsis : ReadoutModule

-    {

-        public TimeToPeriapsis()

-        {

-            this.Name = "Time to Periapsis";

-            this.Category = ReadoutCategory.Rendezvous;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            RendezvousProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (!RendezvousProcessor.ShowDetails)

-            {

-                return;

-            }

-

-            this.DrawLine(RendezvousProcessor.TimeToPeriapsis.ToTime());

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class TimeToPeriapsis : ReadoutModule
+    {
+        public TimeToPeriapsis()
+        {
+            this.Name = "Time to Periapsis";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (!RendezvousProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(RendezvousProcessor.TimeToPeriapsis.ToTime());
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/AltitudeSeaLevel.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/AltitudeSeaLevel.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class AltitudeSeaLevel : ReadoutModule

-    {

-        public AltitudeSeaLevel()

-        {

-            this.Name = "Altitude (Sea Level)";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = "Shows the vessel's altitude above sea level.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(FlightGlobals.ship_altitude.ToDistance());

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class AltitudeSeaLevel : ReadoutModule
+    {
+        public AltitudeSeaLevel()
+        {
+            this.Name = "Altitude (Sea Level)";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = "Shows the vessel's altitude above sea level.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(FlightGlobals.ship_altitude.ToDistance());
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/AltitudeTerrain.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/AltitudeTerrain.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class AltitudeTerrain : ReadoutModule

-    {

-        public AltitudeTerrain()

-        {

-            this.Name = "Altitude (Terrain)";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = "Shows the vessel's altitude above the terrain.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine((FlightGlobals.ship_altitude - FlightGlobals.ActiveVessel.terrainAltitude).ToDistance());

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class AltitudeTerrain : ReadoutModule
+    {
+        public AltitudeTerrain()
+        {
+            this.Name = "Altitude (Terrain)";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = "Shows the vessel's altitude above the terrain.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine((FlightGlobals.ship_altitude - FlightGlobals.ActiveVessel.terrainAltitude).ToDistance());
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/AtmosphericEfficiency.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/AtmosphericEfficiency.cs
@@ -1,58 +1,58 @@
-// 

-//     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/>.

-// 

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class AtmosphericEfficiency : ReadoutModule

-    {

-        private bool showing;

-

-        public AtmosphericEfficiency()

-        {

-            this.Name = "Atmos. Efficiency";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = "Shows you vessel's efficiency as a ratio of the current velocity and terminal velocity.  Less than 1 means that you are losing efficiency due to gravity and greater than 1 is due to drag.";

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            AtmosphericProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (AtmosphericProcessor.ShowDetails)

-            {

-                this.showing = true;

-                this.DrawLine(AtmosphericProcessor.Efficiency.ToString("F2"));

-            }

-            else if (this.showing)

-            {

-                this.showing = false;

-                this.ResizeRequested = true;

-            }

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(AtmosphericProcessor.Instance);

-        }

-    }

+// 
+//     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/>.
+// 
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class AtmosphericEfficiency : ReadoutModule
+    {
+        private bool showing;
+
+        public AtmosphericEfficiency()
+        {
+            this.Name = "Atmos. Efficiency";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = "Shows you vessel's efficiency as a ratio of the current velocity and terminal velocity.  Less than 1 means that you are losing efficiency due to gravity and greater than 1 is due to drag.";
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            AtmosphericProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (AtmosphericProcessor.ShowDetails)
+            {
+                this.showing = true;
+                this.DrawLine(AtmosphericProcessor.Efficiency.ToString("F2"));
+            }
+            else if (this.showing)
+            {
+                this.showing = false;
+                this.ResizeRequested = true;
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(AtmosphericProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/Biome.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/Biome.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class Biome : ReadoutModule

-    {

-        public Biome()

-        {

-            this.Name = "Biome";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = "Shows the biome which the vessel is currently flying over.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(ScienceUtil.GetExperimentBiome(FlightGlobals.ActiveVessel.mainBody, FlightGlobals.ActiveVessel.latitude, FlightGlobals.ActiveVessel.longitude));

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class Biome : ReadoutModule
+    {
+        public Biome()
+        {
+            this.Name = "Biome";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = "Shows the biome which the vessel is currently flying over.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(ScienceUtil.GetExperimentBiome(FlightGlobals.ActiveVessel.mainBody, FlightGlobals.ActiveVessel.latitude, FlightGlobals.ActiveVessel.longitude));
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/GeeForce.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/GeeForce.cs
@@ -1,48 +1,48 @@
-// 

-//     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/>.

-// 

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class GeeForce : ReadoutModule

-    {

-        private double maxGeeForce;

-

-        public GeeForce()

-        {

-            this.Name = "G-Force";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = "Shows the current g-force and maximum g-force experienced.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            if (FlightGlobals.ship_geeForce > this.maxGeeForce)

-            {

-                this.maxGeeForce = FlightGlobals.ship_geeForce;

-            }

-            this.DrawLine(FlightGlobals.ship_geeForce.ToString("F3") + " / " + this.maxGeeForce.ToString("F3"));

-        }

-

-        public override void Reset()

-        {

-            this.maxGeeForce = 0;

-        }

-    }

+// 
+//     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/>.
+// 
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class GeeForce : ReadoutModule
+    {
+        private double maxGeeForce;
+
+        public GeeForce()
+        {
+            this.Name = "G-Force";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = "Shows the current g-force and maximum g-force experienced.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            if (FlightGlobals.ship_geeForce > this.maxGeeForce)
+            {
+                this.maxGeeForce = FlightGlobals.ship_geeForce;
+            }
+            this.DrawLine(FlightGlobals.ship_geeForce.ToString("F3") + " / " + this.maxGeeForce.ToString("F3"));
+        }
+
+        public override void Reset()
+        {
+            this.maxGeeForce = 0;
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/HorizontalSpeed.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/HorizontalSpeed.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class HorizontalSpeed : ReadoutModule

-    {

-        public HorizontalSpeed()

-        {

-            this.Name = "Horizontal Speed";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = "Shows the vessel's horizontal speed across a celestial bodies surface.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(FlightGlobals.ActiveVessel.horizontalSrfSpeed.ToSpeed());

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class HorizontalSpeed : ReadoutModule
+    {
+        public HorizontalSpeed()
+        {
+            this.Name = "Horizontal Speed";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = "Shows the vessel's horizontal speed across a celestial bodies surface.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(FlightGlobals.ActiveVessel.horizontalSrfSpeed.ToSpeed());
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/ImpactAltitude.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/ImpactAltitude.cs
@@ -32,7 +32,7 @@
         public ImpactAltitude()
         {
             this.Name = "Impact Altitude";
-            this.Category = ReadoutCategory.Surface;
+            this.Category = ReadoutCategory.GetCategory("Surface");
             this.HelpString = string.Empty;
             this.IsDefault = true;
         }

--- a/KerbalEngineer/Flight/Readouts/Surface/ImpactBiome.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/ImpactBiome.cs
@@ -1,64 +1,64 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class ImpactBiome : ReadoutModule

-    {

-        private bool showing;

-

-        public ImpactBiome()

-        {

-            this.Name = "Impact Biome";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            ImpactProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (ImpactProcessor.ShowDetails)

-            {

-                this.showing = true;

-                this.DrawLine(ImpactProcessor.Biome);

-            }

-            else if (this.showing)

-            {

-                this.showing = false;

-                this.ResizeRequested = true;

-            }

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(ImpactProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class ImpactBiome : ReadoutModule
+    {
+        private bool showing;
+
+        public ImpactBiome()
+        {
+            this.Name = "Impact Biome";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            ImpactProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (ImpactProcessor.ShowDetails)
+            {
+                this.showing = true;
+                this.DrawLine(ImpactProcessor.Biome);
+            }
+            else if (this.showing)
+            {
+                this.showing = false;
+                this.ResizeRequested = true;
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(ImpactProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/ImpactLatitude.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/ImpactLatitude.cs
@@ -1,64 +1,64 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class ImpactLatitude : ReadoutModule

-    {

-        private bool showing;

-

-        public ImpactLatitude()

-        {

-            this.Name = "Impact Latitude";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            ImpactProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (ImpactProcessor.ShowDetails)

-            {

-                this.showing = true;

-                this.DrawLine(ImpactProcessor.Latitude.ToAngle());

-            }

-            else if (this.showing)

-            {

-                this.showing = false;

-                this.ResizeRequested = true;

-            }

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(ImpactProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class ImpactLatitude : ReadoutModule
+    {
+        private bool showing;
+
+        public ImpactLatitude()
+        {
+            this.Name = "Impact Latitude";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            ImpactProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (ImpactProcessor.ShowDetails)
+            {
+                this.showing = true;
+                this.DrawLine(ImpactProcessor.Latitude.ToAngle());
+            }
+            else if (this.showing)
+            {
+                this.showing = false;
+                this.ResizeRequested = true;
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(ImpactProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/ImpactLongitude.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/ImpactLongitude.cs
@@ -1,64 +1,64 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class ImpactLongitude : ReadoutModule

-    {

-        private bool showing;

-

-        public ImpactLongitude()

-        {

-            this.Name = "Impact Longitude";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            ImpactProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (ImpactProcessor.ShowDetails)

-            {

-                this.showing = true;

-                this.DrawLine(ImpactProcessor.Longitude.ToAngle());

-            }

-            else if (this.showing)

-            {

-                this.showing = false;

-                this.ResizeRequested = true;

-            }

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(ImpactProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class ImpactLongitude : ReadoutModule
+    {
+        private bool showing;
+
+        public ImpactLongitude()
+        {
+            this.Name = "Impact Longitude";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            ImpactProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (ImpactProcessor.ShowDetails)
+            {
+                this.showing = true;
+                this.DrawLine(ImpactProcessor.Longitude.ToAngle());
+            }
+            else if (this.showing)
+            {
+                this.showing = false;
+                this.ResizeRequested = true;
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(ImpactProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/ImpactTime.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/ImpactTime.cs
@@ -1,64 +1,64 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class ImpactTime : ReadoutModule

-    {

-        private bool showing;

-

-        public ImpactTime()

-        {

-            this.Name = "Impact Time";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            ImpactProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (ImpactProcessor.ShowDetails)

-            {

-                this.showing = true;

-                this.DrawLine(ImpactProcessor.Time.ToTime());

-            }

-            else if (this.showing)

-            {

-                this.showing = false;

-                this.ResizeRequested = true;

-            }

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(ImpactProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class ImpactTime : ReadoutModule
+    {
+        private bool showing;
+
+        public ImpactTime()
+        {
+            this.Name = "Impact Time";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            ImpactProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (ImpactProcessor.ShowDetails)
+            {
+                this.showing = true;
+                this.DrawLine(ImpactProcessor.Time.ToTime());
+            }
+            else if (this.showing)
+            {
+                this.showing = false;
+                this.ResizeRequested = true;
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(ImpactProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/Latitude.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/Latitude.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class Latitude : ReadoutModule

-    {

-        public Latitude()

-        {

-            this.Name = "Latitude";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = "Shows the vessel's latitude position around the celestial body.  Latitude is the angle from the equator to poles.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(FlightGlobals.ship_latitude.ToAngle());

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class Latitude : ReadoutModule
+    {
+        public Latitude()
+        {
+            this.Name = "Latitude";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = "Shows the vessel's latitude position around the celestial body.  Latitude is the angle from the equator to poles.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(FlightGlobals.ship_latitude.ToAngle());
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/Longitude.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/Longitude.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class Longitude : ReadoutModule

-    {

-        public Longitude()

-        {

-            this.Name = "Longitude";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = "Shows the vessel's longitude around a celestial body.  Longitude is the angle from the bodies prime meridian.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(FlightGlobals.ship_longitude.ToAngle());

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class Longitude : ReadoutModule
+    {
+        public Longitude()
+        {
+            this.Name = "Longitude";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = "Shows the vessel's longitude around a celestial body.  Longitude is the angle from the bodies prime meridian.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(FlightGlobals.ship_longitude.ToAngle());
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/Slope.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/Slope.cs
@@ -1,99 +1,99 @@
-// 

-//     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.Extensions;

-

-using UnityEngine;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class Slope : ReadoutModule

-    {

-        public Slope()

-        {

-            this.Name = "Slope";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = "Shows the slope of the terrain below your vessel.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(this.GetSlopeAngleAndHeading());

-        }

-

-        private string GetSlopeAngleAndHeading()

-        {

-            try

-            {

-                var result = "--° @ ---°";

-                var mainBody = FlightGlobals.ActiveVessel.mainBody;

-                var rad = (FlightGlobals.ActiveVessel.CoM - mainBody.position).normalized;

-                RaycastHit hit;

-                if (Physics.Raycast(FlightGlobals.ActiveVessel.CoM, -rad, out hit, Mathf.Infinity, 1 << 15)) // Just "Local Scenery" please

-                {

-                    var norm = hit.normal;

-                    norm = norm.normalized;

-                    var raddotnorm = Vector3d.Dot(rad, norm);

-                    if (raddotnorm > 1.0)

-                    {

-                        raddotnorm = 1.0;

-                    }

-                    else if (raddotnorm < 0.0)

-                    {

-                        raddotnorm = 0.0;

-                    }

-                    var slope = Math.Acos(raddotnorm) * 180 / Math.PI;

-                    result = slope.ToAngle("F1");

-                    if (slope < 0.05)

-                    {

-                        result += " @ ---°";

-                    }

-                    else

-                    {

-                        var side = Vector3d.Cross(rad, norm).normalized;

-                        var east = Vector3d.Cross(rad, Vector3d.up).normalized;

-                        var north = Vector3d.Cross(rad, east).normalized;

-                        var sidedoteast = Vector3d.Dot(side, east);

-                        var direction = Math.Acos(sidedoteast) * 180 / Math.PI;

-                        var sidedotnorth = Vector3d.Dot(side, north);

-                        if (sidedotnorth < 0)

-                        {

-                            direction = 360 - direction;

-                        }

-                        result += " @ " + direction.ToAngle("F0");

-                    }

-                }

-

-                return result;

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "Surface->Slope->GetSlopeAngleAndHeading");

-                return "--° @ ---°";

-            }

-        }

-    }

+// 
+//     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.Extensions;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class Slope : ReadoutModule
+    {
+        public Slope()
+        {
+            this.Name = "Slope";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = "Shows the slope of the terrain below your vessel.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(this.GetSlopeAngleAndHeading());
+        }
+
+        private string GetSlopeAngleAndHeading()
+        {
+            try
+            {
+                var result = "--° @ ---°";
+                var mainBody = FlightGlobals.ActiveVessel.mainBody;
+                var rad = (FlightGlobals.ActiveVessel.CoM - mainBody.position).normalized;
+                RaycastHit hit;
+                if (Physics.Raycast(FlightGlobals.ActiveVessel.CoM, -rad, out hit, Mathf.Infinity, 1 << 15)) // Just "Local Scenery" please
+                {
+                    var norm = hit.normal;
+                    norm = norm.normalized;
+                    var raddotnorm = Vector3d.Dot(rad, norm);
+                    if (raddotnorm > 1.0)
+                    {
+                        raddotnorm = 1.0;
+                    }
+                    else if (raddotnorm < 0.0)
+                    {
+                        raddotnorm = 0.0;
+                    }
+                    var slope = Math.Acos(raddotnorm) * 180 / Math.PI;
+                    result = slope.ToAngle("F1");
+                    if (slope < 0.05)
+                    {
+                        result += " @ ---°";
+                    }
+                    else
+                    {
+                        var side = Vector3d.Cross(rad, norm).normalized;
+                        var east = Vector3d.Cross(rad, Vector3d.up).normalized;
+                        var north = Vector3d.Cross(rad, east).normalized;
+                        var sidedoteast = Vector3d.Dot(side, east);
+                        var direction = Math.Acos(sidedoteast) * 180 / Math.PI;
+                        var sidedotnorth = Vector3d.Dot(side, north);
+                        if (sidedotnorth < 0)
+                        {
+                            direction = 360 - direction;
+                        }
+                        result += " @ " + direction.ToAngle("F0");
+                    }
+                }
+
+                return result;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "Surface->Slope->GetSlopeAngleAndHeading");
+                return "--° @ ---°";
+            }
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/TerminalVelocity.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/TerminalVelocity.cs
@@ -1,67 +1,67 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class TerminalVelocity : ReadoutModule

-    {

-        private bool showing;

-

-        public TerminalVelocity()

-        {

-            this.Name = "Terminal Velocity";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = "Shows the velocity where the efforts of thrust and drag are equalled out.";

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            AtmosphericProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            var tempShowing = this.showing;

-            this.showing = false;

-

-            if (FlightGlobals.ActiveVessel.atmDensity > 0)

-            {

-                this.showing = true;

-                this.DrawLine(AtmosphericProcessor.TerminalVelocity.ToSpeed());

-            }

-

-            if (this.showing != tempShowing)

-            {

-                this.ResizeRequested = true;

-            }

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(AtmosphericProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class TerminalVelocity : ReadoutModule
+    {
+        private bool showing;
+
+        public TerminalVelocity()
+        {
+            this.Name = "Terminal Velocity";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = "Shows the velocity where the efforts of thrust and drag are equalled out.";
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            AtmosphericProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            var tempShowing = this.showing;
+            this.showing = false;
+
+            if (FlightGlobals.ActiveVessel.atmDensity > 0)
+            {
+                this.showing = true;
+                this.DrawLine(AtmosphericProcessor.TerminalVelocity.ToSpeed());
+            }
+
+            if (this.showing != tempShowing)
+            {
+                this.ResizeRequested = true;
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(AtmosphericProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/VerticalSpeed.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/VerticalSpeed.cs
@@ -1,43 +1,43 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Surface

-{

-    public class VerticalSpeed : ReadoutModule

-    {

-        public VerticalSpeed()

-        {

-            this.Name = "Vertical Speed";

-            this.Category = ReadoutCategory.Surface;

-            this.HelpString = "Shows the vessel's vertical speed up and down.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            this.DrawLine(FlightGlobals.ship_verticalSpeed.ToSpeed());

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class VerticalSpeed : ReadoutModule
+    {
+        public VerticalSpeed()
+        {
+            this.Name = "Vertical Speed";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = "Shows the vessel's vertical speed up and down.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            this.DrawLine(FlightGlobals.ship_verticalSpeed.ToSpeed());
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Vessel/Acceleration.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/Acceleration.cs
@@ -36,7 +36,7 @@
         public Acceleration()
         {
             this.Name = "Acceleration";
-            this.Category = ReadoutCategory.Vessel;
+            this.Category = ReadoutCategory.GetCategory("Vessel");
             this.HelpString = string.Empty;
             this.IsDefault = true;
         }

--- a/KerbalEngineer/Flight/Readouts/Vessel/DeltaVStaged.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/DeltaVStaged.cs
@@ -1,82 +1,82 @@
-// 

-//     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 KerbalEngineer.Extensions;

-using KerbalEngineer.VesselSimulator;

-

-#endregion

-

-

-

-namespace KerbalEngineer.Flight.Readouts.Vessel

-{

-    public class DeltaVStaged : ReadoutModule

-    {

-        private int numberOfStages;

-        private bool showing;

-

-        public DeltaVStaged()

-        {

-            this.Name = "DeltaV Staged";

-            this.Category = ReadoutCategory.Vessel;

-            this.HelpString = "Shows the vessel's delta velocity for each stage.";

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            SimulationProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (SimulationProcessor.ShowDetails)

-            {

-                this.showing = true;

-                var newNumberOfStages = 0;

-                foreach (var stage in SimulationProcessor.Stages)

-                {

-                    if (stage.deltaV > 0 || stage.number == Staging.CurrentStage)

-                    {

-                        this.DrawLine("DeltaV (S" + stage.number + ")", stage.deltaV.ToString("N0") + "m/s (" + stage.time.ToTime() + ")");

-                        newNumberOfStages++;

-                    }

-                }

-

-                if (newNumberOfStages != this.numberOfStages)

-                {

-                    this.numberOfStages = newNumberOfStages;

-                    this.ResizeRequested = true;

-                }

-            }

-            else if (this.showing)

-            {

-                this.showing = false;

-                this.ResizeRequested = true;

-            }

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+using KerbalEngineer.VesselSimulator;
+
+#endregion
+
+
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class DeltaVStaged : ReadoutModule
+    {
+        private int numberOfStages;
+        private bool showing;
+
+        public DeltaVStaged()
+        {
+            this.Name = "DeltaV Staged";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = "Shows the vessel's delta velocity for each stage.";
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (SimulationProcessor.ShowDetails)
+            {
+                this.showing = true;
+                var newNumberOfStages = 0;
+                foreach (var stage in SimulationProcessor.Stages)
+                {
+                    if (stage.deltaV > 0 || stage.number == Staging.CurrentStage)
+                    {
+                        this.DrawLine("DeltaV (S" + stage.number + ")", stage.deltaV.ToString("N0") + "m/s (" + stage.time.ToTime() + ")");
+                        newNumberOfStages++;
+                    }
+                }
+
+                if (newNumberOfStages != this.numberOfStages)
+                {
+                    this.numberOfStages = newNumberOfStages;
+                    this.ResizeRequested = true;
+                }
+            }
+            else if (this.showing)
+            {
+                this.showing = false;
+                this.ResizeRequested = true;
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Vessel/DeltaVTotal.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/DeltaVTotal.cs
@@ -1,64 +1,64 @@
-// 

-//     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 KerbalEngineer.Extensions;

-using KerbalEngineer.VesselSimulator;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Vessel

-{

-    public class DeltaVTotal : ReadoutModule

-    {

-        private bool showing;

-

-        public DeltaVTotal()

-        {

-            this.Name = "DeltaV Total";

-            this.Category = ReadoutCategory.Vessel;

-            this.HelpString = "Shows the vessel's total delta velocity.";

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            SimulationProcessor.RequestUpdate();

-        }

-

-        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.showing = false;

-                this.ResizeRequested = true;

-            }   

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+using KerbalEngineer.VesselSimulator;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class DeltaVTotal : ReadoutModule
+    {
+        private bool showing;
+
+        public DeltaVTotal()
+        {
+            this.Name = "DeltaV Total";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = "Shows the vessel's total delta velocity.";
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        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.showing = false;
+                this.ResizeRequested = true;
+            }   
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Vessel/Mass.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/Mass.cs
@@ -1,64 +1,64 @@
-// 

-//     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 KerbalEngineer.Extensions;

-using KerbalEngineer.VesselSimulator;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Vessel

-{

-    public class Mass : ReadoutModule

-    {

-        private bool showing;

-

-        public Mass()

-        {

-            this.Name = "Mass";

-            this.Category = ReadoutCategory.Vessel;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            SimulationProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (SimulationProcessor.ShowDetails)

-            {

-                this.DrawLine(SimulationProcessor.LastStage.mass.ToMass(false) + " / " + SimulationProcessor.LastStage.totalMass.ToMass());

-            }

-            else if (this.showing)

-            {

-                this.showing = false;

-                this.ResizeRequested = true;

-            }

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+using KerbalEngineer.VesselSimulator;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class Mass : ReadoutModule
+    {
+        private bool showing;
+
+        public Mass()
+        {
+            this.Name = "Mass";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (SimulationProcessor.ShowDetails)
+            {
+                this.DrawLine(SimulationProcessor.LastStage.mass.ToMass(false) + " / " + SimulationProcessor.LastStage.totalMass.ToMass());
+            }
+            else if (this.showing)
+            {
+                this.showing = false;
+                this.ResizeRequested = true;
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Vessel/SimulationDelay.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/SimulationDelay.cs
@@ -1,50 +1,50 @@
-// 

-//     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 KerbalEngineer.VesselSimulator;

-

-using UnityEngine;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Vessel

-{

-    public class SimulationDelay : ReadoutModule

-    {

-        public SimulationDelay()

-        {

-            this.Name = "Minimum Simulation Delay";

-            this.Category = ReadoutCategory.Vessel;

-            this.HelpString = "Controls the minimum delay between processing vessel simulations.";

-            this.IsDefault = true;

-        }

-

-        public override void Draw()

-        {

-            GUILayout.BeginHorizontal();

-            GUILayout.Label("Sim Delay", this.NameStyle);

-            GUI.skin = HighLogic.Skin;

-            SimManager.minSimTime = (long)GUILayout.HorizontalSlider(SimManager.minSimTime, 0, 1000.0f);

-            GUI.skin = null;

-            GUILayout.EndHorizontal();

-        }

-    }

+// 
+//     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 KerbalEngineer.VesselSimulator;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class SimulationDelay : ReadoutModule
+    {
+        public SimulationDelay()
+        {
+            this.Name = "Minimum Simulation Delay";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = "Controls the minimum delay between processing vessel simulations.";
+            this.IsDefault = true;
+        }
+
+        public override void Draw()
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("Sim Delay", this.NameStyle);
+            GUI.skin = HighLogic.Skin;
+            SimManager.minSimTime = (long)GUILayout.HorizontalSlider(SimManager.minSimTime, 0, 1000.0f);
+            GUI.skin = null;
+            GUILayout.EndHorizontal();
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Vessel/SpecificImpulse.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/SpecificImpulse.cs
@@ -1,63 +1,63 @@
-// 

-//     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

-

-

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Vessel

-{

-    public class SpecificImpulse : ReadoutModule

-    {

-        private bool showing;

-

-        public SpecificImpulse()

-        {

-            this.Name = "Specific Impulse";

-            this.Category = ReadoutCategory.Vessel;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            SimulationProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (SimulationProcessor.ShowDetails)

-            {

-                this.DrawLine(SimulationProcessor.LastStage.isp.ToString("F1") + "s");

-            }

-            else if (this.showing)

-            {

-                this.showing = false;

-                this.ResizeRequested = true;

-            }

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);

-        }

-    }

+// 
+//     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
+
+
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class SpecificImpulse : ReadoutModule
+    {
+        private bool showing;
+
+        public SpecificImpulse()
+        {
+            this.Name = "Specific Impulse";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (SimulationProcessor.ShowDetails)
+            {
+                this.DrawLine(SimulationProcessor.LastStage.isp.ToString("F1") + "s");
+            }
+            else if (this.showing)
+            {
+                this.showing = false;
+                this.ResizeRequested = true;
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Vessel/Thrust.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/Thrust.cs
@@ -1,63 +1,63 @@
-// 

-//     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 KerbalEngineer.Extensions;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Vessel

-{

-    public class Thrust : ReadoutModule

-    {

-        private bool showing;

-

-        public Thrust()

-        {

-            this.Name = "Thrust";

-            this.Category = ReadoutCategory.Vessel;

-            this.HelpString = string.Empty;

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            SimulationProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (SimulationProcessor.ShowDetails)

-            {

-                this.DrawLine(SimulationProcessor.LastStage.actualThrust.ToForce(false) + " / " + SimulationProcessor.LastStage.thrust.ToForce());

-            }

-            else if (this.showing)

-            {

-                this.showing = false;

-                this.ResizeRequested = true;

-            }

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);

-        }

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class Thrust : ReadoutModule
+    {
+        private bool showing;
+
+        public Thrust()
+        {
+            this.Name = "Thrust";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (SimulationProcessor.ShowDetails)
+            {
+                this.DrawLine(SimulationProcessor.LastStage.actualThrust.ToForce(false) + " / " + SimulationProcessor.LastStage.thrust.ToForce());
+            }
+            else if (this.showing)
+            {
+                this.showing = false;
+                this.ResizeRequested = true;
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/Vessel/ThrustToWeight.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/ThrustToWeight.cs
@@ -1,67 +1,67 @@
-// 

-//     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

-

-

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts.Vessel

-{

-    public class ThrustToWeight : ReadoutModule

-    {

-        private string actual = string.Empty;

-        private bool showing;

-        private string total = string.Empty;

-

-        public ThrustToWeight()

-        {

-            this.Name = "Thrust to Weight Ratio";

-            this.Category = ReadoutCategory.Vessel;

-            this.HelpString = "Shows the vessel's actual and total thrust to weight ratio.";

-            this.IsDefault = true;

-        }

-

-        public override void Update()

-        {

-            SimulationProcessor.RequestUpdate();

-        }

-

-        public override void Draw()

-        {

-            if (SimulationProcessor.ShowDetails)

-            {

-                this.actual = (SimulationProcessor.LastStage.actualThrust / (SimulationProcessor.LastStage.totalMass * FlightGlobals.getGeeForceAtPosition(FlightGlobals.ship_position).magnitude)).ToString("F2");

-                this.total = (SimulationProcessor.LastStage.thrust / (SimulationProcessor.LastStage.totalMass * FlightGlobals.getGeeForceAtPosition(FlightGlobals.ship_position).magnitude)).ToString("F2");

-                this.DrawLine("TWR", this.actual + " / " + this.total);

-            }

-            else if (this.showing)

-            {

-                this.showing = false;

-                this.ResizeRequested = true;

-            }

-        }

-

-        public override void Reset()

-        {

-            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);

-        }

-    }

+// 
+//     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
+
+
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class ThrustToWeight : ReadoutModule
+    {
+        private string actual = string.Empty;
+        private bool showing;
+        private string total = string.Empty;
+
+        public ThrustToWeight()
+        {
+            this.Name = "Thrust to Weight Ratio";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = "Shows the vessel's actual and total thrust to weight ratio.";
+            this.IsDefault = true;
+        }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        public override void Draw()
+        {
+            if (SimulationProcessor.ShowDetails)
+            {
+                this.actual = (SimulationProcessor.LastStage.actualThrust / (SimulationProcessor.LastStage.totalMass * FlightGlobals.getGeeForceAtPosition(FlightGlobals.ship_position).magnitude)).ToString("F2");
+                this.total = (SimulationProcessor.LastStage.thrust / (SimulationProcessor.LastStage.totalMass * FlightGlobals.getGeeForceAtPosition(FlightGlobals.ship_position).magnitude)).ToString("F2");
+                this.DrawLine("TWR", this.actual + " / " + this.total);
+            }
+            else if (this.showing)
+            {
+                this.showing = false;
+                this.ResizeRequested = true;
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+        }
+    }
 }

--- a/KerbalEngineer/Flight/Sections/SectionEditor.cs
+++ b/KerbalEngineer/Flight/Sections/SectionEditor.cs
@@ -1,397 +1,377 @@
-// 

-//     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 KerbalEngineer.Extensions;

-using KerbalEngineer.Flight.Readouts;

-

-using UnityEngine;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Sections

-{

-    public class SectionEditor : MonoBehaviour

-    {

-        #region Constants

-

-        public const float Width = 500.0f;

-        public const float Height = 500.0f;

-

-        #endregion

-

-        #region Fields

-

-        private Vector2 scrollPositionAvailable;

-        private Vector2 scrollPositionInstalled;

-        private ReadoutCategory selectedCategory = ReadoutCategory.Orbital;

-        private int windowId;

-        private Rect windowPosition;

-

-        #endregion

-

-        #region Constructors

-

-        /// <summary>

-        ///     Initialises the object's state on creation.

-        /// </summary>

-        private void Start()

-        {

-            this.windowId = this.GetHashCode();

-            this.InitialiseStyles();

-            RenderingManager.AddToPostDrawQueue(0, this.Draw);

-        }

-

-        #endregion

-

-        #region Properties

-

-        /// <summary>

-        ///     Gets and sets the parent section for the section editor.

-        /// </summary>

-        public SectionModule ParentSection { get; set; }

-

-        /// <summary>

-        ///     Gets and sets the window position.

-        /// </summary>

-        public Rect WindowPosition

-        {

-            get { return this.windowPosition; }

-            set { this.windowPosition = value; }

-        }

-

-        #endregion

-

-        #region GUIStyles

-

-        private GUIStyle categoryButtonStyle;

-        private GUIStyle helpBoxStyle;

-        private GUIStyle helpTextStyle;

-        private GUIStyle panelTitleStyle;

-        private GUIStyle readoutButtonStyle;

-        private GUIStyle readoutNameStyle;

-        private GUIStyle textStyle;

-        private GUIStyle windowStyle;

-

-        /// <summary>

-        ///     Initialises all the styles required for this object.

-        /// </summary>

-        private void InitialiseStyles()

-        {

-            this.windowStyle = new GUIStyle(HighLogic.Skin.window);

-

-            this.categoryButtonStyle = new GUIStyle(HighLogic.Skin.button)

-            {

-                normal =

-                {

-                    textColor = Color.white

-                },

-                alignment = TextAnchor.MiddleCenter,

-                fontSize = 12,

-                fontStyle = FontStyle.Bold,

-                fixedHeight = 30.0f,

-            };

-

-            this.panelTitleStyle = new GUIStyle(HighLogic.Skin.label)

-            {

-                normal =

-                {

-                    textColor = Color.white

-                },

-                margin = new RectOffset(),

-                padding = new RectOffset(),

-                alignment = TextAnchor.MiddleLeft,

-                fontSize = 12,

-                fontStyle = FontStyle.Bold,

-                fixedHeight = 30.0f,

-                stretchWidth = true

-            };

-

-            this.textStyle = new GUIStyle(HighLogic.Skin.textField)

-            {

-                margin = new RectOffset(3, 3, 3, 3),

-                alignment = TextAnchor.MiddleLeft,

-                stretchWidth = true,

-                stretchHeight = true

-            };

-

-            this.readoutNameStyle = new GUIStyle(HighLogic.Skin.label)

-            {

-                normal =

-                {

-                    textColor = Color.white

-                },

-                margin = new RectOffset(),

-                padding = new RectOffset(10, 0, 0, 0),

-                alignment = TextAnchor.MiddleLeft,

-                fontSize = 12,

-                fontStyle = FontStyle.Bold,

-                stretchWidth = true,

-                stretchHeight = true

-            };

-

-            this.readoutButtonStyle = new GUIStyle(HighLogic.Skin.button)

-            {

-                normal =

-                {

-                    textColor = Color.white

-                },

-                margin = new RectOffset(2, 2, 2, 2),

-                padding = new RectOffset(),

-                alignment = TextAnchor.MiddleCenter,

-                fontSize = 12,

-                fontStyle = FontStyle.Bold,

-                stretchHeight = true

-            };

-

-            this.helpBoxStyle = new GUIStyle(HighLogic.Skin.box)

-            {

-                margin = new RectOffset(2, 2, 2, 10),

-                padding = new RectOffset(10, 10, 10, 10)

-            };

-

-            this.helpTextStyle = new GUIStyle(HighLogic.Skin.label)

-            {

-                normal =

-                {

-                    textColor = Color.yellow

-                },

-                margin = new RectOffset(),

-                padding = new RectOffset(),

-                alignment = TextAnchor.MiddleLeft,

-                fontSize = 13,

-                fontStyle = FontStyle.Normal,

-                stretchWidth = true,

-                richText = true

-            };

-        }

-

-        #endregion

-

-        #region Drawing

-

-        /// <summary>

-        ///     Called to draw the editor when the UI is enabled.

-        /// </summary>

-        private void Draw()

-        {

-            this.windowPosition = GUILayout.Window(this.windowId, this.windowPosition, this.Window, "EDIT SECTION - " + this.ParentSection.Name.ToUpper(), this.windowStyle).ClampToScreen();

-            this.ParentSection.EditorPositionX = this.windowPosition.x;

-            this.ParentSection.EditorPositionY = this.windowPosition.y;

-        }

-

-        /// <summary>

-        ///     Draws the editor window.

-        /// </summary>

-        private void Window(int windowId)

-        {

-            this.DrawCustomOptions();

-            this.DrawCategorySelector();

-            this.DrawAvailableReadouts();

-            GUILayout.Space(5.0f);

-            this.DrawInstalledReadouts();

-

-            if (GUILayout.Button("CLOSE EDITOR", this.categoryButtonStyle))

-            {

-                this.ParentSection.IsEditorVisible = false;

-            }

-

-            GUI.DragWindow();

-        }

-

-        /// <summary>

-        ///     Draws the options for editing custom sections.

-        /// </summary>

-        private void DrawCustomOptions()

-        {

-            if (!this.ParentSection.IsCustom)

-            {

-                return;

-            }

-

-            GUILayout.BeginHorizontal(GUILayout.Height(25.0f));

-            this.ParentSection.Name = GUILayout.TextField(this.ParentSection.Name, this.textStyle);

-            this.ParentSection.Abbreviation = GUILayout.TextField(this.ParentSection.Abbreviation, this.textStyle, GUILayout.Width(75.0f));

-            if (GUILayout.Button("DELETE SECTION", this.readoutButtonStyle, GUILayout.Width(125.0f)))

-            {

-                this.ParentSection.IsFloating = false;

-                this.ParentSection.IsEditorVisible = false;

-                SectionLibrary.Instance.CustomSections.Remove(this.ParentSection);

-                DisplayStack.Instance.RequestResize();

-            }

-            GUILayout.EndHorizontal();

-        }

-

-        /// <summary>

-        ///     Draws the category selection list.

-        /// </summary>

-        private void DrawCategorySelector()

-        {

-            GUILayout.BeginHorizontal();

-            var isSelected = this.selectedCategory == ReadoutCategory.Orbital;

-            if (GUILayout.Toggle(isSelected, ReadoutCategory.Orbital.ToString().ToUpper(), this.categoryButtonStyle, GUILayout.Width(100.0f)) && !isSelected)

-            {

-                this.selectedCategory = ReadoutCategory.Orbital;

-            }

-

-            isSelected = this.selectedCategory == ReadoutCategory.Surface;

-            if (GUILayout.Toggle(isSelected, ReadoutCategory.Surface.ToString().ToUpper(), this.categoryButtonStyle, GUILayout.Width(100.0f)) && !isSelected)

-            {

-                this.selectedCategory = ReadoutCategory.Surface;

-            }

-

-            isSelected = this.selectedCategory == ReadoutCategory.Vessel;

-            if (GUILayout.Toggle(isSelected, ReadoutCategory.Vessel.ToString().ToUpper(), this.categoryButtonStyle, GUILayout.Width(100.0f)) && !isSelected)

-            {

-                this.selectedCategory = ReadoutCategory.Vessel;

-            }

-

-            isSelected = this.selectedCategory == ReadoutCategory.Rendezvous;

-            if (GUILayout.Toggle(isSelected, ReadoutCategory.Rendezvous.ToString().ToUpper(), this.categoryButtonStyle, GUILayout.Width(100.0f)) && !isSelected)

-            {

-                this.selectedCategory = ReadoutCategory.Rendezvous;

-            }

-

-            isSelected = this.selectedCategory == ReadoutCategory.Misc;

-            if (GUILayout.Toggle(isSelected, ReadoutCategory.Misc.ToString().ToUpper(), this.categoryButtonStyle) && !isSelected)

-            {

-                this.selectedCategory = ReadoutCategory.Misc;

-            }

-            GUILayout.EndHorizontal();

-        }

-

-        /// <summary>

-        ///     Draws the available readouts panel.

-        /// </summary>

-        private void DrawAvailableReadouts()

-        {

-            GUI.skin = HighLogic.Skin;

-            this.scrollPositionAvailable = GUILayout.BeginScrollView(this.scrollPositionAvailable, false, true, GUILayout.Height(200.0f));

-            GUI.skin = null;

-

-            GUILayout.Label("AVAILABLE", this.panelTitleStyle);

-

-            foreach (var readout in ReadoutLibrary.Instance.GetCategory(this.selectedCategory))

-            {

-                if (!this.ParentSection.ReadoutModules.Contains(readout) || readout.Cloneable)

-                {

-                    GUILayout.BeginHorizontal(GUILayout.Height(30.0f));

-                    GUILayout.Label(readout.Name, this.readoutNameStyle);

-                    readout.ShowHelp = GUILayout.Toggle(readout.ShowHelp, "?", this.readoutButtonStyle, GUILayout.Width(30.0f));

-                    if (GUILayout.Button("INSTALL", this.readoutButtonStyle, GUILayout.Width(125.0f)))

-                    {

-                        this.ParentSection.ReadoutModules.Add(readout);

-                    }

-                    GUILayout.EndHorizontal();

-

-                    this.ShowHelpMessage(readout);

-                }

-            }

-

-            GUILayout.EndScrollView();

-        }

-

-        /// <summary>

-        ///     Draws the installed readouts panel.

-        /// </summary>

-        private void DrawInstalledReadouts()

-        {

-            GUI.skin = HighLogic.Skin;

-            this.scrollPositionInstalled = GUILayout.BeginScrollView(this.scrollPositionInstalled, false, true);

-            GUI.skin = null;

-

-            GUILayout.Label("INSTALLED", this.panelTitleStyle);

-            var removeReadout = false;

-            var removeReadoutIndex = 0;

-

-            for (var i = 0; i < this.ParentSection.ReadoutModules.Count; i++)

-            {

-                var readout = this.ParentSection.ReadoutModules[i];

-

-                GUILayout.BeginHorizontal(GUILayout.Height(30.0f));

-                GUILayout.Label(readout.Name, this.readoutNameStyle);

-                if (GUILayout.Button("▲", this.readoutButtonStyle, GUILayout.Width(30.0f)))

-                {

-                    if (i > 0)

-                    {

-                        this.ParentSection.ReadoutModules[i] = this.ParentSection.ReadoutModules[i - 1];

-                        this.ParentSection.ReadoutModules[i - 1] = readout;

-                    }

-                }

-                if (GUILayout.Button("▼", this.readoutButtonStyle, GUILayout.Width(30.0f)))

-                {

-                    if (i < this.ParentSection.ReadoutModules.Count - 1)

-                    {

-                        this.ParentSection.ReadoutModules[i] = this.ParentSection.ReadoutModules[i + 1];

-                        this.ParentSection.ReadoutModules[i + 1] = readout;

-                    }

-                }

-                readout.ShowHelp = GUILayout.Toggle(readout.ShowHelp, "?", this.readoutButtonStyle, GUILayout.Width(30.0f));

-                if (GUILayout.Button("REMOVE", this.readoutButtonStyle, GUILayout.Width(125.0f)))

-                {

-                    removeReadout = true;

-                    removeReadoutIndex = i;

-                }

-                GUILayout.EndHorizontal();

-

-                this.ShowHelpMessage(readout);

-            }

-

-            GUILayout.EndScrollView();

-

-            if (removeReadout)

-            {

-                this.ParentSection.ReadoutModules.RemoveAt(removeReadoutIndex);

-            }

-        }

-

-        private void ShowHelpMessage(ReadoutModule readout)

-        {

-            if (readout.ShowHelp)

-            {

-                GUILayout.BeginVertical(this.helpBoxStyle);

-                if (readout.HelpString != null && readout.HelpString.Length > 0)

-                {

-                    GUILayout.Label(readout.HelpString, this.helpTextStyle);

-                }

-                else

-                {

-                    GUILayout.Label("Sorry, no help information has been provided for this readout module.", this.helpTextStyle);

-                }

-

-                GUILayout.EndVertical();

-            }

-        }

-

-        #endregion

-

-        #region Destruction

-

-        /// <summary>

-        ///     Runs when the object is destroyed.

-        /// </summary>

-        private void OnDestroy()

-        {

-            RenderingManager.RemoveFromPostDrawQueue(0, this.Draw);

-        }

-

-        #endregion

-    }

+// 
+//     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 KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Readouts;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Sections
+{
+    public class SectionEditor : MonoBehaviour
+    {
+        #region Constants
+
+        public const float Width = 500.0f;
+        public const float Height = 500.0f;
+
+        #endregion
+
+        #region Fields
+
+        private Vector2 scrollPositionAvailable;
+        private Vector2 scrollPositionInstalled;
+        private ReadoutCategory selectedReadoutCategory = ReadoutCategory.GetCategory("Orbital");
+        private int windowId;
+        private Rect windowPosition;
+
+        #endregion
+
+        #region Constructors
+
+        /// <summary>
+        ///     Initialises the object's state on creation.
+        /// </summary>
+        private void Start()
+        {
+            this.windowId = this.GetHashCode();
+            this.InitialiseStyles();
+            RenderingManager.AddToPostDrawQueue(0, this.Draw);
+        }
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        ///     Gets and sets the parent section for the section editor.
+        /// </summary>
+        public SectionModule ParentSection { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the window position.
+        /// </summary>
+        public Rect WindowPosition
+        {
+            get { return this.windowPosition; }
+            set { this.windowPosition = value; }
+        }
+
+        #endregion
+
+        #region GUIStyles
+
+        private GUIStyle categoryButtonStyle;
+        private GUIStyle helpBoxStyle;
+        private GUIStyle helpTextStyle;
+        private GUIStyle panelTitleStyle;
+        private GUIStyle readoutButtonStyle;
+        private GUIStyle readoutNameStyle;
+        private GUIStyle textStyle;
+        private GUIStyle windowStyle;
+
+        /// <summary>
+        ///     Initialises all the styles required for this object.
+        /// </summary>
+        private void InitialiseStyles()
+        {
+            this.windowStyle = new GUIStyle(HighLogic.Skin.window);
+
+            this.categoryButtonStyle = new GUIStyle(HighLogic.Skin.button)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                alignment = TextAnchor.MiddleCenter,
+                fontSize = 12,
+                fontStyle = FontStyle.Bold,
+                fixedHeight = 30.0f,
+            };
+
+            this.panelTitleStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                margin = new RectOffset(),
+                padding = new RectOffset(),
+                alignment = TextAnchor.MiddleLeft,
+                fontSize = 12,
+                fontStyle = FontStyle.Bold,
+                fixedHeight = 30.0f,
+                stretchWidth = true
+            };
+
+            this.textStyle = new GUIStyle(HighLogic.Skin.textField)
+            {
+                margin = new RectOffset(3, 3, 3, 3),
+                alignment = TextAnchor.MiddleLeft,
+                stretchWidth = true,
+                stretchHeight = true
+            };
+
+            this.readoutNameStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                margin = new RectOffset(),
+                padding = new RectOffset(10, 0, 0, 0),
+                alignment = TextAnchor.MiddleLeft,
+                fontSize = 12,
+                fontStyle = FontStyle.Bold,
+                stretchWidth = true,
+                stretchHeight = true
+            };
+
+            this.readoutButtonStyle = new GUIStyle(HighLogic.Skin.button)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                margin = new RectOffset(2, 2, 2, 2),
+                padding = new RectOffset(),
+                alignment = TextAnchor.MiddleCenter,
+                fontSize = 12,
+                fontStyle = FontStyle.Bold,
+                stretchHeight = true
+            };
+
+            this.helpBoxStyle = new GUIStyle(HighLogic.Skin.box)
+            {
+                margin = new RectOffset(2, 2, 2, 10),
+                padding = new RectOffset(10, 10, 10, 10)
+            };
+
+            this.helpTextStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                normal =
+                {
+                    textColor = Color.yellow
+                },
+                margin = new RectOffset(),
+                padding = new RectOffset(),
+                alignment = TextAnchor.MiddleLeft,
+                fontSize = 13,
+                fontStyle = FontStyle.Normal,
+                stretchWidth = true,
+                richText = true
+            };
+        }
+
+        #endregion
+
+        #region Drawing
+
+        /// <summary>
+        ///     Called to draw the editor when the UI is enabled.
+        /// </summary>
+        private void Draw()
+        {
+            this.windowPosition = GUILayout.Window(this.windowId, this.windowPosition, this.Window, "EDIT SECTION - " + this.ParentSection.Name.ToUpper(), this.windowStyle).ClampToScreen();
+            this.ParentSection.EditorPositionX = this.windowPosition.x;
+            this.ParentSection.EditorPositionY = this.windowPosition.y;
+        }
+
+        /// <summary>
+        ///     Draws the editor window.
+        /// </summary>
+        private void Window(int windowId)
+        {
+            this.DrawCustomOptions();
+            this.DrawCategorySelector();
+            this.DrawAvailableReadouts();
+            GUILayout.Space(5.0f);
+            this.DrawInstalledReadouts();
+
+            if (GUILayout.Button("CLOSE EDITOR", this.categoryButtonStyle))
+            {
+                this.ParentSection.IsEditorVisible = false;
+            }
+
+            GUI.DragWindow();
+        }
+
+        /// <summary>
+        ///     Draws the options for editing custom sections.
+        /// </summary>
+        private void DrawCustomOptions()
+        {
+            if (!this.ParentSection.IsCustom)
+            {
+                return;
+            }
+
+            GUILayout.BeginHorizontal(GUILayout.Height(25.0f));
+            this.ParentSection.Name = GUILayout.TextField(this.ParentSection.Name, this.textStyle);
+            this.ParentSection.Abbreviation = GUILayout.TextField(this.ParentSection.Abbreviation, this.textStyle, GUILayout.Width(75.0f));
+            if (GUILayout.Button("DELETE SECTION", this.readoutButtonStyle, GUILayout.Width(125.0f)))
+            {
+                this.ParentSection.IsFloating = false;
+                this.ParentSection.IsEditorVisible = false;
+                SectionLibrary.CustomSections.Remove(this.ParentSection);
+                DisplayStack.Instance.RequestResize();
+            }
+            GUILayout.EndHorizontal();
+        }
+
+        /// <summary>
+        ///     Draws the readoutCategories selection list.
+        /// </summary>
+        private void DrawCategorySelector()
+        {
+            GUILayout.BeginHorizontal();
+
+            foreach (var category in ReadoutCategory.Categories)
+            {
+                var isSelected = this.selectedReadoutCategory == category;
+                if (GUILayout.Toggle(isSelected, category.ToString().ToUpper(), this.categoryButtonStyle, GUILayout.Width(100.0f)) && !isSelected)
+                {
+                    this.selectedReadoutCategory = category;
+                }
+            }
+            GUILayout.EndHorizontal();
+        }
+
+        /// <summary>
+        ///     Draws the available readouts panel.
+        /// </summary>
+        private void DrawAvailableReadouts()
+        {
+            GUI.skin = HighLogic.Skin;
+            this.scrollPositionAvailable = GUILayout.BeginScrollView(this.scrollPositionAvailable, false, true, GUILayout.Height(200.0f));
+            GUI.skin = null;
+
+            GUILayout.Label("AVAILABLE", this.panelTitleStyle);
+
+            foreach (var readout in ReadoutLibrary.GetCategory(this.selectedReadoutCategory))
+            {
+                if (!this.ParentSection.ReadoutModules.Contains(readout) || readout.Cloneable)
+                {
+                    GUILayout.BeginHorizontal(GUILayout.Height(30.0f));
+                    GUILayout.Label(readout.Name, this.readoutNameStyle);
+                    readout.ShowHelp = GUILayout.Toggle(readout.ShowHelp, "?", this.readoutButtonStyle, GUILayout.Width(30.0f));
+                    if (GUILayout.Button("INSTALL", this.readoutButtonStyle, GUILayout.Width(125.0f)))
+                    {
+                        this.ParentSection.ReadoutModules.Add(readout);
+                    }
+                    GUILayout.EndHorizontal();
+
+                    this.ShowHelpMessage(readout);
+                }
+            }
+
+            GUILayout.EndScrollView();
+        }
+
+        /// <summary>
+        ///     Draws the installed readouts panel.
+        /// </summary>
+        private void DrawInstalledReadouts()
+        {
+            GUI.skin = HighLogic.Skin;
+            this.scrollPositionInstalled = GUILayout.BeginScrollView(this.scrollPositionInstalled, false, true);
+            GUI.skin = null;
+
+            GUILayout.Label("INSTALLED", this.panelTitleStyle);
+            var removeReadout = false;
+            var removeReadoutIndex = 0;
+
+            for (var i = 0; i < this.ParentSection.ReadoutModules.Count; i++)
+            {
+                var readout = this.ParentSection.ReadoutModules[i];
+
+                GUILayout.BeginHorizontal(GUILayout.Height(30.0f));
+                GUILayout.Label(readout.Name, this.readoutNameStyle);
+                if (GUILayout.Button("▲", this.readoutButtonStyle, GUILayout.Width(30.0f)))
+                {
+                    if (i > 0)
+                    {
+                        this.ParentSection.ReadoutModules[i] = this.ParentSection.ReadoutModules[i - 1];
+                        this.ParentSection.ReadoutModules[i - 1] = readout;
+                    }
+                }
+                if (GUILayout.Button("▼", this.readoutButtonStyle, GUILayout.Width(30.0f)))
+                {
+                    if (i < this.ParentSection.ReadoutModules.Count - 1)
+                    {
+                        this.ParentSection.ReadoutModules[i] = this.ParentSection.ReadoutModules[i + 1];
+                        this.ParentSection.ReadoutModules[i + 1] = readout;
+                    }
+                }
+                readout.ShowHelp = GUILayout.Toggle(readout.ShowHelp, "?", this.readoutButtonStyle, GUILayout.Width(30.0f));
+                if (GUILayout.Button("REMOVE", this.readoutButtonStyle, GUILayout.Width(125.0f)))
+                {
+                    removeReadout = true;
+                    removeReadoutIndex = i;
+                }
+                GUILayout.EndHorizontal();
+
+                this.ShowHelpMessage(readout);
+            }
+
+            GUILayout.EndScrollView();
+
+            if (removeReadout)
+            {
+                this.ParentSection.ReadoutModules.RemoveAt(removeReadoutIndex);
+            }
+        }
+
+        private void ShowHelpMessage(ReadoutModule readout)
+        {
+            if (readout.ShowHelp)
+            {
+                GUILayout.BeginVertical(this.helpBoxStyle);
+                if (readout.HelpString != null && readout.HelpString.Length > 0)
+                {
+                    GUILayout.Label(readout.HelpString, this.helpTextStyle);
+                }
+                else
+                {
+                    GUILayout.Label("Sorry, no help information has been provided for this readout module.", this.helpTextStyle);
+                }
+
+                GUILayout.EndVertical();
+            }
+        }
+
+        #endregion
+
+        #region Destruction
+
+        /// <summary>
+        ///     Runs when the object is destroyed.
+        /// </summary>
+        private void OnDestroy()
+        {
+            RenderingManager.RemoveFromPostDrawQueue(0, this.Draw);
+        }
+
+        #endregion
+    }
 }

--- a/KerbalEngineer/Flight/Sections/SectionLibrary.cs
+++ b/KerbalEngineer/Flight/Sections/SectionLibrary.cs
@@ -29,58 +29,44 @@
 
 namespace KerbalEngineer.Flight.Sections
 {
-    public class SectionLibrary
+    public static class SectionLibrary
     {
-        #region Instance
-
-        private static readonly SectionLibrary instance = new SectionLibrary();
-
-        /// <summary>
-        ///     Gets the current instance of the section library.
-        /// </summary>
-        public static SectionLibrary Instance
-        {
-            get { return instance; }
-        }
-
-        #endregion
-
         #region Constructors
 
         /// <summary>
         ///     Sets up and populates the library with the stock sections on creation.
         /// </summary>
-        private SectionLibrary()
-        {
-            this.StockSections = new List<SectionModule>();
-            this.CustomSections = new List<SectionModule>();
-
-            this.StockSections.Add(new SectionModule
+        static SectionLibrary()
+        {
+            StockSections = new List<SectionModule>();
+            CustomSections = new List<SectionModule>();
+
+            StockSections.Add(new SectionModule
             {
                 Name = "ORBITAL",
                 Abbreviation = "ORBT",
-                ReadoutModules = ReadoutLibrary.Instance.GetCategory(ReadoutCategory.Orbital).Where(r => r.IsDefault).ToList()
-            });
-
-            this.StockSections.Add(new SectionModule
+                ReadoutModules = ReadoutLibrary.GetCategory(ReadoutCategory.GetCategory("Orbital")).Where(r => r.IsDefault).ToList()
+            });
+
+            StockSections.Add(new SectionModule
             {
                 Name = "SURFACE",
                 Abbreviation = "SURF",
-                ReadoutModules = ReadoutLibrary.Instance.GetCategory(ReadoutCategory.Surface).Where(r => r.IsDefault).ToList()
-            });
-
-            this.StockSections.Add(new SectionModule
+                ReadoutModules = ReadoutLibrary.GetCategory(ReadoutCategory.GetCategory("Surface")).Where(r => r.IsDefault).ToList()
+            });
+
+            StockSections.Add(new SectionModule
             {
                 Name = "VESSEL",
                 Abbreviation = "VESL",
-                ReadoutModules = ReadoutLibrary.Instance.GetCategory(ReadoutCategory.Vessel).Where(r => r.IsDefault).ToList()
-            });
-
-            this.StockSections.Add(new SectionModule
+                ReadoutModules = ReadoutLibrary.GetCategory(ReadoutCategory.GetCategory("Vessel")).Where(r => r.IsDefault).ToList()
+            });
+
+            StockSections.Add(new SectionModule
             {
                 Name = "RENDEZVOUS",
                 Abbreviation = "RDZV",
-                ReadoutModules = ReadoutLibrary.Instance.GetCategory(ReadoutCategory.Rendezvous).Where(r => r.IsDefault).ToList()
+                ReadoutModules = ReadoutLibrary.GetCategory(ReadoutCategory.GetCategory("Rendezvous")).Where(r => r.IsDefault).ToList()
             });
         }
 
@@ -91,22 +77,22 @@
         /// <summary>
         ///     Gets and sets a list of stock sections
         /// </summary>
-        public List<SectionModule> StockSections { get; set; }
+        public static List<SectionModule> StockSections { get; set; }
 
         /// <summary>
         ///     Gets and sets a list of custom sections.
         /// </summary>
-        public List<SectionModule> CustomSections { get; set; }
+        public static List<SectionModule> CustomSections { get; set; }
 
         /// <summary>
         ///     Gets the number of sections that are being drawn on the display stack.
         /// </summary>
-        public int NumberOfStackSections { get; private set; }
+        public static int NumberOfStackSections { get; private set; }
 
         /// <summary>
         ///     Gets the number of total sections that are stored in the library.
         /// </summary>
-        public int NumberOfSections { get; private set; }
+        public static int NumberOfSections { get; private set; }
 
         #endregion
 
@@ -115,16 +101,16 @@
         /// <summary>
         ///     Fixed update all of the sections.
         /// </summary>
-        public void FixedUpdate()
-        {
-            this.FixedUpdateSections(this.StockSections);
-            this.FixedUpdateSections(this.CustomSections);
+        public static void FixedUpdate()
+        {
+            FixedUpdateSections(StockSections);
+            FixedUpdateSections(CustomSections);
         }
 
         /// <summary>
         ///     Fixed updates a list of sections.
         /// </summary>
-        private void FixedUpdateSections(IEnumerable<SectionModule> sections)
+        private static void FixedUpdateSections(IEnumerable<SectionModule> sections)
         {
             foreach (var section in sections)
             {
@@ -138,19 +124,19 @@
         /// <summary>
         ///     Update all of the sections and process section counts.
         /// </summary>
-        public void Update()
-        {
-            this.NumberOfStackSections = 0;
-            this.NumberOfSections = 0;
-
-            this.UpdateSections(this.StockSections);
-            this.UpdateSections(this.CustomSections);
+        public static void Update()
+        {
+            NumberOfStackSections = 0;
+            NumberOfSections = 0;
+
+            UpdateSections(StockSections);
+            UpdateSections(CustomSections);
         }
 
         /// <summary>
         ///     Updates a list of sections and increments the section counts.
         /// </summary>
-        private void UpdateSections(IEnumerable<SectionModule> sections)
+        private static void UpdateSections(IEnumerable<SectionModule> sections)
         {
             foreach (var section in sections)
             {
@@ -167,7 +153,7 @@
                             }
                         }
 
-                        this.NumberOfStackSections++;
+                        NumberOfStackSections++;
                     }
                     else
                     {
@@ -183,7 +169,7 @@
                     section.Update();
                 }
 
-                this.NumberOfSections++;
+                NumberOfSections++;
             }
         }
 
@@ -194,22 +180,22 @@
         /// <summary>
         ///     Saves the state of all the stored sections.
         /// </summary>
-        public void Save()
+        public static void Save()
         {
             var handler = new SettingHandler();
-            handler.Set("StockSections", this.StockSections);
-            handler.Set("CustomSections", this.CustomSections);
+            handler.Set("StockSections", StockSections);
+            handler.Set("CustomSections", CustomSections);
             handler.Save("SectionLibrary.xml");
         }
 
         /// <summary>
         ///     Loads the state of all stored sections.
         /// </summary>
-        public void Load()
+        public static void Load()
         {
             var handler = SettingHandler.Load("SectionLibrary.xml", new[] {typeof(List<SectionModule>)});
-            this.StockSections = handler.Get("StockSections", this.StockSections);
-            this.CustomSections = handler.Get("CustomSections", this.CustomSections);
+            StockSections = handler.Get("StockSections", StockSections);
+            CustomSections = handler.Get("CustomSections", CustomSections);
         }
 
         #endregion
@@ -219,51 +205,65 @@
         /// <summary>
         ///     Gets a section that has the specified name.
         /// </summary>
-        public SectionModule GetSection(string name)
-        {
-            return this.GetStockSection(name) ?? this.GetCustomSection(name);
+        public static SectionModule GetSection(string name)
+        {
+            return GetStockSection(name) ?? GetCustomSection(name);
         }
 
         /// <summary>
         ///     Gets a stock section that has the specified name.
         /// </summary>
-        public SectionModule GetStockSection(string name)
-        {
-            return this.StockSections.FirstOrDefault(s => s.Name == name);
+        public static SectionModule GetStockSection(string name)
+        {
+            return StockSections.FirstOrDefault(s => s.Name == name);
         }
 
         /// <summary>
         ///     Gets a custom section that has the specified name.
         /// </summary>
-        public SectionModule GetCustomSection(string name)
-        {
-            return this.CustomSections.FirstOrDefault(s => s.Name == name);
+        public static SectionModule GetCustomSection(string name)
+        {
+            return CustomSections.FirstOrDefault(s => s.Name == name);
         }
 
         /// <summary>
         ///     Removes a section with the specified name.
         /// </summary>
-        public bool RemoveSection(string name)
-        {
-            return this.RemoveStockSection(name) || this.RemoveCustomSection(name);
+        public static bool RemoveSection(string name)
+        {
+            return RemoveStockSection(name) || RemoveCustomSection(name);
         }
 
         /// <summary>
         ///     Removes as stock section with the specified name.
         /// </summary>
-        public bool RemoveStockSection(string name)
-        {
-            return this.StockSections.Remove(this.GetStockSection(name));
+        public static bool RemoveStockSection(string name)
+        {
+            return StockSections.Remove(GetStockSection(name));
         }
 
         /// <summary>
         ///     Removes a custom section witht he specified name.
         /// </summary>
-        public bool RemoveCustomSection(string name)
-        {
-            return this.CustomSections.Remove(this.GetCustomSection(name));
-        }
-
-        #endregion
+        public static bool RemoveCustomSection(string name)
+        {
+            return CustomSections.Remove(GetCustomSection(name));
+        }
+
+        #endregion
+
+        //#region Instance
+
+        //private static readonly SectionLibrary instance = new SectionLibrary();
+
+        ///// <summary>
+        /////     Gets the current instance of the section library.
+        ///// </summary>
+        //public static SectionLibrary Instance
+        //{
+        //    get { return instance; }
+        //}
+
+        //#endregion
     }
 }

--- a/KerbalEngineer/Flight/Sections/SectionModule.cs
+++ b/KerbalEngineer/Flight/Sections/SectionModule.cs
@@ -147,7 +147,7 @@
         public string[] ReadoutModuleNames
         {
             get { return this.ReadoutModules.Select(r => r.Category + "." + r.GetType().Name).ToArray(); }
-            set { this.ReadoutModules = value.Select(n => ReadoutLibrary.Instance.GetReadoutModule(n)).ToList(); }
+            set { this.ReadoutModules = value.Select(ReadoutLibrary.GetReadout).ToList(); }
         }
 
         /// <summary>

--- a/KerbalEngineer/KerbalEngineer.csproj
+++ b/KerbalEngineer/KerbalEngineer.csproj
@@ -63,8 +63,8 @@
     <Compile Include="Editor\BuildToolbar.cs" />
     <Compile Include="Flight\ActionMenuGui.cs" />
     <Compile Include="Flight\FlightEngineerPartless.cs" />
-    <Compile Include="Flight\Readouts\Misc\Separator.cs" />
-    <Compile Include="Flight\Readouts\Misc\GuiSizeAdjustor.cs" />
+    <Compile Include="Flight\Readouts\Miscellaneous\Separator.cs" />
+    <Compile Include="Flight\Readouts\Miscellaneous\GuiSizeAdjustor.cs" />
     <Compile Include="Flight\Readouts\Surface\ImpactBiome.cs" />
     <Compile Include="Flight\Readouts\Surface\Slope.cs" />
     <Compile Include="Flight\Readouts\Surface\Biome.cs" />

--- a/KerbalEngineer/Logger.cs
+++ b/KerbalEngineer/Logger.cs
@@ -57,8 +57,8 @@
 
             lock (messages)
             {
-                messages.Add(new[] { "Executing: " + assemblyName.Name + " - " + assemblyName.Version });
-                messages.Add(new[] { "Assembly: " + Assembly.GetExecutingAssembly().Location });
+                messages.Add(new[] {"Executing: " + assemblyName.Name + " - " + assemblyName.Version});
+                messages.Add(new[] {"Assembly: " + Assembly.GetExecutingAssembly().Location});
             }
             Blank();
         }
@@ -76,7 +76,7 @@
         {
             lock (messages)
             {
-                messages.Add(new string[] { });
+                messages.Add(new string[] {});
             }
         }
 
@@ -88,15 +88,15 @@
                 {
                     if (obj is IEnumerable)
                     {
-                        messages.Add(new[] { "Log " + DateTime.Now.TimeOfDay, obj.ToString() });
+                        messages.Add(new[] {"Log " + DateTime.Now.TimeOfDay, obj.ToString()});
                         foreach (var o in obj as IEnumerable)
                         {
-                            messages.Add(new[] { "\t", o.ToString() });
+                            messages.Add(new[] {"\t", o.ToString()});
                         }
                     }
                     else
                     {
-                        messages.Add(new[] { "Log " + DateTime.Now.TimeOfDay, obj.ToString() });
+                        messages.Add(new[] {"Log " + DateTime.Now.TimeOfDay, obj.ToString()});
                     }
                 }
                 catch (Exception ex)
@@ -114,15 +114,15 @@
                 {
                     if (obj is IEnumerable)
                     {
-                        messages.Add(new[] { "Log " + DateTime.Now.TimeOfDay, name });
+                        messages.Add(new[] {"Log " + DateTime.Now.TimeOfDay, name});
                         foreach (var o in obj as IEnumerable)
                         {
-                            messages.Add(new[] { "\t", o.ToString() });
+                            messages.Add(new[] {"\t", o.ToString()});
                         }
                     }
                     else
                     {
-                        messages.Add(new[] { "Log " + DateTime.Now.TimeOfDay, obj.ToString() });
+                        messages.Add(new[] {"Log " + DateTime.Now.TimeOfDay, obj.ToString()});
                     }
                 }
                 catch (Exception ex)
@@ -136,7 +136,7 @@
         {
             lock (messages)
             {
-                messages.Add(new[] { "Log " + DateTime.Now.TimeOfDay, message });
+                messages.Add(new[] {"Log " + DateTime.Now.TimeOfDay, message});
             }
         }
 
@@ -144,7 +144,7 @@
         {
             lock (messages)
             {
-                messages.Add(new[] { "Warning " + DateTime.Now.TimeOfDay, message });
+                messages.Add(new[] {"Warning " + DateTime.Now.TimeOfDay, message});
             }
         }
 
@@ -152,7 +152,7 @@
         {
             lock (messages)
             {
-                messages.Add(new[] { "Error " + DateTime.Now.TimeOfDay, message });
+                messages.Add(new[] {"Error " + DateTime.Now.TimeOfDay, message});
             }
         }
 
@@ -160,8 +160,8 @@
         {
             lock (messages)
             {
-                messages.Add(new[] { "Exception " + DateTime.Now.TimeOfDay, ex.Message });
-                messages.Add(new[] { string.Empty, ex.StackTrace });
+                messages.Add(new[] {"Exception " + DateTime.Now.TimeOfDay, ex.Message});
+                messages.Add(new[] {string.Empty, ex.StackTrace});
                 Blank();
             }
         }
@@ -170,8 +170,8 @@
         {
             lock (messages)
             {
-                messages.Add(new[] { "Exception " + DateTime.Now.TimeOfDay, location + " // " + ex.Message });
-                messages.Add(new[] { string.Empty, ex.StackTrace });
+                messages.Add(new[] {"Exception " + DateTime.Now.TimeOfDay, location + " // " + ex.Message});
+                messages.Add(new[] {string.Empty, ex.StackTrace});
                 Blank();
             }
         }

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