Added acceleration readout.
Added acceleration readout.

--- a/KerbalEngineer/Extensions/DoubleExtensions.cs
+++ b/KerbalEngineer/Extensions/DoubleExtensions.cs
@@ -89,6 +89,22 @@
             catch (Exception ex)
             {
                 Logger.Exception(ex, "DoubleExtentions->ToSpeed");
+                return "ERR";
+            }
+        }
+
+        /// <summary>
+        ///     Convert to string formatted as acceleration.
+        /// </summary>
+        public static string ToAcceleration(this double value, bool showNotation = true)
+        {
+            try
+            {
+                return showNotation ? value.ToString("N2") + "m/s²" : value.ToString("N2");
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
                 return "ERR";
             }
         }

--- a/KerbalEngineer/Extensions/FloatExtensions.cs
+++ b/KerbalEngineer/Extensions/FloatExtensions.cs
@@ -85,6 +85,22 @@
             catch (Exception ex)
             {
                 Logger.Exception(ex, "FloatExtentions->ToSpeed");
+                return "ERR";
+            }
+        }
+
+        /// <summary>
+        ///     Convert to string formatted as acceleration.
+        /// </summary>
+        public static string ToAcceleration(this float value, bool showNotation = true)
+        {
+            try
+            {
+                return showNotation ? value.ToString("N2") + "m/s²" : value.ToString("N2");
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
                 return "ERR";
             }
         }

--- a/KerbalEngineer/Flight/FlightEngineerCore.cs
+++ b/KerbalEngineer/Flight/FlightEngineerCore.cs
@@ -1,253 +1,268 @@
-// 

-//     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.Flight.Readouts;

-using KerbalEngineer.Flight.Sections;

-

-using UnityEngine;

-

-#endregion

-

-namespace KerbalEngineer.Flight

-{

-    /// <summary>

-    ///     Core management system for the Flight Engineer.

-    /// </summary>

-    public sealed class FlightEngineerCore : MonoBehaviour

-    {

-        #region Instance

-

-        /// <summary>

-        ///     Gets the current instance of FlightEngineerCore.

-        /// </summary>

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

-

-        #endregion

-

-        #region Constructors

-

-        /// <summary>

-        ///     Create base Flight Engineer child objects.

-        /// </summary>

-        private void Awake()

-        {

-            try

-            {

-                Instance = this;

-

-                this.SectionWindows = new List<SectionWindow>();

-                this.SectionEditors = new List<SectionEditor>();

-                this.UpdatableModules = new List<IUpdatable>();

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

-            }

-            catch (Exception ex)

-            {

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

-            }

-        }

-

-        /// <summary>

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

-        /// </summary>

-        private void Start()

-        {

-            try

-            {

-                SectionLibrary.Instance.Load();

-                ReadoutLibrary.Instance.Reset();

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

-            }

-            catch (Exception ex)

-            {

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

-            }

-        }

-

-        #endregion

-

-        #region Properties

-

-        /// <summary>

-        ///     Gets the section windows for floating sections.

-        /// </summary>

-        public List<SectionWindow> SectionWindows { get; private set; }

-

-        /// <summary>

-        ///     Gets the editor windows for sections with open editors.

-        /// </summary>

-        public List<SectionEditor> SectionEditors { get; private set; }

-

-        /// <summary>

-        ///     Gets the list of currently running updatable modules.

-        /// </summary>

-        public List<IUpdatable> UpdatableModules { get; private set; }

-

-        #endregion

-

-        #region Updating

-

-        /// <summary>

-        ///     Update all required Flight Engineer objects.

-        /// </summary>

-        private void Update()

-        {

-            try

-            {

-                SectionLibrary.Instance.Update();

-                this.UpdateModules();

-            }

-            catch (Exception ex)

-            {

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

-            }

-        }

-

-        /// <summary>

-        ///     Update all updatable modules.

-        /// </summary>

-        private void UpdateModules()

-        {

-            try

-            {

-                foreach (var updatable in this.UpdatableModules)

-                {

-                    if (updatable is IUpdateRequest)

-                    {

-                        var request = updatable as IUpdateRequest;

-                        if (request.UpdateRequested)

-                        {

-                            updatable.Update();

-                            request.UpdateRequested = false;

-                        }

-                    }

-                    else

-                    {

-                        updatable.Update();

-                    }

-                }

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "FlightEngineerCore->UpdateModules");

-            }

-        }

-

-        #endregion

-

-        #region Destruction

-

-        /// <summary>

-        ///     Force the destruction of child objects on core destruction.

-        /// </summary>

-        private void OnDestroy()

-        {

-            try

-            {

-                SectionLibrary.Instance.Save();

-

-                foreach (var window in this.SectionWindows)

-                {

-                    print("[FlightEngineer]: Destroying Floating Window for " + window.ParentSection.Name);

-                    Destroy(window);

-                }

-

-                foreach (var editor in this.SectionEditors)

-                {

-                    print("[FlightEngineer]: Destroying Editor Window for " + editor.ParentSection.Name);

-                    Destroy(editor);

-                }

-

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

-            }

-            catch (Exception ex)

-            {

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

-            }

-        }

-

-        #endregion

-

-        #region Methods

-

-        /// <summary>

-        ///     Creates a section window, adds it to the FlightEngineerCore and returns a reference to it.

-        /// </summary>

-        public SectionWindow AddSectionWindow(SectionModule section)

-        {

-            try

-            {

-                var window = this.gameObject.AddComponent<SectionWindow>();

-                window.ParentSection = section;

-                window.WindowPosition = new Rect(section.FloatingPositionX, section.FloatingPositionY, 0, 0);

-                this.SectionWindows.Add(window);

-                return window;

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "FlightEngineerCore->AddSectionWindow");

-                return null;

-            }

-        }

-

-        /// <summary>

-        ///     Creates a section editor, adds it to the FlightEngineerCore and returns a reference to it.

-        /// </summary>

-        public SectionEditor AddSectionEditor(SectionModule section)

-        {

-            try

-            {

-                var editor = this.gameObject.AddComponent<SectionEditor>();

-                editor.ParentSection = section;

-                editor.WindowPosition = new Rect(section.EditorPositionX, section.EditorPositionY, SectionEditor.Width, SectionEditor.Height);

-                this.SectionEditors.Add(editor);

-                return editor;

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "FlightEngineerCore->AddSectionEditor");

-                return null;

-            }

-        }

-

-        /// <summary>

-        ///     Adds an updatable object to be automatically updated every frame and will ignore duplicate objects.

-        /// </summary>

-        public void AddUpdatable(IUpdatable updatable)

