Version 0.9.17 origin
Version 0.9.17

--- a/IntCollection.cs
+++ b/IntCollection.cs
@@ -59,7 +59,6 @@
 				return (ushort)((this.collection & (this.mask << idx)) >> idx);
 			}
 			set {
-				Console.WriteLine (value);
 				if (idx < 0) {
 					idx += this.maxCount;
 				}
@@ -71,7 +70,6 @@
 				idx *= wordLength;
 
 				long packvalue = value & this.mask;
-				Console.WriteLine (packvalue);
 
 				this.collection &= ~(this.mask << idx);
 				this.collection |= packvalue << idx;

--- /dev/null
+++ b/ToolbarButtonWrapper.cs
@@ -1,1 +1,352 @@
-
+//
+//  ToolbarWrapper.cs
+//
+//  Author:
+//       toadicus <>
+//
+//  Copyright (c) 2013 toadicus
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+using System;
+using System.Linq;
+using System.Reflection;
+using UnityEngine;
+
+namespace VOID
+{
+	/// <summary>
+	/// Wraps a Toolbar clickable button, after fetching it from a foreign assembly.
+	/// </summary>
+	internal class ToolbarButtonWrapper
+	{
+		protected System.Type ToolbarManager;
+		protected object TBManagerInstance;
+		protected MethodInfo TBManagerAdd;
+		protected System.Type IButton;
+		protected object Button;
+		protected PropertyInfo ButtonText;
+		protected PropertyInfo ButtonTextColor;
+		protected PropertyInfo ButtonTexturePath;
+		protected PropertyInfo ButtonToolTip;
+		protected PropertyInfo ButtonVisible;
+		protected PropertyInfo ButtonVisibility;
+		protected PropertyInfo ButtonEnalbed;
+		protected EventInfo ButtonOnClick;
+		protected System.Type ClickHandlerType;
+		protected MethodInfo ButtonDestroy;
+		protected System.Type GameScenesVisibilityType;
+
+		/// <summary>
+		/// The text displayed on the button. Set to null to hide text.
+		/// </summary>
+		/// <remarks>
+		/// The text can be changed at any time to modify the button's appearance. Note that since this will also
+		/// modify the button's size, this feature should be used sparingly, if at all.
+		/// </remarks>
+		/// <seealso cref="TexturePath"/>
+		public string Text
+		{
+			get
+			{
+				return this.ButtonText.GetValue(this.Button, null) as String;
+			}
+			set
+			{
+				this.ButtonText.SetValue(this.Button, value, null);
+			}
+		}
+
+		/// <summary>
+		/// The color the button text is displayed with. Defaults to Color.white.
+		/// </summary>
+		/// <remarks>
+		/// The text color can be changed at any time to modify the button's appearance.
+		/// </remarks>
+		public Color TextColor
+		{
+			get
+			{
+				return (Color)this.ButtonTextColor.GetValue(this.Button, null);
+			}
+			set
+			{
+				this.ButtonTextColor.SetValue(this.Button, value, null);
+			}
+		}
+
+		/// <summary>
+		/// The path of a texture file to display an icon on the button. Set to null to hide icon.
+		/// </summary>
+		/// <remarks>
+		/// <para>
+		/// A texture path on a button will have precedence over text. That is, if both text and texture path
+		/// have been set on a button, the button will show the texture, not the text.
+		/// </para>
+		/// <para>
+		/// The texture size must not exceed 24x24 pixels.
+		/// </para>
+		/// <para>
+		/// The texture path must be relative to the "GameData" directory, and must not specify a file name suffix.
+		/// Valid example: MyAddon/Textures/icon_mybutton
+		/// </para>
+		/// <para>
+		/// The texture path can be changed at any time to modify the button's appearance.
+		/// </para>
+		/// </remarks>
+		/// <seealso cref="Text"/>
+		public string TexturePath
+		{
+			get
+			{
+				return this.ButtonTexturePath.GetValue(this.Button, null) as string;
+			}
+			set
+			{
+				this.ButtonTexturePath.SetValue(this.Button, value, null);
+			}
+		}
+
+		/// <summary>
+		/// The button's tool tip text. Set to null if no tool tip is desired.
+		/// </summary>
+		/// <remarks>
+		/// Tool Tip Text Should Always Use Headline Style Like This.
+		/// </remarks>
+		public string ToolTip
+		{
+			get
+			{
+				return this.ButtonToolTip.GetValue(this.Button, null) as string;
+			}
+			set
+			{
+				this.ButtonToolTip.SetValue(this.Button, value, null);
+			}
+		}
+
+		/// <summary>
+		/// Whether this button is currently visible or not. Can be used in addition to or as a replacement for <see cref="Visibility"/>.
+		/// </summary>
+		public bool Visible
+		{
+			get
+			{
+				return (bool)this.ButtonVisible.GetValue(this.Button, null);
+			}
+			set
+			{
+				this.ButtonVisible.SetValue(this.Button, value, null);
+			}
+		}
+
+		/// <summary>
+		/// Whether this button is currently enabled (clickable) or not. This will not affect the player's ability to
+		/// position the button on their screen.
+		/// </summary>
+		public bool Enabled
+		{
+			get
+			{
+				return (bool)this.ButtonEnalbed.GetValue(this.Button, null);
+			}
+			set
+			{
+				this.ButtonEnalbed.SetValue(this.Button, value, null);
+			}
+		}
+
+		private ToolbarButtonWrapper() {}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="VOID.ToolbarButtonWrapper"/> class.
+		/// </summary>
+		/// <param name="ns">Namespace, usually the plugin name.</param>
+		/// <param name="id">Identifier, unique per namespace.</param>
+		public ToolbarButtonWrapper(string ns, string id)
+		{
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Loading ToolbarManager.",
+				this.GetType().Name
+			));
+
+			this.ToolbarManager = AssemblyLoader.loadedAssemblies
+				.Select(a => a.assembly.GetExportedTypes())
+				.SelectMany(t => t)
+				.FirstOrDefault(t => t.FullName == "Toolbar.ToolbarManager");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Loaded ToolbarManager.  Getting Instance.",
+				this.GetType().Name
+				));
+
+			this.TBManagerInstance = this.ToolbarManager.GetProperty(
+					"Instance",
+					System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static
+				)
+				.GetValue(null, null);
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got ToolbarManager Instance '{1}'.  Getting 'add' method.",
+				this.GetType().Name,
+				this.TBManagerInstance
+				));
+
+			this.TBManagerAdd = this.ToolbarManager.GetMethod("add");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got ToolbarManager Instance 'add' method.  Loading IButton.",
+				this.GetType().Name
+				));
+
+			this.IButton = AssemblyLoader.loadedAssemblies
+				.Select(a => a.assembly.GetExportedTypes())
+				.SelectMany(t => t)
+				.FirstOrDefault(t => t.FullName == "Toolbar.IButton");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Loaded IButton.  Adding Button with ToolbarManager.",
+				this.GetType().Name
+				));
+
+			this.Button = this.TBManagerAdd.Invoke(this.TBManagerInstance, new object[] {ns, id});
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Added Button '{1}' with ToolbarManager.  Getting 'Text' property",
+				this.GetType().Name,
+				this.Button.ToString()
+				));
+
+			this.ButtonText = this.IButton.GetProperty("Text");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got 'Text' property.  Getting 'TextColor' property.",
+				this.GetType().Name
+				));
+
+			this.ButtonTextColor = this.IButton.GetProperty("TextColor");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got 'TextColor' property.  Getting 'TexturePath' property.",
+				this.GetType().Name
+				));
+
+			this.ButtonTexturePath = this.IButton.GetProperty("TexturePath");
+			
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got 'TexturePath' property.  Getting 'ToolTip' property.",
+				this.GetType().Name
+				));
+
+			this.ButtonToolTip = this.IButton.GetProperty("ToolTip");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got 'ToolTip' property.  Getting 'Visible' property.",
+				this.GetType().Name
+				));
+
+			this.ButtonVisible = this.IButton.GetProperty("Visible");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got 'Visible' property.  Getting 'Visibility' property.",
+				this.GetType().Name
+				));
+
+			this.ButtonVisibility = this.IButton.GetProperty("Visibility");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got 'Visibility' property.  Getting 'Enabled' property.",
+				this.GetType().Name
+				));
+
+			this.ButtonEnalbed = this.IButton.GetProperty("Enabled");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got 'Enabled' property.  Getting 'OnClick' event.",
+				this.GetType().Name
+				));
+
+			this.ButtonOnClick = this.IButton.GetEvent("OnClick");
+			this.ClickHandlerType = this.ButtonOnClick.EventHandlerType;
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got 'OnClick' event '{1}'.  Getting 'Destroy' method.",
+				this.GetType().Name,
+				this.ButtonOnClick.ToString()
+				));
+
+			this.ButtonDestroy = this.IButton.GetMethod("Destroy");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got 'Destroy' property '{1}'.  Loading GameScenesVisibility class.",
+				this.GetType().Name,
+				this.ButtonDestroy.ToString()
+				));
+
+			this.GameScenesVisibilityType = AssemblyLoader.loadedAssemblies
+				.Select(a => a.assembly.GetExportedTypes())
+					.SelectMany(t => t)
+					.FirstOrDefault(t => t.FullName == "Toolbar.GameScenesVisibility");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got 'GameScenesVisibility' class '{1}'.",
+				this.GetType().Name,
+				this.GameScenesVisibilityType.ToString()
+				));
+
+			Tools.PostDebugMessage("ToolbarButtonWrapper built!");
+		}
+
+		/// <summary>
+		/// Adds event handler to receive "on click" events.
+		/// </summary>
+		/// <example>
+		/// <code>
+		/// ToolbarButtonWrapper button = ...
+		/// button.AddButtonClickHandler(
+		/// 	(e) =>
+		/// 	{
+		/// 		Debug.Log("button clicked, mouseButton: " + e.Mousebutton");
+		/// 	}
+		/// );
+		/// </code>
+		/// </example>
+		/// <param name="Handler">Delegate to handle "on click" events</param>
+		public void AddButtonClickHandler(Action<object> Handler)
+		{
+			Delegate d = Delegate.CreateDelegate(this.ClickHandlerType, Handler.Target, Handler.Method);
+			MethodInfo addHandler = this.ButtonOnClick.GetAddMethod();
+			addHandler.Invoke(this.Button, new object[] { d });
+		}
+
+		/// <summary>
+		/// Sets this button's visibility. Can be used in addition to or as a replacement for <see cref="Visible"/>.
+		/// </summary>
+		/// <param name="gameScenes">Array of GameScene objects in which the button should be visible.</param>
+		public void SetButtonVisibility(params GameScenes[] gameScenes)
+		{
+			object GameScenesVisibilityObj = Activator.CreateInstance(this.GameScenesVisibilityType, gameScenes);
+			this.ButtonVisibility.SetValue(this.Button, GameScenesVisibilityObj, null);
+		}
+
+		/// <summary>
+		/// Permanently destroys this button so that it is no longer displayed.
+		/// Should be used when a plugin is stopped to remove leftover buttons.
+		/// </summary>
+		public void Destroy()
+		{
+			this.ButtonDestroy.Invoke(this.Button, null);
+		}
+	}
+}
+

