VOID_DataValue: Changed VOID_NumValue<T> to make proper use of generic type constraints. Moved refresh timing responsibility to VOID_DataValue<T>.
VOID_DataValue: Changed VOID_NumValue<T> to make proper use of generic type constraints. Moved refresh timing responsibility to VOID_DataValue<T>.

--- a/VOID_HUD.cs
+++ b/VOID_HUD.cs
@@ -24,7 +24,6 @@
 using UnityEngine;
 using System;
 using System.Collections.Generic;
-using System.Text;
 
 namespace VOID
 {
@@ -86,59 +85,36 @@
 
 		public override void DrawGUI()
 		{
-			StringBuilder leftHUD;
-			StringBuilder rightHUD;
-
 			GUI.skin = VOID_Core.Instance.Skin;
 
 			if (VOID_Core.Instance.powerAvailable)
 			{
-				leftHUD = new StringBuilder();
-				rightHUD = new StringBuilder();
-
 				VOID_Core.Instance.LabelStyles["hud"].normal.textColor = textColors [ColorIndex];
-
-				leftHUD.AppendFormat("Obt Alt: {0} Obt Vel: {1}",
-					VOID_Data.orbitAltitude.ToSIString(),
-					VOID_Data.orbitVelocity.ToSIString()
-				);
-				leftHUD.AppendFormat("\nAp: {0} ETA {1}",
-					VOID_Data.orbitApoAlt.ToSIString(),
-					VOID_Data.timeToApo.ValueUnitString()
-				);
-				leftHUD.AppendFormat("\nPe: {0} ETA {1}",
-					VOID_Data.oribtPeriAlt.ToSIString(),
-					VOID_Data.timeToPeri.ValueUnitString()
-				);
-				leftHUD.AppendFormat("\nInc: {0}", VOID_Data.orbitInclination.ValueUnitString("F3"));
-				leftHUD.AppendFormat("\nPrimary: {0}", VOID_Data.primaryName.ValueUnitString());
-
-				rightHUD.AppendFormat("Srf Alt: {0} Srf Vel: {1}",
-					VOID_Data.trueAltitude.ToSIString(),
-					VOID_Data.surfVelocity.ToSIString()
-				);
-				rightHUD.AppendFormat("\nVer: {0} Hor: {1}",
-					VOID_Data.vertVelocity.ToSIString(),
-					VOID_Data.horzVelocity.ToSIString()
-				);
-				rightHUD.AppendFormat("\nLat: {0} Lon: {1}",
-					VOID_Data.surfLatitude.ValueUnitString(),
-					VOID_Data.surfLongitude.ValueUnitString()
-				);
-				rightHUD.AppendFormat("\nHdg: {0}", VOID_Data.vesselHeading.ValueUnitString());
-				rightHUD.AppendFormat("\nBiome: {0} Sit: {1}",
-					VOID_Data.currBiome.ValueUnitString(),
-					VOID_Data.expSituation.ValueUnitString()
-				);
 
 				GUI.Label (
 					new Rect ((Screen.width * .2083f), 0, 300f, 70f),
-					leftHUD.ToString(),
+					"Obt Alt: " + Tools.MuMech_ToSI (vessel.orbit.altitude) + "m" +
+					" Obt Vel: " + Tools.MuMech_ToSI (vessel.orbit.vel.magnitude) + "m/s" +
+					"\nAp: " + Tools.MuMech_ToSI (vessel.orbit.ApA) + "m" +
+					" ETA " + Tools.ConvertInterval (vessel.orbit.timeToAp) +
+					"\nPe: " + Tools.MuMech_ToSI (vessel.orbit.PeA) + "m" +
+					" ETA " + Tools.ConvertInterval (vessel.orbit.timeToPe) +
+					"\nInc: " + vessel.orbit.inclination.ToString ("F3") + "°" +
+					"\nPrimary: " + vessel.mainBody.bodyName,
 					VOID_Core.Instance.LabelStyles["hud"]);
-
+				// Toadicus edit: Added "Biome: " line to surf/atmo HUD
 				GUI.Label (
 					new Rect ((Screen.width * .625f), 0, 300f, 90f),
-					rightHUD.ToString(),
+					"Srf Alt: " + Tools.MuMech_ToSI (Tools.TrueAltitude (vessel)) + "m" +
+					" Srf Vel: " + Tools.MuMech_ToSI (vessel.srf_velocity.magnitude) + "m/s" +
+					"\nVer: " + Tools.MuMech_ToSI (vessel.verticalSpeed) + "m/s" +
+					" Hor: " + Tools.MuMech_ToSI (vessel.horizontalSrfSpeed) + "m/s" +
+					"\nLat: " + Tools.GetLatitudeString (vessel, "F3") +
+					" Lon: " + Tools.GetLongitudeString (vessel, "F3") +
+					"\nHdg: " + Tools.MuMech_get_heading (vessel).ToString ("F2") + "° " +
+					Tools.get_heading_text (Tools.MuMech_get_heading (vessel)) +
+					"\nBiome: " + Tools.Toadicus_GetAtt (vessel).name +
+					" Sit: " + vessel.GetExperimentSituation().HumanString(),
 					VOID_Core.Instance.LabelStyles["hud"]);
 			}
 			else
@@ -157,13 +133,5 @@
 			}
 		}
 	}