-        {

-            try

-            {

-                if (!this.UpdatableModules.Contains(updatable))

-                {

-                    this.UpdatableModules.Add(updatable);

-                }

-            }

-            catch (Exception ex)

-            {

-                Logger.Exception(ex, "FlightEngineerCore->AddUpdatable");

-            }

-        }

-

-        #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.Flight.Readouts;
+using KerbalEngineer.Flight.Sections;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight
+{
+    /// <summary>
+    ///     Core management system for the Flight Engineer.
+    /// </summary>
+    public sealed class FlightEngineerCore : MonoBehaviour
+    {
+        #region Instance
+
+        /// <summary>
+        ///     Gets the current instance of FlightEngineerCore.
+        /// </summary>
+        public static FlightEngineerCore Instance { get; private set; }
+
+        #endregion
+
+        #region Constructors
+
+        /// <summary>
+        ///     Create base Flight Engineer child objects.
+        /// </summary>
+        private void Awake()
+        {
+            try
+            {
+                Instance = this;
+
+                this.SectionWindows = new List<SectionWindow>();
+                this.SectionEditors = new List<SectionEditor>();
+                this.UpdatableModules = new List<IUpdatable>();
+                Logger.Log("FlightEngineerCore->Awake");
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "FlightEngineerCore->Awake");
+            }
+        }
+
+        /// <summary>
+        ///     Initialises the object's state on creation.
+        /// </summary>
+        private void Start()
+        {
+            try
+            {
+                SectionLibrary.Instance.Load();
+                ReadoutLibrary.Instance.Reset();
+                Logger.Log("FlightEngineerCore->Start");
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "FlightEngineerCore->Start");
+            }
+        }
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        ///     Gets the section windows for floating sections.
+        /// </summary>
+        public List<SectionWindow> SectionWindows { get; private set; }
+
+        /// <summary>
+        ///     Gets the editor windows for sections with open editors.
+        /// </summary>
+        public List<SectionEditor> SectionEditors { get; private set; }
+
+        /// <summary>
+        ///     Gets the list of currently running updatable modules.
+        /// </summary>
+        public List<IUpdatable> UpdatableModules { get; private set; }
+
+        #endregion
+
+        #region Updating
+
+        /// <summary>
+        ///     Fixed update all required Flight Engineer objects.
+        /// </summary>
+        private void FixedUpdate()
+        {
+            try
+            {
+                SectionLibrary.Instance.FixedUpdate();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        /// <summary>
+        ///     Update all required Flight Engineer objects.
+        /// </summary>
+        private void Update()
+        {
+            try
+            {
+                SectionLibrary.Instance.Update();
+                this.UpdateModules();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "FlightEngineerCore->Update");
+            }
+        }
+
+        /// <summary>
+        ///     Update all updatable modules.
+        /// </summary>
+        private void UpdateModules()
+        {
+            try
+            {
+                foreach (var updatable in this.UpdatableModules)
+                {
+                    if (updatable is IUpdateRequest)
+                    {
+                        var request = updatable as IUpdateRequest;
+                        if (request.UpdateRequested)
+                        {
+                            updatable.Update();
+                            request.UpdateRequested = false;
+                        }
+                    }
+                    else
+                    {
+                        updatable.Update();
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "FlightEngineerCore->UpdateModules");
+            }
+        }
+
+        #endregion
+
+        #region Destruction
+
+        /// <summary>
+        ///     Force the destruction of child objects on core destruction.
+        /// </summary>
+        private void OnDestroy()
+        {
+            try
+            {
+                SectionLibrary.Instance.Save();
+
+                foreach (var window in this.SectionWindows)
+                {
+                    print("[FlightEngineer]: Destroying Floating Window for " + window.ParentSection.Name);
+                    Destroy(window);
+                }
+
+                foreach (var editor in this.SectionEditors)
+                {
+                    print("[FlightEngineer]: Destroying Editor Window for " + editor.ParentSection.Name);
+                    Destroy(editor);
+                }
+
+                Logger.Log("FlightEngineerCore->OnDestroy");
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "FlightEngineerCore->OnDestroy");
+            }
+        }
+
+        #endregion
+
+        #region Methods
+
+        /// <summary>
+        ///     Creates a section window, adds it to the FlightEngineerCore and returns a reference to it.
+        /// </summary>
+        public SectionWindow AddSectionWindow(SectionModule section)
+        {
+            try
+            {
+                var window = this.gameObject.AddComponent<SectionWindow>();
+                window.ParentSection = section;
+                window.WindowPosition = new Rect(section.FloatingPositionX, section.FloatingPositionY, 0, 0);
+                this.SectionWindows.Add(window);
+                return window;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "FlightEngineerCore->AddSectionWindow");
+                return null;
+            }
+        }
+
+        /// <summary>
+        ///     Creates a section editor, adds it to the FlightEngineerCore and returns a reference to it.
+        /// </summary>
+        public SectionEditor AddSectionEditor(SectionModule section)
+        {
+            try
+            {
+                var editor = this.gameObject.AddComponent<SectionEditor>();
+                editor.ParentSection = section;
+                editor.WindowPosition = new Rect(section.EditorPositionX, section.EditorPositionY, SectionEditor.Width, SectionEditor.Height);
+                this.SectionEditors.Add(editor);
+                return editor;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "FlightEngineerCore->AddSectionEditor");
+                return null;
+            }
+        }
+
+        /// <summary>
+        ///     Adds an updatable object to be automatically updated every frame and will ignore duplicate objects.
+        /// </summary>
+        public void AddUpdatable(IUpdatable updatable)
+        {
+            try
+            {
+                if (!this.UpdatableModules.Contains(updatable))
+                {
+                    this.UpdatableModules.Add(updatable);
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "FlightEngineerCore->AddUpdatable");
+            }
+        }
+
+        #endregion
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs
+++ b/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs
@@ -1,198 +1,199 @@
-// 

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

-using System.Linq;

-

-using KerbalEngineer.Flight.Readouts.Misc;

-using KerbalEngineer.Flight.Readouts.Orbital;

-using KerbalEngineer.Flight.Readouts.Rendezvous;

-using KerbalEngineer.Flight.Readouts.Surface;

-using KerbalEngineer.Flight.Readouts.Vessel;

-using KerbalEngineer.Settings;

-

-using AltitudeSeaLevel = KerbalEngineer.Flight.Readouts.Surface.AltitudeSeaLevel;

-using ApoapsisHeight = KerbalEngineer.Flight.Readouts.Orbital.ApoapsisHeight;

-using OrbitalPeriod = KerbalEngineer.Flight.Readouts.Orbital.OrbitalPeriod;

