Revert "ToolbarButtonWrapper: Renamed Destroy to DestroyButton, since that's what it does."
Revert "ToolbarButtonWrapper: Renamed Destroy to DestroyButton, since that's what it does."

This reverts commit ae4b7ac1653f2dd2407c92e5a2b5392a2e673fa3.

--- 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,191 @@
+//
+//  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 KSP;
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using UnityEngine;
 
+namespace VOID
+{
+	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 EventInfo ButtonOnClick;
+		protected System.Type ClickHandlerType;
+		protected MethodInfo ButtonDestroy;
+
+		public string Text
+		{
+			get
+			{
+				return this.ButtonText.GetValue(this.Button, null) as String;
+			}
+			set
+			{
+				this.ButtonText.SetValue(this.Button, value, null);
+			}
+		}
+
+		public Color TextColor
+		{
+			get
+			{
+				return (Color)this.ButtonTextColor.GetValue(this.Button, null);
+			}
+			set
+			{
+				this.ButtonTextColor.SetValue(this.Button, value, null);
+			}
+		}
+
+		public string TexturePath
+		{
+			get
+			{
+				return this.ButtonTexturePath.GetValue(this.Button, null) as string;
+			}
+			set
+			{
+				this.ButtonTexturePath.SetValue(this.Button, value, null);
+			}
+		}
+
+		private ToolbarButtonWrapper() {}
+
+		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 'OnClick' property.",
+				this.GetType().Name
+				));
+
+			this.ButtonOnClick = this.IButton.GetEvent("OnClick");
+			this.ClickHandlerType = this.ButtonOnClick.EventHandlerType;
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got 'OnClick' property '{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}'.",
+				this.GetType().Name,
+				this.ButtonDestroy.ToString()
+				));
+
+			Tools.PostDebugMessage("ToolbarButtonWrapper built!");
+		}
+
+		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 });
+		}
+
+		public void Destroy()
+		{
+			this.ButtonDestroy.Invoke(this.Button, null);
+		}
+	}
+}
+
+

--- 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.14";
+		protected string VoidVersion = "0.9.15";
 
 		protected bool _factoryReset = false;
 
@@ -155,6 +155,10 @@
 
 		public bool configDirty;
 
+		protected bool ToolbarManagerLoaded = false;
+		protected bool _UseToolbarManager;
+		internal ToolbarButtonWrapper ToolbarButton;
+
 		/*
 		 * Properties
 		 * */
@@ -238,6 +242,28 @@
 			}
 		}
 
+		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;
+			}
+		}
+
 		/*
 		 * Methods
 		 * */
@@ -245,14 +271,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
@@ -292,7 +322,7 @@
 				"{0}: Loaded {1} modules.",
 				this.GetType().Name,
 				this.Modules.Count
-			));
+				));
 		}
 
 		protected void LoadModule(Type T)
@@ -304,7 +334,7 @@
 					"{0}: refusing to load {1}: already loaded",
 					this.GetType().Name,
 					T.Name
-				));
+					));
 				return;
 			}
 			IVOID_Module module = Activator.CreateInstance (T) as IVOID_Module;
@@ -315,106 +345,31 @@
 				"{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)
+					.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
-			));
+				));
 
 			this.skinNames = this.skin_list.Keys.ToList();
 			this.skinNames.Sort();
@@ -462,7 +417,6 @@
 			this.GUIStylesLoaded = true;
 		}
 
-		
 		protected void LoadAllBodies()
 		{
 			this._allBodies = FlightGlobals.Bodies;
@@ -475,26 +429,49 @@
 			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";
+			this.ToolbarButton.AddButtonClickHandler(
+				(e) => this.mainGuiMinimized = !this.mainGuiMinimized
+			);
 		}
 
 		public void VOIDMainWindow(int _)
@@ -507,7 +484,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)
@@ -523,7 +500,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();
@@ -547,10 +524,12 @@
 
 			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");
 
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 
@@ -632,6 +611,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()
@@ -689,74 +756,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();
 			}
 		}
 
@@ -773,6 +841,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
@@ -149,7 +149,7 @@
 			}
 
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
-			GUILayout.Label(this.Label + " (P" + digits + "):", GUILayout.ExpandWidth(true));
+			GUILayout.Label(this.Label + ":", GUILayout.ExpandWidth(true));
 			GUILayout.FlexibleSpace();
 			GUILayout.Label(this.ValueUnitString(digits), GUILayout.ExpandWidth(false));
 			GUILayout.EndHorizontal();

--- 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
@@ -65,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);

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

--- 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))
 		);
 
@@ -183,7 +183,7 @@
 			this.precisionValues [idx]= (ushort)this.gravityAccel.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
-			this.toggleExtended = GUILayout.Toggle(this.toggleExtended, "Extended info");
+			this.toggleExtended.value = GUILayout.Toggle(this.toggleExtended, "Extended info");
 
 			if (this.toggleExtended)
             {

--- 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_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
 							{