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
@@ -68,7 +68,7 @@
 		 * Fields
 		 * */
 		protected string VoidName = "VOID";
-		protected string VoidVersion = "0.9.13";
+		protected string VoidVersion = "0.9.14";
 
 		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",
@@ -176,11 +178,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];
 			}
 		}
 
@@ -243,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 ();
 		}
@@ -406,7 +410,7 @@
 			this.skin_list = AssetBase.FindObjectsOfTypeIncludingAssets(typeof(GUISkin))
 				.Where(s => !this.forbiddenSkins.Contains(s.name))
 					.Select(s => s as GUISkin)
-					.ToList();
+					.ToDictionary(s => s.name);
 
 			Tools.PostDebugMessage(string.Format(
 				"{0}: loaded {1} GUISkins.",
@@ -414,9 +418,12 @@
 				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 +433,7 @@
 			Tools.PostDebugMessage(string.Format(
 				"{0}: _skinIdx = {1}.",
 				this.GetType().Name,
-				this._skinIdx.ToString()
+				this._skinName.ToString()
 				));
 
 			this.skinsLoaded = true;
@@ -502,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)
@@ -518,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();
@@ -536,9 +543,13 @@
 
 		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");
 			}
@@ -547,24 +558,36 @@
 
 			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 +595,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();
@@ -691,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
@@ -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;
 			}
 		}
 
@@ -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);
 
@@ -256,6 +258,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
@@ -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,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_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
 							{