-
-	public static partial class VOID_Data
-	{
-		public static VOID_StrValue expSituation = new VOID_StrValue(
-			"Situation",
-			new Func<string> (() => VOID_Core.Instance.vessel.GetExperimentSituation().HumanString())
-		);
-	}
 }
 

--- a/VOID_Module.cs
+++ b/VOID_Module.cs
@@ -199,39 +199,39 @@
 
 		public virtual void ModuleWindow(int _)
 		{
-//			if (VOID_Core.Instance.updateTimer - this.lastUpdate > VOID_Core.Instance.updatePeriod) {
-//				foreach (var fieldinfo in this.GetType().GetFields(
-//					BindingFlags.Instance |
-//					BindingFlags.NonPublic |
-//					BindingFlags.Public |
-//					BindingFlags.FlattenHierarchy
-//				))
-//				{
-//					object field = null;
-//
-//					try
-//					{
-//						field = fieldinfo.GetValue (this);
-//					}
-//					catch (NullReferenceException) {
-//						Tools.PostDebugMessage(string.Format(
-//							"{0}: caught NullReferenceException, could not get value for field {1}.",
-//							this.GetType().Name,
-//							fieldinfo.Name
-//						));
-//					}
-//
-//					if (field == null) {
-//						continue;
-//					}
-//
-//					if (typeof(IVOID_DataValue).IsAssignableFrom (field.GetType ())) {
-//						(field as IVOID_DataValue).Refresh ();
-//					}
-//				}
-//
-//				this.lastUpdate = VOID_Core.Instance.updateTimer;
-//			}
+			if (VOID_Core.Instance.updateTimer - this.lastUpdate > VOID_Core.Instance.updatePeriod) {
+				foreach (var fieldinfo in this.GetType().GetFields(
+					BindingFlags.Instance |
+					BindingFlags.NonPublic |
+					BindingFlags.Public |
+					BindingFlags.FlattenHierarchy
+				))
+				{
+					object field = null;
+
+					try
+					{
+						field = fieldinfo.GetValue (this);
+					}
+					catch (NullReferenceException) {
+						Tools.PostDebugMessage(string.Format(
+							"{0}: caught NullReferenceException, could not get value for field {1}.",
+							this.GetType().Name,
+							fieldinfo.Name
+						));
+					}
+
+					if (field == null) {
+						continue;
+					}
+
+					if (typeof(IVOID_DataValue).IsAssignableFrom (field.GetType ())) {
+						(field as IVOID_DataValue).Refresh ();
+					}
+				}
+
+				this.lastUpdate = VOID_Core.Instance.updateTimer;
+			}
 		}
 
 		public override void DrawGUI()

--- a/VOID_Orbital.cs
+++ b/VOID_Orbital.cs
@@ -33,201 +33,197 @@
 		protected long _precisionValues = 230584300921369395;
 		protected IntCollection precisionValues;
 