-using PeriapsisHeight = KerbalEngineer.Flight.Readouts.Orbital.PeriapsisHeight;

-using TimeToApoapsis = KerbalEngineer.Flight.Readouts.Orbital.TimeToApoapsis;

-using TimeToPeriapsis = KerbalEngineer.Flight.Readouts.Orbital.TimeToPeriapsis;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Readouts

-{

-    public 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>();

-

-        #endregion

-

-        #region Constructors

-

-        /// <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 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();

-        }

-

-        #endregion

-

-        #region Properties

-

-        /// <summary>

-        ///     Gets and sets the available readout modules.

-        /// </summary>

-        public List<ReadoutModule> ReadoutModules

-        {

-            get { return this.readoutModules; }

-            set { this.readoutModules = value; }

-        }

-

-        #endregion

-

-        #region Public Methods

-

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

-        }

-

-        /// <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();

-        }

-

-        /// <summary>

-        ///     Resets all the readout modules.

-        /// </summary>

-        public void Reset()

-        {

-            foreach (var readout in this.readoutModules)

-            {

-                readout.Reset();

-            }

-        }

-

-        #endregion

-

-        #region Private Methods

-

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

-    }

+// 
+//     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.Collections.Generic;
+using System.Linq;
+
+using KerbalEngineer.Flight.Readouts.Misc;
+using KerbalEngineer.Flight.Readouts.Orbital;
+using KerbalEngineer.Flight.Readouts.Rendezvous;
+using KerbalEngineer.Flight.Readouts.Surface;
+using KerbalEngineer.Flight.Readouts.Vessel;
+using KerbalEngineer.Settings;
+
+using AltitudeSeaLevel = KerbalEngineer.Flight.Readouts.Surface.AltitudeSeaLevel;
+using ApoapsisHeight = KerbalEngineer.Flight.Readouts.Orbital.ApoapsisHeight;
+using OrbitalPeriod = KerbalEngineer.Flight.Readouts.Orbital.OrbitalPeriod;
+using PeriapsisHeight = KerbalEngineer.Flight.Readouts.Orbital.PeriapsisHeight;
+using TimeToApoapsis = KerbalEngineer.Flight.Readouts.Orbital.TimeToApoapsis;
+using TimeToPeriapsis = KerbalEngineer.Flight.Readouts.Orbital.TimeToPeriapsis;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts
+{
+    public 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>();
+
+        #endregion
+
+        #region Constructors
+
+        /// <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();
+        }
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        ///     Gets and sets the available readout modules.
+        /// </summary>
+        public List<ReadoutModule> ReadoutModules
+        {
+            get { return this.readoutModules; }
+            set { this.readoutModules = value; }
+        }
+
+        #endregion
+
+        #region Public Methods
+
+        /// <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);
+        }
+
+        /// <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();
+        }
+
+        /// <summary>
+        ///     Resets all the readout modules.
+        /// </summary>
+        public void Reset()
+        {
+            foreach (var readout in this.readoutModules)
+            {
+                readout.Reset();
+            }
+        }
+
+        #endregion
+
+        #region Private Methods
+
+        /// <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
+    }
 }

--- a/KerbalEngineer/Flight/Readouts/ReadoutModule.cs
+++ b/KerbalEngineer/Flight/Readouts/ReadoutModule.cs
@@ -1,242 +1,247 @@
-// 

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

