VOID_Core:
VOID_Core:
* Added updateTimer and updatePeriod so we can limit the frequency of updates in supporting modules.
* Changed "txt_right" style to "right".
* Configuration window now hides when the main window is hidden.
VOID_Module:
* Added .lastUpdate for tracking update limiting.

--- a/VOID.csproj
+++ b/VOID.csproj
@@ -22,7 +22,7 @@
     <ConsolePause>false</ConsolePause>
     <CustomCommands>
       <CustomCommands>
-        <Command type="AfterBuild" command="xcopy /Y ${ProjectDir}\bin\Debug\*.dll ..\..\..\Games\KSP_win\GameData\VOID\Plugins\" workingdir="${ProjectDir}" externalConsole="True" />
+        <Command type="AfterBuild" command="/usr/bin/cp -fv ${ProjectDir}/bin/Debug/VOID.dll /mnt/games/ssd/KSP_linux/GameData/VOID/Plugins/" />
       </CustomCommands>
     </CustomCommands>
   </PropertyGroup>
@@ -35,7 +35,7 @@
     <DefineConstants>TRACE</DefineConstants>
     <CustomCommands>
       <CustomCommands>
-        <Command type="AfterBuild" command="xcopy /Y ${ProjectDir}\bin\Release\*.dll ..\..\..\Games\KSP_win\GameData\VOID\Plugins\" workingdir="${ProjectDir}" externalConsole="True" />
+        <Command type="AfterBuild" command="/usr/bin/cp -fv ${ProjectDir}/bin/Release/VOID.dll /mnt/games/ssd/KSP_linux/GameData/VOID/Plugins/" />
       </CustomCommands>
     </CustomCommands>
   </PropertyGroup>
@@ -58,18 +58,19 @@
     <Compile Include="VOID_DataLogger.cs" />
     <Compile Include="VOID_EditorCore.cs" />
     <Compile Include="VOID_EditorHUD.cs" />
+    <Compile Include="IntCollection.cs" />
   </ItemGroup>
   <ItemGroup>
     <Reference Include="Assembly-CSharp">
-      <HintPath>..\..\..\Games\KSP_win\KSP_Data\Managed\Assembly-CSharp.dll</HintPath>
+      <HintPath>..\..\..\..\..\mnt\games-ssd\KSP_linux\KSP_Data\Managed\Assembly-CSharp.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="UnityEngine">
-      <HintPath>..\..\..\Games\KSP_win\KSP_Data\Managed\UnityEngine.dll</HintPath>
+      <HintPath>..\..\..\..\..\mnt\games-ssd\KSP_linux\KSP_Data\Managed\UnityEngine.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="System">
-      <HintPath>..\..\..\Games\KSP_win\KSP_Data\Managed\System.dll</HintPath>
+      <HintPath>..\..\..\..\..\mnt\games-ssd\KSP_linux\KSP_Data\Managed\System.dll</HintPath>
       <Private>False</Private>
     </Reference>
   </ItemGroup>

--- a/VOID_Core.cs
+++ b/VOID_Core.cs
@@ -120,6 +120,11 @@
 		[AVOID_SaveValue("resourceRate")]
 		protected VOID_SaveValue<float> resourceRate = 0.2f;
 
+		[AVOID_SaveValue("updatePeriod")]
+		protected VOID_SaveValue<double> _updatePeriod = 1001f/15000f;
+		protected float _updateTimer = 0f;
+		protected string stringFrequency;
+
 		// Celestial Body Housekeeping
 		protected List<CelestialBody> _allBodies = new List<CelestialBody>();
 		protected bool bodiesLoaded = false;
@@ -215,6 +220,22 @@
 			}
 		}
 
+		public float updateTimer
+		{
+			get
+			{
+				return this._updateTimer;
+			}
+		}
+
+		public double updatePeriod
+		{
+			get
+			{
+				return this._updatePeriod;
+			}
+		}
+
 		/*
 		 * Methods
 		 * */
@@ -330,8 +351,8 @@
 				}
 				if (module.guiRunning && !module.toggleActive ||
 				    !this.togglePower ||
-				    !HighLogic.LoadedSceneIsFlight
-				    || this.factoryReset
+				    !HighLogic.LoadedSceneIsFlight ||
+				    this.factoryReset
 				    )
 				{
 					module.StopGUI();
@@ -344,6 +365,7 @@
 			}
 
 			this.CheckAndSave ();
+			this._updateTimer += Time.deltaTime;
 		}
 
 		public void FixedUpdate()
@@ -414,9 +436,9 @@
 			this.LabelStyles["center_bold"].alignment = TextAnchor.UpperCenter;
 			this.LabelStyles["center_bold"].fontStyle = FontStyle.Bold;
 
-			this.LabelStyles["txt_right"] = new GUIStyle(GUI.skin.label);
-			this.LabelStyles["txt_right"].normal.textColor = Color.white;
-			this.LabelStyles["txt_right"].alignment = TextAnchor.UpperRight;
+			this.LabelStyles["right"] = new GUIStyle(GUI.skin.label);
+			this.LabelStyles["right"].normal.textColor = Color.white;
+			this.LabelStyles["right"].alignment = TextAnchor.UpperRight;
 
 			this.GUIStylesLoaded = true;
 		}
