VOID_SurfAtmo: Shortened window title to try to avoid clipping.
VOID_SurfAtmo: Shortened window title to try to avoid clipping.

--- a/API/IVOID_Module.cs
+++ b/API/IVOID_Module.cs
@@ -33,10 +33,10 @@
 	public interface IVOID_Module
 	{
 		string Name { get; }
-		bool toggleActive { get; set; }
-		bool guiRunning { get; }
-		bool inValidScene { get; }
-		bool inValidGame { get; }
+		bool Active { get; set; }
+		bool GUIRunning { get; }
+		bool InValidScene { get; }
+		bool InValidGame { get; }
 
 		void DrawGUI();
 		void StartGUI();
@@ -46,7 +46,7 @@
 
 		void LoadConfig();
 
-		void _SaveToConfig(KSP.IO.PluginConfiguration config);
+		void Save(KSP.IO.PluginConfiguration config);
 	}
 
 	public interface IVOID_BehaviorModule : IVOID_Module

--- a/API/VOIDCore.cs
+++ b/API/VOIDCore.cs
@@ -35,35 +35,32 @@
 
 namespace VOID
 {
-	public abstract class VOIDCore : VOID_Module, IVOID_Module
+	public abstract class VOIDCore : VOID_WindowModule, IVOID_Module
 	{
 		public const double Constant_G = 6.674e-11;
 		public const int CONFIG_VERSION = 2;
 
-		public static bool useToolbarManager;
-
-		public abstract int configVersion { get; }
+		public abstract int ConfigVersion { get; }
 		public virtual bool configNeedsUpdate { get; set; }
 
-		public abstract int windowID { get; }
+		public abstract int WindowID { get; }
 		public abstract bool configDirty { get; set; }
 		public abstract bool powerAvailable	{ get; protected set; }
 
-		public abstract List<IVOID_Module> Modules { get; }
+		public abstract IList<IVOID_Module> Modules { get; }
 
-		public abstract float updateTimer { get; protected set; }
-		public abstract double updatePeriod { get; }
+		public abstract float UpdateTimer { get; protected set; }
+		public abstract double UpdatePeriod { get; }
 
 		public virtual float saveTimer { get; protected set; }
 
 		public abstract GUISkin Skin { get; }
 
 		public abstract CelestialBody HomeBody { get; }
-		public abstract List<CelestialBody> allBodies { get; }
-		public abstract List<CelestialBody> sortedBodyList { get; protected set; }
+		public abstract IList<CelestialBody> AllBodies { get; }
+		public abstract List<CelestialBody> SortedBodyList { get; protected set; }
 
-		public abstract List<VesselType> allVesselTypes { get; }
-
+		public abstract VesselType[] AllVesselTypes { get; protected set; }
 		public abstract Stage LastStage { get; protected set; }
 		public abstract Stage[] Stages { get; protected set; }
 
@@ -74,20 +71,14 @@
 
 		public override void LoadConfig()
 		{
-			var config = KSP.IO.PluginConfiguration.CreateForType<VOIDCore>(null);
-
-			useToolbarManager = config.GetValue("UseToolbarManager", useToolbarManager);
-
 			base.LoadConfig();
 		}
 
 		public abstract void SaveConfig();
 
-		public override void _SaveToConfig(KSP.IO.PluginConfiguration config)
+		public override void Save(KSP.IO.PluginConfiguration config)
 		{
-			config.SetValue("UseToolbarManager", useToolbarManager);
-
-			base._SaveToConfig(config);
+			base.Save(config);
 		}
 	}
 

--- a/API/VOIDMaster.cs
+++ b/API/VOIDMaster.cs
@@ -75,7 +75,7 @@
 
 			this.Core.Update ();
 
-			if (this.Core.factoryReset)
+			if (this.Core.FactoryReset)
 			{
 				this.LogDebug("Factory reset is true; deleting config and disposing!");
 

--- a/API/VOID_HUDModule.cs
+++ b/API/VOID_HUDModule.cs
@@ -56,11 +56,11 @@
 			{
 				if (this._colorIndex >= this.textColors.Count - 1)
 				{
-					this._colorIndex = 0;
+					this._colorIndex.value = 0;
 					return;
 				}
 
-				this._colorIndex = value;
+				this._colorIndex.value = value;
 			}
 		}
 
@@ -72,7 +72,7 @@
 
 		public VOID_HUDModule() : base()
 		{
-			this._colorIndex = 0;
+			this._colorIndex = (VOID_SaveValue<int>)0;
 
 			this.textColors = new List<Color>();
 
@@ -86,7 +86,7 @@
 			this.textColors.Add(Color.cyan);
 			this.textColors.Add(Color.magenta);
 
-			this.positionsLocked = true;
+			this.positionsLocked = (VOID_SaveValue<bool>)true;
 
 			this.Windows = new List<HUDWindow>();
 		}
@@ -107,7 +107,7 @@
 			foreach (HUDWindow window in this.Windows)
 			{
 				window.WindowPos = GUILayout.Window(
-					this.core.windowID,
+					this.core.WindowID,
 					window.WindowPos,
 					VOID_Tools.GetWindowHandler(window.WindowFunction),
 					GUIContent.none,
@@ -133,7 +133,7 @@
 				}
 			}
 
-			this.positionsLocked = GUITools.Toggle(this.positionsLocked, "Lock HUD Positions");
+			this.positionsLocked.value = GUITools.Toggle(this.positionsLocked, "Lock HUD Positions");
 		}
 
 		public override void LoadConfig()
@@ -152,9 +152,9 @@
 			}
 		}
 