-{

-    public abstract class ReadoutModule

-    {

-        #region Constructors

-

-        /// <summary>

-        ///     Creates a new readout module.

-        /// </summary>

-        protected ReadoutModule()

-        {

-            this.InitialiseStyles();

-            GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;

-        }

-

-        #endregion

-

-        #region Properties

-

-        /// <summary>

-        ///     Gets and sets the readout name.

-        /// </summary>

-        public string Name { get; set; }

-

-        public string HelpString { get; set; }

-

-        public bool ShowHelp { get; set; }

-

-        public bool ResizeRequested { get; set; }

-

-        public bool IsDefault { get; set; }

-

-        public bool Cloneable { get; set; }

-

-        /// <summary>

-        ///     Gets ans sets the readout category.

-        /// </summary>

-        public ReadoutCategory Category { get; set; }

-

-        /// <summary>

-        ///     Gets the width of the content. (Sum of NameStyle + ValueStyle widths.)

-        /// </summary>

-        public float ContentWidth

-        {

-            get { return this.NameStyle.fixedWidth + this.ValueStyle.fixedWidth; }

-        }

-

-        #endregion

-

-        #region GUIStyles

-

-        /// <summary>

-        ///     Gets and sets the name style.

-        /// </summary>

-        public GUIStyle NameStyle { get; set; }

-

-        /// <summary>

-        ///     Gets and sets the value style.

-        /// </summary>

-        public GUIStyle ValueStyle { get; set; }

-

-        /// <summary>

-        ///     Gets and sets the message style.

-        /// </summary>

-        public GUIStyle MessageStyle { get; set; }

-

-        /// <summary>

-        ///     Gets and sets the flexible label style.

-        /// </summary>

-        public GUIStyle FlexiLabelStyle { get; set; }

-

-        /// <summary>

-        ///     Gets and sets the button style.

-        /// </summary>

-        public GUIStyle ButtonStyle { get; set; }

-

-        /// <summary>

-        ///     Gets and sets the text field style.

-        /// </summary>

-        public GUIStyle TextFieldStyle { get; set; }

-

-        /// <summary>

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

-        /// </summary>

-        private void InitialiseStyles()

-        {

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

-            {

-                normal =

-                {

-                    textColor = Color.white

-                },

-                margin = new RectOffset(),

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

-                alignment = TextAnchor.MiddleLeft,

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

-                fontStyle = FontStyle.Bold,

-                fixedWidth = 115.0f * GuiDisplaySize.Offset,

-                fixedHeight = 20.0f * GuiDisplaySize.Offset

-            };

-

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

-            {

-                margin = new RectOffset(),

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

-                alignment = TextAnchor.MiddleRight,

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

-                fontStyle = FontStyle.Normal,

-                fixedWidth = 115.0f * GuiDisplaySize.Offset,

-                fixedHeight = 20.0f * GuiDisplaySize.Offset

-            };

-

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

-            {

-                normal =

-                {

-                    textColor = Color.white

-                },

-                margin = new RectOffset(),

-                padding = new RectOffset(),

-                alignment = TextAnchor.MiddleCenter,

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

-                fontStyle = FontStyle.Normal,

-                fixedWidth = this.ContentWidth,

-                fixedHeight = 20.0f * GuiDisplaySize.Offset

-            };

-

-            this.FlexiLabelStyle = new GUIStyle(this.NameStyle)

-            {

-                fixedWidth = 0,

-                stretchWidth = true

-            };

-

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

-            {

-                normal =

-                {

-                    textColor = Color.white

-                },

-                margin = new RectOffset(0, 0, 1, 1),

-                padding = new RectOffset(),

-                alignment = TextAnchor.MiddleCenter,

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

-                fixedHeight = 18.0f * GuiDisplaySize.Offset

-            };

-

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

-            {

-                margin = new RectOffset(0, 0, 1, 1),

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

-                alignment = TextAnchor.MiddleLeft,

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

-                fixedHeight = 18.0f * GuiDisplaySize.Offset

-            };

-        }

-

-        private void OnSizeChanged()

-        {

-            this.InitialiseStyles();

-            this.ResizeRequested = true;

-        }

-

-        #endregion

-

-        #region Protected Methods

-

-        /// <summary>

-        ///     Draws a single data line.

-        /// </summary>

-        protected void DrawLine(string name, string value)

-        {

-            GUILayout.BeginHorizontal();

-            GUILayout.Label(name, this.NameStyle);

-            GUILayout.Label(value, this.ValueStyle);

-            GUILayout.EndHorizontal();

-        }

-

-        /// <summary>

-        ///     Draws a single data line.

-        /// </summary>

-        protected void DrawLine(string value)

-        {

-            GUILayout.BeginHorizontal();

-            GUILayout.Label(this.Name, this.NameStyle);

-            GUILayout.Label(value, this.ValueStyle);

-            GUILayout.EndHorizontal();

-        }

-

-        protected void DrawMessageLine(string value)

-        {

-            GUILayout.BeginHorizontal();

-            GUILayout.Label(value, this.MessageStyle);

-            GUILayout.EndHorizontal();

-        }

-

-        #endregion

-

-        #region Virtual Methods

-

-        /// <summary>

-        ///     Called on each update frame where the readout is visible.

-        /// </summary>

-        public virtual void Update() { }

-

-        /// <summary>

-        ///     Called when a readout is asked to draw its self.

-        /// </summary>

-        public virtual void Draw() { }

-

-        /// <summary>

-        ///     Called when the active vessel changes.

-        /// </summary>

-        public virtual void Reset() { }

-

-        #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
+{
+    public abstract class ReadoutModule
+    {
+        #region Constructors
+
+        /// <summary>
+        ///     Creates a new readout module.
+        /// </summary>
+        protected ReadoutModule()
+        {
+            this.InitialiseStyles();
+            GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
+        }
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        ///     Gets and sets the readout name.
+        /// </summary>
+        public string Name { get; set; }
+
+        public string HelpString { get; set; }
+
+        public bool ShowHelp { get; set; }
+
+        public bool ResizeRequested { get; set; }
+
+        public bool IsDefault { get; set; }
+
+        public bool Cloneable { get; set; }
+
+        /// <summary>
+        ///     Gets ans sets the readout category.
+        /// </summary>
+        public ReadoutCategory Category { get; set; }
+
+        /// <summary>
+        ///     Gets the width of the content. (Sum of NameStyle + ValueStyle widths.)
+        /// </summary>
+        public float ContentWidth
+        {
+            get { return this.NameStyle.fixedWidth + this.ValueStyle.fixedWidth; }
+        }
+
+        #endregion
+
+        #region GUIStyles
+
+        /// <summary>
+        ///     Gets and sets the name style.
+        /// </summary>
+        public GUIStyle NameStyle { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the value style.
+        /// </summary>
+        public GUIStyle ValueStyle { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the message style.
+        /// </summary>
+        public GUIStyle MessageStyle { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the flexible label style.
+        /// </summary>
+        public GUIStyle FlexiLabelStyle { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the button style.
+        /// </summary>
+        public GUIStyle ButtonStyle { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the text field style.
+        /// </summary>
+        public GUIStyle TextFieldStyle { get; set; }
+
+        /// <summary>
+        ///     Initialises all the styles required for this object.
+        /// </summary>
+        private void InitialiseStyles()
+        {
+            this.NameStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                margin = new RectOffset(),
+                padding = new RectOffset(5, 0, 0, 0),
+                alignment = TextAnchor.MiddleLeft,
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                fixedWidth = 115.0f * GuiDisplaySize.Offset,
+                fixedHeight = 20.0f * GuiDisplaySize.Offset
+            };
+
+            this.ValueStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                margin = new RectOffset(),
+                padding = new RectOffset(0, 5, 0, 0),
+                alignment = TextAnchor.MiddleRight,
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Normal,
+                fixedWidth = 115.0f * GuiDisplaySize.Offset,
+                fixedHeight = 20.0f * GuiDisplaySize.Offset
+            };
+
+            this.MessageStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                margin = new RectOffset(),
+                padding = new RectOffset(),
+                alignment = TextAnchor.MiddleCenter,
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Normal,
+                fixedWidth = this.ContentWidth,
+                fixedHeight = 20.0f * GuiDisplaySize.Offset
+            };
+
+            this.FlexiLabelStyle = new GUIStyle(this.NameStyle)
+            {
+                fixedWidth = 0,
+                stretchWidth = true
+            };
+
+            this.ButtonStyle = new GUIStyle(HighLogic.Skin.button)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                margin = new RectOffset(0, 0, 1, 1),
+                padding = new RectOffset(),
+                alignment = TextAnchor.MiddleCenter,
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fixedHeight = 18.0f * GuiDisplaySize.Offset
+            };
+
+            this.TextFieldStyle = new GUIStyle(HighLogic.Skin.textField)
+            {
+                margin = new RectOffset(0, 0, 1, 1),
+                padding = new RectOffset(5, 5, 0, 0),
+                alignment = TextAnchor.MiddleLeft,
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fixedHeight = 18.0f * GuiDisplaySize.Offset
+            };
+        }
+
+        private void OnSizeChanged()
+        {
+            this.InitialiseStyles();
+            this.ResizeRequested = true;
+        }
+
+        #endregion
+
+        #region Protected Methods
+
+        /// <summary>
+        ///     Draws a single data line.
+        /// </summary>
+        protected void DrawLine(string name, string value)
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Label(name, this.NameStyle);
+            GUILayout.Label(value, this.ValueStyle);
+            GUILayout.EndHorizontal();
+        }
+
+        /// <summary>
+        ///     Draws a single data line.
+        /// </summary>
+        protected void DrawLine(string value)
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Label(this.Name, this.NameStyle);
+            GUILayout.Label(value, this.ValueStyle);
+            GUILayout.EndHorizontal();
+        }
+
+        protected void DrawMessageLine(string value)
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Label(value, this.MessageStyle);
+            GUILayout.EndHorizontal();
+        }
+
+        #endregion
+
+        #region Virtual Methods
+
+        /// <summary>
+        ///     Called on each fixed update frame where the readout is visible.
+        /// </summary>
+        public virtual void FixedUpdate() { }
+
+        /// <summary>
+        ///     Called on each update frame where the readout is visible.
+        /// </summary>
+        public virtual void Update() { }
+
+        /// <summary>
+        ///     Called when a readout is asked to draw its self.
+        /// </summary>
+        public virtual void Draw() { }
+
+        /// <summary>
+        ///     Called when the active vessel changes.
+        /// </summary>
+        public virtual void Reset() { }
+
+        #endregion
+    }
 }

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/Acceleration.cs
@@ -1,1 +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 System.Diagnostics;
+
+using KerbalEngineer.Extensions;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class Acceleration : ReadoutModule
+    {
+        private bool showing;
+
+        public Acceleration()
+        {
+            this.Name = "Acceleration";
+            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 / SimulationProcessor.LastStage.totalMass).ToAcceleration(false) + " / " + (SimulationProcessor.LastStage.thrust / SimulationProcessor.LastStage.totalMass).ToAcceleration());
+            }
+            else if (this.showing)
+            {
+                this.showing = false;
+                this.ResizeRequested = true;
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+        }
+    }
+}

