Changes throughout to avoid dirtying the cache unnecessarily.
Changes throughout to avoid dirtying the cache unnecessarily.

--- 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
@@ -245,10 +245,12 @@
 		{
 			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.LoadConfig ();
 		}
@@ -507,7 +509,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 +525,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,7 +549,7 @@
 
 			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");
 			}
@@ -712,9 +714,9 @@
 
 			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 (GUI.Button(VOIDIconPos, VOIDIconTexture, new GUIStyle()) && this.VOIDIconLocked)
+			{
+				this.mainGuiMinimized.value = !this.mainGuiMinimized;
 			}
 
 			if (!this.mainGuiMinimized)

--- 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_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;
 			}
 		}
 
@@ -129,6 +129,8 @@
 				AVOID_SaveValue attr = attrs.FirstOrDefault () as AVOID_SaveValue;
 
 				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);
 

--- a/VOID_Orbital.cs
+++ b/VOID_Orbital.cs
@@ -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,22 @@
 			}
 			set
 			{
+				if (this.Core != null && !System.Object.Equals(this._value, value))
+				{
+					bool newEqold = ((object)value == (object)this._value);
+					bool newObjEqold = 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 +84,10 @@
 		{
 			get
 			{
+				if (this._type == null && this._value != null)
+				{
+					this._type = this._value.GetType ();
+				}
 				return this._type;
 			}
 			set
@@ -64,7 +106,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 +117,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
 							{