-		public VOID_Orbital()
-		{
-			this._Name = "Orbital Information";
-
-			this.WindowPos.x = Screen.width - 520f;
-			this.WindowPos.y = 250f;
-		}
-
-		public override void ModuleWindow(int _)
-		{
-			base.ModuleWindow (_);
-
-			int idx = 0;
-
-            GUILayout.BeginVertical();
-
-			VOID_Data.primaryName.DoGUIHorizontal ();
-
-			this.precisionValues [idx]= (ushort)VOID_Data.orbitAltitude.DoGUIHorizontal (this.precisionValues [idx]);
-			idx++;
-
-			this.precisionValues [idx]= (ushort)VOID_Data.orbitVelocity.DoGUIHorizontal (this.precisionValues [idx]);
-			idx++;
-
-			this.precisionValues [idx]= (ushort)VOID_Data.orbitApoAlt.DoGUIHorizontal (this.precisionValues [idx]);
-			idx++;
-
-			VOID_Data.timeToApo.DoGUIHorizontal();
-
-			this.precisionValues [idx]= (ushort)VOID_Data.oribtPeriAlt.DoGUIHorizontal (this.precisionValues [idx]);
-			idx++;
-
-			VOID_Data.timeToPeri.DoGUIHorizontal();
-
-			VOID_Data.orbitInclination.DoGUIHorizontal("F3");
-
-			this.precisionValues [idx]= (ushort)VOID_Data.gravityAccel.DoGUIHorizontal (this.precisionValues [idx]);
-			idx++;
-
-			this.toggleExtended.value = GUILayout.Toggle(this.toggleExtended, "Extended info");
-
-			if (this.toggleExtended)
-            {
-				VOID_Data.orbitPeriod.DoGUIHorizontal();
-
-				this.precisionValues [idx]= (ushort)VOID_Data.semiMajorAxis.DoGUIHorizontal (this.precisionValues [idx]);
-				idx++;
-
-				VOID_Data.eccentricity.DoGUIHorizontal("F4");
-
-				VOID_Data.meanAnomaly.DoGUIHorizontal("F3");
-
-				VOID_Data.trueAnomaly.DoGUIHorizontal("F3");
-
-				VOID_Data.eccAnomaly.DoGUIHorizontal("F3");
-
-				VOID_Data.longitudeAscNode.DoGUIHorizontal("F3");
-
-				VOID_Data.argumentPeriapsis.DoGUIHorizontal("F3");
-
-				VOID_Data.localSiderealLongitude.DoGUIHorizontal("F3");
-            }
-
-            GUILayout.EndVertical();
-            GUI.DragWindow();
-		}
-
-		public override void LoadConfig ()
-		{
-			base.LoadConfig ();
-
-			this.precisionValues = new IntCollection (4, this._precisionValues);
-		}
-
-		public override void _SaveToConfig (KSP.IO.PluginConfiguration config)
-		{
-			this._precisionValues = this.precisionValues.collection;
-
-			base._SaveToConfig (config);
-		}
-	}
-
-
-	public static partial class VOID_Data
-	{
-		public static VOID_StrValue primaryName = new VOID_StrValue (
+		protected VOID_StrValue primaryName = new VOID_StrValue (
 			VOIDLabels.void_primary,
 			new Func<string> (() => VOID_Core.Instance.vessel.mainBody.name)
 		);
 
-		public static VOID_DoubleValue orbitAltitude = new VOID_DoubleValue (
+		protected VOID_DoubleValue orbitAltitude = new VOID_DoubleValue (
 			"Altitude (ASL)",
 			new Func<double> (() => VOID_Core.Instance.vessel.orbit.altitude),
 			"m"
 		);
 
-		public static VOID_DoubleValue orbitVelocity = new VOID_DoubleValue (
+		protected VOID_DoubleValue orbitVelocity = new VOID_DoubleValue (
 			VOIDLabels.void_velocity,
 			new Func<double> (() => VOID_Core.Instance.vessel.orbit.vel.magnitude),
 			"m/s"
 		);
 
-		public static VOID_DoubleValue orbitApoAlt = new VOID_DoubleValue(
+		protected VOID_DoubleValue orbitApoAlt = new VOID_DoubleValue(
 			VOIDLabels.void_apoapsis,
 			new Func<double>(() => VOID_Core.Instance.vessel.orbit.ApA),
 			"m"
 		);
 
-		public static VOID_DoubleValue oribtPeriAlt = new VOID_DoubleValue(
+		protected VOID_DoubleValue oribtPeriAlt = new VOID_DoubleValue(
 			VOIDLabels.void_periapsis,
 			new Func<double>(() => VOID_Core.Instance.vessel.orbit.PeA),
 			"m"
 		);
 
-		public static VOID_StrValue timeToApo = new VOID_StrValue(
-			"Time to Apoapsis",
+		protected VOID_StrValue timeToApo = new VOID_StrValue(
+		"Time to Apoapsis",
 			new Func<string>(() => Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.timeToAp))
 		);
 
-		public static VOID_StrValue timeToPeri = new VOID_StrValue(
+		protected VOID_StrValue timeToPeri = new VOID_StrValue(
 			"Time to Periapsis",
 			new Func<string>(() => Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.timeToPe))
 		);
 
-		public static VOID_DoubleValue orbitInclination = new VOID_DoubleValue(
+		protected VOID_DoubleValue orbitInclination = new VOID_DoubleValue(
 			"Inclination",
 			new Func<double>(() => VOID_Core.Instance.vessel.orbit.inclination),
 			"°"
 		);
 
-		public static VOID_DoubleValue gravityAccel = new VOID_DoubleValue(
+		protected VOID_DoubleValue gravityAccel = new VOID_DoubleValue(
 			"Gravity",
 			delegate()
-		{
-			double orbitRadius = VOID_Core.Instance.vessel.mainBody.Radius +
+			{
+				double orbitRadius = VOID_Core.Instance.vessel.mainBody.Radius +
 				VOID_Core.Instance.vessel.mainBody.GetAltitude(VOID_Core.Instance.vessel.findWorldCenterOfMass());
-			return (VOID_Core.Constant_G * VOID_Core.Instance.vessel.mainBody.Mass) /
+				return (VOID_Core.Constant_G * VOID_Core.Instance.vessel.mainBody.Mass) /
 				Math.Pow(orbitRadius, 2);
-		},
+			},
 			"m/s²"
 		);
 
-		public static VOID_StrValue orbitPeriod = new VOID_StrValue(
+		protected VOID_StrValue orbitPeriod = new VOID_StrValue(
 			"Period",
-			new Func<string>(() => Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.period))
-		);
-
-		public static VOID_DoubleValue semiMajorAxis = new VOID_DoubleValue(
+			 new Func<string>(() => Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.period))
+		);
+
+		protected VOID_DoubleValue semiMajorAxis = new VOID_DoubleValue(
 			"Semi-Major Axis",
 			new Func<double>(() => VOID_Core.Instance.vessel.orbit.semiMajorAxis),
 			"m"
 		);
 
-		public static VOID_DoubleValue eccentricity = new VOID_DoubleValue(
+		protected VOID_DoubleValue eccentricity = new VOID_DoubleValue(
 			"Eccentricity",
 			new Func<double>(() => VOID_Core.Instance.vessel.orbit.eccentricity),
 			""
 		);
 
-		public static VOID_DoubleValue meanAnomaly = new VOID_DoubleValue(
+		protected VOID_DoubleValue meanAnomaly = new VOID_DoubleValue(
 			"Mean Anomaly",
 			new Func<double>(() => VOID_Core.Instance.vessel.orbit.meanAnomaly * 180d / Math.PI),
 			"°"
 		);
 
-		public static VOID_DoubleValue trueAnomaly = new VOID_DoubleValue(
+		protected VOID_DoubleValue trueAnomaly = new VOID_DoubleValue(
 			"True Anomaly",
 			new Func<double>(() => VOID_Core.Instance.vessel.orbit.trueAnomaly),
 			"°"
 		);
 
-		public static VOID_DoubleValue eccAnomaly = new VOID_DoubleValue(
-			"Eccentric Anomaly",
+		protected VOID_DoubleValue eccAnomaly = new VOID_DoubleValue(
+		"Eccentric Anomaly",
 			new Func<double>(() => VOID_Core.Instance.vessel.orbit.eccentricAnomaly * 180d / Math.PI),
 			"°"
 		);
 
-		public static VOID_DoubleValue longitudeAscNode = new VOID_DoubleValue(
+		protected VOID_DoubleValue longitudeAscNode = new VOID_DoubleValue(
 			"Long. Ascending Node",
 			new Func<double>(() => VOID_Core.Instance.vessel.orbit.LAN),
 			"°"
 		);
 
-		public static VOID_DoubleValue argumentPeriapsis = new VOID_DoubleValue(
+		protected VOID_DoubleValue argumentPeriapsis = new VOID_DoubleValue(
 			"Argument of Periapsis",
 			new Func<double>(() => VOID_Core.Instance.vessel.orbit.argumentOfPeriapsis),
 			"°"
-		);
-
-		public static VOID_DoubleValue localSiderealLongitude = new VOID_DoubleValue(
+	    );
+
+		protected VOID_DoubleValue localSiderealLongitude = new VOID_DoubleValue(
 			"Local Sidereal Longitude",
 			new Func<double>(() => Tools.FixDegreeDomain(
 				VOID_Core.Instance.vessel.longitude + VOID_Core.Instance.vessel.orbit.referenceBody.rotationAngle)),
 			"°"
 		);
+
+		public VOID_Orbital()
+		{
+			this._Name = "Orbital Information";
+
+			this.WindowPos.x = Screen.width - 520f;
+			this.WindowPos.y = 250f;
+		}
+
+		public override void ModuleWindow(int _)
+		{
+			base.ModuleWindow (_);
+
+			int idx = 0;
+
+            GUILayout.BeginVertical();
+
+			this.primaryName.DoGUIHorizontal ();
+
+			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]= (ushort)this.oribtPeriAlt.DoGUIHorizontal (this.precisionValues [idx]);
+			idx++;
+
+			this.timeToPeri.DoGUIHorizontal();
+
+			this.orbitInclination.DoGUIHorizontal("F3");
+
+			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]= (ushort)this.semiMajorAxis.DoGUIHorizontal (this.precisionValues [idx]);
+				idx++;
+
+				this.eccentricity.DoGUIHorizontal("F4");
+
+				this.meanAnomaly.DoGUIHorizontal("F3");
+
+				this.trueAnomaly.DoGUIHorizontal("F3");
+
+				this.eccAnomaly.DoGUIHorizontal("F3");
+
+				this.longitudeAscNode.DoGUIHorizontal("F3");
+
+				this.argumentPeriapsis.DoGUIHorizontal("F3");
+
+				this.localSiderealLongitude.DoGUIHorizontal("F3");
+            }
+
+            GUILayout.EndVertical();
+            GUI.DragWindow();
+		}
+
+		public override void LoadConfig ()
+		{
+			base.LoadConfig ();
+
+			this.precisionValues = new IntCollection (4, this._precisionValues);
+		}
+
+		public override void _SaveToConfig (KSP.IO.PluginConfiguration config)
+		{
+			this._precisionValues = this.precisionValues.collection;
+
+			base._SaveToConfig (config);
+		}
 	}
 }
 

--- a/VOID_SurfAtmo.cs
+++ b/VOID_SurfAtmo.cs
@@ -30,6 +30,98 @@
 		protected long _precisionValues = 230584300921369395;
 		protected IntCollection precisionValues;
 
+		protected VOID_DoubleValue trueAltitude = new VOID_DoubleValue(
+			"Altitude (true)",
+			delegate()
+			{
+				double alt_true = VOID_Core.Instance.vessel.orbit.altitude - VOID_Core.Instance.vessel.terrainAltitude;
+				// HACK: This assumes that on worlds with oceans, all water is fixed at 0 m,
+				// and water covers the whole surface at 0 m.
+				if (VOID_Core.Instance.vessel.terrainAltitude < 0 && VOID_Core.Instance.vessel.mainBody.ocean )
+					alt_true = VOID_Core.Instance.vessel.orbit.altitude;
+				return alt_true;
+			},
+			"m"
+		);
+
+		protected VOID_StrValue surfLatitude = new VOID_StrValue(
+			"Latitude",
+			new Func<string> (() => Tools.GetLatitudeString(VOID_Core.Instance.vessel))
+		);
+
+		protected VOID_StrValue surfLongitude = new VOID_StrValue(
+			"Longitude",
+			new Func<string> (() => Tools.GetLongitudeString(VOID_Core.Instance.vessel))
+		);
+
+		protected VOID_StrValue vesselHeading = new VOID_StrValue(
+			"Heading",
+			delegate()
+			{
+				double heading = Tools.MuMech_get_heading(VOID_Core.Instance.vessel);
+				string cardinal = Tools.get_heading_text(heading);
+
+				return string.Format(
+					"{0}° {1}",
+					heading.ToString("F2"),
+					cardinal
+				);
+			}
+		);
+
+		protected VOID_DoubleValue terrainElevation = new VOID_DoubleValue(
+			"Terrain elevation",
+			new Func<double> (() => VOID_Core.Instance.vessel.terrainAltitude),
+			"m"
+		);
+
+		protected VOID_DoubleValue surfVelocity = new VOID_DoubleValue(
+			"Surface velocity",
+			new Func<double> (() => VOID_Core.Instance.vessel.srf_velocity.magnitude),
+			"m/s"
+		);
+
+		protected VOID_DoubleValue vertVelocity = new VOID_DoubleValue(
+			"Vertical speed",
+			new Func<double> (() => VOID_Core.Instance.vessel.verticalSpeed),
+			"m/s"
+		);
+
+		protected VOID_DoubleValue horzVelocity = new VOID_DoubleValue(
+			"Horizontal speed",
+			new Func<double> (() => VOID_Core.Instance.vessel.horizontalSrfSpeed),
+			"m/s"
+		);
+
+		protected VOID_FloatValue temperature = new VOID_FloatValue(
+			"Temperature",
+			new Func<float> (() => VOID_Core.Instance.vessel.flightIntegrator.getExternalTemperature()),
+			"°C"
+		);
+
+		protected VOID_DoubleValue atmDensity = new VOID_DoubleValue (
+			"Atmosphere Density",
+			new Func<double> (() => VOID_Core.Instance.vessel.atmDensity * 1000f),
+			"g/m³"
+		);
+
+		protected VOID_DoubleValue atmPressure = new VOID_DoubleValue (
+			"Pressure",
+			new Func<double> (() => VOID_Core.Instance.vessel.staticPressure),
+			"atm"
+		);
+
+		protected VOID_FloatValue atmLimit = new VOID_FloatValue(
+			"Atmosphere Limit",
+			new Func<float> (() => VOID_Core.Instance.vessel.mainBody.maxAtmosphereAltitude),
+			"m"
+		);
+
+		protected VOID_StrValue currBiome = new VOID_StrValue(
+			"Biome",
+			new Func<string> (() => Tools.Toadicus_GetAtt(VOID_Core.Instance.vessel).name)
+		);
+
 		public VOID_SurfAtmo()
 		{
 			this._Name = "Surface & Atmospheric Information";
@@ -46,38 +138,38 @@
 
 			GUILayout.BeginVertical();
 
-			this.precisionValues [idx]= (ushort)VOID_Data.trueAltitude.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.trueAltitude.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
-			VOID_Data.surfLatitude.DoGUIHorizontal ();
+			this.surfLatitude.DoGUIHorizontal ();
 
-			VOID_Data.surfLongitude.DoGUIHorizontal ();
+			this.surfLongitude.DoGUIHorizontal ();
 
-			VOID_Data.vesselHeading.DoGUIHorizontal ();
+			this.vesselHeading.DoGUIHorizontal ();
 
-			this.precisionValues [idx]= (ushort)VOID_Data.terrainElevation.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.terrainElevation.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
-			this.precisionValues [idx]= (ushort)VOID_Data.surfVelocity.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.surfVelocity.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
-			this.precisionValues [idx]= (ushort)VOID_Data.vertVelocity.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.vertVelocity.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
-			this.precisionValues [idx]= (ushort)VOID_Data.horzVelocity.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.horzVelocity.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
-			VOID_Data.temperature.DoGUIHorizontal ("F2");
+			this.temperature.DoGUIHorizontal ("F2");
 
-			VOID_Data.atmDensity.DoGUIHorizontal (3);
+			this.atmDensity.DoGUIHorizontal (3);
 
-			VOID_Data.atmPressure.DoGUIHorizontal ("F2");
+			this.atmPressure.DoGUIHorizontal ("F2");
 
-			this.precisionValues [idx]= (ushort)VOID_Data.atmLimit.DoGUIHorizontal (this.precisionValues [idx]);
+			this.precisionValues [idx]= (ushort)this.atmLimit.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
 			// Toadicus edit: added Biome
-			VOID_Data.currBiome.DoGUIHorizontal ();
+			this.currBiome.DoGUIHorizontal ();
 
 			GUILayout.EndVertical();
 			GUI.DragWindow();
@@ -97,100 +189,4 @@
 			base._SaveToConfig (config);
 		}
 	}
-
-	public static partial class VOID_Data
-	{
-		public static VOID_DoubleValue trueAltitude = new VOID_DoubleValue(
-			"Altitude (true)",
-			delegate()
-			{
-				double alt_true = VOID_Core.Instance.vessel.orbit.altitude - VOID_Core.Instance.vessel.terrainAltitude;
-				// HACK: This assumes that on worlds with oceans, all water is fixed at 0 m,
-				// and water covers the whole surface at 0 m.
-				if (VOID_Core.Instance.vessel.terrainAltitude < 0 && VOID_Core.Instance.vessel.mainBody.ocean )
-					alt_true = VOID_Core.Instance.vessel.orbit.altitude;
-				return alt_true;
-			},
-			"m"
-		);
-
-		public static VOID_StrValue surfLatitude = new VOID_StrValue(
-			"Latitude",
-			new Func<string> (() => Tools.GetLatitudeString(VOID_Core.Instance.vessel))
-		);
-
-		public static VOID_StrValue surfLongitude = new VOID_StrValue(
-			"Longitude",
-			new Func<string> (() => Tools.GetLongitudeString(VOID_Core.Instance.vessel))
-		);
-
-		public static VOID_StrValue vesselHeading = new VOID_StrValue(
-			"Heading",
-			delegate()
-		{
-			double heading = Tools.MuMech_get_heading(VOID_Core.Instance.vessel);
-			string cardinal = Tools.get_heading_text(heading);
-
-			return string.Format(
-				"{0}° {1}",
-				heading.ToString("F2"),
-				cardinal
-			);
-		}
-		);
-
-		public static VOID_DoubleValue terrainElevation = new VOID_DoubleValue(
-			"Terrain elevation",
-			new Func<double> (() => VOID_Core.Instance.vessel.terrainAltitude),
-			"m"
-		);
-
-		public static VOID_DoubleValue surfVelocity = new VOID_DoubleValue(
-			"Surface velocity",
-			new Func<double> (() => VOID_Core.Instance.vessel.srf_velocity.magnitude),
-			"m/s"
-		);
-
-		public static VOID_DoubleValue vertVelocity = new VOID_DoubleValue(
-			"Vertical speed",
-			new Func<double> (() => VOID_Core.Instance.vessel.verticalSpeed),
-			"m/s"
-		);
-
-		public static VOID_DoubleValue horzVelocity = new VOID_DoubleValue(
-			"Horizontal speed",
-			new Func<double> (() => VOID_Core.Instance.vessel.horizontalSrfSpeed),
-			"m/s"
-		);
-
-		public static VOID_FloatValue temperature = new VOID_FloatValue(
-			"Temperature",
-			new Func<float> (() => VOID_Core.Instance.vessel.flightIntegrator.getExternalTemperature()),
-			"°C"
-		);
-
-		public static VOID_DoubleValue atmDensity = new VOID_DoubleValue (
-			"Atmosphere Density",
-			new Func<double> (() => VOID_Core.Instance.vessel.atmDensity * 1000f),
-			"g/m³"
-		);
-
-		public static VOID_DoubleValue atmPressure = new VOID_DoubleValue (
-			"Pressure",
-			new Func<double> (() => VOID_Core.Instance.vessel.staticPressure),
-			"atm"
-		);
-
-		public static VOID_FloatValue atmLimit = new VOID_FloatValue(
-			"Atmosphere Limit",
-			new Func<float> (() => VOID_Core.Instance.vessel.mainBody.maxAtmosphereAltitude),
-			"m"
-		);
-
-		public static VOID_StrValue currBiome = new VOID_StrValue(
-			"Biome",
-			new Func<string> (() => Tools.Toadicus_GetAtt(VOID_Core.Instance.vessel).name)
-		);
-
-	}
 }

--- a/VOID_VesselInfo.cs
+++ b/VOID_VesselInfo.cs
@@ -29,105 +29,25 @@
 {
 	public class VOID_VesselInfo : VOID_WindowModule
 	{
-		public VOID_VesselInfo() : base()
-		{
-			this._Name = "Vessel Information";
-
-			this.WindowPos.x = Screen.width - 260;
-			this.WindowPos.y = 450;
-		}
-
-		public override void ModuleWindow(int _)
-		{
-			base.ModuleWindow (_);
-
-			if ((TimeWarp.WarpMode == TimeWarp.Modes.LOW) || (TimeWarp.CurrentRate <= TimeWarp.MaxPhysicsRate))
-			{
-				SimManager.Instance.RequestSimulation();
-			}
-
-			GUILayout.BeginVertical();
-
-			GUILayout.Label(
-				vessel.vesselName,
-				VOID_Core.Instance.LabelStyles["center_bold"],
-				GUILayout.ExpandWidth(true));
-
-			Tools.PostDebugMessage("Starting VesselInfo window.");
-
-			VOID_Data.geeForce.DoGUIHorizontal ("F2");
-
-			Tools.PostDebugMessage("GeeForce done.");
-
-			VOID_Data.partCount.DoGUIHorizontal ();
-
-			Tools.PostDebugMessage("PartCount done.");
-
-			VOID_Data.totalMass.DoGUIHorizontal ("F1");
-
-			Tools.PostDebugMessage("TotalMass done.");
-
-			VOID_Data.resourceMass.DoGUIHorizontal ("F1");
-
-			Tools.PostDebugMessage("ResourceMass done.");
-
-			VOID_Data.stageDeltaV.DoGUIHorizontal (3, false);
-
-			Tools.PostDebugMessage("Stage deltaV done.");
-
-			VOID_Data.totalDeltaV.DoGUIHorizontal (3, false);
-
-			Tools.PostDebugMessage("Total deltaV done.");
-
-			VOID_Data.mainThrottle.DoGUIHorizontal ("F0");
-
-			Tools.PostDebugMessage("MainThrottle done.");
-
-			VOID_Data.currmaxThrust.DoGUIHorizontal ();
-
-			Tools.PostDebugMessage("CurrMaxThrust done.");
-
-			VOID_Data.currmaxThrustWeight.DoGUIHorizontal ();
-
-			Tools.PostDebugMessage("CurrMaxTWR done.");
-
-			VOID_Data.surfaceThrustWeight.DoGUIHorizontal ("F2");
-
-			Tools.PostDebugMessage("surfaceTWR done.");
-
-			VOID_Data.intakeAirStatus.DoGUIHorizontal();
-
-			Tools.PostDebugMessage("intakeAirStatus done.");
-
-			GUILayout.EndVertical();
-
-			Tools.PostDebugMessage("VesselInfo window done.");
-
-			GUI.DragWindow();
-		}
-	}
-
-	public static partial class VOID_Data
-	{
-		public static VOID_DoubleValue geeForce = new VOID_DoubleValue(
+		protected VOID_DoubleValue geeForce = new VOID_DoubleValue(
 			"G-force",
 			new Func<double>(() => VOID_Core.Instance.vessel.geeForce),
 			"gees"
 		);
 
-		public static VOID_IntValue partCount = new VOID_IntValue(
+		protected VOID_IntValue partCount = new VOID_IntValue(
 			"Parts",
 			new Func<int>(() => VOID_Core.Instance.vessel.Parts.Count),
 			""
 		);
 
-		public static VOID_DoubleValue totalMass = new VOID_DoubleValue(
+		protected VOID_DoubleValue totalMass = new VOID_DoubleValue(
 			"Total Mass",
 			new Func<double> (() => SimManager.Instance.TryGetLastMass()),
 			"tons"
 		);
 
-		public static VOID_DoubleValue resourceMass = new VOID_DoubleValue(
+		protected VOID_DoubleValue resourceMass = new VOID_DoubleValue(
 			"Resource Mass",
 			delegate()
 			{
@@ -141,20 +61,20 @@
 			"tons"
 		);
 
-		public static VOID_DoubleValue stageDeltaV = new VOID_DoubleValue(
+		protected VOID_DoubleValue stageDeltaV = new VOID_DoubleValue(
 			"DeltaV (Current Stage)",
 			delegate()
 			{
 				if (SimManager.Instance.Stages == null ||
-					SimManager.Instance.Stages.Length <= Staging.lastStage
-				)
+			    	SimManager.Instance.Stages.Length <= Staging.lastStage
+			    )
 					return double.NaN;
 				return SimManager.Instance.Stages[Staging.lastStage].deltaV;
 			},
 			"m/s"
 		);
 
-		public static VOID_DoubleValue totalDeltaV = new VOID_DoubleValue(
+		protected VOID_DoubleValue totalDeltaV = new VOID_DoubleValue(
 			"DeltaV (Total)",
 			delegate()
 			{
@@ -165,13 +85,13 @@
 			"m/s"
 		);
 
-		public static VOID_FloatValue mainThrottle = new VOID_FloatValue(
+		protected VOID_FloatValue mainThrottle = new VOID_FloatValue(
 			"Throttle",
 			new Func<float>(() => VOID_Core.Instance.vessel.ctrlState.mainThrottle * 100f),
 			"%"
 		);
 
-		public static VOID_StrValue currmaxThrust = new VOID_StrValue(
+		protected VOID_StrValue currmaxThrust = new VOID_StrValue(
 			"Thrust (curr/max)",
 			delegate()
 			{
@@ -189,7 +109,7 @@
 			}
 		);
 
-		public static VOID_StrValue currmaxThrustWeight = new VOID_StrValue(
+		protected VOID_StrValue currmaxThrustWeight = new VOID_StrValue(
 			"T:W (curr/max)",
 			delegate()
 			{
@@ -200,10 +120,10 @@
 				double maxThrust = SimManager.Instance.LastStage.thrust;
 				double mass = SimManager.Instance.TryGetLastMass();
 				double gravity = VOID_Core.Instance.vessel.mainBody.gravParameter /
-					Math.Pow(
-						VOID_Core.Instance.vessel.mainBody.Radius + VOID_Core.Instance.vessel.altitude,
-						2
-					);
+				                 Math.Pow(
+					                 VOID_Core.Instance.vessel.mainBody.Radius + VOID_Core.Instance.vessel.altitude,
+					                 2
+					                );
 				double weight = mass * gravity;
 
 				return string.Format(
@@ -214,7 +134,7 @@
 			}
 		);
 
-		public static VOID_DoubleValue surfaceThrustWeight = new VOID_DoubleValue(
+		protected VOID_DoubleValue surfaceThrustWeight = new VOID_DoubleValue(
 			"Max T:W @ surface",
 			delegate()
 			{
@@ -224,7 +144,7 @@
 				double maxThrust = SimManager.Instance.LastStage.thrust;
 				double mass = SimManager.Instance.TryGetLastMass();
 				double gravity = (VOID_Core.Constant_G * VOID_Core.Instance.vessel.mainBody.Mass) /
-					Math.Pow(VOID_Core.Instance.vessel.mainBody.Radius, 2);
+				                 Math.Pow(VOID_Core.Instance.vessel.mainBody.Radius, 2);
 				double weight = mass * gravity;
 
 				return maxThrust / weight;
@@ -232,7 +152,7 @@
 			""
 		);
 
-		public static VOID_StrValue intakeAirStatus = new VOID_StrValue(
+		protected VOID_StrValue intakeAirStatus = new VOID_StrValue(
 			"Intake Air (Curr / Req)",
 			delegate()
 			{
@@ -276,6 +196,57 @@
 				return string.Format("{0:F3} / {1:F3}", currentAmount, currentRequirement);
 			}
 		);
+
+		public VOID_VesselInfo() : base()
+		{
+			this._Name = "Vessel Information";
+
+			this.WindowPos.x = Screen.width - 260;
+			this.WindowPos.y = 450;
+		}
+
+		public override void ModuleWindow(int _)
+		{
+			base.ModuleWindow (_);
+
+			if ((TimeWarp.WarpMode == TimeWarp.Modes.LOW) || (TimeWarp.CurrentRate <= TimeWarp.MaxPhysicsRate))
+			{
+				SimManager.Instance.RequestSimulation();
+			}
+
+			GUILayout.BeginVertical();
+
+			GUILayout.Label(
+				vessel.vesselName,
+				VOID_Core.Instance.LabelStyles["center_bold"],
+				GUILayout.ExpandWidth(true));
+
+			this.geeForce.DoGUIHorizontal ("F2");
+
+			this.partCount.DoGUIHorizontal ();
+
+			this.totalMass.DoGUIHorizontal ("F1");
+
+			this.resourceMass.DoGUIHorizontal ("F1");
+
+			this.stageDeltaV.DoGUIHorizontal (3, false);
+
+			this.totalDeltaV.DoGUIHorizontal (3, false);
+
+			this.mainThrottle.DoGUIHorizontal ("F0");
+
+			this.currmaxThrust.DoGUIHorizontal ();
+
+			this.currmaxThrustWeight.DoGUIHorizontal ();
+
+			this.surfaceThrustWeight.DoGUIHorizontal ("F2");
+
+			this.intakeAirStatus.DoGUIHorizontal();
+
+			GUILayout.EndVertical();
+			GUI.DragWindow();
+		}
 	}
 }
 
+