--- a/VOIDFlightMaster.cs
+++ b/VOIDFlightMaster.cs
@@ -32,8 +32,6 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 using System;
-using System.Collections.Generic;
-using System.Linq;
 using UnityEngine;
 using Engineer.VesselSimulator;
 

--- a/VOID_CBInfoBrowser.cs
+++ b/VOID_CBInfoBrowser.cs
@@ -102,7 +102,7 @@
 			//}
 
 			//toggle for orbital info chunk
-			if (GUILayout.Button("Orbital Characteristics", GUILayout.ExpandWidth(true))) toggleOrbital = !toggleOrbital;
+			if (GUILayout.Button("Orbital Characteristics", GUILayout.ExpandWidth(true))) toggleOrbital.value = !toggleOrbital;
 
 			if (toggleOrbital)
 			{
@@ -156,7 +156,7 @@
 			}
 
 			//toggle for physical info chunk
-			if (GUILayout.Button("Physical Characteristics", GUILayout.ExpandWidth(true))) togglePhysical = !togglePhysical;
+			if (GUILayout.Button("Physical Characteristics", GUILayout.ExpandWidth(true))) togglePhysical.value = !togglePhysical;
 
 			if (togglePhysical)
 			{

--- a/VOID_Core.cs
+++ b/VOID_Core.cs
@@ -68,7 +68,7 @@
 		 * Fields
 		 * */
 		protected string VoidName = "VOID";
-		protected string VoidVersion = "0.9.13";
+		protected string VoidVersion = "0.9.17";
 
 		protected bool _factoryReset = false;
 
@@ -135,10 +135,12 @@
 
 		public float saveTimer = 0;
 
+		protected string defaultSkin = "KSP window 2";
+
 		[AVOID_SaveValue("defaultSkin")]
-		protected VOID_SaveValue<string> defaultSkin = "KSP window 2";
-		protected int _skinIdx = int.MinValue;
-		protected List<GUISkin> skin_list;
+		protected VOID_SaveValue<string> _skinName;
+		protected Dictionary<string, GUISkin> skin_list;
+		protected List<string> skinNames;
 		protected string[] forbiddenSkins =
 		{
 			"PlaqueDialogSkin",
@@ -153,6 +155,11 @@
 
 		public bool configDirty;
 
+		[AVOID_SaveValue("UseBlizzyToolbar")]
+		protected VOID_SaveValue<bool> _UseToolbarManager;
+		protected bool ToolbarManagerLoaded = false;
+		internal ToolbarButtonWrapper ToolbarButton;
+
 		/*
 		 * Properties
 		 * */
@@ -176,11 +183,11 @@
 		{
 			get
 			{
-				if (this.skin_list == null || this._skinIdx < 0 || this._skinIdx > this.skin_list.Count)
+				if (!this.skinsLoaded || this._skinName == null)
 				{
 					return AssetBase.GetGUISkin(this.defaultSkin);
 				}
-				return this.skin_list[this._skinIdx];
+				return this.skin_list[this._skinName];
 			}
 		}
 
@@ -233,6 +240,28 @@
 			get
 			{
 				return this._updatePeriod;
+			}
+		}
+
+		protected bool UseToolbarManager
+		{
+			get
+			{
+				return _UseToolbarManager;
+			}
+			set
+			{
+				if (value == false && this.ToolbarManagerLoaded && this.ToolbarButton != null)
+				{
+					this.ToolbarButton.Destroy();
+					this.ToolbarButton = null;
+				}
+				if (value == true && this.ToolbarManagerLoaded && this.ToolbarButton == null)
+				{
+					this.InitializeToolbarButton();
+				}
+
+				_UseToolbarManager.value = value;
 			}
 		}
 
@@ -243,14 +272,18 @@
 		{
 			this._Name = "VOID Core";
 
-			this._Active = true;
+			this._Active.value = true;
 
 			this.VOIDIconOn = GameDatabase.Instance.GetTexture (this.VOIDIconOnPath, false);
 			this.VOIDIconOff = GameDatabase.Instance.GetTexture (this.VOIDIconOffPath, false);
 
+			this._skinName = this.defaultSkin;
+
+			this.UseToolbarManager = false;
+
 			this.LoadConfig ();
 		}
-
+		
 		protected void LoadModulesOfType<T>()
 		{
 			var types = AssemblyLoader.loadedAssemblies
@@ -290,7 +323,7 @@
 				"{0}: Loaded {1} modules.",
 				this.GetType().Name,
 				this.Modules.Count
-			));
+				));
 		}
 
 		protected void LoadModule(Type T)
