Added calls to UpdateModSettings in relevant places
Added calls to UpdateModSettings in relevant places

file:a/.gitignore -> file:b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -111,6 +111,5 @@
 App_Data/*.mdf
 App_Data/*.ldf
 
-*.zip
-*.bat
 [Gg]ame/
+[Rr]elease/

--- /dev/null
+++ b/Documents/CHANGES.txt
@@ -1,1 +1,282 @@
-
+1.0.14.1, 28-12-2014
+    Fixed: Missing texture on the ER-7500 model.
+    
+1.0.14.0, 28-12-2014
+    Added: Career mode that limits the Flight Engineer by:
+        - Requiring an Engineer Kerbal of any level, or placement of an Engineer Chip or ER-7500 part.
+        - Tracking station level 3 enables Flight Engineer everywhere.
+
+    Added: New readouts to the orbital category:
+        - Mean Anomaly at Epoc
+
+    Added: New readouts to the miscellaneous category:
+        - System Time
+
+    Added: Editor Overlay Tab's X position is now changable in the BuildOverlay.xml settings file.
+    Changed: Editor Overlay Tabs start position moved over as to not overlap the parts menu.
+    Fixed: Bug where STAGE_PRIORITY_FLOW resources would not be corrently disabled/enabled.
+    Fixed: Issue with the formatting large Mass and Cost values.
+    Fixed: Error when loading the Engineer7500 part model.
+
+1.0.13.1, 16-12-2014
+    Fixed: Issue with manoeuvre node readouts and low tier tracking station.
+
+1.0.13.0, 16-12-2014
+    Updated for KSP version 0.90
+
+    Added: New readouts to the vessel category:
+        - Heading Rate
+        - Pitch Rate
+        - Roll Rate
+
+    Changed: Simulation to look for fuel lines that use CModuleFuelLine module.
+    Fixed: Editor Overlay now loads the saved visibility value properly.
+    Fixed: Altitude (Terrain) will no longer give a reading below sea level.
+    Fixed: Suicide burn now uses radar altitude that clamps to sea level.
+
+1.0.12.0, 01-12-2014
+    Added: Setting in Build Engineer to enable/disable vectored thrust calculations.
+    Added: Thrust torque field in Build Engineer (courtesy of mic_e).
+    Added: New readouts to the vessel category:
+        - Thrust Offset Angle (courtesy of mic_e)
+        - Thrust Torque (courtesy of mic_e)
+        - Part Count:  stage/total
+        - Heading
+        - Pitch
+        - Roll
+
+    Added: New readouts to the surface category:
+        - Situation
+
+    Added: New readouts to the miscellaneous category:
+        - Vectored Thrust Toggle
+
+    Fixed: The category selection within the section editors now do not always reset back to 'Orbital'.
+    Fixed: Issue where the vessel simulation can sometimes permanently freeze.
+    Fixed: Issue where the vessel simulation would not show updates when the delay was set lower than the frame rate.
+
+1.0.11.3, 11-11-2014
+    Changed: Gravity measurements for Isp to 9.82.
+
+1.0.11.2, 10-11-2014
+    Changed: Gravity measurements for Isp calculations from 9.81 to 9.8066 for accuracy.
+    Changed: Manoeuvre node burn times are now more accurate.
+    Fixed: Bug in the manoeuvre node burn time calculations where it was not averaging acceleration correctly.
+
+1.0.11.1, 07-11-2014
+    Changed: Build Engineer now shows stage part count as well as total.
+    Changed: Build Overlay Vessel tab data:
+        DeltaV: stage / total
+        Mass:   stage / total
+        TWR:    start (max)   <- shows for bottom stage only.
+        Parts:  stage / total
+
+    Fixed: Issue with the vessel tab vanishing from the editor.
+
+1.0.11.0, 06-11-2014
+    Added: New readouts to the orbital category:
+        - Current SOI
+        - Manoeuvre Node DeltaV (Prograde)
+        - Manoeuvre Node DeltaV (Normal)
+        - Manoeuvre Node DeltaV (Radial)
+        - Manoeuvre Node DeltaV (Total)
+        - Manoeuvre Node Burn Time
+        - Manoeuvre Node Half Burn Time
+        - Manoeuvre Node Angle to Prograde
+        - Manoeuvre Node Angle to Retrograde
+        - Time to Manoeuvre Node
+        - Time to Manoeuvre Burn
+
+    Added: Readout help strings by ClassyJakey.
+
+    Fixed: Issue with separators in HUDs.
+    Fixed: Issue with HUDs with backgrounds that have no displayed lines.
+
+    Padishar's Fixes:
+        Fixed: Issue with multicouplers when attached to parent by bottom node.
+        Fixed: Issue with sepratrons on solid rocket boosters.
+
+1.0.10.0, 19-10-2014
+    UPDATE NOTICE: If you are updating from a previous version of Kerbal Engineer 1.0, please
+    delete the 'Settings/SectionLibrary.xml' file, or remove the old install first.  This will
+    reset the Flight Engineer sections to their default values and enable the new HUD functionality.
+
+    Added: New reaouts to the vessel category:
+        - Suicide Burn Altitude (height above terrain to start burn)
+        - Suicide Burn Distance (distance to suicide burn altitude)
+        - Suicide Burn DeltaV (velocity change required to zero vertical speed)
+        *** F5 for safety and use at your own risk! ***
+
+    Added: HUD type sections to the Flight Engineer.
+    Added: HUD sections can have a smoked background for easy visibility.
+    Added: 'Switch to Target' button on the Target Selector readout.
+    Changed: The default installed readouts to reduce new user brain melt.
+    Fixed: Flight Engineer not saving its hidden state.
+    Fixed: Bug in the phase angle calculations.
+    Fixed: Bug where the Build Engineer would stay locked after hiding with the shortcut key.
+
+1.0.9.3, 08-10-2014
+    Added: Title of the build engineer in compact mode now shows if you are using atmospheric data.
+    Added: New readout to the surface category:
+        - Vertical Acceleration
+        - Horizontal Acceleration
+    
+    Changed: Atmospheric efficiency readout now shows as a percentage.
+    Changed: Atmospheric settings (pressure/velocity) in the editor condensed onto a single line.
+    Fixed: Bug where the overlays in the editor would stay open outside of parts screen.
+
+1.0.9.2, 07-10-2014
+    Updated for KSP v0.25.0
+    Changed: Prettyfied Latitude and Longitude readouts.
+    Changed: ModuleLandingGear now uses the physical significance flag.
+    Changed: Updated MiniAVC to 1.0.2.4.
+
+1.0.9.1, 17-09-2014
+    Fixed: Part size bug caused by TweakScale's cost calculator.
+
+1.0.9.0, 15-09-2014
+    Added: Build Engineer now also implements the '\' backslash show/hide shortcut.
+    Added: New readouts to the vessel category:
+        - Current Stage DeltaV
+        - Surface Thrust to Weight Ratio
+
+    Added: New editor overlay system.
+        - Sleeker design.
+        - Hover over part information options:
+            - Name only
+            - Middle click to show
+            - Always show
+        - Slide out overlay displays:
+            - Vessel information
+            - Resources list
+
+    Fixed: Cost calculation now works with mods implementing IPartCostModifier.
+
+1.0.8.1, 06-09-2014
+    Fixed: Bug which caused rendezvous readouts to freeze the game or show all zeros.
+
+1.0.8.0, 06-09-2014
+    Added: New readouts to the vessel category:
+        - Intake Air (Usage)
+
+    Added: New readouts to the rendezvous category:
+        - Relative Velocity
+        - Relative Speed
+
+    Fixed: An issue where deltaV would not be calculated whilst flying.
+    Fixed: NullRef whilst loading the in flight Action Menu.
+
+1.0.7.1, 02-09-2014
+    Changed: Reversed Intake Air readout from 'S/D' to 'D/S' for easier reading.
+    Changed: Increased Intake Air readout precision to 4 decimal places.
+    Fixed: Issue where Intake Air supply was not representative of total supply.
+    Fixed: Bug where actual thrust does not reset to zero on deactivated engines.
+    Fixed: Thrust now scales with velocity for atmospheric engines. (Padishar's fix)
+
+1.0.7.0, 01-09-2014
+    Added: Part count information to the Build Engineer.
+    Added: Reset button to the G-Force readout.
+    Added: Preset system to the Flight Engineer.
+    Added: New stock presets:
+        - Orbital
+        - Surface
+        - Vessel
+        - Rendezvous
+
+    Added: New readouts to the orbital category:
+        - True Anomaly
+        - Eccentric Anomaly
+        - Mean Anomaly
+        - Argument of Periapsis
+        - Angle to Prograde
+        - Angle to Retrograde
+
+    Added: New readouts to the vessel category:
+        - Intake Air (Demand)
+        - Intake Air (Supply)
+        - Intake Air (Supply/Demand)
+
+    Added: New readouts to the rendezvous category.
+        - Semi-major Axis
+        - Semi-minor Axis
+
+    Added: Time formatter which can show time as referenced by any celestial body.
+    Added: New readouts to the miscellaneous category:
+        - Time Reference Adjuster
+
+    Changed: Moved Sim Delay readout into the Miscellaneous category.
+    Changed: Updated MiniAVC to v1.0.2.3.
+    Fixed: Issues with large value wrap around in the Flight Engineer.
+    Fixed: Bug in the phase angle calculation.
+
+1.0.6.0, 23-08-2014
+    Added: Time and Angle to equatorial ascending/descending nodes in the orbital display.
+    Added: Time and Angle to relative ascending/descending nodes in the rendezvous display.
+    Added: Overlay tooltip information delay adjustment slider to the Build Engineer settings.
+    Added: Ability to rename the stock displays in the Flight Engineer.
+    Changed: Build Engineer is now hidden when not in parts view.
+    Changed: Custom display panels will only show in the control bar if an abbreviation is set.
+    Changed: Licensing and readme structures are now more verbose to satisfy the new add-on rules.
+    Fixed: Updated MiniAVC to v1.0.2.1 (fixes remote check bug as well as other minor bugs).
+
+1.0.5.0, 13-08-2014
+    Added: Acceleration readout to the Vessel category (current / maximum).
+    Added: Category library system for the Flight Engineer readouts.
+    Added: Drop-down category selection to better support the new system.
+    Changed: Misc category now called Miscellaneous (this will cause previously added readouts from this category to vanish).
+    Fixed: Bug with the Build Engineer toolbar button.
+    Fixed: Some buggyness when trying to close the bodies drop-down in the Build Engineer via the button.
+    Fixed: Flight Engineer toolbar menu now hides when hiding the GUI with F2.
+    Fixed: Flight Engineer toolbar button now disables when in module mode and no engineer is running.
+
+1.0.4.0, 12-08-2014
+    Added: Better stock toolbar support in the flight engineer.
+    Added: Dynamically generated celestial body library for supporting add-ons that modify the star system.
+    Changed: Reference bodies are now listed with a nestable menu system.
+    Changed: Extended logging system has been improved.
+    Changed: Swapped out integrated MiniAVC in place of the official bundle version.
+    Changed: Increased general distance precision to 1 decimal place.
+    Changed: Increased Semi-major/minor axis precision to 3 decimal places.
+    Fixed: Impact altitude was mistakenly formatted as an angle, it is now formatted correctly as a distance.
+
+1.0.3.0, 30-07-2014
+    Added: Integrated KSP-AVC support with MiniAVC.
+    Added: Setting to change the simulation delay in the Build Engineer.
+    Added: Setting to enable and disable the build overlay system.
+    Added: Burn time to Delta-V readouts.
+    Added: Atmospheric readouts fully support FAR.
+    Added: Atmospheric readouts are disabled with NEAR.
+    Changed: Force formatting inversely scales decimal precision with value.
+    Fixed: Flickering in VAB and Vessel display.
+    Fixed: Bug saving the GUI display size.
+
+1.0.2.0, 27-07-2014
+    Added: Separator readout module under Misc in the Flight Engineer.
+    Added: Adjustable GUI display size.
+    Added: Display size can be adjusted in the Build Engineer settings.
+    Added: Misc readout for adjusting display size in the Flight Engineer.
+    Changed: The rendezvous readout for the target's Orbital Period has higher precision.
+    Fixed: White toolbar icon by manually importing the texture if it cannot be found in the game database.
+    Fixed: Engines that have a minimum thrust are now calculated properly. (Thanks to nosscire.)
+    Fixed: Compact collapse mode is now saved in the Build Engineer.
+
+1.0.1.0, 26-07-2014
+    Added: Part-less Flight Engineer.
+    Added: Ability to collapse the Build Engineer into compact mode from left or right.
+    Added: Settings in Build Engineer for compact collapse mode and partless/module Flight Engineer.
+    Added: Biome, Impact Biome and Slope readouts.
+    Added: Extra logging and exception handling.
+    Added: The original Engineer Chip part.
+    Added: "Show Engineer" toggle on the Flight Engineer toolbar.
+    Changed: Extended logging system now also writes to the standard KSP logs.
+    Changed: Extended logging saves next to the .dll file.
+    Changed: ER7500 part has no physical significance.
+    Fixed: ActionMenu and DisplayStack destruction bug.
+
+1.0.0.1, 24-07-2014
+    Added: Stock toolbar support in the Flight Engineer.
+    Changed: Orbital Period has higher precision.
+    Fixed: Various NullRefs in editor window and overlay.
+    
+1.0.0.0, 24-07-2014
+    Initial release for public testing.

--- /dev/null
+++ b/Documents/LICENCE.txt
@@ -1,1 +1,675 @@
-
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+

--- /dev/null
+++ b/Documents/README.htm
@@ -1,1 +1,193 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta charset='UTF-8'>
+	<title>Kerbal Engineer Redux - README</title>
+	<link href='http://fonts.googleapis.com/css?family=PT+Sans:400,700' rel='stylesheet' type='text/css'>
+	<script>
+		function resizeIframe(obj) {
+			obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
+		}
+	</script>
+	<style>
+		* {
+			margin: 0; padding: 0;
+			box-sizing: border-box; moz-box-sizing: border-box; webkit-box-sizing: border-box;
+		}
 
+		html, body {
+			height: 100%;
+			font-family: 'PT Sans', Verdana, Geneva, sans-serif;
+		}
+
+		a {
+			text-decoration: none;
+			font-weight: 700;
+			color: inherit;
+		}
+
+		a:hover {
+			text-decoration: underline;
+		}
+
+		h3 {
+			display: block;
+			line-height: 1.5em;
+			font-size: 1.1em;
+			font-weight: 700;
+		}
+
+		p {
+			display: block;
+			margin: 0 0.5em;
+			text-align: justify;
+		}
+
+		ul {
+			display: block;
+			margin-left: 1.5em;
+			list-style-type: square;
+		}
+
+		li {
+			margin-top: 0.5em;
+			text-align: justify;
+		}
+
+		iframe {
+			width: 100%;
+			border: none;
+		}
+
+		header {
+			display: block;
+			padding: 25px;
+			text-align: center;
+			font-size: 3rem;
+			font-weight: 700;
+			letter-spacing: 0.2em;
+			color: white;
+			background-color: black;
+		}
+
+		section {
+			display: block;
+			margin: 10px;
+			padding: 0.5em 1em;
+			line-height: 1.5em;
+			background-color: #DDD;
+		}
+
+		footer {
+			display: block;
+			text-align: center;
+			line-height: 50px;
+			font-size: 0.8rem;
+			letter-spacing: 0.2em;
+			color: white;
+			background-color: black;
+		}
+
+		.nested_list > li {
+			margin-top: 1em;
+		}
+
+		.nested_list > li:first-child {
+			margin-top: 0.5em;
+		}
+
+		#root {
+			clear: both;
+			min-height: 100%;
+			height: auto !important;
+			height: 100%;
+			margin-bottom: -50px;
+		}
+
+		#root > #root_footer {
+			height: 50px;
+		}
+
+		#footer {
+			clear: both;
+			position: relative;
+			height: 50px;
+		}
+	</style>
+</head>
+<body>
+	<div id='root'>
+		<header>Kerbal Engineer Redux v1.0</header>
+
+		<section>
+			<h3>Developers</h3>
+			<p>
+				CYBUTEK: Primary Development<br>
+				Padishar: Simulation Logic
+			</p>
+		</section>
+
+		<section>
+			<h3>Honourable Mentions</h3>
+			<p>
+				Mic_E: Impact Readouts
+			</p>
+		</section>
+
+		<section>
+			<h3>Goto the Forum Thread</h3>
+			<p>
+				<a href="http://forum.kerbalspaceprogram.com/threads/18230" target='_blank'>http://forum.kerbalspaceprogram.com/threads/18230</a>
+			</p>
+		</section>
+
+		<section>
+			<h3>KSP-AVC Ready</h3>
+			<p>
+				KSP Add-on Version Checker is a standardised system for versioning mods. You can get more information on this
+				<a href='http://forum.kerbalspaceprogram.com/threads/79745' target='_blank'>forum thread</a>.
+			</p>
+		</section>
+
+		<section>
+			<h3>Contains MiniAVC</h3>
+			<p>
+				This mod includes version checking using <a href="http://forum.kerbalspaceprogram.com/threads/79745">MiniAVC</a>. If you opt-in, it will use the internet to check whether there is a new version available. Data is only read from the internet and no personal information is sent. For a more comprehensive version checking experience, please download the <a href="http://forum.kerbalspaceprogram.com/threads/79745">KSP-AVC Plugin</a>. 
+			</p>
+		</section>
+
+		<section>
+			<h3>Description</h3>
+			<p>
+				This plugin will allow you to view important statistics about your ship on the fly, whilst constructing and in flight.
+			</p>
+		</section>
+
+		<section>
+			<h3>Installation</h3>
+			<ul>
+				<li>Copy the 'KerbalEngineer' folder into the 'GameData' folder located within your Kerbal Space Program installation directory.</li>
+				<li>The 'Parts' folder including the 'ER7500' and 'EngineerChip' is optional and are only required if running in module mode.</li>
+			</ul>
+		</section>
+
+		<section>
+			<h3>Change Log</h3>
+			<iframe src='CHANGES.txt' onload="this.style.height = this.contentWindow.document.body.scrollHeight + 'px'"></iframe>
+		</section>
+
+		<section>
+			<h3>Software License</h3>
+			<p>
+				Licensed under the <a href='LICENCE.txt'>GNU General Public License v3</a>.
+			</p>
+		</section>
+
+		<div id='root_footer'></div>
+	</div>
+
+	<footer id='footer'>
+		README design by <a href='http://ksp.cybutek.net' target='_blank'><strong>CYBUTEK</strong></a> (GPLv3)
+	</footer>
+</body>
+</html>

--- /dev/null
+++ b/KerbalEngineer/Control/ControlCentre.cs
@@ -1,1 +1,245 @@
-
+// 
+//     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.Control.Panels;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Control
+{
+    [KSPAddon(KSPAddon.Startup.Instantly, false)]
+    public class ControlCentre : MonoBehaviour
+    {
+        #region Fields
+
+        private static readonly List<IControlPanel> panels = new List<IControlPanel>();
+
+        private static GUIStyle button;
+        private static ControlCentre instance;
+        private static GUIStyle label;
+        private static GUIStyle title;
+
+        private Vector2 contentsScrollPosition;
+        private GUIStyle panelSelectorStyle;
+        private Rect position = new Rect(Screen.width, Screen.height, 900.0f, 500.0f);
+        private IControlPanel selectedPanel;
+        private bool shouldCentre = true;
+
+        #endregion
+
+        #region Properties
+
+        public static GUIStyle Button
+        {
+            get
+            {
+                return button ?? (button = new GUIStyle(HighLogic.Skin.button)
+                {
+                    normal =
+                    {
+                        textColor = Color.white
+                    },
+                    fixedHeight = 30.0f
+                });
+            }
+        }
+
+        public static bool Enabled
+        {
+            get { return instance.enabled; }
+            set { instance.enabled = value; }
+        }
+
+        public static GUIStyle Label
+        {
+            get
+            {
+                return label ?? (label = new GUIStyle(HighLogic.Skin.label)
+                {
+                    normal =
+                    {
+                        textColor = Color.white
+                    },
+                    fontStyle = FontStyle.Bold,
+                    fixedHeight = 30.0f,
+                    alignment = TextAnchor.MiddleLeft,
+                    stretchWidth = true,
+                });
+            }
+        }
+
+        public static List<IControlPanel> Panels
+        {
+            get { return panels; }
+        }
+
+        public static GUIStyle Title
+        {
+            get
+            {
+                return title ?? (title = new GUIStyle(HighLogic.Skin.label)
+                {
+                    normal =
+                    {
+                        textColor = Color.white
+                    },
+                    fontSize = 26,
+                    fontStyle = FontStyle.Bold,
+                    alignment = TextAnchor.UpperCenter,
+                    stretchWidth = true,
+                });
+            }
+        }
+
+        #endregion
+
+        #region Methods: protected
+
+        protected void Awake()
+        {
+            try
+            {
+                if (instance == null)
+                {
+                    DontDestroyOnLoad(this);
+                    instance = this;
+                    this.enabled = false;
+                    return;
+                }
+                Destroy(this);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void OnGUI()
+        {
+            try
+            {
+                GUI.skin = null;
+                this.position = GUILayout.Window(this.GetInstanceID(), this.position, this.Window, "KERBAL ENGINEER REDUX " + EngineerGlobals.AssemblyVersion + " - CONTROL CENTRE", HighLogic.Skin.window);
+                this.CentreWindow();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Start()
+        {
+            try
+            {
+                this.InitialiseStyles();
+                LoadPanels();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Methods: private
+
+        private static void LoadPanels()
+        {
+            panels.Add(new BuildEngineerPanel());
+            panels.Add(new BuildOverlayPanel());
+        }
+
+        private void CentreWindow()
+        {
+            if (this.shouldCentre && this.position.width > 0.0f && this.position.height > 0.0f)
+            {
+                this.position.center = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f);
+                this.shouldCentre = false;
+            }
+        }
+
+        private void DrawContents()
+        {
+            GUI.skin = HighLogic.Skin;
+            this.contentsScrollPosition = GUILayout.BeginScrollView(this.contentsScrollPosition, false, true);
+            GUI.skin = null;
+
+            if (this.selectedPanel != null)
+            {
+                this.selectedPanel.Draw();
+            }
+
+            GUILayout.FlexibleSpace();
+            GUILayout.EndScrollView();
+        }
+
+        private void DrawSelectors()
+        {
+            GUILayout.BeginVertical(HighLogic.Skin.box, GUILayout.Width(225.0f));
+            foreach (var panel in panels)
+            {
+                if (GUILayout.Toggle(this.selectedPanel == panel, panel.Name, this.panelSelectorStyle))
+                {
+                    this.selectedPanel = panel;
+                }
+            }
+            GUILayout.FlexibleSpace();
+            if (GUILayout.Button("CLOSE", Button))
+            {
+                this.enabled = false;
+            }
+            GUILayout.EndVertical();
+        }
+
+        private void InitialiseStyles()
+        {
+            this.panelSelectorStyle = new GUIStyle(Button)
+            {
+                fontSize = 16,
+                fixedHeight = 40.0f
+            };
+        }
+
+        private void Window(int windowId)
+        {
+            try
+            {
+                GUILayout.BeginHorizontal();
+                this.DrawSelectors();
+                this.DrawContents();
+                GUILayout.EndHorizontal();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Control/IControlPanel.cs
@@ -1,1 +1,36 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+namespace KerbalEngineer.Control
+{
+    public interface IControlPanel
+    {
+        #region Properties
+
+        string Name { get; }
+
+        #endregion
+
+        #region Methods: public
+
+        void Draw();
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Control/Panels/BuildEngineerPanel.cs
@@ -1,1 +1,39 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+namespace KerbalEngineer.Control.Panels
+{
+    public class BuildEngineerPanel : IControlPanel
+    {
+        #region Properties
+
+        public string Name
+        {
+            get { return "Build Engineer"; }
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public void Draw() { }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Control/Panels/BuildOverlayPanel.cs
@@ -1,1 +1,84 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+#region Using Directives
+
+using KerbalEngineer.Editor;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Control.Panels
+{
+    public class BuildOverlayPanel : IControlPanel
+    {
+        #region Properties
+
+        public string Name
+        {
+            get { return "Build Overlay"; }
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public void Draw()
+        {
+            GUILayout.Label("Build Overlay", ControlCentre.Title);
+            DrawPartInfo();
+            GUILayout.Space(10.0f);
+            DrawDisplays();
+        }
+
+        #endregion
+
+        #region Methods: private
+
+        private static void DrawPartInfo()
+        {
+            GUILayout.Label("Part Information (Hover Tooltips)", ControlCentre.Label);
+            GUILayout.BeginHorizontal();
+            BuildOverlayPartInfo.Visible = GUILayout.Toggle(BuildOverlayPartInfo.Visible, "Visible", ControlCentre.Button, GUILayout.Width(150.0f));
+            if (BuildOverlayPartInfo.Visible)
+            {
+                BuildOverlayPartInfo.NamesOnly = GUILayout.Toggle(BuildOverlayPartInfo.NamesOnly, "Show Names Only", ControlCentre.Button, GUILayout.Width(150.0f));
+                if (!BuildOverlayPartInfo.NamesOnly)
+                {
+                    BuildOverlayPartInfo.ClickToOpen = GUILayout.Toggle(BuildOverlayPartInfo.ClickToOpen, "Click To Open", ControlCentre.Button, GUILayout.Width(150.0f));
+                }
+            }
+            
+            
+            GUILayout.EndHorizontal();
+        }
+
+        private static void DrawDisplays()
+        {
+            GUILayout.Label("Informational Displays", ControlCentre.Label);
+            GUILayout.BeginHorizontal();
+            BuildOverlayVessel.Visible = GUILayout.Toggle(BuildOverlayVessel.Visible, "Vessel Details", ControlCentre.Button, GUILayout.Width(150.0f));
+            BuildOverlayResources.Visible = GUILayout.Toggle(BuildOverlayResources.Visible, "Resources List", ControlCentre.Button, GUILayout.Width(150.0f));
+            GUILayout.EndHorizontal();
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Editor/BuildAdvanced.cs
+++ b/KerbalEngineer/Editor/BuildAdvanced.cs
@@ -17,24 +17,22 @@
 //     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 // 
 
-#region Using Directives
-
-using System;
-using System.Linq;
-
-using KerbalEngineer.Extensions;
-using KerbalEngineer.Flight;
-using KerbalEngineer.Helpers;
-using KerbalEngineer.Settings;
-using KerbalEngineer.UIControls;
-using KerbalEngineer.VesselSimulator;
-
-using UnityEngine;
-
-#endregion
-
 namespace KerbalEngineer.Editor
 {
+    #region Using Directives
+
+    using System;
+    using System.Linq;
+    using Extensions;
+    using Flight;
+    using Helpers;
+    using Settings;
+    using UIControls;
+    using UnityEngine;
+    using VesselSimulator;
+
+    #endregion
+
     [KSPAddon(KSPAddon.Startup.EditorAny, false)]
     public class BuildAdvanced : MonoBehaviour
     {
@@ -124,520 +122,31 @@
 
         #endregion
 
-        #region Methods: private
-
-        private void Awake()
-        {
-            Instance = this;
-            this.bodiesList = this.gameObject.AddComponent<DropDown>();
-            this.bodiesList.DrawCallback = this.DrawBodiesList;
-            this.Load();
-        }
-
-        /// <summary>
-        ///     Checks whether the editor should be locked to stop click-through.
-        /// </summary>
-        private void CheckEditorLock()
+        #region Methods
+
+        protected void Awake()
         {
             try
             {
-                if ((this.position.MouseIsOver() || this.bodiesList.Position.MouseIsOver()) && this.isEditorLocked == false)
-                {
-                    EditorLogic.fetch.State = EditorLogic.EditorState.GUI_SELECTED;
-                    this.isEditorLocked = true;
-                }
-                else if (!this.position.MouseIsOver() && !this.bodiesList.Position.MouseIsOver() && this.isEditorLocked)
-                {
-                    EditorLogic.fetch.State = EditorLogic.EditorState.PAD_UNSELECTED;
-                    this.isEditorLocked = false;
-                }
+                Instance = this;
+                this.bodiesList = this.gameObject.AddComponent<DropDown>();
+                this.bodiesList.DrawCallback = this.DrawBodiesList;
+                this.Load();
+
+                SimManager.UpdateModSettings();
+                SimManager.OnReady -= this.GetStageInfo;
+                SimManager.OnReady += this.GetStageInfo;
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "BuildAdvanced->CheckEditorLock");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the atmospheric settings.
-        /// </summary>
-        private void DrawAtmosphericDetails()
-        {
-            try
-            {
-                GUILayout.BeginHorizontal();
-                GUILayout.Label("Pressure: " + (this.atmosphericPercentage * 100.0f).ToString("F1") + "%", this.settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset));
-                GUI.skin = HighLogic.Skin;
-                GUILayout.BeginVertical();
-                GUILayout.FlexibleSpace();
-                this.atmosphericPercentage = GUILayout.HorizontalSlider(this.atmosphericPercentage, 0, 1.0f);
-                GUILayout.FlexibleSpace();
-                GUILayout.EndVertical();
-                GUI.skin = null;
-                GUILayout.EndHorizontal();
-
-                GUILayout.Space(5.0f);
-
-                GUILayout.BeginHorizontal();
-                GUILayout.Label("Velocity: " + this.atmosphericVelocity.ToString("F1") + "m/s", this.settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset));
-                GUI.skin = HighLogic.Skin;
-                GUILayout.BeginVertical();
-                GUILayout.FlexibleSpace();
-                this.atmosphericVelocity = GUILayout.HorizontalSlider(this.atmosphericVelocity, 0, 2500f);
-                GUILayout.FlexibleSpace();
-                GUILayout.EndVertical();
-                GUI.skin = null;
-                GUILayout.EndHorizontal();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawAtmosphericDetails");
-            }
-        }
-
-        private void DrawBodiesList()
-        {
-            try
-            {
-                if (CelestialBodies.SystemBody == CelestialBodies.SelectedBody)
-                {
-                    this.DrawBody(CelestialBodies.SystemBody);
-                }
-                else
-                {
-                    foreach (var body in CelestialBodies.SystemBody.Children)
-                    {
-                        this.DrawBody(body);
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
                 Logger.Exception(ex);
             }
         }
 
-        private void DrawBody(CelestialBodies.BodyInfo bodyInfo, int depth = 0)
-        {
-            try
-            {
-                GUILayout.BeginHorizontal();
-                GUILayout.Space(20.0f * depth);
-                if (GUILayout.Button(bodyInfo.Children.Count > 0 ? bodyInfo.Name + " [" + bodyInfo.Children.Count + "]" : bodyInfo.Name, bodyInfo.Selected && bodyInfo.SelectedDepth == 0 ? this.bodiesButtonActiveStyle : this.bodiesButtonStyle))
-                {
-                    CelestialBodies.SetSelectedBody(bodyInfo.Name);
-                    this.bodiesList.Resize = true;
-                }
-                GUILayout.EndHorizontal();
-
-                if (bodyInfo.Selected)
-                {
-                    foreach (var body in bodyInfo.Children)
-                    {
-                        this.DrawBody(body, depth + 1);
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        /// <summary>
-        ///     Draws the burn time column.
-        /// </summary>
-        private void DrawBurnTime()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("BURN", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(TimeFormatter.ConvertToString(stage.time), this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawBurnTime");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the cost column.
-        /// </summary>
-        private void DrawCost()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(110.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("COST", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(stage.cost.ToString("N0") + " / " + stage.totalCost.ToString("N0"), this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawCost");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the deltaV column.
-        /// </summary>
-        private void DrawDeltaV()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("DELTA-V", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(stage.deltaV.ToString("N0") + " / " + stage.inverseTotalDeltaV.ToString("N0") + "m/s", this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawDeltaV");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the specific impluse column.
-        /// </summary>
-        private void DrawIsp()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("ISP", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(stage.isp.ToString("F1") + "s", this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawIsp");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the mass column.
-        /// </summary>
-        private void DrawMass()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(110.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("MASS", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(stage.mass.ToMass(false) + " / " + stage.totalMass.ToMass(), this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawMass");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the part count column.
-        /// </summary>
-        private void DrawPartCount()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(50.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("PARTS", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(stage.partCount.ToString("N0"), this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawPartCount");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the settings panel.
-        /// </summary>
-        private void DrawSettings()
-        {
-            try
-            {
-                GUILayout.BeginHorizontal();
-                GUILayout.Label("Compact mode collapses to the:", this.settingStyle);
-                this.compactCollapseRight = !GUILayout.Toggle(!this.compactCollapseRight, "LEFT", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                this.compactCollapseRight = GUILayout.Toggle(this.compactCollapseRight, "RIGHT", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                GUILayout.EndHorizontal();
-
-                GUILayout.BeginHorizontal();
-                GUILayout.Label("Build Engineer Overlay:", this.settingStyle);
-                BuildOverlay.Instance.Visible = GUILayout.Toggle(BuildOverlay.Instance.Visible, "ENABLED", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                BuildOverlay.Instance.Visible = !GUILayout.Toggle(!BuildOverlay.Instance.Visible, "DISABLED", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                GUILayout.EndHorizontal();
-
-                GUILayout.BeginHorizontal();
-                GUILayout.Label("Flight Engineer activation mode:", this.settingStyle);
-                FlightEngineerPartless.IsPartless = GUILayout.Toggle(FlightEngineerPartless.IsPartless, "PARTLESS", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                FlightEngineerPartless.IsPartless = !GUILayout.Toggle(!FlightEngineerPartless.IsPartless, "MODULE", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                GUILayout.EndHorizontal();
-
-                GUILayout.BeginHorizontal();
-                GUILayout.Label("GUI Size: " + GuiDisplaySize.Increment, this.settingStyle);
-                if (GUILayout.Button("<", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)))
-                {
-                    GuiDisplaySize.Increment--;
-                }
-                if (GUILayout.Button(">", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)))
-                {
-                    GuiDisplaySize.Increment++;
-                }
-                GUILayout.EndHorizontal();
-
-                GUILayout.Label("Tooltip information delay: " + (BuildOverlay.Instance.TooltipInfoDelay * 1000.0f) + "ms", this.settingStyle);
-                GUI.skin = HighLogic.Skin;
-                BuildOverlay.Instance.TooltipInfoDelay = (float)Math.Round(GUILayout.HorizontalSlider(BuildOverlay.Instance.TooltipInfoDelay, 0, 2.0f), 2);
-                GUI.skin = null;
-
-                GUILayout.Label("Minimum delay between simulations: " + SimManager.minSimTime + "ms", this.settingStyle);
-                GUI.skin = HighLogic.Skin;
-                SimManager.minSimTime = (long)GUILayout.HorizontalSlider(SimManager.minSimTime, 0, 2000.0f);
-                GUI.skin = null;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawSettings");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the stage number column.
-        /// </summary>
-        private void DrawStageNumbers()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(30.0f * GuiDisplaySize.Offset));
-                GUILayout.Label(string.Empty, this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label("S" + stage.number, this.titleStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawStageNumbers");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the thrust column.
-        /// </summary>
-        private void DrawThrust()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("THRUST", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(stage.thrust.ToForce(), this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawThrust");
-            }
-        }
-
-        /// <summary>
-        ///     Drwas the thrust to weight ratio column.
-        /// </summary>
-        private void DrawTwr()
-        {
-            try
-            {
-                GUILayout.BeginVertical(GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("TWR (MAX)", this.titleStyle);
-                foreach (var stage in this.stages)
-                {
-                    if (this.showAllStages || stage.deltaV > 0)
-                    {
-                        GUILayout.Label(stage.thrustToWeight.ToString("F2") + " (" + stage.maxThrustToWeight.ToString("F2") + ")", this.infoStyle);
-                    }
-                }
-                GUILayout.EndVertical();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->DrawTwr");
-            }
-        }
-
-        /// <summary>
-        ///     Initialises all the styles that are required.
-        /// </summary>
-        private void InitialiseStyles()
-        {
-            try
-            {
-                this.windowStyle = new GUIStyle(HighLogic.Skin.window)
-                {
-                    alignment = TextAnchor.UpperLeft
-                };
-
-                this.areaStyle = new GUIStyle(HighLogic.Skin.box)
-                {
-                    padding = new RectOffset(0, 0, 9, 0)
-                };
-
-                this.areaSettingStyle = new GUIStyle(HighLogic.Skin.box)
-                {
-                    padding = new RectOffset(10, 10, 10, 10)
-                };
-
-                this.buttonStyle = new GUIStyle(HighLogic.Skin.button)
-                {
-                    normal =
-                    {
-                        textColor = Color.white
-                    },
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    alignment = TextAnchor.MiddleCenter
-                };
-
-                this.titleStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    normal =
-                    {
-                        textColor = Color.white
-                    },
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    alignment = TextAnchor.MiddleCenter,
-                    stretchWidth = true,
-                };
-
-                this.infoStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    alignment = TextAnchor.MiddleCenter,
-                    stretchWidth = true
-                };
-
-                this.settingStyle = new GUIStyle(this.titleStyle)
-                {
-                    alignment = TextAnchor.MiddleLeft,
-                    stretchWidth = true,
-                    stretchHeight = true
-                };
-
-                this.settingAtmoStyle = new GUIStyle(this.titleStyle)
-                {
-                    margin = new RectOffset(),
-                    padding = new RectOffset(),
-                    alignment = TextAnchor.UpperLeft
-                };
-
-                this.bodiesButtonStyle = new GUIStyle(HighLogic.Skin.button)
-                {
-                    margin = new RectOffset(0, 0, 2, 0),
-                    padding = new RectOffset(5, 5, 5, 5),
-                    normal =
-                    {
-                        textColor = Color.white
-                    },
-                    active =
-                    {
-                        textColor = Color.white
-                    },
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    alignment = TextAnchor.MiddleCenter,
-                    fixedHeight = 20.0f
-                };
-
-                this.bodiesButtonActiveStyle = new GUIStyle(this.bodiesButtonStyle)
-                {
-                    normal = this.bodiesButtonStyle.onNormal,
-                    hover = this.bodiesButtonStyle.onHover
-                };
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->InitialiseStyles");
-            }
-        }
-
-        /// <summary>
-        ///     Loads the settings when this object is created.
-        /// </summary>
-        private void Load()
-        {
-            try
-            {
-                var handler = SettingHandler.Load("BuildAdvanced.xml");
-                handler.Get("visible", ref this.visible);
-                this.position.x = handler.Get("windowPositionX", this.position.x);
-                this.position.y = handler.Get("windowPositionY", this.position.y);
-                handler.Get("compactMode", ref this.compactMode);
-                handler.Get("compactCollapseRight", ref this.compactCollapseRight);
-                handler.Get("showAllStages", ref this.showAllStages);
-                handler.Get("showAtmosphericDetails", ref this.showAtmosphericDetails);
-                handler.Get("showSettings", ref this.showSettings);
-                CelestialBodies.SetSelectedBody(handler.Get("selectedBodyName", CelestialBodies.SelectedBody.Name));
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->Load");
-            }
-        }
-
         /// <summary>
         ///     Saves the settings when this object is destroyed.
         /// </summary>
-        private void OnDestroy()
+        protected void OnDestroy()
         {
             try
             {
@@ -656,33 +165,26 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "BuildAdvanced->OnDestroy");
-            }
-        }
-
-        private void OnGUI()
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void OnGUI()
         {
             try
             {
-                if (!this.visible || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0 || EditorLogic.fetch.editorScreen != EditorLogic.EditorScreen.Parts)
+                if (!this.visible || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0 || EditorLogic.fetch.editorScreen != EditorScreen.Parts)
                 {
                     return;
                 }
 
-                if (SimManager.ResultsReady())
-                {
-                    this.stages = SimManager.Stages;
-                }
-
-                SimManager.RequestSimulation();
-
                 if (this.stages == null)
                 {
                     return;
                 }
 
                 // Change the window title based on whether in compact mode or not.
-                var title = !this.compactMode ? "KERBAL ENGINEER REDUX " + EngineerGlobals.AssemblyVersion : "K.E.R. " + EngineerGlobals.AssemblyVersion;
+                var title = !this.compactMode ? "KERBAL ENGINEER REDUX " + EngineerGlobals.AssemblyVersion : "K.E.R. " + EngineerGlobals.AssemblyVersion + (this.showAtmosphericDetails ? " (ATMOS.)" : String.Empty);
 
                 // Reset the window size when the staging or something else has changed.
                 var stageCount = this.stages.Count(stage => this.showAllStages || stage.deltaV > 0);
@@ -713,7 +215,494 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "BuildAdvanced->OnDraw");
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Start()
+        {
+            try
+            {
+                this.InitialiseStyles();
+                GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Update()
+        {
+            try
+            {
+                if (Input.GetKeyDown(KeyBinder.EditorShowHide))
+                {
+                    this.visible = !this.visible;
+                    if (!this.visible)
+                    {
+                        this.EditorLock(false);
+                    }
+                }
+
+                if (!this.visible || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0)
+                {
+                    this.bodiesList.enabled = false;
+                    return;
+                }
+
+                // Configure the simulation parameters based on the selected reference body.
+                SimManager.Gravity = CelestialBodies.SelectedBody.Gravity;
+
+                if (this.showAtmosphericDetails)
+                {
+                    SimManager.Atmosphere = CelestialBodies.SelectedBody.Atmosphere * 0.01d * this.atmosphericPercentage;
+                }
+                else
+                {
+                    SimManager.Atmosphere = 0;
+                }
+
+                SimManager.Velocity = this.atmosphericVelocity;
+
+                SimManager.RequestSimulation();
+                SimManager.TryStartSimulation();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "BuildAdvanced->Update");
+            }
+        }
+
+        /// <summary>
+        ///     Checks whether the editor should be locked to stop click-through.
+        /// </summary>
+        private void CheckEditorLock()
+        {
+            if ((this.position.MouseIsOver() || this.bodiesList.Position.MouseIsOver()) && !this.isEditorLocked)
+            {
+                this.EditorLock(true);
+            }
+            else if (!this.position.MouseIsOver() && !this.bodiesList.Position.MouseIsOver() && this.isEditorLocked)
+            {
+                this.EditorLock(false);
+            }
+        }
+
+        /// <summary>
+        ///     Draws the atmospheric settings.
+        /// </summary>
+        private void DrawAtmosphericDetails()
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.BeginVertical();
+            GUILayout.Label("Pressure: " + (this.atmosphericPercentage * 100.0f).ToString("F1") + "%", this.settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset));
+            GUI.skin = HighLogic.Skin;
+            this.atmosphericPercentage = GUILayout.HorizontalSlider(this.atmosphericPercentage, 0, 1.0f);
+            GUI.skin = null;
+            GUILayout.EndVertical();
+
+            GUILayout.Space(5.0f);
+
+            GUILayout.BeginVertical();
+            GUILayout.Label("Velocity: " + this.atmosphericVelocity.ToString("F1") + "m/s", this.settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset));
+            GUI.skin = HighLogic.Skin;
+            this.atmosphericVelocity = GUILayout.HorizontalSlider(this.atmosphericVelocity, 0, 2500f);
+            GUI.skin = null;
+            GUILayout.EndVertical();
+            GUILayout.EndHorizontal();
+        }
+
+        private void DrawBodiesList()
+        {
+            if (CelestialBodies.SystemBody == CelestialBodies.SelectedBody)
+            {
+                this.DrawBody(CelestialBodies.SystemBody);
+            }
+            else
+            {
+                foreach (var body in CelestialBodies.SystemBody.Children)
+                {
+                    this.DrawBody(body);
+                }
+            }
+        }
+
+        private void DrawBody(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.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);
+                }
+            }
+        }
+
+        /// <summary>
+        ///     Draws the burn time column.
+        /// </summary>
+        private void DrawBurnTime()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("BURN", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(TimeFormatter.ConvertToString(stage.time), this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the cost column.
+        /// </summary>
+        private void DrawCost()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(110.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("COST", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(Units.Cost(stage.cost, stage.totalCost), this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the deltaV column.
+        /// </summary>
+        private void DrawDeltaV()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("DELTA-V", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(stage.deltaV.ToString("N0") + " / " + stage.inverseTotalDeltaV.ToString("N0") + "m/s", this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the specific impluse column.
+        /// </summary>
+        private void DrawIsp()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("ISP", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(stage.isp.ToString("F1") + "s", this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the mass column.
+        /// </summary>
+        private void DrawMass()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(110.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("MASS", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(Units.ToMass(stage.mass, stage.totalMass), this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the part count column.
+        /// </summary>
+        private void DrawPartCount()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(50.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("PARTS", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(stage.partCount + " / " + stage.totalPartCount, this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the settings panel.
+        /// </summary>
+        private void DrawSettings()
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("Compact mode collapses to the:", this.settingStyle);
+            this.compactCollapseRight = !GUILayout.Toggle(!this.compactCollapseRight, "LEFT", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            this.compactCollapseRight = GUILayout.Toggle(this.compactCollapseRight, "RIGHT", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("Simulate using vectored thrust values:");
+            SimManager.vectoredThrust = GUILayout.Toggle(SimManager.vectoredThrust, "ENABLED", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("Build Engineer Overlay:", this.settingStyle);
+            BuildOverlay.Visible = GUILayout.Toggle(BuildOverlay.Visible, "VISIBLE", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            BuildOverlayPartInfo.NamesOnly = GUILayout.Toggle(BuildOverlayPartInfo.NamesOnly, "NAMES ONLY", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            BuildOverlayPartInfo.ClickToOpen = GUILayout.Toggle(BuildOverlayPartInfo.ClickToOpen, "CLICK TO OPEN", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("Flight Engineer activation mode:", this.settingStyle);
+            FlightEngineerCore.IsCareerMode = GUILayout.Toggle(FlightEngineerCore.IsCareerMode, "CAREER", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            FlightEngineerCore.IsCareerMode = !GUILayout.Toggle(!FlightEngineerCore.IsCareerMode, "PARTLESS", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("Flight Engineer Career Limitations:", this.settingStyle);
+            FlightEngineerCore.IsKerbalLimited = GUILayout.Toggle(FlightEngineerCore.IsKerbalLimited, "KERBAL", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            FlightEngineerCore.IsTrackingStationLimited = GUILayout.Toggle(FlightEngineerCore.IsTrackingStationLimited, "TRACKING", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("GUI Size: " + GuiDisplaySize.Increment, this.settingStyle);
+            if (GUILayout.Button("<", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)))
+            {
+                GuiDisplaySize.Increment--;
+            }
+            if (GUILayout.Button(">", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)))
+            {
+                GuiDisplaySize.Increment++;
+            }
+            GUILayout.EndHorizontal();
+
+            GUILayout.Label("Minimum delay between simulations: " + SimManager.minSimTime.Milliseconds + "ms", this.settingStyle);
+            GUI.skin = HighLogic.Skin;
+            SimManager.minSimTime = new TimeSpan(0, 0, 0, 0, (int)GUILayout.HorizontalSlider(SimManager.minSimTime.Milliseconds, 0, 2000.0f));
+            GUI.skin = null;
+        }
+
+        /// <summary>
+        ///     Draws the stage number column.
+        /// </summary>
+        private void DrawStageNumbers()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(30.0f * GuiDisplaySize.Offset));
+            GUILayout.Label(string.Empty, this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label("S" + stage.number, this.titleStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the thrust column.
+        /// </summary>
+        private void DrawThrust()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("THRUST", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(stage.thrust.ToForce(), this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Draws the torque column.
+        /// </summary>
+        private void DrawTorque()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("TORQUE", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(stage.maxThrustTorque.ToTorque(), this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        /// <summary>
+        ///     Drwas the thrust to weight ratio column.
+        /// </summary>
+        private void DrawTwr()
+        {
+            GUILayout.BeginVertical(GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+            GUILayout.Label("TWR (MAX)", this.titleStyle);
+            foreach (var stage in this.stages)
+            {
+                if (this.showAllStages || stage.deltaV > 0)
+                {
+                    GUILayout.Label(stage.thrustToWeight.ToString("F2") + " (" + stage.maxThrustToWeight.ToString("F2") + ")", this.infoStyle);
+                }
+            }
+            GUILayout.EndVertical();
+        }
+
+        private void EditorLock(bool state)
+        {
+            if (state)
+            {
+                EditorLogic.fetch.Lock(true, true, true, "KER_BuildAdvanced");
+                BuildOverlayPartInfo.Hidden = true;
+                this.isEditorLocked = true;
+            }
+            else
+            {
+                EditorLogic.fetch.Unlock("KER_BuildAdvanced");
+                BuildOverlayPartInfo.Hidden = false;
+                this.isEditorLocked = false;
+            }
+        }
+
+        private void GetStageInfo()
+        {
+            this.stages = SimManager.Stages;
+        }
+
+        /// <summary>
+        ///     Initialises all the styles that are required.
+        /// </summary>
+        private void InitialiseStyles()
+        {
+            this.windowStyle = new GUIStyle(HighLogic.Skin.window)
+            {
+                alignment = TextAnchor.UpperLeft
+            };
+
+            this.areaStyle = new GUIStyle(HighLogic.Skin.box)
+            {
+                padding = new RectOffset(0, 0, 9, 0)
+            };
+
+            this.areaSettingStyle = new GUIStyle(HighLogic.Skin.box)
+            {
+                padding = new RectOffset(10, 10, 10, 10)
+            };
+
+            this.buttonStyle = new GUIStyle(HighLogic.Skin.button)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                alignment = TextAnchor.MiddleCenter
+            };
+
+            this.titleStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                alignment = TextAnchor.MiddleCenter,
+                stretchWidth = true,
+            };
+
+            this.infoStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                alignment = TextAnchor.MiddleCenter,
+                stretchWidth = true
+            };
+
+            this.settingStyle = new GUIStyle(this.titleStyle)
+            {
+                alignment = TextAnchor.MiddleLeft,
+                stretchWidth = true,
+                stretchHeight = true
+            };
+
+            this.settingAtmoStyle = new GUIStyle(this.titleStyle)
+            {
+                margin = new RectOffset(),
+                padding = new RectOffset(),
+                alignment = TextAnchor.UpperLeft
+            };
+
+            this.bodiesButtonStyle = new GUIStyle(HighLogic.Skin.button)
+            {
+                margin = new RectOffset(0, 0, 2, 0),
+                padding = new RectOffset(5, 5, 5, 5),
+                normal =
+                {
+                    textColor = Color.white
+                },
+                active =
+                {
+                    textColor = Color.white
+                },
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                alignment = TextAnchor.MiddleCenter,
+                fixedHeight = 20.0f
+            };
+
+            this.bodiesButtonActiveStyle = new GUIStyle(this.bodiesButtonStyle)
+            {
+                normal = this.bodiesButtonStyle.onNormal,
+                hover = this.bodiesButtonStyle.onHover
+            };
+        }
+
+        /// <summary>
+        ///     Loads the settings when this object is created.
+        /// </summary>
+        private void Load()
+        {
+            try
+            {
+                var handler = SettingHandler.Load("BuildAdvanced.xml");
+                handler.Get("visible", ref this.visible);
+                this.position.x = handler.Get("windowPositionX", this.position.x);
+                this.position.y = handler.Get("windowPositionY", this.position.y);
+                handler.Get("compactMode", ref this.compactMode);
+                handler.Get("compactCollapseRight", ref this.compactCollapseRight);
+                handler.Get("showAllStages", ref this.showAllStages);
+                handler.Get("showAtmosphericDetails", ref this.showAtmosphericDetails);
+                handler.Get("showSettings", ref this.showSettings);
+                CelestialBodies.SetSelectedBody(handler.Get("selectedBodyName", CelestialBodies.SelectedBody.Name));
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "BuildAdvanced->Load");
             }
         }
 
@@ -721,43 +710,6 @@
         {
             this.InitialiseStyles();
             this.hasChanged = true;
-        }
-
-        private void Start()
-        {
-            this.InitialiseStyles();
-            GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
-        }
-
-        private void Update()
-        {
-            try
-            {
-                if (!this.visible || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0)
-                {
-                    this.bodiesList.enabled = false;
-                    return;
-                }
-
-                // Configure the simulation parameters based on the selected reference body.
-                SimManager.Gravity = CelestialBodies.SelectedBody.Gravity;
-
-                if (this.showAtmosphericDetails)
-                {
-                    SimManager.Atmosphere = CelestialBodies.SelectedBody.Atmosphere * 0.01d * this.atmosphericPercentage;
-                }
-                else
-                {
-                    SimManager.Atmosphere = 0;
-                }
-
-                SimManager.Velocity = this.atmosphericVelocity;
-                SimManager.TryStartSimulation();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildAdvanced->Update");
-            }
         }
 
         /// <summary>
@@ -812,6 +764,7 @@
                     this.DrawMass();
                     this.DrawIsp();
                     this.DrawThrust();
+                    this.DrawTorque();
                     this.DrawTwr();
                     this.DrawDeltaV();
                     this.DrawBurnTime();
@@ -844,7 +797,7 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "BuildAdvanced->Window");
+                Logger.Exception(ex);
             }
         }
 

--- a/KerbalEngineer/Editor/BuildOverlay.cs
+++ b/KerbalEngineer/Editor/BuildOverlay.cs
@@ -19,490 +19,250 @@
 
 #region Using Directives
 
-using System;
-using System.Diagnostics;
-
-using KerbalEngineer.Extensions;
-using KerbalEngineer.Settings;
-using KerbalEngineer.VesselSimulator;
-
-using UnityEngine;
+
 
 #endregion
 
 namespace KerbalEngineer.Editor
 {
+    #region Using Directives
+
+    using System;
+    using Helpers;
+    using Settings;
+    using UnityEngine;
+
+    #endregion
+
     [KSPAddon(KSPAddon.Startup.EditorAny, false)]
     public class BuildOverlay : MonoBehaviour
     {
-        #region Instance
-
-        /// <summary>
-        ///     Gets the current instance if started or returns null.
-        /// </summary>
-        public static BuildOverlay Instance { get; private set; }
+        #region Fields
+
+        private static BuildOverlayPartInfo buildOverlayPartInfo;
+        private static BuildOverlayResources buildOverlayResources;
+        private static BuildOverlayVessel buildOverlayVessel;
+        private static BuildOverlay instance;
+
+        private static float minimumWidth = 200.0f;
+        private static GUIStyle nameStyle;
+        private static float tabSpeed = 5.0f;
+        private static GUIStyle tabStyle;
+        private static GUIStyle titleStyle;
+        private static GUIStyle valueStyle;
+        private static GUIStyle windowStyle;
 
         #endregion
 
-        #region Fields
-
-        private readonly Stopwatch tooltipInfoTimer = new Stopwatch();
-        private Stage lastStage;
-
-        private Part selectedPart;
-        private int windowId;
-        private Rect windowPosition = new Rect(300.0f, 0, 0, 0);
+        #region Properties
+
+        public static BuildOverlayPartInfo BuildOverlayPartInfo
+        {
+            get { return buildOverlayPartInfo; }
+        }
+
+        public static BuildOverlayResources BuildOverlayResources
+        {
+            get { return buildOverlayResources; }
+        }
+
+        public static BuildOverlayVessel BuildOverlayVessel
+        {
+            get { return buildOverlayVessel; }
+        }
+
+        public static float MinimumWidth
+        {
+            get { return minimumWidth; }
+            set { minimumWidth = value; }
+        }
+
+        public static GUIStyle NameStyle
+        {
+            get
+            {
+                return nameStyle ?? (nameStyle = new GUIStyle
+                {
+                    normal =
+                    {
+                        textColor = Color.white
+                    },
+                    fontSize = 11,
+                    fontStyle = FontStyle.Bold,
+                    alignment = TextAnchor.UpperLeft,
+                    stretchWidth = true
+                });
+            }
+        }
+
+        public static float TabSpeed
+        {
+            get { return tabSpeed; }
+            set { tabSpeed = value; }
+        }
+
+        public static GUIStyle TabStyle
+        {
+            get
+            {
+                return tabStyle ?? (tabStyle = new GUIStyle
+                {
+                    normal =
+                    {
+                        background = TextureHelper.CreateTextureFromColour(new Color(0.0f, 0.0f, 0.0f, 0.5f)),
+                        textColor = Color.yellow
+                    },
+                    hover =
+                    {
+                        background = TextureHelper.CreateTextureFromColour(new Color(0.0f, 0.0f, 0.0f, 0.75f)),
+                        textColor = Color.yellow
+                    },
+                    onNormal =
+                    {
+                        background = TextureHelper.CreateTextureFromColour(new Color(0.0f, 0.0f, 0.0f, 0.5f)),
+                        textColor = Color.yellow
+                    },
+                    onHover =
+                    {
+                        background = TextureHelper.CreateTextureFromColour(new Color(0.0f, 0.0f, 0.0f, 0.75f)),
+                        textColor = Color.yellow
+                    },
+                    padding = new RectOffset(20, 20, 0, 0),
+                    fontSize = 11,
+                    fontStyle = FontStyle.Bold,
+                    alignment = TextAnchor.MiddleCenter,
+                    fixedHeight = 15.0f,
+                    stretchWidth = true
+                });
+            }
+        }
+
+        public static GUIStyle TitleStyle
+        {
+            get
+            {
+                return titleStyle ?? (titleStyle = new GUIStyle
+                {
+                    normal =
+                    {
+                        textColor = Color.yellow
+                    },
+                    fontSize = 11,
+                    fontStyle = FontStyle.Bold,
+                    stretchWidth = true
+                });
+            }
+        }
+
+        public static GUIStyle ValueStyle
+        {
+            get
+            {
+                return valueStyle ?? (valueStyle = new GUIStyle
+                {
+                    normal =
+                    {
+                        textColor = Color.white
+                    },
+                    fontSize = 11,
+                    fontStyle = FontStyle.Normal,
+                    alignment = TextAnchor.UpperRight,
+                    stretchWidth = true
+                });
+            }
+        }
+
+        public static bool Visible
+        {
+            get { return BuildOverlayPartInfo.Visible && BuildOverlayVessel.Visible && BuildOverlayResources.Visible; }
+            set { BuildOverlayPartInfo.Visible = BuildOverlayVessel.Visible = BuildOverlayResources.Visible = value; }
+        }
+
+        public static GUIStyle WindowStyle
+        {
+            get
+            {
+                return windowStyle ?? (windowStyle = new GUIStyle
+                {
+                    normal =
+                    {
+                        background = TextureHelper.CreateTextureFromColour(new Color(0.0f, 0.0f, 0.0f, 0.5f))
+                    },
+                    padding = new RectOffset(5, 5, 3, 3),
+                });
+            }
+        }
 
         #endregion
 
-        #region Constructors
-
-        private void Awake()
-        {
-            Instance = this;
-            GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
-        }
-
-        private void Start()
-        {
-            this.windowId = this.GetHashCode();
-            this.InitialiseStyles();
-            this.Load();
-            RenderingManager.AddToPostDrawQueue(0, this.OnDraw);
-        }
-
-        #endregion
-
-        #region Properties
-
-        private float tooltipInfoDelay = 0.5f;
-        private bool visible = true;
-
-        public float TooltipInfoDelay
-        {
-            get { return this.tooltipInfoDelay; }
-            set { this.tooltipInfoDelay = value; }
-        }
-
-        /// <summary>
-        ///     Gets and sets whether the display is enabled.
-        /// </summary>
-        public bool Visible
-        {
-            get { return this.visible; }
-            set
-            {
-                this.visible = value;
-                Logger.Log("BuildOverlay->Visible = " + value);
-            }
-        }
-
-        #endregion
-
-        #region GUIStyles
-
-        private GUIStyle infoStyle;
-        private GUIStyle titleStyle;
-        private GUIStyle tooltipInfoStyle;
-        private GUIStyle tooltipTitleStyle;
-        private GUIStyle windowStyle;
-
-        private void InitialiseStyles()
+        #region Methods
+
+        public static void Load()
+        {
+            var handler = SettingHandler.Load("BuildOverlay.xml");
+            Visible = handler.GetSet("visible", Visible);
+            BuildOverlayPartInfo.NamesOnly = handler.GetSet("namesOnly", BuildOverlayPartInfo.NamesOnly);
+            BuildOverlayPartInfo.ClickToOpen = handler.GetSet("clickToOpen", BuildOverlayPartInfo.ClickToOpen);
+            buildOverlayVessel.Open = handler.GetSet("vesselOpen", buildOverlayVessel.Open);
+            buildOverlayResources.Open = handler.GetSet("resourcesOpen", buildOverlayResources.Open);
+            buildOverlayVessel.WindowX = handler.GetSet("vesselWindowX", buildOverlayVessel.WindowX);
+            handler.Save("BuildOverlay.xml");
+        }
+
+        public static void Save()
+        {
+            var handler = SettingHandler.Load("BuildOverlay.xml");
+            handler.Set("visible", Visible);
+            handler.Set("namesOnly", BuildOverlayPartInfo.NamesOnly);
+            handler.Set("clickToOpen", BuildOverlayPartInfo.ClickToOpen);
+            handler.Set("vesselOpen", buildOverlayVessel.Open);
+            handler.Set("resourcesOpen", buildOverlayResources.Open);
+            handler.Set("vesselWindowX", buildOverlayVessel.WindowX);
+            handler.Save("BuildOverlay.xml");
+        }
+
+        protected void Awake()
         {
             try
             {
-                this.windowStyle = new GUIStyle(GUIStyle.none)
-                {
-                    margin = new RectOffset(),
-                    padding = new RectOffset()
-                };
-
-                this.titleStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    normal =
-                    {
-                        textColor = Color.white
-                    },
-                    margin = new RectOffset(),
-                    padding = new RectOffset(),
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    stretchWidth = true
-                };
-
-                this.infoStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    margin = new RectOffset(),
-                    padding = new RectOffset(),
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    stretchWidth = true
-                };
-
-                this.tooltipTitleStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    normal =
-                    {
-                        textColor = Color.white
-                    },
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    stretchWidth = true
-                };
-
-                this.tooltipInfoStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    stretchWidth = true
-                };
+                if (instance != null)
+                {
+                    Destroy(this);
+                    return;
+                }
+                instance = this;
+                buildOverlayPartInfo = this.gameObject.AddComponent<BuildOverlayPartInfo>();
+                buildOverlayVessel = this.gameObject.AddComponent<BuildOverlayVessel>();
+                buildOverlayResources = this.gameObject.AddComponent<BuildOverlayResources>();
+                Load();
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "BuildOverlay->InitialiseStyles");
-            }
-        }
-
-        private void OnSizeChanged()
-        {
-            this.InitialiseStyles();
-            this.windowPosition.width = 0;
-            this.windowPosition.height = 0;
-        }
-
-        #endregion
-
-        #region Update and Drawing
-
-        private void Update()
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void OnDestroy()
         {
             try
             {
-                if (!this.visible || BuildAdvanced.Instance == null || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0 || EditorLogic.fetch.editorScreen != EditorLogic.EditorScreen.Parts)
-                {
-                    return;
-                }
-
-                // Configure the simulation parameters based on the selected reference body.
-                SimManager.Gravity = CelestialBodies.SelectedBody.Gravity;
-
-                if (BuildAdvanced.Instance.ShowAtmosphericDetails)
-                {
-                    SimManager.Atmosphere = CelestialBodies.SelectedBody.Atmosphere * 0.01d;
-                }
-                else
-                {
-                    SimManager.Atmosphere = 0;
-                }
-
-                SimManager.TryStartSimulation();
+                Save();
+                if (buildOverlayPartInfo != null)
+                {
+                    Destroy(buildOverlayPartInfo);
+                }
+                if (buildOverlayVessel != null)
+                {
+                    Destroy(buildOverlayVessel);
+                }
+                if (buildOverlayResources != null)
+                {
+                    Destroy(buildOverlayResources);
+                }
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "BuildOverlay->Update");
-            }
-        }
-
-        private void OnDraw()
-        {
-            try
-            {
-                if (!this.visible || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0 || EditorLogic.fetch.editorScreen != EditorLogic.EditorScreen.Parts)
-                {
-                    return;
-                }
-
-                if (SimManager.ResultsReady())
-                {
-                    this.lastStage = SimManager.LastStage;
-                }
-
-                SimManager.RequestSimulation();
-
-                if (this.lastStage == null)
-                {
-                    return;
-                }
-
-                GUI.skin = null;
-                this.windowPosition = GUILayout.Window(this.windowId, this.windowPosition, this.Window, string.Empty, this.windowStyle);
-
-                // Check and set that the window is at the bottom of the screen.
-                if (this.windowPosition.y + this.windowPosition.height != Screen.height - 5.0f)
-                {
-                    this.windowPosition.y = Screen.height - this.windowPosition.height - 5.0f;
-                }
-
-                // Find if a part is selected or being hovered over.
-                if (EditorLogic.SelectedPart != null)
-                {
-                    // Do not allow the extended information to be shown.
-                    if (this.selectedPart != null)
-                    {
-                        this.selectedPart = null;
-                        this.tooltipInfoTimer.Reset();
-                    }
-
-                    this.DrawTooltip(EditorLogic.SelectedPart);
-                }
-                else
-                {
-                    var isPartSelected = false;
-                    foreach (var part in EditorLogic.SortedShipList)
-                    {
-                        if (part.stackIcon.highlightIcon)
-                        {
-                            // Start the extended information timer.
-                            if (part != this.selectedPart)
-                            {
-                                this.selectedPart = part;
-                                this.tooltipInfoTimer.Reset();
-                                this.tooltipInfoTimer.Start();
-                            }
-                            isPartSelected = true;
-
-                            this.DrawTooltip(part);
-                            break;
-                        }
-                    }
-
-                    // If no part is being hovered over we must reset the extended information timer.
-                    if (!isPartSelected && this.selectedPart != null)
-                    {
-                        this.selectedPart = null;
-                        this.tooltipInfoTimer.Reset();
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildOverlay->OnDraw");
-            }
-        }
-
-        private void Window(int windowId)
-        {
-            try
-            {
-                GUILayout.BeginHorizontal();
-
-                // Titles
-                GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset));
-                GUILayout.Label("Parts:", this.titleStyle);
-                GUILayout.Label("Delta-V:", this.titleStyle);
-                GUILayout.Label("TWR:", this.titleStyle);
-                GUILayout.EndVertical();
-
-                // Details
-                GUILayout.BeginVertical(GUILayout.Width(100.0f * GuiDisplaySize.Offset));
-                GUILayout.Label(this.lastStage.partCount.ToString("N0"), this.infoStyle);
-                GUILayout.Label(this.lastStage.totalDeltaV.ToString("N0") + " m/s", this.infoStyle);
-                GUILayout.Label(this.lastStage.thrustToWeight.ToString("F2"), this.infoStyle);
-                GUILayout.EndVertical();
-
-                GUILayout.EndHorizontal();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildOverlay->Window");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the tooltip details of the selected/highlighted part.
-        /// </summary>
-        private void DrawTooltip(Part part)
-        {
-            try
-            {
-                // Tooltip title (name of part).
-                var content = new GUIContent(part.partInfo.title);
-                var size = this.tooltipTitleStyle.CalcSize(content);
-                var position = new Rect(Event.current.mousePosition.x + 16.0f, Event.current.mousePosition.y, size.x, size.y).ClampInsideScreen();
-
-                if (position.x < Event.current.mousePosition.x + 16.0f)
-                {
-                    position.y += 16.0f;
-                }
-                GUI.Label(position, content, this.tooltipTitleStyle);
-
-                // After hovering for a period of time, show extended information.
-                if (this.tooltipInfoTimer.Elapsed.TotalSeconds >= this.tooltipInfoDelay)
-                {
-                    // Stop the timer as it is no longer needed.
-                    if (this.tooltipInfoTimer.IsRunning)
-                    {
-                        this.tooltipInfoTimer.Stop();
-                    }
-
-                    // Show the dry mass of the part if applicable.
-                    if (part.physicalSignificance == Part.PhysicalSignificance.FULL)
-                    {
-                        this.DrawTooltipInfo(ref position, "Dry Mass: " + part.GetDryMass().ToMass());
-                    }
-
-                    // Show resources contained within the part.
-                    if (part.ContainsResources())
-                    {
-                        // Show the wet mass of the part if applicable.
-                        if (part.GetResourceMass() > 0)
-                        {
-                            this.DrawTooltipInfo(ref position, "Wet Mass: " + part.GetWetMass().ToMass());
-                        }
-
-                        // List all the resources contained within the part.
-                        foreach (PartResource resource in part.Resources)
-                        {
-                            if (resource.GetDensity() > 0)
-                            {
-                                this.DrawTooltipInfo(ref position, resource.info.name + ": " + resource.GetMass().ToMass() + " (" + resource.amount + ")");
-                            }
-                            else
-                            {
-                                this.DrawTooltipInfo(ref position, resource.info.name + ": " + resource.amount);
-                            }
-                        }
-                    }
-
-                    // Show details for engines.
-                    if (part.IsEngine())
-                    {
-                        this.DrawTooltipInfo(ref position, "Maximum Thrust: " + part.GetMaxThrust().ToForce());
-                        this.DrawTooltipInfo(ref position, "Specific Impulse: " + part.GetSpecificImpulse(1f) + " / " + part.GetSpecificImpulse(0f) + "s");
-
-                        // Thrust vectoring.
-                        if (part.HasModule("ModuleGimbal"))
-                        {
-                            this.DrawTooltipInfo(ref position, "Thrust Vectoring Enabled");
-                        }
-
-                        // Contains alternator.
-                        if (part.HasModule("ModuleAlternator"))
-                        {
-                            this.DrawTooltipInfo(ref position, "Contains Alternator");
-                        }
-                    }
-
-                    // Show details for RCS.
-                    if (part.IsRcsModule())
-                    {
-                        var moduleRcs = part.GetModuleRcs();
-                        this.DrawTooltipInfo(ref position, "Thrust Power: " + moduleRcs.thrusterPower.ToDouble().ToForce());
-                        this.DrawTooltipInfo(ref position, "Specific Impulse: " + moduleRcs.atmosphereCurve.Evaluate(1f) + " / " + moduleRcs.atmosphereCurve.Evaluate(0f) + "s");
-                    }
-
-                    // Show details for solar panels.
-                    if (part.IsSolarPanel())
-                    {
-                        this.DrawTooltipInfo(ref position, "Charge Rate: " + part.GetModuleDeployableSolarPanel().chargeRate.ToDouble().ToRate());
-                    }
-
-                    // Show details for generators.
-                    if (part.IsGenerator())
-                    {
-                        foreach (var resource in part.GetModuleGenerator().inputList)
-                        {
-                            this.DrawTooltipInfo(ref position, "Input: " + resource.name + " (" + resource.rate.ToDouble().ToRate() + ")");
-                        }
-
-                        foreach (var resource in part.GetModuleGenerator().outputList)
-                        {
-                            this.DrawTooltipInfo(ref position, "Output: " + resource.name + " (" + resource.rate.ToDouble().ToRate() + ")");
-                        }
-                    }
-
-                    // Show details for parachutes.
-                    if (part.IsParachute())
-                    {
-                        var module = part.GetModuleParachute();
-                        this.DrawTooltipInfo(ref position, "Semi Deployed Drag: " + module.semiDeployedDrag);
-                        this.DrawTooltipInfo(ref position, "Fully Deployed Drag: " + module.fullyDeployedDrag);
-                        this.DrawTooltipInfo(ref position, "Deployment Altitude: " + module.deployAltitude.ToDouble().ToDistance());
-                    }
-
-                    // Contains stability augmentation system.
-                    if (part.HasModule("ModuleSAS"))
-                    {
-                        this.DrawTooltipInfo(ref position, "Contains SAS");
-                    }
-
-                    // Contains reaction wheels.
-                    if (part.HasModule("ModuleReactionWheel"))
-                    {
-                        this.DrawTooltipInfo(ref position, "Contains Reaction Wheels");
-                    }
-
-                    // Show if the part has an animation that can only be used once.
-                    if (part.HasOneShotAnimation())
-                    {
-                        this.DrawTooltipInfo(ref position, "Single Activation Only");
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildOverlay->DrawTooltip");
-            }
-        }
-
-        /// <summary>
-        ///     Draws a line of extended information below the previous.
-        /// </summary>
-        private void DrawTooltipInfo(ref Rect position, string value)
-        {
-            try
-            {
-                var content = new GUIContent(value);
-                var size = this.tooltipInfoStyle.CalcSize(content);
-
-                position.y += 16.0f * GuiDisplaySize.Offset;
-                position.width = size.x;
-                position.height = size.y;
-                GUI.Label(position, content, this.tooltipInfoStyle);
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildOverlay->DrawTooltipInfo");
-            }
-        }
-
-        #endregion
-
-        #region Save and Load
-
-        /// <summary>
-        ///     Saves the settings when this object is destroyed.
-        /// </summary>
-        private void OnDestroy()
-        {
-            try
-            {
-                var handler = new SettingHandler();
-                handler.Set("visible", this.visible);
-                handler.Set("tooltipInfoDelay", this.tooltipInfoDelay);
-                handler.Save("BuildOverlay.xml");
-                GuiDisplaySize.OnSizeChanged -= this.OnSizeChanged;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildOverlay->OnDestroy");
-            }
-        }
-
-        /// <summary>
-        ///     Loads the settings when this object is created.
-        /// </summary>
-        private void Load()
-        {
-            try
-            {
-                var handler = SettingHandler.Load("BuildOverlay.xml");
-                handler.Get("visible", ref this.visible);
-                handler.Get("tooltipInfoDelay", ref this.tooltipInfoDelay);
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "BuildOverlay->Load");
+                Logger.Exception(ex);
             }
         }
 

--- /dev/null
+++ b/KerbalEngineer/Editor/BuildOverlayPartInfo.cs
@@ -1,1 +1,453 @@
-
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
+
+#region Using Directives
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using KerbalEngineer.Extensions;
+using KerbalEngineer.Helpers;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Editor
+{
+    public class BuildOverlayPartInfo : MonoBehaviour
+    {
+        #region Fields
+
+        private static bool clickToOpen = true;
+        private static bool namesOnly;
+        private static bool visible = true;
+
+        private readonly List<PartInfoItem> infoItems = new List<PartInfoItem>();
+
+        private Rect position;
+        private Part selectedPart;
+        private bool showInfo;
+        private bool skipFrame;
+
+        #endregion
+
+        #region Properties
+
+        public static bool ClickToOpen
+        {
+            get { return clickToOpen; }
+            set { clickToOpen = value; }
+        }
+
+        public static bool Hidden { get; set; }
+
+        public static bool NamesOnly
+        {
+            get { return namesOnly; }
+            set { namesOnly = value; }
+        }
+
+        public static bool Visible
+        {
+            get { return visible; }
+            set { visible = value; }
+        }
+
+        #endregion
+
+        #region Methods: protected
+
+        protected void OnGUI()
+        {
+            try
+            {
+                if (!Visible || Hidden || this.selectedPart == null)
+                {
+                    return;
+                }
+
+                this.position = GUILayout.Window(this.GetInstanceID(), this.position, this.Window, String.Empty, BuildOverlay.WindowStyle);
+            }
+            catch (Exception ex)
+
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Update()
+        {
+            try
+            {
+                if (!Visible || Hidden || EditorLogic.RootPart == null || EditorLogic.fetch.editorScreen != EditorScreen.Parts)
+                {
+                    return;
+                }
+
+                this.position.x = Mathf.Clamp(Input.mousePosition.x + 16.0f, 0.0f, Screen.width - this.position.width);
+                this.position.y = Mathf.Clamp(Screen.height - Input.mousePosition.y, 0.0f, Screen.height - this.position.height);
+                if (this.position.x < Input.mousePosition.x + 20.0f)
+                {
+                    this.position.y = Mathf.Clamp(this.position.y + 20.0f, 0.0f, Screen.height - this.position.height);
+                }
+                if (this.position.x < Input.mousePosition.x + 16.0f && this.position.y < Screen.height - Input.mousePosition.y)
+                {
+                    this.position.x = Input.mousePosition.x - 3 - this.position.width;
+                }
+
+                this.infoItems.Clear();
+                var part = EditorLogic.fetch.ship.parts.Find(p => p.stackIcon.highlightIcon) ?? EditorLogic.SelectedPart;
+                if (part != null)
+                {
+                    if (!part.Equals(this.selectedPart))
+                    {
+                        this.selectedPart = part;
+                        this.ResetInfo();
+                    }
+                    if (NamesOnly || this.skipFrame)
+                    {
+                        this.skipFrame = false;
+                        return;
+                    }
+
+                    this.SetCostInfo();
+                    this.SetMassItems();
+                    this.SetResourceItems();
+                    this.SetEngineInfo();
+                    this.SetAlternatorInfo();
+                    this.SetGimbalInfo();
+                    this.SetRcsInfo();
+                    this.SetParachuteInfo();
+                    this.SetSasInfo();
+                    this.SetReactionWheelInfo();
+                    this.SetSolarPanelInfo();
+                    this.SetGeneratorInfo();
+                    this.SetDecouplerInfo();
+                    this.SetTransmitterInfo();
+                    this.SetScienceExperimentInfo();
+                    this.SetScienceContainerInfo();
+                    this.SetSingleActivationInfo();
+
+                    if (!this.showInfo && Input.GetMouseButtonDown(2))
+                    {
+                        this.showInfo = true;
+                    }
+                    else if (ClickToOpen && this.showInfo && Input.GetMouseButtonDown(2))
+                    {
+                        this.ResetInfo();
+                    }
+                }
+                else
+                {
+                    this.selectedPart = null;
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Methods: private
+
+        private void ResetInfo()
+        {
+            this.showInfo = !clickToOpen;
+            this.skipFrame = true;
+            this.position.width = namesOnly || clickToOpen ? 0.0f : 200.0f;
+            this.position.height = 0.0f;
+        }
+
+        private void SetAlternatorInfo()
+        {
+            if (!this.selectedPart.HasModule<ModuleAlternator>())
+            {
+                return;
+            }
+
+            var alternator = this.selectedPart.GetModule<ModuleAlternator>();
+            this.infoItems.Add(new PartInfoItem("Alternator"));
+            foreach (var resource in alternator.outputResources)
+            {
+                this.infoItems.Add(new PartInfoItem("\t" + resource.name, resource.rate.ToRate()));
+            }
+        }
+
+        private void SetCostInfo()
+        {
+            this.infoItems.Add(new PartInfoItem("Cost", Units.ConcatF(this.selectedPart.GetCostDry(), this.selectedPart.GetCostWet())));
+        }
+
+        private void SetDecouplerInfo()
+        {
+            if (!this.selectedPart.IsDecoupler())
+            {
+                return;
+            }
+
+            var decoupler = this.selectedPart.GetProtoModuleDecoupler();
+            this.infoItems.Add(new PartInfoItem("Ejection Force", decoupler.EjectionForce.ToForce()));
+            if (decoupler.IsOmniDecoupler)
+            {
+                this.infoItems.Add(new PartInfoItem("Omni-directional"));
+            }
+        }
+
+        private void SetEngineInfo()
+        {
+            if (!this.selectedPart.IsEngine())
+            {
+                return;
+            }
+
+            var engine = this.selectedPart.GetProtoModuleEngine();
+            this.infoItems.Add(new PartInfoItem("Thrust", Units.ToForce(engine.MinimumThrust, engine.MaximumThrust)));
+            this.infoItems.Add(new PartInfoItem("Isp", Units.ConcatF(engine.GetSpecificImpulse(1.0f), engine.GetSpecificImpulse(0.0f)) + "s"));
+            if (engine.Propellants.Count > 0)
+            {
+                this.infoItems.Add(new PartInfoItem("Propellants"));
+                var totalRatio = engine.Propellants.Sum(p => p.ratio);
+                foreach (var propellant in engine.Propellants)
+                {
+                    this.infoItems.Add(new PartInfoItem("\t" + propellant.name, (propellant.ratio / totalRatio).ToPercent()));
+                }
+            }
+        }
+
+        private void SetGeneratorInfo()
+        {
+            if (!this.selectedPart.HasModule<ModuleGenerator>())
+            {
+                return;
+            }
+
+            var generator = this.selectedPart.GetModule<ModuleGenerator>();
+            if (generator.inputList.Count > 0)
+            {
+                this.infoItems.Add(new PartInfoItem("Generator Input"));
+                foreach (var resource in generator.inputList)
+                {
+                    this.infoItems.Add(new PartInfoItem("\t" + resource.name, resource.rate.ToRate()));
+                }
+            }
+            if (generator.outputList.Count > 0)
+            {
+                this.infoItems.Add(new PartInfoItem("Generator Output"));
+                foreach (var resource in generator.outputList)
+                {
+                    this.infoItems.Add(new PartInfoItem("\t" + resource.name, resource.rate.ToRate()));
+                }
+            }
+            if (generator.isAlwaysActive)
+            {
+                this.infoItems.Add(new PartInfoItem("Generator is Always Active"));
+            }
+        }
+
+        private void SetGimbalInfo()
+        {
+            if (!this.selectedPart.HasModule<ModuleGimbal>())
+            {
+                return;
+            }
+
+            var gimbal = this.selectedPart.GetModule<ModuleGimbal>();
+            this.infoItems.Add(new PartInfoItem("Thrust Vectoring", gimbal.gimbalRange.ToString("F2")));
+        }
+
+        private void SetMassItems()
+        {
+            if (this.selectedPart.physicalSignificance == Part.PhysicalSignificance.FULL)
+            {
+                this.infoItems.Add(new PartInfoItem("Mass", Units.ToMass(this.selectedPart.GetDryMass(), this.selectedPart.GetWetMass())));
+            }
+        }
+
+        private void SetParachuteInfo()
+        {
+            if (!this.selectedPart.HasModule<ModuleParachute>())
+            {
+                return;
+            }
+
+            var parachute = this.selectedPart.GetModule<ModuleParachute>();
+            this.infoItems.Add(new PartInfoItem("Deployed Drag", Units.ConcatF(parachute.semiDeployedDrag, parachute.fullyDeployedDrag)));
+            this.infoItems.Add(new PartInfoItem("Deployment Altitude", parachute.deployAltitude.ToDistance()));
+            this.infoItems.Add(new PartInfoItem("Deployment Pressure", parachute.minAirPressureToOpen.ToString("F2")));
+        }
+
+        private void SetRcsInfo()
+        {
+            if (!this.selectedPart.HasModule<ModuleRCS>())
+            {
+                return;
+            }
+
+            var rcs = this.selectedPart.GetModule<ModuleRCS>();
+            this.infoItems.Add(new PartInfoItem("Thruster Power", rcs.thrusterPower.ToForce()));
+            this.infoItems.Add(new PartInfoItem("Specific Impulse", Units.ConcatF(rcs.atmosphereCurve.Evaluate(1.0f), rcs.atmosphereCurve.Evaluate(0.0f)) + "s"));
+        }
+
+        private void SetReactionWheelInfo()
+        {
+            if (!this.selectedPart.HasModule<ModuleReactionWheel>())
+            {
+                return;
+            }
+
+            var reactionWheel = this.selectedPart.GetModule<ModuleReactionWheel>();
+            this.infoItems.Add(new PartInfoItem("Reaction Wheel Torque"));
+            this.infoItems.Add(new PartInfoItem("\tPitch", reactionWheel.PitchTorque.ToTorque()));
+            this.infoItems.Add(new PartInfoItem("\tRoll", reactionWheel.RollTorque.ToTorque()));
+            this.infoItems.Add(new PartInfoItem("\tYaw", reactionWheel.YawTorque.ToTorque()));
+            foreach (var resource in reactionWheel.inputResources)
+            {
+                this.infoItems.Add(new PartInfoItem("\t" + resource.name, resource.rate.ToRate()));
+            }
+        }
+
+        private void SetResourceItems()
+        {
+            if (this.selectedPart.Resources.list.Any(r => !r.hideFlow))
+            {
+                this.infoItems.Add(new PartInfoItem("Resources"));
+                foreach (var resource in this.selectedPart.Resources.list.Where(r => !r.hideFlow))
+                {
+                    this.infoItems.Add(resource.GetDensity() > 0
+                        ? new PartInfoItem("\t" + resource.info.name, "(" + resource.GetMass().ToMass() + ") " + resource.amount.ToString("F1"))
+                        : new PartInfoItem("\t" + resource.info.name, resource.amount.ToString("F1")));
+                }
+            }
+        }
+
+        private void SetSasInfo()
+        {
+            if (this.selectedPart.HasModule<ModuleSAS>())
+            {
+                this.infoItems.Add(new PartInfoItem("SAS Equiped"));
+            }
+        }
+
+        private void SetScienceContainerInfo()
+        {
+            if (this.selectedPart.HasModule<ModuleScienceContainer>())
+            {
+                this.infoItems.Add(new PartInfoItem("Science Container"));
+            }
+        }
+
+        private void SetScienceExperimentInfo()
+        {
+            if (!this.selectedPart.HasModule<ModuleScienceExperiment>())
+            {
+                return;
+            }
+
+            var experiment = this.selectedPart.GetModule<ModuleScienceExperiment>();
+            this.infoItems.Add(new PartInfoItem("Science Experiment", experiment.experimentActionName));
+            this.infoItems.Add(new PartInfoItem("\tTransmit Efficiency", experiment.xmitDataScalar.ToPercent()));
+            if (!experiment.rerunnable)
+            {
+                this.infoItems.Add(new PartInfoItem("\tSingle Usage"));
+            }
+        }
+
+        private void SetSingleActivationInfo()
+        {
+            if (this.selectedPart.HasModule<ModuleAnimateGeneric>(m => m.isOneShot))
+            {
+                this.infoItems.Add(new PartInfoItem("Single Activation"));
+            }
+        }
+
+        private void SetSolarPanelInfo()
+        {
+            if (!this.selectedPart.HasModule<ModuleDeployableSolarPanel>())
+            {
+                return;
+            }
+
+            var solarPanel = this.selectedPart.GetModule<ModuleDeployableSolarPanel>();
+            this.infoItems.Add(new PartInfoItem("Charge Rate", solarPanel.chargeRate.ToRate()));
+            if (solarPanel.isBreakable)
+            {
+                this.infoItems.Add(new PartInfoItem("Breakable"));
+            }
+            if (solarPanel.sunTracking)
+            {
+                this.infoItems.Add(new PartInfoItem("Sun Tracking"));
+            }
+        }
+
+        private void SetTransmitterInfo()
+        {
+            if (!this.selectedPart.HasModule<ModuleDataTransmitter>())
+            {
+                return;
+            }
+
+            var transmitter = this.selectedPart.GetModule<ModuleDataTransmitter>();
+            this.infoItems.Add(new PartInfoItem("Packet Size", transmitter.packetSize.ToString("F2") + " Mits"));
+            this.infoItems.Add(new PartInfoItem("Bandwidth", (transmitter.packetInterval * transmitter.packetSize).ToString("F2") + "Mits/sec"));
+            this.infoItems.Add(new PartInfoItem(transmitter.requiredResource, transmitter.packetResourceCost.ToString("F2") + "/Packet"));
+        }
+
+        private void Window(int windowId)
+        {
+            try
+            {
+                GUILayout.Label(this.selectedPart.partInfo.title, BuildOverlay.TitleStyle);
+                if (this.showInfo)
+                {
+                    foreach (var item in this.infoItems)
+                    {
+                        GUILayout.Space(2.0f);
+                        GUILayout.BeginHorizontal();
+                        if (item.Value != null)
+                        {
+                            GUILayout.Label(item.Name + ":", BuildOverlay.NameStyle);
+                            GUILayout.Space(25.0f);
+                            GUILayout.Label(item.Value, BuildOverlay.ValueStyle);
+                        }
+                        else
+                        {
+                            GUILayout.Label(item.Name, BuildOverlay.NameStyle);
+                        }
+                        GUILayout.EndHorizontal();
+                    }
+                }
+                else if (this.infoItems.Count > 0)
+                {
+                    GUILayout.Space(2.0f);
+                    GUILayout.Label("Click middle mouse to show more info...", BuildOverlay.NameStyle);
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Editor/BuildOverlayResources.cs
@@ -1,1 +1,203 @@
-
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
+
+#region Using Directives
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using KerbalEngineer.Extensions;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Editor
+{
+    public class BuildOverlayResources : MonoBehaviour
+    {
+        #region Fields
+
+        private static bool visible = true;
+
+        private readonly Dictionary<int, ResourceInfoItem> resources = new Dictionary<int, ResourceInfoItem>();
+
+        private bool open = true;
+        private float openPercent;
+        private GUIContent tabContent;
+        private Rect tabPosition;
+        private Vector2 tabSize;
+        private Rect windowPosition = new Rect(0.0f, 0.0f, BuildOverlay.MinimumWidth, 0.0f);
+
+        #endregion
+
+        #region Properties
+
+        public static bool Visible
+        {
+            get { return visible; }
+            set { visible = value; }
+        }
+
+        public bool Open
+        {
+            get { return this.open; }
+            set { this.open = value; }
+        }
+
+        #endregion
+
+        #region Methods: protected
+
+        protected void OnGUI()
+        {
+            try
+            {
+                if (!Visible || this.resources.Count == 0 || EditorLogic.fetch.editorScreen != EditorScreen.Parts)
+                {
+                    return;
+                }
+
+                this.open = GUI.Toggle(this.tabPosition, this.open, this.tabContent, BuildOverlay.TabStyle);
+                if (this.openPercent > 0.0)
+                {
+                    this.windowPosition = GUILayout.Window(this.GetInstanceID(), this.windowPosition, this.Window, String.Empty, BuildOverlay.WindowStyle);
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Start()
+        {
+            try
+            {
+                this.tabContent = new GUIContent("RESOURCES");
+                this.tabSize = BuildOverlay.TabStyle.CalcSize(this.tabContent);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Update()
+        {
+            try
+            {
+                if (!Visible)
+                {
+                    return;
+                }
+
+                this.SetResources();
+                this.SetSlidePosition();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Methods: private
+
+        private void SetResources()
+        {
+            var previousCount = this.resources.Count;
+            this.resources.Clear();
+            foreach (var resource in EditorLogic.fetch.ship.parts.SelectMany(p => p.Resources.list).Where(r => r.amount > 0.0))
+            {
+                if (this.resources.ContainsKey(resource.info.id))
+                {
+                    this.resources[resource.info.id].Amount += resource.amount;
+                }
+                else
+                {
+                    this.resources.Add(resource.info.id, new ResourceInfoItem(resource));
+                }
+            }
+
+            if (this.resources.Count < previousCount)
+            {
+                this.windowPosition.height = 0;
+            }
+        }
+
+        private void SetSlidePosition()
+        {
+            if (this.open && this.openPercent < 1.0f)
+            {
+                this.openPercent = Mathf.Clamp(this.openPercent + Time.deltaTime * BuildOverlay.TabSpeed, 0.0f, 1.0f);
+            }
+            else if (!this.open && this.openPercent > 0.0f)
+            {
+                this.openPercent = Mathf.Clamp(this.openPercent - Time.deltaTime * BuildOverlay.TabSpeed, 0.0f, 1.0f);
+            }
+
+            this.windowPosition.x = BuildOverlay.BuildOverlayVessel.WindowPosition.xMax + 5.0f;
+            this.windowPosition.y = Mathf.Lerp(Screen.height, Screen.height - this.windowPosition.height, this.openPercent);
+            this.tabPosition.width = this.tabSize.x;
+            this.tabPosition.height = this.tabSize.y;
+            this.tabPosition.x = this.windowPosition.x;
+            this.tabPosition.y = this.windowPosition.y - this.tabPosition.height;
+        }
+
+        private void Window(int windowId)
+        {
+            try
+            {
+                var firstItem = true;
+                foreach (var resource in this.resources)
+                {
+                    if (!firstItem)
+                    {
+                        GUILayout.Space(2.0f);
+                    }
+                    firstItem = false;
+
+                    GUILayout.BeginHorizontal();
+
+                    GUILayout.Label(resource.Value.Name + ":", BuildOverlay.NameStyle);
+                    GUILayout.Space(50.0f);
+                    if (resource.Value.Mass > 0.0)
+                    {
+                        GUILayout.Label("(" + resource.Value.Mass.ToMass() + ") " + resource.Value.Amount.ToString("N1"), BuildOverlay.ValueStyle);
+                    }
+                    else
+                    {
+                        GUILayout.Label(resource.Value.Amount.ToString("N1"), BuildOverlay.ValueStyle);
+                    }
+
+                    GUILayout.EndHorizontal();
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Editor/BuildOverlayVessel.cs
@@ -1,1 +1,246 @@
-
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
+
+#region Using Directives
+
+#endregion
+
+namespace KerbalEngineer.Editor
+{
+    #region Using Directives
+
+    using System;
+    using System.Collections.Generic;
+    using Helpers;
+    using UnityEngine;
+    using VesselSimulator;
+
+    #endregion
+
+    public class BuildOverlayVessel : MonoBehaviour
+    {
+        #region Constants
+
+        private const float Width = 175.0f;
+
+        #endregion
+
+        #region Fields
+
+        private static bool visible = true;
+
+        private readonly List<PartInfoItem> infoItems = new List<PartInfoItem>();
+
+        private Stage lastStage;
+        private bool open = true;
+        private float openPercent;
+        private GUIContent tabContent;
+        private Rect tabPosition;
+        private Vector2 tabSize;
+        private Rect windowPosition = new Rect(330.0f, 0.0f, Width, 0.0f);
+
+        #endregion
+
+        #region Properties
+
+        public static bool Visible
+        {
+            get { return visible; }
+            set { visible = value; }
+        }
+
+        public bool Open
+        {
+            get { return this.open; }
+            set { this.open = value; }
+        }
+
+        public Rect WindowPosition
+        {
+            get { return this.windowPosition; }
+        }
+
+        public float WindowX
+        {
+            get { return this.windowPosition.x; }
+            set { this.windowPosition.x = value; }
+        }
+
+        #endregion
+
+        #region Methods
+
+        protected void Awake()
+        {
+            try
+            {
+                SimManager.OnReady -= this.GetStageInfo;
+                SimManager.OnReady += this.GetStageInfo;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void OnGUI()
+        {
+            try
+            {
+                if (!Visible || EditorLogic.RootPart == null || EditorLogic.fetch.editorScreen != EditorScreen.Parts)
+                {
+                    return;
+                }
+
+                this.open = GUI.Toggle(this.tabPosition, this.open, this.tabContent, BuildOverlay.TabStyle);
+                if (this.openPercent > 0.0)
+                {
+                    this.windowPosition = GUILayout.Window(this.GetInstanceID(), this.windowPosition, this.VesselWindow, String.Empty, BuildOverlay.WindowStyle);
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Start()
+        {
+            try
+            {
+                this.tabContent = new GUIContent("VESSEL");
+                this.tabSize = BuildOverlay.TabStyle.CalcSize(this.tabContent);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Update()
+        {
+            try
+            {
+                if (!Visible || EditorLogic.RootPart == null)
+                {
+                    return;
+                }
+
+                if (this.openPercent > 0.0)
+                {
+                    this.SetVesselInfo();
+                }
+
+                this.SetSlidePosition();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        private void GetStageInfo()
+        {
+            this.lastStage = SimManager.LastStage;
+        }
+
+        private void SetSlidePosition()
+        {
+            if (this.open && this.openPercent < 1.0f)
+            {
+                this.openPercent = Mathf.Clamp(this.openPercent + Time.deltaTime * BuildOverlay.TabSpeed, 0.0f, 1.0f);
+            }
+            else if (!this.open && this.openPercent > 0.0f)
+            {
+                this.openPercent = Mathf.Clamp(this.openPercent - Time.deltaTime * BuildOverlay.TabSpeed, 0.0f, 1.0f);
+            }
+
+            this.windowPosition.y = Mathf.Lerp(Screen.height, Screen.height - this.windowPosition.height, this.openPercent);
+            if (this.windowPosition.width < Width)
+            {
+                this.windowPosition.width = Width;
+            }
+            this.tabPosition.width = this.tabSize.x;
+            this.tabPosition.height = this.tabSize.y;
+            this.tabPosition.x = this.windowPosition.x;
+            this.tabPosition.y = this.windowPosition.y - this.tabPosition.height;
+        }
+
+        private void SetVesselInfo()
+        {
+            SimManager.Gravity = CelestialBodies.SelectedBody.Gravity;
+
+            if (BuildAdvanced.Instance.ShowAtmosphericDetails)
+            {
+                SimManager.Atmosphere = CelestialBodies.SelectedBody.Atmosphere * 0.01;
+            }
+            else
+            {
+                SimManager.Atmosphere = 0.0;
+            }
+
+            SimManager.RequestSimulation();
+            SimManager.TryStartSimulation();
+
+            if (this.lastStage != null)
+            {
+                this.infoItems.Clear();
+                this.infoItems.Add(new PartInfoItem("Delta-V", this.lastStage.deltaV.ToString("N0") + " / " + this.lastStage.totalDeltaV.ToString("N0") + "m/s"));
+                this.infoItems.Add(new PartInfoItem("Mass", Units.ToMass(this.lastStage.mass, this.lastStage.totalMass)));
+                this.infoItems.Add(new PartInfoItem("TWR", this.lastStage.thrustToWeight.ToString("F2") + " (" + this.lastStage.maxThrustToWeight.ToString("F2") + ")"));
+                this.infoItems.Add(new PartInfoItem("Parts", this.lastStage.partCount + " / " + this.lastStage.totalPartCount));
+            }
+        }
+
+        private void VesselWindow(int windowId)
+        {
+            try
+            {
+                var firstItem = true;
+                foreach (var item in this.infoItems)
+                {
+                    if (!firstItem)
+                    {
+                        GUILayout.Space(2.0f);
+                    }
+                    firstItem = false;
+
+                    GUILayout.BeginHorizontal();
+                    if (item.Value != null)
+                    {
+                        GUILayout.Label(item.Name + ":", BuildOverlay.NameStyle);
+                        GUILayout.FlexibleSpace();
+                        GUILayout.Label(item.Value, BuildOverlay.ValueStyle);
+                    }
+                    else
+                    {
+                        GUILayout.Label(item.Name, BuildOverlay.NameStyle);
+                    }
+                    GUILayout.EndHorizontal();
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Editor/BuildToolbar.cs
+++ b/KerbalEngineer/Editor/BuildToolbar.cs
@@ -20,7 +20,6 @@
 #region Using Directives
 
 using System;
-using System.IO;
 
 using UnityEngine;
 
@@ -31,12 +30,28 @@
     [KSPAddon(KSPAddon.Startup.EditorAny, false)]
     public class BuildToolbar : MonoBehaviour
     {
+        #region Fields
+
         private ApplicationLauncherButton button;
+
+        #endregion
+
+        #region Methods: private
 
         private void Awake()
         {
             GameEvents.onGUIApplicationLauncherReady.Add(this.OnGuiAppLauncherReady);
             Logger.Log("BuildToolbar->Awake");
+        }
+
+        private void OnDestroy()
+        {
+            GameEvents.onGUIApplicationLauncherReady.Remove(this.OnGuiAppLauncherReady);
+            if (this.button != null)
+            {
+                ApplicationLauncher.Instance.RemoveModApplication(this.button);
+            }
+            Logger.Log("BuildToolbar->OnDestroy");
         }
 
         private void OnGuiAppLauncherReady()
@@ -92,14 +107,6 @@
             }
         }
 
-        private void OnDestroy()
-        {
-            GameEvents.onGUIApplicationLauncherReady.Remove(this.OnGuiAppLauncherReady);
-            if (this.button != null)
-            {
-                ApplicationLauncher.Instance.RemoveModApplication(this.button);
-            }
-            Logger.Log("BuildToolbar->OnDestroy");
-        }
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Editor/PartInfoItem.cs
@@ -1,1 +1,47 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+namespace KerbalEngineer.Editor
+{
+    public class PartInfoItem
+    {
+        #region Constructors
+
+        public PartInfoItem(string name)
+        {
+            this.Name = name;
+        }
+
+        public PartInfoItem(string name, string value)
+        {
+            this.Name = name;
+            this.Value = value;
+        }
+
+        #endregion
+
+        #region Properties
+
+        public string Name { get; set; }
+
+        public string Value { get; set; }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Editor/ResourceInfoItem.cs
@@ -1,1 +1,56 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+#region Using Directives
+
+using KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Editor
+{
+    public class ResourceInfoItem
+    {
+        #region Constructors
+
+        public ResourceInfoItem(PartResource resource)
+        {
+            this.Definition = resource.GetDefinition();
+            this.Name = this.Definition.name;
+            this.Amount = resource.amount;
+        }
+
+        #endregion
+
+        #region Properties
+
+        public double Amount { get; set; }
+
+        public PartResourceDefinition Definition { get; set; }
+
+        public double Mass
+        {
+            get { return this.Amount * this.Definition.density; }
+        }
+
+        public string Name { get; set; }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/EngineerGlobals.cs
+++ b/KerbalEngineer/EngineerGlobals.cs
@@ -33,7 +33,7 @@
         /// <summary>
         ///     Current version of the Kerbal Engineer assembly.
         /// </summary>
-        public const string AssemblyVersion = "1.0.7";
+        public const string AssemblyVersion = "1.0.14.1";
 
         #endregion
 

--- a/KerbalEngineer/Extensions/DoubleExtensions.cs
+++ b/KerbalEngineer/Extensions/DoubleExtensions.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using System;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -29,192 +29,54 @@
     {
         #region Methods: public
 
-        public static double ClampTo(this double value, double min, double max)
+        public static double Clamp(this double value, double lower, double higher)
         {
-            while (value < min)
-            {
-                value += max;
-            }
-
-            while (value > max)
-            {
-                value -= max;
-            }
-
-            return value;
+            return value < lower ? lower : value > higher ? higher : value;
         }
 
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as acceleration.
-        /// </summary>
-        public static string ToAcceleration(this double value, bool showNotation = true)
+        public static string ToAcceleration(this double value)
         {
-            try
-            {
-                return showNotation ? value.ToString("N2") + "m/s²" : value.ToString("N2");
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-                return "ERR";
-            }
+            return Units.ToAcceleration(value);
         }
 
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as an angle.
-        /// </summary>
-        public static string ToAngle(this double value, string format = "F3")
+        public static string ToAngle(this double value)
         {
-            try
-            {
-                return value.ToString(format) + "°";
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToAngle");
-                return "ERR";
-            }
+            return Units.ToAngle(value);
         }
 
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as a distance.
-        /// </summary>
-        public static string ToDistance(this double value, string format = "N1")
+        public static string ToDistance(this double value)
         {
-            try
-            {
-                var negative = value < 0;
-
-                if (negative)
-                {
-                    value = -value;
-                }
-
-                if (value < 1000000.0f)
-                {
-                    if (value < 1.0f)
-                    {
-                        value *= 1000.0f;
-
-                        if (negative)
-                        {
-                            value = -value;
-                        }
-                        return value.ToString(format) + "mm";
-                    }
-
-                    if (negative)
-                    {
-                        value = -value;
-                    }
-                    return value.ToString(format) + "m";
-                }
-
-                value /= 1000.0f;
-                if (value >= 1000000.0f)
-                {
-                    value /= 1000.0f;
-
-                    if (negative)
-                    {
-                        value = -value;
-                    }
-                    return value.ToString(format) + "Mm";
-                }
-
-                if (negative)
-                {
-                    value = -value;
-                }
-                return value.ToString(format) + "km";
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToDistance");
-                return "ERR";
-            }
+            return Units.ToDistance(value);
         }
 
-        /// <summary>
-        ///     Convert to a single precision floating point number.
-        /// </summary>
-        public static float ToFloat(this double value)
+        public static string ToTorque(this double value)
         {
-            try
-            {
-                return (float)value;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToFloat");
-                return 0;
-            }
+            return Units.ToTorque(value);
         }
 
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as a force.
-        /// </summary>
-        public static string ToForce(this double value, bool showNotation = true)
+        public static string ToForce(this double value)
         {
-            try
-            {
-                var format = (value < 100000) ? (value < 10000) ? (value < 100) ? "N3" : "N2" : "N1" : "N0";
-                return showNotation ? value.ToString(format) + "kN" : value.ToString(format);
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToForce");
-                return "ERR";
-            }
+            return Units.ToForce(value);
         }
 
-        /// <summary>
-        ///     Convert to a ReadoutCategory formatted as a mass.
-        /// </summary>
-        public static string ToMass(this double value, bool showNotation = true)
+        public static string ToMass(this double value)
         {
-            try
-            {
-                value *= 1000;
-                return showNotation ? value.ToString("N0") + "kg" : value.ToString("N0");
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToMass");
-                return "ERR";
-            }
+            return Units.ToMass(value);
         }
 
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as a rate.
-        /// </summary>
+        public static string ToPercent(this double value)
+        {
+            return Units.ToPercent(value);
+        }
+
         public static string ToRate(this double value)
         {
-            try
-            {
-                return value > 0 ? value.ToString("F1") + "/sec" : (60.0f * value).ToString("F1") + "/min";
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToRate");
-                return "ERR";
-            }
+            return Units.ToRate(value);
         }
 
-        /// <summary>
-        ///     Convert to ReadoutCategory formatted as a speed.
-        /// </summary>
-        public static string ToSpeed(this double value, bool showNotation = true)
+        public static string ToSpeed(this double value)
         {
-            try
-            {
-                return showNotation ? value.ToString("N2") + "m/s" : value.ToString("N2");
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DoubleExtentions->ToSpeed");
-                return "ERR";
-            }
+            return Units.ToSpeed(value);
         }
 
         #endregion

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

--- a/KerbalEngineer/Extensions/OrbitExtensions.cs
+++ b/KerbalEngineer/Extensions/OrbitExtensions.cs
@@ -20,6 +20,8 @@
 #region Using Directives
 
 using System;
+
+using KerbalEngineer.Helpers;
 
 using UnityEngine;
 
@@ -49,37 +51,47 @@
 
         public static double GetAngleToPrograde(this Orbit orbit)
         {
-            if (orbit.referenceBody == CelestialBodies.SystemBody.CelestialBody)
-            {
-                return 0.0;
-            }
-
-            var angle = AngleBetweenVectors(orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime()),
-                                            Vector3d.Exclude(orbit.GetOrbitNormal(), orbit.referenceBody.orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime())));
-
-            angle = (angle + 90.0).ClampTo(0.0, 360.0);
-
-            return orbit.inclination <= 90.0 ? angle : 360.0 - angle;
+            return GetAngleToPrograde(orbit, Planetarium.GetUniversalTime());
         }
 
-        public static double GetAngleToRetrograde(this Orbit orbit)
+        public static double GetAngleToPrograde(this Orbit orbit, double universalTime)
         {
             if (orbit.referenceBody == CelestialBodies.SystemBody.CelestialBody)
             {
                 return 0.0;
             }
 
-            var angle = AngleBetweenVectors(orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime()),
-                                            Vector3d.Exclude(orbit.GetOrbitNormal(), orbit.referenceBody.orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime())));
+            var angle = AngleHelper.GetAngleBetweenVectors(orbit.getRelativePositionAtUT(universalTime),
+                                                           Vector3d.Exclude(orbit.GetOrbitNormal(), orbit.referenceBody.orbit.getRelativePositionAtUT(universalTime)));
 
-            angle = (angle - 90.0).ClampTo(0.0, 360.0);
+            angle = AngleHelper.Clamp360(angle - 90.0);
 
-            return orbit.inclination <= 90.0 ? angle : 360.0 - angle;
+            return orbit.inclination > 90.0 ? angle : 360.0 - angle;
         }
 
-        public static double GetAngleToTrueAnomaly(this Orbit orbit, double tA)
+        public static double GetAngleToRetrograde(this Orbit orbit)
         {
-            return (tA - orbit.trueAnomaly).ClampTo(0.0, 360.0);
+            return GetAngleToRetrograde(orbit, Planetarium.GetUniversalTime());
+        }
+
+        public static double GetAngleToRetrograde(this Orbit orbit, double universalTime)
+        {
+            if (orbit.referenceBody == CelestialBodies.SystemBody.CelestialBody)
+            {
+                return 0.0;
+            }
+
+            var angle = AngleHelper.GetAngleBetweenVectors(orbit.getRelativePositionAtUT(universalTime),
+                                                           Vector3d.Exclude(orbit.GetOrbitNormal(), orbit.referenceBody.orbit.getRelativePositionAtUT(universalTime)));
+
+            angle = AngleHelper.Clamp360(angle + 90.0);
+
+            return orbit.inclination > 90.0 ? angle : 360.0 - angle;
+        }
+
+        public static double GetAngleToTrueAnomaly(this Orbit orbit, double trueAnomaly)
+        {
+            return AngleHelper.Clamp360(trueAnomaly - orbit.trueAnomaly);
         }
 
         public static double GetAngleToVector(this Orbit orbit, Vector3d vector)
@@ -89,9 +101,8 @@
 
         public static double GetPhaseAngle(this Orbit orbit, Orbit target)
         {
-            return orbit.inclination <= 90.0
-                ? AngleBetweenVectors(orbit.pos, Vector3d.Exclude(orbit.GetOrbitNormal(), target.pos))
-                : AngleBetweenVectors(Vector3d.Exclude(orbit.GetOrbitNormal(), target.pos), orbit.pos);
+            var angle = AngleHelper.GetAngleBetweenVectors(Vector3d.Exclude(orbit.GetOrbitNormal(), target.pos), orbit.pos);
+            return (orbit.semiMajorAxis < target.semiMajorAxis) ? angle : angle - 360.0;
         }
 
         public static double GetRelativeInclination(this Orbit orbit, Orbit target)
@@ -109,9 +120,9 @@
             return GetTimeToTrueAnomaly(orbit, GetTrueAnomalyOfDescendingNode(orbit));
         }
 
-        public static double GetTimeToTrueAnomaly(this Orbit orbit, double tA)
+        public static double GetTimeToTrueAnomaly(this Orbit orbit, double trueAnomaly)
         {
-            var time = orbit.GetDTforTrueAnomaly(tA * Mathf.Deg2Rad, orbit.period);
+            var time = orbit.GetDTforTrueAnomaly(trueAnomaly * Mathf.Deg2Rad, orbit.period);
             return time < 0.0 ? time + orbit.period : time;
         }
 
@@ -136,22 +147,5 @@
         }
 
         #endregion
-
-        #region Methods: private
-
-        private static double AngleBetweenVectors(Vector3d vector1, Vector3d vector2)
-        {
-            var angle = Vector3d.Angle(vector1, vector2);
-            var rotated = QuaternionD.AngleAxis(90.0, Vector3d.forward) * vector1;
-
-            if (Vector3d.Angle(rotated, vector2) > 90.0)
-            {
-                angle = 360.0 - angle;
-            }
-
-            return angle;
-        }
-
-        #endregion
     }
 }

--- a/KerbalEngineer/Extensions/PartExtensions.cs
+++ b/KerbalEngineer/Extensions/PartExtensions.cs
@@ -27,30 +27,96 @@
 
 namespace KerbalEngineer.Extensions
 {
+    using CompoundParts;
+
     public static class PartExtensions
     {
-        /// <summary>
-        ///     Gets whether the part contains a PartModule.
-        /// </summary>
-        public static bool HasModule<T>(this Part part)
-        {
-            return part.Modules.OfType<T>().Any();
-        }
-
-        /// <summary>
-        ///     Gets whether the part contains a PartModule.
-        /// </summary>
-        public static bool HasModule(this Part part, string className)
-        {
-            return part.Modules.Contains(className);
-        }
-
-        /// <summary>
-        ///     Gets whether the part contains a PartModule.
-        /// </summary>
-        public static bool HasModule(this Part part, int moduleId)
-        {
-            return part.Modules.Contains(moduleId);
+        #region Methods: public
+
+        /// <summary>
+        ///     Gets whether the part contains a specific resource.
+        /// </summary>
+        public static bool ContainsResource(this Part part, int resourceId)
+        {
+            return part.Resources.Contains(resourceId);
+        }
+
+        /// <summary>
+        ///     Gets whether the part contains resources.
+        /// </summary>
+        public static bool ContainsResources(this Part part)
+        {
+            return part.Resources.list.Count(p => p.amount > 0d) > 0;
+        }
+
+        /// <summary>
+        ///     Gets whether the part has fuel.
+        /// </summary>
+        public static bool EngineHasFuel(this Part part)
+        {
+            if (part.HasModule<ModuleEngines>())
+            {
+                return part.GetModuleEngines().getFlameoutState;
+            }
+            if (part.HasModule<MultiModeEngine>())
+            {
+                return part.GetModuleMultiModeEngine().getFlameoutState;
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        ///     Gets the cost of the part excluding resources.
+        /// </summary>
+        public static double GetCostDry(this Part part)
+        {
+            return part.partInfo.cost - GetResourceCostMax(part) + part.GetModuleCosts(0.0f);
+        }
+
+        /// <summary>
+        ///     Gets the cost of the part including maximum resources.
+        /// </summary>
+        public static double GetCostMax(this Part part)
+        {
+            return part.partInfo.cost + part.GetModuleCosts(0.0f);
+        }
+
+        /// <summary>
+        ///     Gets the cost of the part including resources.
+        /// </summary>
+        public static double GetCostWet(this Part part)
+        {
+            return part.partInfo.cost - GetResourceCostInverted(part) + part.GetModuleCosts(0.0f);
+        }
+
+        /// <summary>
+        ///     Gets the dry mass of the part.
+        /// </summary>
+        public static double GetDryMass(this Part part)
+        {
+            return (part.physicalSignificance == Part.PhysicalSignificance.FULL) ? part.mass : 0d;
+        }
+
+        /// <summary>
+        ///     Gets the maximum thrust of the part if it's an engine.
+        /// </summary>
+        public static double GetMaxThrust(this Part part)
+        {
+            if (part.HasModule<ModuleEngines>())
+            {
+                return part.GetModuleEngines().maxThrust;
+            }
+            if (part.HasModule<MultiModeEngine>())
+            {
+                return part.GetModuleMultiModeEngine().maxThrust;
+            }
+            if (part.HasModule<ModuleEnginesFX>())
+            {
+                return part.GetModuleEnginesFx().maxThrust;
+            }
+
+            return 0d;
         }
 
         /// <summary>
@@ -77,9 +143,20 @@
             return (T)Convert.ChangeType(part.Modules[classId], typeof(T));
         }
 
-        public static List<T> GetModules<T>(this Part part) where T : PartModule
-        {
-            return part.Modules.OfType<T>().ToList();
+        /// <summary>
+        ///     Gets a ModuleAlternator typed PartModule.
+        /// </summary>
+        public static ModuleAlternator GetModuleAlternator(this Part part)
+        {
+            return part.GetModule<ModuleAlternator>();
+        }
+
+        /// <summary>
+        ///     Gets a ModuleDeployableSolarPanel typed PartModule.
+        /// </summary>
+        public static ModuleDeployableSolarPanel GetModuleDeployableSolarPanel(this Part part)
+        {
+            return part.GetModule<ModuleDeployableSolarPanel>();
         }
 
         /// <summary>
@@ -90,58 +167,133 @@
             return part.GetModule<ModuleEngines>();
         }
 
+        public static ModuleEnginesFX GetModuleEnginesFx(this Part part)
+        {
+            return part.GetModule<ModuleEnginesFX>();
+        }
+
+        /// <summary>
+        ///     Gets a ModuleGenerator typed PartModule.
+        /// </summary>
+        public static ModuleGenerator GetModuleGenerator(this Part part)
+        {
+            return part.GetModule<ModuleGenerator>();
+        }
+
+        /// <summary>
+        ///     Gets a ModuleGimbal typed PartModule.
+        /// </summary>
+        public static ModuleGimbal GetModuleGimbal(this Part part)
+        {
+            return part.GetModule<ModuleGimbal>();
+        }
+
         /// <summary>
         ///     Gets the current selected ModuleEnginesFX.
         /// </summary>
-        public static ModuleEnginesFX GetModuleEnginesFx(this Part part)
+        public static ModuleEnginesFX GetModuleMultiModeEngine(this Part part)
         {
             var mode = part.GetModule<MultiModeEngine>().mode;
             return part.Modules.OfType<ModuleEnginesFX>().FirstOrDefault(engine => engine.engineID == mode);
         }
 
+        /// <summary>
+        ///     Gets a ModuleParachute typed PartModule.
+        /// </summary>
+        public static ModuleParachute GetModuleParachute(this Part part)
+        {
+            return part.GetModule<ModuleParachute>();
+        }
+
         public static ModuleRCS GetModuleRcs(this Part part)
         {
             return part.GetModule<ModuleRCS>();
         }
 
         /// <summary>
-        ///     Gets a ModuleGimbal typed PartModule.
-        /// </summary>
-        public static ModuleGimbal GetModuleGimbal(this Part part)
-        {
-            return part.GetModule<ModuleGimbal>();
-        }
-
-        /// <summary>
-        ///     Gets a ModuleDeployableSolarPanel typed PartModule.
-        /// </summary>
-        public static ModuleDeployableSolarPanel GetModuleDeployableSolarPanel(this Part part)
-        {
-            return part.GetModule<ModuleDeployableSolarPanel>();
-        }
-
-        /// <summary>
-        ///     Gets a ModuleAlternator typed PartModule.
-        /// </summary>
-        public static ModuleAlternator GetModuleAlternator(this Part part)
-        {
-            return part.GetModule<ModuleAlternator>();
-        }
-
-        /// <summary>
-        ///     Gets a ModuleGenerator typed PartModule.
-        /// </summary>
-        public static ModuleGenerator GetModuleGenerator(this Part part)
-        {
-            return part.GetModule<ModuleGenerator>();
-        }
-
-        /// <summary>
-        ///     Gets a ModuleParachute typed PartModule.
-        /// </summary>
-        public static ModuleParachute GetModuleParachute(this Part part)
-        {
-            return part.GetModule<ModuleParachute>();
+        ///     Gets a typed list of PartModules.
+        /// </summary>
+        public static List<T> GetModules<T>(this Part part) where T : PartModule
+        {
+            return part.Modules.OfType<T>().ToList();
+        }
+
+        public static ProtoModuleDecoupler GetProtoModuleDecoupler(this Part part)
+        {
+            if (HasModule<ModuleDecouple>(part))
+            {
+                return new ProtoModuleDecoupler(GetModule<ModuleDecouple>(part));
+            }
+            if (HasModule<ModuleAnchoredDecoupler>(part))
+            {
+                return new ProtoModuleDecoupler(GetModule<ModuleAnchoredDecoupler>(part));
+            }
+            return null;
+        }
+
+        /// <summary>
+        ///     Gets a generic proto engine for the current engine module attached to the part.
+        /// </summary>
+        public static ProtoModuleEngine GetProtoModuleEngine(this Part part)
+        {
+            if (HasModule<ModuleEngines>(part))
+            {
+                return new ProtoModuleEngine(GetModule<ModuleEngines>(part));
+            }
+            if (HasModule<MultiModeEngine>(part))
+            {
+                return new ProtoModuleEngine(GetModuleMultiModeEngine(part));
+            }
+            if (HasModule<ModuleEnginesFX>(part))
+            {
+                return new ProtoModuleEngine(GetModule<ModuleEnginesFX>(part));
+            }
+            return null;
+        }
+
+        /// <summary>
+        ///     Gets the cost of the part's contained resources.
+        /// </summary>
+        public static double GetResourceCost(this Part part)
+        {
+            return part.Resources.list.Sum(r => r.amount * r.info.unitCost);
+        }
+
+        /// <summary>
+        ///     Gets the cost of the part's contained resources, inverted.
+        /// </summary>
+        public static double GetResourceCostInverted(this Part part)
+        {
+            return part.Resources.list.Sum(r => (r.maxAmount - r.amount) * r.info.unitCost);
+        }
+
+        /// <summary>
+        ///     Gets the cost of the part's maximum contained resources.
+        /// </summary>
+        public static double GetResourceCostMax(this Part part)
+        {
+            return part.Resources.list.Sum(r => r.maxAmount * r.info.unitCost);
+        }
+
+        /// <summary>
+        ///     Gets the current specific impulse for the engine.
+        /// </summary>
+        public static double GetSpecificImpulse(this Part part, float atmosphere)
+        {
+            if (part.HasModule<ModuleEngines>())
+            {
+                return part.GetModuleEngines().atmosphereCurve.Evaluate(atmosphere);
+            }
+            if (part.HasModule<MultiModeEngine>())
+            {
+                return part.GetModuleMultiModeEngine().atmosphereCurve.Evaluate(atmosphere);
+            }
+            if (part.HasModule<ModuleEnginesFX>())
+            {
+                return part.GetModuleEnginesFx().atmosphereCurve.Evaluate(atmosphere);
+            }
+
+            return 0d;
         }
 
         /// <summary>
@@ -153,123 +305,153 @@
         }
 
         /// <summary>
-        ///     Gets the dry mass of the part.
-        /// </summary>
-        public static double GetDryMass(this Part part)
-        {
-            return (part.physicalSignificance == Part.PhysicalSignificance.FULL) ? part.mass : 0d;
-        }
-
-        /// <summary>
-        ///     Gets the maximum thrust of the part if it's an engine.
-        /// </summary>
-        public static double GetMaxThrust(this Part part)
-        {
-            if (part.HasModule<ModuleEngines>())
-            {
-                return part.GetModuleEngines().maxThrust;
-            }
-            if (part.HasModule<MultiModeEngine>())
-            {
-                return part.GetModuleEnginesFx().maxThrust;
-            }
-
-            return 0d;
-        }
-
-        /// <summary>
-        ///     Gets the current specific impulse for the engine.
-        /// </summary>
-        public static double GetSpecificImpulse(this Part part, float atmosphere)
-        {
-            if (part.HasModule<ModuleEngines>())
-            {
-                return part.GetModuleEngines().atmosphereCurve.Evaluate(atmosphere);
-            }
-            if (part.HasModule<MultiModeEngine>())
-            {
-                return part.GetModuleEnginesFx().atmosphereCurve.Evaluate(atmosphere);
-            }
-
-            return 0d;
-        }
-
-        /// <summary>
-        ///     Gets whether the part has fuel.
-        /// </summary>
-        public static bool EngineHasFuel(this Part part)
-        {
-            if (part.HasModule<ModuleEngines>())
-            {
-                return part.GetModuleEngines().getFlameoutState;
-            }
-            if (part.HasModule<MultiModeEngine>())
-            {
-                return part.GetModuleEnginesFx().getFlameoutState;
+        ///     Gets whether the part contains a PartModule.
+        /// </summary>
+        public static bool HasModule<T>(this Part part) where T : PartModule
+        {
+            return part.Modules.OfType<T>().Any();
+        }
+
+        /// <summary>
+        ///     Gets whether the part contains a PartModule conforming to the supplied predicate.
+        /// </summary>
+        public static bool HasModule<T>(this Part part, Func<T, bool> predicate) where T : PartModule
+        {
+            return part.Modules.OfType<T>().Any(predicate);
+        }
+
+        /// <summary>
+        ///     Gets whether the part contains a PartModule.
+        /// </summary>
+        public static bool HasModule(this Part part, string className)
+        {
+            return part.Modules.Contains(className);
+        }
+
+        /// <summary>
+        ///     Gets whether the part contains a PartModule.
+        /// </summary>
+        public static bool HasModule(this Part part, int moduleId)
+        {
+            return part.Modules.Contains(moduleId);
+        }
+
+        /// <summary>
+        ///     Gets whether the part has a one shot animation.
+        /// </summary>
+        public static bool HasOneShotAnimation(this Part part)
+        {
+            return part.HasModule<ModuleAnimateGeneric>() && part.GetModule<ModuleAnimateGeneric>().isOneShot;
+        }
+
+        /// <summary>
+        ///     Gets whether the part is a command module.
+        /// </summary>
+        public static bool IsCommandModule(this Part part)
+        {
+            return part.HasModule<ModuleCommand>();
+        }
+
+        /// <summary>
+        ///     Gets whether the part is decoupled in a specified stage.
+        /// </summary>
+        public static bool IsDecoupledInStage(this Part part, int stage)
+        {
+            if ((part.IsDecoupler() || part.IsLaunchClamp()) && part.inverseStage == stage)
+            {
+                return true;
+            }
+            if (part.parent == null)
+            {
+                return false;
+            }
+            return part.parent.IsDecoupledInStage(stage);
+        }
+
+        /// <summary>
+        ///     Gets whether the part is a decoupler.
+        /// </summary>
+        public static bool IsDecoupler(this Part part)
+        {
+            return part.HasModule<ModuleDecouple>() || part.HasModule<ModuleAnchoredDecoupler>();
+        }
+
+        /// <summary>
+        ///     Gets whether the part is an active engine.
+        /// </summary>
+        public static bool IsEngine(this Part part)
+        {
+            return part.HasModule<ModuleEngines>() || part.HasModule<ModuleEnginesFX>();
+        }
+
+        /// <summary>
+        ///     Gets whether the part is a fuel line.
+        /// </summary>
+        public static bool IsFuelLine(this Part part)
+        {
+            return (HasModule<CModuleFuelLine>(part));
+        }
+
+        /// <summary>
+        ///     Gets whether the part is a generator.
+        /// </summary>
+        public static bool IsGenerator(this Part part)
+        {
+            return part.HasModule<ModuleGenerator>();
+        }
+
+        /// <summary>
+        ///     Gets whether the part is a launch clamp.
+        /// </summary>
+        public static bool IsLaunchClamp(this Part part)
+        {
+            return part.HasModule<LaunchClamp>();
+        }
+
+        /// <summary>
+        ///     Gets whether the part is a parachute.
+        /// </summary>
+        public static bool IsParachute(this Part part)
+        {
+            return part.HasModule<ModuleParachute>();
+        }
+
+        /// <summary>
+        ///     Gets whether the part is considered a primary part on the vessel.
+        /// </summary>
+        public static bool IsPrimary(this Part part, List<Part> partsList, PartModule module)
+        {
+            foreach (var vesselPart in partsList)
+            {
+                if (!vesselPart.HasModule(module.ClassID))
+                {
+                    continue;
+                }
+
+                if (vesselPart == part)
+                {
+                    return true;
+                }
+                break;
             }
 
             return false;
         }
 
-        /// <summary>
-        ///     Gets whether the part contains resources.
-        /// </summary>
-        public static bool ContainsResources(this Part part)
-        {
-            return part.Resources.list.Count(p => p.amount > 0d) > 0;
-        }
-
-        public static bool ContainsResource(this Part part, int resourceId)
-        {
-            return part.Resources.Contains(resourceId);
-        }
-
-        /// <summary>
-        ///     Gets whether the part is a decoupler.
-        /// </summary>
-        public static bool IsDecoupler(this Part part)
-        {
-            return part.HasModule<ModuleDecouple>() || part.HasModule<ModuleAnchoredDecoupler>();
-        }
-
-        /// <summary>
-        ///     Gets whether the part is decoupled in a specified stage.
-        /// </summary>
-        public static bool IsDecoupledInStage(this Part part, int stage)
-        {
-            if ((part.IsDecoupler() || part.IsLaunchClamp()) && part.inverseStage == stage)
-            {
-                return true;
-            }
-            if (part.parent == null)
-            {
-                return false;
-            }
-            return part.parent.IsDecoupledInStage(stage);
-        }
-
-        /// <summary>
-        ///     Gets whether the part is a launch clamp.
-        /// </summary>
-        public static bool IsLaunchClamp(this Part part)
-        {
-            return part.HasModule<LaunchClamp>();
-        }
-
-        /// <summary>
-        ///     Gets whether the part is an active engine.
-        /// </summary>
-        public static bool IsEngine(this Part part)
-        {
-            return part.HasModule<ModuleEngines>() || part.HasModule<MultiModeEngine>();
-        }
-
         public static bool IsRcsModule(this Part part)
         {
             return part.HasModule<ModuleRCS>();
         }
 
         /// <summary>
+        ///     Gets whether the part is a sepratron.
+        /// </summary>
+        public static bool IsSepratron(this Part part)
+        {
+            return (part.IsSolidRocket() && part.ActivatesEvenIfDisconnected && part.IsDecoupledInStage(part.inverseStage));
+        }
+
+        /// <summary>
         ///     Gets whether the part is a deployable solar panel.
         /// </summary>
         public static bool IsSolarPanel(this Part part)
@@ -278,30 +460,6 @@
         }
 
         /// <summary>
-        ///     Gets whether the part is a generator.
-        /// </summary>
-        public static bool IsGenerator(this Part part)
-        {
-            return part.HasModule<ModuleGenerator>();
-        }
-
-        /// <summary>
-        ///     Gets whether the part is a command module.
-        /// </summary>
-        public static bool IsCommandModule(this Part part)
-        {
-            return part.HasModule<ModuleCommand>();
-        }
-
-        /// <summary>
-        ///     Gets whether the part is a parachute.
-        /// </summary>
-        public static bool IsParachute(this Part part)
-        {
-            return part.HasModule<ModuleParachute>();
-        }
-
-        /// <summary>
         ///     Gets whether the part is a solid rocket motor.
         /// </summary>
         public static bool IsSolidRocket(this Part part)
@@ -309,50 +467,157 @@
             return part.HasModule<ModuleEngines>() && part.GetModuleEngines().throttleLocked;
         }
 
-        /// <summary>
-        ///     Gets whether the part is a sepratron.
-        /// </summary>
-        public static bool IsSepratron(this Part part)
-        {
-            return (part.IsSolidRocket() && part.ActivatesEvenIfDisconnected && part.IsDecoupledInStage(part.inverseStage));
-        }
-
-        /// <summary>
-        ///     Gets whether the part is a fuel line.
-        /// </summary>
-        public static bool IsFuelLine(this Part part)
-        {
-            return (part is FuelLine);
-        }
-
-        /// <summary>
-        ///     Gets whether the part is considered a primary part on the vessel.
-        /// </summary>
-        public static bool IsPrimary(this Part part, List<Part> partsList, PartModule module)
-        {
-            foreach (var vesselPart in partsList)
-            {
-                if (!vesselPart.HasModule(module.ClassID))
-                {
-                    continue;
-                }
-
-                if (vesselPart == part)
-                {
-                    return true;
-                }
-                break;
-            }
-
-            return false;
-        }
-
-        /// <summary>
-        ///     Gets whether the part has a one shot animation.
-        /// </summary>
-        public static bool HasOneShotAnimation(this Part part)
-        {
-            return part.HasModule<ModuleAnimateGeneric>() && part.GetModule<ModuleAnimateGeneric>().isOneShot;
-        }
+        #endregion
+
+        #region Nested Type: ProtoModuleDecoupler
+
+        public class ProtoModuleDecoupler
+        {
+            #region Fields
+
+            private readonly PartModule module;
+
+            #endregion
+
+            #region Constructors
+
+            public ProtoModuleDecoupler(PartModule module)
+            {
+                this.module = module;
+
+                if (this.module is ModuleDecouple)
+                {
+                    this.SetModuleDecouple();
+                }
+                else if (this.module is ModuleAnchoredDecoupler)
+                {
+                    this.SetModuleAnchoredDecoupler();
+                }
+            }
+
+            #endregion
+
+            #region Properties
+
+            public double EjectionForce { get; private set; }
+            public bool IsOmniDecoupler { get; private set; }
+
+            #endregion
+
+            #region Methods: private
+
+            private void SetModuleAnchoredDecoupler()
+            {
+                var decoupler = this.module as ModuleAnchoredDecoupler;
+                if (decoupler == null)
+                {
+                    return;
+                }
+
+                this.EjectionForce = decoupler.ejectionForce;
+            }
+
+            private void SetModuleDecouple()
+            {
+                var decoupler = this.module as ModuleDecouple;
+                if (decoupler == null)
+                {
+                    return;
+                }
+
+                this.EjectionForce = decoupler.ejectionForce;
+                this.IsOmniDecoupler = decoupler.isOmniDecoupler;
+            }
+
+            #endregion
+        }
+
+        #endregion
+
+        #region Nested Type: ProtoModuleEngine
+
+        public class ProtoModuleEngine
+        {
+            #region Fields
+
+            private readonly PartModule module;
+
+            #endregion
+
+            #region Constructors
+
+            public ProtoModuleEngine(PartModule module)
+            {
+                this.module = module;
+
+                if (module is ModuleEngines)
+                {
+                    this.SetModuleEngines();
+                }
+                else if (module is ModuleEnginesFX)
+                {
+                    this.SetModuleEnginesFx();
+                }
+            }
+
+            #endregion
+
+            #region Properties
+
+            public double MaximumThrust { get; private set; }
+            public double MinimumThrust { get; private set; }
+            public List<Propellant> Propellants { get; private set; }
+
+            #endregion
+
+            #region Methods: public
+
+            public float GetSpecificImpulse(float atmosphere)
+            {
+                if (this.module is ModuleEngines)
+                {
+                    return (this.module as ModuleEngines).atmosphereCurve.Evaluate(atmosphere);
+                }
+                if (this.module is ModuleEnginesFX)
+                {
+                    return (this.module as ModuleEnginesFX).atmosphereCurve.Evaluate(atmosphere);
+                }
+                return 0.0f;
+            }
+
+            #endregion
+
+            #region Methods: private
+
+            private void SetModuleEngines()
+            {
+                var engine = this.module as ModuleEngines;
+                if (engine == null)
+                {
+                    return;
+                }
+
+                this.MaximumThrust = engine.maxThrust * (engine.thrustPercentage * 0.01);
+                this.MinimumThrust = engine.minThrust;
+                this.Propellants = engine.propellants;
+            }
+
+            private void SetModuleEnginesFx()
+            {
+                var engine = this.module as ModuleEnginesFX;
+                if (engine == null)
+                {
+                    return;
+                }
+
+                this.MaximumThrust = engine.maxThrust * (engine.thrustPercentage * 0.01);
+                this.MinimumThrust = engine.minThrust;
+                this.Propellants = engine.propellants;
+            }
+
+            #endregion
+        }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Extensions/PartResourceExtensions.cs
+++ b/KerbalEngineer/Extensions/PartResourceExtensions.cs
@@ -21,28 +21,40 @@
 {
     public static class PartResourceExtensions
     {
+        #region Methods: public
+
+        /// <summary>
+        ///     Gets the cost of the resource.
+        /// </summary>
+        public static double GetCost(this PartResource resource)
+        {
+            return resource.amount * resource.info.unitCost;
+        }
+
         /// <summary>
         ///     Gets the definition object for the resource.
         /// </summary>
-        public static PartResourceDefinition GetDefinition(this PartResource value)
+        public static PartResourceDefinition GetDefinition(this PartResource resource)
         {
-            return PartResourceLibrary.Instance.GetDefinition(value.info.id);
+            return PartResourceLibrary.Instance.GetDefinition(resource.info.id);
         }
 
         /// <summary>
         ///     Gets the density of the resource.
         /// </summary>
-        public static double GetDensity(this PartResource value)
+        public static double GetDensity(this PartResource resource)
         {
-            return value.GetDefinition().density;
+            return resource.GetDefinition().density;
         }
 
         /// <summary>
         ///     Gets the mass of the resource.
         /// </summary>
-        public static double GetMass(this PartResource value)
+        public static double GetMass(this PartResource resource)
         {
-            return value.amount * value.GetDensity();
+            return resource.amount * resource.GetDensity();
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/ActionMenu.cs
+++ b/KerbalEngineer/Flight/ActionMenu.cs
@@ -20,7 +20,6 @@
 #region Using Directives
 
 using System;
-using System.Threading;
 
 using UnityEngine;
 
@@ -41,34 +40,50 @@
 
         #endregion
 
-        #region Initialisation
-
-        private void Awake()
+        #region Methods: protected
+
+        protected void Awake()
         {
             try
             {
                 GameEvents.onGUIApplicationLauncherReady.Add(this.OnGuiAppLauncherReady);
-                Logger.Log("ActionMenu was created.");
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        #endregion
-
-        #region Updating
-
-        private void Update()
-        {
-            try
-            {
-                if (FlightEngineerCore.Instance != null && this.button.State == RUIToggleButton.ButtonState.DISABLED)
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+            Logger.Log("ActionMenu was created.");
+        }
+
+        protected void OnDestroy()
+        {
+            try
+            {
+                GameEvents.onGUIApplicationLauncherReady.Remove(this.OnGuiAppLauncherReady);
+                GameEvents.onHideUI.Remove(this.OnHide);
+                GameEvents.onShowUI.Remove(this.OnShow);
+                ApplicationLauncher.Instance.RemoveModApplication(this.button);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+            Logger.Log("ActionMenu was destroyed.");
+        }
+
+        protected void Update()
+        {
+            try
+            {
+                if (this.button == null)
+                {
+                    return;
+                }
+                if (FlightEngineerCore.IsDisplayable && this.button.State == RUIToggleButton.ButtonState.DISABLED)
                 {
                     this.button.Enable();
                 }
-                else if (FlightEngineerCore.Instance == null && this.button.State != RUIToggleButton.ButtonState.DISABLED)
+                else if (!FlightEngineerCore.IsDisplayable && this.button.State != RUIToggleButton.ButtonState.DISABLED)
                 {
                     this.button.Disable();
                 }
@@ -81,7 +96,20 @@
 
         #endregion
 
-        #region Callbacks
+        #region Methods: private
+
+        private void OnFalse()
+        {
+            try
+            {
+                this.actionMenuGui.enabled = false;
+                this.actionMenuGui.StayOpen = false;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
 
         private void OnGuiAppLauncherReady()
         {
@@ -108,94 +136,61 @@
             }
         }
 
+        private void OnHide()
+        {
+            try
+            {
+                this.actionMenuGui.Hidden = true;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        private void OnHover()
+        {
+            try
+            {
+                this.actionMenuGui.enabled = true;
+                this.actionMenuGui.Hovering = true;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        private void OnHoverOut()
+        {
+            try
+            {
+                this.actionMenuGui.Hovering = false;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        private void OnShow()
+        {
+            try
+            {
+                this.actionMenuGui.Hidden = false;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
         private void OnTrue()
         {
             try
             {
                 this.actionMenuGui.enabled = true;
                 this.actionMenuGui.StayOpen = true;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        private void OnFalse()
-        {
-            try
-            {
-                this.actionMenuGui.enabled = false;
-                this.actionMenuGui.StayOpen = false;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        private void OnHover()
-        {
-            try
-            {
-                this.actionMenuGui.enabled = true;
-                this.actionMenuGui.Hovering = true;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        private void OnHoverOut()
-        {
-            try
-            {
-                this.actionMenuGui.Hovering = false;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        private void OnHide()
-        {
-            try
-            {
-                this.actionMenuGui.Hidden = true;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        private void OnShow()
-        {
-            try
-            {
-                this.actionMenuGui.Hidden = false;
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex);
-            }
-        }
-
-        #endregion
-
-        #region Destruction
-
-        private void OnDestroy()
-        {
-            try
-            {
-                GameEvents.onGUIApplicationLauncherReady.Remove(this.OnGuiAppLauncherReady);
-                GameEvents.onHideUI.Remove(this.OnHide);
-                GameEvents.onShowUI.Remove(this.OnShow);
-                ApplicationLauncher.Instance.RemoveModApplication(this.button);
-                Logger.Log("ActionMenu was destroyed.");
             }
             catch (Exception ex)
             {

--- a/KerbalEngineer/Flight/ActionMenuGui.cs
+++ b/KerbalEngineer/Flight/ActionMenuGui.cs
@@ -42,6 +42,7 @@
         #region Properties
 
         public bool StayOpen { get; set; }
+
         public bool Hovering { get; set; }
 
         public bool Hidden { get; set; }
@@ -131,7 +132,7 @@
         {
             try
             {
-                if (this.Hidden)
+                if (this.Hidden || !FlightEngineerCore.IsDisplayable)
                 {
                     return;
                 }

--- a/KerbalEngineer/Flight/DisplayStack.cs
+++ b/KerbalEngineer/Flight/DisplayStack.cs
@@ -33,36 +33,65 @@
 
 namespace KerbalEngineer.Flight
 {
+    using Upgradeables;
+
     /// <summary>
     ///     Graphical controller for displaying stacked sections.
     /// </summary>
     [KSPAddon(KSPAddon.Startup.Flight, false)]
     public class DisplayStack : MonoBehaviour
     {
-        #region Instance
-
-        /// <summary>
-        ///     Gets the current instance of the DisplayStack.
-        /// </summary>
-        public static DisplayStack Instance { get; private set; }
-
-        #endregion
-
         #region Fields
 
+        private GUIStyle buttonStyle;
         private int numberOfStackSections;
         private bool resizeRequested;
+        private bool showControlBar = true;
+        private GUIStyle titleStyle;
         private int windowId;
         private Rect windowPosition;
-
-        #endregion
-
-        #region Constructors
+        private GUIStyle windowStyle;
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        ///     Gets the current instance of the DisplayStack.
+        /// </summary>
+        public static DisplayStack Instance { get; private set; }
+
+        public bool Hidden { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the visibility of the control bar.
+        /// </summary>
+        public bool ShowControlBar
+        {
+            get { return this.showControlBar; }
+            set { this.showControlBar = value; }
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        /// <summary>
+        ///     Request that the display stack's size is reset in the next draw call.
+        /// </summary>
+        public void RequestResize()
+        {
+            this.resizeRequested = true;
+        }
+
+        #endregion
+
+        #region Methods: protected
 
         /// <summary>
         ///     Sets the instance to this object.
         /// </summary>
-        private void Awake()
+        protected void Awake()
         {
             try
             {
@@ -79,14 +108,31 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "DisplayStack->Awake");
-            }
+                Logger.Exception(ex);
+            }
+        }
+
+        /// <summary>
+        ///     Runs when the object is destroyed.
+        /// </summary>
+        protected void OnDestroy()
+        {
+            try
+            {
+                this.Save();
+                RenderingManager.RemoveFromPostDrawQueue(0, this.Draw);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+            Logger.Log("ActionMenu->OnDestroy");
         }
 
         /// <summary>
         ///     Initialises the object's state on creation.
         /// </summary>
-        private void Start()
+        protected void Start()
         {
             try
             {
@@ -98,112 +144,33 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "DisplayStack->Start");
-            }
-        }
-
-        #endregion
-
-        #region Properties
-
-        private bool showControlBar = true;
-
-        /// <summary>
-        ///     Gets and sets the visibility of the control bar.
-        /// </summary>
-        public bool ShowControlBar
-        {
-            get { return this.showControlBar; }
-            set { this.showControlBar = value; }
-        }
-
-        public bool Hidden { get; set; }
-
-        #endregion
-
-        #region GUIStyles
-
-        private GUIStyle buttonStyle;
-        private GUIStyle titleStyle;
-        private GUIStyle windowStyle;
-
-        /// <summary>
-        ///     Initialises all the styles required for this object.
-        /// </summary>
-        private void InitialiseStyles()
-        {
-            try
-            {
-                this.windowStyle = new GUIStyle(HighLogic.Skin.window)
-                {
-                    margin = new RectOffset(),
-                    padding = new RectOffset(5, 5, 0, 5)
-                };
-
-                this.titleStyle = new GUIStyle(HighLogic.Skin.label)
-                {
-                    margin = new RectOffset(0, 0, 5, 3),
-                    padding = new RectOffset(),
-                    alignment = TextAnchor.MiddleCenter,
-                    fontSize = (int)(13 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    stretchWidth = true
-                };
-
-                this.buttonStyle = new GUIStyle(HighLogic.Skin.button)
-                {
-                    normal =
-                    {
-                        textColor = Color.white
-                    },
-                    margin = new RectOffset(),
-                    padding = new RectOffset(),
-                    alignment = TextAnchor.MiddleCenter,
-                    fontSize = (int)(11 * GuiDisplaySize.Offset),
-                    fontStyle = FontStyle.Bold,
-                    fixedWidth = 60.0f * GuiDisplaySize.Offset,
-                    fixedHeight = 25.0f * GuiDisplaySize.Offset,
-                };
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->InitialiseStyles");
-            }
-        }
-
-        private void OnSizeChanged()
-        {
-            this.InitialiseStyles();
-            this.RequestResize();
-        }
-
-        #endregion
-
-        #region Updating
-
-        private void Update()
-        {
-            try
-            {
-                if (FlightEngineerCore.Instance == null)
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Update()
+        {
+            try
+            {
+                if (!FlightEngineerCore.IsDisplayable)
                 {
                     return;
                 }
 
-                if (Input.GetKeyDown(KeyCode.Backslash))
+                if (Input.GetKeyDown(KeyBinder.FlightShowHide))
                 {
                     this.Hidden = !this.Hidden;
                 }
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "DisplayStack->Update");
-            }
-        }
-
-        #endregion
-
-        #region Drawing
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Methods: private
 
         /// <summary>
         ///     Called to draw the display stack when the UI is enabled.
@@ -212,7 +179,7 @@
         {
             try
             {
-                if (FlightEngineerCore.Instance == null)
+                if (!FlightEngineerCore.IsDisplayable)
                 {
                     return;
                 }
@@ -238,33 +205,7 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "DisplayStack->Draw");
-            }
-        }
-
-        /// <summary>
-        ///     Draws the display stack window.
-        /// </summary>
-        private void Window(int windowId)
-        {
-            try
-            {
-                if (this.ShowControlBar)
-                {
-                    this.DrawControlBar();
-                }
-
-                if (SectionLibrary.NumberOfStackSections > 0)
-                {
-                    this.DrawSections(SectionLibrary.StockSections);
-                    this.DrawSections(SectionLibrary.CustomSections);
-                }
-
-                GUI.DragWindow();
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->Widnow");
+                Logger.Exception(ex);
             }
         }
 
@@ -273,17 +214,10 @@
         /// </summary>
         private void DrawControlBar()
         {
-            try
-            {
-                GUILayout.Label("FLIGHT ENGINEER " + EngineerGlobals.AssemblyVersion, this.titleStyle);
-
-                this.DrawControlBarButtons(SectionLibrary.StockSections);
-                this.DrawControlBarButtons(SectionLibrary.CustomSections);
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->DrawControlBar");
-            }
+            GUILayout.Label("FLIGHT ENGINEER " + EngineerGlobals.AssemblyVersion, this.titleStyle);
+
+            this.DrawControlBarButtons(SectionLibrary.StockSections);
+            this.DrawControlBarButtons(SectionLibrary.CustomSections);
         }
 
         /// <summary>
@@ -291,30 +225,23 @@
         /// </summary>
         private void DrawControlBarButtons(IEnumerable<SectionModule> sections)
         {
-            try
-            {
-                var index = 0;
-                foreach (var section in sections.Where(s => !string.IsNullOrEmpty(s.Abbreviation) || !s.IsCustom))
-                {
-                    if (index % 4 == 0)
+            var index = 0;
+            foreach (var section in sections.Where(s => !string.IsNullOrEmpty(s.Abbreviation) || !s.IsCustom))
+            {
+                if (index % 4 == 0)
+                {
+                    if (index > 0)
                     {
-                        if (index > 0)
-                        {
-                            GUILayout.EndHorizontal();
-                        }
-                        GUILayout.BeginHorizontal();
+                        GUILayout.EndHorizontal();
                     }
-                    section.IsVisible = GUILayout.Toggle(section.IsVisible, section.Abbreviation.ToUpper(), this.buttonStyle);
-                    index++;
-                }
-                if (index > 0)
-                {
-                    GUILayout.EndHorizontal();
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->DrawControlBarButtons");
+                    GUILayout.BeginHorizontal();
+                }
+                section.IsVisible = GUILayout.Toggle(section.IsVisible, section.Abbreviation.ToUpper(), this.buttonStyle);
+                index++;
+            }
+            if (index > 0)
+            {
+                GUILayout.EndHorizontal();
             }
         }
 
@@ -323,46 +250,76 @@
         /// </summary>
         private void DrawSections(IEnumerable<SectionModule> sections)
         {
-            try
-            {
-                foreach (var section in sections)
-                {
-                    if (!section.IsFloating)
-                    {
-                        section.Draw();
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->DrawSections");
-            }
-        }
-
-        #endregion
-
-        #region Destruction
-
-        /// <summary>
-        ///     Runs when the object is destroyed.
-        /// </summary>
-        private void OnDestroy()
-        {
-            try
-            {
-                this.Save();
-                RenderingManager.RemoveFromPostDrawQueue(0, this.Draw);
-                Logger.Log("ActionMenu->OnDestroy");
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->OnDestroy");
-            }
-        }
-
-        #endregion
-
-        #region Saving and Loading
+            foreach (var section in sections)
+            {
+                if (!section.IsFloating)
+                {
+                    section.Draw();
+                }
+            }
+        }
+
+        /// <summary>
+        ///     Initialises all the styles required for this object.
+        /// </summary>
+        private void InitialiseStyles()
+        {
+            this.windowStyle = new GUIStyle(HighLogic.Skin.window)
+            {
+                margin = new RectOffset(),
+                padding = new RectOffset(5, 5, 0, 5)
+            };
+
+            this.titleStyle = new GUIStyle(HighLogic.Skin.label)
+            {
+                margin = new RectOffset(0, 0, 5, 3),
+                padding = new RectOffset(),
+                alignment = TextAnchor.MiddleCenter,
+                fontSize = (int)(13 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                stretchWidth = true
+            };
+
+            this.buttonStyle = new GUIStyle(HighLogic.Skin.button)
+            {
+                normal =
+                {
+                    textColor = Color.white
+                },
+                margin = new RectOffset(),
+                padding = new RectOffset(),
+                alignment = TextAnchor.MiddleCenter,
+                fontSize = (int)(11 * GuiDisplaySize.Offset),
+                fontStyle = FontStyle.Bold,
+                fixedWidth = 60.0f * GuiDisplaySize.Offset,
+                fixedHeight = 25.0f * GuiDisplaySize.Offset,
+            };
+        }
+
+        /// <summary>
+        ///     Load the stack's state.
+        /// </summary>
+        private void Load()
+        {
+            try
+            {
+                var handler = SettingHandler.Load("DisplayStack.xml");
+                this.Hidden = handler.Get("hidden", this.Hidden);
+                this.ShowControlBar = handler.Get("showControlBar", this.ShowControlBar);
+                this.windowPosition.x = handler.Get("windowPositionX", this.windowPosition.x);
+                this.windowPosition.y = handler.Get("windowPositionY", this.windowPosition.y);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->Load");
+            }
+        }
+
+        private void OnSizeChanged()
+        {
+            this.InitialiseStyles();
+            this.RequestResize();
+        }
 
         /// <summary>
         ///     Saves the stack's state.
@@ -372,6 +329,7 @@
             try
             {
                 var handler = new SettingHandler();
+                handler.Set("hidden", this.Hidden);
                 handler.Set("showControlBar", this.ShowControlBar);
                 handler.Set("windowPositionX", this.windowPosition.x);
                 handler.Set("windowPositionY", this.windowPosition.y);
@@ -384,33 +342,29 @@
         }
 
         /// <summary>
-        ///     Load the stack's state.
-        /// </summary>
-        private void Load()
-        {
-            try
-            {
-                var handler = SettingHandler.Load("DisplayStack.xml");
-                this.ShowControlBar = handler.Get("showControlBar", this.ShowControlBar);
-                this.windowPosition.x = handler.Get("windowPositionX", this.windowPosition.x);
-                this.windowPosition.y = handler.Get("windowPositionY", this.windowPosition.y);
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "DisplayStack->Load");
-            }
-        }
-
-        #endregion
-
-        #region Methods
-
-        /// <summary>
-        ///     Request that the display stack's size is reset in the next draw call.
-        /// </summary>
-        public void RequestResize()
-        {
-            this.resizeRequested = true;
+        ///     Draws the display stack window.
+        /// </summary>
+        private void Window(int windowId)
+        {
+            try
+            {
+                if (this.ShowControlBar)
+                {
+                    this.DrawControlBar();
+                }
+
+                if (SectionLibrary.NumberOfStackSections > 0)
+                {
+                    this.DrawSections(SectionLibrary.StockSections);
+                    this.DrawSections(SectionLibrary.CustomSections);
+                }
+
+                GUI.DragWindow();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex, "DisplayStack->Widnow");
+            }
         }
 
         #endregion

--- a/KerbalEngineer/Flight/FlightEngineerCore.cs
+++ b/KerbalEngineer/Flight/FlightEngineerCore.cs
@@ -19,21 +19,28 @@
 
 #region Using Directives
 
-using System;
-using System.Collections.Generic;
-
-using KerbalEngineer.Flight.Readouts;
-using KerbalEngineer.Flight.Sections;
-
-using UnityEngine;
-
 #endregion
 
 namespace KerbalEngineer.Flight
 {
+    #region Using Directives
+
+    using System;
+    using System.Collections.Generic;
+    using System.Linq;
+    using Extensions;
+    using Readouts;
+    using Sections;
+    using Settings;
+    using UnityEngine;
+    using VesselSimulator;
+
+    #endregion
+
     /// <summary>
     ///     Core management system for the Flight Engineer.
     /// </summary>
+    [KSPAddon(KSPAddon.Startup.Flight, false)]
     public sealed class FlightEngineerCore : MonoBehaviour
     {
         #region Instance
@@ -45,7 +52,210 @@
 
         #endregion
 
+        #region Fields
+
+        private static bool isCareerMode = true;
+        private static bool isKerbalLimited = true;
+        private static bool isTrackingStationLimited = true;
+
+        #endregion
+
         #region Constructors
+
+        static FlightEngineerCore()
+        {
+            try
+            {
+                var handler = SettingHandler.Load("FlightEngineerCore.xml");
+                handler.Get("isCareerMode", ref isCareerMode);
+                handler.Get("isKerbalLimited", ref isKerbalLimited);
+                handler.Get("isTrackingStationLimited", ref isTrackingStationLimited);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        ///     Gets and sets whether to the Flight Engineer should be run using career limitations.
+        /// </summary>
+        public static bool IsCareerMode
+        {
+            get { return isCareerMode; }
+            set
+            {
+                try
+                {
+                    if (isCareerMode != value)
+                    {
+                        var handler = SettingHandler.Load("FlightEngineerCore.xml");
+                        handler.Set("isCareerMode", value);
+                        handler.Save("FlightEngineerCore.xml");
+                    }
+                    isCareerMode = value;
+                }
+                catch (Exception ex)
+                {
+                    Logger.Exception(ex);
+                }
+            }
+        }
+
+        /// <summary>
+        ///     Gets whether the FlightEngineer should be displayed.
+        /// </summary>
+        public static bool IsDisplayable
+        {
+            get
+            {
+                if (isCareerMode)
+                {
+                    if (isKerbalLimited && FlightGlobals.ActiveVessel.GetVesselCrew().Exists(c => c.experienceTrait.TypeName == "Engineer"))
+                    {
+                        return true;
+                    }
+                    if (isTrackingStationLimited && ScenarioUpgradeableFacilities.GetFacilityLevel(SpaceCenterFacility.TrackingStation) == 1.0f)
+                    {
+                        return true;
+                    }
+                    return FlightGlobals.ActiveVessel.parts.Any(p => p.HasModule<FlightEngineerModule>());
+                }
+
+                return true;
+            }
+        }
+
+        /// <summary>
+        ///     Gets and sets whether to the Flight Engineer should be kerbal limited.
+        /// </summary>
+        public static bool IsKerbalLimited
+        {
+            get { return isKerbalLimited; }
+            set
+            {
+                try
+                {
+                    if (isKerbalLimited != value)
+                    {
+                        var handler = SettingHandler.Load("FlightEngineerCore.xml");
+                        handler.Set("isKerbalLimited", value);
+                        handler.Save("FlightEngineerCore.xml");
+                    }
+                    isKerbalLimited = value;
+                }
+                catch (Exception ex)
+                {
+                    Logger.Exception(ex);
+                }
+            }
+        }
+
+        /// <summary>
+        ///     Gets and sets whether to the Flight Engineer should be tracking station limited.
+        /// </summary>
+        public static bool IsTrackingStationLimited
+        {
+            get { return isTrackingStationLimited; }
+            set
+            {
+                try
+                {
+                    if (isTrackingStationLimited != value)
+                    {
+                        var handler = SettingHandler.Load("FlightEngineerCore.xml");
+                        handler.Set("isTrackingStationLimited", value);
+                        handler.Save("FlightEngineerCore.xml");
+                    }
+                    isTrackingStationLimited = value;
+                }
+                catch (Exception ex)
+                {
+                    Logger.Exception(ex);
+                }
+            }
+        }
+
+        /// <summary>
+        ///     Gets the editor windows for sections with open editors.
+        /// </summary>
+        public List<SectionEditor> SectionEditors { get; private set; }
+
+        /// <summary>
+        ///     Gets the section windows for floating sections.
+        /// </summary>
+        public List<SectionWindow> SectionWindows { get; private set; }
+
+        /// <summary>
+        ///     Gets the list of currently running updatable modules.
+        /// </summary>
+        public List<IUpdatable> UpdatableModules { get; private set; }
+
+        #endregion
+
+        #region Methods
+
+        /// <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.Position = new Rect(section.EditorPositionX, section.EditorPositionY, SectionEditor.Width, SectionEditor.Height);
+                this.SectionEditors.Add(editor);
+                return editor;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+                return null;
+            }
+        }
+
+        /// <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);
+                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);
+            }
+        }
 
         /// <summary>
         ///     Create base Flight Engineer child objects.
@@ -59,11 +269,58 @@
                 this.SectionWindows = new List<SectionWindow>();
                 this.SectionEditors = new List<SectionEditor>();
                 this.UpdatableModules = new List<IUpdatable>();
+
+                SimManager.UpdateModSettings();
+
                 Logger.Log("FlightEngineerCore->Awake");
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "FlightEngineerCore->Awake");
+                Logger.Exception(ex);
+            }
+        }
+
+        /// <summary>
+        ///     Fixed update all required Flight Engineer objects.
+        /// </summary>
+        private void FixedUpdate()
+        {
+            try
+            {
+                SectionLibrary.FixedUpdate();
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        /// <summary>
+        ///     Force the destruction of child objects on core destruction.
+        /// </summary>
+        private void OnDestroy()
+        {
+            try
+            {
+                SectionLibrary.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);
             }
         }
 
@@ -80,44 +337,6 @@
             }
             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.FixedUpdate();
-            }
-            catch (Exception ex)
-            {
                 Logger.Exception(ex);
             }
         }
@@ -134,7 +353,7 @@
             }
             catch (Exception ex)
             {
-                Logger.Exception(ex, "FlightEngineerCore->Update");
+                Logger.Exception(ex);
             }
         }
 
@@ -164,102 +383,7 @@
             }
             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.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.Position = 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");
+                Logger.Exception(ex);
             }
         }
 

--- a/KerbalEngineer/Flight/FlightEngineerModule.cs
+++ b/KerbalEngineer/Flight/FlightEngineerModule.cs
@@ -19,9 +19,6 @@
 
 #region Using Directives
 
-using System;
-using System.Linq;
-
 #endregion
 
 namespace KerbalEngineer.Flight
@@ -29,73 +26,5 @@
     /// <summary>
     ///     Module that can be attached to parts, giving them FlightEngineerCore management.
     /// </summary>
-    public sealed class FlightEngineerModule : PartModule
-    {
-        #region Fields
-
-        /// <summary>
-        ///     Contains the current FlightEngineerCore through the lifespan of this part.
-        /// </summary>
-        private FlightEngineerCore flightEngineerCore;
-
-        #endregion
-
-        #region Updating
-
-        /// <summary>
-        ///     Logic to create and destroy the FlightEngineerCore.
-        /// </summary>
-        private void Update()
-        {
-            try
-            {
-                if (!HighLogic.LoadedSceneIsFlight || FlightEngineerPartless.IsPartless)
-                {
-                    return;
-                }
-
-                if (this.vessel == FlightGlobals.ActiveVessel)
-                {
-                    // Checks for an existing instance of FlightEngineerCore, and if this part is the first part containing FlightEngineerModule within the vessel.
-                    if (flightEngineerCore == null && this.part == this.vessel.parts.FirstOrDefault(p => p.Modules.Contains("FlightEngineerModule")))
-                    {
-                        this.flightEngineerCore = this.gameObject.AddComponent<FlightEngineerCore>();
-                    }
-                }
-                else if (flightEngineerCore != null)
-                {
-                    // Using DestroyImmediate to force early destruction and keep saving/loading in synch when switching vessels.
-                    DestroyImmediate(flightEngineerCore);
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FlightEngineerModule->Update");
-            }
-        }
-
-        #endregion
-
-        #region Destruction
-
-        /// <summary>
-        ///     Force the destruction of the FlightEngineerCore on part destruction.
-        /// </summary>
-        private void OnDestroy()
-        {
-            try
-            {
-                if (flightEngineerCore != null)
-                {
-                    DestroyImmediate(flightEngineerCore);
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FlightEngineerModule->OnDestroy");
-            }
-        }
-
-        #endregion
-    }
+    public class FlightEngineerModule : PartModule { }
 }

--- a/KerbalEngineer/Flight/FlightEngineerPartless.cs
+++ /dev/null
@@ -1,102 +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.Settings;
-
-using UnityEngine;
-
-#endregion
-
-namespace KerbalEngineer.Flight
-{
-    [KSPAddon(KSPAddon.Startup.Flight, false)]
-    public class FlightEngineerPartless : MonoBehaviour
-    {
-        #region Fields
-
-        private FlightEngineerCore flightEngineerCore;
-
-        #endregion
-
-        #region Initialisation
-
-        static FlightEngineerPartless()
-        {
-            try
-            {
-                var handler = SettingHandler.Load("FlightEngineerPartless.xml");
-                handler.Get("isPartless", ref isPartless);
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FlightEngineerPartless->FlightEngineerPartless");
-            }
-        }
-
-        private void Awake()
-        {
-            try
-            {
-                if (isPartless)
-                {
-                    this.flightEngineerCore = this.gameObject.AddComponent<FlightEngineerCore>();
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.Exception(ex, "FlightEngineerPartless->Awake");
-            }
-        }
-
-        #endregion
-
-        #region Properties
-
-        private static bool isPartless = true;
-
-        public static bool IsPartless
-        {
-            get { return isPartless; }
-            set
-            {
-                try
-                {
-                    if (isPartless != value)
-                    {
-                        var handler = SettingHandler.Load("FlightEngineerPartless.xml");
-                        handler.Set("isPartless", value);
-                        handler.Save("FlightEngineerPartless.xml");
-                    }
-                    isPartless = value;
-                    Logger.Log("FlightEngineerPartless->IsPartless = " + value);
-                }
-                catch (Exception ex)
-                {
-                    Logger.Exception(ex, "FlightEngineerPartless->IsPartless");
-                }
-            }
-        }
-
-        #endregion
-    }
-}

--- a/KerbalEngineer/Flight/Presets/Preset.cs
+++ b/KerbalEngineer/Flight/Presets/Preset.cs
@@ -37,6 +37,10 @@
             get { return Regex.Replace(this.Name, @"[^\d\w]", string.Empty) + ".xml"; }
         }
 
+        public bool IsHud { get; set; }
+
+        public bool IsHudBackground { get; set; }
+
         public string Name { get; set; }
 
         public string[] ReadoutNames { get; set; }

--- a/KerbalEngineer/Flight/Readouts/Miscellaneous/GuiSizeAdjustor.cs
+++ b/KerbalEngineer/Flight/Readouts/Miscellaneous/GuiSizeAdjustor.cs
@@ -17,12 +17,20 @@
 //     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 // 
 
+#region Using Directives
+
+using KerbalEngineer.Flight.Sections;
+
 using UnityEngine;
+
+#endregion
 
 namespace KerbalEngineer.Flight.Readouts.Miscellaneous
 {
     public class GuiSizeAdjustor : ReadoutModule
     {
+        #region Constructors
+
         public GuiSizeAdjustor()
         {
             this.Name = "GUI Size Adjustor";
@@ -31,7 +39,11 @@
             this.IsDefault = false;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
             GUILayout.BeginHorizontal();
             GUILayout.Label("GUI Size: " + GuiDisplaySize.Increment, this.NameStyle);
@@ -45,5 +57,7 @@
             }
             GUILayout.EndHorizontal();
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Miscellaneous/Separator.cs
+++ b/KerbalEngineer/Flight/Readouts/Miscellaneous/Separator.cs
@@ -19,6 +19,11 @@
 
 #region Using Directives
 
+using System;
+
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
+
 using UnityEngine;
 
 #endregion
@@ -27,25 +32,59 @@
 {
     public class Separator : ReadoutModule
     {
-        private readonly Texture2D texture;
+        #region Fields
+
+        private GUIStyle boxStyle;
+        private GUIStyle boxStyleHud;
+
+        #endregion
+
+        #region Constructors
 
         public Separator()
         {
             this.Name = "Separator";
             this.Category = ReadoutCategory.GetCategory("Miscellaneous");
-            this.HelpString = string.Empty;
+            this.HelpString = String.Empty;
             this.IsDefault = false;
             this.Cloneable = true;
 
-            this.texture = new Texture2D(1, 1, TextureFormat.RGBA32, false);
-            this.texture.SetPixel(0, 0, new Color(1.0f, 1.0f, 1.0f, 0.5f));
-            this.texture.Apply();
+            this.InitialiseStyles();
+
+            GuiDisplaySize.OnSizeChanged += this.InitialiseStyles;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            GUILayout.Box(string.Empty, GUIStyle.none, new[] {GUILayout.Width(this.ContentWidth), GUILayout.Height(1.0f)});
-            GUI.DrawTexture(GUILayoutUtility.GetLastRect(), this.texture, ScaleMode.StretchToFill);
+            GUILayout.Box(String.Empty, section.IsHud ? this.boxStyleHud : this.boxStyle);
         }
+
+        #endregion
+
+        #region Methods: private
+
+        private void InitialiseStyles()
+        {
+            this.boxStyle = new GUIStyle
+            {
+                normal =
+                {
+                    background = TextureHelper.CreateTextureFromColour(new Color(1.0f, 1.0f, 1.0f, 0.5f))
+                },
+                fixedHeight = 1.0f,
+                stretchWidth = true
+            };
+
+            this.boxStyleHud = new GUIStyle(this.boxStyle)
+            {
+                margin = new RectOffset(0, 0, (int)(8 * GuiDisplaySize.Offset), 0)
+            };
+        }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Miscellaneous/SimulationDelay.cs
+++ b/KerbalEngineer/Flight/Readouts/Miscellaneous/SimulationDelay.cs
@@ -19,6 +19,7 @@
 
 #region Using Directives
 
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.VesselSimulator;
 
 using UnityEngine;
@@ -27,8 +28,12 @@
 
 namespace KerbalEngineer.Flight.Readouts.Miscellaneous
 {
+    using System;
+
     public class SimulationDelay : ReadoutModule
     {
+        #region Constructors
+
         public SimulationDelay()
         {
             this.Name = "Minimum Simulation Delay";
@@ -37,14 +42,20 @@
             this.IsDefault = true;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
             GUILayout.BeginHorizontal();
             GUILayout.Label("Sim Delay", this.NameStyle);
             GUI.skin = HighLogic.Skin;
-            SimManager.minSimTime = (long)GUILayout.HorizontalSlider(SimManager.minSimTime, 0, 1000.0f);
+            SimManager.minSimTime = new TimeSpan(0, 0, 0, 0, (int)GUILayout.HorizontalSlider(SimManager.minSimTime.Milliseconds, 0, 1000.0f));
             GUI.skin = null;
             GUILayout.EndHorizontal();
         }
+
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Miscellaneous/SystemTime.cs
@@ -1,1 +1,59 @@
+// 
+//     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.Flight.Sections;
+using KerbalEngineer.Helpers;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Miscellaneous
+{
+    public class SystemTime : ReadoutModule
+    {
+
+
+        #region Constructors
+
+        public SystemTime()
+        {
+            this.Name = "System Time";
+            this.Category = ReadoutCategory.GetCategory("Miscellaneous");
+            this.HelpString = String.Empty;
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            this.DrawLine(DateTime.Now.ToLongTimeString(), section.IsHud);
+        }
+
+        #endregion
+
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Miscellaneous/TimeReference.cs
+++ b/KerbalEngineer/Flight/Readouts/Miscellaneous/TimeReference.cs
@@ -21,6 +21,7 @@
 
 using System;
 
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 using UnityEngine;
@@ -45,7 +46,7 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             GUILayout.BeginHorizontal();
             GUILayout.Label("Time Ref.: " + TimeFormatter.Reference, this.NameStyle);

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Miscellaneous/VectoredThrustToggle.cs
@@ -1,1 +1,56 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+namespace KerbalEngineer.Flight.Readouts.Miscellaneous
+{
+    #region Using Directives
+
+    using Sections;
+    using UnityEngine;
+    using VesselSimulator;
+
+    #endregion
+
+    public class VectoredThrustToggle : ReadoutModule
+    {
+        #region Constructors
+
+        public VectoredThrustToggle()
+        {
+            this.Name = "Vectored Thrust";
+            this.Category = ReadoutCategory.GetCategory("Miscellaneous");
+            this.HelpString = "Shows a control that will allow you to adjust whether the vessel simulation should account for vectored thrust.";
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods
+
+        public override void Draw(SectionModule section)
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Label("Vectored Thrust: ", this.NameStyle);
+            SimManager.vectoredThrust = GUILayout.Toggle(SimManager.vectoredThrust, "ENABLED", this.ButtonStyle);
+            GUILayout.EndHorizontal();
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Orbital/AngleToEquatorialAscendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/AngleToEquatorialAscendingNode.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,17 +28,25 @@
 {
     public class AngleToEquatorialAscendingNode : ReadoutModule
     {
+        #region Constructors
+
         public AngleToEquatorialAscendingNode()
         {
             this.Name = "Angle to Equ. AN";
             this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ActiveVessel.orbit.GetAngleToAscendingNode().ToAngle());
+            this.DrawLine(FlightGlobals.ActiveVessel.orbit.GetAngleToAscendingNode().ToAngle(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/AngleToEquatorialDescendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/AngleToEquatorialDescendingNode.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,17 +28,25 @@
 {
     public class AngleToEquatorialDescendingNode : ReadoutModule
     {
+        #region Constructors
+
         public AngleToEquatorialDescendingNode()
         {
             this.Name = "Angle to Equ. DN";
             this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ActiveVessel.orbit.GetAngleToDescendingNode().ToAngle());
+            this.DrawLine(FlightGlobals.ActiveVessel.orbit.GetAngleToDescendingNode().ToAngle(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/AngleToPrograde.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/AngleToPrograde.cs
@@ -22,6 +22,7 @@
 using System;
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -43,9 +44,9 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_orbit.GetAngleToPrograde().ToAngle());
+            this.DrawLine(FlightGlobals.ship_orbit.GetAngleToPrograde().ToAngle(), section.IsHud);
         }
 
         #endregion

--- a/KerbalEngineer/Flight/Readouts/Orbital/AngleToRetrograde.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/AngleToRetrograde.cs
@@ -22,6 +22,7 @@
 using System;
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -43,9 +44,9 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_orbit.GetAngleToRetrograde().ToAngle());
+            this.DrawLine(FlightGlobals.ship_orbit.GetAngleToRetrograde().ToAngle(), section.IsHud);
         }
 
         #endregion

--- a/KerbalEngineer/Flight/Readouts/Orbital/ApoapsisHeight.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ApoapsisHeight.cs
@@ -17,12 +17,19 @@
 //     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 // 
 
+#region Using Directives
+
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+
+#endregion
 
 namespace KerbalEngineer.Flight.Readouts.Orbital
 {
     public class ApoapsisHeight : ReadoutModule
     {
+        #region Constructors
+
         public ApoapsisHeight()
         {
             this.Name = "Apoapsis Height";
@@ -31,9 +38,15 @@
             this.IsDefault = true;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_orbit.ApA.ToDistance());
+            this.DrawLine(FlightGlobals.ship_orbit.ApA.ToDistance(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/ArgumentOfPeriapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ArgumentOfPeriapsis.cs
@@ -22,6 +22,7 @@
 using System;
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -29,17 +30,25 @@
 {
     public class ArgumentOfPeriapsis : ReadoutModule
     {
+        #region Constructors
+
         public ArgumentOfPeriapsis()
         {
             this.Name = "Arg. Of Periapsis";
             this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = String.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_orbit.argumentOfPeriapsis.ToAngle());
+            this.DrawLine(FlightGlobals.ship_orbit.argumentOfPeriapsis.ToAngle(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/CurrentSoi.cs
@@ -1,1 +1,57 @@
+// 
+//     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.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital
+{
+    public class CurrentSoi : ReadoutModule
+    {
+        #region Constructors
+        
+        public CurrentSoi()
+        {
+            this.Name = "Current SOI";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = "Shows the SOI of the current body the vessel is orbiting.";
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!Double.IsInfinity(FlightGlobals.currentMainBody.sphereOfInfluence))
+            {
+                this.DrawLine(FlightGlobals.currentMainBody.sphereOfInfluence.ToDistance(), section.IsHud);
+            }
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Orbital/EccentricAnomaly.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/EccentricAnomaly.cs
@@ -22,6 +22,7 @@
 using System;
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -29,17 +30,25 @@
 {
     public class EccentricAnomaly : ReadoutModule
     {
+        #region Constructors
+
         public EccentricAnomaly()
         {
             this.Name = "Eccentric Anomaly";
             this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = String.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_orbit.eccentricAnomaly.ToAngle());
+            this.DrawLine(FlightGlobals.ship_orbit.eccentricAnomaly.ToAngle(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/Eccentricity.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/Eccentricity.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,6 +27,8 @@
 {
     public class Eccentricity : ReadoutModule
     {
+        #region Constructors
+
         public Eccentricity()
         {
             this.Name = "Eccentricity";
@@ -35,9 +37,15 @@
             this.IsDefault = true;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_orbit.eccentricity.ToString("F3"));
+            this.DrawLine(FlightGlobals.ship_orbit.eccentricity.ToString("F3"), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/Inclination.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/Inclination.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,6 +28,8 @@
 {
     public class Inclination : ReadoutModule
     {
+        #region Constructors
+
         public Inclination()
         {
             this.Name = "Inclination";
@@ -35,9 +38,15 @@
             this.IsDefault = true;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_orbit.inclination.ToAngle());
+            this.DrawLine(FlightGlobals.ship_orbit.inclination.ToAngle(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/LongitudeOfAscendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/LongitudeOfAscendingNode.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,17 +28,25 @@
 {
     public class LongitudeOfAscendingNode : ReadoutModule
     {
+        #region Constructors
+
         public LongitudeOfAscendingNode()
         {
             this.Name = "Longitude of AN";
             this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = "Shows the vessel's longitude of the ascending node.";
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_orbit.LAN.ToAngle());
+            this.DrawLine(FlightGlobals.ship_orbit.LAN.ToAngle(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/LongitudeOfPeriapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/LongitudeOfPeriapsis.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,17 +28,25 @@
 {
     public class LongitudeOfPeriapsis : ReadoutModule
     {
+        #region Constructors
+
         public LongitudeOfPeriapsis()
         {
             this.Name = "Longitude of Pe";
             this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = "Shows the vessel's longitude of periapsis.";
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine((FlightGlobals.ship_orbit.LAN + FlightGlobals.ship_orbit.argumentOfPeriapsis).ToAngle());
+            this.DrawLine((FlightGlobals.ship_orbit.LAN + FlightGlobals.ship_orbit.argumentOfPeriapsis).ToAngle(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ManoeuvreNode/ManoeuvreProcessor.cs
@@ -1,1 +1,188 @@
+// 
+//     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.Vessel;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital.ManoeuvreNode
+{
+    public class ManoeuvreProcessor : IUpdatable, IUpdateRequest
+    {
+        #region Fields
+
+        private static readonly ManoeuvreProcessor instance = new ManoeuvreProcessor();
+
+        #endregion
+
+        #region Properties
+
+        public static double AngleToPrograde { get; private set; }
+
+        public static double AngleToRetrograde { get; private set; }
+
+        public static double AvailableDeltaV { get; private set; }
+
+        public static double BurnTime { get; private set; }
+
+        public static int FinalStage { get; private set; }
+
+        public static double HalfBurnTime { get; private set; }
+
+        public static bool HasDeltaV { get; private set; }
+
+        public static ManoeuvreProcessor Instance
+        {
+            get { return instance; }
+        }
+
+        public static double NormalDeltaV { get; private set; }
+
+        public static double ProgradeDeltaV { get; private set; }
+
+        public static double RadialDeltaV { get; private set; }
+
+        public static bool ShowDetails { get; set; }
+
+        public static double TotalDeltaV { get; private set; }
+
+        public static double UniversalTime { get; private set; }
+
+        public bool UpdateRequested { get; set; }
+
+        #endregion
+
+        #region Methods: public
+
+        public static void RequestUpdate()
+        {
+            instance.UpdateRequested = true;
+            SimulationProcessor.RequestUpdate();
+        }
+
+        public static void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+            FlightEngineerCore.Instance.AddUpdatable(instance);
+        }
+
+        public void Update()
+        {
+            // Extra tests for low level tracking station not supporting patched conics and maneuver nodes
+            if (FlightGlobals.ActiveVessel.patchedConicSolver == null ||
+                FlightGlobals.ActiveVessel.patchedConicSolver.maneuverNodes == null ||
+                FlightGlobals.ActiveVessel.patchedConicSolver.maneuverNodes.Count == 0 ||
+                !SimulationProcessor.ShowDetails)
+            {
+                ShowDetails = false;
+                return;
+            }
+
+            var node = FlightGlobals.ActiveVessel.patchedConicSolver.maneuverNodes[0];
+            var deltaV = node.DeltaV;
+
+            ProgradeDeltaV = deltaV.z;
+            NormalDeltaV = deltaV.y;
+            RadialDeltaV = deltaV.x;
+            TotalDeltaV = node.GetBurnVector(FlightGlobals.ship_orbit).magnitude;
+
+            UniversalTime = FlightGlobals.ActiveVessel.patchedConicSolver.maneuverNodes[0].UT;
+            AngleToPrograde = FlightGlobals.ActiveVessel.patchedConicSolver.maneuverNodes[0].patch.GetAngleToPrograde(UniversalTime);
+            AngleToRetrograde = FlightGlobals.ActiveVessel.patchedConicSolver.maneuverNodes[0].patch.GetAngleToRetrograde(UniversalTime);
+
+            var burnTime = 0.0;
+            var midPointTime = 0.0;
+            HasDeltaV = GetBurnTime(TotalDeltaV, ref burnTime, ref midPointTime);
+            AvailableDeltaV = SimulationProcessor.LastStage.totalDeltaV;
+
+            BurnTime = burnTime;
+            HalfBurnTime = midPointTime;
+
+            ShowDetails = true;
+        }
+
+        #endregion
+
+        #region Methods: private
+
+        private static bool GetBurnTime(double deltaV, ref double burnTime, ref double midPointTime)
+        {
+            var setMidPoint = false;
+            var deltaVMidPoint = deltaV * 0.5;
+
+            for (var i = SimulationProcessor.Stages.Length - 1; i > -1; i--)
+            {
+                var stage = SimulationProcessor.Stages[i];
+                var stageDeltaV = stage.deltaV;
+                var startMass = stage.totalMass;
+
+                ProcessStageDrain:
+                if (deltaV <= Double.Epsilon)
+                {
+                    break;
+                }
+                if (stageDeltaV <= Double.Epsilon)
+                {
+                    continue;
+                }
+
+                FinalStage = i;
+
+                double deltaVDrain;
+                if (deltaVMidPoint > 0.0)
+                {
+                    deltaVDrain = deltaV.Clamp(0.0, stageDeltaV.Clamp(0.0, deltaVMidPoint));
+                    deltaVMidPoint -= deltaVDrain;
+                    setMidPoint = deltaVMidPoint <= Double.Epsilon;
+                }
+                else
+                {
+                    deltaVDrain = deltaV.Clamp(0.0, stageDeltaV);
+                }
+
+                var exhaustVelocity = stage.isp * 9.82;
+                var flowRate = stage.thrust / exhaustVelocity;
+                var endMass = Math.Exp(Math.Log(startMass) - deltaVDrain / exhaustVelocity);
+                var deltaMass = (startMass - endMass) * Math.Exp(-(deltaVDrain * 0.001) / exhaustVelocity);
+                burnTime += deltaMass / flowRate;
+
+                deltaV -= deltaVDrain;
+                stageDeltaV -= deltaVDrain;
+                startMass -= deltaMass;
+
+                if (setMidPoint)
+                {
+                    midPointTime = burnTime;
+                    setMidPoint = false;
+                    goto ProcessStageDrain;
+                }
+            }
+            return deltaV <= Double.Epsilon;
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ManoeuvreNode/NodeAngleToPrograde.cs
@@ -1,1 +1,69 @@
+// 
+//     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.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital.ManoeuvreNode
+{
+    public class NodeAngleToPrograde : ReadoutModule
+    {
+        #region Constructors
+
+        public NodeAngleToPrograde()
+        {
+            this.Name = "Manoeuvre Node Angle to Prograde";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = String.Empty;
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!ManoeuvreProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine("Node Angle to Prograde", ManoeuvreProcessor.AngleToPrograde.ToAngle(), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            ManoeuvreProcessor.Reset();
+        }
+
+        public override void Update()
+        {
+            ManoeuvreProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ManoeuvreNode/NodeAngleToRetrograde.cs
@@ -1,1 +1,69 @@
+// 
+//     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.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital.ManoeuvreNode
+{
+    public class NodeAngleToRetrograde : ReadoutModule
+    {
+        #region Constructors
+
+        public NodeAngleToRetrograde()
+        {
+            this.Name = "Manoeuvre Node Angle to Retrograde";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = String.Empty;
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!ManoeuvreProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine("Node Angle to Retrograde", ManoeuvreProcessor.AngleToRetrograde.ToAngle(), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            ManoeuvreProcessor.Reset();
+        }
+
+        public override void Update()
+        {
+            ManoeuvreProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ManoeuvreNode/NodeBurnTime.cs
@@ -1,1 +1,69 @@
+// 
+//     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.Flight.Sections;
+using KerbalEngineer.Helpers;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital.ManoeuvreNode
+{
+    public class NodeBurnTime : ReadoutModule
+    {
+        #region Constructors
+
+        public NodeBurnTime()
+        {
+            this.Name = "Manoeuvre Node Burn Time";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = String.Empty;
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!ManoeuvreProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine("Node Burn Time", TimeFormatter.ConvertToString(ManoeuvreProcessor.BurnTime), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            ManoeuvreProcessor.Reset();
+        }
+
+        public override void Update()
+        {
+            ManoeuvreProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ManoeuvreNode/NodeHalfBurnTime.cs
@@ -1,1 +1,69 @@
+// 
+//     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.Flight.Sections;
+using KerbalEngineer.Helpers;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital.ManoeuvreNode
+{
+    public class NodeHalfBurnTime : ReadoutModule
+    {
+        #region Constructors
+
+        public NodeHalfBurnTime()
+        {
+            this.Name = "Manoeuvre Node Half Burn Time";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = String.Empty;
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!ManoeuvreProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine("Node Burn Time (½)", TimeFormatter.ConvertToString(ManoeuvreProcessor.HalfBurnTime), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            ManoeuvreProcessor.Reset();
+        }
+
+        public override void Update()
+        {
+            ManoeuvreProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ManoeuvreNode/NodeNormalDeltaV.cs
@@ -1,1 +1,69 @@
+// 
+//     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.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital.ManoeuvreNode
+{
+    public class NodeNormalDeltaV : ReadoutModule
+    {
+        #region Constructors
+
+        public NodeNormalDeltaV()
+        {
+            this.Name = "Manoeuvre Node DeltaV (Normal)";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = String.Empty;
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!ManoeuvreProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine("Node DeltaV (Normal)", ManoeuvreProcessor.NormalDeltaV.ToSpeed(), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            ManoeuvreProcessor.Reset();
+        }
+
+        public override void Update()
+        {
+            ManoeuvreProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ManoeuvreNode/NodeProgradeDeltaV.cs
@@ -1,1 +1,69 @@
+// 
+//     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.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital.ManoeuvreNode
+{
+    public class NodeProgradeDeltaV : ReadoutModule
+    {
+        #region Constructors
+
+        public NodeProgradeDeltaV()
+        {
+            this.Name = "Manoeuvre Node DeltaV (Prograde)";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = String.Empty;
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!ManoeuvreProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine("Node DeltaV (Prograde)", ManoeuvreProcessor.ProgradeDeltaV.ToSpeed(), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            ManoeuvreProcessor.Reset();
+        }
+
+        public override void Update()
+        {
+            ManoeuvreProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ManoeuvreNode/NodeRadialDeltaV.cs
@@ -1,1 +1,69 @@
+// 
+//     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.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital.ManoeuvreNode
+{
+    public class NodeRadialDeltaV : ReadoutModule
+    {
+        #region Constructors
+
+        public NodeRadialDeltaV()
+        {
+            this.Name = "Manoeuvre Node DeltaV (Radial)";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = String.Empty;
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!ManoeuvreProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine("Node DeltaV (Radial)", ManoeuvreProcessor.RadialDeltaV.ToSpeed(), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            ManoeuvreProcessor.Reset();
+        }
+
+        public override void Update()
+        {
+            ManoeuvreProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ManoeuvreNode/NodeTimeToHalfBurn.cs
@@ -1,1 +1,69 @@
+// 
+//     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.Flight.Sections;
+using KerbalEngineer.Helpers;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital.ManoeuvreNode
+{
+    public class NodeTimeToHalfBurn : ReadoutModule
+    {
+        #region Constructors
+
+        public NodeTimeToHalfBurn()
+        {
+            this.Name = "Time to Manoeuvre Burn";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = String.Empty;
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!ManoeuvreProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine("Time to Node Burn", TimeFormatter.ConvertToString(ManoeuvreProcessor.UniversalTime - ManoeuvreProcessor.HalfBurnTime - Planetarium.GetUniversalTime()), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            ManoeuvreProcessor.Reset();
+        }
+
+        public override void Update()
+        {
+            ManoeuvreProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ManoeuvreNode/NodeTimeToManoeuvre.cs
@@ -1,1 +1,69 @@
+// 
+//     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.Flight.Sections;
+using KerbalEngineer.Helpers;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital.ManoeuvreNode
+{
+    public class NodeTimeToManoeuvre : ReadoutModule
+    {
+        #region Constructors
+
+        public NodeTimeToManoeuvre()
+        {
+            this.Name = "Time to Manoeuvre Node";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = String.Empty;
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!ManoeuvreProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine("Time to Node", TimeFormatter.ConvertToString(ManoeuvreProcessor.UniversalTime - Planetarium.GetUniversalTime()), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            ManoeuvreProcessor.Reset();
+        }
+
+        public override void Update()
+        {
+            ManoeuvreProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/ManoeuvreNode/NodeTotalDeltaV.cs
@@ -1,1 +1,69 @@
+// 
+//     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.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital.ManoeuvreNode
+{
+    public class NodeTotalDeltaV : ReadoutModule
+    {
+        #region Constructors
+
+        public NodeTotalDeltaV()
+        {
+            this.Name = "Manoeuvre Node DeltaV (Total)";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = String.Empty;
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!ManoeuvreProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine("Node DeltaV (Total)", ManoeuvreProcessor.TotalDeltaV.ToSpeed() + " (" + (ManoeuvreProcessor.HasDeltaV ? "S" + ManoeuvreProcessor.FinalStage : "X") + ")", section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            ManoeuvreProcessor.Reset();
+        }
+
+        public override void Update()
+        {
+            ManoeuvreProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Orbital/MeanAnomaly.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/MeanAnomaly.cs
@@ -22,6 +22,7 @@
 using System;
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -29,17 +30,25 @@
 {
     public class MeanAnomaly : ReadoutModule
     {
+        #region Constructors
+
         public MeanAnomaly()
         {
             this.Name = "Mean Anomaly";
             this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = String.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_orbit.meanAnomaly.ToAngle());
+            this.DrawLine(FlightGlobals.ship_orbit.meanAnomaly.ToAngle(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/MeanAnomalyAtEpoc.cs
@@ -1,1 +1,54 @@
+// 
+//     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.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital
+{
+    public class MeanAnomalyAtEpoc : ReadoutModule
+    {
+        #region Constructors
+
+        public MeanAnomalyAtEpoc()
+        {
+            this.Name = "Mean Anomaly at Epoc";
+            this.Category = ReadoutCategory.GetCategory("Orbital");
+            this.HelpString = String.Empty;
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            this.DrawLine(FlightGlobals.ship_orbit.meanAnomalyAtEpoch.ToAngle(), section.IsHud);
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Orbital/OrbitalPeriod.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/OrbitalPeriod.cs
@@ -19,6 +19,7 @@
 
 #region Using Directives
 
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -34,16 +35,16 @@
             this.Name = "Orbital Period";
             this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = "Shows the amount of time it will take to complete a full orbit.";
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ship_orbit.period, "F3"));
+            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ship_orbit.period, "F3"), section.IsHud);
         }
 
         #endregion

--- a/KerbalEngineer/Flight/Readouts/Orbital/OrbitalSpeed.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/OrbitalSpeed.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,17 +28,25 @@
 {
     public class OrbitalSpeed : ReadoutModule
     {
+        #region Constructors
+
         public OrbitalSpeed()
         {
             this.Name = "Orbital Speed";
             this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = "Shows the vessel's orbital speed.";
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_obtSpeed.ToSpeed());
+            this.DrawLine(FlightGlobals.ship_obtSpeed.ToSpeed(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/PeriapsisHeight.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/PeriapsisHeight.cs
@@ -17,12 +17,19 @@
 //     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 // 
 
+#region Using Directives
+
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+
+#endregion
 
 namespace KerbalEngineer.Flight.Readouts.Orbital
 {
     public class PeriapsisHeight : ReadoutModule
     {
+        #region Constructors
+
         public PeriapsisHeight()
         {
             this.Name = "Periapsis Height";
@@ -31,9 +38,15 @@
             this.IsDefault = true;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_orbit.PeA.ToDistance());
+            this.DrawLine(FlightGlobals.ship_orbit.PeA.ToDistance(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Orbital/SemiMajorAxis.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/SemiMajorAxis.cs
@@ -19,7 +19,8 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -41,9 +42,9 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_orbit.semiMajorAxis.ToDistance("N3"));
+            this.DrawLine(Units.ToDistance(FlightGlobals.ship_orbit.semiMajorAxis, 3), section.IsHud);
         }
 
         #endregion

--- a/KerbalEngineer/Flight/Readouts/Orbital/SemiMinorAxis.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/SemiMinorAxis.cs
@@ -19,7 +19,8 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -34,16 +35,16 @@
             this.Name = "Semi-minor Axis";
             this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = "Shows the distance from the centre of an orbit to the nearest edge.";
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_orbit.semiMinorAxis.ToDistance("N3"));
+            this.DrawLine(Units.ToDistance(FlightGlobals.ship_orbit.semiMinorAxis, 3), section.IsHud);
         }
 
         #endregion

--- a/KerbalEngineer/Flight/Readouts/Orbital/TimeToApoapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/TimeToApoapsis.cs
@@ -19,6 +19,7 @@
 
 #region Using Directives
 
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -41,9 +42,9 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ship_orbit.timeToAp));
+            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ship_orbit.timeToAp), section.IsHud);
         }
 
         #endregion

--- a/KerbalEngineer/Flight/Readouts/Orbital/TimeToEquatorialAscendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/TimeToEquatorialAscendingNode.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -35,16 +36,16 @@
             this.Name = "Time to Equ. AN";
             this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ActiveVessel.orbit.GetTimeToAscendingNode()));
+            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ActiveVessel.orbit.GetTimeToAscendingNode()), section.IsHud);
         }
 
         #endregion

--- a/KerbalEngineer/Flight/Readouts/Orbital/TimeToEquatorialDescendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/TimeToEquatorialDescendingNode.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -35,16 +36,16 @@
             this.Name = "Time to Equ. DN";
             this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ActiveVessel.orbit.GetTimeToDescendingNode()));
+            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ActiveVessel.orbit.GetTimeToDescendingNode()), section.IsHud);
         }
 
         #endregion

--- a/KerbalEngineer/Flight/Readouts/Orbital/TimeToPeriapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/TimeToPeriapsis.cs
@@ -19,6 +19,7 @@
 
 #region Using Directives
 
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -41,9 +42,9 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ship_orbit.timeToPe));
+            this.DrawLine(TimeFormatter.ConvertToString(FlightGlobals.ship_orbit.timeToPe), section.IsHud);
         }
 
         #endregion

--- a/KerbalEngineer/Flight/Readouts/Orbital/TrueAnomaly.cs
+++ b/KerbalEngineer/Flight/Readouts/Orbital/TrueAnomaly.cs
@@ -22,6 +22,7 @@
 using System;
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -29,17 +30,25 @@
 {
     public class TrueAnomaly : ReadoutModule
     {
+        #region Constructors
+
         public TrueAnomaly()
         {
             this.Name = "True Anomaly";
             this.Category = ReadoutCategory.GetCategory("Orbital");
             this.HelpString = String.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_orbit.trueAnomaly.ToAngle());
+            this.DrawLine(FlightGlobals.ship_orbit.trueAnomaly.ToAngle(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/ReadoutCategory.cs
+++ b/KerbalEngineer/Flight/Readouts/ReadoutCategory.cs
@@ -31,11 +31,6 @@
     {
         #region Constructors
 
-        static ReadoutCategory()
-        {
-            Categories = new List<ReadoutCategory>();
-        }
-
         public ReadoutCategory(string name)
         {
             this.Name = name;
@@ -47,6 +42,11 @@
             this.Description = description;
         }
 
+        static ReadoutCategory()
+        {
+            Categories = new List<ReadoutCategory>();
+        }
+
         #endregion
 
         #region Properties
@@ -55,9 +55,9 @@
 
         public static ReadoutCategory Selected { get; set; }
 
+        public string Description { get; set; }
+
         public string Name { get; set; }
-
-        public string Description { get; set; }
 
         #endregion
 

--- a/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs
+++ b/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs
@@ -17,32 +17,31 @@
 //     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 // 
 
-#region Using Directives
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-using KerbalEngineer.Flight.Readouts.Miscellaneous;
-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 SemiMajorAxis = KerbalEngineer.Flight.Readouts.Orbital.SemiMajorAxis;
-using SemiMinorAxis = KerbalEngineer.Flight.Readouts.Orbital.SemiMinorAxis;
-using TimeToApoapsis = KerbalEngineer.Flight.Readouts.Orbital.TimeToApoapsis;
-using TimeToPeriapsis = KerbalEngineer.Flight.Readouts.Orbital.TimeToPeriapsis;
-
-#endregion
-
 namespace KerbalEngineer.Flight.Readouts
 {
+    #region Using Directives
+
+    using System;
+    using System.Collections.Generic;
+    using System.Linq;
+    using Miscellaneous;
+    using Orbital;
+    using Orbital.ManoeuvreNode;
+    using Rendezvous;
+    using Settings;
+    using Surface;
+    using Vessel;
+    using AltitudeSeaLevel = Surface.AltitudeSeaLevel;
+    using ApoapsisHeight = Orbital.ApoapsisHeight;
+    using OrbitalPeriod = Orbital.OrbitalPeriod;
+    using PeriapsisHeight = Orbital.PeriapsisHeight;
+    using SemiMajorAxis = Orbital.SemiMajorAxis;
+    using SemiMinorAxis = Orbital.SemiMinorAxis;
+    using TimeToApoapsis = Orbital.TimeToApoapsis;
+    using TimeToPeriapsis = Orbital.TimeToPeriapsis;
+
+    #endregion
+
     public static class ReadoutLibrary
     {
         #region Fields
@@ -65,6 +64,7 @@
                 ReadoutCategory.SetCategory("Vessel", "Vessel performance statistics.");
                 ReadoutCategory.SetCategory("Rendezvous", "Readouts for rendezvous manovoeures.");
                 ReadoutCategory.SetCategory("Miscellaneous", "Miscellaneous readouts.");
+                ReadoutCategory.Selected = ReadoutCategory.GetCategory("Orbital");
 
                 // Orbital
                 readouts.Add(new ApoapsisHeight());
@@ -79,28 +79,43 @@
                 readouts.Add(new Eccentricity());
                 readouts.Add(new OrbitalSpeed());
                 readouts.Add(new OrbitalPeriod());
+                readouts.Add(new CurrentSoi());
                 readouts.Add(new LongitudeOfAscendingNode());
                 readouts.Add(new LongitudeOfPeriapsis());
                 readouts.Add(new ArgumentOfPeriapsis());
                 readouts.Add(new TrueAnomaly());
                 readouts.Add(new MeanAnomaly());
+                readouts.Add(new MeanAnomalyAtEpoc());
                 readouts.Add(new EccentricAnomaly());
                 readouts.Add(new SemiMajorAxis());
                 readouts.Add(new SemiMinorAxis());
                 readouts.Add(new AngleToPrograde());
                 readouts.Add(new AngleToRetrograde());
+                readouts.Add(new NodeProgradeDeltaV());
+                readouts.Add(new NodeNormalDeltaV());
+                readouts.Add(new NodeRadialDeltaV());
+                readouts.Add(new NodeTotalDeltaV());
+                readouts.Add(new NodeBurnTime());
+                readouts.Add(new NodeHalfBurnTime());
+                readouts.Add(new NodeTimeToManoeuvre());
+                readouts.Add(new NodeTimeToHalfBurn());
+                readouts.Add(new NodeAngleToPrograde());
+                readouts.Add(new NodeAngleToRetrograde());
 
                 // Surface
                 readouts.Add(new AltitudeSeaLevel());
                 readouts.Add(new AltitudeTerrain());
                 readouts.Add(new VerticalSpeed());
+                readouts.Add(new VerticalAcceleration());
                 readouts.Add(new HorizontalSpeed());
+                readouts.Add(new HorizontalAcceleration());
+                readouts.Add(new Latitude());
                 readouts.Add(new Longitude());
-                readouts.Add(new Latitude());
                 readouts.Add(new GeeForce());
                 readouts.Add(new TerminalVelocity());
                 readouts.Add(new AtmosphericEfficiency());
                 readouts.Add(new Biome());
+                readouts.Add(new Situation());
                 readouts.Add(new Slope());
                 readouts.Add(new ImpactTime());
                 readouts.Add(new ImpactLongitude());
@@ -110,20 +125,38 @@
 
                 // Vessel
                 readouts.Add(new DeltaVStaged());
+                readouts.Add(new DeltaVCurrent());
                 readouts.Add(new DeltaVTotal());
+                readouts.Add(new DeltaVCurrentTotal());
                 readouts.Add(new SpecificImpulse());
                 readouts.Add(new Mass());
                 readouts.Add(new Thrust());
                 readouts.Add(new ThrustToWeight());
+                readouts.Add(new ThrustOffsetAngle());
+                readouts.Add(new ThrustTorque());
+                readouts.Add(new SurfaceThrustToWeight());
                 readouts.Add(new Acceleration());
+                readouts.Add(new SuicideBurnAltitude());
+                readouts.Add(new SuicideBurnDistance());
+                readouts.Add(new SuicideBurnDeltaV());
+                readouts.Add(new IntakeAirUsage());
                 readouts.Add(new IntakeAirDemand());
                 readouts.Add(new IntakeAirSupply());
-                readouts.Add(new IntakeAirSupplyDemand());
+                readouts.Add(new IntakeAirDemandSupply());
+                readouts.Add(new PartCount());
+                readouts.Add(new Heading());
+                readouts.Add(new Pitch());
+                readouts.Add(new Roll());
+                readouts.Add(new HeadingRate());
+                readouts.Add(new PitchRate());
+                readouts.Add(new RollRate());
 
                 // Rendezvous
                 readouts.Add(new TargetSelector());
                 readouts.Add(new PhaseAngle());
                 readouts.Add(new InterceptAngle());
+                readouts.Add(new RelativeVelocity());
+                readouts.Add(new RelativeSpeed());
                 readouts.Add(new RelativeInclination());
                 readouts.Add(new TimeToRelativeAscendingNode());
                 readouts.Add(new TimeToRelativeDescendingNode());
@@ -138,12 +171,14 @@
                 readouts.Add(new Rendezvous.OrbitalPeriod());
                 readouts.Add(new Rendezvous.SemiMajorAxis());
                 readouts.Add(new Rendezvous.SemiMinorAxis());
-
+                
                 // Misc
                 readouts.Add(new Separator());
                 readouts.Add(new GuiSizeAdjustor());
                 readouts.Add(new SimulationDelay());
                 readouts.Add(new TimeReference());
+                readouts.Add(new VectoredThrustToggle());
+                readouts.Add(new SystemTime());
 
                 LoadHelpStrings();
             }
@@ -168,7 +203,7 @@
 
         #endregion
 
-        #region Methods: public
+        #region Methods
 
         /// <summary>
         ///     Gets a list of readout modules which are associated with the specified category.
@@ -196,10 +231,6 @@
                 readout.Reset();
             }
         }
-
-        #endregion
-
-        #region Methods: private
 
         /// <summary>
         ///     Loads the help strings from file.

--- a/KerbalEngineer/Flight/Readouts/ReadoutModule.cs
+++ b/KerbalEngineer/Flight/Readouts/ReadoutModule.cs
@@ -20,6 +20,8 @@
 #region Using Directives
 
 using System;
+
+using KerbalEngineer.Flight.Sections;
 
 using UnityEngine;
 
@@ -87,6 +89,11 @@
         public bool IsDefault { get; set; }
 
         /// <summary>
+        ///     Gets the number of drawn lines.
+        /// </summary>
+        public int LineCount { get; private set; }
+
+        /// <summary>
         ///     Gets and sets the message style.
         /// </summary>
         public GUIStyle MessageStyle { get; set; }
@@ -128,7 +135,7 @@
         /// <summary>
         ///     Called when a readout is asked to draw its self.
         /// </summary>
-        public virtual void Draw() { }
+        public virtual void Draw(SectionModule section) { }
 
         /// <summary>
         ///     Called on each fixed update frame where the readout is visible.
@@ -137,6 +144,7 @@
 
         public void LineCountEnd()
         {
+            this.LineCount = this.lineCountEnd;
             if (this.lineCountEnd.CompareTo(this.lineCountStart) < 0)
             {
                 this.ResizeRequested = true;
@@ -163,32 +171,59 @@
 
         #region Methods: protected
 
-        protected void DrawLine(string name, string value)
+        protected void DrawLine(string value, bool compact = false)
         {
             GUILayout.BeginHorizontal(GUILayout.Width(this.ContentWidth));
-            GUILayout.Label(name, this.NameStyle);
-            GUILayout.FlexibleSpace();
-            GUILayout.Label(value, this.ValueStyle);
+            if (!compact)
+            {
+                GUILayout.Label(this.Name, this.NameStyle);
+                GUILayout.FlexibleSpace();
+                GUILayout.Label(value, this.ValueStyle);
+            }
+            else
+            {
+                GUILayout.Label(this.Name, this.NameStyle, GUILayout.Height(this.NameStyle.fontSize * 1.2f));
+                GUILayout.FlexibleSpace();
+                GUILayout.Label(value, this.ValueStyle, GUILayout.Height(this.ValueStyle.fontSize * 1.2f));
+            }
             GUILayout.EndHorizontal();
+
             this.lineCountEnd++;
         }
 
-        protected void DrawLine(string value)
+        protected void DrawLine(string name, string value, bool compact = false)
         {
             GUILayout.BeginHorizontal(GUILayout.Width(this.ContentWidth));
-            GUILayout.Label(this.Name, this.NameStyle);
-            GUILayout.FlexibleSpace();
-            GUILayout.Label(value, this.ValueStyle);
+            if (!compact)
+            {
+                GUILayout.Label(name, this.NameStyle);
+                GUILayout.FlexibleSpace();
+                GUILayout.Label(value, this.ValueStyle);
+            }
+            else
+            {
+                GUILayout.Label(name, this.NameStyle, GUILayout.Height(this.NameStyle.fontSize * 1.2f));
+                GUILayout.FlexibleSpace();
+                GUILayout.Label(value, this.ValueStyle, GUILayout.Height(this.ValueStyle.fontSize * 1.2f));
+            }
             GUILayout.EndHorizontal();
+
             this.lineCountEnd++;
         }
 
-        protected void DrawLine(Action drawAction, bool showName = true)
+        protected void DrawLine(Action drawAction, bool showName = true, bool compact = false)
         {
             GUILayout.BeginHorizontal(GUILayout.Width(this.ContentWidth));
             if (showName)
             {
-                GUILayout.Label(this.Name, this.NameStyle);
+                if (!compact)
+                {
+                    GUILayout.Label(this.Name, this.NameStyle);
+                }
+                else
+                {
+                    GUILayout.Label(this.Name, this.NameStyle, GUILayout.Height(this.NameStyle.fontSize * 1.2f));
+                }
                 GUILayout.FlexibleSpace();
             }
             drawAction();
@@ -196,10 +231,17 @@
             this.lineCountEnd++;
         }
 
-        protected void DrawMessageLine(string value)
+        protected void DrawMessageLine(string value, bool compact = false)
         {
             GUILayout.BeginHorizontal(GUILayout.Width(this.ContentWidth));
-            GUILayout.Label(value, this.MessageStyle);
+            if (!compact)
+            {
+                GUILayout.Label(value, this.MessageStyle);
+            }
+            else
+            {
+                GUILayout.Label(value, this.MessageStyle, GUILayout.Height(this.MessageStyle.fontSize * 1.2f));
+            }
             GUILayout.EndHorizontal();
             this.lineCountEnd++;
         }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/AltitudeSeaLevel.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/AltitudeSeaLevel.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -41,11 +42,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.AltitudeSeaLevel.ToDistance());
+                this.DrawLine(RendezvousProcessor.AltitudeSeaLevel.ToDistance(), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/AngleToRelativeAscendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/AngleToRelativeAscendingNode.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -34,18 +35,18 @@
             this.Name = "Angle to Rel. AN";
             this.Category = ReadoutCategory.GetCategory("Rendezvous");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.AngleToAscendingNode.ToAngle());
+                this.DrawLine(RendezvousProcessor.AngleToAscendingNode.ToAngle(), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/AngleToRelativeDescendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/AngleToRelativeDescendingNode.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -34,18 +35,18 @@
             this.Name = "Angle to Rel. DN";
             this.Category = ReadoutCategory.GetCategory("Rendezvous");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.AngleToDescendingNode.ToAngle());
+                this.DrawLine(RendezvousProcessor.AngleToDescendingNode.ToAngle(), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/ApoapsisHeight.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/ApoapsisHeight.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -41,11 +42,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.ApoapsisHeight.ToDistance());
+                this.DrawLine(RendezvousProcessor.ApoapsisHeight.ToDistance(), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/Distance.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/Distance.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -41,11 +42,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.Distance.ToDistance());
+                this.DrawLine(RendezvousProcessor.Distance.ToDistance(), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/InterceptAngle.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/InterceptAngle.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -41,11 +42,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.InterceptAngle.ToAngle());
+                this.DrawLine(RendezvousProcessor.InterceptAngle.ToAngle(), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/OrbitalPeriod.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/OrbitalPeriod.cs
@@ -19,6 +19,7 @@
 
 #region Using Directives
 
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -34,18 +35,18 @@
             this.Name = "Orbital Period";
             this.Category = ReadoutCategory.GetCategory("Rendezvous");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.OrbitalPeriod, "F3"));
+                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.OrbitalPeriod, "F3"), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/PeriapsisHeight.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/PeriapsisHeight.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -41,11 +42,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.PeriapsisHeight.ToDistance());
+                this.DrawLine(RendezvousProcessor.PeriapsisHeight.ToDistance(), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/PhaseAngle.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/PhaseAngle.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -41,11 +42,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.PhaseAngle.ToAngle());
+                this.DrawLine(RendezvousProcessor.PhaseAngle.ToAngle(), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/RelativeInclination.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/RelativeInclination.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -41,11 +42,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.RelativeInclination.ToAngle());
+                this.DrawLine(RendezvousProcessor.RelativeInclination.ToAngle(), section.IsHud);
             }
         }
 

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/RelativeSpeed.cs
@@ -1,1 +1,65 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+#region Using Directives
+
+using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class RelativeSpeed : ReadoutModule
+    {
+        #region Constructors
+
+        public RelativeSpeed()
+        {
+            this.Name = "Relative Speed";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = "Shows the difference in orbital speed between your vessel and the target object.";
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (RendezvousProcessor.ShowDetails)
+            {
+                this.DrawLine(RendezvousProcessor.RelativeSpeed.ToSpeed(), section.IsHud);
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/RelativeVelocity.cs
@@ -1,1 +1,65 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+#region Using Directives
+
+using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Rendezvous
+{
+    public class RelativeVelocity : ReadoutModule
+    {
+        #region Constructors
+
+        public RelativeVelocity()
+        {
+            this.Name = "Relative Velocity";
+            this.Category = ReadoutCategory.GetCategory("Rendezvous");
+            this.HelpString = "Shows the relative velocity between your vessel and the target object.";
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (RendezvousProcessor.ShowDetails)
+            {
+                this.DrawLine(RendezvousProcessor.RelativeVelocity.ToSpeed(), section.IsHud);
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(RendezvousProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            RendezvousProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/RendezvousProcessor.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/RendezvousProcessor.cs
@@ -22,8 +22,7 @@
 using System;
 
 using KerbalEngineer.Extensions;
-
-using UnityEngine;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -31,21 +30,9 @@
 {
     public class RendezvousProcessor : IUpdatable, IUpdateRequest
     {
-        #region Instance
+        #region Fields
 
         private static readonly RendezvousProcessor instance = new RendezvousProcessor();
-
-        /// <summary>
-        ///     Gets the current instance of the rendezvous processor.
-        /// </summary>
-        public static RendezvousProcessor Instance
-        {
-            get { return instance; }
-        }
-
-        #endregion
-
-        #region Fields
 
         private Orbit originOrbit;
         private Orbit targetOrbit;
@@ -55,24 +42,92 @@
         #region Properties
 
         /// <summary>
+        ///     Gets the target's altitude above its reference body.
+        /// </summary>
+        public static double AltitudeSeaLevel { get; private set; }
+
+        /// <summary>
+        ///     Gets the angle from the origin position to the ascending node.
+        /// </summary>
+        public static double AngleToAscendingNode { get; private set; }
+
+        /// <summary>
+        ///     Gets the angle from the origin position to the descending node.
+        /// </summary>
+        public static double AngleToDescendingNode { get; private set; }
+
+        /// <summary>
+        ///     Gets the target's apoapsis above its reference body.
+        /// </summary>
+        public static double ApoapsisHeight { get; private set; }
+
+        /// <summary>
+        ///     Gets the distance from the origin position to the target position.
+        /// </summary>
+        public static double Distance { get; private set; }
+
+        /// <summary>
+        ///     Gets the current instance of the rendezvous processor.
+        /// </summary>
+        public static RendezvousProcessor Instance
+        {
+            get { return instance; }
+        }
+
+        /// <summary>
+        ///     Gets the difference in angle from the origin position to where it is most efficient to burn for an encounter.
+        /// </summary>
+        public static double InterceptAngle { get; private set; }
+
+        /// <summary>
+        ///     Gets the orbital period of the target orbit.
+        /// </summary>
+        public static double OrbitalPeriod { get; private set; }
+
+        /// <summary>
+        ///     Gets the target's periapsis above its reference body.
+        /// </summary>
+        public static double PeriapsisHeight { get; private set; }
+
+        /// <summary>
+        ///     Gets the difference in angle from the origin position to the target position based on a common reference.
+        /// </summary>
+        public static double PhaseAngle { get; private set; }
+
+        /// <summary>
+        ///     Gets the angular difference between the origin and target orbits.
+        /// </summary>
+        public static double RelativeInclination { get; private set; }
+
+        /// <summary>
+        ///     Gets the relative orbital speed between the vessel and target.
+        /// </summary>
+        public static double RelativeSpeed { get; private set; }
+
+        /// <summary>
+        ///     Gets the relative orbital velocity between the vessel and target.
+        /// </summary>
+        public static double RelativeVelocity { get; private set; }
+
+        /// <summary>
+        ///     Gets the semi-major axis of the target orbit.
+        /// </summary>
+        public static double SemiMajorAxis { get; private set; }
+
+        /// <summary>
+        ///     Gets the semi-minor axis of the target orbit.
+        /// </summary>
+        public static double SemiMinorAxis { get; private set; }
+
+        /// <summary>
         ///     Gets whether the details are ready to be shown.
         /// </summary>
         public static bool ShowDetails { get; private set; }
 
         /// <summary>
-        ///     Gets the difference in angle from the origin position to the target position based on a common reference.
-        /// </summary>
-        public static double PhaseAngle { get; private set; }
-
-        /// <summary>
-        ///     Gets the difference in angle from the origin position to where it is most efficient to burn for an encounter.
-        /// </summary>
-        public static double InterceptAngle { get; private set; }
-
-        /// <summary>
-        ///     Gets the angular difference between the origin and target orbits.
-        /// </summary>
-        public static double RelativeInclination { get; private set; }
+        ///     Gets the target's time to apoapsis.
+        /// </summary>
+        public static double TimeToApoapsis { get; private set; }
 
         /// <summary>
         ///     Gets the time it will take to reach the ascending node.
@@ -85,63 +140,26 @@
         public static double TimeToDescendingNode { get; private set; }
 
         /// <summary>
-        ///     Gets the angle from the origin position to the ascending node.
-        /// </summary>
-        public static double AngleToAscendingNode { get; private set; }
-
-        /// <summary>
-        ///     Gets the angle from the origin position to the descending node.
-        /// </summary>
-        public static double AngleToDescendingNode { get; private set; }
-
-        /// <summary>
-        ///     Gets the target's altitude above its reference body.
-        /// </summary>
-        public static double AltitudeSeaLevel { get; private set; }
-
-        /// <summary>
-        ///     Gets the target's apoapsis above its reference body.
-        /// </summary>
-        public static double ApoapsisHeight { get; private set; }
-
-        /// <summary>
-        ///     Gets the target's periapsis above its reference body.
-        /// </summary>
-        public static double PeriapsisHeight { get; private set; }
-
-        /// <summary>
-        ///     Gets the target's time to apoapsis.
-        /// </summary>
-        public static double TimeToApoapsis { get; private set; }
-
-        /// <summary>
         ///     Gets the target's time to periapsis.
         /// </summary>
         public static double TimeToPeriapsis { get; private set; }
 
         /// <summary>
-        ///     Gets the distance from the origin position to the target position.
-        /// </summary>
-        public static double Distance { get; private set; }
-
-        /// <summary>
-        ///     Gets the orbital period of the target orbit.
-        /// </summary>
-        public static double OrbitalPeriod { get; private set; }
-
-        /// <summary>
-        ///     Gets the semi-major axis of the target orbit.
-        /// </summary>
-        public static double SemiMajorAxis { get; private set; }
-
-        /// <summary>
-        ///     Gets the semi-minor axis of the target orbit.
-        /// </summary>
-        public static double SemiMinorAxis { get; private set; }
-
-        #endregion
-
-        #region IUpdatable Members
+        ///     Gets and sets whether the updatable object should be updated.
+        /// </summary>
+        public bool UpdateRequested { get; set; }
+
+        #endregion
+
+        #region Methods: public
+
+        /// <summary>
+        ///     Request and update to calculate the details.
+        /// </summary>
+        public static void RequestUpdate()
+        {
+            instance.UpdateRequested = true;
+        }
 
         /// <summary>
         ///     Updates the details by recalculating if requested.
@@ -162,12 +180,14 @@
                 : FlightGlobals.ship_orbit.referenceBody.orbit;
 
             RelativeInclination = this.originOrbit.GetRelativeInclination(this.targetOrbit);
+            RelativeVelocity = FlightGlobals.ship_tgtSpeed;
+            RelativeSpeed = FlightGlobals.ship_obtSpeed - this.targetOrbit.orbitalSpeed;
             PhaseAngle = this.originOrbit.GetPhaseAngle(this.targetOrbit);
             InterceptAngle = this.CalcInterceptAngle();
             TimeToAscendingNode = this.originOrbit.GetTimeToVector(this.GetAscendingNode());
             TimeToDescendingNode = this.originOrbit.GetTimeToVector(this.GetDescendingNode());
             AngleToAscendingNode = this.originOrbit.GetAngleToVector(this.GetAscendingNode());
-            AngleToDescendingNode =this.originOrbit.GetAngleToVector(this.GetDescendingNode());
+            AngleToDescendingNode = this.originOrbit.GetAngleToVector(this.GetDescendingNode());
             AltitudeSeaLevel = this.targetOrbit.altitude;
             ApoapsisHeight = this.targetOrbit.ApA;
             PeriapsisHeight = this.targetOrbit.PeA;
@@ -182,31 +202,15 @@
 
         #endregion
 
-        #region IUpdateRequest Members
-
-        /// <summary>
-        ///     Gets and sets whether the updatable object should be updated.
-        /// </summary>
-        public bool UpdateRequested { get; set; }
-
-        #endregion
-
-        /// <summary>
-        ///     Request and update to calculate the details.
-        /// </summary>
-        public static void RequestUpdate()
-        {
-            instance.UpdateRequested = true;
-        }
-
-        #region Calculations
+        #region Methods: private
 
         private double CalcInterceptAngle()
         {
-            // Only works when going into higher orbits.  Need to figure out a way for it to work with lower orbits.
-            var angle = 180.0 * (1.0 - Math.Pow((this.originOrbit.radius + this.targetOrbit.radius) / (2.0 * this.targetOrbit.radius), 1.5));
+            var originRadius = (this.originOrbit.semiMinorAxis + this.originOrbit.semiMajorAxis) * 0.5;
+            var targetRadius = (this.targetOrbit.semiMinorAxis + this.targetOrbit.semiMajorAxis) * 0.5;
+            var angle = 180.0 * (1.0 - Math.Pow((originRadius + targetRadius) / (2.0 * targetRadius), 1.5));
             angle = PhaseAngle - angle;
-            return RelativeInclination < 90.0 ? angle.ClampTo(0.0, 360.0) : (360.0 - (180.0 - angle)).ClampTo(0.0, 360.0);
+            return RelativeInclination < 90.0 ? AngleHelper.Clamp360(angle) : AngleHelper.Clamp360(360.0 - (180.0 - angle));
         }
 
         private Vector3d GetAscendingNode()

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/SemiMajorAxis.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/SemiMajorAxis.cs
@@ -21,7 +21,8 @@
 
 using System;
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -43,11 +44,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.SemiMajorAxis.ToDistance("N3"));
+                this.DrawLine(Units.ToDistance(RendezvousProcessor.SemiMajorAxis, 3), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/SemiMinorAxis.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/SemiMinorAxis.cs
@@ -21,7 +21,8 @@
 
 using System;
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -36,18 +37,18 @@
             this.Name = "Semi-minor Axis";
             this.Category = ReadoutCategory.GetCategory("Rendezvous");
             this.HelpString = String.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(RendezvousProcessor.SemiMajorAxis.ToDistance("N3"));
+                this.DrawLine(Units.ToDistance(RendezvousProcessor.SemiMajorAxis, 3), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/TargetSelector.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/TargetSelector.cs
@@ -18,6 +18,8 @@
 // 
 
 #region Using Directives
+
+using KerbalEngineer.Flight.Sections;
 
 using UnityEngine;
 
@@ -29,11 +31,11 @@
     {
         #region Fields
 
-        private float typeButtonWidth;
         private string searchQuery = string.Empty;
         private string searchText = string.Empty;
         private int targetCount;
         private ITargetable targetObject;
+        private float typeButtonWidth;
         private bool typeIsBody;
         private bool usingSearch;
         private VesselType vesselType = VesselType.Unknown;
@@ -54,10 +56,12 @@
 
         #region Drawing
 
+        #region Methods: public
+
         /// <summary>
         ///     Draws the target selector structure.
         /// </summary>
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (FlightGlobals.fetch.VesselTarget == null)
             {
@@ -81,7 +85,7 @@
             }
             else
             {
-                this.DrawTarget();
+                this.DrawTarget(section);
             }
 
             if (this.targetObject != FlightGlobals.fetch.VesselTarget)
@@ -89,6 +93,80 @@
                 this.targetObject = FlightGlobals.fetch.VesselTarget;
                 this.ResizeRequested = true;
             }
+        }
+
+        #endregion
+
+        #region Methods: private
+
+        /// <summary>
+        ///     Draws the back to types button.
+        /// </summary>
+        private void DrawBackToTypes()
+        {
+            if (GUILayout.Button("Go Back to Type Selection", this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
+            {
+                this.typeIsBody = false;
+                this.vesselType = VesselType.Unknown;
+                this.ResizeRequested = true;
+            }
+
+            GUILayout.Space(3f);
+        }
+
+        /// <summary>
+        ///     Draws targetable moons.
+        /// </summary>
+        private int DrawMoons()
+        {
+            var count = 0;
+
+            foreach (var body in FlightGlobals.Bodies)
+            {
+                if (FlightGlobals.ActiveVessel.mainBody != body.referenceBody || body == Planetarium.fetch.Sun)
+                {
+                    continue;
+                }
+
+                if (this.searchQuery.Length > 0 && !body.bodyName.ToLower().Contains(this.searchQuery))
+                {
+                    continue;
+                }
+
+                count++;
+                if (GUILayout.Button(body.bodyName, this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
+                {
+                    this.SetTargetAs(body);
+                }
+            }
+            return count;
+        }
+
+        /// <summary>
+        ///     Draws the targetable planets.
+        /// </summary>
+        private int DrawPlanets()
+        {
+            var count = 0;
+            foreach (var body in FlightGlobals.Bodies)
+            {
+                if (FlightGlobals.ActiveVessel.mainBody.referenceBody != body.referenceBody || body == Planetarium.fetch.Sun || body == FlightGlobals.ActiveVessel.mainBody)
+                {
+                    continue;
+                }
+
+                if (this.searchQuery.Length > 0 && !body.bodyName.ToLower().Contains(this.searchQuery))
+                {
+                    continue;
+                }
+
+                count++;
+                if (GUILayout.Button(body.GetName(), this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
+                {
+                    this.SetTargetAs(body);
+                }
+            }
+            return count;
         }
 
         /// <summary>
@@ -114,79 +192,16 @@
             else if (this.usingSearch)
             {
                 this.usingSearch = false;
-            }
-
-            GUILayout.EndHorizontal();
-        }
-
-        /// <summary>
-        ///     Draws the button list of target types.
-        /// </summary>
-        private void DrawTypes()
-        {
-            this.typeButtonWidth = Mathf.Round(this.ContentWidth * 0.5f);
-
-            GUILayout.BeginHorizontal();
-            if (GUILayout.Button("Celestial Bodies", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
-            {
-                this.SetTypeAsBody();
-            }
-            if (GUILayout.Button("Debris", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
-            {
-                this.SetTypeAs(VesselType.Debris);
-            }
-            GUILayout.EndHorizontal();
-
-            GUILayout.BeginHorizontal();
-            if (GUILayout.Button("Probes", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
-            {
-                this.SetTypeAs(VesselType.Probe);
-            }
-
-            if (GUILayout.Button("Rovers", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
-            {
-                this.SetTypeAs(VesselType.Rover);
-            }
-            GUILayout.EndHorizontal();
-
-            GUILayout.BeginHorizontal();
-            if (GUILayout.Button("Landers", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
-            {
-                this.SetTypeAs(VesselType.Lander);
-            }
-            if (GUILayout.Button("Ships", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
-            {
-                this.SetTypeAs(VesselType.Ship);
-            }
-            GUILayout.EndHorizontal();
-
-            GUILayout.BeginHorizontal();
-            if (GUILayout.Button("Stations", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
-            {
-                this.SetTypeAs(VesselType.Station);
-            }
-            if (GUILayout.Button("Bases", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
-            {
-                this.SetTypeAs(VesselType.Base);
-            }
-            GUILayout.EndHorizontal();
-
-            GUILayout.BeginHorizontal();
-            if (GUILayout.Button("EVAs", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
-            {
-                this.SetTypeAs(VesselType.EVA);
-            }
-            if (GUILayout.Button("Flags", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
-            {
-                this.SetTypeAs(VesselType.Flag);
-            }
+                this.ResizeRequested = true;
+            }
+
             GUILayout.EndHorizontal();
         }
 
         /// <summary>
         ///     Draws the target information when selected.
         /// </summary>
-        private void DrawTarget()
+        private void DrawTarget(SectionModule section)
         {
             if (GUILayout.Button("Go Back to Target Selection", this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
             {
@@ -194,24 +209,15 @@
                 this.ResizeRequested = true;
             }
 
+            if (!(FlightGlobals.fetch.VesselTarget is CelestialBody) && GUILayout.Button("Switch to Target", this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
+            {
+                FlightGlobals.SetActiveVessel(FlightGlobals.fetch.VesselTarget.GetVessel());
+                this.ResizeRequested = true;
+            }
+
             GUILayout.Space(3f);
 
-            this.DrawLine("Selected Target", FlightGlobals.fetch.VesselTarget.GetName());
-        }
-
-        /// <summary>
-        ///     Draws the back to types button.
-        /// </summary>
-        private void DrawBackToTypes()
-        {
-            if (GUILayout.Button("Go Back to Type Selection", this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
-            {
-                this.typeIsBody = false;
-                this.vesselType = VesselType.Unknown;
-                this.ResizeRequested = true;
-            }
-
-            GUILayout.Space(3f);
+            this.DrawLine("Selected Target", FlightGlobals.fetch.VesselTarget.GetName(), section.IsHud);
         }
 
         /// <summary>
@@ -253,58 +259,67 @@
         }
 
         /// <summary>
-        ///     Draws targetable moons.
-        /// </summary>
-        private int DrawMoons()
-        {
-            var count = 0;
-
-            foreach (var body in FlightGlobals.Bodies)
-            {
-                if (FlightGlobals.ActiveVessel.mainBody != body.referenceBody || body == Planetarium.fetch.Sun)
-                {
-                    continue;
-                }
-
-                if (this.searchQuery.Length > 0 && !body.bodyName.ToLower().Contains(this.searchQuery))
-                {
-                    continue;
-                }
-
-                count++;
-                if (GUILayout.Button(body.bodyName, this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
-                {
-                    this.SetTargetAs(body);
-                }
-            }
-            return count;
-        }
-
-        /// <summary>
-        ///     Draws the targetable planets.
-        /// </summary>
-        private int DrawPlanets()
-        {
-            var count = 0;
-            foreach (var body in FlightGlobals.Bodies)
-            {
-                if (FlightGlobals.ActiveVessel.mainBody.referenceBody != body.referenceBody || body == Planetarium.fetch.Sun || body == FlightGlobals.ActiveVessel.mainBody)
-                {
-                    continue;
-                }
-
-                if (this.searchQuery.Length > 0 && !body.bodyName.ToLower().Contains(this.searchQuery))
-                {
-                    continue;
-                }
-
-                count++;
-                if (GUILayout.Button(body.GetName(), this.ButtonStyle, GUILayout.Width(this.ContentWidth)))
-                {
-                    this.SetTargetAs(body);
-                }
-            }
-            return count;
+        ///     Draws the button list of target types.
+        /// </summary>
+        private void DrawTypes()
+        {
+            this.typeButtonWidth = Mathf.Round(this.ContentWidth * 0.5f);
+
+            GUILayout.BeginHorizontal();
+            if (GUILayout.Button("Celestial Bodies", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAsBody();
+            }
+            if (GUILayout.Button("Debris", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Debris);
+            }
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            if (GUILayout.Button("Probes", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Probe);
+            }
+
+            if (GUILayout.Button("Rovers", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Rover);
+            }
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            if (GUILayout.Button("Landers", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Lander);
+            }
+            if (GUILayout.Button("Ships", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Ship);
+            }
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            if (GUILayout.Button("Stations", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Station);
+            }
+            if (GUILayout.Button("Bases", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Base);
+            }
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal();
+            if (GUILayout.Button("EVAs", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.EVA);
+            }
+            if (GUILayout.Button("Flags", this.ButtonStyle, GUILayout.Width(this.typeButtonWidth)))
+            {
+                this.SetTypeAs(VesselType.Flag);
+            }
+            GUILayout.EndHorizontal();
         }
 
         /// <summary>
@@ -341,18 +356,6 @@
             return count;
         }
 
-        private void SetTypeAs(VesselType vesselType)
-        {
-            this.vesselType = vesselType;
-            this.ResizeRequested = true;
-        }
-
-        private void SetTypeAsBody()
-        {
-            this.typeIsBody = true;
-            this.ResizeRequested = true;
-        }
-
         private void SetTargetAs(ITargetable target)
         {
             FlightGlobals.fetch.SetVesselTarget(target);
@@ -360,6 +363,20 @@
             this.ResizeRequested = true;
         }
 
+        private void SetTypeAs(VesselType vesselType)
+        {
+            this.vesselType = vesselType;
+            this.ResizeRequested = true;
+        }
+
+        private void SetTypeAsBody()
+        {
+            this.typeIsBody = true;
+            this.ResizeRequested = true;
+        }
+
+        #endregion
+
         #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToApoapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToApoapsis.cs
@@ -19,6 +19,7 @@
 
 #region Using Directives
 
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -34,18 +35,18 @@
             this.Name = "Time to Apoapsis";
             this.Category = ReadoutCategory.GetCategory("Rendezvous");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.TimeToApoapsis));
+                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.TimeToApoapsis), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToPeriapsis.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToPeriapsis.cs
@@ -19,6 +19,7 @@
 
 #region Using Directives
 
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -34,18 +35,18 @@
             this.Name = "Time to Periapsis";
             this.Category = ReadoutCategory.GetCategory("Rendezvous");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.TimeToPeriapsis));
+                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.TimeToPeriapsis), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToRelativeAscendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToRelativeAscendingNode.cs
@@ -19,6 +19,7 @@
 
 #region Using Directives
 
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -41,11 +42,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.TimeToAscendingNode));
+                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.TimeToAscendingNode), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToRelativeDescendingNode.cs
+++ b/KerbalEngineer/Flight/Readouts/Rendezvous/TimeToRelativeDescendingNode.cs
@@ -19,6 +19,7 @@
 
 #region Using Directives
 
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -41,11 +42,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (RendezvousProcessor.ShowDetails)
             {
-                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.TimeToDescendingNode));
+                this.DrawLine(TimeFormatter.ConvertToString(RendezvousProcessor.TimeToDescendingNode), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Surface/AltitudeSeaLevel.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/AltitudeSeaLevel.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,17 +28,25 @@
 {
     public class AltitudeSeaLevel : ReadoutModule
     {
+        #region Constructors
+
         public AltitudeSeaLevel()
         {
             this.Name = "Altitude (Sea Level)";
             this.Category = ReadoutCategory.GetCategory("Surface");
             this.HelpString = "Shows the vessel's altitude above sea level.";
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_altitude.ToDistance());
+            this.DrawLine(FlightGlobals.ship_altitude.ToDistance(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/AltitudeTerrain.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/AltitudeTerrain.cs
@@ -19,14 +19,21 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
-
 #endregion
 
 namespace KerbalEngineer.Flight.Readouts.Surface
 {
+    #region Using Directives
+
+    using Extensions;
+    using Sections;
+
+    #endregion
+
     public class AltitudeTerrain : ReadoutModule
     {
+        #region Constructors
+
         public AltitudeTerrain()
         {
             this.Name = "Altitude (Terrain)";
@@ -35,9 +42,22 @@
             this.IsDefault = true;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine((FlightGlobals.ship_altitude - FlightGlobals.ActiveVessel.terrainAltitude).ToDistance());
+            if (FlightGlobals.ActiveVessel.terrainAltitude > 0.0)
+            {
+                this.DrawLine((FlightGlobals.ship_altitude - FlightGlobals.ActiveVessel.terrainAltitude).ToDistance(), section.IsHud);
+            }
+            else
+            {
+                this.DrawLine((FlightGlobals.ship_altitude).ToDistance(), section.IsHud);
+            }
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/AtmosphericEfficiency.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/AtmosphericEfficiency.cs
@@ -17,6 +17,13 @@
 //     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 // 
 
+#region Using Directives
+
+using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+
+#endregion
+
 namespace KerbalEngineer.Flight.Readouts.Surface
 {
     public class AtmosphericEfficiency : ReadoutModule
@@ -35,11 +42,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (AtmosphericProcessor.ShowDetails)
             {
-                this.DrawLine(AtmosphericProcessor.Efficiency.ToString("F2"));
+                this.DrawLine(AtmosphericProcessor.Efficiency.ToPercent(), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Surface/AtmosphericProcessor.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/AtmosphericProcessor.cs
@@ -33,7 +33,13 @@
     {
         #region Instance
 
+        #region Fields
+
         private static readonly AtmosphericProcessor instance = new AtmosphericProcessor();
+
+        #endregion
+
+        #region Properties
 
         /// <summary>
         ///     Gets the current instance of the atmospheric processor.
@@ -45,19 +51,26 @@
 
         #endregion
 
+        #endregion
+
         #region Fields
 
+        private MethodInfo farTerminalVelocity;
         private bool hasCheckedAeroMods;
-        private MethodInfo farTerminalVelocity;
 
         #endregion
 
         #region Properties
 
         /// <summary>
-        ///     Gets whether the details are ready to be shown.
+        ///     Gets the deceleration caused by drag.
         /// </summary>
-        public static bool ShowDetails { get; private set; }
+        public static double Deceleration { get; private set; }
+
+        /// <summary>
+        ///     Gets the difference between current velocity and terminal velocity.
+        /// </summary>
+        public static double Efficiency { get; private set; }
 
         /// <summary>
         ///     Gets whether FAR is installed.
@@ -70,19 +83,14 @@
         public static bool NearInstalled { get; private set; }
 
         /// <summary>
+        ///     Gets whether the details are ready to be shown.
+        /// </summary>
+        public static bool ShowDetails { get; private set; }
+
+        /// <summary>
         ///     Gets the terminal velocity of the active vessel.
         /// </summary>
         public static double TerminalVelocity { get; private set; }
-
-        /// <summary>
-        ///     Gets the difference between current velocity and terminal velocity.
-        /// </summary>
-        public static double Efficiency { get; private set; }
-
-        /// <summary>
-        ///     Gets the deceleration caused by drag.
-        /// </summary>
-        public static double Deceleration { get; private set; }
 
         #endregion
 
@@ -142,6 +150,8 @@
 
         #endregion
 
+        #region Methods: public
+
         /// <summary>
         ///     Request an update to calculate the details.
         /// </summary>
@@ -149,6 +159,8 @@
         {
             instance.UpdateRequested = true;
         }
+
+        #endregion
 
         #region Private Methods
 
@@ -163,7 +175,7 @@
                     switch (loadedAssembly.name)
                     {
                         case "FerramAerospaceResearch":
-                            farTerminalVelocity = loadedAssembly.assembly.GetType("ferram4.FARAPI").GetMethod("GetActiveControlSys_TermVel");
+                            this.farTerminalVelocity = loadedAssembly.assembly.GetType("ferram4.FARAPI").GetMethod("GetActiveControlSys_TermVel");
                             FarInstalled = true;
                             Logger.Log("FAR detected!");
                             break;

--- a/KerbalEngineer/Flight/Readouts/Surface/Biome.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/Biome.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,6 +27,8 @@
 {
     public class Biome : ReadoutModule
     {
+        #region Constructors
+
         public Biome()
         {
             this.Name = "Biome";
@@ -35,9 +37,15 @@
             this.IsDefault = true;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(ScienceUtil.GetExperimentBiome(FlightGlobals.ActiveVessel.mainBody, FlightGlobals.ActiveVessel.latitude, FlightGlobals.ActiveVessel.longitude));
+            this.DrawLine(ScienceUtil.GetExperimentBiome(FlightGlobals.ActiveVessel.mainBody, FlightGlobals.ActiveVessel.latitude, FlightGlobals.ActiveVessel.longitude), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/GeeForce.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/GeeForce.cs
@@ -17,13 +17,25 @@
 //     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 // 
 
+#region Using Directives
+
+using KerbalEngineer.Flight.Sections;
+
 using UnityEngine;
+
+#endregion
 
 namespace KerbalEngineer.Flight.Readouts.Surface
 {
     public class GeeForce : ReadoutModule
     {
+        #region Fields
+
         private double maxGeeForce;
+
+        #endregion
+
+        #region Constructors
 
         public GeeForce()
         {
@@ -33,7 +45,11 @@
             this.IsDefault = true;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
             if (FlightGlobals.ship_geeForce > this.maxGeeForce)
             {
@@ -53,5 +69,7 @@
         {
             this.maxGeeForce = 0;
         }
+
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Surface/HorizontalAcceleration.cs
@@ -1,1 +1,65 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+#region Using Directives
+
+using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class HorizontalAcceleration : ReadoutModule
+    {
+        #region Fields
+
+        private double acceleration;
+        private double speed;
+
+        #endregion
+
+        #region Constructors
+
+        public HorizontalAcceleration()
+        {
+            this.Name = "Horizontal Acceleration";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = "Shows the vessel's horizontal acceleration across a celestial body's surface.";
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            this.DrawLine(this.acceleration.ToAcceleration(), section.IsHud);
+        }
+
+        public override void FixedUpdate()
+        {
+            this.acceleration = (FlightGlobals.ActiveVessel.horizontalSrfSpeed - this.speed) / TimeWarp.fixedDeltaTime;
+            this.speed = FlightGlobals.ActiveVessel.horizontalSrfSpeed;
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Surface/HorizontalSpeed.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/HorizontalSpeed.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,17 +28,25 @@
 {
     public class HorizontalSpeed : ReadoutModule
     {
+        #region Constructors
+
         public HorizontalSpeed()
         {
             this.Name = "Horizontal Speed";
             this.Category = ReadoutCategory.GetCategory("Surface");
-            this.HelpString = "Shows the vessel's horizontal speed across a celestial bodies surface.";
+            this.HelpString = "Shows the vessel's horizontal speed across a celestial body's surface.";
             this.IsDefault = true;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ActiveVessel.horizontalSrfSpeed.ToSpeed());
+            this.DrawLine(FlightGlobals.ActiveVessel.horizontalSrfSpeed.ToSpeed(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/ImpactAltitude.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/ImpactAltitude.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -34,18 +35,18 @@
             this.Name = "Impact Altitude";
             this.Category = ReadoutCategory.GetCategory("Surface");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (ImpactProcessor.ShowDetails)
             {
-                this.DrawLine(ImpactProcessor.Altitude.ToDistance());
+                this.DrawLine(ImpactProcessor.Altitude.ToDistance(), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Surface/ImpactBiome.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/ImpactBiome.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -41,11 +41,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (ImpactProcessor.ShowDetails)
             {
-                this.DrawLine(ImpactProcessor.Biome);
+                this.DrawLine(ImpactProcessor.Biome, section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Surface/ImpactLatitude.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/ImpactLatitude.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -34,18 +35,18 @@
             this.Name = "Impact Latitude";
             this.Category = ReadoutCategory.GetCategory("Surface");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (ImpactProcessor.ShowDetails)
             {
-                this.DrawLine(ImpactProcessor.Latitude.ToAngle());
+                this.DrawLine(ImpactProcessor.Latitude.ToAngle(), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Surface/ImpactLongitude.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/ImpactLongitude.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -34,18 +35,18 @@
             this.Name = "Impact Longitude";
             this.Category = ReadoutCategory.GetCategory("Surface");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (ImpactProcessor.ShowDetails)
             {
-                this.DrawLine(ImpactProcessor.Longitude.ToAngle());
+                this.DrawLine(ImpactProcessor.Longitude.ToAngle(), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Surface/ImpactProcessor.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/ImpactProcessor.cs
@@ -33,8 +33,14 @@
     {
         #region Instance
 
+        #region Fields
+
         private static readonly ImpactProcessor instance = new ImpactProcessor();
 
+        #endregion
+
+        #region Properties
+
         /// <summary>
         ///     Gets the current instance of the impact processor.
         /// </summary>
@@ -42,6 +48,8 @@
         {
             get { return instance; }
         }
+
+        #endregion
 
         #endregion
 
@@ -58,6 +66,26 @@
         #region Properties
 
         /// <summary>
+        ///     Gets the altitude of the impact coordinates.
+        /// </summary>
+        public static double Altitude { get; private set; }
+
+        /// <summary>
+        ///     Gets the biome of the impact coordinates.
+        /// </summary>
+        public static string Biome { get; private set; }
+
+        /// <summary>
+        ///     Gets the latitude of the impact coordinates.
+        /// </summary>
+        public static double Latitude { get; private set; }
+
+        /// <summary>
+        ///     Gets the longitude of the impact coordinates.
+        /// </summary>
+        public static double Longitude { get; private set; }
+
+        /// <summary>
         ///     Gets whether the details are ready to be shown.
         /// </summary>
         public static bool ShowDetails { get; private set; }
@@ -66,26 +94,6 @@
         ///     Gets the time to impact.
         /// </summary>
         public static double Time { get; private set; }
-
-        /// <summary>
-        ///     Gets the longitude of the impact coordinates.
-        /// </summary>
-        public static double Longitude { get; private set; }
-
-        /// <summary>
-        ///     Gets the latitude of the impact coordinates.
-        /// </summary>
-        public static double Latitude { get; private set; }
-
-        /// <summary>
-        ///     Gets the altitude of the impact coordinates.
-        /// </summary>
-        public static double Altitude { get; private set; }
-
-        /// <summary>
-        ///     Gets the biome of the impact coordinates.
-        /// </summary>
-        public static string Biome { get; private set; }
 
         #endregion
 
@@ -196,12 +204,27 @@
 
         #endregion
 
+        #region Methods: public
+
         public static void RequestUpdate()
         {
             instance.UpdateRequested = true;
         }
 
+        #endregion
+
         #region Calculations
+
+        #region Methods: public
+
+        public static double ACosh(double x)
+        {
+            return (Math.Log(x + Math.Sqrt((x * x) - 1.0)));
+        }
+
+        #endregion
+
+        #region Methods: private
 
         private double NormAngle(double ang)
         {
@@ -239,11 +262,6 @@
             return result;
         }
 
-        public static double ACosh(double x)
-        {
-            return (Math.Log(x + Math.Sqrt((x * x) - 1.0)));
-        }
-
         private double TimeToPeriapsis(double theta)
         {
             var e = FlightGlobals.ActiveVessel.orbit.eccentricity;
@@ -278,5 +296,7 @@
         }
 
         #endregion
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/ImpactTime.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/ImpactTime.cs
@@ -19,6 +19,7 @@
 
 #region Using Directives
 
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -41,11 +42,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (ImpactProcessor.ShowDetails)
             {
-                this.DrawLine(TimeFormatter.ConvertToString(ImpactProcessor.Time));
+                this.DrawLine(TimeFormatter.ConvertToString(ImpactProcessor.Time), section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Surface/Latitude.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/Latitude.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,6 +27,8 @@
 {
     public class Latitude : ReadoutModule
     {
+        #region Constructors
+
         public Latitude()
         {
             this.Name = "Latitude";
@@ -35,9 +37,15 @@
             this.IsDefault = true;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_latitude.ToAngle());
+            this.DrawLine(KSPUtil.PrintLatitude(FlightGlobals.ship_latitude), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/Longitude.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/Longitude.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,6 +27,8 @@
 {
     public class Longitude : ReadoutModule
     {
+        #region Constructors
+
         public Longitude()
         {
             this.Name = "Longitude";
@@ -35,9 +37,15 @@
             this.IsDefault = true;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_longitude.ToAngle());
+            this.DrawLine(KSPUtil.PrintLongitude(FlightGlobals.ship_longitude), section.IsHud);
         }
+
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Surface/Situation.cs
@@ -1,1 +1,90 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+#region Using Directives
+
+using KerbalEngineer.Flight.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class Situation : ReadoutModule
+    {
+        #region Constructors
+
+        public Situation()
+        {
+            this.Name = "Situation";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            switch (ScienceUtil.GetExperimentSituation(FlightGlobals.ActiveVessel))
+            {
+                case ExperimentSituations.SrfLanded:
+                    this.DrawLine("Landed");
+                    break;
+
+                case ExperimentSituations.SrfSplashed:
+                    this.DrawLine("Splashed");
+                    break;
+
+                case ExperimentSituations.FlyingLow:
+                    this.DrawLine("Flying Low");
+                    break;
+
+                case ExperimentSituations.FlyingHigh:
+                    this.DrawLine("Flying High");
+                    break;
+
+                case ExperimentSituations.InSpaceLow:
+                    this.DrawLine("In Space Low");
+                    break;
+
+                case ExperimentSituations.InSpaceHigh:
+                    this.DrawLine("In Space High");
+                    break;
+            }
+        }
+
+        #endregion
+
+        #region Methods: private
+
+        private static string GetBiome()
+        {
+            return ScienceUtil.GetExperimentBiome(FlightGlobals.ActiveVessel.mainBody, FlightGlobals.ActiveVessel.latitude, FlightGlobals.ActiveVessel.longitude);
+        }
+
+        private static string GetBodyPlural()
+        {
+            return FlightGlobals.currentMainBody.bodyName.EndsWith("s") ? FlightGlobals.currentMainBody.bodyName + "\'" : FlightGlobals.currentMainBody.bodyName + "\'s";
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Surface/Slope.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/Slope.cs
@@ -21,7 +21,8 @@
 
 using System;
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
 
 using UnityEngine;
 
@@ -31,6 +32,8 @@
 {
     public class Slope : ReadoutModule
     {
+        #region Constructors
+
         public Slope()
         {
             this.Name = "Slope";
@@ -39,10 +42,18 @@
             this.IsDefault = true;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(this.GetSlopeAngleAndHeading());
+            this.DrawLine(this.GetSlopeAngleAndHeading(), section.IsHud);
         }
+
+        #endregion
+
+        #region Methods: private
 
         private string GetSlopeAngleAndHeading()
         {
@@ -66,7 +77,7 @@
                         raddotnorm = 0.0;
                     }
                     var slope = Math.Acos(raddotnorm) * 180 / Math.PI;
-                    result = slope.ToAngle("F1");
+                    result = Units.ToAngle(slope, 1);
                     if (slope < 0.05)
                     {
                         result += " @ ---°";
@@ -83,7 +94,7 @@
                         {
                             direction = 360 - direction;
                         }
-                        result += " @ " + direction.ToAngle("F0");
+                        result += " @ " + Units.ToAngle(direction, 1);
                     }
                 }
 
@@ -95,5 +106,7 @@
                 return "--° @ ---°";
             }
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Surface/TerminalVelocity.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/TerminalVelocity.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -34,18 +35,18 @@
             this.Name = "Terminal Velocity";
             this.Category = ReadoutCategory.GetCategory("Surface");
             this.HelpString = "Shows the velocity where the efforts of thrust and drag are equalled out.";
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (AtmosphericProcessor.ShowDetails)
             {
-                this.DrawLine(AtmosphericProcessor.TerminalVelocity.ToSpeed());
+                this.DrawLine(AtmosphericProcessor.TerminalVelocity.ToSpeed(), section.IsHud);
             }
         }
 

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Surface/VerticalAcceleration.cs
@@ -1,1 +1,65 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+#region Using Directives
+
+using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Surface
+{
+    public class VerticalAcceleration : ReadoutModule
+    {
+        #region Fields
+
+        private double acceleration;
+        private double speed;
+
+        #endregion
+
+        #region Constructors
+
+        public VerticalAcceleration()
+        {
+            this.Name = "Vertical Acceleration";
+            this.Category = ReadoutCategory.GetCategory("Surface");
+            this.HelpString = "Shows the vessel's vertical acceleration up and down.";
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            this.DrawLine(this.acceleration.ToAcceleration(), section.IsHud);
+        }
+
+        public override void FixedUpdate()
+        {
+            this.acceleration = (FlightGlobals.ship_verticalSpeed - this.speed) / TimeWarp.fixedDeltaTime;
+            this.speed = FlightGlobals.ship_verticalSpeed;
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Surface/VerticalSpeed.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/VerticalSpeed.cs
@@ -20,6 +20,7 @@
 #region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,6 +28,8 @@
 {
     public class VerticalSpeed : ReadoutModule
     {
+        #region Constructors
+
         public VerticalSpeed()
         {
             this.Name = "Vertical Speed";
@@ -35,9 +38,15 @@
             this.IsDefault = true;
         }
 
-        public override void Draw()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(FlightGlobals.ship_verticalSpeed.ToSpeed());
+            this.DrawLine(FlightGlobals.ship_verticalSpeed.ToSpeed(), section.IsHud);
         }
+
+        #endregion
     }
 }

--- a/KerbalEngineer/Flight/Readouts/Vessel/Acceleration.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/Acceleration.cs
@@ -19,11 +19,8 @@
 
 #region Using Directives
 
-using System.Diagnostics;
-
-using KerbalEngineer.Extensions;
-
-using UnityEngine;
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -31,7 +28,7 @@
 {
     public class Acceleration : ReadoutModule
     {
-        private bool showing;
+        #region Constructors
 
         public Acceleration()
         {
@@ -41,21 +38,15 @@
             this.IsDefault = true;
         }
 
-        public override void Update()
-        {
-            SimulationProcessor.RequestUpdate();
-        }
+        #endregion
 
-        public override void Draw()
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
             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;
+                this.DrawLine(Units.ToAcceleration(SimulationProcessor.LastStage.actualThrust / SimulationProcessor.LastStage.totalMass, SimulationProcessor.LastStage.thrust / SimulationProcessor.LastStage.totalMass), section.IsHud);
             }
         }
 
@@ -63,5 +54,12 @@
         {
             FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
         }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/AttitudeProcessor.cs
@@ -1,1 +1,132 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    #region Using Directives
+
+    using UnityEngine;
+
+    #endregion
+
+    public class AttitudeProcessor : IUpdatable, IUpdateRequest
+    {
+        #region Fields
+
+        private static readonly AttitudeProcessor instance = new AttitudeProcessor();
+
+        private Vector3 centreOfMass = Vector3.zero;
+
+        private double heading;
+        private double headingRate;
+        private Vector3 north = Vector3.zero;
+        private double pitch;
+        private double pitchRate;
+        private double previousHeading;
+        private double previousPitch;
+        private double previousRoll;
+        private double roll;
+        private double rollRate;
+        private Quaternion surfaceRotation;
+        private Vector3 up = Vector3.zero;
+
+        #endregion
+
+        #region Properties
+
+        public static double Heading
+        {
+            get { return instance.heading; }
+        }
+
+        public static double HeadingRate
+        {
+            get { return instance.headingRate; }
+        }
+
+        public static AttitudeProcessor Instance
+        {
+            get { return instance; }
+        }
+
+        public static double Pitch
+        {
+            get { return instance.pitch; }
+        }
+
+        public static double PitchRate
+        {
+            get { return instance.pitchRate; }
+        }
+
+        public static double Roll
+        {
+            get { return instance.roll; }
+        }
+
+        public static double RollRate
+        {
+            get { return instance.rollRate; }
+        }
+
+        public bool UpdateRequested { get; set; }
+
+        #endregion
+
+        #region Methods
+
+        public static void RequestUpdate()
+        {
+            instance.UpdateRequested = true;
+        }
+
+        public void Update()
+        {
+            this.surfaceRotation = this.GetSurfaceRotation();
+
+            this.previousHeading = this.heading;
+            this.previousPitch = this.pitch;
+            this.previousRoll = this.roll;
+
+            // This code was derived from MechJeb2's implementation for getting the vessel's surface relative rotation.
+            this.heading = this.surfaceRotation.eulerAngles.y;
+            this.pitch = this.surfaceRotation.eulerAngles.x > 180.0f
+                ? 360.0f - this.surfaceRotation.eulerAngles.x
+                : -this.surfaceRotation.eulerAngles.x;
+            this.roll = this.surfaceRotation.eulerAngles.z > 180.0f
+                ? this.surfaceRotation.eulerAngles.z - 360.0f
+                : this.surfaceRotation.eulerAngles.z;
+
+            this.headingRate = this.heading - this.previousHeading;
+            this.pitchRate = this.pitch - this.previousPitch;
+            this.rollRate = this.roll - this.previousRoll;
+        }
+
+        private Quaternion GetSurfaceRotation()
+        {
+            // This code was derived from MechJeb2's implementation for getting the vessel's surface relative rotation.
+            this.centreOfMass = FlightGlobals.ActiveVessel.findWorldCenterOfMass();
+            this.up = (this.centreOfMass - FlightGlobals.ActiveVessel.mainBody.position).normalized;
+            this.north = Vector3.Exclude(this.up, (FlightGlobals.ActiveVessel.mainBody.position + FlightGlobals.ActiveVessel.mainBody.transform.up * (float)FlightGlobals.ActiveVessel.mainBody.Radius) - this.centreOfMass).normalized;
+            return Quaternion.Inverse(Quaternion.Euler(90.0f, 0.0f, 0.0f) * Quaternion.Inverse(FlightGlobals.ActiveVessel.transform.rotation) * Quaternion.LookRotation(this.north, this.up));
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/DeltaVCurrent.cs
@@ -1,1 +1,65 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+#region Using Directives
+
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class DeltaVCurrent : ReadoutModule
+    {
+        #region Constructors
+
+        public DeltaVCurrent()
+        {
+            this.Name = "DeltaV Current";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = "Shows the vessel's current stage delta velocity.";
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (SimulationProcessor.ShowDetails)
+            {
+                this.DrawLine(SimulationProcessor.LastStage.deltaV.ToString("N0") + "m/s (" + TimeFormatter.ConvertToString(SimulationProcessor.LastStage.time) + ")", section.IsHud);
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/DeltaVCurrentTotal.cs
@@ -1,1 +1,65 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+#region Using Directives
+
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class DeltaVCurrentTotal : ReadoutModule
+    {
+        #region Constructors
+
+        public DeltaVCurrentTotal()
+        {
+            this.Name = "DeltaV (C/T)";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = "Shows the vessel's current stage delta velocity and total.";
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (SimulationProcessor.ShowDetails)
+            {
+                this.DrawLine(SimulationProcessor.LastStage.deltaV.ToString("N0") + "m/s" + " / " + SimulationProcessor.LastStage.totalDeltaV.ToString("N0") + "m/s", section.IsHud);
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Vessel/DeltaVStaged.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/DeltaVStaged.cs
@@ -19,6 +19,9 @@
 
 #region Using Directives
 
+using System.Linq;
+
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -48,31 +51,16 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
-            if (SimulationProcessor.ShowDetails)
+            if (!SimulationProcessor.ShowDetails)
             {
-                this.showing = true;
-                var newNumberOfStages = 0;
-                foreach (var stage in SimulationProcessor.Stages)
-                {
-                    if (stage.deltaV > 0 || stage.number == Staging.CurrentStage)
-                    {
-                        this.DrawLine("DeltaV (S" + stage.number + ")", stage.deltaV.ToString("N0") + "m/s (" + TimeFormatter.ConvertToString(stage.time) + ")");
-                        newNumberOfStages++;
-                    }
-                }
+                return;
+            }
 
-                if (newNumberOfStages != this.numberOfStages)
-                {
-                    this.numberOfStages = newNumberOfStages;
-                    this.ResizeRequested = true;
-                }
-            }
-            else if (this.showing)
+            foreach (var stage in SimulationProcessor.Stages.Where(stage => stage.deltaV > 0 || stage.number == Staging.CurrentStage))
             {
-                this.showing = false;
-                this.ResizeRequested = true;
+                this.DrawLine("DeltaV (S" + stage.number + ")", stage.deltaV.ToString("N0") + "m/s (" + TimeFormatter.ConvertToString(stage.time) + ")", section.IsHud);
             }
         }
 

--- a/KerbalEngineer/Flight/Readouts/Vessel/DeltaVTotal.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/DeltaVTotal.cs
@@ -19,6 +19,7 @@
 
 #region Using Directives
 
+using KerbalEngineer.Flight.Sections;
 using KerbalEngineer.Helpers;
 
 #endregion
@@ -27,12 +28,6 @@
 {
     public class DeltaVTotal : ReadoutModule
     {
-        #region Fields
-
-        private bool showing;
-
-        #endregion
-
         #region Constructors
 
         public DeltaVTotal()
@@ -47,17 +42,11 @@
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
             if (SimulationProcessor.ShowDetails)
             {
-                this.showing = true;
-                this.DrawLine(SimulationProcessor.LastStage.totalDeltaV.ToString("N0") + "m/s (" + TimeFormatter.ConvertToString(SimulationProcessor.LastStage.totalTime) + ")");
-            }
-            else if (this.showing)
-            {
-                this.showing = false;
-                this.ResizeRequested = true;
+                this.DrawLine(SimulationProcessor.LastStage.totalDeltaV.ToString("N0") + "m/s (" + TimeFormatter.ConvertToString(SimulationProcessor.LastStage.totalTime) + ")", section.IsHud);
             }
         }
 

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/Heading.cs
@@ -1,1 +1,62 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    #region Using Directives
+
+    using Helpers;
+    using Sections;
+
+    #endregion
+
+    public class Heading : ReadoutModule
+    {
+        #region Constructors
+
+        public Heading()
+        {
+            this.Name = "Heading";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = string.Empty;
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods
+
+        public override void Draw(SectionModule section)
+        {
+            this.DrawLine(Units.ToAngle(AttitudeProcessor.Heading), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(AttitudeProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            AttitudeProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/HeadingRate.cs
@@ -1,1 +1,62 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    #region Using Directives
+
+    using Helpers;
+    using Sections;
+
+    #endregion
+
+    public class HeadingRate : ReadoutModule
+    {
+        #region Constructors
+
+        public HeadingRate()
+        {
+            this.Name = "Heading Rate";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = string.Empty;
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods
+
+        public override void Draw(SectionModule section)
+        {
+            this.DrawLine(Units.ToAngle(AttitudeProcessor.HeadingRate) + "/sec", section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(AttitudeProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            AttitudeProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Vessel/IntakeAirDemand.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/IntakeAirDemand.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -40,21 +40,21 @@
             this.Name = "Intake Air (Demand)";
             this.Category = ReadoutCategory.GetCategory("Vessel");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(this.demand.ToString("F4"));
+            this.DrawLine(this.demand.ToString("F4"), section.IsHud);
         }
 
         public override void Update()
         {
-            this.demand = IntakeAirSupplyDemand.GetDemand();
+            this.demand = IntakeAirDemandSupply.GetDemand();
         }
 
         #endregion

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/IntakeAirDemandSupply.cs
@@ -1,1 +1,102 @@
+// 
+//     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.Linq;
+
+using KerbalEngineer.Flight.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class IntakeAirDemandSupply : ReadoutModule
+    {
+        #region Fields
+
+        private double demand;
+        private double supply;
+
+        #endregion
+
+        #region Constructors
+
+        public IntakeAirDemandSupply()
+        {
+            this.Name = "Intake Air (D/S)";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = string.Empty;
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public static double GetDemand()
+        {
+            var demand = 0.0;
+            foreach (var part in FlightGlobals.ActiveVessel.Parts)
+            {
+                if (part.Modules.Contains("ModuleEngines"))
+                {
+                    var engine = part.Modules["ModuleEngines"] as ModuleEngines;
+                    if (engine.isOperational)
+                    {
+                        demand += engine.propellants
+                            .Where(p => p.name == "IntakeAir")
+                            .Sum(p => p.currentRequirement);
+                    }
+                }
+                if (part.Modules.Contains("ModuleEnginesFX"))
+                {
+                    var engine = part.Modules["ModuleEnginesFX"] as ModuleEnginesFX;
+                    if (engine.isOperational)
+                    {
+                        demand += engine.propellants
+                            .Where(p => p.name == "IntakeAir")
+                            .Sum(p => p.currentRequirement);
+                    }
+                }
+            }
+            return demand;
+        }
+
+        public static double GetSupply()
+        {
+            return FlightGlobals.ActiveVessel.Parts
+                .Where(p => p.Resources.Contains("IntakeAir"))
+                .Sum(p => p.Resources["IntakeAir"].amount);
+        }
+
+        public override void Draw(SectionModule section)
+        {
+            this.DrawLine(this.demand.ToString("F4") + " / " + this.supply.ToString("F4"), section.IsHud);
+        }
+
+        public override void Update()
+        {
+            this.demand = GetDemand();
+            this.supply = GetSupply();
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Vessel/IntakeAirSupply.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/IntakeAirSupply.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -40,21 +40,21 @@
             this.Name = "Intake Air (Supply)";
             this.Category = ReadoutCategory.GetCategory("Vessel");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
         }
 
         #endregion
 
         #region Methods: public
 
-        public override void Draw()
+        public override void Draw(SectionModule section)
         {
-            this.DrawLine(this.supply.ToString("F4"));
+            this.DrawLine(this.supply.ToString("F4"), section.IsHud);
         }
 
         public override void Update()
         {
-            this.supply = IntakeAirSupplyDemand.GetSupply();
+            this.supply = IntakeAirDemandSupply.GetSupply();
         }
 
         #endregion

--- a/KerbalEngineer/Flight/Readouts/Vessel/IntakeAirSupplyDemand.cs
+++ /dev/null
@@ -1,100 +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.Linq;
-
-#endregion
-
-namespace KerbalEngineer.Flight.Readouts.Vessel
-{
-    public class IntakeAirSupplyDemand : ReadoutModule
-    {
-        #region Fields
-
-        private double demand;
-        private double supply;
-
-        #endregion
-
-        #region Constructors
-
-        public IntakeAirSupplyDemand()
-        {
-            this.Name = "Intake Air (D/S)";
-            this.Category = ReadoutCategory.GetCategory("Vessel");
-            this.HelpString = string.Empty;
-            this.IsDefault = true;
-        }
-
-        #endregion
-
-        #region Methods: public
-
-        public static double GetDemand()
-        {
-            var demand = 0.0;
-            foreach (var part in FlightGlobals.ActiveVessel.Parts)
-            {
-                if (part.Modules.Contains("ModuleEngines"))
-                {
-                    var engine = part.Modules["ModuleEngines"] as ModuleEngines;
-                    if (engine.isOperational)
-                    {
-                        demand += engine.propellants
-                            .Where(p => p.name == "IntakeAir")
-                            .Sum(p => p.currentRequirement);
-                    }
-                }
-                if (part.Modules.Contains("ModuleEnginesFX"))
-                {
-                    var engine = part.Modules["ModuleEngines"] as ModuleEnginesFX;
-                    if (engine.isOperational)
-                    {
-                        demand += engine.propellants
-                            .Where(p => p.name == "IntakeAir")
-                            .Sum(p => p.currentRequirement);
-                    }
-                }
-            }
-            return demand;
-        }
-
-        public static double GetSupply()
-        {
-            return FlightGlobals.ActiveVessel.Parts
-                .Where(p => p.Resources.Contains("IntakeAir"))
-                .Sum(p => p.Resources["IntakeAir"].amount);
-        }
-
-        public override void Draw()
-        {
-            this.DrawLine(this.demand.ToString("F4") + " / " + this.supply.ToString("F4"));
-        }
-
-        public override void Update()
-        {
-            this.demand = GetDemand();
-            this.supply = GetSupply();
-        }
-
-        #endregion
-    }
-}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/IntakeAirUsage.cs
@@ -1,1 +1,69 @@
+// 
+//     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.Flight.Sections;
+using KerbalEngineer.Helpers;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class IntakeAirUsage : ReadoutModule
+    {
+        #region Fields
+
+        private double percentage;
+
+        #endregion
+
+        #region Constructors
+
+        public IntakeAirUsage()
+        {
+            this.Name = "Intake Air (Usage)";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            this.DrawLine(Units.ToPercent(this.percentage), section.IsHud);
+        }
+
+        public override void Update()
+        {
+            this.percentage = IntakeAirDemandSupply.GetDemand() / IntakeAirDemandSupply.GetSupply();
+            if (Double.IsNaN(this.percentage) || Double.IsInfinity(this.percentage))
+            {
+                this.percentage = 0.0;
+            }
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Vessel/Mass.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/Mass.cs
@@ -19,8 +19,8 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
-using KerbalEngineer.VesselSimulator;
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -28,7 +28,13 @@
 {
     public class Mass : ReadoutModule
     {
+        #region Fields
+
         private bool showing;
+
+        #endregion
+
+        #region Constructors
 
         public Mass()
         {
@@ -38,21 +44,15 @@
             this.IsDefault = true;
         }
 
-        public override void Update()
-        {
-            SimulationProcessor.RequestUpdate();
-        }
+        #endregion
 
-        public override void Draw()
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
             if (SimulationProcessor.ShowDetails)
             {
-                this.DrawLine(SimulationProcessor.LastStage.mass.ToMass(false) + " / " + SimulationProcessor.LastStage.totalMass.ToMass());
-            }
-            else if (this.showing)
-            {
-                this.showing = false;
-                this.ResizeRequested = true;
+                this.DrawLine(Units.ToMass(SimulationProcessor.LastStage.mass, SimulationProcessor.LastStage.totalMass), section.IsHud);
             }
         }
 
@@ -60,5 +60,12 @@
         {
             FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
         }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/PartCount.cs
@@ -1,1 +1,65 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    #region Using Directives
+
+    using Helpers;
+    using Sections;
+
+    #endregion
+
+    public class PartCount : ReadoutModule
+    {
+        #region Constructors
+
+        public PartCount()
+        {
+            this.Name = "Part Count";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = string.Empty;
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods
+
+        public override void Draw(SectionModule section)
+        {
+            if (SimulationProcessor.ShowDetails)
+            {
+                this.DrawLine(Units.ConcatF(SimulationProcessor.LastStage.partCount, SimulationProcessor.LastStage.totalPartCount), section.IsHud);
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/Pitch.cs
@@ -1,1 +1,62 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    #region Using Directives
+
+    using Helpers;
+    using Sections;
+
+    #endregion
+
+    public class Pitch : ReadoutModule
+    {
+        #region Constructors
+
+        public Pitch()
+        {
+            this.Name = "Pitch";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = string.Empty;
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods
+
+        public override void Draw(SectionModule section)
+        {
+            this.DrawLine(Units.ToAngle(AttitudeProcessor.Pitch), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(AttitudeProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            AttitudeProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/PitchRate.cs
@@ -1,1 +1,62 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    #region Using Directives
+
+    using Helpers;
+    using Sections;
+
+    #endregion
+
+    public class PitchRate : ReadoutModule
+    {
+        #region Constructors
+
+        public PitchRate()
+        {
+            this.Name = "Pitch Rate";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = string.Empty;
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods
+
+        public override void Draw(SectionModule section)
+        {
+            this.DrawLine(Units.ToAngle(AttitudeProcessor.PitchRate) + "/sec", section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(AttitudeProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            AttitudeProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/Roll.cs
@@ -1,1 +1,62 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    #region Using Directives
+
+    using Helpers;
+    using Sections;
+
+    #endregion
+
+    public class Roll : ReadoutModule
+    {
+        #region Constructors
+
+        public Roll()
+        {
+            this.Name = "Roll";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = string.Empty;
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods
+
+        public override void Draw(SectionModule section)
+        {
+            this.DrawLine(Units.ToAngle(AttitudeProcessor.Roll), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(AttitudeProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            AttitudeProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/RollRate.cs
@@ -1,1 +1,62 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    #region Using Directives
+
+    using Helpers;
+    using Sections;
+
+    #endregion
+
+    public class RollRate : ReadoutModule
+    {
+        #region Constructors
+
+        public RollRate()
+        {
+            this.Name = "Roll Rate";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = string.Empty;
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods
+
+        public override void Draw(SectionModule section)
+        {
+            this.DrawLine(Units.ToAngle(AttitudeProcessor.RollRate) + "/sec", section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(AttitudeProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            AttitudeProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Vessel/SimulationProcessor.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/SimulationProcessor.cs
@@ -1,16 +1,57 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
-using KerbalEngineer.VesselSimulator;
+#region Using Directives
+
+
+
+#endregion
 
 namespace KerbalEngineer.Flight.Readouts.Vessel
 {
+    #region Using Directives
+
+    using System;
+    using VesselSimulator;
+
+    #endregion
+
     public class SimulationProcessor : IUpdatable, IUpdateRequest
     {
         #region Instance
+
+        #region Fields
+
         private static readonly SimulationProcessor instance = new SimulationProcessor();
+
+        #endregion
+
+        #region Constructors
+
+        static SimulationProcessor()
+        {
+            SimManager.OnReady += GetStageInfo;
+        }
+
+        #endregion
+
+        #region Properties
 
         /// <summary>
         ///     Gets the current instance of the simulation processor.
@@ -19,9 +60,17 @@
         {
             get { return instance; }
         }
+
+        #endregion
+
         #endregion
 
         #region Properties
+
+        /// <summary>
+        ///     Gets the currently active vessel stage.
+        /// </summary>
+        public static Stage LastStage { get; private set; }
 
         /// <summary>
         ///     Gets whether the details are ready to be shown.
@@ -33,49 +82,47 @@
         /// </summary>
         public static Stage[] Stages { get; private set; }
 
-        /// <summary>
-        ///     Gets the currently active vessel stage.
-        /// </summary>
-        public static Stage LastStage { get; private set; }
+        public bool UpdateRequested { get; set; }
 
         #endregion
+
+        #region Methods
+
+        private static void GetStageInfo()
+        {
+            Stages = SimManager.Stages;
+            LastStage = SimManager.LastStage;
+        }
+
+        public static void RequestUpdate()
+        {
+            instance.UpdateRequested = true;
+        }
 
         public void Update()
         {
             SimManager.RequestSimulation();
+            SimManager.TryStartSimulation();
 
             if (!SimManager.ResultsReady())
             {
                 return;
             }
 
-            Stages = SimManager.Stages;
-            LastStage = SimManager.LastStage;
-
             if (Stages != null && LastStage != null)
             {
                 ShowDetails = true;
             }
 
-
             if (FlightGlobals.ActiveVessel != null)
             {
                 SimManager.Gravity = FlightGlobals.ActiveVessel.mainBody.gravParameter /
-                                        Math.Pow(FlightGlobals.ActiveVessel.mainBody.Radius +
-                                                    FlightGlobals.ActiveVessel.mainBody.GetAltitude(FlightGlobals.ActiveVessel.CoM), 2);
+                                     Math.Pow(FlightGlobals.ActiveVessel.mainBody.Radius +
+                                              FlightGlobals.ActiveVessel.mainBody.GetAltitude(FlightGlobals.ActiveVessel.CoM), 2);
                 SimManager.Velocity = FlightGlobals.ActiveVessel.srfSpeed;
             }
-            // Cybutek: We should be allowing this to be set too but not sure where you want to put the control
-            //SimManager.vectoredThrust = vectoredThrust; 
-            SimManager.TryStartSimulation();
         }
 
-        public bool UpdateRequested { get; set; }
-
-        public static void RequestUpdate()
-        {
-            instance.UpdateRequested = true;
-        }
+        #endregion
     }
 }
-

--- a/KerbalEngineer/Flight/Readouts/Vessel/SpecificImpulse.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/SpecificImpulse.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,14 +27,31 @@
 {
     public class SpecificImpulse : ReadoutModule
     {
-        private bool showing;
+        #region Constructors
 
         public SpecificImpulse()
         {
             this.Name = "Specific Impulse";
             this.Category = ReadoutCategory.GetCategory("Vessel");
             this.HelpString = string.Empty;
-            this.IsDefault = true;
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (SimulationProcessor.ShowDetails)
+            {
+                this.DrawLine(SimulationProcessor.LastStage.isp.ToString("F1") + "s", section.IsHud);
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
         }
 
         public override void Update()
@@ -42,22 +59,6 @@
             SimulationProcessor.RequestUpdate();
         }
 
-        public override void Draw()
-        {
-            if (SimulationProcessor.ShowDetails)
-            {
-                this.DrawLine(SimulationProcessor.LastStage.isp.ToString("F1") + "s");
-            }
-            else if (this.showing)
-            {
-                this.showing = false;
-                this.ResizeRequested = true;
-            }
-        }
-
-        public override void Reset()
-        {
-            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
-        }
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/SuicideBurnAltitude.cs
@@ -1,1 +1,69 @@
+// 
+//     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.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class SuicideBurnAltitude : ReadoutModule
+    {
+        #region Constructors
+
+        public SuicideBurnAltitude()
+        {
+            this.Name = "Suicide Burn (Alt.)";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = "Shows the altitude when to start a suicide burn.";
+            this.IsDefault = false;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!SimulationProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(SuicideBurnProcessor.Altitude.ToDistance(), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            SuicideBurnProcessor.Reset();
+        }
+
+        public override void Update()
+        {
+            SuicideBurnProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/SuicideBurnDeltaV.cs
@@ -1,1 +1,69 @@
+// 
+//     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.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class SuicideBurnDeltaV : ReadoutModule
+    {
+        #region Constructors
+
+        public SuicideBurnDeltaV()
+        {
+            this.Name = "Suicide Burn (dV)";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = "Shows the DeltaV of a suicide burn.";
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!SuicideBurnProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(SuicideBurnProcessor.DeltaV.ToString("N1") + "m/s", section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            SuicideBurnProcessor.Reset();
+        }
+
+        public override void Update()
+        {
+            SuicideBurnProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/SuicideBurnDistance.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 KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class SuicideBurnDistance : ReadoutModule
+    {
+        #region Constructors
+
+        public SuicideBurnDistance()
+        {
+            this.Name = "Suicide Burn (Dist.)";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = "Shows the distance to the point at which to start a suicide burn.";
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!SuicideBurnProcessor.ShowDetails)
+            {
+                return;
+            }
+
+            this.DrawLine(SuicideBurnProcessor.Distance.ToDistance(), section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            SuicideBurnProcessor.Reset();
+        }
+
+        public override void Update()
+        {
+            SuicideBurnProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/SuicideBurnProcessor.cs
@@ -1,1 +1,101 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+#region Using Directives
+
+
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    #region Using Directives
+
+    using System;
+
+    #endregion
+
+    public class SuicideBurnProcessor : IUpdatable, IUpdateRequest
+    {
+        #region Fields
+
+        private static readonly SuicideBurnProcessor instance = new SuicideBurnProcessor();
+        private double acceleration;
+        private double gravity;
+        private double radarAltitude;
+
+        #endregion
+
+        #region Properties
+
+        public static double Altitude { get; private set; }
+
+        public static double DeltaV { get; private set; }
+
+        public static double Distance { get; private set; }
+
+        public static SuicideBurnProcessor Instance
+        {
+            get { return instance; }
+        }
+
+        public static bool ShowDetails { get; set; }
+
+        public bool UpdateRequested { get; set; }
+
+        #endregion
+
+        #region Methods
+
+        public static void RequestUpdate()
+        {
+            instance.UpdateRequested = true;
+            SimulationProcessor.RequestUpdate();
+        }
+
+        public static void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+            FlightEngineerCore.Instance.AddUpdatable(instance);
+        }
+
+        public void Update()
+        {
+            if (FlightGlobals.ship_orbit.PeA >= 0.0 || !SimulationProcessor.ShowDetails)
+            {
+                ShowDetails = false;
+                return;
+            }
+
+            this.gravity = FlightGlobals.currentMainBody.gravParameter / Math.Pow(FlightGlobals.currentMainBody.Radius, 2.0);
+            this.acceleration = SimulationProcessor.LastStage.thrust / SimulationProcessor.LastStage.totalMass;
+            this.radarAltitude = FlightGlobals.ActiveVessel.terrainAltitude > 0.0
+                ? FlightGlobals.ship_altitude - FlightGlobals.ActiveVessel.terrainAltitude
+                : FlightGlobals.ship_altitude;
+
+            DeltaV = Math.Sqrt((2 * this.gravity * this.radarAltitude) + Math.Pow(FlightGlobals.ship_verticalSpeed, 2.0));
+            Altitude = Math.Pow(DeltaV, 2.0) / (2.0 * this.acceleration);
+            Distance = this.radarAltitude - Altitude;
+
+            ShowDetails = !Double.IsInfinity(Distance);
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/SurfaceThrustToWeight.cs
@@ -1,1 +1,78 @@
+// 
+//     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.Flight.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class SurfaceThrustToWeight : ReadoutModule
+    {
+        #region Fields
+
+        private string actual = string.Empty;
+        private double gravity;
+        private string total = string.Empty;
+
+        #endregion
+
+        #region Constructors
+
+        public SurfaceThrustToWeight()
+        {
+            this.Name = "Surface Thrust to Weight Ratio";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = "Shows the vessel's surface thrust to weight ratio.";
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (!SimulationProcessor.ShowDetails)
+            {
+                return;
+            }
+            this.gravity = FlightGlobals.currentMainBody.gravParameter / Math.Pow(FlightGlobals.currentMainBody.Radius, 2);
+            this.actual = (SimulationProcessor.LastStage.actualThrust / (SimulationProcessor.LastStage.totalMass * this.gravity)).ToString("F2");
+            this.total = (SimulationProcessor.LastStage.thrust / (SimulationProcessor.LastStage.totalMass * this.gravity)).ToString("F2");
+            this.DrawLine("TWR (Surface)", this.actual + " / " + this.total, section.IsHud);
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}

--- a/KerbalEngineer/Flight/Readouts/Vessel/Thrust.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/Thrust.cs
@@ -19,7 +19,8 @@
 
 #region Using Directives
 
-using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
 
 #endregion
 
@@ -27,7 +28,7 @@
 {
     public class Thrust : ReadoutModule
     {
-        private bool showing;
+        #region Constructors
 
         public Thrust()
         {
@@ -37,21 +38,15 @@
             this.IsDefault = true;
         }
 
-        public override void Update()
-        {
-            SimulationProcessor.RequestUpdate();
-        }
+        #endregion
 
-        public override void Draw()
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
             if (SimulationProcessor.ShowDetails)
             {
-                this.DrawLine(SimulationProcessor.LastStage.actualThrust.ToForce(false) + " / " + SimulationProcessor.LastStage.thrust.ToForce());
-            }
-            else if (this.showing)
-            {
-                this.showing = false;
-                this.ResizeRequested = true;
+                this.DrawLine(Units.ToForce(SimulationProcessor.LastStage.actualThrust, SimulationProcessor.LastStage.thrust), section.IsHud);
             }
         }
 
@@ -59,5 +54,12 @@
         {
             FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
         }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/ThrustOffsetAngle.cs
@@ -1,1 +1,66 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+#region Using Directives
+
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class ThrustOffsetAngle : ReadoutModule
+    {
+        #region Constructors
+
+        public ThrustOffsetAngle()
+        {
+            this.Name = "Thrust offset angle";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = "Thrust angle offset due to vessel asymmetries and gimballing";
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (SimulationProcessor.ShowDetails)
+            {
+                this.DrawLine(Units.ToAngle(SimulationProcessor.LastStage.thrustOffsetAngle, 1), section.IsHud);
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}
+

--- a/KerbalEngineer/Flight/Readouts/Vessel/ThrustToWeight.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/ThrustToWeight.cs
@@ -19,7 +19,7 @@
 
 #region Using Directives
 
-
+using KerbalEngineer.Flight.Sections;
 
 #endregion
 
@@ -27,9 +27,15 @@
 {
     public class ThrustToWeight : ReadoutModule
     {
+        #region Fields
+
         private string actual = string.Empty;
-        private bool showing;
+        private double gravity;
         private string total = string.Empty;
+
+        #endregion
+
+        #region Constructors
 
         public ThrustToWeight()
         {
@@ -39,29 +45,33 @@
             this.IsDefault = true;
         }
 
-        public override void Update()
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
         {
-            SimulationProcessor.RequestUpdate();
-        }
+            if (!SimulationProcessor.ShowDetails)
+            {
+                return;
+            }
 
-        public override void Draw()
-        {
-            if (SimulationProcessor.ShowDetails)
-            {
-                this.actual = (SimulationProcessor.LastStage.actualThrust / (SimulationProcessor.LastStage.totalMass * FlightGlobals.getGeeForceAtPosition(FlightGlobals.ship_position).magnitude)).ToString("F2");
-                this.total = (SimulationProcessor.LastStage.thrust / (SimulationProcessor.LastStage.totalMass * FlightGlobals.getGeeForceAtPosition(FlightGlobals.ship_position).magnitude)).ToString("F2");
-                this.DrawLine("TWR", this.actual + " / " + this.total);
-            }
-            else if (this.showing)
-            {
-                this.showing = false;
-                this.ResizeRequested = true;
-            }
+            this.gravity = FlightGlobals.getGeeForceAtPosition(FlightGlobals.ship_position).magnitude;
+            this.actual = (SimulationProcessor.LastStage.actualThrust / (SimulationProcessor.LastStage.totalMass * this.gravity)).ToString("F2");
+            this.total = (SimulationProcessor.LastStage.thrust / (SimulationProcessor.LastStage.totalMass * this.gravity)).ToString("F2");
+            this.DrawLine("TWR", this.actual + " / " + this.total, section.IsHud);
         }
 
         public override void Reset()
         {
             FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
         }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Vessel/ThrustTorque.cs
@@ -1,1 +1,66 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+#region Using Directives
+
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Vessel
+{
+    public class ThrustTorque : ReadoutModule
+    {
+        #region Constructors
+
+        public ThrustTorque()
+        {
+            this.Name = "Thrust torque";
+            this.Category = ReadoutCategory.GetCategory("Vessel");
+            this.HelpString = "Thrust torque due to vessel asymmetries and gimballing";
+            this.IsDefault = true;
+        }
+
+        #endregion
+
+        #region Methods: public
+
+        public override void Draw(SectionModule section)
+        {
+            if (SimulationProcessor.ShowDetails)
+            {
+                this.DrawLine(Units.ToTorque(SimulationProcessor.LastStage.maxThrustTorque), section.IsHud);
+            }
+        }
+
+        public override void Reset()
+        {
+            FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance);
+        }
+
+        public override void Update()
+        {
+            SimulationProcessor.RequestUpdate();
+        }
+
+        #endregion
+    }
+}
+

--- a/KerbalEngineer/Flight/Sections/SectionEditor.cs
+++ b/KerbalEngineer/Flight/Sections/SectionEditor.cs
@@ -119,7 +119,7 @@
             try
             {
                 this.InitialiseStyles();
-                ReadoutCategory.Selected = ReadoutCategory.GetCategory("Orbital");
+                //ReadoutCategory.Selected = ReadoutCategory.GetCategory("Orbital");
                 RenderingManager.AddToPostDrawQueue(0, this.Draw);
             }
             catch (Exception ex)
@@ -221,6 +221,11 @@
                 {
                     DisplayStack.Instance.RequestResize();
                 }
+                if (this.ParentSection.IsHud = GUILayout.Toggle(this.ParentSection.IsHud, "HUD", this.readoutButtonStyle, GUILayout.Width(50.0f)))
+                {
+                    this.ParentSection.IsHudBackground = GUILayout.Toggle(this.ParentSection.IsHudBackground, "BG", this.readoutButtonStyle, GUILayout.Width(50.0f));
+                }
+
                 if (GUILayout.Button("DELETE SECTION", this.readoutButtonStyle, GUILayout.Width(150.0f)))
                 {
                     this.ParentSection.IsFloating = false;
@@ -296,6 +301,8 @@
             this.ParentSection.Name = preset.Name;
             this.ParentSection.Abbreviation = preset.Abbreviation;
             this.ParentSection.ReadoutModuleNames = preset.ReadoutNames;
+            this.ParentSection.IsHud = preset.IsHud;
+            this.ParentSection.IsHudBackground = preset.IsHudBackground;
             this.presetList.enabled = false;
         }
 
@@ -462,6 +469,8 @@
             preset.Name = this.ParentSection.Name;
             preset.Abbreviation = this.ParentSection.Abbreviation;
             preset.ReadoutNames = this.ParentSection.ReadoutModuleNames;
+            preset.IsHud = this.ParentSection.IsHud;
+            preset.IsHudBackground = this.ParentSection.IsHudBackground;
 
             PresetLibrary.Save(preset);
         }

--- a/KerbalEngineer/Flight/Sections/SectionLibrary.cs
+++ b/KerbalEngineer/Flight/Sections/SectionLibrary.cs
@@ -21,10 +21,11 @@
 
 using System.Collections.Generic;
 using System.Linq;
-using System.Runtime.InteropServices;
 
 using KerbalEngineer.Flight.Readouts;
 using KerbalEngineer.Settings;
+
+using UnityEngine;
 
 #endregion
 
@@ -69,6 +70,44 @@
                 Abbreviation = "RDZV",
                 ReadoutModules = ReadoutLibrary.GetCategory(ReadoutCategory.GetCategory("Rendezvous")).Where(r => r.IsDefault).ToList()
             });
+
+            var hud1 = new SectionModule
+            {
+                Name = "HUD 1",
+                Abbreviation = "HUD 1",
+                IsCustom = true,
+                IsVisible = true,
+                ReadoutModules = new List<ReadoutModule>
+                {
+                    ReadoutLibrary.GetReadout("ApoapsisHeight"),
+                    ReadoutLibrary.GetReadout("TimeToApoapsis"),
+                    ReadoutLibrary.GetReadout("PeriapsisHeight"),
+                    ReadoutLibrary.GetReadout("TimeToPeriapsis")
+                },
+            };
+            hud1.FloatingPositionX = Screen.width * 0.25f - (hud1.ReadoutModules.First().ContentWidth * 0.5f);
+            hud1.FloatingPositionY = 0.0f;
+            hud1.IsHud = true;
+            CustomSections.Add(hud1);
+
+            var hud2 = new SectionModule
+            {
+                Name = "HUD 2",
+                Abbreviation = "HUD 2",
+                IsCustom = true,
+                IsVisible = true,
+                ReadoutModules = new List<ReadoutModule>
+                {
+                    ReadoutLibrary.GetReadout("AltitudeTerrain"),
+                    ReadoutLibrary.GetReadout("VerticalSpeed"),
+                    ReadoutLibrary.GetReadout("HorizontalSpeed"),
+                    ReadoutLibrary.GetReadout("Biome")
+                },
+            };
+            hud2.FloatingPositionX = Screen.width * 0.75f - (hud2.ReadoutModules.First().ContentWidth * 0.5f);
+            hud2.FloatingPositionY = 0.0f;
+            hud2.IsHud = true;
+            CustomSections.Add(hud2);
         }
 
         #endregion
@@ -76,28 +115,30 @@
         #region Properties
 
         /// <summary>
+        ///     Gets and sets a list of custom sections.
+        /// </summary>
+        public static List<SectionModule> CustomSections { get; set; }
+
+        /// <summary>
+        ///     Gets the number of total sections that are stored in the library.
+        /// </summary>
+        public static int NumberOfSections { get; private set; }
+
+        /// <summary>
+        ///     Gets the number of sections that are being drawn on the display stack.
+        /// </summary>
+        public static int NumberOfStackSections { get; private set; }
+
+        /// <summary>
         ///     Gets and sets a list of stock sections
         /// </summary>
         public static List<SectionModule> StockSections { get; set; }
 
-        /// <summary>
-        ///     Gets and sets a list of custom sections.
-        /// </summary>
-        public static List<SectionModule> CustomSections { get; set; }
-
-        /// <summary>
-        ///     Gets the number of sections that are being drawn on the display stack.
-        /// </summary>
-        public static int NumberOfStackSections { get; private set; }
-
-        /// <summary>
-        ///     Gets the number of total sections that are stored in the library.
-        /// </summary>
-        public static int NumberOfSections { get; private set; }
-
         #endregion
 
         #region Updating
+
+        #region Methods: public
 
         /// <summary>
         ///     Fixed update all of the sections.
@@ -107,6 +148,22 @@
             FixedUpdateSections(StockSections);
             FixedUpdateSections(CustomSections);
         }
+
+        /// <summary>
+        ///     Update all of the sections and process section counts.
+        /// </summary>
+        public static void Update()
+        {
+            NumberOfStackSections = 0;
+            NumberOfSections = 0;
+
+            UpdateSections(StockSections);
+            UpdateSections(CustomSections);
+        }
+
+        #endregion
+
+        #region Methods: private
 
         /// <summary>
         ///     Fixed updates a list of sections.
@@ -120,18 +177,6 @@
                     section.FixedUpdate();
                 }
             }
-        }
-
-        /// <summary>
-        ///     Update all of the sections and process section counts.
-        /// </summary>
-        public static void Update()
-        {
-            NumberOfStackSections = 0;
-            NumberOfSections = 0;
-
-            UpdateSections(StockSections);
-            UpdateSections(CustomSections);
         }
 
         /// <summary>
@@ -176,7 +221,37 @@
 
         #endregion
 
+        #endregion
+
         #region Saving and Loading
+
+        /// <summary>
+        ///     Loads the state of all stored sections.
+        /// </summary>
+        public static void Load()
+        {
+            if (!SettingHandler.Exists("SectionLibrary.xml"))
+            {
+                return;
+            }
+
+            GetAllSections().ForEach(s =>
+            {
+                if (s.Window != null)
+                {
+                    Object.Destroy(s.Window);
+                }
+            });
+
+            var handler = SettingHandler.Load("SectionLibrary.xml", new[] {typeof(List<SectionModule>)});
+            StockSections = handler.Get("StockSections", StockSections);
+            CustomSections = handler.Get("CustomSections", CustomSections);
+
+            foreach (var section in GetAllSections())
+            {
+                section.ClearNullReadouts();
+            }
+        }
 
         /// <summary>
         ///     Saves the state of all the stored sections.
@@ -189,26 +264,30 @@
             handler.Save("SectionLibrary.xml");
         }
 
-        /// <summary>
-        ///     Loads the state of all stored sections.
-        /// </summary>
-        public static void Load()
-        {
-            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
 
         #region Methods
 
         /// <summary>
+        ///     Gets a list containing all section modules.
+        /// </summary>
+        public static List<SectionModule> GetAllSections()
+        {
+            var sections = new List<SectionModule>();
+            sections.AddRange(StockSections);
+            sections.AddRange(CustomSections);
+            return sections;
+        }
+
+        /// <summary>
+        ///     Gets a custom section that has the specified name.
+        /// </summary>
+        public static SectionModule GetCustomSection(string name)
+        {
+            return CustomSections.FirstOrDefault(s => s.Name == name);
+        }
+
+        /// <summary>
         ///     Gets a section that has the specified name.
         /// </summary>
         public static SectionModule GetSection(string name)
@@ -225,11 +304,11 @@
         }
 
         /// <summary>
-        ///     Gets a custom section that has the specified name.
-        /// </summary>
-        public static SectionModule GetCustomSection(string name)
-        {
-            return CustomSections.FirstOrDefault(s => s.Name == name);
+        ///     Removes a custom section witht he specified name.
+        /// </summary>
+        public static bool RemoveCustomSection(string name)
+        {
+            return CustomSections.Remove(GetCustomSection(name));
         }
 
         /// <summary>
@@ -241,19 +320,11 @@
         }
 
         /// <summary>
-        ///     Removes as stock section with the specified name.
+        ///     Removes a stock section with the specified name.
         /// </summary>
         public static bool RemoveStockSection(string name)
         {
             return StockSections.Remove(GetStockSection(name));
-        }
-
-        /// <summary>
-        ///     Removes a custom section witht he specified name.
-        /// </summary>
-        public static bool RemoveCustomSection(string name)
-        {
-            return CustomSections.Remove(GetCustomSection(name));
         }
 
         #endregion

--- a/KerbalEngineer/Flight/Sections/SectionModule.cs
+++ b/KerbalEngineer/Flight/Sections/SectionModule.cs
@@ -39,6 +39,7 @@
         #region Fields
 
         private SectionEditor editor;
+        private bool isHud;
         private int numberOfReadouts;
 
         #endregion
@@ -64,19 +65,29 @@
         #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; }
+        ///     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 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 custom.
@@ -84,14 +95,23 @@
         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; }
+        ///     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 whether the section is in a floating state.
@@ -113,33 +133,49 @@
         }
 
         /// <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; }
+        ///     Gets and sets whether the section module is a HUD.
+        /// </summary>
+        public bool IsHud
+        {
+            get { return this.isHud; }
             set
             {
-                if (value && this.editor == null)
-                {
-                    this.editor = FlightEngineerCore.Instance.AddSectionEditor(this);
-                }
-                else if (!value && this.editor != null)
-                {
-                    Object.Destroy(this.editor);
-                }
-            }
-        }
+                if (this.isHud == value)
+                {
+                    return;
+                }
+
+                this.isHud = value;
+                if (this.isHud)
+                {
+                    this.IsFloating = true;
+                }
+                if (this.Window != null)
+                {
+                    this.Window.RequestResize();
+                }
+            }
+        }
+
+        /// <summary>
+        ///     Gets and sets whether the section module has a background as a HUD.
+        /// </summary>
+        public bool IsHudBackground { get; set; }
+
+        /// <summary>
+        ///     Gets and sets the visibility of the section.
+        /// </summary>
+        public bool IsVisible { get; set; }
+
+        /// <summary>
+        ///     Gets the number of drawn readout lines.
+        /// </summary>
+        public int LineCount { get; private set; }
+
+        /// <summary>
+        ///     Gets and sets the name of the section.
+        /// </summary>
+        public string Name { get; set; }
 
         /// <summary>
         ///     Gets and sets the names of the installed readout modules. (Only used with serialisation.)
@@ -153,21 +189,27 @@
         /// <summary>
         ///     Gets and sets the list of readout modules.
         /// </summary>
-        [XmlIgnore] public List<ReadoutModule> ReadoutModules { get; set; }
+        [XmlIgnore]
+        public List<ReadoutModule> ReadoutModules { get; set; }
 
         /// <summary>
         ///     Gets and sets the floating window.
         /// </summary>
-        [XmlIgnore] public SectionWindow Window { get; set; }
+        [XmlIgnore]
+        public SectionWindow Window { get; set; }
 
         #endregion
 
         #region GUIStyles
+
+        #region Fields
 
         private GUIStyle boxStyle;
         private GUIStyle buttonStyle;
         private GUIStyle messageStyle;
         private GUIStyle titleStyle;
+
+        #endregion
 
         /// <summary>
         ///     Initialises all the styles required for this object.
@@ -280,6 +322,8 @@
 
         #region Drawing
 
+        #region Methods: public
+
         /// <summary>
         ///     Draws the section and all of the internal readout modules.
         /// </summary>
@@ -290,8 +334,49 @@
                 return;
             }
 
-            this.DrawSectionTitleBar();
+            if (!this.IsHud)
+            {
+                this.DrawSectionTitleBar();
+            }
+
             this.DrawReadoutModules();
+        }
+
+        #endregion
+
+        #region Methods: private
+
+        /// <summary>
+        ///     Draws all the readout modules.
+        /// </summary>
+        private void DrawReadoutModules()
+        {
+            if (!this.IsHud)
+            {
+                GUILayout.BeginVertical(this.boxStyle);
+            }
+
+            this.LineCount = 0;
+            if (this.ReadoutModules.Count > 0)
+            {
+                foreach (var readout in this.ReadoutModules)
+                {
+                    readout.LineCountStart();
+                    readout.Draw(this);
+                    readout.LineCountEnd();
+                    this.LineCount += readout.LineCount;
+                }
+            }
+            else
+            {
+                GUILayout.Label("No readouts are installed.", this.messageStyle);
+                this.LineCount = 1;
+            }
+
+            if (!this.IsHud)
+            {
+                GUILayout.EndVertical();
+            }
         }
 
         /// <summary>
@@ -306,27 +391,7 @@
             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.LineCountStart();
-                    readout.Draw();
-                    readout.LineCountEnd();
-                }
-            }
-            else
-            {
-                GUILayout.Label("No readouts are installed.", this.messageStyle);
-            }
-            GUILayout.EndVertical();
-        }
+        #endregion
 
         #endregion
 

--- a/KerbalEngineer/Flight/Sections/SectionWindow.cs
+++ b/KerbalEngineer/Flight/Sections/SectionWindow.cs
@@ -17,9 +17,10 @@
 //     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 // 
 
-#region
+#region Using Directives
 
 using KerbalEngineer.Extensions;
+using KerbalEngineer.Helpers;
 
 using UnityEngine;
 
@@ -34,21 +35,6 @@
         private bool resizeRequested;
         private int windowId;
         private Rect windowPosition;
-
-        #endregion
-
-        #region Constructors
-
-        /// <summary>
-        ///     Initialises the object's state on creation.
-        /// </summary>
-        private void Start()
-        {
-            this.windowId = this.GetHashCode();
-            this.InitialiseStyles();
-            RenderingManager.AddToPostDrawQueue(0, this.Draw);
-            GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
-        }
 
         #endregion
 
@@ -72,7 +58,13 @@
 
         #region GUIStyles
 
+        #region Fields
+
+        private GUIStyle hudWindowBgStyle;
+        private GUIStyle hudWindowStyle;
         private GUIStyle windowStyle;
+
+        #endregion
 
         /// <summary>
         ///     Initialises all the styles required for this object.
@@ -83,6 +75,31 @@
             {
                 margin = new RectOffset(),
                 padding = new RectOffset(5, 5, 0, 5),
+            };
+
+            this.hudWindowStyle = new GUIStyle(this.windowStyle)
+            {
+                normal =
+                {
+                    background = null
+                },
+                onNormal =
+                {
+                    background = null
+                },
+                padding = new RectOffset(5, 5, 0, 8),
+            };
+
+            this.hudWindowBgStyle = new GUIStyle(this.hudWindowStyle)
+            {
+                normal =
+                {
+                    background = TextureHelper.CreateTextureFromColour(new Color(0.0f, 0.0f, 0.0f, 0.5f))
+                },
+                onNormal =
+                {
+                    background = TextureHelper.CreateTextureFromColour(new Color(0.0f, 0.0f, 0.0f, 0.5f))
+                }
             };
         }
 
@@ -101,19 +118,25 @@
         /// </summary>
         private void Draw()
         {
-            if (!DisplayStack.Instance.Hidden && (this.ParentSection != null && this.ParentSection.IsVisible))
+            if (this.ParentSection == null || !this.ParentSection.IsVisible || (DisplayStack.Instance.Hidden && !this.ParentSection.IsHud) || !FlightEngineerCore.IsDisplayable)
             {
-                if (this.resizeRequested)
-                {
-                    this.windowPosition.width = 0;
-                    this.windowPosition.height = 0;
-                    this.resizeRequested = false;
-                }
-                GUI.skin = null;
-                this.windowPosition = GUILayout.Window(this.windowId, this.windowPosition, this.Window, string.Empty, this.windowStyle).ClampToScreen();
-                this.ParentSection.FloatingPositionX = this.windowPosition.x;
-                this.ParentSection.FloatingPositionY = this.windowPosition.y;
+                return;
             }
+
+            if (this.resizeRequested)
+            {
+                this.windowPosition.width = 0;
+                this.windowPosition.height = 0;
+                this.resizeRequested = false;
+            }
+            GUI.skin = null;
+            this.windowPosition = GUILayout.Window(this.windowId, this.windowPosition, this.Window, string.Empty,
+                                                   (!this.ParentSection.IsHud || this.ParentSection.IsEditorVisible) ? this.windowStyle
+                                                       : this.ParentSection.IsHudBackground && this.ParentSection.LineCount > 0
+                                                           ? this.hudWindowBgStyle
+                                                           : this.hudWindowStyle).ClampToScreen();
+            this.ParentSection.FloatingPositionX = this.windowPosition.x;
+            this.ParentSection.FloatingPositionY = this.windowPosition.y;
         }
 
         /// <summary>
@@ -123,7 +146,10 @@
         {
             this.ParentSection.Draw();
 
-            GUI.DragWindow();
+            if (!this.ParentSection.IsHud || this.ParentSection.IsEditorVisible)
+            {
+                GUI.DragWindow();
+            }
         }
 
         #endregion
@@ -152,5 +178,20 @@
         }
 
         #endregion
+
+        #region Methods: private
+
+        /// <summary>
+        ///     Initialises the object's state on creation.
+        /// </summary>
+        private void Start()
+        {
+            this.windowId = this.GetHashCode();
+            this.InitialiseStyles();
+            RenderingManager.AddToPostDrawQueue(0, this.Draw);
+            GuiDisplaySize.OnSizeChanged += this.OnSizeChanged;
+        }
+
+        #endregion
     }
 }

--- /dev/null
+++ b/KerbalEngineer/Helpers/AngleHelper.cs
@@ -1,1 +1,66 @@
+// 
+//     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.Helpers
+{
+    public static class AngleHelper
+    {
+        #region Methods: public
+
+        public static double Clamp360(double value)
+        {
+            return ClampBetween(value, 0.0, 360.0);
+        }
+
+        public static double ClampBetween(double value, double minimum, double maximum)
+        {
+            while (value < minimum)
+            {
+                value += maximum;
+            }
+
+            while (value > maximum)
+            {
+                value -= maximum;
+            }
+
+            return value;
+        }
+
+        public static double GetAngleBetweenVectors(Vector3d left, Vector3d right)
+        {
+            var angle = Vector3d.Angle(left, right);
+            var rotated = QuaternionD.AngleAxis(90.0, Vector3d.forward) * right;
+
+            if (Vector3d.Angle(rotated, left) > 90.0)
+            {
+                return 360.0 - angle;
+            }
+            return angle;
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Helpers/Averager.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/>.
+// 
 
+using System;
+
+namespace KerbalEngineer
+{ 
+    public class VectorAverager
+    {
+        private Vector3d sum = Vector3d.zero;
+        private uint count = 0;
+
+        public void Add(Vector3d v) {
+            sum += v;
+            count += 1;
+        }
+
+        public Vector3d Get() {
+            if (count > 0) {
+                return sum / count;
+            } else {
+                return Vector3d.zero;
+            }
+        }
+    }
+
+    public class WeightedVectorAverager
+    {
+        private Vector3d sum = Vector3d.zero;
+        private double totalweight = 0;
+
+        public void Add(Vector3d v, double weight) {
+            sum += v * weight;
+            totalweight += weight;
+        }
+
+        public Vector3d Get() {
+            if (totalweight > 0) {
+                return sum / totalweight;
+            } else {
+                return Vector3d.zero;
+            }
+        }
+
+        public double GetTotalWeight() {
+            return totalweight;
+        }
+    }
+}
+
+

--- /dev/null
+++ b/KerbalEngineer/Helpers/ForceAccumulator.cs
@@ -1,1 +1,103 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+using System;
+using System.Collections.Generic;
+
+namespace KerbalEngineer
+{
+    // a (force, application point) tuple
+    public class AppliedForce
+    {
+        public Vector3d vector;
+        public Vector3d applicationPoint;
+
+        public AppliedForce(Vector3d vector, Vector3d applicationPoint) {
+            this.vector = vector;
+            this.applicationPoint = applicationPoint;
+        }
+    }
+
+	// This class was mostly adapted from FARCenterQuery, part of FAR, by ferram4, GPLv3
+	// https://github.com/ferram4/Ferram-Aerospace-Research/blob/master/FerramAerospaceResearch/FARCenterQuery.cs
+    // Also see https://en.wikipedia.org/wiki/Resultant_force
+
+	// It accumulates forces and their points of applications, and provides methods for
+    // calculating the effective torque at any position, as well as the minimum-torque net force application point.
+    //
+    // The latter is a non-trivial issue; there is a 1-dimensional line of physically-equivalent solutions parallel
+    // to the resulting force vector; the solution closest to the weighted average of force positions is chosen.
+	// In the case of non-parallel forces, there usually is an infinite number of such lines, all of which have
+	// some amount of residual torque. The line with the least amount of residual torque is chosen.
+	public class ForceAccumulator
+	{
+		// Total force.
+		private Vector3d totalForce = Vector3d.zero;
+		// Torque needed to compensate if force were applied at origin.
+		private Vector3d totalZeroOriginTorque = Vector3d.zero;
+
+		// Weighted average of force application points.
+		private WeightedVectorAverager avgApplicationPoint = new WeightedVectorAverager();
+
+		// Feed an force to the accumulator.
+		public void AddForce(Vector3d applicationPoint, Vector3d force)
+		{
+			totalForce += force;
+			totalZeroOriginTorque += Vector3d.Cross(applicationPoint, force);
+			avgApplicationPoint.Add(applicationPoint, force.magnitude);
+		}
+
+        public Vector3d GetAverageForceApplicationPoint() {
+            return avgApplicationPoint.Get();
+        }
+
+        public void AddForce(AppliedForce force) {
+            AddForce(force.applicationPoint, force.vector);
+        }
+
+		// Residual torque for given force application point.
+		public Vector3d TorqueAt(Vector3d origin)
+		{
+			return totalZeroOriginTorque - Vector3d.Cross(origin, totalForce);
+		}
+
+        // Total force vector.
+        public Vector3d GetTotalForce()
+        {
+            return totalForce;
+        }
+
+        // Returns the minimum-residual-torque force application point that is closest to origin.
+        // Note that TorqueAt(GetMinTorquePos()) is always parallel to totalForce.
+        public Vector3d GetMinTorqueForceApplicationPoint(Vector3d origin)
+        {
+            double fmag = totalForce.sqrMagnitude;
+            if (fmag <= 0) {
+                return origin;
+            }
+
+            return origin + Vector3d.Cross(totalForce, TorqueAt(origin)) / fmag;
+        }
+
+        public Vector3d GetMinTorqueForceApplicationPoint()
+        {
+            return GetMinTorqueForceApplicationPoint(avgApplicationPoint.Get());
+        }
+	}
+}

--- /dev/null
+++ b/KerbalEngineer/Helpers/TextureHelper.cs
@@ -1,1 +1,42 @@
+// 
+//     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.Helpers
+{
+    public static class TextureHelper
+    {
+        #region Methods: public
+
+        public static Texture2D CreateTextureFromColour(Color colour)
+        {
+            var texture = new Texture2D(1, 1, TextureFormat.ARGB32, false);
+            texture.SetPixel(1, 1, colour);
+            texture.Apply();
+            return texture;
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Helpers/Units.cs
@@ -1,1 +1,186 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2014 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+// 
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+// 
 
+namespace KerbalEngineer.Helpers
+{
+    #region Using Directives
+
+    using System;
+
+    #endregion
+
+    public static class Units
+    {
+        #region Methods
+
+        public static string Concat(int value1, int value2)
+        {
+            return value1 + " / " + value2;
+        }
+
+        public static string ConcatF(double value1, double value2, int decimals = 1)
+        {
+            return value1.ToString("F" + decimals) + " / " + value2.ToString("F" + decimals);
+        }
+
+        public static string ConcatF(double value1, double value2, double value3, int decimals = 1)
+        {
+            return value1.ToString("F" + decimals) + " / " + value2.ToString("F" + decimals) + " / " + value3.ToString("F" + decimals);
+        }
+
+        public static string ConcatN(double value1, double value2, int decimals = 1)
+        {
+            return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals);
+        }
+
+        public static string ConcatN(double value1, double value2, double value3, int decimals = 1)
+        {
+            return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals) + " / " + value3.ToString("N" + decimals);
+        }
+
+        public static string Cost(double value, int decimals = 1)
+        {
+            if (value >= 1000000.0)
+            {
+                return (value / 1000.0).ToString("N" + decimals) + "K";
+            }
+            return value.ToString("N