--- a/KerbalEngineer/Flight/Sections/SectionLibrary.cs
+++ b/KerbalEngineer/Flight/Sections/SectionLibrary.cs
@@ -1,246 +1,269 @@
-// 

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

-using System.Linq;

-

-using KerbalEngineer.Flight.Readouts;

-using KerbalEngineer.Settings;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Sections

-{

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

-            {

-                Name = "ORBITAL",

-                Abbreviation = "ORBT",

-                ReadoutModules = ReadoutLibrary.Instance.GetCategory(ReadoutCategory.Orbital).Where(r => r.IsDefault).ToList()

-            });

-

-            this.StockSections.Add(new SectionModule

-            {

-                Name = "SURFACE",

-                Abbreviation = "SURF",

-                ReadoutModules = ReadoutLibrary.Instance.GetCategory(ReadoutCategory.Surface).Where(r => r.IsDefault).ToList()

-            });

-

-            this.StockSections.Add(new SectionModule

-            {

-                Name = "VESSEL",

-                Abbreviation = "VESL",

-                ReadoutModules = ReadoutLibrary.Instance.GetCategory(ReadoutCategory.Vessel).Where(r => r.IsDefault).ToList()

-            });

-

-            this.StockSections.Add(new SectionModule

-            {

-                Name = "RENDEZVOUS",

-                Abbreviation = "RDZV",

-                ReadoutModules = ReadoutLibrary.Instance.GetCategory(ReadoutCategory.Rendezvous).Where(r => r.IsDefault).ToList()

-            });

-        }

-

-        #endregion

-

-        #region Properties

-

-        /// <summary>

-        ///     Gets and sets a list of stock sections

-        /// </summary>

-        public List<SectionModule> StockSections { get; set; }

-

-        /// <summary>

-        ///     Gets and sets a list of custom sections.

-        /// </summary>

-        public 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; }

-

-        /// <summary>

-        ///     Gets the number of total sections that are stored in the library.

-        /// </summary>

-        public int NumberOfSections { get; private set; }

-

-        #endregion

-

-        #region Updating

-

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

-        }

-

-        /// <summary>

-        ///     Updates a list of sections and increments the section counts.

-        /// </summary>

-        private void UpdateSections(IEnumerable<SectionModule> sections)

-        {

-            foreach (var section in sections)

-            {

-                if (section.IsVisible)

-                {

-                    if (!section.IsFloating)

-                    {

-                        foreach (var readout in section.ReadoutModules)

-                        {

-                            if (readout.ResizeRequested)

-                            {

-                                DisplayStack.Instance.RequestResize();

-                                readout.ResizeRequested = false;

-                            }

-                        }

-

-                        this.NumberOfStackSections++;

-                    }

-                    else

-                    {

-                        foreach (var readout in section.ReadoutModules)

-                        {

-                            if (readout.ResizeRequested)

-                            {

-                                section.Window.RequestResize();

-                                readout.ResizeRequested = false;

-                            }

-                        }

-                    }

-                    section.Update();

-                }

-

-                this.NumberOfSections++;

-            }

-        }

-

-        #endregion

-

-        #region Saving and Loading

-

-        /// <summary>

-        ///     Saves the state of all the stored sections.

-        /// </summary>

-        public void Save()

-        {

-            var handler = new SettingHandler();

-            handler.Set("StockSections", this.StockSections);

-            handler.Set("CustomSections", this.CustomSections);

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

-        }

-

-        /// <summary>

-        ///     Loads the state of all stored sections.

-        /// </summary>

-        public 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);

-        }

-

-        #endregion

-

-        #region Methods

-

-        /// <summary>

-        ///     Gets a section that has the specified name.

-        /// </summary>

-        public SectionModule GetSection(string name)

-        {

-            return this.GetStockSection(name) ?? this.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);

-        }

-

-        /// <summary>

-        ///     Gets a custom section that has the specified name.

-        /// </summary>

-        public SectionModule GetCustomSection(string name)

-        {

-            return this.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);

-        }

-

-        /// <summary>

-        ///     Removes as stock section with the specified name.

-        /// </summary>

-        public bool RemoveStockSection(string name)