@@ -302,7 +335,7 @@
 					"{0}: refusing to load {1}: already loaded",
 					this.GetType().Name,
 					T.Name
-				));
+					));
 				return;
 			}
 			IVOID_Module module = Activator.CreateInstance (T) as IVOID_Module;
@@ -313,110 +346,38 @@
 				"{0}: loaded module {1}.",
 				this.GetType().Name,
 				T.Name
-			));
-		}
-
-		protected void Preload_BeforeUpdate()
-		{
-			if (!this.bodiesLoaded)
-			{
-				this.LoadAllBodies();
-			}
-
-			if (!this.vesselTypesLoaded)
-			{
-				this.LoadVesselTypes();
-			}
-		}
-
-		public void Update()
-		{
-			this.Preload_BeforeUpdate ();
-
-			if (this.vessel != null)
-			{
-				SimManager.Instance.Gravity = VOID_Core.Instance.vessel.mainBody.gravParameter /
-					Math.Pow(VOID_Core.Instance.vessel.mainBody.Radius, 2);
-				SimManager.Instance.TryStartSimulation();
-			}
-
-			if (!this.guiRunning)
-			{
-				this.StartGUI ();
-			}
-
-			if (!HighLogic.LoadedSceneIsFlight && this.guiRunning)
-			{
-				this.StopGUI ();
-			}
-
-			foreach (IVOID_Module module in this.Modules)
-			{
-				if (!module.guiRunning && module.toggleActive)
-				{
-					module.StartGUI ();
-				}
-				if (module.guiRunning && !module.toggleActive ||
-				    !this.togglePower ||
-				    !HighLogic.LoadedSceneIsFlight ||
-				    this.factoryReset
-				    )
-				{
-					module.StopGUI();
-				}
-
-				if (module is IVOID_BehaviorModule)
-				{
-					((IVOID_BehaviorModule)module).Update();
-				}
-			}
-
-			this.CheckAndSave ();
-			this._updateTimer += Time.deltaTime;
-		}
-
-		public void FixedUpdate()
-		{
-			if (this.consumeResource &&
-			    this.vessel.vesselType != VesselType.EVA &&
-			    TimeWarp.deltaTime != 0
-			    )
-			{
-				float powerReceived = this.vessel.rootPart.RequestResource(this.resourceName,
-				                                                          this.resourceRate * TimeWarp.fixedDeltaTime);
-				if (powerReceived > 0)
-				{
-					this.powerAvailable = true;
-				}
-				else
-				{
-					this.powerAvailable = false;
-				}
-			}
-
-			foreach (IVOID_BehaviorModule module in
-			         this._modules.OfType<IVOID_BehaviorModule>().Where(m => !m.GetType().IsAbstract))
-			{
-				module.FixedUpdate();
-			}
+				));
 		}
 
 		protected void LoadSkins()
 		{
+			Tools.PostDebugMessage ("AssetBase has skins: \n" +
+			                        string.Join("\n\t", AssetBase.FindObjectsOfTypeIncludingAssets (
+				typeof(GUISkin))
+			            .Select(s => s.ToString())
+			            .ToArray()
+			            )
+			                        );
+
 			this.skin_list = AssetBase.FindObjectsOfTypeIncludingAssets(typeof(GUISkin))
 				.Where(s => !this.forbiddenSkins.Contains(s.name))
 					.Select(s => s as GUISkin)
-					.ToList();
+					.GroupBy(s => s.name)
+					.Select(g => g.First())
+					.ToDictionary(s => s.name);
 
 			Tools.PostDebugMessage(string.Format(
 				"{0}: loaded {1} GUISkins.",
 				this.GetType().Name,
 				this.skin_list.Count
-			));
-
-			if (this._skinIdx == int.MinValue)
-			{
-				this._skinIdx = this.skin_list.IndexOf(this.Skin);
+				));
+
+			this.skinNames = this.skin_list.Keys.ToList();
+			this.skinNames.Sort();
+
+			if (this._skinName == null || !this.skinNames.Contains(this._skinName))
+			{
+				this._skinName = this.defaultSkin;
 				Tools.PostDebugMessage(string.Format(
 					"{0}: resetting _skinIdx to default.",
 					this.GetType().Name
@@ -426,7 +387,7 @@
 			Tools.PostDebugMessage(string.Format(
 				"{0}: _skinIdx = {1}.",
 				this.GetType().Name,
-				this._skinIdx.ToString()
+				this._skinName.ToString()
 				));
 
 			this.skinsLoaded = true;
@@ -457,7 +418,6 @@
 			this.GUIStylesLoaded = true;
 		}
 
-		
 		protected void LoadAllBodies()
 		{
 			this._allBodies = FlightGlobals.Bodies;
@@ -470,26 +430,57 @@
 			this.vesselTypesLoaded = true;
 		}
 
-		protected void CheckAndSave()
-		{
-			this.saveTimer += Time.deltaTime;
-
-			if (this.saveTimer > 2f)
-			{
-				Tools.PostDebugMessage (string.Format (
-					"{0}: Time to save, checking if configDirty: {1}",
-					this.GetType ().Name,
-					this.configDirty
-					));
-
-				if (!this.configDirty)
-				{
-					return;
-				}
-
-				this.SaveConfig ();
-				this.saveTimer = 0;
-			}
+		protected void LoadBeforeUpdate()
+		{
+			if (!this.bodiesLoaded)
+			{
+				this.LoadAllBodies();
+			}
+
+			if (!this.vesselTypesLoaded)
+			{
+				this.LoadVesselTypes();
+			}
+		}
+
+		protected void LoadToolbarManager()
+		{
+			Type ToolbarManager = AssemblyLoader.loadedAssemblies
+				.Select(a => a.assembly.GetExportedTypes())
+					.SelectMany(t => t)
+					.FirstOrDefault(t => t.FullName == "Toolbar.ToolbarManager");
+
+			if (ToolbarManager == null)
+			{
+				Tools.PostDebugMessage(string.Format(
+					"{0}: Could not load ToolbarManager.",
+					this.GetType().Name
+				));
+
+				return;
+			}
+
+			this.InitializeToolbarButton();
+
+			this.ToolbarManagerLoaded = true;
+		}
+
+		protected void InitializeToolbarButton()
+		{
+			this.ToolbarButton = new ToolbarButtonWrapper(this.GetType().Name, "coreToggle");
+			this.ToolbarButton.Text = this.VoidName;
+			this.ToolbarButton.TexturePath = this.VOIDIconOffPath + "_24x24";
+			if (this is VOID_EditorCore)
+			{
+				this.ToolbarButton.SetButtonVisibility(new GameScenes[] { GameScenes.EDITOR });
+			}
+			else
+			{
+				this.ToolbarButton.SetButtonVisibility(new GameScenes[] { GameScenes.FLIGHT });
+			}
+			this.ToolbarButton.AddButtonClickHandler(
+				(e) => this.mainGuiMinimized = !this.mainGuiMinimized
+			);
 		}
 
 		public void VOIDMainWindow(int _)
@@ -502,7 +493,7 @@
 				{
 					string str = "ON";
 					if (togglePower) str = "OFF";
-					if (GUILayout.Button("Power " + str)) togglePower = !togglePower;
+					if (GUILayout.Button("Power " + str)) togglePower.value = !togglePower;
 				}
 
 				if (togglePower || HighLogic.LoadedSceneIsEditor)
@@ -518,7 +509,7 @@
 			    GUILayout.Label("-- POWER LOST --", this.LabelStyles["red"]);
 			}
 
-			this.configWindowMinimized = !GUILayout.Toggle (!this.configWindowMinimized, "Configuration");
+			this.configWindowMinimized.value = !GUILayout.Toggle (!this.configWindowMinimized, "Configuration");
 
 			GUILayout.EndVertical();
 			GUI.DragWindow();
@@ -536,35 +527,53 @@
 
 		public override void DrawConfigurables()
 		{
+			int skinIdx;
+
+			GUIContent _content;
+
 			if (HighLogic.LoadedSceneIsFlight)
 			{
-				this.consumeResource = GUILayout.Toggle (this.consumeResource, "Consume Resources");
+				this.consumeResource.value = GUILayout.Toggle (this.consumeResource, "Consume Resources");
 
 				this.VOIDIconLocked = GUILayout.Toggle (this.VOIDIconLocked, "Lock Icon Position");
 			}
 
+			this.UseToolbarManager = GUILayout.Toggle(this.UseToolbarManager, "Use Blizzy's Toolbar If Available");
+
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 
 			GUILayout.Label("Skin:", GUILayout.ExpandWidth(false));
 
-			GUIContent _content = new GUIContent();
+			_content = new GUIContent();
+
+			if (skinNames.Contains(this._skinName))
+			{
+				skinIdx = skinNames.IndexOf(this._skinName);
+			}
+			else if (skinNames.Contains(this.defaultSkin))
+			{
+				skinIdx = skinNames.IndexOf(this.defaultSkin);
+			}
+			else
+			{
+				skinIdx = 0;
+			}
 
 			_content.text = "◄";
 			_content.tooltip = "Select previous skin";
 			if (GUILayout.Button(_content, GUILayout.ExpandWidth(true)))
 			{
-				this._skinIdx--;
-				if (this._skinIdx < 0) this._skinIdx = skin_list.Count - 1;
+				skinIdx--;
+				if (skinIdx < 0) skinIdx = skinNames.Count - 1;
 				Tools.PostDebugMessage (string.Format (
 					"{0}: new this._skinIdx = {1} :: skin_list.Count = {2}",
 					this.GetType().Name,
-					this._skinIdx,
+					this._skinName,
 					this.skin_list.Count
 				));
 			}
 
-			string skin_name = skin_list[this._skinIdx].name;
-			_content.text = skin_name;
+			_content.text = this.Skin.name;
 			_content.tooltip = "Current skin";
 			GUILayout.Label(_content, this.LabelStyles["center"], GUILayout.ExpandWidth(true));
 
@@ -572,19 +581,19 @@
 			_content.tooltip = "Select next skin";
 			if (GUILayout.Button(_content, GUILayout.ExpandWidth(true)))
 			{
-				this._skinIdx++;
-				if (this._skinIdx >= skin_list.Count) this._skinIdx = 0;
+				skinIdx++;
+				if (skinIdx >= skinNames.Count) skinIdx = 0;
 				Tools.PostDebugMessage (string.Format (
 					"{0}: new this._skinIdx = {1} :: skin_list.Count = {2}",
 					this.GetType().Name,
-					this._skinIdx,
+					this._skinName,
 					this.skin_list.Count
 					));
 			}
 
-			if (this.Skin.name != this.defaultSkin)
-			{
-				this.defaultSkin = this.Skin.name;
+			if (this._skinName != skinNames[skinIdx])
+			{
+				this._skinName = skinNames[skinIdx];
 			}
 
 			GUILayout.EndHorizontal();
@@ -611,6 +620,94 @@
 			}
 
 			this._factoryReset = GUILayout.Toggle (this._factoryReset, "Factory Reset");
+		}
+
+		public override void DrawGUI()
+		{
+			this._windowID = this.windowBaseID;
+
+			if (!this._modulesLoaded)
+			{
+				this.LoadModulesOfType<IVOID_Module> ();
+			}
+
+			if (this.UseToolbarManager && !this.ToolbarManagerLoaded)
+			{
+				this.LoadToolbarManager();
+			}
+
+			if (!this.skinsLoaded)
+			{
+				this.LoadSkins();
+			}
+
+			GUI.skin = this.Skin;
+
+			if (!this.GUIStylesLoaded)
+			{
+				this.LoadGUIStyles ();
+			}
+
+			if (this.UseToolbarManager && this.ToolbarManagerLoaded)
+			{
+				this.ToolbarButton.TexturePath = VOIDIconOffPath + "_24x24";
+				if (this.togglePower)
+				{
+					this.ToolbarButton.TexturePath = VOIDIconOnPath + "_24x24";
+				}
+			}
+			else
+			{
+				this.VOIDIconTexture = this.VOIDIconOff;  //icon off default
+				if (this.togglePower)
+					this.VOIDIconTexture = this.VOIDIconOn;     //or on if power_toggle==true
+				if (GUI.Button(VOIDIconPos, VOIDIconTexture, new GUIStyle()) && this.VOIDIconLocked)
+				{
+					this.mainGuiMinimized.value = !this.mainGuiMinimized;
+				}
+			}
+
+			if (!this.mainGuiMinimized)
+			{
+				Rect _mainWindowPos = this.mainWindowPos;
+
+				_mainWindowPos = GUILayout.Window (
+					this.windowID,
+					_mainWindowPos,
+					this.VOIDMainWindow,
+					string.Join (" ", new string[] {this.VoidName, this.VoidVersion}),
+					GUILayout.Width (250),
+					GUILayout.Height (50)
+					);
+
+				_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,
+					this.VOIDConfigWindow,
+					string.Join (" ", new string[] {this.VoidName, "Configuration"}),
+					GUILayout.Width (250),
+					GUILayout.Height (50)
+					);
+
+				_configWindowPos = Tools.ClampRectToScreen (_configWindowPos);
+
+				if (_configWindowPos != this.configWindowPos)
+				{
+					this.configWindowPos = _configWindowPos;
+				}
+			}
 		}
 
 		public void OnGUI()
@@ -668,74 +765,75 @@
 			}
 		}
 
