Created dedicated drop-down UI control, integrated it and fixed some bugs.
Created dedicated drop-down UI control, integrated it and fixed some bugs.

 Binary files a/Assets/BodyListBackground.psd and /dev/null differ
 Binary files /dev/null and b/Assets/DropDownBackground.psd differ
--- a/KerbalEngineer/Editor/BuildAdvanced.cs
+++ b/KerbalEngineer/Editor/BuildAdvanced.cs
@@ -25,6 +25,7 @@
 using KerbalEngineer.Extensions;
 using KerbalEngineer.Flight;
 using KerbalEngineer.Settings;
+using KerbalEngineer.UIControls;
 using KerbalEngineer.VesselSimulator;
 
 using UnityEngine;
@@ -49,17 +50,16 @@
 
         private float atmosphericPercentage = 1.0f;
         private float atmosphericVelocity;
-        private BuildBodiesList bodiesList;
+        private DropDown bodiesList;
         private int compactCheck;
         private bool compactCollapseRight;
         private float compactRight;
         private bool hasChanged;
         private bool isEditorLocked;
         private int numberOfStages;
-        private Rect referenceBodiesButtonRect;
         private Stage[] stages;
-        private int windowId;
-        private Rect windowPosition = new Rect(265.0f, 45.0f, 0, 0);
+        private Rect position = new Rect(265.0f, 45.0f, 0, 0);
+        private Rect bodiesListPosition;
 
         #region Styles
 
@@ -71,6 +71,8 @@
         private GUIStyle settingStyle;
         private GUIStyle titleStyle;
         private GUIStyle windowStyle;
+        private GUIStyle bodiesButtonStyle;
+        private GUIStyle bodiesButtonActiveStyle;
 
         #endregion
 
@@ -81,7 +83,6 @@
         private bool compactMode;
         private bool showAllStages;
         private bool showAtmosphericDetails;
-        private bool showReferenceBodies;
         private bool showSettings;
         private bool visible = true;
 
@@ -91,11 +92,7 @@
         public bool Visible
         {
             get { return this.visible; }
-            set
-            {
-                this.visible = value;
-                Logger.Log("BuildAdvanced->Visible = " + value);
-            }
+            set { this.visible = value; }
         }
 
         /// <summary>
@@ -104,11 +101,7 @@
         public bool CompactMode
         {
             get { return this.compactMode; }
-            set
-            {
-                this.compactMode = value;
-                Logger.Log("BuildAdvanced->CompactMode = " + value);
-            }
+            set { this.compactMode = value; }
         }
 
         /// <summary>
@@ -117,11 +110,7 @@
         public bool ShowAllStages
         {
             get { return this.showAllStages; }
-            set
-            {
-                this.showAllStages = value;
-                Logger.Log("BuildAdvanced->ShowAllStages = " + value);
-            }
+            set { this.showAllStages = value; }
         }
 
         /// <summary>
@@ -130,11 +119,7 @@
         public bool ShowAtmosphericDetails
         {
             get { return this.showAtmosphericDetails; }
-            set
-            {
-                this.showAtmosphericDetails = value;
-                Logger.Log("BuildAdvanced->ShowAtmosphericDetails = " + value);
-            }
+            set { this.showAtmosphericDetails = value; }
         }
 
         /// <summary>
@@ -143,11 +128,7 @@
         public bool ShowSettings
         {
             get { return this.showSettings; }
-            set
-            {
-                this.showSettings = value;
-                Logger.Log("BuildAdvanced->ShowSettings = " + value);
-            }
+            set { this.showSettings = value; }
         }
 
         #endregion
@@ -157,13 +138,13 @@
         private void Awake()
         {
             Instance = this;
-            this.bodiesList = this.gameObject.AddComponent<BuildBodiesList>();
+            this.bodiesList = this.gameObject.AddComponent<DropDown>();
+            this.bodiesList.DrawCallback = this.DrawBodiesList;
             this.Load();
         }
 
         private void Start()
         {
-            this.windowId = this.GetHashCode();
             this.InitialiseStyles();
             GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
         }
@@ -234,6 +215,30 @@
                     padding = new RectOffset(),
                     alignment = TextAnchor.UpperLeft
                 };
+
+                this.bodiesButtonStyle = new GUIStyle(HighLogic.Skin.button)
+                {
+                    margin = new RectOffset(0, 0, 2, 0),
+                    padding = new RectOffset(5, 5, 5, 5),
+                    normal =
+                    {
+                        textColor = Color.white
+                    },
+                    active =
+                    {
+                        textColor = Color.white
+                    },
+                    fontSize = (int)(11 * GuiDisplaySize.Offset),
+                    fontStyle = FontStyle.Bold,
+                    alignment = TextAnchor.MiddleCenter,
+                    fixedHeight = 20.0f
+                };
+
+                this.bodiesButtonActiveStyle = new GUIStyle(this.bodiesButtonStyle)
+                {
+                    normal = this.bodiesButtonStyle.onNormal,
+                    hover = this.bodiesButtonStyle.onHover
+                };
             }
             catch (Exception ex)
             {
@@ -260,8 +265,6 @@
                     this.bodiesList.enabled = false;
                     return;
                 }