-		public override void _SaveToConfig(KSP.IO.PluginConfiguration config)
-		{
-			base._SaveToConfig(config);
+		public override void Save(KSP.IO.PluginConfiguration config)
+		{
+			base.Save(config);
 
 			foreach (HUDWindow window in this.Windows)
 			{

--- a/API/VOID_Module.cs
+++ b/API/VOID_Module.cs
@@ -41,47 +41,30 @@
 		 * Fields
 		 * */
 		[AVOID_SaveValue("Active")]
-		protected VOID_SaveValue<bool> _Active = false;
+		protected VOID_SaveValue<bool> active = (VOID_SaveValue<bool>)false;
+
+		protected float lastUpdate = 0;
+
 		private GameScenes[] validScenes;
 		private Game.Modes[] validModes;
-
-		protected float lastUpdate = 0;
 
 		/*
 		 * Properties
 		 * */
-		protected virtual VOIDCore core
-		{
-			get
-			{
-				return VOID_Data.Core;
-			}
-		}
-
-		protected virtual bool timeToUpdate
-		{
-			get
-			{
-				return (
-					(this.core.updateTimer - this.lastUpdate) > this.core.updatePeriod ||
-					this.lastUpdate > this.core.updateTimer
-				);
-			}
-		}
-
-		public virtual bool toggleActive
-		{
-			get
-			{
-				return this._Active && this.inValidGame && this.inValidScene;
+
+		public virtual bool Active
+		{
+			get
+			{
+				return this.active && this.InValidGame && this.InValidScene;
 			}
 			set
 			{
-				this._Active = value && this.inValidGame && this.inValidScene;
-			}
-		}
-
-		public virtual bool guiRunning
+				this.active.value = value && this.InValidGame && this.InValidScene;
+			}
+		}
+
+		public virtual bool GUIRunning
 		{
 			get
 			{
@@ -106,44 +89,26 @@
 			}
 		}
 
-		public virtual GameScenes[] ValidScenes
-		{
-			get
-			{
-				if (this.validScenes == null)
-				{
-					Tools.PostDebugMessage(this, "validScenes is null when checking inValidScene; fetching attribute.");
-					foreach (var attr in this.GetType().GetCustomAttributes(false))
-					{
-						if (attr is VOID_ScenesAttribute)
-						{
-							VOID_ScenesAttribute addonAttr = (VOID_ScenesAttribute)attr;
-
-							this.validScenes = addonAttr.ValidScenes;
-
-							Tools.PostDebugMessage("Found VOID_ScenesAttribute; validScenes set.");
-
-							break;
-						}
-					}
-
-					if (this.validScenes == null)
-					{
-						this.validScenes = new GameScenes[] { GameScenes.FLIGHT };
-						Tools.PostDebugMessage("No VOID_ScenesAttribute found; validScenes defaulted to flight.");
-					}
-				}
-
-				return this.validScenes;
-			}
-		}
-
-		public virtual bool inValidScene
+		public virtual bool InValidGame
+		{
+			get
+			{
+				return this.ValidModes.Contains(HighLogic.CurrentGame.Mode);
+			}
+		}
+
+		public virtual bool InValidScene
 		{
 			get
 			{
 				return this.ValidScenes.Contains(HighLogic.LoadedScene);
 			}
+		}
+
+		public virtual string Name
+		{
+			get;
+			protected set;
 		}
 
 		public virtual Game.Modes[] ValidModes
@@ -186,34 +151,71 @@
 			}
 		}
 
-		public virtual bool inValidGame
-		{
-			get
-			{
-				return this.ValidModes.Contains(HighLogic.CurrentGame.Mode);
-			}
-		}
-
-		public virtual string Name
-		{
-			get;
-			protected set;
-		}
-
-		public virtual Vessel vessel
+		public virtual GameScenes[] ValidScenes
+		{
+			get
+			{
+				if (this.validScenes == null)
+				{
+					Tools.PostDebugMessage(this, "validScenes is null when checking inValidScene; fetching attribute.");
+					foreach (var attr in this.GetType().GetCustomAttributes(false))
+					{
+						if (attr is VOID_ScenesAttribute)
+						{
+							VOID_ScenesAttribute addonAttr = (VOID_ScenesAttribute)attr;
+
+							this.validScenes = addonAttr.ValidScenes;
+
+							Tools.PostDebugMessage("Found VOID_ScenesAttribute; validScenes set.");
+
+							break;
+						}
+					}
+
+					if (this.validScenes == null)
+					{
+						this.validScenes = new GameScenes[] { GameScenes.FLIGHT };
+						Tools.PostDebugMessage("No VOID_ScenesAttribute found; validScenes defaulted to flight.");
+					}
+				}
+
+				return this.validScenes;
+			}
+		}
+
+		public virtual Vessel Vessel
 		{
 			get
 			{
 				return FlightGlobals.ActiveVessel;
+			}
+		}
+
+		protected virtual VOIDCore core
+		{
+			get
+			{
+				return VOID_Data.Core;
+			}
+		}
+
+		protected virtual bool timeToUpdate
+		{
+			get
+			{
+				return (
+					(this.core.UpdateTimer - this.lastUpdate) > this.core.UpdatePeriod ||
+					this.lastUpdate > this.core.UpdateTimer
+				);
 			}
 		}
 
 		/*
 		 * Methods
 		 * */
-		public void StartGUI()
-		{
-			if (!this.toggleActive || this.guiRunning)
+		public virtual void StartGUI()
+		{
+			if (!this.Active || this.GUIRunning)
 			{
 				return;
 			}
@@ -222,9 +224,9 @@
 			RenderingManager.AddToPostDrawQueue (3, this.DrawGUI);
 		}
 
-		public void StopGUI()
-		{
-			if (!this.guiRunning)
+		public virtual void StopGUI()
+		{
+			if (!this.GUIRunning)
 			{
 				return;
 			}
@@ -349,7 +351,7 @@
 			}
 		}
 
-		public virtual void _SaveToConfig(KSP.IO.PluginConfiguration config)
+		public virtual void Save(KSP.IO.PluginConfiguration config)
 		{
 			foreach (var field in this.GetType().GetMembers(
 				BindingFlags.Instance |
@@ -407,40 +409,59 @@
 
 	public abstract class VOID_WindowModule : VOID_Module
 	{
-		protected static GUIContent closeButton;
-
-		protected static Dictionary<int, Action<int>> DecoratedWindows;
-
 		[AVOID_SaveValue("WindowPos")]
 		protected Rect WindowPos;
 		protected float defWidth;
 		protected float defHeight;
 
+		protected bool decorateWindow;
+
 		protected string inputLockName;
-
-		protected virtual Action<int> DecoratedWindow
-		{
-			get
-			{
-				return VOID_WindowModule.DecorateWindow(
-					this.ModuleWindow,
-					this.WindowPos,
-					(bool active) => { this.toggleActive = active; }
-				);
-			}
-		}
 
 		public VOID_WindowModule() : base()
 		{
 			this.defWidth = 250f;
 			this.defHeight = 50f;
 
+			this.decorateWindow = true;
+
 			this.inputLockName = string.Concat(this.Name, "_edlock");
 
 			this.WindowPos = new Rect(Screen.width / 2, Screen.height / 2, this.defWidth, this.defHeight);
 		}
 
-		public abstract void ModuleWindow(int _);
+		public virtual void ModuleWindow(int id)
+		{
+			GUIStyle buttonStyle = this.core.Skin.button;
+			RectOffset padding = buttonStyle.padding;
+			RectOffset border = buttonStyle.border;
+
+			Rect closeRect = new Rect(
+				0f,
+				0f,
+				border.left + border.right,
+				border.top + border.bottom
+			);
+
+			closeRect.width = Mathf.Max(closeRect.width, 16f);
+			closeRect.height = Mathf.Max(closeRect.height, 16f);
+
+			closeRect.x = this.WindowPos.width - closeRect.width - 2f;
+			closeRect.y = 2f;
+
+			GUI.Button(closeRect, GUIContent.none, buttonStyle);
+
+			if (Event.current.type == EventType.repaint && Input.GetMouseButtonUp(0))
+			{
+				if (closeRect.Contains(Event.current.mousePosition))
+				{
+					this.Active = false;
+					this.removeUILock();
+				}
+			}
+
+			GUI.DragWindow();
+		}
 
 		public override void DrawGUI()
 		{
@@ -449,137 +470,78 @@
 			Rect _Pos = this.WindowPos;
 
 			_Pos = GUILayout.Window(
-				this.core.windowID,
+				this.core.WindowID,
 				_Pos,
-				VOID_Tools.GetWindowHandler(this.DecoratedWindow),
+				VOID_Tools.GetWindowHandler(this.ModuleWindow),
 				this.Name,
 				GUILayout.Width(this.defWidth),
-				GUILayout.Height(this.defHeight),
-				GUILayout.ExpandWidth(true),
-				GUILayout.ExpandHeight(true)
+				GUILayout.Height(this.defHeight)
 			);
 
 			bool cursorInWindow = _Pos.Contains(Mouse.screenPos);
 
+			if (cursorInWindow)
+			{
+				this.setUILock();
+			}
+			else
+			{
+				this.removeUILock();
+			}
+
+			if (HighLogic.LoadedSceneIsEditor)
+			{
+				_Pos = Tools.ClampRectToEditorPad(_Pos);
+			}
+			else
+			{
+				_Pos = Tools.ClampRectToScreen(_Pos);
+			}
+
+			if (_Pos != this.WindowPos)
+			{
+				this.WindowPos = _Pos;
+				this.core.configDirty = true;
+			}
+		}
+
+		protected void setUILock()
+		{
 			switch (HighLogic.LoadedScene)
 			{
 				case GameScenes.EDITOR:
-					if (cursorInWindow)
-					{
-						InputLockManager.SetControlLock(
-							ControlTypes.EDITOR_ICON_HOVER | ControlTypes.EDITOR_ICON_PICK |
-							ControlTypes.EDITOR_PAD_PICK_COPY | ControlTypes.EDITOR_PAD_PICK_COPY,
-							this.inputLockName
-						);
-						EditorLogic.fetch.Lock(false, false, false, this.inputLockName);
-					}
-					else
-					{
-						EditorLogic.fetch.Unlock(this.inputLockName);
-					}
+					InputLockManager.SetControlLock(
+						ControlTypes.EDITOR_ICON_HOVER | ControlTypes.EDITOR_ICON_PICK |
+						ControlTypes.EDITOR_PAD_PICK_COPY | ControlTypes.EDITOR_PAD_PICK_COPY,
+						this.inputLockName
+					);
+					EditorLogic.fetch.Lock(false, false, false, this.inputLockName);
 					break;
 				case GameScenes.FLIGHT:
-					if (cursorInWindow)
-					{
-						InputLockManager.SetControlLock(ControlTypes.CAMERACONTROLS, this.inputLockName);
-					}
-					else if (InputLockManager.GetControlLock(this.inputLockName) != ControlTypes.None)
-					{
-						InputLockManager.RemoveControlLock(this.inputLockName);
-					}
+					InputLockManager.SetControlLock(ControlTypes.CAMERACONTROLS, this.inputLockName);
 					break;
 				case GameScenes.SPACECENTER:
-					if (cursorInWindow)
-					{
-						InputLockManager.SetControlLock(
-							ControlTypes.KSC_FACILITIES | ControlTypes.CAMERACONTROLS,
-							this.inputLockName
-						);
-					}
-					else if (InputLockManager.GetControlLock(this.inputLockName) != ControlTypes.None)
-					{
-						InputLockManager.RemoveControlLock(this.inputLockName);
-					}
+					InputLockManager.SetControlLock(
+						ControlTypes.KSC_FACILITIES | ControlTypes.CAMERACONTROLS,
+						this.inputLockName
+					);
 					break;
 			}
-
-			if (HighLogic.LoadedSceneIsEditor)
-			{
-				_Pos = Tools.ClampRectToEditorPad(_Pos);
-			}
-			else
-			{
-				_Pos = Tools.ClampRectToScreen(_Pos);
-			}
-
-			if (_Pos != this.WindowPos)
-			{
-				this.WindowPos = _Pos;
-				this.core.configDirty = true;
-			}
-		}
-
-		public static Action<int> DecorateWindow(Action<int> func, Rect windowRect, Callback<bool> callBack, bool useCache)
-		{
-			if (DecoratedWindows == null)
-			{
-				DecoratedWindows = new Dictionary<int, Action<int>>();
-			}
-
-			int hashCode = func.GetHashCode();
-
-			if (!useCache || !DecoratedWindows.ContainsKey(hashCode))
-			{
-				DecoratedWindows[hashCode] = delegate(int id)
-				{
-					func(id);
-
-					if (closeButton == null)
-					{
-						closeButton = new GUIContent("X");
-					}
-
-					Rect closeRect = GUILayoutUtility.GetRect(
-						closeButton,
-						VOID_Data.Core.Skin.button,
-						GUILayout.ExpandWidth(false)
-					);
-
-					closeRect.x = windowRect.width - closeRect.width - VOID_Data.Core.Skin.button.margin.right;
-					closeRect.y = VOID_Data.Core.Skin.button.margin.top;
-
-					GUI.Button(closeRect, closeButton, VOID_Data.Core.Skin.button);
-
-					if (Event.current.type == EventType.repaint && Input.GetMouseButtonUp(0))
-					{
-						if (closeRect.Contains(Event.current.mousePosition))
-						{
-							callBack(false);
-						}
-					}
-				};
-			}
-
-			return DecoratedWindows[hashCode];
-		}
-
-		public static Action<int> DecorateWindow(Action<int> func, Rect windowRect, Callback<bool> callBack)
-		{
-			return DecorateWindow(func, windowRect, callBack, true);
-		}
-
-		public static void UncacheWindow(Action<int> func)
-		{
-			if (DecoratedWindows != null)
-			{
-				int hashCode = func.GetHashCode();
-
-				if (DecoratedWindows.ContainsKey(hashCode))
-				{
-					VOID_Tools.UncacheWindow(DecoratedWindows[hashCode]);
-
-					DecoratedWindows.Remove(hashCode);
-				}
+		}
+
+		protected void removeUILock()
+		{
+			switch (HighLogic.LoadedScene)
+			{
+				case GameScenes.EDITOR:
+					EditorLogic.fetch.Unlock(this.inputLockName);
+					break;
+				case GameScenes.FLIGHT:
+					InputLockManager.RemoveControlLock(this.inputLockName);
+					break;
+				case GameScenes.SPACECENTER:
+					InputLockManager.RemoveControlLock(this.inputLockName);
+					break;
 			}
 		}
 	}

--- /dev/null
+++ b/API/VOID_SingletonCore.cs
@@ -1,1 +1,69 @@
+// VOID
+//
+// VOID_SingletonModule.cs
+//
+// Copyright © 2015, toadicus
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+//    this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be used
+//    to endorse or promote products derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+using System;
 
+namespace VOID
+{
+	public abstract class VOID_SingletonCore<T> : VOIDCore, IVOID_Module, IDisposable
+		where T : VOID_Module, new()
+	{
+		#region Singleton Members
+		/*
+		 * Static Members
+		 * */
+		protected static bool _initialized = false;
+
+		public static bool Initialized
+		{
+			get
+			{
+				return _initialized;
+			}
+		}
+
+		protected static T _instance;
+
+		public static T Instance
+		{
+			get
+			{
+				if (_instance == null)
+				{
+					_instance = new T();
+					_initialized = true;
+				}
+				return _instance;
+			}
+		}
+
+		public abstract void Dispose();
+		#endregion
+	}
+}
+
+

--- a/API/VOID_SingletonModule.cs
+++ /dev/null
@@ -1,67 +1,1 @@
-// VOID
-//
-// VOID_SingletonModule.cs
-//
-// Copyright © 2015, toadicus
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice,
-//    this list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-//    this list of conditions and the following disclaimer in the documentation and/or other
-//    materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its contributors may be used
-//    to endorse or promote products derived from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-using System;
 
-namespace VOID
-{
-	public abstract class VOID_SingletonModule<T> : VOIDCore, IVOID_Module
-		where T : VOID_Module, new()
-	{
-		#region Singleton Members
-		/*
-		 * Static Members
-		 * */
-		protected static bool _initialized = false;
-
-		public static bool Initialized
-		{
-			get
-			{
-				return _initialized;
-			}
-		}
-
-		protected static T _instance;
-
-		public static T Instance
-		{
-			get
-			{
-				if (_instance == null)
-				{
-					_instance = new T();
-					_initialized = true;
-				}
-				return _instance;
-			}
-		}
-		#endregion
-	}
-}
-
-

--- /dev/null
+++ b/API/VOID_SingletonWindow.cs
@@ -1,1 +1,73 @@
+// VOID
+//
+// VOID_SingletonModule.cs
+//
+// Copyright © 2015, toadicus
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+//    this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be used
+//    to endorse or promote products derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+using System;
 
+namespace VOID
+{
+	public abstract class VOID_SingletonWindow<T> : VOID_WindowModule, IVOID_Module, IDisposable
+		where T : VOID_WindowModule, new()
+	{
+		#region Singleton Members
+		/*
+		 * Static Members
+		 * */
+		protected static bool _initialized = false;
+
+		public static bool Initialized
+		{
+			get
+			{
+				return _initialized;
+			}
+		}
+
+		protected static T _instance;
+
+		public static T Instance
+		{
+			get
+			{
+				if (_instance == null)
+				{
+					_instance = new T();
+					_initialized = true;
+				}
+				return _instance;
+			}
+		}
+
+		public virtual void Dispose()
+		{
+			_instance = null;
+			_initialized = false;
+		}
+		#endregion
+	}
+}
+
+

--- a/Tools/VOID_DataValue.cs
+++ b/Tools/VOID_DataValue.cs
@@ -71,8 +71,8 @@
 			get
 			{
 				if (
-					(VOID_Data.Core.updateTimer - this.lastUpdate > VOID_Data.Core.updatePeriod) ||
-					(this.lastUpdate > VOID_Data.Core.updateTimer)
+					(VOID_Data.Core.UpdateTimer - this.lastUpdate > VOID_Data.Core.UpdatePeriod) ||
+					(this.lastUpdate > VOID_Data.Core.UpdateTimer)
 				)
 				{
 					this.Refresh();
@@ -97,7 +97,7 @@
 		public void Refresh()
 		{
 			this.cache = this.ValueFunc.Invoke ();
-			this.lastUpdate = VOID_Data.Core.updateTimer;
+			this.lastUpdate = VOID_Data.Core.UpdateTimer;
 		}
 
 		public T GetFreshValue()

--- /dev/null
+++ b/Tools/VOID_Localization.cs
@@ -1,1 +1,36 @@
+// VOID
+//
+// VOID_Localization.cs
+//
+// Copyright © 2014, toadicus
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+//    this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be used
+//    to endorse or promote products derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+public static class VOID_Localization
+{
+	public static string void_primary = "Primary";
+	public static string void_altitude_asl = "Altitude (ASL)";
+	public static string void_velocity = "Velocity";
+	public static string void_apoapsis = "Apoapsis";
+	public static string void_periapsis = "Periapsis";
+}

--- a/Tools/VOID_SaveValue.cs
+++ b/Tools/VOID_SaveValue.cs
@@ -66,11 +66,12 @@
 				if (this.Core != null && !System.Object.Equals(this._value, value))
 				{
 					Tools.PostDebugMessage (string.Format (
-						"VOID: Dirtying config for type {0} in method {1}." +
+						"VOID: Dirtying config for type {0}." +
 						"\n\t Old Value: {2}, New Value: {3}" +
-						"\n\t Object.Equals(New, Old): {4}",
+						"\n\t Object.Equals(New, Old): {4}\n" +
+						"{1}",
 						this._type,
-						new System.Diagnostics.StackTrace().GetFrame(1).GetMethod(),
+						new System.Diagnostics.StackTrace().ToString(),
 						this._value,
 						value,
 						System.Object.Equals(this._value, value)
@@ -107,7 +108,7 @@
 			return (T)v.value;
 		}
 
-		public static implicit operator VOID_SaveValue<T>(T v)
+		public static explicit operator VOID_SaveValue<T>(T v)
 		{
 			VOID_SaveValue<T> r = new VOID_SaveValue<T>();
 			r.type = v.GetType();

--- /dev/null
+++ b/Tools/VOID_StageExtensions.cs
@@ -1,1 +1,38 @@
+// VOID © 2015 toadicus
+//
+// This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a
+// copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/
 
+using KerbalEngineer.VesselSimulator;
+using KSP;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace VOID
+{
+	public static class VOID_StageExtensions
+	{
+		public static double NominalThrust(this Stage stage)
+		{
+			if (stage.actualThrust == 0d)
+			{
+				return stage.thrust;
+			}
+			else
+			{
+				return stage.actualThrust;
+			}
+		}
+
+		public static double MassFlow(this Stage stage)
+		{
+			double stageIsp = VOID_Data.Core.LastStage.isp;
+			double stageThrust = stage.NominalThrust();
+
+			return stageThrust / (stageIsp * VOID_Data.KerbinGee);
+		}
+	}
+}
+
+

--- a/Tools/VOID_Tools.cs
+++ b/Tools/VOID_Tools.cs
@@ -316,6 +316,7 @@
 		}
 		#endregion
 
+		#region WINDOW_UTILS
 		private static Dictionary<int, GUI.WindowFunction> functionCache;
 		public static UnityEngine.GUI.WindowFunction GetWindowHandler(Action<int> func)
 		{
@@ -377,7 +378,9 @@
 				}
 			}
 		}
-
+		#endregion
+
+		#region TIME_UTILS
 		/// <summary>
 		/// Formats the interval given in seconds as a human-friendly
 		/// time period in [[[[years, ]days, ]hours, ]minutes, and ]seconds.
@@ -545,6 +548,7 @@
 
 			public UnpackedTime() : this(0, 0, 0, 0, 0d) {}
 		}
+		#endregion
 
 		public static string UppercaseFirst(string s)
 		{

--- a/VOID.csproj
+++ b/VOID.csproj
@@ -83,7 +83,6 @@
     <Compile Include="VOID_VesselRegister.cs" />
     <Compile Include="VOID_DataLogger.cs" />
     <Compile Include="VOID_EditorHUD.cs" />
-    <Compile Include="VOID_Localization.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="VOID_HUDAdvanced.cs" />
     <Compile Include="VOID_TWR.cs" />
@@ -107,11 +106,15 @@
     <Compile Include="Tools\VOID_DataValue.cs" />
     <Compile Include="Tools\VOID_SaveValue.cs" />
     <Compile Include="API\VOID_HUDModule.cs" />
-    <Compile Include="API\VOID_SingletonModule.cs" />
     <Compile Include="API\Attributes\VOID_ScenesAttribute.cs" />
     <Compile Include="API\Attributes\AVOID_SaveValue.cs" />
     <Compile Include="API\VOIDMaster.cs" />
     <Compile Include="API\Attributes\VOID_GameModesAttribute.cs" />
+    <Compile Include="VOID_ConfigWindow.cs" />
+    <Compile Include="Tools\VOID_Localization.cs" />
+    <Compile Include="Tools\VOID_StageExtensions.cs" />
+    <Compile Include="API\VOID_SingletonCore.cs" />
+    <Compile Include="API\VOID_SingletonWindow.cs" />
   </ItemGroup>
   <ProjectExtensions>
     <MonoDevelop>

--- a/VOIDCore_Editor.cs
+++ b/VOIDCore_Editor.cs
@@ -39,11 +39,6 @@
 	[VOID_Scenes(GameScenes.EDITOR)]
 	public class VOIDCore_Editor : VOIDCore_Generic<VOIDCore_Editor>
 	{
-		public VOIDCore_Editor() : base()
-		{
-			this.Name = "VOID Core: Editor";
-		}
-
 		public override void FixedUpdate() {}
 	}
 }

--- a/VOIDCore_Flight.cs
+++ b/VOIDCore_Flight.cs
@@ -36,11 +36,6 @@
 	[VOID_Scenes(GameScenes.FLIGHT)]
 	public class VOIDCore_Flight : VOIDCore_Generic<VOIDCore_Flight>
 	{
-		public VOIDCore_Flight()
-		{
-			base.Name = "VOID Core: Flight";
-		}
-
 		public override void DrawConfigurables()
 		{
 			if (HighLogic.LoadedSceneIsFlight)

--- a/VOIDCore_Generic.cs
+++ b/VOIDCore_Generic.cs
@@ -37,7 +37,7 @@
 
 namespace VOID
 {
-	public abstract class VOIDCore_Generic<T> : VOID_SingletonModule<T>, IVOID_Module, IDisposable
+	public abstract class VOIDCore_Generic<T> : VOID_SingletonCore<T>, IVOID_Module, IDisposable
 		where T : VOID_Module, new()
 	{
 		/*
@@ -47,21 +47,10 @@
 		protected string VoidVersion;
 
 		[AVOID_SaveValue("configValue")]
-		protected VOID_SaveValue<int> _configVersion = VOIDCore.CONFIG_VERSION;
-
-		protected List<IVOID_Module> _modules = new List<IVOID_Module>();
-		protected bool _modulesLoaded = false;
-
-		[AVOID_SaveValue("mainWindowPos")]
-		protected VOID_SaveValue<Rect> mainWindowPos = new Rect(475, 575, 10f, 10f);
-		[AVOID_SaveValue("mainGuiMinimized")]
-		protected VOID_SaveValue<bool> mainGuiMinimized = false;
-
-		[AVOID_SaveValue("configWindowPos")]
-		protected VOID_SaveValue<Rect> configWindowPos = new Rect(825, 625, 10f, 10f);
-		[AVOID_SaveValue("configWindowMinimized")]
-
-		protected VOID_SaveValue<bool> configWindowMinimized = true;
+		protected VOID_SaveValue<int> configVersion = (VOID_SaveValue<int>)VOIDCore.CONFIG_VERSION;
+
+		protected List<IVOID_Module> modules = new List<IVOID_Module>();
+		protected bool modulesLoaded = false;
 
 		protected Texture2D VOIDIconTexture;
 		protected string VOIDIconOnActivePath;
@@ -69,45 +58,46 @@
 		protected string VOIDIconOffActivePath;
 		protected string VOIDIconOffInactivePath;
 
+		private bool _useToolbarManager;
+
 		protected GUIStyle iconStyle;
 
 		protected int windowBaseID = -96518722;
-		protected int _windowID = 0;
+		protected int windowID = 0;
 
 		protected bool GUIStylesLoaded = false;
 
-		protected CelestialBody _homeBody;
+		protected CelestialBody homeBody;
 
 		[AVOID_SaveValue("togglePower")]
-		public VOID_SaveValue<bool> togglePower = true;
+		public VOID_SaveValue<bool> togglePower = (VOID_SaveValue<bool>)true;
 
 		public override bool powerAvailable { get; protected set; }
 
 		[AVOID_SaveValue("consumeResource")]
-		protected VOID_SaveValue<bool> consumeResource = false;
+		protected VOID_SaveValue<bool> consumeResource = (VOID_SaveValue<bool>)false;
 
 		[AVOID_SaveValue("resourceName")]
-		protected VOID_SaveValue<string> resourceName = "ElectricCharge";
+		protected VOID_SaveValue<string> resourceName = (VOID_SaveValue<string>)"ElectricCharge";
 
 		[AVOID_SaveValue("resourceRate")]
-		protected VOID_SaveValue<float> resourceRate = 0.2f;
+		protected VOID_SaveValue<float> resourceRate = (VOID_SaveValue<float>)0.2f;
 
 		[AVOID_SaveValue("updatePeriod")]
-		protected VOID_SaveValue<double> _updatePeriod = 1001f / 15000f;
+		protected VOID_SaveValue<double> updatePeriod = (VOID_SaveValue<double>)(1001f / 15000f);
 		protected string stringFrequency;
 
 		[AVOID_SaveValue("vesselSimActive")]
 		protected VOID_SaveValue<bool> vesselSimActive;
 
 		// Vessel Type Housekeeping
-		protected List<VesselType> _allVesselTypes = new List<VesselType>();
 		protected bool vesselTypesLoaded = false;
 
 		protected string defaultSkin = "KSP window 2";
 
 		[AVOID_SaveValue("defaultSkin")]
-		protected VOID_SaveValue<string> _skinName;
-		protected int _skinIdx;
+		protected VOID_SaveValue<string> skinName;
+		protected int skinIdx;
 
 		protected Dictionary<string, GUISkin> validSkins;
 		protected string[] skinNames;
@@ -119,6 +109,7 @@
 				"ExperimentsDialogSkin",
 				"ExpRecoveryDialogSkin",
 				"KSP window 1",
+				"KSP window 3",
 				"KSP window 5",
 				"KSP window 6",
 				"PartTooltipSkin",
@@ -128,32 +119,78 @@
 
 		public override bool configDirty { get; set; }
 
-		internal IButton ToolbarButton;
-
-		internal ApplicationLauncherButton AppLauncherButton;
+		protected IButton ToolbarButton;
+		protected ApplicationLauncherButton AppLauncherButton;
+		protected IconState iconState;
 
 		/*
 		 * Properties
 		 * */
-		public override int configVersion
+		public override bool Active
 		{
 			get
 			{
-				return this._configVersion;
-			}
-		}
-
-		public bool factoryReset
+				return base.Active;
+			}
+			set
+			{
+				if (value != base.Active)
+				{
+					this.SetIconTexture(this.powerState | this.activeState);
+				}
+
+				base.Active = value;
+			}
+		}
+		public override IList<CelestialBody> AllBodies
+		{
+			get
+			{
+				return FlightGlobals.Bodies.AsReadOnly();
+			}
+		}
+
+		public override VesselType[] AllVesselTypes
 		{
 			get;
 			protected set;
 		}
 
-		public override List<IVOID_Module> Modules
+		public override int ConfigVersion
 		{
 			get
 			{
-				return this._modules;
+				return this.configVersion;
+			}
+		}
+
+		public bool FactoryReset
+		{
+			get;
+			protected set;
+		}
+
+		public override CelestialBody HomeBody
+		{
+			get
+			{
+				if (this.homeBody == null)
+				{
+					if (Planetarium.fetch != null)
+					{
+						this.homeBody = Planetarium.fetch.Home;
+					}
+				}
+
+				return this.homeBody;
+			}
+		}
+
+		public override IList<IVOID_Module> Modules
+		{
+			get
+			{
+				return this.modules.AsReadOnly();
 			}
 		}
 
@@ -165,7 +202,7 @@
 				{
 					try
 					{
-						return this.validSkins[this._skinName];
+						return this.validSkins[this.skinName];
 					}
 					catch
 					{
@@ -176,68 +213,35 @@
 			}
 		}
 
-		public override int windowID
-		{
-			get
-			{
-				if (this._windowID == 0)
-				{
-					this._windowID = this.windowBaseID;
-				}
-				return this._windowID++;
-			}
-		}
-
-		public override List<CelestialBody> allBodies
-		{
-			get
-			{
-				return FlightGlobals.Bodies;
-			}
-		}
-
-		public override List<CelestialBody> sortedBodyList
+		public override List<CelestialBody> SortedBodyList
 		{
 			get;
 			protected set;
 		}
 
-		public override CelestialBody HomeBody
+		public override double UpdatePeriod
 		{
 			get
 			{
-				if (this._homeBody == null)
-				{
-					if (Planetarium.fetch != null)
-					{
-						this._homeBody = Planetarium.fetch.Home;
-					}
-				}
-
-				return this._homeBody;
-			}
-		}
-
-		public override List<VesselType> allVesselTypes
-		{
-			get
-			{
-				return this._allVesselTypes;
-			}
-		}
-
-		public override float updateTimer
+				return this.updatePeriod;
+			}
+		}
+
+		public override float UpdateTimer
 		{
 			get;
 			protected set;
 		}
 
-
-		public override double updatePeriod
+		public override int WindowID
 		{
 			get
 			{
-				return this._updatePeriod;
+				if (this.windowID == 0)
+				{
+					this.windowID = this.windowBaseID;
+				}
+				return this.windowID++;
 			}
 		}
 
@@ -253,6 +257,22 @@
 			protected set;
 		}
 
+		protected IconState activeState
+		{
+			get
+			{
+				if (this.Active)
+				{
+					return IconState.Inactive;
+				}
+				else
+				{
+					return IconState.Active;
+				}
+
+			}
+		}
+
 		protected IconState powerState
 		{
 			get
@@ -269,31 +289,23 @@
 			}
 		}
 
-		protected IconState activeState
+		protected virtual ApplicationLauncher.AppScenes appIconVisibleScenes
 		{
 			get
 			{
-				if (this.mainGuiMinimized)
-				{
-					return IconState.Inactive;
-				}
-				else
-				{
-					return IconState.Active;
-				}
-
-			}
-		}
-
-		protected bool UseToolbarManager
+				return HighLogic.LoadedScene.ToAppScenes();
+			}
+		}
+
+		protected bool useToolbarManager
 		{
 			get
 			{
-				return useToolbarManager & ToolbarManager.ToolbarAvailable;
+				return _useToolbarManager & ToolbarManager.ToolbarAvailable;
 			}
 			set
 			{
-				if (useToolbarManager == value)
+				if (_useToolbarManager == value)
 				{
 					return;
 				}
@@ -314,15 +326,7 @@
 					this.InitializeToolbarButton();
 				}
 
-				useToolbarManager = value;
-			}
-		}
-
-		protected virtual ApplicationLauncher.AppScenes appIconVisibleScenes
-		{
-			get
-			{
-				return HighLogic.LoadedScene.ToAppScenes();
+				_useToolbarManager = value;
 			}
 		}
 
@@ -337,9 +341,9 @@
 		 * */
 		public override void DrawGUI()
 		{
-			this._windowID = this.windowBaseID;
-
-			if (!this._modulesLoaded)
+			this.windowID = this.windowBaseID;
+
+			if (!this.modulesLoaded)
 			{
 				this.LoadModulesOfType<IVOID_Module>();
 			}
@@ -359,10 +363,10 @@
 					this,
 					"ToolbarAvailable: {0}, UseToobarManager: {1}",
 					ToolbarManager.ToolbarAvailable,
-					this.UseToolbarManager);
-			}
-
-			if (!this.UseToolbarManager)
+					this.useToolbarManager);
+			}
+
+			if (!this.useToolbarManager)
 			{
 				if (this.AppLauncherButton == null)
 				{
@@ -384,72 +388,11 @@
 				this.InitializeToolbarButton();
 			}
 
-			if (!this.mainGuiMinimized)
-			{
-
-				Rect _mainWindowPos = this.mainWindowPos;
-
-				_mainWindowPos = GUILayout.Window(
-					this.windowID,
-					_mainWindowPos,
-					VOID_Tools.GetWindowHandler(
-						VOID_WindowModule.DecorateWindow(
-							this.VOIDMainWindow,
-							_mainWindowPos,
-							(bool active) => { this.mainGuiMinimized = !active; }
-						)),
-					string.Join(" ", new string[] { this.VoidName, this.VoidVersion }),
-					GUILayout.Width(250f),
-					GUILayout.Height(50f),
-					GUILayout.ExpandWidth(true),
-					GUILayout.ExpandHeight(true)
-				);
-
-				if (HighLogic.LoadedSceneIsEditor)
-				{
-					_mainWindowPos = Tools.ClampRectToEditorPad(_mainWindowPos);
-				}
-				else
-				{
-					_mainWindowPos = Tools.ClampRectToScreen(_mainWindowPos);
-				}
-
-				if (_mainWindowPos != this.mainWindowPos)
-				{
-					this.mainWindowPos = _mainWindowPos;
-				}
-			}
-
-			if (!this.configWindowMinimized && !this.mainGuiMinimized)
-			{
-				Rect _configWindowPos = this.configWindowPos;
-
-				_configWindowPos = GUILayout.Window(
-					this.windowID,
-					_configWindowPos,
-					VOID_Tools.GetWindowHandler(VOID_WindowModule.DecorateWindow(
-						this.VOIDConfigWindow,
-						_configWindowPos,
-						(bool active) => { this.configWindowMinimized = !active; }
-					)),
-					string.Join(" ", new string[] { this.VoidName, "Configuration" }),
-					GUILayout.Width(250),
-					GUILayout.Height(50)
-				);
-
-				if (HighLogic.LoadedSceneIsEditor)
-				{
-					_configWindowPos = Tools.ClampRectToEditorPad(_configWindowPos);
-				}
-				else
-				{
-					_configWindowPos = Tools.ClampRectToScreen(_configWindowPos);
-				}
-
-				if (_configWindowPos != this.configWindowPos)
-				{
-					this.configWindowPos = _configWindowPos;
-				}
+			this.SetIconTexture();
+
+			if (this.Active)
+			{
+				base.DrawGUI();
 			}
 		}
 
@@ -460,7 +403,7 @@
 			if (
 				this.vesselSimActive &&
 				(
-					this.vessel != null ||
+					this.Vessel != null ||
 					(
 						HighLogic.LoadedSceneIsEditor &&
 						EditorLogic.RootPart != null &&
@@ -473,17 +416,17 @@
 				this.UpdateSimManager();
 			}
 
-			if (!this.guiRunning)
+			if (!this.GUIRunning)
 			{
 				this.StartGUI();
 			}
 
-			foreach (IVOID_Module module in this.Modules)
+			foreach (IVOID_Module module in this.modules)
 			{
 				if (
-					!module.guiRunning &&
-					module.toggleActive &&
-					module.inValidScene &&
+					!module.GUIRunning &&
+					module.Active &&
+					module.InValidScene &&
 					(
 						!HighLogic.LoadedSceneIsEditor ||
 						(EditorLogic.RootPart != null && EditorLogic.SortedShipList.Count > 0)
@@ -493,12 +436,12 @@
 					module.StartGUI();
 				}
 				if (
-					module.guiRunning &&
+					module.GUIRunning &&
 					(
-						!module.toggleActive ||
+						!module.Active ||
 					    !this.togglePower ||
-						!module.inValidScene ||
-					    this.factoryReset ||
+						!module.InValidScene ||
+					    this.FactoryReset ||
 						(
 							HighLogic.LoadedSceneIsEditor &&
 							(EditorLogic.RootPart == null || EditorLogic.SortedShipList.Count == 0)
@@ -516,7 +459,7 @@
 			}
 
 			this.CheckAndSave();
-			this.updateTimer += Time.deltaTime;
+			this.UpdateTimer += Time.deltaTime;
 		}
 
 		public virtual void FixedUpdate()
@@ -524,10 +467,10 @@
 			bool newPowerState = this.powerAvailable;
 
 			if (this.togglePower && this.consumeResource &&
-			    this.vessel.vesselType != VesselType.EVA &&
+			    this.Vessel.vesselType != VesselType.EVA &&
 			    TimeWarp.deltaTime != 0)
 			{
-				float powerReceived = this.vessel.rootPart.RequestResource(
+				float powerReceived = this.Vessel.rootPart.RequestResource(
 					this.resourceName,
 					this.resourceRate * TimeWarp.fixedDeltaTime
 				);
@@ -544,11 +487,10 @@
 				if (this.powerAvailable != newPowerState)
 				{
 					this.powerAvailable = newPowerState;
-					this.SetIconTexture(this.powerState | this.activeState);
-				}
-			}
-
-			foreach (IVOID_Module module in this.Modules)
+				}
+			}
+
+			foreach (IVOID_Module module in this.modules)
 			{
 				if (module is IVOID_BehaviorModule)
 				{
@@ -559,7 +501,7 @@
 
 		public void OnDestroy()
 		{
-			foreach (IVOID_Module module in this.Modules)
+			foreach (IVOID_Module module in this.modules)
 			{
 				if (module is IVOID_BehaviorModule)
 				{
@@ -580,11 +522,19 @@
 			this.OnDestroy();
 		}
 
+		public override void StartGUI()
+		{
+			if (!this.GUIRunning)
+			{
+				RenderingManager.AddToPostDrawQueue(3, this.DrawGUI);
+			}
+		}
+
 		public void ResetGUI()
 		{
 			this.StopGUI();
 
-			foreach (IVOID_Module module in this.Modules)
+			foreach (IVOID_Module module in this.modules)
 			{
 				module.StopGUI();
 				module.StartGUI();
@@ -593,7 +543,7 @@
 			this.StartGUI();
 		}
 
-		public void VOIDMainWindow(int _)
+		public override void ModuleWindow(int id)
 		{
 			GUILayout.BeginVertical();
 
@@ -607,15 +557,19 @@
 					if (GUILayout.Button("Power " + str))
 					{
 						togglePower.value = !togglePower;
-						this.SetIconTexture(this.powerState | this.activeState);
 					}
 				}
 
 				if (togglePower || !HighLogic.LoadedSceneIsFlight)
 				{
-					foreach (IVOID_Module module in this.Modules)
+					foreach (IVOID_Module module in this.modules)
 					{
-						module.toggleActive = GUITools.Toggle(module.toggleActive, module.Name);
+						if (module is VOID_ConfigWindow)
+						{
+							continue;
+						}
+
+						module.Active = GUITools.Toggle(module.Active, module.Name);
 					}
 				}
 			}
@@ -624,27 +578,21 @@
 				GUILayout.Label("-- POWER LOST --", VOID_Styles.labelRed);
 			}
 
-			this.configWindowMinimized.value = !GUITools.Toggle(!this.configWindowMinimized, "Configuration");
+			VOID_ConfigWindow.Instance.Active = GUITools.Toggle(
+				VOID_ConfigWindow.Instance.Active,
+				"Configuration"
+			);
 
 			GUILayout.EndVertical();
-			GUI.DragWindow();
-		}
-
-		public void VOIDConfigWindow(int _)
-		{
-			GUILayout.BeginVertical();
-
-			this.DrawConfigurables();
-
-			GUILayout.EndVertical();
-			GUI.DragWindow();
+
+			base.ModuleWindow(id);
 		}
 
 		public override void DrawConfigurables()
 		{
 			GUIContent _content;
 
-			this.UseToolbarManager = GUITools.Toggle(this.UseToolbarManager, "Use Blizzy's Toolbar If Available");
+			this.useToolbarManager = GUITools.Toggle(this.useToolbarManager, "Use Blizzy's Toolbar If Available");
 
 			this.vesselSimActive.value = GUITools.Toggle(this.vesselSimActive.value,
 				"Enable Engineering Calculations");
@@ -659,11 +607,11 @@
 			_content.tooltip = "Select previous skin";
 			if (GUILayout.Button(_content, GUILayout.ExpandWidth(true)))
 			{
-				this._skinIdx--;
+				this.skinIdx--;
 				Tools.PostDebugMessage(string.Format(
-					"{0}: new this._skinIdx = {1} :: skin_list.Count = {2}",
+					"{0}: new this.skinIdx = {1} :: skin_list.Count = {2}",
 					this.GetType().Name,
-					this._skinName,
+					this.skinName,
 					this.validSkins.Count
 				));
 			}
@@ -676,24 +624,24 @@
 			_content.tooltip = "Select next skin";
 			if (GUILayout.Button(_content, GUILayout.ExpandWidth(true)))
 			{
-				this._skinIdx++;
+				this.skinIdx++;
 				Tools.PostDebugMessage(string.Format(
-					"{0}: new this._skinIdx = {1} :: skin_list.Count = {2}",
+					"{0}: new this.skinIdx = {1} :: skin_list.Count = {2}",
 					this.GetType().Name,
-					this._skinName,
+					this.skinName,
 					this.validSkins.Count
 				));
 			}
 
-			this._skinIdx %= this.skinNames.Length;
-			if (this._skinIdx < 0)
-			{
-				this._skinIdx += this.skinNames.Length;
-			}
-
-			if (this._skinName != skinNames[this._skinIdx])
-			{
-				this._skinName.value = skinNames[this._skinIdx];
+			this.skinIdx %= this.skinNames.Length;
+			if (this.skinIdx < 0)
+			{
+				this.skinIdx += this.skinNames.Length;
+			}
+
+			if (this.skinName != skinNames[this.skinIdx])
+			{
+				this.skinName.value = skinNames[this.skinIdx];
 				this.GUIStylesLoaded = false;
 			}
 
@@ -703,24 +651,24 @@
 			GUILayout.Label("Update Rate (Hz):");
 			if (this.stringFrequency == null)
 			{
-				this.stringFrequency = (1f / this.updatePeriod).ToString();
+				this.stringFrequency = (1f / this.UpdatePeriod).ToString();
 			}
 			this.stringFrequency = GUILayout.TextField(this.stringFrequency.ToString(), 5, GUILayout.ExpandWidth(true));
 
 			if (GUILayout.Button("Apply"))
 			{
-				double updateFreq = 1f / this.updatePeriod;
+				double updateFreq = 1f / this.UpdatePeriod;
 				double.TryParse(stringFrequency, out updateFreq);
-				this._updatePeriod = 1 / updateFreq;
+				this.updatePeriod.value = 1 / updateFreq;
 			}
 			GUILayout.EndHorizontal();
 
-			foreach (IVOID_Module mod in this.Modules)
+			foreach (IVOID_Module mod in this.modules)
 			{
 				mod.DrawConfigurables();
 			}
 
-			this.factoryReset = GUITools.Toggle(this.factoryReset, "Factory Reset");
+			this.FactoryReset = GUITools.Toggle(this.FactoryReset, "Factory Reset");
 		}
 
 		protected void UpdateSimManager()
@@ -733,11 +681,11 @@
 				}
 				else
 				{
-					double radius = this.vessel.Radius();
-					SimManager.Gravity = this.vessel.mainBody.gravParameter / (radius * radius);
-				}
-
-				SimManager.minSimTime = new TimeSpan(0, 0, 0, 0, (int)(this.updatePeriod * 1000d));
+					double radius = this.Vessel.Radius();
+					SimManager.Gravity = this.Vessel.mainBody.gravParameter / (radius * radius);
+				}
+
+				SimManager.minSimTime = new TimeSpan(0, 0, 0, 0, (int)(this.UpdatePeriod * 1000d));
 
 				SimManager.TryStartSimulation();
 			}
@@ -782,46 +730,6 @@
 
 					sb.AppendFormat("Checking IVOID_Module type {0}...", loadedType.Name);
 
-					GameScenes[] validScenes = null;
-
-					foreach (var attr in loadedType.GetCustomAttributes(true))
-					{
-						if (attr is VOID_ScenesAttribute)
-						{
-							validScenes = ((VOID_ScenesAttribute)attr).ValidScenes;
-
-							sb.Append("VOID_ScenesAttribute found;");
-
-							break;
-						}
-					}
-
-					if (validScenes == null)
-					{
-						validScenes = new GameScenes[] { GameScenes.FLIGHT };
-
-
-						sb.Append("VOID_ScenesAttribute not found;");
-
-					}
-
-					sb.AppendFormat(
-						" validScenes set to {0}.",
-						string.Join(
-							", ",
-							validScenes.Select(s => Enum.GetName(typeof(GameScenes), s)).ToArray()
-						)
-					);
-
-					if (!validScenes.Contains(HighLogic.LoadedScene))
-					{
-						sb.AppendFormat("  {0} not found in validScenes, skipping.",
-							Enum.GetName(typeof(GameScenes), HighLogic.LoadedScene));
-						continue;
-					}
-
-					sb.AppendFormat("Loading IVOID_Module type {0}...", loadedType.Name);
-
 					try
 					{
 						this.LoadModule(loadedType);
@@ -838,7 +746,7 @@
 				}
 			}
 
-			this._modulesLoaded = true;
+			this.modulesLoaded = true;
 
 			sb.AppendFormat("Loaded {0} modules.\n", this.Modules.Count);
 
@@ -847,7 +755,7 @@
 
 		protected void LoadModule(Type T)
 		{
-			var existingModules = this._modules.Where(mod => mod.GetType().Name == T.Name);
+			var existingModules = this.modules.Where(mod => mod.GetType().Name == T.Name);
 			if (existingModules.Any())
 			{
 				Tools.PostDebugMessage(string.Format(
@@ -860,7 +768,9 @@
 
 			var InstanceProperty = T.GetProperty(
 				"Instance",
-				System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public
+				System.Reflection.BindingFlags.Static |
+				System.Reflection.BindingFlags.Public |
+				System.Reflection.BindingFlags.FlattenHierarchy
 			);
 
 			object modInstance = null;
@@ -880,14 +790,24 @@
 				module = Activator.CreateInstance(T) as IVOID_Module;
 			}
 
-			module.LoadConfig();
-			this._modules.Add(module);
-
-			Tools.PostDebugMessage(string.Format(
-				"{0}: loaded module {1}.",
-				this.GetType().Name,
-				T.Name
-			));
+			if (module.InValidGame && module.InValidScene)
+			{
+				module.LoadConfig();
+				this.modules.Add(module);
+
+				Tools.PostDebugMessage(string.Format(
+						"{0}: loaded module {1}.",
+						this.GetType().Name,
+						T.Name
+					));
+			}
+			else
+			{
+				if (module is IDisposable)
+				{
+					(module as IDisposable).Dispose();
+				}
+			}
 		}
 
 		protected void LoadSkins()
@@ -920,29 +840,29 @@
 
 			for (int i = 0; i < this.skinNames.Length; i++)
 			{
-				if (this.skinNames[i] == this._skinName)
-				{
-					this._skinIdx = i;
+				if (this.skinNames[i] == this.skinName)
+				{
+					this.skinIdx = i;
 				}
 				if (this.skinNames[i] == this.defaultSkin)
 				{
 					defaultIdx = i;
 				}
-				if (this._skinIdx != int.MinValue && defaultIdx != int.MinValue)
+				if (this.skinIdx != int.MinValue && defaultIdx != int.MinValue)
 				{
 					break;
 				}
 			}
 
-			if (this._skinIdx == int.MinValue)
-			{
-				this._skinIdx = defaultIdx;
+			if (this.skinIdx == int.MinValue)
+			{
+				this.skinIdx = defaultIdx;
 			}
 
 			Tools.PostDebugMessage(string.Format(
 				"{0}: _skinIdx = {1}.",
 				this.GetType().Name,
-				this._skinName.ToString()
+				this.skinName.ToString()
 			));
 
 			this.skinsLoaded = true;
@@ -962,7 +882,7 @@
 
 		protected void LoadVesselTypes()
 		{
-			this._allVesselTypes = Enum.GetValues(typeof(VesselType)).OfType<VesselType>().ToList();
+			this.AllVesselTypes = Enum.GetValues(typeof(VesselType)).OfType<VesselType>().ToArray();
 			this.vesselTypesLoaded = true;
 		}
 
@@ -973,13 +893,13 @@
 				this.LoadVesselTypes();
 			}
 
-			if (this.sortedBodyList == null && FlightGlobals.Bodies != null && FlightGlobals.Bodies.Count > 0)
-			{
-				this.sortedBodyList = new List<CelestialBody>(FlightGlobals.Bodies);
-				this.sortedBodyList.Sort(new CBListComparer());
-				this.sortedBodyList.Reverse();
-
-				Debug.Log(string.Format("sortedBodyList: {0}", string.Join("\n\t", this.sortedBodyList.Select(b => b.bodyName).ToArray())));
+			if (this.SortedBodyList == null && FlightGlobals.Bodies != null && FlightGlobals.Bodies.Count > 0)
+			{
+				this.SortedBodyList = new List<CelestialBody>(FlightGlobals.Bodies);
+				this.SortedBodyList.Sort(new CBListComparer());
+				this.SortedBodyList.Reverse();
+
+				Debug.Log(string.Format("sortedBodyList: {0}", string.Join("\n\t", this.SortedBodyList.Select(b => b.bodyName).ToArray())));
 			}
 
 		}
@@ -1031,8 +951,20 @@
 
 		protected void ToggleMainWindow()
 		{
-			this.mainGuiMinimized = !this.mainGuiMinimized;
-			this.SetIconTexture(this.powerState | this.activeState);
+			this.Active = !this.Active;
+		}
+
+		protected void SetIconTexture()
+		{
+			if (
+				this.iconState != (this.powerState | this.activeState) ||
+				(this.VOIDIconTexture == null && this.AppLauncherButton != null)
+			)
+			{
+				this.iconState = this.powerState | this.activeState;
+
+				this.SetIconTexture(this.iconState);
+			}
 		}
 
 		protected void SetIconTexture(IconState state)
@@ -1058,15 +990,20 @@
 
 		protected void SetIconTexture(string texturePath)
 		{
+			if (texturePath == null)
+			{
+				return;
+			}
+
 			if (this.ToolbarButton != null)
 			{
 				this.ToolbarButton.TexturePath = texturePath;
 			}
 
-			this.VOIDIconTexture = GameDatabase.Instance.GetTexture(texturePath.Replace("icon", "appIcon"), false);
-
 			if (this.AppLauncherButton != null)
 			{
+				this.VOIDIconTexture = GameDatabase.Instance.GetTexture(texturePath.Replace("icon", "appIcon"), false);
+
 				this.AppLauncherButton.SetTexture(VOIDIconTexture);
 			}
 		}
@@ -1097,7 +1034,7 @@
 		{
 			base.LoadConfig();
 
-			foreach (IVOID_Module module in this.Modules)
+			foreach (IVOID_Module module in this.modules)
 			{
 				module.LoadConfig();
 			}
@@ -1114,11 +1051,11 @@
 
 			config.load();
 
-			this._SaveToConfig(config);
-
-			foreach (IVOID_Module module in this.Modules)
-			{
-				module._SaveToConfig(config);
+			this.Save(config);
+
+			foreach (IVOID_Module module in this.modules)
+			{
+				module.Save(config);
 			}
 
 			config.save();
@@ -1128,18 +1065,18 @@
 
 		public VOIDCore_Generic()
 		{
-			this.Name = "VOID Core";
-
 			System.Version version = this.GetType().Assembly.GetName().Version;
 
 			this.VoidVersion = string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.MajorRevision);
 
+			this.Name = string.Format("VOID {0}", this.VoidVersion.ToString());
+
 			this.powerAvailable = true;
 
-			this.toggleActive = true;
-
-			this._skinName = this.defaultSkin;
-			this._skinIdx = int.MinValue;
+			this.Active = true;
+
+			this.skinName = (VOID_SaveValue<string>)this.defaultSkin;
+			this.skinIdx = int.MinValue;
 
 			this.VOIDIconOnActivePath = "VOID/Textures/void_icon_light_glow";
 			this.VOIDIconOnInactivePath = "VOID/Textures/void_icon_dark_glow";
@@ -1147,26 +1084,26 @@
 			this.VOIDIconOffInactivePath = "VOID/Textures/void_icon_dark";
 
 			this.saveTimer = 0f;
-			this.updateTimer = 0f;
-
-			this.vesselSimActive = true;
+			this.UpdateTimer = 0f;
+
+			this.vesselSimActive = (VOID_SaveValue<bool>)true;
 			SimManager.Atmosphere = 0d;
 			SimManager.OnReady += this.GetSimManagerResults;
 
-			this.UseToolbarManager = ToolbarManager.ToolbarAvailable;
+			this.useToolbarManager = ToolbarManager.ToolbarAvailable;
 
 			this.LoadConfig();
 
-			this._configVersion = VOIDCore.CONFIG_VERSION;
-			
-			this.SetIconTexture(this.powerState | this.activeState);
-
-			this.factoryReset = false;
-		}
-
-		public virtual void Dispose()
+			this.configVersion = (VOID_SaveValue<int>)VOIDCore.CONFIG_VERSION;
+
+			this.FactoryReset = false;
+		}
+
+		public override void Dispose()
 		{
 			this.StopGUI();
+
+			this.onSkinChanged(this);
 
 			if (this.AppLauncherButton != null)
 			{
@@ -1193,4 +1130,3 @@
 	}
 }
 
-

--- a/VOIDCore_SpaceCentre.cs
+++ b/VOIDCore_SpaceCentre.cs
@@ -32,11 +32,6 @@
 	[VOID_Scenes(GameScenes.SPACECENTER)]
 	public class VOIDCore_SpaceCentre : VOIDCore_Generic<VOIDCore_SpaceCentre>
 	{
-		public VOIDCore_SpaceCentre() : base()
-		{
-			base.Name = "VOID Core: SpaceCentre";
-		}
-
 		public override void FixedUpdate() {}
 	}
 }

--- a/VOID_CBInfoBrowser.cs
+++ b/VOID_CBInfoBrowser.cs
@@ -37,22 +37,22 @@
 	public class VOID_CBInfoBrowser : VOID_WindowModule
 	{
 		[AVOID_SaveValue("selectedBodyIdx1")]
-		protected VOID_SaveValue<int> selectedBodyIdx1 = 1;
+		protected VOID_SaveValue<int> selectedBodyIdx1;
 
 		[AVOID_SaveValue("selectedBodyIdx2")]
-		protected VOID_SaveValue<int> selectedBodyIdx2 = 2;
+		protected VOID_SaveValue<int> selectedBodyIdx2;
 
 		protected CelestialBody selectedBody1;
 		protected CelestialBody selectedBody2;
 
 		[AVOID_SaveValue("toggleOrbital")]
-		protected VOID_SaveValue<bool> toggleOrbital = false;
+		protected VOID_SaveValue<bool> toggleOrbital;
 
 		[AVOID_SaveValue("togglePhysical")]
-		protected VOID_SaveValue<bool> togglePhysical = false;
+		protected VOID_SaveValue<bool> togglePhysical;
 
 		[AVOID_SaveValue("toggleScience")]
-		protected VOID_SaveValue<bool> toggleScience = false;
+		protected VOID_SaveValue<bool> toggleScience;
 
 		public VOID_CBInfoBrowser()
 		{
@@ -60,9 +60,16 @@
 
 			this.WindowPos.x = 10;
 			this.WindowPos.y = 85;
+
+			this.selectedBodyIdx1 = (VOID_SaveValue<int>)1;
+			this.selectedBodyIdx2 = (VOID_SaveValue<int>)2;
+
+			this.toggleOrbital = (VOID_SaveValue<bool>)false;
+			this.togglePhysical = (VOID_SaveValue<bool>)false;
+			this.toggleScience = (VOID_SaveValue<bool>)false;
 		}
 
-		public override void ModuleWindow(int _)
+		public override void ModuleWindow(int id)
 		{
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 
@@ -75,20 +82,26 @@
 
 			GUILayout.BeginVertical(GUILayout.Width(150));
 
-			selectedBody1 = this.core.allBodies[selectedBodyIdx1];
-			selectedBody2 = this.core.allBodies[selectedBodyIdx2];
+			selectedBody1 = this.core.AllBodies[selectedBodyIdx1];
+			selectedBody2 = this.core.AllBodies[selectedBodyIdx2];
 
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			if (GUILayout.Button("<", GUILayout.ExpandWidth(false)))
 			{
-				selectedBodyIdx1--;
-				if (selectedBodyIdx1 < 0) selectedBodyIdx1 = this.core.allBodies.Count - 1;
-			}
-			GUILayout.Label(this.core.allBodies[selectedBodyIdx1].bodyName, VOID_Styles.labelCenterBold, GUILayout.ExpandWidth(true));
+				selectedBodyIdx1.value--;
+				if (selectedBodyIdx1 < 0)
+				{
+					selectedBodyIdx1.value = this.core.AllBodies.Count - 1;
+				}
+			}
+			GUILayout.Label(this.core.AllBodies[selectedBodyIdx1].bodyName, VOID_Styles.labelCenterBold, GUILayout.ExpandWidth(true));
 			if (GUILayout.Button(">", GUILayout.ExpandWidth(false)))
 			{
-				selectedBodyIdx1++;
-				if (selectedBodyIdx1 > this.core.allBodies.Count - 1) selectedBodyIdx1 = 0;
+				selectedBodyIdx1.value++;
+				if (selectedBodyIdx1 > this.core.AllBodies.Count - 1)
+				{
+					selectedBodyIdx1.value = 0;
+				}
 			}
 			GUILayout.EndHorizontal();
 			GUILayout.EndVertical();
@@ -97,14 +110,20 @@
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			if (GUILayout.Button("<", GUILayout.ExpandWidth(false)))
 			{
-				selectedBodyIdx2--;
-				if (selectedBodyIdx2 < 0) selectedBodyIdx2 = this.core.allBodies.Count - 1;
-			}
-			GUILayout.Label(this.core.allBodies[selectedBodyIdx2].bodyName, VOID_Styles.labelCenterBold, GUILayout.ExpandWidth(true));
+				selectedBodyIdx2.value--;
+				if (selectedBodyIdx2 < 0)
+				{
+					selectedBodyIdx2.value = this.core.AllBodies.Count - 1;
+				}
+			}
+			GUILayout.Label(this.core.AllBodies[selectedBodyIdx2].bodyName, VOID_Styles.labelCenterBold, GUILayout.ExpandWidth(true));
 			if (GUILayout.Button(">", GUILayout.ExpandWidth(false)))
 			{
-				selectedBodyIdx2++;
-				if (selectedBodyIdx2 > this.core.allBodies.Count - 1) selectedBodyIdx2 = 0;
+				selectedBodyIdx2.value++;
+				if (selectedBodyIdx2 > this.core.AllBodies.Count - 1)
+				{
+					selectedBodyIdx2.value = 0;
+				}
 			}
 			GUILayout.EndHorizontal();
 			GUILayout.EndVertical();
@@ -277,7 +296,7 @@
 				GUILayout.EndHorizontal();
 			}
 
-			GUI.DragWindow();
+			base.ModuleWindow(id);
 		}
 
 		private void body_OP_show_orbital_info(CelestialBody body)

--- a/VOID_CareerStatus.cs
+++ b/VOID_CareerStatus.cs
@@ -36,14 +36,8 @@
 {
 	[VOID_Scenes(GameScenes.FLIGHT, GameScenes.EDITOR, GameScenes.SPACECENTER)]
 	[VOID_GameModes(Game.Modes.CAREER, Game.Modes.SCIENCE_SANDBOX)]
-	public class VOID_CareerStatus : VOID_WindowModule
+	public class VOID_CareerStatus : VOID_SingletonWindow<VOID_CareerStatus>
 	{
-		public static VOID_CareerStatus Instance
-		{
-			get;
-			private set;
-		}
-
 		public static string formatDelta(double delta, string numberFormat)
 		{
 			if (delta > 0)
@@ -151,7 +145,7 @@
 			base.DrawGUI();
 		}
 
-		public override void ModuleWindow(int _)
+		public override void ModuleWindow(int id)
 		{
 			GUILayout.BeginVertical();
 
@@ -178,7 +172,7 @@
 
 			GUILayout.EndVertical();
 
-			GUI.DragWindow();
+			base.ModuleWindow(id);
 		}
 
 		// TODO: Update event handlers to do something useful with the new "reasons" parameter.
@@ -233,8 +227,6 @@
 		 * */
 		public VOID_CareerStatus() : base()
 		{
-			VOID_CareerStatus.Instance = this;
-
 			this.Name = "Career Status";
 
 			GameEvents.OnFundsChanged.Add(this.onFundsChange);
@@ -266,14 +258,19 @@
 			this.currentReputation = float.NaN;
 		}
 
-		~VOID_CareerStatus()
+		public override void Dispose()
 		{
 			GameEvents.OnFundsChanged.Remove(this.onFundsChange);
 			GameEvents.OnReputationChanged.Remove(this.onRepChange);
 			GameEvents.OnScienceChanged.Remove(this.onScienceChange);
 			GameEvents.onGameStateLoad.Remove(this.onGameStateLoad);
 
-			VOID_CareerStatus.Instance = null;
+			base.Dispose();
+		}
+
+		~VOID_CareerStatus()
+		{
+			this.Dispose();
 		}
 	}
 }

--- /dev/null
+++ b/VOID_ConfigWindow.cs
@@ -1,1 +1,76 @@
+// VOID
+//
+// VOID_ConfigModule.cs
+//
+// Copyright © 2015, toadicus
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+//    this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be used
+//    to endorse or promote products derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+using KSP;
+using System;
+using ToadicusTools;
+using UnityEngine;
+
+namespace VOID
+{
+	public class VOID_ConfigWindow : VOID_SingletonWindow<VOID_ConfigWindow>
+	{
+		public override bool InValidScene
+		{
+			get
+			{
+				return true;
+			}
+		}
+
+		public override bool InValidGame
+		{
+			get
+			{
+				return true;
+			}
+		}
+
+		public VOID_ConfigWindow() : base()
+		{
+			this.Name = "VOID Configuration";
+		}
+
+		public override void ModuleWindow(int id)
+		{
+			GUILayout.BeginVertical();
+
+			this.core.DrawConfigurables();
+
+			GUILayout.EndVertical();
+
+			base.ModuleWindow(id);
+		}
+
+		~VOID_ConfigWindow()
+		{
+			this.Dispose();
+		}
+	}
+}
+

--- a/VOID_Data.cs
+++ b/VOID_Data.cs
@@ -38,6 +38,7 @@
 	public static class VOID_Data
 	{
 		private static Dictionary<int, IVOID_DataValue> dataValues = new Dictionary<int, IVOID_DataValue>();
+
 		public static Dictionary<int, IVOID_DataValue> DataValues
 		{
 			get
@@ -115,28 +116,28 @@
 		public static readonly VOID_DoubleValue atmDensity =
 			new VOID_DoubleValue(
 				"Atmosphere Density",
-				new Func<double>(() => Core.vessel.atmDensity * 1000f),
+				new Func<double>(() => Core.Vessel.atmDensity * 1000f),
 				"g/m³"
 			);
 
 		public static readonly VOID_FloatValue atmLimit =
 			new VOID_FloatValue(
 				"Atmosphere Limit",
-				new Func<float>(() => Core.vessel.mainBody.maxAtmosphereAltitude),
+				new Func<float>(() => Core.Vessel.mainBody.maxAtmosphereAltitude),
 				"m"
 			);
 
 		public static readonly VOID_DoubleValue atmPressure =
 			new VOID_DoubleValue(
 				"Pressure",
-				new Func<double>(() => Core.vessel.staticPressure),
+				new Func<double>(() => Core.Vessel.staticPressure),
 				"atm"
 			);
 
 		public static readonly VOID_FloatValue temperature =
 			new VOID_FloatValue(
 				"Temperature",
-				new Func<float>(() => Core.vessel.flightIntegrator.getExternalTemperature()),
+				new Func<float>(() => Core.Vessel.flightIntegrator.getExternalTemperature()),
 				"°C"
 			);
 
@@ -149,7 +150,7 @@
 				"Heading",
 				delegate()
 				{
-					double heading = Core.vessel.getSurfaceHeading();
+					double heading = Core.Vessel.getSurfaceHeading();
 					string cardinal = VOID_Tools.get_heading_text(heading);
 
 					return string.Format(
@@ -163,7 +164,7 @@
 		public static readonly VOID_DoubleValue vesselPitch =
 			new VOID_DoubleValue(
 				"Pitch",
-				() => Core.vessel.getSurfacePitch(),
+				() => Core.Vessel.getSurfacePitch(),
 				"°"
 			);
 
@@ -229,7 +230,7 @@
 		public static readonly VOID_FloatValue mainThrottle =
 			new VOID_FloatValue(
 				"Throttle",
-				new Func<float>(() => Core.vessel.ctrlState.mainThrottle * 100f),
+				new Func<float>(() => Core.Vessel.ctrlState.mainThrottle * 100f),
 				"%"
 			);
 
@@ -240,7 +241,7 @@
 		public static readonly VOID_IntValue partCount =
 			new VOID_IntValue(
 				"Parts",
-				new Func<int>(() => Core.vessel.Parts.Count),
+				new Func<int>(() => Core.Vessel.Parts.Count),
 				""
 			);
 
@@ -380,19 +381,7 @@
 						return double.NaN;
 					}
 
-					double stageIsp = Core.LastStage.isp;
-					double stageThrust = stageNominalThrust;
-
-					Tools.PostDebugMessage(typeof(VOID_Data), "calculating stageMassFlow from:\n" +
-						"\tstageIsp: {0}\n" +
-						"\tstageThrust: {1}\n" +
-						"\tKerbinGee: {2}\n",
-						stageIsp,
-						stageThrust,
-						KerbinGee
-					);
-
-					return stageThrust / (stageIsp * KerbinGee);
+					return Core.LastStage.MassFlow();
 				},
 				"Mg/s"
 			);
@@ -407,14 +396,7 @@
 						return double.NaN;
 					}
 
-					if (Core.LastStage.actualThrust == 0d)
-					{
-						return Core.LastStage.thrust;
-					}
-					else
-					{
-						return Core.LastStage.actualThrust;
-					}
+					return Core.LastStage.NominalThrust();
 				},
 				"kN"
 			);
@@ -480,8 +462,8 @@
 
 					double maxThrust = Core.LastStage.thrust;
 					double mass = Core.LastStage.totalMass;
-					double gravity = (VOIDCore.Constant_G * Core.vessel.mainBody.Mass) /
-					               (Core.vessel.mainBody.Radius * Core.vessel.mainBody.Radius);
+					double gravity = (VOIDCore.Constant_G * Core.Vessel.mainBody.Mass) /
+					                 (Core.Vessel.mainBody.Radius * Core.Vessel.mainBody.Radius);
 					double weight = mass * gravity;
 
 					return maxThrust / weight;
@@ -494,12 +476,12 @@
 				"Thrust Offset",
 				delegate()
 				{
-					if (Core.vessel == null)
+					if (Core.Vessel == null)
 					{
 						return Vector3d.zero;
 					}
 
-					List<PartModule> engineModules = Core.vessel.getModulesOfType<PartModule>();
+					List<PartModule> engineModules = Core.Vessel.getModulesOfType<PartModule>();
 
 					Vector3d thrustPos = Vector3d.zero;
 					Vector3d thrustDir = Vector3d.zero;
@@ -558,23 +540,23 @@
 						thrustDir /= thrust;
 					}
 
-					Transform vesselTransform = Core.vessel.transform;
+					Transform vesselTransform = Core.Vessel.transform;
 
 					thrustPos = vesselTransform.InverseTransformPoint(thrustPos);
 					thrustDir = vesselTransform.InverseTransformDirection(thrustDir);
 
 					Vector3d thrustOffset = VectorTools.PointDistanceToLine(
-						                      thrustPos, thrustDir.normalized, Core.vessel.findLocalCenterOfMass());
+						                        thrustPos, thrustDir.normalized, Core.Vessel.findLocalCenterOfMass());
 
 					Tools.PostDebugMessage(typeof(VOID_Data), "vesselThrustOffset:\n" +
-						"\tthrustPos: {0}\n" +
-						"\tthrustDir: {1}\n" +
-						"\tthrustOffset: {2}\n" +
-						"\tvessel.CoM: {3}",
+					"\tthrustPos: {0}\n" +
+					"\tthrustDir: {1}\n" +
+					"\tthrustOffset: {2}\n" +
+					"\tvessel.CoM: {3}",
 						thrustPos,
 						thrustDir.normalized,
 						thrustOffset,
-						Core.vessel.findWorldCenterOfMass()
+						Core.Vessel.findWorldCenterOfMass()
 					);
 
 					return thrustOffset;
@@ -597,7 +579,7 @@
 					currentAmount = 0d;
 					currentRequirement = 0d;
 
-					foreach (Part part in Core.vessel.Parts)
+					foreach (Part part in Core.Vessel.Parts)
 					{
 						if (part.enabled)
 						{
@@ -610,9 +592,9 @@
 								propellantList = engineModule.propellants;
 							}
 							else if (part.tryGetFirstModuleOfType<ModuleEnginesFX>(out enginesFXModule))
-								{
-									propellantList = enginesFXModule.propellants;
-								}
+							{
+								propellantList = enginesFXModule.propellants;
+							}
 
 							if (propellantList != null)
 							{
@@ -656,9 +638,9 @@
 				"Crew Onboard",
 				delegate()
 				{
-					if (Core.vessel != null)
-					{
-						return Core.vessel.GetCrewCount();
+					if (Core.Vessel != null)
+					{
+						return Core.Vessel.GetCrewCount();
 					}
 					else
 					{
@@ -673,9 +655,9 @@
 				"Crew Capacity",
 				delegate()
 				{
-					if (Core.vessel != null)
-					{
-						return Core.vessel.GetCrewCapacity();
+					if (Core.Vessel != null)
+					{
+						return Core.Vessel.GetCrewCapacity();
 					}
 					else
 					{
@@ -700,15 +682,15 @@
 				delegate()
 				{
 
-					if (Core.vessel == null ||
-					  Planetarium.fetch == null ||
-					  Core.vessel.mainBody != Planetarium.fetch.Home)
-					{
-						return double.NaN;
-					}
-
-					double vesselLongitude = Core.vessel.longitude * Math.PI / 180d;
-					double vesselLatitude = Core.vessel.latitude * Math.PI / 180d;
+					if (Core.Vessel == null ||
+					    Planetarium.fetch == null ||
+					    Core.Vessel.mainBody != Planetarium.fetch.Home)
+					{
+						return double.NaN;
+					}
+
+					double vesselLongitude = Core.Vessel.longitude * Math.PI / 180d;
+					double vesselLatitude = Core.Vessel.latitude * Math.PI / 180d;
 
 					double diffLon = vesselLongitude - kscLongitude;
 					double diffLat = vesselLatitude - kscLatitude;
@@ -725,7 +707,7 @@
 
 					double arc = 2d * Math.Atan2(Math.Sqrt(haversine), Math.Sqrt(1d - haversine));
 
-					return Core.vessel.mainBody.Radius * arc;
+					return Core.Vessel.mainBody.Radius * arc;
 				},
 				"m"
 			);
@@ -733,13 +715,13 @@
 		public static readonly VOID_StrValue surfLatitude =
 			new VOID_StrValue(
 				"Latitude",
-				new Func<string>(() => VOID_Tools.GetLatitudeString(Core.vessel))
+				new Func<string>(() => VOID_Tools.GetLatitudeString(Core.Vessel))
 			);
 
 		public static readonly VOID_StrValue surfLongitude =
 			new VOID_StrValue(
 				"Longitude",
-				new Func<string>(() => VOID_Tools.GetLongitudeString(Core.vessel))
+				new Func<string>(() => VOID_Tools.GetLongitudeString(Core.Vessel))
 			);
 
 		public static readonly VOID_DoubleValue trueAltitude =
@@ -747,11 +729,11 @@
 				"Altitude (true)",
 				delegate()
 				{
-					double alt_true = Core.vessel.orbit.altitude - Core.vessel.terrainAltitude;
+					double alt_true = Core.Vessel.orbit.altitude - Core.Vessel.terrainAltitude;
 					// HACK: This assumes that on worlds with oceans, all water is fixed at 0 m,
 					// and water covers the whole surface at 0 m.
-					if (Core.vessel.terrainAltitude < 0 && Core.vessel.mainBody.ocean)
-						alt_true = Core.vessel.orbit.altitude;
+					if (Core.Vessel.terrainAltitude < 0 && Core.Vessel.mainBody.ocean)
+						alt_true = Core.Vessel.orbit.altitude;
 					return alt_true;
 				},
 				"m"
@@ -764,28 +746,28 @@
 		public static readonly VOID_DoubleValue geeForce =
 			new VOID_DoubleValue(
 				"G-force",
-				new Func<double>(() => Core.vessel.geeForce),
+				new Func<double>(() => Core.Vessel.geeForce),
 				"gees"
 			);
 
 		public static readonly VOID_DoubleValue horzVelocity =
 			new VOID_DoubleValue(
 				"Horizontal speed",
-				new Func<double>(() => Core.vessel.horizontalSrfSpeed),
+				new Func<double>(() => Core.Vessel.horizontalSrfSpeed),
 				"m/s"
 			);
 
 		public static readonly VOID_DoubleValue surfVelocity =
 			new VOID_DoubleValue(
 				"Surface velocity",
-				new Func<double>(() => Core.vessel.srf_velocity.magnitude),
+				new Func<double>(() => Core.Vessel.srf_velocity.magnitude),
 				"m/s"
 			);
 
 		public static readonly VOID_DoubleValue vertVelocity =
 			new VOID_DoubleValue(
 				"Vertical speed",
-				new Func<double>(() => Core.vessel.verticalSpeed),
+				new Func<double>(() => Core.Vessel.verticalSpeed),
 				"m/s"
 			);
 
@@ -801,9 +783,9 @@
 				"Angular Velocity",
 				delegate()
 				{
-					if (Core.vessel != null)
-					{
-						return Core.vessel.angularVelocity.magnitude;
+					if (Core.Vessel != null)
+					{
+						return Core.Vessel.angularVelocity.magnitude;
 					}
 					else
 					{
@@ -821,14 +803,14 @@
 		{
 			get
 			{
-				if (Core.vessel == null ||
-				    Core.vessel.patchedConicSolver == null ||
-				    Core.vessel.patchedConicSolver.maneuverNodes == null)
+				if (Core.Vessel == null ||
+				    Core.Vessel.patchedConicSolver == null ||
+				    Core.Vessel.patchedConicSolver.maneuverNodes == null)
 				{
 					return 0;
 				}
 
-				return Core.vessel.patchedConicSolver.maneuverNodes.Count;
+				return Core.Vessel.patchedConicSolver.maneuverNodes.Count;
 			}
 		}
 
@@ -842,7 +824,7 @@
 						return "N/A";
 					}
 
-					ManeuverNode node = Core.vessel.patchedConicSolver.maneuverNodes[0];
+					ManeuverNode node = Core.Vessel.patchedConicSolver.maneuverNodes[0];
 
 					if ((node.UT - Planetarium.GetUniversalTime()) < 0)
 					{
@@ -884,7 +866,7 @@
 						return "N/A";
 					}
 
-					ManeuverNode node = Core.vessel.patchedConicSolver.maneuverNodes[0];
+					ManeuverNode node = Core.Vessel.patchedConicSolver.maneuverNodes[0];
 
 					if ((node.UT - Planetarium.GetUniversalTime()) < 0)
 					{
@@ -923,7 +905,7 @@
 				{
 					if (upcomingManeuverNodes > 0)
 					{
-						return Core.vessel.patchedConicSolver.maneuverNodes[0].DeltaV.magnitude;
+						return Core.Vessel.patchedConicSolver.maneuverNodes[0].DeltaV.magnitude;
 					}
 					else
 					{
@@ -940,7 +922,7 @@
 				{
 					if (upcomingManeuverNodes > 0)
 					{
-						return Core.vessel.patchedConicSolver.maneuverNodes[0].GetBurnVector(Core.vessel.orbit).magnitude;
+						return Core.Vessel.patchedConicSolver.maneuverNodes[0].GetBurnVector(Core.Vessel.orbit).magnitude;
 					}
 					else
 					{
@@ -955,14 +937,12 @@
 				"Total Burn Time",
 				delegate()
 				{
-					if (Core.LastStage == null || currManeuverDeltaV.Value == double.NaN)
-					{
-						return double.NaN;
-					}
-
-					double stageThrust = stageNominalThrust;
-
-					return burnTime(currManeuverDeltaV.Value, totalMass, stageMassFlow, stageThrust);
+					if (currManeuverDeltaV.Value == double.NaN)
+					{
+						return double.NaN;
+					}
+
+					return realVesselBurnTime(currManeuverDeltaV.Value);
 				},
 				"s"
 			);
@@ -972,14 +952,12 @@
 				"Burn Time Remaining",
 				delegate()
 				{
-					if (Core.LastStage == null || currManeuverDVRemaining == double.NaN)
-					{
-						return double.NaN;
-					}
-
-					double stageThrust = stageNominalThrust;
-
-					return burnTime(currManeuverDVRemaining, totalMass, stageMassFlow, stageThrust);
+					if (currManeuverDVRemaining.Value == double.NaN)
+					{
+						return double.NaN;
+					}
+
+					return realVesselBurnTime(currManeuverDVRemaining.Value);
 				},
 				"s"
 			);
@@ -989,14 +967,12 @@
 				"Half Burn Time",
 				delegate()
 				{
-					if (Core.LastStage == null || currManeuverDeltaV.Value == double.NaN)
-					{
-						return double.NaN;
-					}
-
-					double stageThrust = stageNominalThrust;
-
-					return burnTime(currManeuverDeltaV.Value / 2d, totalMass, stageMassFlow, stageThrust);
+					if (currManeuverDeltaV.Value == double.NaN)
+					{
+						return double.NaN;
+					}
+
+					return realVesselBurnTime(currManeuverDeltaV.Value / 2d);
 				},
 				"s"
 			);
@@ -1008,7 +984,7 @@
 				{
 					if (upcomingManeuverNodes > 1)
 					{
-						return Core.vessel.patchedConicSolver.maneuverNodes[1].DeltaV.magnitude;
+						return Core.Vessel.patchedConicSolver.maneuverNodes[1].DeltaV.magnitude;
 					}
 					else
 					{
@@ -1027,58 +1003,58 @@
 				VOID_Localization.void_primary,
 				delegate()
 				{
-					if (Core.vessel == null)
+					if (Core.Vessel == null)
 					{
 						return string.Empty;
 					}
-					return Core.vessel.mainBody.name;
+					return Core.Vessel.mainBody.name;
 				}
 			);
 
 		public static readonly VOID_DoubleValue orbitAltitude =
 			new VOID_DoubleValue(
 				"Altitude (ASL)",
-				new Func<double>(() => Core.vessel.orbit.altitude),
+				new Func<double>(() => Core.Vessel.orbit.altitude),
 				"m"
 			);
 
 		public static readonly VOID_DoubleValue orbitVelocity =
 			new VOID_DoubleValue(
 				VOID_Localization.void_velocity,
-				new Func<double>(() => Core.vessel.orbit.vel.magnitude),
+				new Func<double>(() => Core.Vessel.orbit.vel.magnitude),
 				"m/s"
 			);
 
 		public static readonly VOID_DoubleValue orbitApoAlt =
 			new VOID_DoubleValue(
 				VOID_Localization.void_apoapsis,
-				new Func<double>(() => Core.vessel.orbit.ApA),
+				new Func<double>(() => Core.Vessel.orbit.ApA),
 				"m"
 			);
 
 		public static readonly VOID_DoubleValue oribtPeriAlt =
 			new VOID_DoubleValue(
 				VOID_Localization.void_periapsis,
-				new Func<double>(() => Core.vessel.orbit.PeA),
+				new Func<double>(() => Core.Vessel.orbit.PeA),
 				"m"
 			);
 
 		public static readonly VOID_StrValue timeToApo =
 			new VOID_StrValue(
 				"Time to Apoapsis",
-				new Func<string>(() => VOID_Tools.FormatInterval(Core.vessel.orbit.timeToAp))
+				new Func<string>(() => VOID_Tools.FormatInterval(Core.Vessel.orbit.timeToAp))
 			);
 
 		public static readonly VOID_StrValue timeToPeri =
 			new VOID_StrValue(
 				"Time to Periapsis",
-				new Func<string>(() => VOID_Tools.FormatInterval(Core.vessel.orbit.timeToPe))
+				new Func<string>(() => VOID_Tools.FormatInterval(Core.Vessel.orbit.timeToPe))
 			);
 
 		public static readonly VOID_DoubleValue orbitInclination =
 			new VOID_DoubleValue(
 				"Inclination",
-				new Func<double>(() => Core.vessel.orbit.inclination),
+				new Func<double>(() => Core.Vessel.orbit.inclination),
 				"°"
 			);
 
@@ -1087,9 +1063,9 @@
 				"Gravity",
 				delegate()
 				{
-					double orbitRadius = Core.vessel.mainBody.Radius +
-					                   Core.vessel.mainBody.GetAltitude(Core.vessel.findWorldCenterOfMass());
-					return (VOIDCore.Constant_G * Core.vessel.mainBody.Mass) /
+					double orbitRadius = Core.Vessel.mainBody.Radius +
+					                     Core.Vessel.mainBody.GetAltitude(Core.Vessel.findWorldCenterOfMass());
+					return (VOIDCore.Constant_G * Core.Vessel.mainBody.Mass) /
 					(orbitRadius * orbitRadius);
 				},
 				"m/s²"
@@ -1098,55 +1074,55 @@
 		public static readonly VOID_StrValue orbitPeriod =
 			new VOID_StrValue(
 				"Period",
-				new Func<string>(() => VOID_Tools.FormatInterval(Core.vessel.orbit.period))
+				new Func<string>(() => VOID_Tools.FormatInterval(Core.Vessel.orbit.period))
 			);
 
 		public static readonly VOID_DoubleValue semiMajorAxis =
 			new VOID_DoubleValue(
 				"Semi-Major Axis",
-				new Func<double>(() => Core.vessel.orbit.semiMajorAxis),
+				new Func<double>(() => Core.Vessel.orbit.semiMajorAxis),
 				"m"
 			);
 
 		public static readonly VOID_DoubleValue eccentricity =
 			new VOID_DoubleValue(
 				"Eccentricity",
-				new Func<double>(() => Core.vessel.orbit.eccentricity),
+				new Func<double>(() => Core.Vessel.orbit.eccentricity),
 				""
 			);
 
 		public static readonly VOID_DoubleValue meanAnomaly =
 			new VOID_DoubleValue(
 				"Mean Anomaly",
-				new Func<double>(() => Core.vessel.orbit.meanAnomaly * 180d / Math.PI),
+				new Func<double>(() => Core.Vessel.orbit.meanAnomaly * 180d / Math.PI),
 				"°"
 			);
 
 		public static readonly VOID_DoubleValue trueAnomaly = 
 			new VOID_DoubleValue(
 				"True Anomaly",
-				new Func<double>(() => Core.vessel.orbit.trueAnomaly),
+				new Func<double>(() => Core.Vessel.orbit.trueAnomaly),
 				"°"
 			);
 
 		public static readonly VOID_DoubleValue eccAnomaly =
 			new VOID_DoubleValue(
 				"Eccentric Anomaly",
-				new Func<double>(() => Core.vessel.orbit.eccentricAnomaly * 180d / Math.PI),
+				new Func<double>(() => Core.Vessel.orbit.eccentricAnomaly * 180d / Math.PI),
 				"°"
 			);
 
 		public static readonly VOID_DoubleValue longitudeAscNode =
 			new VOID_DoubleValue(
 				"Long. Ascending Node",
-				new Func<double>(() => Core.vessel.orbit.LAN),
+				new Func<double>(() => Core.Vessel.orbit.LAN),
 				"°"
 			);
 
 		public static readonly VOID_DoubleValue argumentPeriapsis =
 			new VOID_DoubleValue(
 				"Argument of Periapsis",
-				new Func<double>(() => Core.vessel.orbit.argumentOfPeriapsis),
+				new Func<double>(() => Core.Vessel.orbit.argumentOfPeriapsis),
 				"°"
 			);
 
@@ -1156,16 +1132,16 @@
 				delegate()
 				{
 					double trueAnomalyAscNode = 360d - argumentPeriapsis;
-					double dTAscNode = Core.vessel.orbit.GetDTforTrueAnomaly(
-						trueAnomalyAscNode * Mathf.Deg2Rad,
-						Core.vessel.orbit.period
-					);
-
-					dTAscNode %= Core.vessel.orbit.period;
+					double dTAscNode = Core.Vessel.orbit.GetDTforTrueAnomaly(
+						                   trueAnomalyAscNode * Mathf.Deg2Rad,
+						                   Core.Vessel.orbit.period
+					                   );
+
+					dTAscNode %= Core.Vessel.orbit.period;
 
 					if (dTAscNode < 0d)
 					{
-						dTAscNode += Core.vessel.orbit.period;
+						dTAscNode += Core.Vessel.orbit.period;
 					}
 
 					return VOID_Tools.FormatInterval(dTAscNode);
@@ -1178,16 +1154,16 @@
 				delegate()
 				{
 					double trueAnomalyAscNode = 180d - argumentPeriapsis;
-					double dTDescNode = Core.vessel.orbit.GetDTforTrueAnomaly(
-						trueAnomalyAscNode * Mathf.Deg2Rad,
-						Core.vessel.orbit.period
-					);
-
-					dTDescNode %= Core.vessel.orbit.period;
+					double dTDescNode = Core.Vessel.orbit.GetDTforTrueAnomaly(
+						                    trueAnomalyAscNode * Mathf.Deg2Rad,
+						                    Core.Vessel.orbit.period
+					                    );
+
+					dTDescNode %= Core.Vessel.orbit.period;
 
 					if (dTDescNode < 0d)
 					{
-						dTDescNode += Core.vessel.orbit.period;
+						dTDescNode += Core.Vessel.orbit.period;
 					}
 
 					return VOID_Tools.FormatInterval(dTDescNode);
@@ -1198,7 +1174,7 @@
 			new VOID_DoubleValue(
 				"Local Sidereal Longitude",
 				new Func<double>(() => VOID_Tools.FixDegreeDomain(
-						Core.vessel.longitude + Core.vessel.orbit.referenceBody.rotationAngle)),
+					Core.Vessel.longitude + Core.Vessel.orbit.referenceBody.rotationAngle)),
 				"°"
 			);
 
@@ -1209,7 +1185,7 @@
 		public static readonly VOID_StrValue expSituation =
 			new VOID_StrValue(
 				"Situation",
-				new Func<string>(() => Core.vessel.GetExperimentSituation().HumanString())
+				new Func<string>(() => Core.Vessel.GetExperimentSituation().HumanString())
 			);
 
 		public static readonly VOID_StrValue currBiome =
@@ -1217,13 +1193,13 @@
 				"Biome",
 				delegate()
 				{
-					if (Core.vessel.landedAt == string.Empty)
-					{
-						return VOID_Tools.GetBiome(Core.vessel).name;
+					if (Core.Vessel.landedAt == string.Empty)
+					{
+						return VOID_Tools.GetBiome(Core.Vessel).name;
 					}
 					else
 					{
-						return Core.vessel.landedAt;
+						return Core.Vessel.landedAt;
 					}
 				}
 			);
@@ -1235,7 +1211,7 @@
 		public static readonly VOID_DoubleValue terrainElevation =
 			new VOID_DoubleValue(
 				"Terrain elevation",
-				new Func<double>(() => Core.vessel.terrainAltitude),
+				new Func<double>(() => Core.Vessel.terrainAltitude),
 				"m"
 			);
 
@@ -1244,10 +1220,10 @@
 		private static double burnTime(double deltaV, double initialMass, double massFlow, double thrust)
 		{
 			Tools.PostDebugMessage(typeof(VOID_Data), "calculating burnTime from:\n" +
-				"\tdeltaV: {0}\n" +
-				"\tinitialMass: {1}\n" +
-				"\tmassFlow: {2}\n" +
-				"\tthrust: {3}\n",
+			"\tdeltaV: {0}\n" +
+			"\tinitialMass: {1}\n" +
+			"\tmassFlow: {2}\n" +
+			"\tthrust: {3}\n",
 				deltaV,
 				initialMass,
 				massFlow,
@@ -1255,6 +1231,46 @@
 			);
 			return initialMass / massFlow * (1d - Math.Exp(-deltaV * massFlow / thrust));
 		}
+
+		private static double dVfromBurnTime(double time, double initialMass, double massFlow, double thrust)
+		{
+			return -thrust / massFlow * Math.Log(1d - time * massFlow / initialMass);
+		}
+
+		private static double realVesselBurnTime(double deltaV)
+		{
+			if (Core.Stages == null || Core.Stages.Length < 1)
+			{
+				return double.NaN;
+			}
+
+			double burntime = 0d;
+			double dVRemaining = deltaV;
+
+			int stageIdx = Core.Stages.Length - 1;
+
+			while (dVRemaining > double.Epsilon)
+			{
+				if (stageIdx < 0)
+				{
+					return double.PositiveInfinity;
+				}
+
+				Stage stage = Core.Stages[stageIdx];
+
+				if (stage.deltaV > 0)
+				{
+					double stageDVUsed = Math.Min(stage.deltaV, dVRemaining);
+
+					burntime += burnTime(stageDVUsed, stage.totalMass, stage.MassFlow(), stage.NominalThrust());
+					dVRemaining -= stageDVUsed;
+				}
+
+				stageIdx--;
+			}
+
+			return burntime;
+		}
 	}
 }
 

--- a/VOID_DataLogger.cs
+++ b/VOID_DataLogger.cs
@@ -107,7 +107,7 @@
 						typeof(VOIDCore),
 						string.Format(
 							"{0}_{1}",
-							this.vessel.vesselName,
+							this.Vessel.vesselName,
 							"data.csv"
 						),
 						null
@@ -197,7 +197,7 @@
 
 			// CSV Logging
 			// from ISA MapSat
-			if (loggingActive && (!waitForLaunch || this.vessel.situation != Vessel.Situations.PRELAUNCH))
+			if (loggingActive && (!waitForLaunch || this.Vessel.situation != Vessel.Situations.PRELAUNCH))
 			{
 				//data logging is on
 				//increment timers
@@ -237,7 +237,7 @@
 			this.logIntervalStr = this.logInterval.value.ToString("#.0##");
 		}
 
-		public override void ModuleWindow(int _)
+		public override void ModuleWindow(int id)
 		{
 			GUILayout.BeginVertical();
 
@@ -288,7 +288,7 @@
 
 			GUILayout.EndVertical();
 
-			GUI.DragWindow();
+			base.ModuleWindow(id);
 		}
 
 		#endregion
@@ -335,7 +335,7 @@
 			line.Append(',');
 
 			//Mission time
-			line.Append(vessel.missionTime.ToString("F3"));
+			line.Append(Vessel.missionTime.ToString("F3"));
 			line.Append(',');
 
 			//Altitude ASL
@@ -467,10 +467,10 @@
 			this.loggingActive = false;
 			this.firstWrite = true;
 
-			this.waitForLaunch = true;
-
-			this.logInterval = 0.5f;
-			this.csvCollectTimer = 0f;
+			this.waitForLaunch = (VOID_SaveValue<bool>)true;
+
+			this.logInterval = (VOID_SaveValue<float>)0.5f;
+			this.csvCollectTimer = (VOID_SaveValue<float>)0f;
 
 			this.outstandingWrites = 0;
 

--- a/VOID_EditorHUD.cs
+++ b/VOID_EditorHUD.cs
@@ -100,7 +100,7 @@
 		{
 			this.Name = "Heads-Up Display";
 
-			this.toggleActive = true;
+			this.Active = true;
 
 			this.snapToLeft.value = true;
 
@@ -240,7 +240,7 @@
 
 			this.ehudWindow.WindowPos = hudPos;
 
-			this.snapToLeft = Mathf.Abs(this.ehudWindow.WindowPos.xMin - hudLeft) < 15f;
+			this.snapToLeft.value = Mathf.Abs(this.ehudWindow.WindowPos.xMin - hudLeft) < 15f;
 		}
 	}
 }

--- a/VOID_HUD.cs
+++ b/VOID_HUD.cs
@@ -55,7 +55,7 @@
 		{
 			this.Name = "Heads-Up Display";
 
-			this.toggleActive = true;
+			this.Active = true;
 
 			this.leftHUD = new HUDWindow("leftHUD", this.leftHUDWindow, new Rect(Screen.width * .375f - 300f, 0f, 300f, 90f));
 			this.Windows.Add(this.leftHUD);
@@ -150,12 +150,12 @@
 				);
 
 				if (
-					this.core.vessel.mainBody == this.core.HomeBody &&
+					this.core.Vessel.mainBody == this.core.HomeBody &&
 					(
-						this.core.vessel.situation == Vessel.Situations.FLYING ||
-						this.core.vessel.situation == Vessel.Situations.SUB_ORBITAL ||
-						this.core.vessel.situation == Vessel.Situations.LANDED ||
-						this.core.vessel.situation == Vessel.Situations.SPLASHED
+						this.core.Vessel.situation == Vessel.Situations.FLYING ||
+						this.core.Vessel.situation == Vessel.Situations.SUB_ORBITAL ||
+						this.core.Vessel.situation == Vessel.Situations.LANDED ||
+						this.core.Vessel.situation == Vessel.Situations.SPLASHED
 					)
 				)
 				{

--- a/VOID_HUDAdvanced.cs
+++ b/VOID_HUDAdvanced.cs
@@ -74,7 +74,7 @@
 		{
 			this.Name = "Advanced Heads-Up Display";
 
-			this.toggleActive = true;
+			this.Active = true;
 
 			this.leftHUD = new HUDWindow("leftHUD",
 				this.leftHUDWindow,
@@ -95,7 +95,7 @@
 			);
 			this.Windows.Add(this.rightHUD);
 
-			this.positionsLocked = true;
+			this.positionsLocked.value = true;
 
 			Tools.PostDebugMessage (this, "Constructed.");
 		}
@@ -265,7 +265,7 @@
 				}
 			}
 
-			this.positionsLocked = GUITools.Toggle(this.positionsLocked, string.Intern("Lock Advanced HUD Positions"));
+			this.positionsLocked.value = GUITools.Toggle(this.positionsLocked, string.Intern("Lock Advanced HUD Positions"));
 		}
 	}
 }

file:a/VOID_Localization.cs (deleted)
--- a/VOID_Localization.cs
+++ /dev/null
@@ -1,36 +1,1 @@
-// VOID
-//
-// VOID_Localization.cs
-//
-// Copyright © 2014, toadicus
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice,
-//    this list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-//    this list of conditions and the following disclaimer in the documentation and/or other
-//    materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its contributors may be used
-//    to endorse or promote products derived from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-public static class VOID_Localization
-{
-	public static string void_primary = "Primary";
-	public static string void_altitude_asl = "Altitude (ASL)";
-	public static string void_velocity = "Velocity";
-	public static string void_apoapsis = "Apoapsis";
-	public static string void_periapsis = "Periapsis";
-}

--- a/VOID_Orbital.cs
+++ b/VOID_Orbital.cs
@@ -36,10 +36,10 @@
 	public class VOID_Orbital : VOID_WindowModule
 	{
 		[AVOID_SaveValue("toggleExtended")]
-		protected VOID_SaveValue<bool> toggleExtended = false;
+		protected VOID_SaveValue<bool> toggleExtended;
 
 		[AVOID_SaveValue("precisionValues")]
-		protected long _precisionValues = 230584300921369395;
+		protected long _precisionValues;
 		protected IntCollection precisionValues;
 
 		public VOID_Orbital()
@@ -48,9 +48,13 @@
 
 			this.WindowPos.x = Screen.width - 520f;
 			this.WindowPos.y = 250f;
+
+			this.toggleExtended = (VOID_SaveValue<bool>)false;
+
+			this._precisionValues = 230584300921369395;
 		}
 
-		public override void ModuleWindow(int _)
+		public override void ModuleWindow(int id)
 		{
 			int idx = 0;
 
@@ -108,7 +112,8 @@
             }
 
             GUILayout.EndVertical();
-            GUI.DragWindow();
+            
+			base.ModuleWindow(id);
 		}
 
 		public override void LoadConfig ()
@@ -118,11 +123,11 @@
 			this.precisionValues = new IntCollection (4, this._precisionValues);
 		}
 
-		public override void _SaveToConfig (KSP.IO.PluginConfiguration config)
+		public override void Save (KSP.IO.PluginConfiguration config)
 		{
 			this._precisionValues = this.precisionValues.collection;
 
-			base._SaveToConfig (config);
+			base.Save (config);
 		}
 	}
 }

--- a/VOID_Rendezvous.cs
+++ b/VOID_Rendezvous.cs
@@ -38,10 +38,10 @@
 	public class VOID_Rendezvous : VOID_WindowModule
 	{
 		[AVOID_SaveValue("untoggleRegisterInfo")]
-		protected VOID_SaveValue<bool> untoggleRegisterInfo = false;
+		protected VOID_SaveValue<bool> untoggleRegisterInfo;
 
 		[AVOID_SaveValue("toggleExtendedOrbital")]
-		protected VOID_SaveValue<bool> toggleExtendedOrbital = false;
+		protected VOID_SaveValue<bool> toggleExtendedOrbital;
 
 		protected VOID_VesselRegister RegisterModule;
 
@@ -51,9 +51,12 @@
 
 			this.WindowPos.x = 845;
 			this.WindowPos.y = 85;
+
+			this.untoggleRegisterInfo = (VOID_SaveValue<bool>)false;
+			this.toggleExtendedOrbital = (VOID_SaveValue<bool>)false;
 		}
 
-		public override void ModuleWindow(int _)
+		public override void ModuleWindow(int id)
 		{
 			Vessel rendezvessel = new Vessel();
 			CelestialBody rendezbody = new CelestialBody();
@@ -74,7 +77,7 @@
 				if (FlightGlobals.fetch.vesselTargetMode == VesselTargetModes.Direction)
 				{
 					//a Body is selected
-					rendezbody = vessel.patchedConicSolver.targetBody;
+					rendezbody = Vessel.patchedConicSolver.targetBody;
 					display_rendezvous_info(null, rendezbody);
 				}
 				else if (FlightGlobals.fetch.vesselTargetMode == VesselTargetModes.DirectionAndVelocity)
@@ -130,11 +133,12 @@
 
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			GUILayout.Label(" ", GUILayout.ExpandWidth(true));
-			if (GUILayout.Button("Close", GUILayout.ExpandWidth(false))) this.toggleActive = false;
+			if (GUILayout.Button("Close", GUILayout.ExpandWidth(false))) this.Active = false;
 			GUILayout.EndHorizontal();
 
 			GUILayout.EndVertical();
-			GUI.DragWindow();
+
+			base.ModuleWindow(id);
 		}
 
 		private void display_rendezvous_info(Vessel v, CelestialBody cb)
@@ -169,11 +173,11 @@
 					GUILayout.Label(v.orbit.inclination.ToString("F3") + "°", GUILayout.ExpandWidth(false));
 					GUILayout.EndHorizontal();
 
-					if (vessel.mainBody == v.mainBody)
+					if (Vessel.mainBody == v.mainBody)
 					{
 						GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 						GUILayout.Label("Relative inclination:");
-						GUILayout.Label(Vector3d.Angle(vessel.orbit.GetOrbitNormal(), v.orbit.GetOrbitNormal()).ToString("F3") + "°", GUILayout.ExpandWidth(false));
+						GUILayout.Label(Vector3d.Angle(Vessel.orbit.GetOrbitNormal(), v.orbit.GetOrbitNormal()).ToString("F3") + "°", GUILayout.ExpandWidth(false));
 						GUILayout.EndHorizontal();
 					}
 					//if (debugging) Debug.Log("[CHATR] v -> v relative incl OK");
@@ -185,12 +189,12 @@
 
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 					GUILayout.Label("Relative velocity:");
-					GUILayout.Label(Tools.MuMech_ToSI(v.orbit.vel.magnitude - vessel.orbit.vel.magnitude) + "m/s", GUILayout.ExpandWidth(false));
+					GUILayout.Label(Tools.MuMech_ToSI(v.orbit.vel.magnitude - Vessel.orbit.vel.magnitude) + "m/s", GUILayout.ExpandWidth(false));
 					GUILayout.EndHorizontal();
 
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 					GUILayout.Label("Distance:");
-					GUILayout.Label(Tools.MuMech_ToSI((vessel.findWorldCenterOfMass() - v.findWorldCenterOfMass()).magnitude) + "m", GUILayout.ExpandWidth(false));
+					GUILayout.Label(Tools.MuMech_ToSI((Vessel.findWorldCenterOfMass() - v.findWorldCenterOfMass()).magnitude) + "m", GUILayout.ExpandWidth(false));
 					GUILayout.EndHorizontal();
 
 					// Toadicus edit: added local sidereal longitude.
@@ -250,17 +254,17 @@
 				{
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 					GUILayout.Label("Latitude:");
-					GUILayout.Label(VOID_Tools.GetLatitudeString(vessel), GUILayout.ExpandWidth(false));
+					GUILayout.Label(VOID_Tools.GetLatitudeString(Vessel), GUILayout.ExpandWidth(false));
 					GUILayout.EndHorizontal();
 
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 					GUILayout.Label("Longitude:");
-					GUILayout.Label(VOID_Tools.GetLongitudeString(vessel), GUILayout.ExpandWidth(false));
+					GUILayout.Label(VOID_Tools.GetLongitudeString(Vessel), GUILayout.ExpandWidth(false));
 					GUILayout.EndHorizontal();
 
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 					GUILayout.Label("Distance:");
-					GUILayout.Label(Tools.MuMech_ToSI((vessel.findWorldCenterOfMass() - v.findWorldCenterOfMass()).magnitude) + "m", GUILayout.ExpandWidth(false));
+					GUILayout.Label(Tools.MuMech_ToSI((Vessel.findWorldCenterOfMass() - v.findWorldCenterOfMass()).magnitude) + "m", GUILayout.ExpandWidth(false));
 					GUILayout.EndHorizontal();
 				}
 			}
