More refactoring. I think everything works now?
More refactoring. I think everything works now?

--- a/API/Attributes/AVOID_SaveValue.cs
+++ b/API/Attributes/AVOID_SaveValue.cs
@@ -29,22 +29,18 @@
 
 namespace VOID
 {
-	[AttributeUsage(AttributeTargets.Field)]
+	[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
 	public class AVOID_SaveValue : Attribute
 	{
-		protected string _name;
-
 		public string Name
 		{
-			get
-			{
-				return this._name;
-			}
+			get;
+			private set;
 		}
 
 		public AVOID_SaveValue(string fieldName)
 		{
-			this._name = fieldName;
+			this.Name = fieldName;
 		}
 	}
 }

--- a/API/VOIDCore.cs
+++ b/API/VOIDCore.cs
@@ -38,6 +38,12 @@
 	public abstract class VOIDCore : VOID_Module, IVOID_Module
 	{
 		public const double Constant_G = 6.674e-11;
+		public const int CONFIG_VERSION = 2;
+
+		public static bool useToolbarManager;
+
+		public abstract int configVersion { get; }
+		public virtual bool configNeedsUpdate { get; set; }
 
 		public abstract int windowID { get; }
 		public abstract bool configDirty { get; set; }
@@ -73,7 +79,23 @@
 			}
 		}
 
+		public override void LoadConfig()
+		{
+			var config = KSP.IO.PluginConfiguration.CreateForType<VOIDCore>(null);
+
+			useToolbarManager = config.GetValue("UseToolbarManager", useToolbarManager);
+
+			base.LoadConfig();
+		}
+
 		public abstract void SaveConfig();
+
+		public override void _SaveToConfig(KSP.IO.PluginConfiguration config)
+		{
+			config.SetValue("UseToolbarManager", useToolbarManager);
+
+			base._SaveToConfig(config);
+		}
 	}
 
 	public delegate void VOIDEventHandler(object sender);

--- a/API/VOID_Module.cs
+++ b/API/VOID_Module.cs
@@ -94,7 +94,7 @@
 			}
 		}
 
-		public virtual bool inValidScene
+		public virtual GameScenes[] ValidScenes
 		{
 			get
 			{
@@ -122,15 +122,24 @@
 					}
 				}
 
+				return this.validScenes;
+			}
+		}
+
+		public virtual bool inValidScene
+		{
+			get
+			{
+
 				Tools.PostDebugMessage(
 					this,
-					"Checking if scene is valid: LoadedScene={0}, validScenes={1}, inValidScene={2}",
+					"Checking if scene is valid: LoadedScene={0}, ValidScenes={1}, inValidScene={2}",
 					Enum.GetName(typeof(GameScenes), HighLogic.LoadedScene),
-					string.Join(", ", this.validScenes.Select(s => Enum.GetName(typeof(GameScenes), s)).ToArray()),
-					this.validScenes.Contains(HighLogic.LoadedScene)
+					string.Join(", ", this.ValidScenes.Select(s => Enum.GetName(typeof(GameScenes), s)).ToArray()),
+					this.ValidScenes.Contains(HighLogic.LoadedScene)
 				);
 
-				return this.validScenes.Contains(HighLogic.LoadedScene);
+				return this.ValidScenes.Contains(HighLogic.LoadedScene);
 			}
 		}
 
@@ -181,13 +190,33 @@
 			var config = KSP.IO.PluginConfiguration.CreateForType<VOID_Module> ();
 			config.load ();
 