-
-                this.bodiesList.SetPosition(this.referenceBodiesButtonRect.x + this.windowPosition.x, this.referenceBodiesButtonRect.y + this.referenceBodiesButtonRect.height + this.windowPosition.y, this.referenceBodiesButtonRect.width);
 
                 // Configure the simulation parameters based on the selected reference body.
                 SimManager.Gravity = CelestialBodies.SelectedBody.Gravity;
@@ -315,16 +318,16 @@
                     this.hasChanged = false;
                     this.numberOfStages = stageCount;
 
-                    this.windowPosition.width = 0;
-                    this.windowPosition.height = 0;
+                    this.position.width = 0;
+                    this.position.height = 0;
                 }
 
                 GUI.skin = null;
-                this.windowPosition = GUILayout.Window(this.windowId, this.windowPosition, this.Window, title, this.windowStyle).ClampToScreen();
+                this.position = GUILayout.Window(this.GetInstanceID(), this.position, this.Window, title, this.windowStyle).ClampToScreen();
 
                 if (this.compactCheck > 0 && this.compactCollapseRight)
                 {
-                    this.windowPosition.x = this.compactRight - this.windowPosition.width;
+                    this.position.x = this.compactRight - this.position.width;
                     this.compactCheck--;
                 }
                 else if (this.compactCheck > 0)