-		public override void DrawGUI()
-		{
-			if (!this._modulesLoaded)
-			{
-				this.LoadModulesOfType<IVOID_Module> ();
-			}
-
-			this._windowID = this.windowBaseID;
-
-			if (!this.skinsLoaded)
-			{
-				this.LoadSkins();
-			}
-
-			GUI.skin = this.Skin;
-
-			if (!this.GUIStylesLoaded)
-			{
-				this.LoadGUIStyles ();
-			}
-
-			this.VOIDIconTexture = this.VOIDIconOff;  //icon off default
-			if (this.togglePower) this.VOIDIconTexture = this.VOIDIconOn;     //or on if power_toggle==true
-			if (GUI.Button(VOIDIconPos, VOIDIconTexture) && this.VOIDIconLocked)
-			{
-				this.mainGuiMinimized = !this.mainGuiMinimized;
-			}
-
-			if (!this.mainGuiMinimized)
-			{
-				Rect _mainWindowPos = this.mainWindowPos;
-
-				_mainWindowPos = GUILayout.Window (
-					this.windowID,
-					_mainWindowPos,
-					this.VOIDMainWindow,
-					string.Join (" ", new string[] {this.VoidName, this.VoidVersion}),
-					GUILayout.Width (250),
-					GUILayout.Height (50)
-				);
-
-				_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,
-					this.VOIDConfigWindow,
-					string.Join (" ", new string[] {this.VoidName, "Configuration"}),
-					GUILayout.Width (250),
-					GUILayout.Height (50)
-				);
-
-				_configWindowPos = Tools.ClampRectToScreen (_configWindowPos);
-
-				if (_configWindowPos != this.configWindowPos)
-				{
-					this.configWindowPos = _configWindowPos;
-				}
+		public void Update()
+		{
+			this.LoadBeforeUpdate ();
+
+			if (this.vessel != null)
+			{
+				SimManager.Instance.Gravity = VOID_Core.Instance.vessel.mainBody.gravParameter /
+					Math.Pow(VOID_Core.Instance.vessel.mainBody.Radius, 2);
+				SimManager.Instance.TryStartSimulation();
+			}
+
+			if (!this.guiRunning)
+			{
+				this.StartGUI ();
+			}
+
+			if (!HighLogic.LoadedSceneIsFlight && this.guiRunning)
+			{
+				this.StopGUI ();
+			}
+
+			foreach (IVOID_Module module in this.Modules)
+			{
+				if (!module.guiRunning && module.toggleActive)
+				{
+					module.StartGUI ();
+				}
+				if (module.guiRunning && !module.toggleActive ||
+				    !this.togglePower ||
+				    !HighLogic.LoadedSceneIsFlight ||
+				    this.factoryReset
+				    )
+				{
+					module.StopGUI();
+				}
+
+				if (module is IVOID_BehaviorModule)
+				{
+					((IVOID_BehaviorModule)module).Update();
+				}
+			}
+
+			this.CheckAndSave ();
+			this._updateTimer += Time.deltaTime;
+		}
+
+		public void FixedUpdate()
+		{
+			if (this.consumeResource &&
+			    this.vessel.vesselType != VesselType.EVA &&
+			    TimeWarp.deltaTime != 0
+			    )
+			{
+				float powerReceived = this.vessel.rootPart.RequestResource(this.resourceName,
+				                                                           this.resourceRate * TimeWarp.fixedDeltaTime);
+				if (powerReceived > 0)
+				{
+					this.powerAvailable = true;
+				}
+				else
+				{
+					this.powerAvailable = false;
+				}
+			}
+
+			foreach (IVOID_BehaviorModule module in
+			         this._modules.OfType<IVOID_BehaviorModule>().Where(m => !m.GetType().IsAbstract))
+			{
+				module.FixedUpdate();
 			}
 		}
 
@@ -752,6 +850,28 @@
 			this.StartGUI ();
 		}
 