-        {

-            return this.StockSections.Remove(this.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

-    }

+// 
+//     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.Collections.Generic;
+using System.Linq;
+
+using KerbalEngineer.Flight.Readouts;
+using KerbalEngineer.Settings;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Sections
+{
+    public 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
+            {
+                Name = "ORBITAL",
+                Abbreviation = "ORBT",
+                ReadoutModules = ReadoutLibrary.Instance.GetCategory(ReadoutCategory.Orbital).Where(r => r.IsDefault).ToList()
+            });
+
+            this.StockSections.Add(new SectionModule
+            {
+                Name = "SURFACE",
+                Abbreviation = "SURF",
+                ReadoutModules = ReadoutLibrary.Instance.GetCategory(ReadoutCategory.Surface).Where(r => r.IsDefault).ToList()
+            });
+
+            this.StockSections.Add(new SectionModule
+            {
+                Name = "VESSEL",
+                Abbreviation = "VESL",
+                ReadoutModules = ReadoutLibrary.Instance.GetCategory(ReadoutCategory.Vessel).Where(r => r.IsDefault).ToList()
+            });
+
+            this.StockSections.Add(new SectionModule
+            {
+                Name = "RENDEZVOUS",
+                Abbreviation = "RDZV",
+                ReadoutModules = ReadoutLibrary.Instance.GetCategory(ReadoutCategory.Rendezvous).Where(r => r.IsDefault).ToList()
+            });
+        }
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        ///     Gets and sets a list of stock sections
+        /// </summary>
+        public List<SectionModule> StockSections { get; set; }
+
+        /// <summary>
+        ///     Gets and sets a list of custom sections.
+        /// </summary>
+        public 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; }
+
+        /// <summary>
+        ///     Gets the number of total sections that are stored in the library.
+        /// </summary>
+        public int NumberOfSections { get; private set; }
+
+        #endregion
+
+        #region Updating
+
+        /// <summary>
+        ///     Fixed update all of the sections.
+        /// </summary>
+        public void FixedUpdate()
+        {
+            this.FixedUpdateSections(this.StockSections);
+            this.FixedUpdateSections(this.CustomSections);
+        }
+
+        /// <summary>
+        ///     Fixed updates a list of sections.
+        /// </summary>
+        private void FixedUpdateSections(IEnumerable<SectionModule> sections)
+        {
+            foreach (var section in sections)
+            {
+                if (section.IsVisible)
+                {
+                    section.FixedUpdate();
+                }
+            }
+        }
+
+        /// <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);
+        }
+
+        /// <summary>
+        ///     Updates a list of sections and increments the section counts.
+        /// </summary>
+        private void UpdateSections(IEnumerable<SectionModule> sections)
+        {
+            foreach (var section in sections)
+            {
+                if (section.IsVisible)
+                {
+                    if (!section.IsFloating)
+                    {
+                        foreach (var readout in section.ReadoutModules)
+                        {
+                            if (readout.ResizeRequested)
+                            {
+                                DisplayStack.Instance.RequestResize();
+                                readout.ResizeRequested = false;
+                            }
+                        }
+
+                        this.NumberOfStackSections++;
+                    }
+                    else
+                    {
+                        foreach (var readout in section.ReadoutModules)
+                        {
+                            if (readout.ResizeRequested)
+                            {
+                                section.Window.RequestResize();
+                                readout.ResizeRequested = false;
+                            }
+                        }
+                    }
+                    section.Update();
+                }
+
+                this.NumberOfSections++;
+            }
+        }
+
+        #endregion
+
+        #region Saving and Loading
+
+        /// <summary>
+        ///     Saves the state of all the stored sections.
+        /// </summary>
+        public void Save()
+        {
+            var handler = new SettingHandler();
+            handler.Set("StockSections", this.StockSections);
+            handler.Set("CustomSections", this.CustomSections);
+            handler.Save("SectionLibrary.xml");
+        }
+
+        /// <summary>
+        ///     Loads the state of all stored sections.
+        /// </summary>
+        public 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);
+        }
+
+        #endregion
+
+        #region Methods
+
+        /// <summary>
+        ///     Gets a section that has the specified name.
+        /// </summary>
+        public SectionModule GetSection(string name)
+        {
+            return this.GetStockSection(name) ?? this.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);
+        }
+
+        /// <summary>
+        ///     Gets a custom section that has the specified name.
+        /// </summary>
+        public SectionModule GetCustomSection(string name)
+        {
+            return this.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);
+        }
+
+        /// <summary>
+        ///     Removes as stock section with the specified name.
+        /// </summary>
+        public bool RemoveStockSection(string name)
+        {
+            return this.StockSections.Remove(this.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
+    }
 }

--- a/KerbalEngineer/Flight/Sections/SectionModule.cs
+++ b/KerbalEngineer/Flight/Sections/SectionModule.cs
@@ -1,315 +1,331 @@
-// 

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

-using System.Linq;

-using System.Xml.Serialization;

-

-using KerbalEngineer.Flight.Readouts;

-

-using UnityEngine;

-

-#endregion

-

-namespace KerbalEngineer.Flight.Sections

-{

-    /// <summary>

-    ///     Object for management and display of readout modules.

-    /// </summary>

-    public class SectionModule

-    {

-        #region Fields

-

-        private SectionEditor editor;

-        private int numberOfReadouts;

-

-        #endregion

-

-        #region Constructors

-

-        /// <summary>

-        ///     Creates a new section module.

-        /// </summary>

-        public SectionModule()

-        {

-            this.FloatingPositionX = Screen.width * 0.5f - 125.0f;

-            this.FloatingPositionY = 100.0f;

-            this.EditorPositionX = Screen.width * 0.5f - SectionEditor.Width * 0.5f;

-            this.EditorPositionY = Screen.height * 0.5f - SectionEditor.Height * 0.5f;

-            this.ReadoutModules = new List<ReadoutModule>();

-            this.InitialiseStyles();

-            GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;

-        }

-

-        #endregion

-

-        #region Properties

-

-        /// <summary>

-        ///     Gets and sets the name of the section.

-        /// </summary>

-        public string Name { get; set; }

-

-        /// <summary>

-        ///     Gets and sets the abbreviation of the section.

-        /// </summary>

-        public string Abbreviation { get; set; }

-

-        /// <summary>

-        ///     Gets and sets the visibility of the section.

-        /// </summary>

-        public bool IsVisible { get; set; }

-

-        /// <summary>

-        ///     Gets and sets whether the section is custom.

-        /// </summary>

-        public bool IsCustom { get; set; }

-

-        /// <summary>

-        ///     Gets and sets the X position of the floating window. (Only used for serialisation.)

-        /// </summary>

-        public float FloatingPositionX { get; set; }

-

-        /// <summary>

-        ///     Gets and sets the Y position of the floating window. (Only used for serialisation.)

-        /// </summary>

-        public float FloatingPositionY { get; set; }

-

-        /// <summary>

-        ///     Gets and sets whether the section is in a floating state.

-        /// </summary>

-        public bool IsFloating

-        {

-            get { return this.Window != null; }

-            set

-            {

-                if (value && this.Window == null)

-                {

-                    this.Window = FlightEngineerCore.Instance.AddSectionWindow(this);

-                }

-                else if (!value && this.Window != null)

-                {

-                    Object.Destroy(this.Window);

-                }

-            }

-        }

-

-        /// <summary>

-        ///     Gets and sets the X position of the editor window. (Only used for serialisation.)

-        /// </summary>

-        public float EditorPositionX { get; set; }

-

-        /// <summary>

-        ///     Gets and sets the Y position of the editor window. (Only used for serialisation.)

-        /// </summary>

-        public float EditorPositionY { get; set; }

-

-        /// <summary>

-        ///     Gets and sets whether the section editor is visible.

-        /// </summary>

-        public bool IsEditorVisible

-        {

-            get { return this.editor != null; }

-            set

-            {

-                if (value && this.editor == null)

-                {

-                    this.editor = FlightEngineerCore.Instance.AddSectionEditor(this);

-                }

-                else if (!value && this.editor != null)

-                {

-                    Object.Destroy(this.editor);

-                }

-            }

-        }

-

-        /// <summary>

-        ///     Gets and sets the names of the installed readout modules. (Only used with serialisation.)

-        /// </summary>

-        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(); }

-        }