-			foreach (var field in this.GetType().GetFields(
+			if (this is VOIDCore)
+			{
+				int configVersion = config.GetValue("VOID_Core_configValue", 2);
+
+				if (configVersion < VOIDCore.CONFIG_VERSION)
+				{
+					((VOIDCore)this).configNeedsUpdate = true;
+				}
+			}
+
+			foreach (var field in this.GetType().GetMembers(
 				BindingFlags.NonPublic |
 				BindingFlags.Public |
 				BindingFlags.Instance |
 				BindingFlags.FlattenHierarchy
-				))
-			{
+			))
+			{
+				if (!(field is FieldInfo || field is PropertyInfo))
+				{
+					continue;
+				}
+
+				if (field is PropertyInfo && (field as PropertyInfo).GetIndexParameters().Length > 0)
+				{
+					continue;
+				}
+
 				object[] attrs = field.GetCustomAttributes(typeof(AVOID_SaveValue), false);
 
 				if (attrs.Length == 0) {
@@ -196,11 +225,48 @@
 
 				AVOID_SaveValue attr = attrs.FirstOrDefault () as AVOID_SaveValue;
 
-				string fieldName = string.Format("{0}_{1}", this.GetType().Name, attr.Name);
+				string fieldName = string.Empty;
+
+				if (this is VOIDCore || this.core.configNeedsUpdate)
+				{
+					string typeName = this.GetType().Name;;
+
+					if (this is VOIDCore && ((VOIDCore)this).configNeedsUpdate)
+					{
+						if (this is VOIDCore_Flight)
+						{
+							typeName = "VOID_Core";
+						}
+						else if (this is VOIDCore_Editor)
+						{
+							typeName = "VOID_EditorCore";
+						}
+					}
+
+					fieldName = string.Format("{0}_{1}", typeName, attr.Name);
+				}
+				else
+				{
+					fieldName = string.Format(
+						"{0}_{1}_{2}",
+						this.GetType().Name,
+						Enum.GetName(typeof(GameScenes), HighLogic.LoadedScene),
+						attr.Name
+					);
+				}
 
 				Tools.PostDebugMessage(string.Format("{0}: Loading field {1}.", this.GetType().Name, fieldName));
 
-				object fieldValue = field.GetValue(this);
+				object fieldValue;
+
+				if (field is FieldInfo)
+				{
+					fieldValue = (field as FieldInfo).GetValue(this);
+				}
+				else
+				{
+					fieldValue = (field as PropertyInfo).GetValue(this, null);
+				}
 
 				bool convertBack = false;
 				if (fieldValue is IVOID_SaveValue)
@@ -219,7 +285,14 @@
 					fieldValue = convertValue;
 				}
 
-				field.SetValue (this, fieldValue);
+				if (field is FieldInfo)
+				{
+					(field as FieldInfo).SetValue(this, fieldValue);
+				}
+				else
+				{
+					(field as PropertyInfo).SetValue(this, fieldValue, null);
+				}
 
 				Tools.PostDebugMessage(string.Format("{0}: Loaded field {1}.", this.GetType().Name, fieldName));
 			}
@@ -227,7 +300,7 @@
 
 		public virtual void _SaveToConfig(KSP.IO.PluginConfiguration config)
 		{
-			foreach (var field in this.GetType().GetFields(
+			foreach (var field in this.GetType().GetMembers(
 				BindingFlags.Instance |
 				BindingFlags.NonPublic |
 				BindingFlags.Public |
@@ -242,9 +315,32 @@
 
 				AVOID_SaveValue attr = attrs.FirstOrDefault () as AVOID_SaveValue;
 
-				string fieldName = string.Format("{0}_{1}", this.GetType().Name, attr.Name);
-
-				object fieldValue = field.GetValue(this);
+				string fieldName;
+
+				if (this is VOIDCore)
+				{
+					fieldName = string.Format("{0}_{1}", this.GetType().Name, attr.Name);
+				}
+				else
+				{
+					fieldName = string.Format(
+						"{0}_{1}_{2}",
+						this.GetType().Name,
+						Enum.GetName(typeof(GameScenes), HighLogic.LoadedScene),
+						attr.Name
+					);
+				}
+
+				object fieldValue;
+
+				if (field is FieldInfo)
+				{
+					fieldValue = (field as FieldInfo).GetValue(this);
+				}
+				else
+				{
+					fieldValue = (field as PropertyInfo).GetValue(this, null);
+				}
 
 				if (fieldValue is IVOID_SaveValue)
 				{

--- a/VOIDCore_Generic.cs
+++ b/VOIDCore_Generic.cs
@@ -1,6 +1,6 @@
 // VOID
 //
-// VOID_Core.cs
+// VOIDCore_Generic.cs
 //
 // Copyright © 2014, toadicus
 // All rights reserved.
@@ -46,10 +46,8 @@
 		protected string VoidName = "VOID";
 		protected string VoidVersion;
 
-		protected bool _factoryReset = false;
-
 		[AVOID_SaveValue("configValue")]
-		protected VOID_SaveValue<int> configVersion = 1;
+		protected VOID_SaveValue<int> _configVersion = VOIDCore.CONFIG_VERSION;
 
 		protected List<IVOID_Module> _modules = new List<IVOID_Module>();
 		protected bool _modulesLoaded = false;
@@ -129,26 +127,25 @@
 
 		public override bool configDirty { get; set; }
 
-		[AVOID_SaveValue("UseBlizzyToolbar")]
-		protected VOID_SaveValue<bool> _UseToolbarManager;
 		internal IButton ToolbarButton;
 
 		internal ApplicationLauncherButton AppLauncherButton;
 
-		/*
-		 * Events
-		 * */
-
-		// event VOIDEventHandler onApplicationQuit;
 		/*
 		 * Properties
 		 * */
+		public override int configVersion
+		{
+			get
+			{
+				return this._configVersion;
+			}
+		}
+
 		public bool factoryReset
 		{
-			get
-			{
-				return this._factoryReset;
-			}
+			get;
+			protected set;
 		}
 
 		public override List<IVOID_Module> Modules
@@ -234,6 +231,7 @@
 			protected set;
 		}
 
+
 		public override double updatePeriod
 		{
 			get
@@ -290,11 +288,11 @@
 		{
 			get
 			{
-				return _UseToolbarManager & ToolbarManager.ToolbarAvailable;
+				return useToolbarManager & ToolbarManager.ToolbarAvailable;
 			}
 			set
 			{
-				if (this._UseToolbarManager == value)
+				if (useToolbarManager == value)
 				{
 					return;
 				}
@@ -315,7 +313,7 @@
 					this.InitializeToolbarButton();
 				}
 
-				_UseToolbarManager.value = value;
+				useToolbarManager = value;
 			}
 		}
 
@@ -571,6 +569,8 @@
 					((IVOID_BehaviorModule)module).OnDestroy();
 				}
 			}
+
+			this.Dispose();
 		}
 
 		public void ResetGUI()
@@ -713,7 +713,7 @@
 				mod.DrawConfigurables();
 			}
 
-			this._factoryReset = GUILayout.Toggle(this._factoryReset, "Factory Reset");
+			this.factoryReset = GUILayout.Toggle(this.factoryReset, "Factory Reset");
 		}
 
 		protected void UpdateSimManager()
@@ -982,7 +982,7 @@
 			this.ToolbarButton.Text = this.VoidName;
 			this.SetIconTexture(this.powerState | this.activeState);
 
-			this.ToolbarButton.Visibility = new GameScenesVisibility(GameScenes.EDITOR, GameScenes.FLIGHT);
+			this.ToolbarButton.Visible = true;
 
 			this.ToolbarButton.OnClick += 
 				(e) =>
@@ -1090,7 +1090,13 @@
 
 		public override void SaveConfig()
 		{
+			if (this.configNeedsUpdate && this is VOIDCore_Flight)
+			{
+				KSP.IO.File.Delete<T>("config.xml");
+			}
+
 			var config = KSP.IO.PluginConfiguration.CreateForType<T>();
+
 			config.load();
 
 			this._SaveToConfig(config);
@@ -1120,10 +1126,10 @@
 			this._skinName = this.defaultSkin;
 			this._skinIdx = int.MinValue;
 
-			this.VOIDIconOnInactivePath = "VOID/Textures/void_icon_light_glow";
-			this.VOIDIconOnActivePath = "VOID/Textures/void_icon_dark_glow";
-			this.VOIDIconOffInactivePath = "VOID/Textures/void_icon_light";
-			this.VOIDIconOffActivePath = "VOID/Textures/void_icon_dark";
+			this.VOIDIconOnActivePath = "VOID/Textures/void_icon_light_glow";
+			this.VOIDIconOnInactivePath = "VOID/Textures/void_icon_dark_glow";
+			this.VOIDIconOffActivePath = "VOID/Textures/void_icon_light";
+			this.VOIDIconOffInactivePath = "VOID/Textures/void_icon_dark";
 
 			this.saveTimer = 0f;
 			this.updateTimer = 0f;
@@ -1134,7 +1140,11 @@
 
 			this.LoadConfig();
 
+			this._configVersion = VOIDCore.CONFIG_VERSION;
+			
 			this.SetIconTexture(this.powerState | this.activeState);
+
+			this.factoryReset = false;
 		}
 
 		public virtual void Dispose()