+		protected void CheckAndSave()
+		{
+			this.saveTimer += Time.deltaTime;
+
+			if (this.saveTimer > 2f)
+			{
+				if (!this.configDirty)
+				{
+					return;
+				}
+
+				Tools.PostDebugMessage (string.Format (
+					"{0}: Time to save, checking if configDirty: {1}",
+					this.GetType ().Name,
+					this.configDirty
+					));
+
+				this.SaveConfig ();
+				this.saveTimer = 0;
+			}
+		}
+
 		public override void LoadConfig()
 		{
 			base.LoadConfig ();

--- a/VOID_DataLogger.cs
+++ b/VOID_DataLogger.cs
@@ -30,19 +30,19 @@
 		/*
 		 * Fields
 		 * */
-		protected bool stopwatch1_running = false;
-
-		protected bool csv_logging = false;
-		protected bool first_write = true;
-
-		protected double stopwatch1 = 0;
-
-		protected string csv_log_interval_str = "0.5";
+		protected bool stopwatch1_running;
+
+		protected bool csv_logging;
+		protected bool first_write;
+
+		protected double stopwatch1;
+
+		protected string csv_log_interval_str;
 
 		protected float csv_log_interval;
 
-		protected double csvWriteTimer = 0;
-		protected double csvCollectTimer = 0;
+		protected double csvWriteTimer;
+		protected double csvCollectTimer;
 
 		protected List<string> csvList = new List<string>();
 
@@ -57,6 +57,17 @@
 		public VOID_DataLogger()
 		{
 			this._Name = "CSV Data Logger";
+
+			this.stopwatch1_running = false;
+
+			this.csv_logging = false;
+			this.first_write = true;
+
+			this.stopwatch1 = 0;
+			this.csv_log_interval_str = "0.5";
+
+			this.csvWriteTimer = 0;
+			this.csvCollectTimer = 0;
 
 			this.WindowPos.x = Screen.width - 520;
 			this.WindowPos.y = 85;

--- a/VOID_DataValue.cs
+++ b/VOID_DataValue.cs
@@ -123,11 +123,11 @@
 
 		public abstract string ValueUnitString(string format);
 		
-		public virtual string ValueUnitString(ushort digits) {
+		public virtual string ValueUnitString(int digits) {
 			return Tools.MuMech_ToSI(this.ToDouble(), digits) + this.Units;
 		}
 
-		public virtual string ValueUnitString(ushort digits, int MinMagnitude, int MaxMagnitude)
+		public virtual string ValueUnitString(int digits, int MinMagnitude, int MaxMagnitude)
 		{
 			return Tools.MuMech_ToSI(this.ToDouble(), digits, MinMagnitude, MaxMagnitude) + this.Units;
 		}
@@ -141,38 +141,61 @@
 			GUILayout.EndHorizontal ();
 		}
 
-		public virtual ushort DoGUIHorizontal(ushort digits, bool precisionButton = true)
-		{
+		public virtual int DoGUIHorizontal(int digits, bool precisionButton = true)
+		{
+			if (precisionButton)
+			{
+				return this.DoGUIHorizontalPrec(digits);
+			}
+
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			GUILayout.Label(this.Label + ":", GUILayout.ExpandWidth(true));
 			GUILayout.FlexibleSpace();
-			if (precisionButton)
+			GUILayout.Label(this.ValueUnitString(digits), GUILayout.ExpandWidth(false));
+			GUILayout.EndHorizontal();
+
+			return digits;
+		}
+
+		public virtual int DoGUIHorizontalPrec(int digits)
+		{
+			float magnitude;
+			float magLimit;
+
+			magnitude = (float)Math.Log10(Math.Abs(this.ToDouble()));
+
+			magLimit = Mathf.Max(magnitude, 6f);
+			magLimit = Mathf.Round((float)Math.Ceiling(magLimit / 3f) * 3f);
+
+			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
+			GUILayout.Label(this.Label + "ⁱ:", GUILayout.ExpandWidth(true));
+			GUILayout.FlexibleSpace();
+
+			GUILayout.Label(this.ValueUnitString(3, int.MinValue, (int)magnitude - digits), GUILayout.ExpandWidth(false));
+			GUILayout.EndHorizontal();
+
+			if (Event.current.type == EventType.mouseUp)
 			{
-				float magnitude = (float)Math.Log10(Math.Abs(this.ToDouble()));
-				GUILayout.Label(this.ValueUnitString(3, int.MinValue, (int)magnitude - digits), GUILayout.ExpandWidth(false));
-				if (GUILayout.Button(digits.ToString()))
+				Rect lastRect = GUILayoutUtility.GetLastRect();
+				if (lastRect.Contains(Event.current.mousePosition))
 				{
-					float magLimit = Math.Max(magnitude, 6f);
-					magLimit = (float)Math.Ceiling(magLimit / 3f) * 3f;
 					if (Event.current.button == 0)
 					{
-						digits = (ushort)((digits + 3) % (int)magLimit);
+						digits = (digits + 3) % (int)magLimit;
 					}
 					else if (Event.current.button == 1)
 					{
-						digits = (ushort)((digits - 3) % (int)magLimit);
+						digits = (digits - 3) % (int)magLimit;
+						if (digits < 0)
+						{
+							digits = (int)magLimit - 3;
+						}
 					}
 				}
 			}
-			else
-			{
-				GUILayout.Label(this.ValueUnitString(digits), GUILayout.ExpandWidth(false));
-			}
-			GUILayout.EndHorizontal();
 
 			return digits;
 		}
-
 	}
 
 	public class VOID_DoubleValue : VOID_NumValue<double>, IVOID_NumericValue

--- a/VOID_EditorHUD.cs
+++ b/VOID_EditorHUD.cs
@@ -68,7 +68,7 @@
 		{
 			this._Name = "Heads-Up Display";
 
-			this._Active = true;
+			this._Active.value = true;
 
 			this.textColors.Add(Color.green);
 			this.textColors.Add(Color.black);

--- a/VOID_HUD.cs
+++ b/VOID_HUD.cs
@@ -37,8 +37,6 @@
 
 		protected List<Color> textColors = new List<Color>();
 
-		protected GUIStyle labelStyle;
-
 		/*
 		 * Properties
 		 * */
@@ -67,7 +65,7 @@
 		{
 			this._Name = "Heads-Up Display";
 
-			this._Active = true;
+			this._Active.value = true;
 
 			this.textColors.Add(Color.green);
 			this.textColors.Add(Color.black);
@@ -79,8 +77,8 @@
 			this.textColors.Add(Color.cyan);
 			this.textColors.Add(Color.magenta);
 
-			this.labelStyle = new GUIStyle ();
-			this.labelStyle.normal.textColor = this.textColors [this.ColorIndex];
+			VOID_Core.Instance.LabelStyles["hud"] = new GUIStyle();
+			VOID_Core.Instance.LabelStyles["hud"].normal.textColor = this.textColors [this.ColorIndex];
 
 			Tools.PostDebugMessage ("VOID_HUD: Constructed.");
 		}
@@ -91,7 +89,7 @@
 
 			if (VOID_Core.Instance.powerAvailable)
 			{
-				labelStyle.normal.textColor = textColors [ColorIndex];
+				VOID_Core.Instance.LabelStyles["hud"].normal.textColor = textColors [ColorIndex];
 
 				GUI.Label (
 					new Rect ((Screen.width * .2083f), 0, 300f, 70f),
@@ -103,7 +101,7 @@
 					" ETA " + Tools.ConvertInterval (vessel.orbit.timeToPe) +
 					"\nInc: " + vessel.orbit.inclination.ToString ("F3") + "°" +
 					"\nPrimary: " + vessel.mainBody.bodyName,
-					labelStyle);
+					VOID_Core.Instance.LabelStyles["hud"]);
 				// Toadicus edit: Added "Biome: " line to surf/atmo HUD
 				GUI.Label (
 					new Rect ((Screen.width * .625f), 0, 300f, 90f),
@@ -116,13 +114,13 @@
 					"\nHdg: " + Tools.MuMech_get_heading (vessel).ToString ("F2") + "° " +
 					Tools.get_heading_text (Tools.MuMech_get_heading (vessel)) +
 					"\nBiome: " + Tools.Toadicus_GetAtt (vessel).name,
-					labelStyle);
+					VOID_Core.Instance.LabelStyles["hud"]);
 			}
 			else
 			{
-				labelStyle.normal.textColor = Color.red;
-				GUI.Label (new Rect ((Screen.width * .2083f), 0, 300f, 70f), "-- POWER LOST --", labelStyle);
-				GUI.Label (new Rect ((Screen.width * .625f), 0, 300f, 70f), "-- POWER LOST --", labelStyle);
+				VOID_Core.Instance.LabelStyles["hud"].normal.textColor = Color.red;
+				GUI.Label (new Rect ((Screen.width * .2083f), 0, 300f, 70f), "-- POWER LOST --", VOID_Core.Instance.LabelStyles["hud"]);
+				GUI.Label (new Rect ((Screen.width * .625f), 0, 300f, 70f), "-- POWER LOST --", VOID_Core.Instance.LabelStyles["hud"]);
 			}
 		}
 