@@ -348,12 +351,12 @@
         {
             try
             {
-                if ((this.windowPosition.MouseIsOver() || this.bodiesList.Position.MouseIsOver()) && this.isEditorLocked == false)
+                if ((this.position.MouseIsOver() || this.bodiesList.Position.MouseIsOver()) && this.isEditorLocked == false)
                 {
                     EditorLogic.fetch.State = EditorLogic.EditorState.GUI_SELECTED;
                     this.isEditorLocked = true;
                 }
-                else if (!this.windowPosition.MouseIsOver() && !this.bodiesList.Position.MouseIsOver() && this.isEditorLocked)
+                else if (!this.position.MouseIsOver() && !this.bodiesList.Position.MouseIsOver() && this.isEditorLocked)
                 {
                     EditorLogic.fetch.State = EditorLogic.EditorState.PAD_UNSELECTED;
                     this.isEditorLocked = false;
@@ -373,37 +376,38 @@
             try
             {
                 // Draw the compact mode toggle.
-                if (GUI.Toggle(new Rect(this.windowPosition.width - 70.0f * GuiDisplaySize.Offset, 5.0f, 65.0f * GuiDisplaySize.Offset, 20.0f), this.compactMode, "COMPACT", this.buttonStyle) != this.compactMode)
+                if (GUI.Toggle(new Rect(this.position.width - 70.0f * GuiDisplaySize.Offset, 5.0f, 65.0f * GuiDisplaySize.Offset, 20.0f), this.compactMode, "COMPACT", this.buttonStyle) != this.compactMode)
                 {
                     this.hasChanged = true;
                     this.compactCheck = 2;
-                    this.compactRight = this.windowPosition.xMax;
+                    this.compactRight = this.position.xMax;
                     this.compactMode = !this.compactMode;
                 }
 
                 // When not in compact mode draw the 'All Stages' and 'Atmospheric' toggles.
                 if (!this.compactMode)
                 {
-                    if (GUI.Toggle(new Rect(this.windowPosition.width - 143.0f * GuiDisplaySize.Offset, 5.0f, 70.0f * GuiDisplaySize.Offset, 20.0f), this.showSettings, "SETTINGS", this.buttonStyle) != this.showSettings)
+                    if (GUI.Toggle(new Rect(this.position.width - 143.0f * GuiDisplaySize.Offset, 5.0f, 70.0f * GuiDisplaySize.Offset, 20.0f), this.showSettings, "SETTINGS", this.buttonStyle) != this.showSettings)
                     {
                         this.hasChanged = true;
                         this.showSettings = !this.showSettings;
                     }
 
-                    if (GUI.Toggle(new Rect(this.windowPosition.width - 226.0f * GuiDisplaySize.Offset, 5.0f, 80.0f * GuiDisplaySize.Offset, 20.0f), this.showAllStages, "ALL STAGES", this.buttonStyle) != this.showAllStages)
+                    if (GUI.Toggle(new Rect(this.position.width - 226.0f * GuiDisplaySize.Offset, 5.0f, 80.0f * GuiDisplaySize.Offset, 20.0f), this.showAllStages, "ALL STAGES", this.buttonStyle) != this.showAllStages)
                     {
                         this.hasChanged = true;
                         this.showAllStages = !this.showAllStages;
                     }
 
-                    if (GUI.Toggle(new Rect(this.windowPosition.width - 324.0f * GuiDisplaySize.Offset, 5.0f, 95.0f * GuiDisplaySize.Offset, 20.0f), this.showAtmosphericDetails, "ATMOSPHERIC", this.buttonStyle) != this.showAtmosphericDetails)
+                    if (GUI.Toggle(new Rect(this.position.width - 324.0f * GuiDisplaySize.Offset, 5.0f, 95.0f * GuiDisplaySize.Offset, 20.0f), this.showAtmosphericDetails, "ATMOSPHERIC", this.buttonStyle) != this.showAtmosphericDetails)
                     {
                         this.hasChanged = true;
                         this.showAtmosphericDetails = !this.showAtmosphericDetails;
                     }
 
-                    this.referenceBodiesButtonRect = new Rect(this.windowPosition.width - 452.0f * GuiDisplaySize.Offset, 5.0f, 125.0f * GuiDisplaySize.Offset, 20.0f);
-                    this.bodiesList.enabled = GUI.Toggle(this.referenceBodiesButtonRect, this.bodiesList.enabled, "BODY: " + CelestialBodies.SelectedBody.Name.ToUpper(), this.buttonStyle);
+                    this.bodiesListPosition = new Rect(this.position.width - 452.0f * GuiDisplaySize.Offset, 5.0f, 125.0f * GuiDisplaySize.Offset, 20.0f);
+                    this.bodiesList.enabled = GUI.Toggle(this.bodiesListPosition, this.bodiesList.enabled, "BODY: " + CelestialBodies.SelectedBody.Name.ToUpper(), this.buttonStyle);
+                    this.bodiesList.SetPosition(this.bodiesListPosition.Translate(this.position));
                 }
 
                 // Draw the main informational display box.
@@ -753,6 +757,55 @@
             }
         }
 
+        private void DrawBodiesList()
+        {
+            try
+            {
+                if (CelestialBodies.SystemBody == CelestialBodies.SelectedBody)
+                {
+                    this.DrawBody(CelestialBodies.SystemBody);
+                }
+                else
+                {
+                    foreach (var body in CelestialBodies.SystemBody.Children)
+                    {
+                        this.DrawBody(body);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        private void DrawBody(CelestialBodies.BodyInfo bodyInfo, int depth = 0)
+        {
+            try
+            {
+                GUILayout.BeginHorizontal();
+                GUILayout.Space(20.0f * depth);
+                if (GUILayout.Button(bodyInfo.Children.Count > 0 ? bodyInfo.Name + " [" + bodyInfo.Children.Count + "]" : bodyInfo.Name, bodyInfo.Selected && bodyInfo.SelectedDepth == 0 ? this.bodiesButtonActiveStyle : this.bodiesButtonStyle))
+                {
+                    CelestialBodies.SetSelectedBody(bodyInfo.Name);
+                    this.bodiesList.Resize = true;
+                }
+                GUILayout.EndHorizontal();
+
+                if (bodyInfo.Selected)
+                {
+                    foreach (var body in bodyInfo.Children)
+                    {
+                        this.DrawBody(body, depth + 1);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
         #endregion
 
         #region Save and Load
@@ -766,13 +819,12 @@
             {
                 var handler = new SettingHandler();
                 handler.Set("visible", this.visible);
-                handler.Set("windowPositionX", this.windowPosition.x);
-                handler.Set("windowPositionY", this.windowPosition.y);
+                handler.Set("windowPositionX", this.position.x);
+                handler.Set("windowPositionY", this.position.y);
                 handler.Set("compactMode", this.compactMode);
                 handler.Set("compactCollapseRight", this.compactCollapseRight);
                 handler.Set("showAllStages", this.showAllStages);
                 handler.Set("showAtmosphericDetails", this.showAtmosphericDetails);
-                handler.Set("showReferenceBodies", this.showReferenceBodies);
                 handler.Set("showSettings", this.showSettings);
                 handler.Set("selectedBodyName", CelestialBodies.SelectedBody.Name);
                 handler.Save("BuildAdvanced.xml");
@@ -793,8 +845,8 @@
             {
                 var handler = SettingHandler.Load("BuildAdvanced.xml");
                 handler.Get("visible", ref this.visible);
-                this.windowPosition.x = handler.Get("windowPositionX", this.windowPosition.x);
-                this.windowPosition.y = handler.Get("windowPositionY", this.windowPosition.y);
+                this.position.x = handler.Get("windowPositionX", this.position.x);
+                this.position.y = handler.Get("windowPositionY", this.position.y);
                 handler.Get("compactMode", ref this.compactMode);
                 handler.Get("compactCollapseRight", ref this.compactCollapseRight);
                 handler.Get("showAllStages", ref this.showAllStages);

--- a/KerbalEngineer/Editor/BuildBodiesList.cs
+++ /dev/null
@@ -1,225 +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 System;
-
-using KerbalEngineer.Extensions;
-
-using UnityEngine;
-
-#endregion
-
-namespace KerbalEngineer.Editor
-{
-    public class BuildBodiesList : MonoBehaviour
-    {
-        #region Fields
-
-        private Rect position;
-        private bool resize;
-
-        #endregion
-
-        #region Properties
-
-        public Rect Position
-        {
-            get { return this.position; }
-        }
-
-        #endregion
-
-        #region Initialisation
-
-        private void Awake()
-        {
-            try
-            {
-                this.enabled = false;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        private void Start()
-        {
-            try
-            {
-                this.InitialiseStyles();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        #endregion
-
-        #region Styles
-
-        private GUIStyle buttonActiveStyle;
-        private GUIStyle buttonStyle;
-        private GUIStyle windowStyle;
-
-        private void InitialiseStyles()
-        {
-            try
-            {
-                this.windowStyle = new GUIStyle
-                {
-                    normal =
-                    {
-                        background = GameDatabase.Instance.GetTexture("KerbalEngineer/Textures/BodyListBackground", false)
-                    },
-                    border = new RectOffset(8, 8, 0, 8),
-                    margin = new RectOffset(),
-                    padding = new RectOffset(5, 5, 5, 5)
-                };
-
-                this.buttonStyle = new GUIStyle(HighLogic.Skin.button)
-                {
-                    margin = new RectOffset(0, 0, 2, 0),
-                    padding = new RectOffset(5, 5, 5, 5),
-                    normal =
-                    {
-                        textColor = Color.white
-                    },
-                    active =
-                    {
-                        textColor = Color.white
-                    },
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    alignment = TextAnchor.MiddleCenter,
-                    fixedHeight = 20.0f
-                };
-
-                this.buttonActiveStyle = new GUIStyle(this.buttonStyle)
-                {
-                    normal = this.buttonStyle.active
-                };
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        #endregion
-
-        #region Updating
-
-        private void Update()
-        {
-            if ((Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1) || Input.GetMouseButtonDown(2)) && !this.position.MouseIsOver())
-            {
-                this.enabled = false;
-            }
-        }
-
-        #endregion
-
-        #region Drawing
-
-        private void OnGUI()
-        {
-            try
-            {
-                if (this.resize)
-                {
-                    this.position.height = 0;
-                    this.resize = false;
-                }
-                GUI.skin = null;
-                this.position = GUILayout.Window(this.GetInstanceID(), this.position, this.Window, string.Empty, this.windowStyle);
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        private void Window(int windowId)
-        {
-            try
-            {
-                GUI.BringWindowToFront(windowId);
-                if (CelestialBodies.SystemBody == CelestialBodies.SelectedBody)
-                {
-                    this.DrawBodies(CelestialBodies.SystemBody);
-                }
-                else
-                {
-                    foreach (var body in CelestialBodies.SystemBody.Children)
-                    {
-                        this.DrawBodies(body);
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        private void DrawBodies(CelestialBodies.BodyInfo bodyInfo, int depth = 0)
-        {
-            GUILayout.BeginHorizontal();
-            GUILayout.Space(20.0f * depth);
-            if (GUILayout.Button(bodyInfo.Children.Count > 0 ? bodyInfo.Name + " [" + bodyInfo.Children.Count + "]" : bodyInfo.Name, bodyInfo.Selected && bodyInfo.SelectedDepth == 0 ? this.buttonActiveStyle : this.buttonStyle))
-            {
-                CelestialBodies.SetSelectedBody(bodyInfo.Name);
-                this.resize = true;
-            }
-            GUILayout.EndHorizontal();
-
-            if (bodyInfo.Selected)
-            {
-                foreach (var body in bodyInfo.Children)
-                {
-                    this.DrawBodies(body, depth + 1);
-                }
-            }
-        }
-
-        #endregion
-
-        #region Public Methods
-
-        public void SetPosition(float x, float y, float width)
-        {
-            try
-            {
-                this.position.x = x;
-                this.position.y = y;
-                this.position.width = width;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        #endregion
-    }
-}

--- a/KerbalEngineer/Extensions/RectExtensions.cs
+++ b/KerbalEngineer/Extensions/RectExtensions.cs
@@ -1,60 +1,68 @@
-// 

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

-{

-    public static class RectExtensions

-    {

-        /// <summary>

-        ///     Clamps the rectangle inside the screen region.

-        /// </summary>

-        public static Rect ClampInsideScreen(this Rect value)

-        {

-            value.x = Mathf.Clamp(value.x, 0, Screen.width - value.width);

-            value.y = Mathf.Clamp(value.y, 0, Screen.height - value.height);

-

-            return value;

-        }

-

-        /// <summary>

-        ///     Clamps the rectangle into the screen region by the specified margin.

-        /// </summary>

-        public static Rect ClampToScreen(this Rect value, float margin = 25.0f)

-        {

-            value.x = Mathf.Clamp(value.x, -(value.width - margin), Screen.width - margin);

-            value.y = Mathf.Clamp(value.y, -(value.height - margin), Screen.height - margin);

-

-            return value;

-        }

-

-        /// <summary>

-        ///     Returns whether the mouse is within the coordinates of this rectangle.

-        /// </summary>

-        public static bool MouseIsOver(this Rect value)

-        {

-            return value.Contains(new Vector2(Input.mousePosition.x, Screen.height - Input.mousePosition.y));

-        }

-    }

+// 
+//     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.Extensions
+{
+    public static class RectExtensions
+    {
+        /// <summary>
+        ///     Clamps the rectangle inside the screen region.
+        /// </summary>
+        public static Rect ClampInsideScreen(this Rect value)
+        {
+            value.x = Mathf.Clamp(value.x, 0, Screen.width - value.width);
+            value.y = Mathf.Clamp(value.y, 0, Screen.height - value.height);
+
+            return value;
+        }
+
+        /// <summary>
+        ///     Clamps the rectangle into the screen region by the specified margin.
+        /// </summary>
+        public static Rect ClampToScreen(this Rect value, float margin = 25.0f)
+        {
+            value.x = Mathf.Clamp(value.x, -(value.width - margin), Screen.width - margin);
+            value.y = Mathf.Clamp(value.y, -(value.height - margin), Screen.height - margin);
+
+            return value;
+        }
+
+        /// <summary>
+        ///     Returns whether the mouse is within the coordinates of this rectangle.
+        /// </summary>
+        public static bool MouseIsOver(this Rect value)
+        {
+            return value.Contains(new Vector2(Input.mousePosition.x, Screen.height - Input.mousePosition.y));
+        }
+
+        public static Rect Translate(this Rect value, Rect rectangle)
+        {
+            value.x += rectangle.x;
+            value.y += rectangle.y;
+
+            return value;
+        }
+    }
 }

--- a/KerbalEngineer/Flight/FlightEngineerCore.cs
+++ b/KerbalEngineer/Flight/FlightEngineerCore.cs
@@ -234,7 +234,7 @@
             {
                 var editor = this.gameObject.AddComponent<SectionEditor>();
                 editor.ParentSection = section;
-                editor.WindowPosition = new Rect(section.EditorPositionX, section.EditorPositionY, SectionEditor.Width, SectionEditor.Height);
+                editor.Position = new Rect(section.EditorPositionX, section.EditorPositionY, SectionEditor.Width, SectionEditor.Height);
                 this.SectionEditors.Add(editor);
                 return editor;
             }

--- a/KerbalEngineer/Flight/Readouts/ReadoutCategory.cs
+++ b/KerbalEngineer/Flight/Readouts/ReadoutCategory.cs
@@ -53,6 +53,8 @@
 
         public static List<ReadoutCategory> Categories { get; private set; }
 
+        public static ReadoutCategory Selected { get; set; }
+
         public string Name { get; set; }
 
         public string Description { get; set; }
@@ -76,6 +78,12 @@
             return category;
         }
 
+        public static void SetCategory(string name)
+        {
+            var category = GetCategory(name);
+            category.Name = name;
+        }
+
         public static void SetCategory(string name, string description)
         {
             var category = GetCategory(name);

--- a/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs
+++ b/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs
@@ -58,10 +58,10 @@
         {
             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("Orbital", "Readouts for orbital manovoeures.");
+                ReadoutCategory.SetCategory("Surface", "Readouts showing surface and atmospheric information.");
+                ReadoutCategory.SetCategory("Vessel", "Readouts showing vessel performance statistics.");
+                ReadoutCategory.SetCategory("Rendezvous", "Readouts for rendezvous manovoeures.");
                 ReadoutCategory.SetCategory("Miscellaneous", "Readouts that do not fit into other categories.");
 
                 // Orbital

--- a/KerbalEngineer/Flight/Sections/SectionEditor.cs
+++ b/KerbalEngineer/Flight/Sections/SectionEditor.cs
@@ -19,8 +19,11 @@
 
 #region Using Directives
 
+using System;
+
 using KerbalEngineer.Extensions;
 using KerbalEngineer.Flight.Readouts;
+using KerbalEngineer.UIControls;
 
 using UnityEngine;
 
@@ -41,21 +44,33 @@
 
         private Vector2 scrollPositionAvailable;
         private Vector2 scrollPositionInstalled;
-        private ReadoutCategory selectedReadoutCategory = ReadoutCategory.GetCategory("Orbital");
-        private int windowId;
-        private Rect windowPosition;
+        private Rect position;
+        private DropDown categoryList;
 
         #endregion
 
         #region Constructors
 
+        private void Awake()
+        {
+            try
+            {
+                this.categoryList = this.gameObject.AddComponent<DropDown>();
+                this.categoryList.DrawCallback = this.DrawCategories;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
         /// <summary>
         ///     Initialises the object's state on creation.
         /// </summary>
         private void Start()
         {
-            this.windowId = this.GetHashCode();
             this.InitialiseStyles();
+            ReadoutCategory.Selected = ReadoutCategory.GetCategory("Orbital");
             RenderingManager.AddToPostDrawQueue(0, this.Draw);
         }
 
@@ -71,17 +86,19 @@
         /// <summary>
         ///     Gets and sets the window position.
         /// </summary>
-        public Rect WindowPosition
-        {
-            get { return this.windowPosition; }
-            set { this.windowPosition = value; }
+        public Rect Position
+        {
+            get { return this.position; }
+            set { this.position = value; }
         }
 
         #endregion
 
         #region GUIStyles
 
+        private GUIStyle categoryTitleButtonStyle;
         private GUIStyle categoryButtonStyle;
+        private GUIStyle categoryButtonActiveStyle;
         private GUIStyle helpBoxStyle;
         private GUIStyle helpTextStyle;
         private GUIStyle panelTitleStyle;
@@ -103,10 +120,18 @@
                 {
                     textColor = Color.white
                 },
+                margin = new RectOffset(0,0,2,0),
+                padding = new RectOffset(5,5,5,5),
                 alignment = TextAnchor.MiddleCenter,
                 fontSize = 12,
-                fontStyle = FontStyle.Bold,
-                fixedHeight = 30.0f,
+                fontStyle = FontStyle.Normal,
+                richText = true
+            };
+
+            this.categoryButtonActiveStyle = new GUIStyle(this.categoryButtonStyle)
+            {
+                normal = this.categoryButtonStyle.onNormal,
+                hover = this.categoryButtonStyle.onHover
             };
 
             this.panelTitleStyle = new GUIStyle(HighLogic.Skin.label)
@@ -181,6 +206,12 @@
                 stretchWidth = true,
                 richText = true
             };
+
+            this.categoryTitleButtonStyle = new GUIStyle(this.readoutButtonStyle)
+            {
+                fixedHeight = 30.0f,
+                stretchHeight = false
+            };
         }
 
         #endregion
@@ -192,9 +223,9 @@
         /// </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;
+            this.position = GUILayout.Window(this.GetInstanceID(), this.position, this.Window, "EDIT SECTION - " + this.ParentSection.Name.ToUpper(), this.windowStyle).ClampToScreen();
+            this.ParentSection.EditorPositionX = this.position.x;
+            this.ParentSection.EditorPositionY = this.position.y;
         }
 
         /// <summary>
@@ -208,7 +239,7 @@
             GUILayout.Space(5.0f);
             this.DrawInstalledReadouts();
 
-            if (GUILayout.Button("CLOSE EDITOR", this.categoryButtonStyle))
+            if (GUILayout.Button("CLOSE EDITOR", this.categoryTitleButtonStyle))
             {
                 this.ParentSection.IsEditorVisible = false;
             }
@@ -244,17 +275,23 @@
         /// </summary>
         private void DrawCategorySelector()
         {
-            GUILayout.BeginHorizontal();
-
+            this.categoryList.enabled = GUILayout.Toggle(this.categoryList.enabled, "▼ SELECTED CATEGORY: " + ReadoutCategory.Selected.ToString().ToUpper() + " ▼", this.categoryTitleButtonStyle);
+            if (Event.current.type == EventType.repaint)
+            {
+                this.categoryList.SetPosition(GUILayoutUtility.GetLastRect().Translate(this.position));
+            }
+        }
+
+        private void DrawCategories()
+        {
             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();
+                if (GUILayout.Button("<b>" + category.Name.ToUpper() + "</b>" + (string.IsNullOrEmpty(category.Description) ? string.Empty : "\n<i>" + category.Description + "</i>"), category == ReadoutCategory.Selected ? this.categoryButtonActiveStyle : this.categoryButtonStyle))
+                {
+                    ReadoutCategory.Selected = category;
+                    this.categoryList.enabled = false;
+                }
+            }
         }
 
         /// <summary>
@@ -268,7 +305,7 @@
 
             GUILayout.Label("AVAILABLE", this.panelTitleStyle);
 
-            foreach (var readout in ReadoutLibrary.GetCategory(this.selectedReadoutCategory))
+            foreach (var readout in ReadoutLibrary.GetCategory(ReadoutCategory.Selected))
             {
                 if (!this.ParentSection.ReadoutModules.Contains(readout) || readout.Cloneable)
                 {

--- /dev/null
+++ b/KerbalEngineer/Flight/Sections/SectionEditorCategoryList.cs
@@ -1,1 +1,205 @@
-
+// 
+//     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 KerbalEngineer.Flight.Readouts;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Sections
+{
+    public class SectionEditorCategoryList : MonoBehaviour
+    {
+        #region Fields
+
+        private Rect position;
+        private bool resize;
+
+        #endregion
+
+        #region properties
+
+        public Rect Position
+        {
+            get { return this.position; }
+        }
+
+        #endregion
+
+        #region Initialisation
+
+        private void Awake()
+        {
+            try
+            {
+                this.enabled = false;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        private void Start()
+        {
+            try
+            {
+                this.InitialiseStyles();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Styles
+
+        private GUIStyle buttonActiveStyle;
+        private GUIStyle buttonStyle;
+        private GUIStyle windowStyle;
+
+        private void InitialiseStyles()
+        {
+            try
+            {
+                this.windowStyle = new GUIStyle
+                {
+                    normal =
+                    {
+                        background = GameDatabase.Instance.GetTexture("KerbalEngineer/Textures/BodyListBackground", false)
+                    },
+                    border = new RectOffset(8, 8, 1, 8),
+                    margin = new RectOffset(),
+                    padding = new RectOffset(5, 5, 5, 5)
+                };
+
+                this.buttonStyle = new GUIStyle(HighLogic.Skin.button)
+                {
+                    normal =
+                    {
+                        textColor = Color.white
+                    },
+                    alignment = TextAnchor.MiddleCenter,
+                    fontSize = 12,
+                    fontStyle = FontStyle.Bold,
+                    fixedHeight = 30.0f,
+                };
+
+                this.buttonActiveStyle = new GUIStyle(this.buttonStyle)
+                {
+                    normal = this.buttonStyle.active
+                };
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Updating
+
+        private void Update()
+        {
+            try
+            {
+                if ((Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1) || Input.GetMouseButtonDown(2)) && !this.position.MouseIsOver())
+                {
+                    this.enabled = false;
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Drawing
+
+        private void OnGUI()
+        {
+            try
+            {
+                if (this.resize)
+                {
+                    this.position.height = 0;
+                    this.resize = false;
+                }
+
+                GUI.skin = null;
+                this.position = GUILayout.Window(this.GetInstanceID(), this.position, this.Window, string.Empty, this.windowStyle);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        private void Window(int windowId)
+        {
+            try
+            {
+                GUI.BringWindowToFront(windowId);
+                foreach (var category in ReadoutCategory.Categories)
+                {
+                    if (GUILayout.Button(category.Name, category == ReadoutCategory.Selected ? this.buttonActiveStyle : this.buttonStyle))
+                    {
+                        ReadoutCategory.Selected = category;
+                        this.enabled = false;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Public Methods
+
+        public void SetPosition(Rect position)
+        {
+            try
+            {
+                this.position.x = position.x;
+                this.position.y = position.y + position.height;
+                this.position.width = position.width;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Sections/SectionLibrary.cs
+++ b/KerbalEngineer/Flight/Sections/SectionLibrary.cs
@@ -21,6 +21,7 @@
 
 using System.Collections.Generic;
 using System.Linq;
+using System.Runtime.InteropServices;
 
 using KerbalEngineer.Flight.Readouts;
 using KerbalEngineer.Settings;
@@ -196,6 +197,11 @@
             var handler = SettingHandler.Load("SectionLibrary.xml", new[] {typeof(List<SectionModule>)});
             StockSections = handler.Get("StockSections", StockSections);
             CustomSections = handler.Get("CustomSections", CustomSections);
+
+            foreach (var section in StockSections)
+            {
+                section.ClearNullReadouts();
+            }
         }
 
         #endregion
@@ -251,19 +257,5 @@
         }
 
         #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
@@ -327,5 +327,14 @@
         }
 
         #endregion
+
+        #region Public Methods
+
+        public void ClearNullReadouts()
+        {
+            this.ReadoutModules.RemoveAll(r => r == null);
+        }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/KerbalEngineer.csproj
+++ b/KerbalEngineer/KerbalEngineer.csproj
@@ -57,7 +57,6 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Editor\BuildAdvanced.cs" />
-    <Compile Include="Editor\BuildBodiesList.cs" />
     <Compile Include="Editor\BuildOverlay.cs" />
     <Compile Include="CelestialBodies.cs" />
     <Compile Include="Editor\BuildToolbar.cs" />
@@ -71,7 +70,9 @@
     <Compile Include="Flight\Readouts\Vessel\SimulationDelay.cs" />
     <Compile Include="Flight\Readouts\Vessel\SimulationProcessor.cs" />
     <Compile Include="Flight\Readouts\Vessel\Acceleration.cs" />
+    <Compile Include="Flight\Sections\SectionEditorCategoryList.cs" />
     <Compile Include="GuiDisplaySize.cs" />
+    <Compile Include="UIControls\DropDown.cs" />
     <Compile Include="Logger.cs" />
     <Compile Include="EngineerGlobals.cs" />
     <Compile Include="Extensions\DoubleExtensions.cs" />

--- /dev/null
+++ b/KerbalEngineer/UIControls/DropDown.cs
@@ -1,1 +1,183 @@
+// 
+//     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.UIControls
+{
+    public class DropDown : MonoBehaviour
+    {
+        #region Fields
+
+        private Rect button;
+        private Rect position;
+
+        #endregion
+
+        #region Properties
+
+        public bool Resize { get; set; }
+
+        public Callback DrawCallback { get; set; }
+
+        public Rect Position
+        {
+            get { return this.position; }
+        }
+
+        #endregion
+
+        #region Initialisation
+
+        private void Awake()
+        {
+            try
+            {
+                this.enabled = false;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        private void Start()
+        {
+            try
+            {
+                this.InitialiseStyles();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Styles
+
+        private GUIStyle windowStyle;
+
+        private void InitialiseStyles()
+        {
+            try
+            {
+                this.windowStyle = new GUIStyle
+                {
+                    normal =
+                    {
+                        background = GameDatabase.Instance.GetTexture("KerbalEngineer/Textures/DropDownBackground", false)
+                    },
+                    border = new RectOffset(8, 8, 1, 8),
+                    margin = new RectOffset(),
+                    padding = new RectOffset(5, 5, 5, 5)
+                };
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Updating
+
+        private void Update()
+        {
+            try
+            {
+                if ((Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1) || Input.GetMouseButtonDown(2)) && !this.position.MouseIsOver() && !this.button.MouseIsOver())
+                {
+                    this.enabled = false;
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Drawing
+
+        private void OnGUI()
+        {
+            try
+            {
+                if (this.Resize)
+                {
+                    this.position.height = 0;
+                    this.Resize = false;
+                }
+
+                GUI.skin = null;
+                this.position = GUILayout.Window(this.GetInstanceID(), this.position, this.Window, string.Empty, this.windowStyle);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        private void Window(int windowId)
+        {
+            try
+            {
+                GUI.BringWindowToFront(windowId);
+                this.DrawCallback.Invoke();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Public Methods
+
+        public void SetPosition(Rect button)
+        {
+            try
+            {
+                this.position.x = button.x;
+                this.position.y = button.y + button.height;
+                this.position.width = button.width;
+                this.button = button;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+    }
+}

 Binary files a/Output/KerbalEngineer/KerbalEngineer.dll and b/Output/KerbalEngineer/KerbalEngineer.dll differ
 Binary files a/Output/KerbalEngineer/Textures/BodyListBackground.png and /dev/null differ
 Binary files /dev/null and b/Output/KerbalEngineer/Textures/DropDownBackground.png differ
--- a/Output/ReadMe.htm
+++ b/Output/ReadMe.htm
@@ -111,7 +111,7 @@
 
 		<section>
 			<h3>Current Version</h3>
-			<p>1.0.4.1</p>
+			<p>1.0.5.0</p>
 		</section>
 
 		<section>
@@ -154,9 +154,14 @@
 		<section>
 			<h3>Change Log</h3>
 			<ul id='changelog'>
-				<li>1.0.4.1
-					<ul>
+				<li>1.0.5.0
+					<ul>
+						<li>Added: Acceleration readout to the Vessel category (current / maximum).</li>
+						<li>Added: Category library system for the Flight Engineer readouts.</li>
+						<li>Added: Drop-down category selection to better support the new system.</li>
+						<li>Changed: Misc category now called Miscellaneous (this will cause previously added readouts from this category to vanish).</li>
 						<li>Fixed: Bug with the Build Engineer toolbar button.</li>
+						<li>Fixed: Some buggyness when trying to close the bodies drop-down in the Build Engineer via the button.</li>
 					</ul>
 				</li>
 				<li>1.0.4.0