-

-        /// <summary>

-        ///     Gets and sets the list of readout modules.

-        /// </summary>

-        [XmlIgnore] public List<ReadoutModule> ReadoutModules { get; set; }

-

-        /// <summary>

-        ///     Gets and sets the floating window.

-        /// </summary>

-        [XmlIgnore] public SectionWindow Window { get; set; }

-

-        #endregion

-

-        #region GUIStyles

-

-        private GUIStyle boxStyle;

-        private GUIStyle buttonStyle;

-        private GUIStyle messageStyle;

-        private GUIStyle titleStyle;

-

-        /// <summary>

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

-        /// </summary>

-        private void InitialiseStyles()

-        {

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

-            {

-                margin = new RectOffset(),

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

-            };

-

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

-            {

-                normal =

-                {

-                    textColor = Color.white

-                },

-                margin = new RectOffset(),

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

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

-                fontStyle = FontStyle.Bold,

-                stretchWidth = true

-            };

-

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

-            {

-                normal =

-                {

-                    textColor = Color.white

-                },

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

-                padding = new RectOffset(),

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

-                stretchHeight = true,

-                fixedWidth = 60.0f * GuiDisplaySize.Offset

-            };

-

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

-            {

-                normal =

-                {

-                    textColor = Color.white

-                },

-                margin = new RectOffset(),

-                padding = new RectOffset(),

-                alignment = TextAnchor.MiddleCenter,

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

-                fontStyle = FontStyle.Bold,

-                fixedWidth = 220.0f * GuiDisplaySize.Offset,

-                fixedHeight = 20.0f * GuiDisplaySize.Offset

-            };

-        }

-

-        private void OnSizeChanged()

-        {

-            this.InitialiseStyles();

-        }

-

-        #endregion

-

-        #region Updating

-

-        /// <summary>

-        ///     Updates all of the internal readout modules.

-        /// </summary>

-        public void Update()

-        {

-            if (!this.IsVisible)

-            {

-                return;

-            }

-

-            foreach (var readout in this.ReadoutModules)

-            {

-                readout.Update();

-            }

-

-            if (this.numberOfReadouts != this.ReadoutModules.Count)

-            {

-                this.numberOfReadouts = this.ReadoutModules.Count;

-                if (!this.IsFloating)

-                {

-                    DisplayStack.Instance.RequestResize();

-                }

-                else

-                {

-                    this.Window.RequestResize();

-                }

-            }

-        }

-

-        #endregion

-

-        #region Drawing

-

-        /// <summary>

-        ///     Draws the section and all of the internal readout modules.

-        /// </summary>

-        public void Draw()

-        {

-            if (!this.IsVisible)

-            {

-                return;

-            }

-

-            this.DrawSectionTitleBar();

-            this.DrawReadoutModules();

-        }

-

-        /// <summary>

-        ///     Draws the section title and action buttons.

-        /// </summary>

-        private void DrawSectionTitleBar()

-        {

-            GUILayout.BeginHorizontal();

-            GUILayout.Label(this.Name.ToUpper(), this.titleStyle);

-            this.IsEditorVisible = GUILayout.Toggle(this.IsEditorVisible, "EDIT", this.buttonStyle);

-            this.IsFloating = GUILayout.Toggle(this.IsFloating, "FLOAT", this.buttonStyle);

-            GUILayout.EndHorizontal();

-        }

-

-        /// <summary>

-        ///     Draws all the readout modules.

-        /// </summary>

-        private void DrawReadoutModules()

-        {

-            GUILayout.BeginVertical(this.boxStyle);

-            if (this.ReadoutModules.Count > 0)

-            {

-                foreach (var readout in this.ReadoutModules)

-                {

-                    readout.Draw();

-                }

-            }

-            else

-            {

-                GUILayout.Label("No readouts are installed.", this.messageStyle);

-            }

-            GUILayout.EndVertical();

-        }

-