@@ -437,12 +459,6 @@
 		protected void CheckAndSave()
 		{
 			this.saveTimer += Time.deltaTime;
-
-			Tools.PostDebugMessage (string.Format (
-				"{0}: Checking if time to save; saveTimer: {1}",
-				this.GetType ().Name,
-				this.saveTimer
-			));
 
 			if (this.saveTimer > 2f)
 			{
@@ -562,6 +578,22 @@
 
 			GUILayout.EndHorizontal();
 
+			GUILayout.BeginHorizontal();
+			GUILayout.Label("Update Rate (Hz):");
+			if (this.stringFrequency == null)
+			{
+				this.stringFrequency = (1f / this.updatePeriod).ToString();
+			}
+			this.stringFrequency = GUILayout.TextField(this.stringFrequency.ToString(), 5, GUILayout.ExpandWidth(true));
+			// GUILayout.FlexibleSpace();
+			if (GUILayout.Button("Apply"))
+			{
+				double updateFreq = 1f / this.updatePeriod;
+				double.TryParse(stringFrequency, out updateFreq);
+				this._updatePeriod = 1 / updateFreq;
+			}
+			GUILayout.EndHorizontal();
+
 			foreach (IVOID_Module mod in this.Modules)
 			{
 				mod.DrawConfigurables ();
@@ -577,6 +609,7 @@
 				return;
 			}
 
+			/*
 			Tools.PostDebugMessage(string.Format(
 				"Event.current.type: {0}" +
 				"\nthis.VOIDIconLocked: {1}" +
@@ -590,6 +623,7 @@
 				this.VOIDIconPos.value.xMax,
 				this.VOIDIconPos.value.yMax
 				));
+				*/
 
 			if (!this.VOIDIconLocked &&
 			    VOIDIconPos.value.Contains(Event.current.mousePosition)
@@ -672,7 +706,7 @@
 				}
 			}
 
-			if (!this.configWindowMinimized)
+			if (!this.configWindowMinimized && !this.mainGuiMinimized)
 			{
 				Rect _configWindowPos = this.configWindowPos;
 

--- a/VOID_Module.cs
+++ b/VOID_Module.cs
@@ -37,6 +37,8 @@
 
 		protected string _Name;
 
+		protected float lastUpdate = 0;
+
 		/*
 		 * Properties
 		 * */
@@ -131,15 +133,22 @@
 				object fieldValue = field.GetValue(this);
 
 				bool convertBack = false;
+				bool isIntCollection = false;
 				if (fieldValue is IVOID_SaveValue)
 				{
+					if (fieldValue is IntCollection) {
+						isIntCollection = true;
+					}
 					fieldValue = (fieldValue as IVOID_SaveValue).AsType;
 					convertBack = true;
 				}
 
 				fieldValue = config.GetValue(fieldName, fieldValue);
 
-				if (convertBack)
+				if (isIntCollection) {
+					fieldValue = new IntCollection (4, (long)fieldValue);
+				}
+				else if (convertBack)
 				{
 					Type type = typeof(VOID_SaveValue<>).MakeGenericType (fieldValue.GetType ());
 					IVOID_SaveValue convertValue = Activator.CreateInstance (type) as IVOID_SaveValue;

--- a/VOID_Orbital.cs
+++ b/VOID_Orbital.cs
@@ -29,6 +29,9 @@
 		[AVOID_SaveValue("toggleExtended")]
 		protected VOID_SaveValue<bool> toggleExtended = false;
 
+		[AVOID_SaveValue("precisionValues")]
+		protected IntCollection precisionValues = new IntCollection(4, 230584300921369395);
+
 		public VOID_Orbital()
 		{
 			this._Name = "Orbital Information";
@@ -42,6 +45,7 @@
 			// Toadicus edit: added local sidereal longitude.
 			double LSL = vessel.longitude + vessel.orbit.referenceBody.rotationAngle;
 			LSL = Tools.FixDegreeDomain (LSL);
+			int idx = 0;
 
             GUILayout.BeginVertical();
 
@@ -52,28 +56,48 @@
 
             GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			GUILayout.Label(VOIDLabels.void_altitude_asl + ":");
-			GUILayout.Label(Tools.MuMech_ToSI(vessel.orbit.altitude) + "m", GUILayout.ExpandWidth(false));
+			GUILayout.Label(Tools.MuMech_ToSI(vessel.orbit.altitude, this.precisionValues [idx]) + "m", GUILayout.ExpandWidth(false));
+			GUILayout.FlexibleSpace ();
+			if (GUILayout.Button ("P")) {
+				this.precisionValues [idx] = (ushort)((this.precisionValues[idx] + 3) % 15);
+			}
             GUILayout.EndHorizontal();
+			idx++;
 
             GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			GUILayout.Label(VOIDLabels.void_velocity + ":");
-			GUILayout.Label(Tools.MuMech_ToSI(vessel.orbit.vel.magnitude) + "m/s", GUILayout.ExpandWidth(false));
+			GUILayout.Label(Tools.MuMech_ToSI(vessel.orbit.vel.magnitude, this.precisionValues [idx]) + "m/s", GUILayout.ExpandWidth(false));
+			GUILayout.FlexibleSpace ();
+			if (GUILayout.Button ("P")) {
+				this.precisionValues [idx] = (ushort)((this.precisionValues[idx] + 3) % 15);
+			}
             GUILayout.EndHorizontal();
+			idx++;
 
             GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			GUILayout.Label(VOIDLabels.void_apoapsis + ":");
-			GUILayout.Label(Tools.MuMech_ToSI(vessel.orbit.ApA) + "m", GUILayout.ExpandWidth(false));
+			GUILayout.Label(Tools.MuMech_ToSI(vessel.orbit.ApA, this.precisionValues [idx]) + "m", GUILayout.ExpandWidth(false));
+			GUILayout.FlexibleSpace ();
+			if (GUILayout.Button ("P")) {
+				this.precisionValues [idx] = (ushort)((this.precisionValues[idx] + 3) % 15);
+			}
             GUILayout.EndHorizontal();
+			idx++;
 
             GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
             GUILayout.Label("Time to Ap:");
-            GUILayout.Label(Tools.ConvertInterval(vessel.orbit.timeToAp), GUILayout.ExpandWidth(false));
+			GUILayout.Label(Tools.ConvertInterval(vessel.orbit.timeToAp), GUILayout.ExpandWidth(false));
             GUILayout.EndHorizontal();
 
             GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			GUILayout.Label(VOIDLabels.void_periapsis + ":");
-			GUILayout.Label(Tools.MuMech_ToSI(vessel.orbit.PeA) + "m", GUILayout.ExpandWidth(false));
+			GUILayout.Label(Tools.MuMech_ToSI(vessel.orbit.PeA, this.precisionValues [idx]) + "m", GUILayout.ExpandWidth(false));
+			GUILayout.FlexibleSpace ();
+			if (GUILayout.Button ("P")) {
+				this.precisionValues [idx] = (ushort)((this.precisionValues[idx] + 3) % 15);
+			}
             GUILayout.EndHorizontal();
+			idx++;
 
             GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
             GUILayout.Label("Time to Pe:");
@@ -89,8 +113,13 @@
             double g_vessel = (VOID_Core.Constant_G * vessel.mainBody.Mass) / Math.Pow(r_vessel, 2);
             GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
             GUILayout.Label("Gravity:");
-			GUILayout.Label(Tools.MuMech_ToSI(g_vessel) + "m/s²", GUILayout.ExpandWidth(false));
+			GUILayout.Label(Tools.MuMech_ToSI(g_vessel, this.precisionValues[idx]) + "m/s²", GUILayout.ExpandWidth(false));
+			GUILayout.FlexibleSpace ();
+			if (GUILayout.Button ("P")) {
+				this.precisionValues [idx] = (ushort)((this.precisionValues[idx] + 3) % 15);
+			}
             GUILayout.EndHorizontal();
+			idx++;
 
 			this.toggleExtended = GUILayout.Toggle(this.toggleExtended, "Extended info");
 
@@ -103,8 +132,13 @@
 
                 GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
                 GUILayout.Label("Semi-major axis:");
-                GUILayout.Label((vessel.orbit.semiMajorAxis / 1000).ToString("##,#") + "km", GUILayout.ExpandWidth(false));
+				GUILayout.Label(Tools.MuMech_ToSI(vessel.orbit.semiMajorAxis, this.precisionValues [idx]) + "m", GUILayout.ExpandWidth(false));
+				GUILayout.FlexibleSpace ();
+				if (GUILayout.Button ("P")) {
+					this.precisionValues [idx] = (ushort)((this.precisionValues[idx] + 3) % 15);
+				}
                 GUILayout.EndHorizontal();
+				idx++;
 
                 GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
                 GUILayout.Label("Eccentricity:");
@@ -119,7 +153,7 @@
 
                 GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
                 GUILayout.Label("True anomaly:");
-                GUILayout.Label(vessel.orbit.trueAnomaly.ToString("F3") + "°", GUILayout.ExpandWidth(false));
+				GUILayout.Label(vessel.orbit.trueAnomaly.ToString("F3") + "°", GUILayout.ExpandWidth(false));
                 GUILayout.EndHorizontal();
 
 				// Toadicus edit: convert eccentric anomaly into degrees.

--- a/VOID_SaveValue.cs
+++ b/VOID_SaveValue.cs
@@ -69,7 +69,7 @@
 
 		public static implicit operator T(VOID_SaveValue<T> v)
 		{
-			return v.value;
+			return (T)v.value;
 		}
 
 		public static implicit operator VOID_SaveValue<T>(T v)
@@ -91,7 +91,7 @@
 			return r;
 		}
 
-		public new string ToString()
+		public override string ToString()
 		{
 			return this.value.ToString();
 		}