--- a/VOID_Module.cs
+++ b/VOID_Module.cs
@@ -50,7 +50,7 @@
 			}
 			set
 			{
-				this._Active = value;
+				this._Active.value = value;
 			}
 		}
 
@@ -130,6 +130,8 @@
 
 				string fieldName = string.Format("{0}_{1}", this.GetType().Name, attr.Name);
 
+				Tools.PostDebugMessage(string.Format("{0}: Loading field {1}.", this.GetType().Name, fieldName));
+
 				object fieldValue = field.GetValue(this);
 
 				bool convertBack = false;
@@ -198,23 +200,13 @@
 		public virtual void ModuleWindow(int _)
 		{
 			if (VOID_Core.Instance.updateTimer - this.lastUpdate > VOID_Core.Instance.updatePeriod) {
-				Tools.PostDebugMessage(string.Format(
-					"{0}: refreshing VOID_DataValues.",
-					this.GetType().Name
-				));
-
 				foreach (var fieldinfo in this.GetType().GetFields(
 					BindingFlags.Instance |
 					BindingFlags.NonPublic |
 					BindingFlags.Public |
 					BindingFlags.FlattenHierarchy
-				)) {
-					Tools.PostDebugMessage(string.Format(
-						"{0}: checking field {1}.",
-						this.GetType().Name,
-						fieldinfo.Name
-					));
-
+				))
+				{
 					object field = null;
 
 					try
@@ -234,19 +226,7 @@
 					}
 
 					if (typeof(IVOID_DataValue).IsAssignableFrom (field.GetType ())) {
-						Tools.PostDebugMessage(string.Format(
-							"{0}: found field {1}.",
-							this.GetType().Name,
-							fieldinfo.Name
-						));
-
 						(field as IVOID_DataValue).Refresh ();
-
-						Tools.PostDebugMessage(string.Format(
-							"{0}: refreshed field {1}.",
-							this.GetType().Name,
-							fieldinfo.Name
-						));
 					}
 				}
 