-        #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.Collections.Generic;
+using System.Linq;
+using System.Xml.Serialization;
+
+using KerbalEngineer.Flight.Readouts;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Sections
+{
+    /// <summary>
+    ///     Object for management and display of readout modules.
+    /// </summary>
+    public class SectionModule
+    {
+        #region Fields
+
+        private SectionEditor editor;
+        private int numberOfReadouts;
+
+        #endregion
+
+        #region Constructors
+
+        /// <summary>
+        ///     Creates a new section module.
+        /// </summary>
+        public SectionModule()
+        {
+            this.FloatingPositionX = Screen.width * 0.5f - 125.0f;
+            this.FloatingPositionY = 100.0f;
+            this.EditorPositionX = Screen.width * 0.5f - SectionEditor.Width * 0.5f;
+            this.EditorPositionY = Screen.height * 0.5f - SectionEditor.Height * 0.5f;
+            this.ReadoutModules = new List<ReadoutModule>();
+            this.InitialiseStyles();
+            GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
+        }
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        ///     Gets and sets the name of the section.
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the abbreviation of the section.
+        /// </summary>
+        public string Abbreviation { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the visibility of the section.
+        /// </summary>
+        public bool IsVisible { get; set; }
+
+        /// <summary>
+        ///     Gets and sets whether the section is custom.
+        /// </summary>
+        public bool IsCustom { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the X position of the floating window. (Only used for serialisation.)
+        /// </summary>
+        public float FloatingPositionX { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the Y position of the floating window. (Only used for serialisation.)
+        /// </summary>
+        public float FloatingPositionY { get; set; }
+
+        /// <summary>
+        ///     Gets and sets whether the section is in a floating state.
+        /// </summary>
+        public bool IsFloating
+        {
+            get { return this.Window != null; }
+            set
+            {
+                if (value && this.Window == null)
+                {
+                    this.Window = FlightEngineerCore.Instance.AddSectionWindow(this);
+                }
+                else if (!value && this.Window != null)
+                {
+                    Object.Destroy(this.Window);
+                }
+            }
+        }
+
+        /// <summary>
+        ///     Gets and sets the X position of the editor window. (Only used for serialisation.)
+        /// </summary>
+        public float EditorPositionX { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the Y position of the editor window. (Only used for serialisation.)
+        /// </summary>
+        public float EditorPositionY { get; set; }
+
+        /// <summary>
+        ///     Gets and sets whether the section editor is visible.
+        /// </summary>
+        public bool IsEditorVisible
+        {
+            get { return this.editor != null; }
+            set
+            {
+                if (value && this.editor == null)
+                {
+                    this.editor = FlightEngineerCore.Instance.AddSectionEditor(this);
+                }
+                else if (!value && this.editor != null)
+                {
+                    Object.Destroy(this.editor);
+                }
+            }
+        }
+
+        /// <summary>
+        ///     Gets and sets the names of the installed readout modules. (Only used with serialisation.)
+        /// </summary>
+        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(); }
+        }
+
+        /// <summary>
+        ///     Gets and sets the list of readout modules.
+        /// </summary>
+        [XmlIgnore] public List<ReadoutModule> ReadoutModules { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the floating window.
+        /// </summary>
+        [XmlIgnore] public SectionWindow Window { get; set; }
+
+        #endregion
+
+        #region GUIStyles
+
+        private GUIStyle boxStyle;
+        private GUIStyle buttonStyle;
+        private GUIStyle messageStyle;
+        private GUIStyle titleStyle;
+
+        /// <summary>
+        ///     Initialises all the styles required for this object.
+        /// </summary>
+        private void InitialiseStyles()
+        {
+            this.boxStyle = new GUIStyle(HighLogic.Skin.box)
+            {
+                margin = new RectOffset(),
+                padding = new RectOffset(5, 5, 5, 5)
+            };
+
+            this.titleStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                margin = new RectOffset(),
+                padding = new RectOffset(2, 0, 5, 2),
+                fontSize = (int)(13 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                stretchWidth = true
+            };
+
+            this.buttonStyle = new GUIStyle(HighLogic.Skin.button)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                margin = new RectOffset(0, 0, 5, 3),
+                padding = new RectOffset(),
+                fontSize = (int)(10 * GuiDisplaySize.Offset),
+                stretchHeight = true,
+                fixedWidth = 60.0f * GuiDisplaySize.Offset
+            };
+
+            this.messageStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                margin = new RectOffset(),
+                padding = new RectOffset(),
+                alignment = TextAnchor.MiddleCenter,
+                fontSize = (int)(12 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                fixedWidth = 220.0f * GuiDisplaySize.Offset,
+                fixedHeight = 20.0f * GuiDisplaySize.Offset
+            };
+        }
+
+        private void OnSizeChanged()
+        {
+            this.InitialiseStyles();
+        }
+
+        #endregion
+
+        #region Updating
+
+        /// <summary>
+        ///     Updates all of the internal readout modules at fixed time intervals.
+        /// </summary>
+        public void FixedUpdate()
+        {
+            if (!this.IsVisible)
+            {
+                return;
+            }
+
+            foreach (var readout in this.ReadoutModules)
+            {
+                readout.FixedUpdate();
+            }
+        }
+
+        /// <summary>
+        ///     Updates all of the internal readout modules.
+        /// </summary>
+        public void Update()
+        {
+            if (!this.IsVisible)
+            {
+                return;
+            }
+
+            foreach (var readout in this.ReadoutModules)
+            {
+                readout.Update();
+            }
+
+            if (this.numberOfReadouts != this.ReadoutModules.Count)
+            {
+                this.numberOfReadouts = this.ReadoutModules.Count;
+                if (!this.IsFloating)
+                {
+                    DisplayStack.Instance.RequestResize();
+                }
+                else
+                {
+                    this.Window.RequestResize();
+                }
+            }
+        }
+
+        #endregion
+
+        #region Drawing
+
+        /// <summary>
+        ///     Draws the section and all of the internal readout modules.
+        /// </summary>
+        public void Draw()
+        {
+            if (!this.IsVisible)
+            {
+                return;
+            }
+
+            this.DrawSectionTitleBar();
+            this.DrawReadoutModules();
+        }
+
+        /// <summary>
+        ///     Draws the section title and action buttons.
+        /// </summary>
+        private void DrawSectionTitleBar()
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Label(this.Name.ToUpper(), this.titleStyle);
+            this.IsEditorVisible = GUILayout.Toggle(this.IsEditorVisible, "EDIT", this.buttonStyle);
+            this.IsFloating = GUILayout.Toggle(this.IsFloating, "FLOAT", this.buttonStyle);
+            GUILayout.EndHorizontal();
+        }
+
+        /// <summary>
+        ///     Draws all the readout modules.
+        /// </summary>
+        private void DrawReadoutModules()
+        {
+            GUILayout.BeginVertical(this.boxStyle);
+            if (this.ReadoutModules.Count > 0)
+            {
+                foreach (var readout in this.ReadoutModules)
+                {
+                    readout.Draw();
+                }
+            }
+            else
+            {
+                GUILayout.Label("No readouts are installed.", this.messageStyle);
+            }
+            GUILayout.EndVertical();
+        }
+
+        #endregion
+    }
 }

--- a/KerbalEngineer/KerbalEngineer.csproj
+++ b/KerbalEngineer/KerbalEngineer.csproj
@@ -70,6 +70,7 @@
     <Compile Include="Flight\Readouts\Surface\Biome.cs" />
     <Compile Include="Flight\Readouts\Vessel\SimulationDelay.cs" />
     <Compile Include="Flight\Readouts\Vessel\SimulationProcessor.cs" />
+    <Compile Include="Flight\Readouts\Vessel\Acceleration.cs" />
     <Compile Include="GuiDisplaySize.cs" />
     <Compile Include="Logger.cs" />
     <Compile Include="EngineerGlobals.cs" />

 Binary files a/Output/KerbalEngineer/KerbalEngineer.dll and b/Output/KerbalEngineer/KerbalEngineer.dll differ
--- a/Output/ReadMe.htm
+++ b/Output/ReadMe.htm
@@ -111,7 +111,7 @@
 
 		<section>
 			<h3>Current Version</h3>
-			<p>1.0.4.0</p>
+			<p>1.0.4.1</p>
 		</section>
 
 		<section>
@@ -154,6 +154,11 @@
 		<section>
 			<h3>Change Log</h3>
 			<ul id='changelog'>
+				<li>1.0.4.1
+					<ul>
+						<li>Fixed: Bug with the Build Engineer toolbar button.</li>
+					</ul>
+				</li>
 				<li>1.0.4.0
 					<ul>
 						<li>Added: Better stock toolbar support in the flight engineer.</li>