@@ -281,47 +285,47 @@
 				GUILayout.EndHorizontal();
 				//if (debugging) Debug.Log("[VOID] Inclination OK");
 
-				if (cb.referenceBody == vessel.mainBody)
+				if (cb.referenceBody == Vessel.mainBody)
 				{
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 					GUILayout.Label("Relative inclination:");
-					GUILayout.Label(Vector3d.Angle(vessel.orbit.GetOrbitNormal(), cb.orbit.GetOrbitNormal()).ToString("F3") + "°", GUILayout.ExpandWidth(false));
+					GUILayout.Label(Vector3d.Angle(Vessel.orbit.GetOrbitNormal(), cb.orbit.GetOrbitNormal()).ToString("F3") + "°", GUILayout.ExpandWidth(false));
 					GUILayout.EndHorizontal();
 					//if (debugging) Debug.Log("[VOID] cb Relative inclination OK");
 				}
 
 				GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 				GUILayout.Label("Distance:");
-				GUILayout.Label(Tools.MuMech_ToSI((vessel.mainBody.position - cb.position).magnitude) + "m", GUILayout.ExpandWidth(false));
+				GUILayout.Label(Tools.MuMech_ToSI((Vessel.mainBody.position - cb.position).magnitude) + "m", GUILayout.ExpandWidth(false));
 				GUILayout.EndHorizontal();
 
 				//if (debugging) Debug.Log("[VOID] Distance OK");
 
 				//SUN2PLANET:
-				if (vessel.mainBody.bodyName == "Sun" && cb.referenceBody == vessel.mainBody)
-				{
-					VOID_Tools.display_transfer_angles_SUN2PLANET(cb, vessel);
+				if (Vessel.mainBody.bodyName == "Sun" && cb.referenceBody == Vessel.mainBody)
+				{
+					VOID_Tools.display_transfer_angles_SUN2PLANET(cb, Vessel);
 					//if (debugging) Debug.Log("[VOID] SUN2PLANET OK");
 				}
 
 				//PLANET2PLANET
-				else if (vessel.mainBody.referenceBody.bodyName == "Sun" && cb.referenceBody == vessel.mainBody.referenceBody)
-				{
-					VOID_Tools.display_transfer_angles_PLANET2PLANET(cb, vessel);
+				else if (Vessel.mainBody.referenceBody.bodyName == "Sun" && cb.referenceBody == Vessel.mainBody.referenceBody)
+				{
+					VOID_Tools.display_transfer_angles_PLANET2PLANET(cb, Vessel);
 					//if (debugging) Debug.Log("[VOID] PLANET2PLANET OK");
 				}
 
 				//PLANET2MOON
-				else if (vessel.mainBody.referenceBody.bodyName == "Sun" && cb.referenceBody == vessel.mainBody)
-				{
-					VOID_Tools.display_transfer_angles_PLANET2MOON(cb, vessel);
+				else if (Vessel.mainBody.referenceBody.bodyName == "Sun" && cb.referenceBody == Vessel.mainBody)
+				{
+					VOID_Tools.display_transfer_angles_PLANET2MOON(cb, Vessel);
 					//if (debugging) Debug.Log("[VOID] PLANET2MOON OK");
 				}
 
 				//MOON2MOON
-				else if (vessel.mainBody.referenceBody.referenceBody.bodyName == "Sun" && cb.referenceBody == vessel.mainBody.referenceBody)
-				{
-					VOID_Tools.display_transfer_angles_MOON2MOON(cb, vessel);
+				else if (Vessel.mainBody.referenceBody.referenceBody.bodyName == "Sun" && cb.referenceBody == Vessel.mainBody.referenceBody)
+				{
+					VOID_Tools.display_transfer_angles_MOON2MOON(cb, Vessel);
 					//if (debugging) Debug.Log("[VOID] MOON2MOON OK");
 				}
 

--- a/VOID_StageInfo.cs
+++ b/VOID_StageInfo.cs
@@ -50,7 +50,7 @@
 		{
 			this.Name = "Stage Information";
 			this.defWidth = 20f;
-			this.bodyIdx = 4;
+			this.bodyIdx = (VOID_SaveValue<int>)4;
 
 			this.stylesApplied = false;
 			this.showBodyList = false;
@@ -96,7 +96,7 @@
 
 			this.showAdvanced = false;
 
-			this.useSeaLevel = false;
+			this.useSeaLevel = (VOID_SaveValue<bool>)false;
 
 			seaLevelToggle = new GUIContent(
 				"Use Sea Level",
@@ -110,11 +110,11 @@
 
 			if (this.showBodyList)
 			{
-				GUILayout.Window(core.windowID, this.bodyListPos, this.BodyPickerWindow, string.Empty);
-			}
-		}
-
-		public override void ModuleWindow(int _)
+				GUILayout.Window(core.WindowID, this.bodyListPos, this.BodyPickerWindow, string.Empty);
+			}
+		}
+
+		public override void ModuleWindow(int id)
 		{
 			if (this.selectedBody == null)
 			{
@@ -182,13 +182,13 @@
 
 			this.stageTable.Render();
 
-			if (core.sortedBodyList != null)
+			if (core.SortedBodyList != null)
 			{
 				GUILayout.BeginHorizontal();
 
 				if (GUILayout.Button("◄"))
 				{
-					this.bodyIdx--;
+					this.bodyIdx.value--;
 				}
 
 				this.showBodyList = GUILayout.Toggle(
@@ -208,20 +208,20 @@
 
 				if (GUILayout.Button("►"))
 				{
-					this.bodyIdx++;
-				}
-
-				this.bodyIdx %= core.sortedBodyList.Count;
+					this.bodyIdx.value++;
+				}
+
+				this.bodyIdx.value %= core.SortedBodyList.Count;
 
 				if (this.bodyIdx < 0)
 				{
-					this.bodyIdx += core.sortedBodyList.Count;
+					this.bodyIdx.value += core.SortedBodyList.Count;
 				}
 
 				if (this.lastIdx != this.bodyIdx)
 				{
 					this.lastIdx = this.bodyIdx;
-					this.selectedBody = core.sortedBodyList[this.bodyIdx];
+					this.selectedBody = core.SortedBodyList[this.bodyIdx];
 				}
 
 				if (HighLogic.LoadedSceneIsEditor)
@@ -261,7 +261,7 @@
 
 			GUILayout.EndHorizontal();
 
-			GUI.DragWindow();
+			base.ModuleWindow(id);
 		}
 
 		public override void DrawConfigurables()
@@ -275,12 +275,12 @@
 
 		private void BodyPickerWindow(int _)
 		{
-			foreach (CelestialBody body in core.sortedBodyList)
+			foreach (CelestialBody body in core.SortedBodyList)
 			{
 				if (GUILayout.Button(body.bodyName, VOID_Styles.labelDefault))
 				{
 					Debug.Log("Picked new body focus: " + body.bodyName);
-					this.bodyIdx = core.sortedBodyList.IndexOf(body);
+					this.bodyIdx.value = core.SortedBodyList.IndexOf(body);
 					this.showBodyList = false;
 				}
 			}

--- a/VOID_SurfAtmo.cs
+++ b/VOID_SurfAtmo.cs
@@ -36,18 +36,20 @@
 	public class VOID_SurfAtmo : VOID_WindowModule
 	{
 		[AVOID_SaveValue("precisionValues")]
-		protected long _precisionValues = 230584300921369395;
+		protected VOID_SaveValue<long> _precisionValues;
 		protected IntCollection precisionValues;
 
 		public VOID_SurfAtmo()
 		{
-			this.Name = "Surface & Atmospheric Information";
+			this.Name = "Surface & Atmospheric Info";
 
 			this.WindowPos.x = Screen.width - 260f;
 			this.WindowPos.y = 85;
+
+			this._precisionValues = (VOID_SaveValue<long>)230584300921369395;
 		}
 
-		public override void ModuleWindow(int _)
+		public override void ModuleWindow(int id)
 		{
 			int idx = 0;
 
@@ -91,7 +93,8 @@
 			VOID_Data.currBiome.DoGUIHorizontal ();
 
 			GUILayout.EndVertical();
-			GUI.DragWindow();
+
+			base.ModuleWindow(id);
 		}
 
 		public override void LoadConfig ()
@@ -101,11 +104,11 @@
 			this.precisionValues = new IntCollection (4, this._precisionValues);
 		}
 
-		public override void _SaveToConfig (KSP.IO.PluginConfiguration config)
+		public override void Save (KSP.IO.PluginConfiguration config)
 		{
-			this._precisionValues = this.precisionValues.collection;
+			this._precisionValues.value = this.precisionValues.collection;
 
-			base._SaveToConfig (config);
+			base.Save (config);
 		}
 	}
 }

--- a/VOID_TWR.cs
+++ b/VOID_TWR.cs
@@ -20,7 +20,7 @@
 			this.Name = "IP Thrust-to-Weight Ratios";
 		}
 
-		public override void ModuleWindow(int _)
+		public override void ModuleWindow(int id)
 		{
 			if (
 				!HighLogic.LoadedSceneIsFlight ||
@@ -33,7 +33,7 @@
 
 			GUILayout.BeginVertical();
 
-			if (core.sortedBodyList == null)
+			if (core.SortedBodyList == null)
 			{
 				GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 
@@ -43,7 +43,7 @@
 			}
 			else
 			{
-				foreach (CelestialBody body in core.sortedBodyList)
+				foreach (CelestialBody body in core.SortedBodyList)
 				{
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 
@@ -60,7 +60,7 @@
 
 			GUILayout.EndVertical();
 
-			GUI.DragWindow();
+			base.ModuleWindow(id);
 		}
 	}
 }

--- a/VOID_Transfer.cs
+++ b/VOID_Transfer.cs
@@ -48,13 +48,13 @@
 			this.defWidth = 315;
 		}
 
-		public override void ModuleWindow(int _)
+		public override void ModuleWindow(int id)
 		{
 			GUILayout.BeginVertical();
 
-			if (vessel.mainBody.name == "Sun")  //Vessel is orbiting the Sun
+			if (Vessel.mainBody.name == "Sun")  //Vessel is orbiting the Sun
 			{
-			    foreach (CelestialBody body in vessel.mainBody.orbitingBodies)
+			    foreach (CelestialBody body in Vessel.mainBody.orbitingBodies)
 			    {
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 					if (GUILayout.Button(body.bodyName))
@@ -68,16 +68,16 @@
 
 					if (selectedBodies.Contains(body))
 					{
-						VOID_Tools.display_transfer_angles_SUN2PLANET(body, vessel);  //show phase angles for each selected body
+						VOID_Tools.display_transfer_angles_SUN2PLANET(body, Vessel);  //show phase angles for each selected body
 						tad_targeting(body);    //display Set/Unset Target button for each selected body
 					}
 			    }
 			}
-			else if (vessel.mainBody.referenceBody.name == "Sun")	//Vessel is orbiting a planet
+			else if (Vessel.mainBody.referenceBody.name == "Sun")	//Vessel is orbiting a planet
 			{
-			    foreach (CelestialBody body in vessel.mainBody.referenceBody.orbitingBodies)
+			    foreach (CelestialBody body in Vessel.mainBody.referenceBody.orbitingBodies)
 			    {
-			        if (body.name != vessel.mainBody.name)	// show other planets
+			        if (body.name != Vessel.mainBody.name)	// show other planets
 			        {
 			            GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			            if (GUILayout.Button(body.bodyName))
@@ -91,12 +91,12 @@
 
 			            if (selectedBodies.Contains(body))
 			            {
-			                VOID_Tools.display_transfer_angles_PLANET2PLANET(body, vessel);
+			                VOID_Tools.display_transfer_angles_PLANET2PLANET(body, Vessel);
 			                tad_targeting(body);    //display Set/Unset Target button
 			            }
 			        }
 			    }
-			    foreach (CelestialBody body in vessel.mainBody.orbitingBodies)	// show moons
+			    foreach (CelestialBody body in Vessel.mainBody.orbitingBodies)	// show moons
 			    {
 			        GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			        if (GUILayout.Button(body.bodyName))
@@ -110,16 +110,16 @@
 
 			        if (selectedBodies.Contains(body))
 			        {
-			            VOID_Tools.display_transfer_angles_PLANET2MOON(body, vessel);
+			            VOID_Tools.display_transfer_angles_PLANET2MOON(body, Vessel);
 			            tad_targeting(body);    //display Set/Unset Target button
 			        }
 			    }
 			}
-			else if (vessel.mainBody.referenceBody.referenceBody.name == "Sun")	// Vessel is orbiting a moon
+			else if (Vessel.mainBody.referenceBody.referenceBody.name == "Sun")	// Vessel is orbiting a moon
 			{
-			    foreach (CelestialBody body in vessel.mainBody.referenceBody.orbitingBodies)
+			    foreach (CelestialBody body in Vessel.mainBody.referenceBody.orbitingBodies)
 			    {
-					if (body.name != vessel.mainBody.name)	// show other moons
+					if (body.name != Vessel.mainBody.name)	// show other moons
 					{
 						GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 						if (GUILayout.Button(body.bodyName))
@@ -133,14 +133,15 @@
 
 						if (selectedBodies.Contains(body))
 						{
-							VOID_Tools.display_transfer_angles_MOON2MOON(body, vessel);
+							VOID_Tools.display_transfer_angles_MOON2MOON(body, Vessel);
 							tad_targeting(body);    //display Set/Unset Target button
 						}
 					}
 				}
 			}
 			GUILayout.EndVertical();
-			GUI.DragWindow();
+
+			base.ModuleWindow(id);
 		}
 
 		private void tad_targeting(CelestialBody body)

--- a/VOID_VesselInfo.cs
+++ b/VOID_VesselInfo.cs
@@ -46,7 +46,7 @@
 			this.WindowPos.y = 450;
 		}
 
-		public override void ModuleWindow(int _)
+		public override void ModuleWindow(int id)
 		{
 			if ((TimeWarp.WarpMode == TimeWarp.Modes.LOW) || (TimeWarp.CurrentRate <= TimeWarp.MaxPhysicsRate))
 			{
@@ -56,7 +56,7 @@
 			GUILayout.BeginVertical();
 
 			GUILayout.Label(
-				vessel.vesselName,
+				Vessel.vesselName,
 				VOID_Styles.labelCenterBold,
 				GUILayout.ExpandWidth(true));
 
@@ -86,7 +86,7 @@
 
 			GUILayout.EndVertical();
 
-			GUI.DragWindow();
+			base.ModuleWindow(id);
 		}
 	}
 }

--- a/VOID_VesselRegister.cs
+++ b/VOID_VesselRegister.cs
@@ -37,16 +37,16 @@
 	public class VOID_VesselRegister : VOID_WindowModule
 	{
 		[AVOID_SaveValue("selectedBodyIdx")]
-		protected VOID_SaveValue<int> selectedBodyIdx = 0;
+		protected VOID_SaveValue<int> selectedBodyIdx;
 		protected CelestialBody seletedBody;
 
 		[AVOID_SaveValue("selectedVesselTypeIdx")]
-		protected VOID_SaveValue<int> selectedVesselTypeIdx = 0;
+		protected VOID_SaveValue<int> selectedVesselTypeIdx;
 		protected VesselType selectedVesselType;
 
-		protected string vesselSituation = "Orbiting";
+		protected string vesselSituation;
 
-		protected Vector2 selectorScrollPos = new Vector2();
+		protected Vector2 selectorScrollPos;
 
 		protected Vessel _selectedVessel;
 
@@ -65,11 +65,18 @@
 			this.WindowPos.x = 845;
 			this.WindowPos.y = 275;
 			this.defHeight = 375;
+
+			this.selectedBodyIdx = (VOID_SaveValue<int>)0;
+			this.selectedVesselTypeIdx = (VOID_SaveValue<int>)0;
+
+			this.vesselSituation = "Orbiting";
+
+			this.selectorScrollPos = new Vector2();
 		}
 
-		public override void ModuleWindow(int _)
+		public override void ModuleWindow(int id)
 		{
-			if (!this.core.allVesselTypes.Any())
+			if (!this.core.AllVesselTypes.Any())
 			{
 				return;
 			}
@@ -79,34 +86,46 @@
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			if (GUILayout.Button("<"))
 			{
-				selectedBodyIdx--;
-				if (selectedBodyIdx < 0) selectedBodyIdx = this.core.allBodies.Count - 1;
+				selectedBodyIdx.value--;
+				if (selectedBodyIdx < 0)
+				{
+					selectedBodyIdx.value = this.core.AllBodies.Count - 1;
+				}
 			}
-			GUILayout.Label(this.core.allBodies[selectedBodyIdx].bodyName, VOID_Styles.labelCenterBold, GUILayout.ExpandWidth(true));
+			GUILayout.Label(this.core.AllBodies[selectedBodyIdx].bodyName, VOID_Styles.labelCenterBold, GUILayout.ExpandWidth(true));
 			if (GUILayout.Button(">"))
 			{
-				selectedBodyIdx++;
-				if (selectedBodyIdx > this.core.allBodies.Count - 1) selectedBodyIdx = 0;
+				selectedBodyIdx.value++;
+				if (selectedBodyIdx > this.core.AllBodies.Count - 1)
+				{
+					selectedBodyIdx.value = 0;
+				}
 			}
 			GUILayout.EndHorizontal();
 
-			seletedBody = this.core.allBodies[selectedBodyIdx];
+			seletedBody = this.core.AllBodies[selectedBodyIdx];
 
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			if (GUILayout.Button("<"))
 			{
-				selectedVesselTypeIdx--;
-				if (selectedVesselTypeIdx < 0) selectedVesselTypeIdx = this.core.allVesselTypes.Count - 1;
+				selectedVesselTypeIdx.value--;
+				if (selectedVesselTypeIdx < 0)
+				{
+					selectedVesselTypeIdx.value = this.core.AllVesselTypes.Length - 1;
+				}
 			}
-			GUILayout.Label(this.core.allVesselTypes[selectedVesselTypeIdx].ToString(), VOID_Styles.labelCenterBold, GUILayout.ExpandWidth(true));
+			GUILayout.Label(this.core.AllVesselTypes[selectedVesselTypeIdx].ToString(), VOID_Styles.labelCenterBold, GUILayout.ExpandWidth(true));
 			if (GUILayout.Button(">"))
 			{
-				selectedVesselTypeIdx++;
-				if (selectedVesselTypeIdx > this.core.allVesselTypes.Count - 1) selectedVesselTypeIdx = 0;
+				selectedVesselTypeIdx.value++;
+				if (selectedVesselTypeIdx > this.core.AllVesselTypes.Length - 1)
+				{
+					selectedVesselTypeIdx.value = 0;
+				}
 			}
 			GUILayout.EndHorizontal();
 
-			selectedVesselType = this.core.allVesselTypes[selectedVesselTypeIdx];
+			selectedVesselType = this.core.AllVesselTypes[selectedVesselTypeIdx];
 
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			if (GUILayout.Button("Landed", GUILayout.ExpandWidth(true))) vesselSituation = "Landed";
@@ -124,7 +143,7 @@
 
 			foreach (Vessel v in FlightGlobals.Vessels)
 			{
-				if (v != vessel && v.vesselType == selectedVesselType && v.mainBody == seletedBody)
+				if (v != Vessel && v.vesselType == selectedVesselType && v.mainBody == seletedBody)
 				{
 					if ((vesselSituation == "Landed" &&
 					     (v.situation == Vessel.Situations.LANDED ||
@@ -142,7 +161,7 @@
 							if (_selectedVessel != v)
 							{
 								_selectedVessel = v; //set clicked vessel as selected_vessel
-								this.toggleActive = true;    //turn bool on to open the window if closed
+								this.Active = true;    //turn bool on to open the window if closed
 							}
 							else
 							{
@@ -157,7 +176,7 @@
 
 			GUILayout.EndVertical();
 
-			GUI.DragWindow();
+			base.ModuleWindow(id);
 		}
 	}
 }