@@ -256,6 +236,8 @@
 
 		public override void DrawGUI()
 		{
+			GUI.skin = VOID_Core.Instance.Skin;
+
 			Rect _Pos = this.WindowPos;
 
 			_Pos = GUILayout.Window(

--- a/VOID_Orbital.cs
+++ b/VOID_Orbital.cs
@@ -68,7 +68,7 @@
 		);
 
 		protected VOID_StrValue timeToPeri = new VOID_StrValue(
-			"Time to Apoapsis",
+			"Time to Periapsis",
 			new Func<string>(() => Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.timeToPe))
 		);
 
@@ -162,34 +162,34 @@
 
 			this.primaryName.DoGUIHorizontal ();
 
-			this.precisionValues [idx] = this.orbitAltitude.DoGUIHorizontal (this.precisionValues [idx]);
-			idx++;
-
-			this.precisionValues [idx] = this.orbitVelocity.DoGUIHorizontal (this.precisionValues [idx]);
-			idx++;
-
-			this.precisionValues [idx] = this.orbitApoAlt.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.orbitAltitude.DoGUIHorizontal (this.precisionValues [idx]);
+			idx++;
+
+			this.precisionValues [idx]= (ushort)this.orbitVelocity.DoGUIHorizontal (this.precisionValues [idx]);
+			idx++;
+
+			this.precisionValues [idx]= (ushort)this.orbitApoAlt.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
 			this.timeToApo.DoGUIHorizontal();
 
-			this.precisionValues [idx] = this.oribtPeriAlt.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.oribtPeriAlt.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
 			this.timeToPeri.DoGUIHorizontal();
 
 			this.orbitInclination.DoGUIHorizontal("F3");
 
-			this.precisionValues [idx] = this.gravityAccel.DoGUIHorizontal (this.precisionValues [idx]);
-			idx++;
-
-			this.toggleExtended = GUILayout.Toggle(this.toggleExtended, "Extended info");
+			this.precisionValues [idx]= (ushort)this.gravityAccel.DoGUIHorizontal (this.precisionValues [idx]);
+			idx++;
+
+			this.toggleExtended.value = GUILayout.Toggle(this.toggleExtended, "Extended info");
 
 			if (this.toggleExtended)
             {
 				this.orbitPeriod.DoGUIHorizontal();
 
-				this.precisionValues [idx] = this.semiMajorAxis.DoGUIHorizontal (this.precisionValues [idx]);
+				this.precisionValues [idx]= (ushort)this.semiMajorAxis.DoGUIHorizontal (this.precisionValues [idx]);
 				idx++;
 
 				this.eccentricity.DoGUIHorizontal("F4");

--- a/VOID_Rendezvous.cs
+++ b/VOID_Rendezvous.cs
@@ -114,7 +114,7 @@
 				}
 			}
 
-			untoggleRegisterInfo = GUILayout.Toggle(untoggleRegisterInfo, "Hide Vessel Register Info");
+			untoggleRegisterInfo.value = GUILayout.Toggle(untoggleRegisterInfo, "Hide Vessel Register Info");
 
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			GUILayout.Label(" ", GUILayout.ExpandWidth(true));

--- a/VOID_SaveValue.cs
+++ b/VOID_SaveValue.cs
@@ -30,6 +30,28 @@
 		private T _value;
 		private Type _type;
 
+		private VOID_Core Core
+		{
+			get
+			{
+				if (HighLogic.LoadedSceneIsEditor)
+				{
+					if (VOID_EditorCore.Initialized)
+					{
+						return VOID_EditorCore.Instance;
+					}
+				}
+				else if (HighLogic.LoadedSceneIsFlight)
+				{
+					if (VOID_Core.Initialized)
+					{
+						return VOID_Core.Instance;
+					}
+				}
+				return null;
+			}
+		}
+
 		public T value
 		{
 			get
@@ -38,6 +60,20 @@
 			}
 			set
 			{
+				if (this.Core != null && !System.Object.Equals(this._value, value))
+				{
+					Tools.PostDebugMessage (string.Format (
+						"VOID: Dirtying config for type {0} in method {1}." +
+						"\n\t Old Value: {2}, New Value: {3}" +
+						"\n\t Object.Equals(New, Old): {4}",
+						this._type,
+						new System.Diagnostics.StackTrace().GetFrame(1).GetMethod(),
+						this._value,
+						value,
+						System.Object.Equals(this._value, value)
+					));
+					this.Core.configDirty = true;
+				}
 				this._value = value;
 			}
 		}
@@ -46,6 +82,10 @@
 		{
 			get
 			{
+				if (this._type == null && this._value != null)
+				{
+					this._type = this._value.GetType ();
+				}
 				return this._type;
 			}
 			set
@@ -64,7 +104,7 @@
 
 		public void SetValue(object v)
 		{
-			this._value = (T)v;
+			this.value = (T)v;
 		}
 
 		public static implicit operator T(VOID_SaveValue<T> v)
@@ -75,18 +115,8 @@
 		public static implicit operator VOID_SaveValue<T>(T v)
 		{
 			VOID_SaveValue<T> r = new VOID_SaveValue<T>();
+			r.type = v.GetType();
 			r.value = v;
-			r.type = v.GetType();
-
-			if (VOID_Core.Initialized)
-			{
-				VOID_Core.Instance.configDirty = true;
-			}
-
-			if (VOID_EditorCore.Initialized)
-			{
-				VOID_EditorCore.Instance.configDirty = true;
-			}
 
 			return r;
 		}

--- a/VOID_SurfAtmo.cs
+++ b/VOID_SurfAtmo.cs
@@ -138,7 +138,7 @@
 
 			GUILayout.BeginVertical();
 
-			this.precisionValues [idx] = this.trueAltitude.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.trueAltitude.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
 			this.surfLatitude.DoGUIHorizontal ();
@@ -147,16 +147,16 @@
 
 			this.vesselHeading.DoGUIHorizontal ();
 
-			this.precisionValues [idx] = this.terrainElevation.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.terrainElevation.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
-			this.precisionValues [idx] = this.surfVelocity.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.surfVelocity.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
-			this.precisionValues [idx] = this.vertVelocity.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.vertVelocity.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
-			this.precisionValues [idx] = this.horzVelocity.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.horzVelocity.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
 			this.temperature.DoGUIHorizontal ("F2");
@@ -165,7 +165,7 @@
 
 			this.atmPressure.DoGUIHorizontal ("F2");
 
-			this.precisionValues [idx] = this.atmLimit.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.atmLimit.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
 			// Toadicus edit: added Biome

--- a/VOID_Transfer.cs
+++ b/VOID_Transfer.cs
@@ -27,9 +27,6 @@
 {
 	public class VOID_Transfer : VOID_WindowModule
 	{
-		[AVOID_SaveValue("toggleExtended")]
-		protected VOID_SaveValue<bool> toggleExtended = false;
-
 		protected List<CelestialBody> selectedBodies = new List<CelestialBody>();
 
 		public VOID_Transfer()

--- a/VOID_VesselInfo.cs
+++ b/VOID_VesselInfo.cs
@@ -28,9 +28,6 @@
 {
 	public class VOID_VesselInfo : VOID_WindowModule
 	{
-		[AVOID_SaveValue("toggleExtended")]
-		protected VOID_SaveValue<bool> toggleExtended = false;
-
 		protected VOID_DoubleValue geeForce = new VOID_DoubleValue(
 			"G-force",
 			new Func<double>(() => VOID_Core.Instance.vessel.geeForce),

--- a/VOID_VesselRegister.cs
+++ b/VOID_VesselRegister.cs
@@ -133,7 +133,7 @@
 							if (_selectedVessel != v)
 							{
 								_selectedVessel = v; //set clicked vessel as selected_vessel
-								this._Active = true;    //turn bool on to open the window if closed
+								this._Active.value = true;    //turn bool on to open the window if closed
 							}
 							else
 							{