VOID_Data: Now working around Squad's broken horizontalSrfSpeed.
VOID_Data: Now working around Squad's broken horizontalSrfSpeed.

--- a/API/IVOID_Module.cs
+++ b/API/IVOID_Module.cs
@@ -46,7 +46,7 @@
 
 		void LoadConfig();
 
-		void Save(KSP.IO.PluginConfiguration config);
+		void Save(KSP.IO.PluginConfiguration config, string sceneKey);
 	}
 
 	public interface IVOID_BehaviorModule : IVOID_Module

--- a/API/VOIDCore.cs
+++ b/API/VOIDCore.cs
@@ -30,7 +30,6 @@
 using KSP;
 using System;
 using System.Collections.Generic;
-using ToadicusTools;
 using UnityEngine;
 
 namespace VOID

--- a/API/VOIDMaster.cs
+++ b/API/VOIDMaster.cs
@@ -43,7 +43,7 @@
 using System;
 using UnityEngine;
 using KerbalEngineer.VesselSimulator;
-using ToadicusTools;
+using ToadicusTools.Extensions;
 
 namespace VOID
 {

--- a/API/VOID_HUDModule.cs
+++ b/API/VOID_HUDModule.cs
@@ -31,7 +31,7 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
-using ToadicusTools;
+using ToadicusTools.GUIUtils;
 using UnityEngine;
 
 namespace VOID
@@ -139,7 +139,7 @@
 				}
 			}
 
-			this.positionsLocked.value = GUITools.Toggle(this.positionsLocked, "Lock HUD Positions");
+			this.positionsLocked.value = Layout.Toggle(this.positionsLocked, "Lock HUD Positions");
 		}
 
 		public override void LoadConfig()

--- a/API/VOID_Module.cs
+++ b/API/VOID_Module.cs
@@ -26,10 +26,13 @@
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// TODO: Remove ToadicusTools. prefixes after refactor is done.
+
 using System;
 using System.Collections.Generic;
 using System.Reflection;
-using ToadicusTools;
+using ToadicusTools.Extensions;
+using ToadicusTools.GUIUtils;
 using UnityEngine;
 
 namespace VOID
@@ -116,7 +119,7 @@
 			{
 				if (this.validModes == null)
 				{
-					Tools.PostDebugMessage(this, "validModes is null when checking inValidGame; fetching attribute.");
+					ToadicusTools.Logging.PostDebugMessage(this, "validModes is null when checking inValidGame; fetching attribute.");
 
 					object[] attributes = this.GetType().GetCustomAttributes(false);
 					object attr;
@@ -130,7 +133,7 @@
 
 							this.validModes = addonAttr.ValidModes;
 
-							Tools.PostDebugMessage("Found VOID_GameModesAttribute; validScenes set.");
+							ToadicusTools.Logging.PostDebugMessage("Found VOID_GameModesAttribute; validScenes set.");
 
 							break;
 						}
@@ -147,7 +150,7 @@
 							Game.Modes.SCIENCE_SANDBOX
 						};
 
-						Tools.PostDebugMessage("No VOID_GameModesAttribute found; validScenes defaulted to flight.");
+						ToadicusTools.Logging.PostDebugMessage("No VOID_GameModesAttribute found; validScenes defaulted to flight.");
 					}
 				}
 
@@ -161,7 +164,7 @@
 			{
 				if (this.validScenes == null)
 				{
-					Tools.PostDebugMessage(this, "validScenes is null when checking inValidScene; fetching attribute.");
+					ToadicusTools.Logging.PostDebugMessage(this, "validScenes is null when checking inValidScene; fetching attribute.");
 					object[] attributes = this.GetType().GetCustomAttributes(false);
 					object attr;
 					for (int idx = 0; idx < attributes.Length; idx++)
@@ -174,7 +177,7 @@
 
 							this.validScenes = addonAttr.ValidScenes;
 
-							Tools.PostDebugMessage("Found VOID_ScenesAttribute; validScenes set.");
+							ToadicusTools.Logging.PostDebugMessage("Found VOID_ScenesAttribute; validScenes set.");
 
 							break;
 						}
@@ -183,7 +186,7 @@
 					if (this.validScenes == null)
 					{
 						this.validScenes = new GameScenes[] { GameScenes.FLIGHT };
-						Tools.PostDebugMessage("No VOID_ScenesAttribute found; validScenes defaulted to flight.");
+						ToadicusTools.Logging.PostDebugMessage("No VOID_ScenesAttribute found; validScenes defaulted to flight.");
 					}
 				}
 
@@ -228,7 +231,7 @@
 				return;
 			}
 
-			Tools.PostDebugMessage (string.Format("Adding {0} to the draw queue.", this.GetType().Name));
+			ToadicusTools.Logging.PostDebugMessage (string.Format("Adding {0} to the draw queue.", this.GetType().Name));
 			RenderingManager.AddToPostDrawQueue (3, this.DrawGUI);
 		}
 
@@ -238,7 +241,7 @@
 			{
 				return;
 			}
-			Tools.PostDebugMessage (string.Format("Removing {0} from the draw queue.", this.GetType().Name));
+			ToadicusTools.Logging.PostDebugMessage (string.Format("Removing {0} from the draw queue.", this.GetType().Name));
 			RenderingManager.RemoveFromPostDrawQueue (3, this.DrawGUI);
 		}
 
@@ -326,7 +329,7 @@
 					);
 				}
 
-				Tools.PostDebugMessage(string.Format("{0}: Loading field {1}.", this.GetType().Name, fieldName));
+				ToadicusTools.Logging.PostDebugMessage(string.Format("{0}: Loading field {1}.", this.GetType().Name, fieldName));
 
 				object fieldValue;
 
@@ -365,7 +368,7 @@
 					(member as PropertyInfo).SetValue(this, fieldValue, null);
 				}
 
-				Tools.PostDebugMessage(string.Format("{0}: Loaded field {1}.", this.GetType().Name, fieldName));
+				ToadicusTools.Logging.PostDebugMessage(string.Format("{0}: Loaded field {1}.", this.GetType().Name, fieldName));
 			}
 		}
 
@@ -430,7 +433,7 @@
 
 				config.SetValue(fieldName, fieldValue);
 
-				Tools.PostDebugMessage(string.Format("{0}: Saved field {1}.", this.GetType().Name, fieldName));
+				ToadicusTools.Logging.PostDebugMessage(string.Format("{0}: Saved field {1}.", this.GetType().Name, fieldName));
 			}
 		}
 	}
@@ -519,11 +522,11 @@
 
 			if (HighLogic.LoadedSceneIsEditor)
 			{
-				_Pos = Tools.ClampRectToEditorPad(_Pos);
+				_Pos = WindowTools.ClampRectToEditorPad(_Pos);
 			}
 			else
 			{
-				_Pos = Tools.ClampRectToScreen(_Pos);
+				_Pos = WindowTools.ClampRectToScreen(_Pos);
 			}
 
 			if (_Pos != this.WindowPos)

--- a/Tools/VOID_DataValue.cs
+++ b/Tools/VOID_DataValue.cs
@@ -26,8 +26,11 @@
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// TODO: Remove ToadicusTools. prefixes after refactor is done.
+
 using System;
-using ToadicusTools;
+using ToadicusTools.MuMechTools;
+using ToadicusTools.Text;
 using UnityEngine;
 
 namespace VOID
@@ -148,7 +151,7 @@
 	public abstract class VOID_NumValue<T> : VOID_DataValue<T>, IFormattable
 		where T : IFormattable, IConvertible, IComparable
 	{
-		public static IFormatProvider formatProvider = Tools.SIFormatter;
+		public static IFormatProvider formatProvider = SIFormatProvider.SIFormatter;
 
 		public static implicit operator Double(VOID_NumValue<T> v)
 		{
@@ -218,7 +221,7 @@
 		{
 			return string.Format (
 				"{0}{1}",
-				Tools.MuMech_ToSI (this, digits, MinMagnitude, MaxMagnitude),
+				MuMechTools.MuMech_ToSI (this, digits, MinMagnitude, MaxMagnitude),
 				this.Units
 			);
 		}
@@ -234,7 +237,7 @@
 
 		public virtual string ValueUnitString(int digits, int MinMagnitude, int MaxMagnitude)
 		{
-			return Tools.MuMech_ToSI(this, digits, MinMagnitude, MaxMagnitude) + this.Units;
+			return MuMechTools.MuMech_ToSI(this, digits, MinMagnitude, MaxMagnitude) + this.Units;
 		}
 
 		public virtual void DoGUIHorizontal(string format)
@@ -282,7 +285,7 @@
 				Rect lastRect = GUILayoutUtility.GetLastRect();
 				if (lastRect.Contains(Event.current.mousePosition))
 				{
-					Tools.PostDebugMessage(string.Format("{0}: Changing digits from {1}",
+					ToadicusTools.Logging.PostDebugMessage(string.Format("{0}: Changing digits from {1}",
 						this.GetType().Name,
 						digits
 					));
@@ -301,7 +304,7 @@
 						digits += 9;
 					}
 
-					Tools.PostDebugMessage(string.Format("{0}: Changed digits to {1}.",
+					ToadicusTools.Logging.PostDebugMessage(string.Format("{0}: Changed digits to {1}.",
 						this.GetType().Name,
 						digits
 					));

--- a/Tools/VOID_SaveValue.cs
+++ b/Tools/VOID_SaveValue.cs
@@ -26,10 +26,11 @@
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// TODO: Remove ToadicusTools. prefixes after refactor is done.
+
 using KSP;
 using System;
 using System.Collections.Generic;
-using ToadicusTools;
 using UnityEngine;
 
 namespace VOID
@@ -65,7 +66,7 @@
 			{
 				if (this.Core != null && !System.Object.Equals(this._value, value))
 				{
-					Tools.PostDebugMessage (string.Format (
+					ToadicusTools.Logging.PostDebugMessage (string.Format (
 						"VOID: Dirtying config for type {0}." +
 						"\n\t Old Value: {2}, New Value: {3}" +
 						"\n\t Object.Equals(New, Old): {4}\n" +

--- a/Tools/VOID_Tools.cs
+++ b/Tools/VOID_Tools.cs
@@ -1022,75 +1022,75 @@
 	{
 		public int Compare(CelestialBody bodyA, CelestialBody bodyB)
 		{
-			Tools.PostDebugMessage(this, "got bodyA: {0} & bodyB: {1}", bodyA, bodyB);
+			Logging.PostDebugMessage(this, "got bodyA: {0} & bodyB: {1}", bodyA, bodyB);
 
 			if (bodyA == null && bodyB == null)
 			{
-				Tools.PostDebugMessage(this, "both bodies are null, returning 0");
+				Logging.PostDebugMessage(this, "both bodies are null, returning 0");
 				return 0;
 			}
 			if (bodyA == null)
 			{
-				Tools.PostDebugMessage(this, "bodyA is null, returning -1");
+				Logging.PostDebugMessage(this, "bodyA is null, returning -1");
 				return -1;
 			}
 			if (bodyB == null)
 			{
-				Tools.PostDebugMessage(this, "bodyB is null, returning 1");
+				Logging.PostDebugMessage(this, "bodyB is null, returning 1");
 				return 1;
 			}
 
-			Tools.PostDebugMessage(this, "bodies are not null, carrying on");
+			Logging.PostDebugMessage(this, "bodies are not null, carrying on");
 
 			if (object.ReferenceEquals(bodyA, bodyB))
 			{
-				Tools.PostDebugMessage(this, "bodies are equal, returning 0");
+				Logging.PostDebugMessage(this, "bodies are equal, returning 0");
 				return 0;
 			}
 
-			Tools.PostDebugMessage(this, "bodies are not equal, carrying on");
+			Logging.PostDebugMessage(this, "bodies are not equal, carrying on");
 
 			if (bodyA.orbitDriver == null)
 			{
-				Tools.PostDebugMessage(this, "bodyA.orbit is null (bodyA is the sun, returning 1");
+				Logging.PostDebugMessage(this, "bodyA.orbit is null (bodyA is the sun, returning 1");
 				return 1;
 			}
 			if (bodyB.orbitDriver == null)
 			{
-				Tools.PostDebugMessage(this, "bodyB.orbit is null (bodyB is the sun, returning -1");
+				Logging.PostDebugMessage(this, "bodyB.orbit is null (bodyB is the sun, returning -1");
 				return -1;
 			}
 
-			Tools.PostDebugMessage(this, "orbits are not null, carrying on");
+			Logging.PostDebugMessage(this, "orbits are not null, carrying on");
 
 			if (bodyA.orbit.referenceBody == bodyB.orbit.referenceBody)
 			{
-				Tools.PostDebugMessage(this, "bodies share a parent, comparing SMAs");
+				Logging.PostDebugMessage(this, "bodies share a parent, comparing SMAs");
 				return -bodyA.orbit.semiMajorAxis.CompareTo(bodyB.orbit.semiMajorAxis);
 			}
 
-			Tools.PostDebugMessage(this, "orbits do not share a parent, carrying on");
+			Logging.PostDebugMessage(this, "orbits do not share a parent, carrying on");
 
 			if (bodyA.hasAncestor(bodyB))
 			{
-				Tools.PostDebugMessage(this, "bodyA is a moon or sub-moon of bodyB, returning -1");
+				Logging.PostDebugMessage(this, "bodyA is a moon or sub-moon of bodyB, returning -1");
 				return -1;
 			}
 			if (bodyB.hasAncestor(bodyA))
 			{
-				Tools.PostDebugMessage(this, "bodyA is a moon or sub-moon of bodyB, returning 1");
+				Logging.PostDebugMessage(this, "bodyA is a moon or sub-moon of bodyB, returning 1");
 				return 1;
 			}
 
-			Tools.PostDebugMessage(this, "bodies do not have an obvious relationship, searching for one");
+			Logging.PostDebugMessage(this, "bodies do not have an obvious relationship, searching for one");
 
 			if (VOID_Tools.NearestRelatedParents(ref bodyA, ref bodyB))
 			{
-				Tools.PostDebugMessage(this, "good relation {0} and {1}, comparing", bodyA.bodyName, bodyB.bodyName);
+				Logging.PostDebugMessage(this, "good relation {0} and {1}, comparing", bodyA.bodyName, bodyB.bodyName);
 				return this.Compare(bodyA, bodyB);
 			}
 
-			Tools.PostDebugMessage(this, "bad relation {0} and {1}, giving up", bodyA.bodyName, bodyB.bodyName);
+			Logging.PostDebugMessage(this, "bad relation {0} and {1}, giving up", bodyA.bodyName, bodyB.bodyName);
 
 			return 0;
 		}

--- a/VOIDCore_Editor.cs
+++ b/VOIDCore_Editor.cs
@@ -30,7 +30,6 @@
 using KSP;
 using System;
 using System.Collections.Generic;
-using ToadicusTools;
 using UnityEngine;
 
 namespace VOID

--- a/VOIDCore_Flight.cs
+++ b/VOIDCore_Flight.cs
@@ -29,7 +29,7 @@
 using KSP;
 using System;
 using UnityEngine;
-using ToadicusTools;
+using ToadicusTools.GUIUtils;
 
 namespace VOID
 {
@@ -49,7 +49,7 @@
 		{
 			if (HighLogic.LoadedSceneIsFlight)
 			{
-				this.consumeResource.value = GUITools.Toggle(this.consumeResource, "Consume Resources");
+				this.consumeResource.value = Layout.Toggle(this.consumeResource, "Consume Resources");
 			}
 
 			base.DrawConfigurables();

--- a/VOIDCore_Generic.cs
+++ b/VOIDCore_Generic.cs
@@ -26,6 +26,8 @@
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// TODO: Remove ToadicusTools. prefixes after refactor is done.
+
 using KerbalEngineer.Editor;
 using KerbalEngineer.Helpers;
 using KerbalEngineer.VesselSimulator;
@@ -33,7 +35,10 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
-using ToadicusTools;
+using ToadicusTools.DebugTools;
+using ToadicusTools.Extensions;
+using ToadicusTools.GUIUtils;
+using ToadicusTools.Wrappers;
 using UnityEngine;
 
 namespace VOID
@@ -346,7 +351,7 @@
 			{
 				this.LoadGUIStyles();
 
-				Tools.PostDebugMessage(
+				ToadicusTools.Logging.PostDebugMessage(
 					this,
 					"ToolbarAvailable: {0}, UseToobarManager: {1}",
 					ToolbarManager.ToolbarAvailable,
@@ -385,7 +390,7 @@
 				)
 			)
 			{
-				Tools.PostDebugMessage(this, "Updating SimManager.");
+				ToadicusTools.Logging.PostDebugMessage(this, "Updating SimManager.");
 				this.UpdateSimManager();
 			}
 
@@ -469,7 +474,7 @@
 				if (this.configDirty)
 				{
 
-					Tools.PostDebugMessage(string.Format(
+					ToadicusTools.Logging.PostDebugMessage(string.Format(
 							"{0}: Time to save, checking if configDirty: {1}",
 							this.GetType().Name,
 							this.configDirty
@@ -607,7 +612,7 @@
 							continue;
 						}
 
-						module.Active = GUITools.Toggle(module.Active, module.Name);
+						module.Active = Layout.Toggle(module.Active, module.Name);
 					}
 				}
 			}
@@ -616,7 +621,7 @@
 				GUILayout.Label("-- POWER LOST --", VOID_Styles.labelRed);
 			}
 
-			VOID_ConfigWindow.Instance.Active = GUITools.Toggle(
+			VOID_ConfigWindow.Instance.Active = Layout.Toggle(
 				VOID_ConfigWindow.Instance.Active,
 				"Configuration"
 			);
@@ -630,20 +635,20 @@
 		{
 			GUIContent _content;
 
-			this.useToolbarManager.value = GUITools.Toggle(this.useToolbarManager, "Use Blizzy's Toolbar If Available");
-
-			this.vesselSimActive.value = GUITools.Toggle(this.vesselSimActive.value,
+			this.useToolbarManager.value = Layout.Toggle(this.useToolbarManager, "Use Blizzy's Toolbar If Available");
+
+			this.vesselSimActive.value = Layout.Toggle(this.vesselSimActive.value,
 				"Enable Engineering Calculations");
 
 			bool useEarthTime = (this.TimeScale & VOID_TimeScale.KERBIN_TIME) == 0u;
 			bool useSiderealTime = (this.TimeScale & VOID_TimeScale.SOLAR_DAY) == 0u;
 			bool useRoundedScale = (this.TimeScale & VOID_TimeScale.ROUNDED_SCALE) != 0u;
 
-			useEarthTime = GUITools.Toggle(useEarthTime, "Use Earth Time (changes KSP option)");
+			useEarthTime = Layout.Toggle(useEarthTime, "Use Earth Time (changes KSP option)");
 
 			GameSettings.KERBIN_TIME = !useEarthTime;
 
-			useSiderealTime = GUITools.Toggle(
+			useSiderealTime = Layout.Toggle(
 				useSiderealTime,
 				string.Format(
 					"Time Scale: {0}",
@@ -651,7 +656,7 @@
 				)
 			);
 
-			useRoundedScale = GUITools.Toggle(
+			useRoundedScale = Layout.Toggle(
 				useRoundedScale,
 				string.Format(
 					"Time Scale: {0}",
@@ -697,7 +702,7 @@
 			if (GUILayout.Button(_content, GUILayout.ExpandWidth(true)))
 			{
 				this.skinIdx--;
-				Tools.PostDebugMessage(string.Format(
+				ToadicusTools.Logging.PostDebugMessage(string.Format(
 					"{0}: new this.skinIdx = {1} :: skin_list.Count = {2}",
 					this.GetType().Name,
 					this.skinName,
@@ -714,7 +719,7 @@
 			if (GUILayout.Button(_content, GUILayout.ExpandWidth(true)))
 			{
 				this.skinIdx++;
-				Tools.PostDebugMessage(string.Format(
+				ToadicusTools.Logging.PostDebugMessage(string.Format(
 					"{0}: new this.skinIdx = {1} :: skin_list.Count = {2}",
 					this.GetType().Name,
 					this.skinName,
@@ -760,7 +765,7 @@
 				module.DrawConfigurables();
 			}
 
-			this.FactoryReset = GUITools.Toggle(this.FactoryReset, "Factory Reset");
+			this.FactoryReset = Layout.Toggle(this.FactoryReset, "Factory Reset");
 		}
 
 		protected void UpdateSimManager()
@@ -781,7 +786,7 @@
 
 			SimManager.TryStartSimulation();
 
-			Tools.PostDebugMessage(this, "Started Engineer simulation with Atmosphere={0} atm and Gravity={1} m/s²",
+			ToadicusTools.Logging.PostDebugMessage(this, "Started Engineer simulation with Atmosphere={0} atm and Gravity={1} m/s²",
 				SimManager.Atmosphere,
 				SimManager.Gravity
 			);
@@ -789,7 +794,7 @@
 
 		protected void GetSimManagerResults()
 		{
-			Tools.PostDebugMessage(this, "VesselSimulator results ready, setting Stages.");
+			ToadicusTools.Logging.PostDebugMessage(this, "VesselSimulator results ready, setting Stages.");
 
 			this.Stages = SimManager.Stages;
 
@@ -801,53 +806,54 @@
 
 		protected void LoadModulesOfType<U>()
 		{
-			Tools.DebugLogger sb = Tools.DebugLogger.New(this);
-			sb.AppendLine("Loading modules...");
-
-			AssemblyLoader.LoadedAssembly assy;
-			for (int aIdx = 0; aIdx < AssemblyLoader.loadedAssemblies.Count; aIdx++)
-			{
-				assy = AssemblyLoader.loadedAssemblies[aIdx];
-
-				Type[] loadedTypes = assy.assembly.GetExportedTypes();
-				Type loadedType;
-				for (int tIdx = 0; tIdx < loadedTypes.Length; tIdx++)
-				{
-					loadedType = loadedTypes[tIdx];
-
-					if (
-						loadedType.IsInterface ||
-						loadedType.IsAbstract ||
-						!typeof(U).IsAssignableFrom(loadedType) ||
-						typeof(VOIDCore).IsAssignableFrom(loadedType)
-					)
+			using (PooledDebugLogger sb = PooledDebugLogger.New(this))
+			{
+				sb.AppendLine("Loading modules...");
+
+				AssemblyLoader.LoadedAssembly assy;
+				for (int aIdx = 0; aIdx < AssemblyLoader.loadedAssemblies.Count; aIdx++)
+				{
+					assy = AssemblyLoader.loadedAssemblies[aIdx];
+
+					Type[] loadedTypes = assy.assembly.GetExportedTypes();
+					Type loadedType;
+					for (int tIdx = 0; tIdx < loadedTypes.Length; tIdx++)
 					{
-						continue;
+						loadedType = loadedTypes[tIdx];
+
+						if (
+							loadedType.IsInterface ||
+							loadedType.IsAbstract ||
+							!typeof(U).IsAssignableFrom(loadedType) ||
+							typeof(VOIDCore).IsAssignableFrom(loadedType))
+						{
+							continue;
+						}
+
+						sb.AppendFormat("Checking IVOID_Module type {0}...", loadedType.Name);
+
+						try
+						{
+							this.LoadModule(loadedType);
+							sb.AppendLine("Success.");
+						}
+						catch (Exception ex)
+						{
+							sb.AppendFormat("Failed, caught {0}\n", ex.GetType().Name);
+
+							#if DEBUG
+						Debug.LogException(ex);
+							#endif
+						}
 					}
-
-					sb.AppendFormat("Checking IVOID_Module type {0}...", loadedType.Name);
-
-					try
-					{
-						this.LoadModule(loadedType);
-						sb.AppendLine("Success.");
-					}
-					catch (Exception ex)
-					{
-						sb.AppendFormat("Failed, caught {0}\n", ex.GetType().Name);
-
-						#if DEBUG
-						Debug.LogException(ex);
-						#endif
-					}
-				}
-			}
-
-			this.modulesLoaded = true;
-
-			sb.AppendFormat("Loaded {0} modules.\n", this.Modules.Count);
-
-			sb.Print();
+				}
+
+				this.modulesLoaded = true;
+
+				sb.AppendFormat("Loaded {0} modules.\n", this.Modules.Count);
+
+				sb.Print();
+			}
 		}
 
 		protected void LoadModule(Type T)
@@ -858,7 +864,7 @@
 			{
 				if (this.modules[mIdx].Name == T.Name)
 				{
-					Tools.PostErrorMessage("{0}: refusing to load {1}: already loaded", this.GetType().Name, T.Name);
+					ToadicusTools.Logging.PostErrorMessage("{0}: refusing to load {1}: already loaded", this.GetType().Name, T.Name);
 					return;
 				}
 			}
@@ -892,7 +898,7 @@
 				module.LoadConfig();
 				this.modules.Add(module);
 
-				Tools.PostDebugMessage(string.Format(
+				ToadicusTools.Logging.PostDebugMessage(string.Format(
 						"{0}: loaded module {1}.",
 						this.GetType().Name,
 						T.Name
@@ -925,7 +931,7 @@
 				}
 			}
 
-			Tools.PostDebugMessage(string.Format(
+			ToadicusTools.Logging.PostDebugMessage(string.Format(
 				"{0}: loaded {1} GUISkins.",
 				this.GetType().Name,
 				this.validSkins.Count
@@ -956,7 +962,7 @@
 				this.skinIdx = defaultIdx;
 			}
 
-			Tools.PostDebugMessage(string.Format(
+			ToadicusTools.Logging.PostDebugMessage(string.Format(
 				"{0}: _skinIdx = {1}.",
 				this.GetType().Name,
 				this.skinName.ToString()
@@ -1018,7 +1024,7 @@
 			// Do nothing if (the Toolbar is not available.
 			if (!ToolbarManager.ToolbarAvailable)
 			{
-				Tools.PostDebugMessage(this, "Refusing to make a ToolbarButton: ToolbarAvailable = false");
+				ToadicusTools.Logging.PostDebugMessage(this, "Refusing to make a ToolbarButton: ToolbarAvailable = false");
 				return;
 			}
 
@@ -1034,7 +1040,7 @@
 				this.ToggleMainWindow();
 			};
 
-			Tools.PostDebugMessage(string.Format("{0}: Toolbar Button initialized.", this.GetType().Name));
+			ToadicusTools.Logging.PostDebugMessage(string.Format("{0}: Toolbar Button initialized.", this.GetType().Name));
 		}
 
 		protected void InitializeAppLauncherButton()
@@ -1047,7 +1053,7 @@
 					this.VOIDIconTexture
 				);
 
-				Tools.PostDebugMessage(
+				ToadicusTools.Logging.PostDebugMessage(
 					this,
 					"AppLauncherButton initialized in {0}",
 					Enum.GetName(

--- a/VOIDMaster_Editor.cs
+++ b/VOIDMaster_Editor.cs
@@ -43,7 +43,7 @@
 using KerbalEngineer.VesselSimulator;
 using KSP;
 using System;
-using ToadicusTools;
+using ToadicusTools.Extensions;
 using UnityEngine;
 
 namespace VOID
@@ -53,10 +53,10 @@
 	{
 		public override void Awake()
 		{
-			Tools.PostDebugMessage ("VOIDEditorMaster: Waking up.");
+			this.LogDebug("VOIDEditorMaster: Waking up.");
 			this.Core = VOIDCore_Editor.Instance;
 			this.Core.ResetGUI ();
-			Tools.PostDebugMessage ("VOIDEditorMaster: Awake.");
+			this.LogDebug("VOIDEditorMaster: Awake.");
 		}
 	}
 }

--- a/VOIDMaster_Flight.cs
+++ b/VOIDMaster_Flight.cs
@@ -43,7 +43,7 @@
 using System;
 using UnityEngine;
 using KerbalEngineer.VesselSimulator;
-using ToadicusTools;
+using ToadicusTools.Extensions;
 
 namespace VOID
 {

--- a/VOIDMaster_SpaceCentre.cs
+++ b/VOIDMaster_SpaceCentre.cs
@@ -43,7 +43,7 @@
 using System;
 using UnityEngine;
 using KerbalEngineer.VesselSimulator;
-using ToadicusTools;
+using ToadicusTools.Extensions;
 
 namespace VOID
 {

--- a/VOID_CBInfoBrowser.cs
+++ b/VOID_CBInfoBrowser.cs
@@ -29,7 +29,7 @@
 using KSP;
 using System;
 using System.Collections.Generic;
-using ToadicusTools;
+using ToadicusTools.Text;
 using UnityEngine;
 
 namespace VOID
@@ -373,8 +373,8 @@
 
 			GUILayout.Label(p.ToString("##,#") + "kg/m³", VOID_Styles.labelRight, GUILayout.ExpandWidth(true));
 
-			if (body.bodyName == "Sun") GUILayout.Label(Tools.MuMech_ToSI(body.sphereOfInfluence), VOID_Styles.labelRight, GUILayout.ExpandWidth(true));
-			else GUILayout.Label(Tools.MuMech_ToSI(body.sphereOfInfluence), VOID_Styles.labelRight, GUILayout.ExpandWidth(true));
+			if (body.bodyName == "Sun") GUILayout.Label(SIFormatProvider.ToSI(body.sphereOfInfluence, 3), VOID_Styles.labelRight, GUILayout.ExpandWidth(true));
+			else GUILayout.Label(SIFormatProvider.ToSI(body.sphereOfInfluence, 3), VOID_Styles.labelRight, GUILayout.ExpandWidth(true));
 
 			GUILayout.Label(body.orbitingBodies.Count.ToString(), VOID_Styles.labelRight, GUILayout.ExpandWidth(true));
 
@@ -393,11 +393,11 @@
 
 			double g_ASL = (VOIDCore.Constant_G * body.Mass) / (body.Radius * body.Radius);
 
-			GUILayout.Label(Tools.MuMech_ToSI(g_ASL) + "m/s²", VOID_Styles.labelRight, GUILayout.ExpandWidth(true));
+			GUILayout.Label(SIFormatProvider.ToSI(g_ASL, 3) + "m/s²", VOID_Styles.labelRight, GUILayout.ExpandWidth(true));
 
 			if (body.atmosphere)
 			{
-				GUILayout.Label("≈ " + Tools.MuMech_ToSI(body.atmosphereDepth) + "m",
+				GUILayout.Label("≈ " + SIFormatProvider.ToSI(body.atmosphereDepth, 3) + "m",
 					VOID_Styles.labelRight,
 					GUILayout.ExpandWidth(true));
 

--- a/VOID_CareerStatus.cs
+++ b/VOID_CareerStatus.cs
@@ -26,10 +26,13 @@
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// TODO: Remove ToadicusTools. prefixes after refactor is done.
+
 using KSP;
 using System;
 using System.Text;
-using ToadicusTools;
+
+using ToadicusTools.Text;
 using UnityEngine;
 
 namespace VOID
@@ -42,11 +45,11 @@
 		{
 			if (delta > 0)
 			{
-				return string.Format("<color='lime'>{0}↑</color>", delta.ToString(numberFormat, Tools.SIFormatter));
+				return string.Format("<color='lime'>{0}↑</color>", delta.ToString(numberFormat, SIFormatProvider.SIFormatter));
 			}
 			else if (delta < 0)
 			{
-				return string.Format("<color='red'>{0}↓</color>", delta.ToString(numberFormat, Tools.SIFormatter));
+				return string.Format("<color='red'>{0}↓</color>", delta.ToString(numberFormat, SIFormatProvider.SIFormatter));
 			}
 			else
 			{
@@ -116,7 +119,7 @@
 		{
 			get
 			{
-				Tools.PostDebugMessage(
+				ToadicusTools.Logging.PostDebugMessage(
 					this,
 					"Checking init state:" +
 					"\n\tcurrentFunds={0}" +
@@ -201,7 +204,7 @@
 
 		private void initCurrencies()
 		{
-			Tools.PostDebugMessage(
+			ToadicusTools.Logging.PostDebugMessage(
 				this,
 				"Initializing currencies." +
 				"\n\tFunding.Instance={0}" +
@@ -236,11 +239,11 @@
 
 			bool texturesLoaded;
 
-			texturesLoaded = IOTools.LoadTexture(out this.fundsIconGreen, "VOID/Textures/fundsgreen.png", 10, 18);
-			texturesLoaded &= IOTools.LoadTexture(out this.fundsIconRed, "VOID/Textures/fundsred.png", 10, 18);
-			texturesLoaded &= IOTools.LoadTexture(out this.reputationIconGreen, "VOID/Textures/repgreen.png", 16, 18);
-			texturesLoaded &= IOTools.LoadTexture(out this.reputationIconRed, "VOID/Textures/repred.png", 16, 18);
-			texturesLoaded &= IOTools.LoadTexture(out this.scienceIcon, "VOID/Textures/science.png", 16, 18);
+			texturesLoaded = ToadicusTools.IOTools.LoadTexture(out this.fundsIconGreen, "VOID/Textures/fundsgreen.png", 10, 18);
+			texturesLoaded &= ToadicusTools.IOTools.LoadTexture(out this.fundsIconRed, "VOID/Textures/fundsred.png", 10, 18);
+			texturesLoaded &= ToadicusTools.IOTools.LoadTexture(out this.reputationIconGreen, "VOID/Textures/repgreen.png", 16, 18);
+			texturesLoaded &= ToadicusTools.IOTools.LoadTexture(out this.reputationIconRed, "VOID/Textures/repred.png", 16, 18);
+			texturesLoaded &= ToadicusTools.IOTools.LoadTexture(out this.scienceIcon, "VOID/Textures/science.png", 16, 18);
 
 			this.fundsContent = new GUIContent();
 			this.repContent = new GUIContent();

--- a/VOID_ConfigWindow.cs
+++ b/VOID_ConfigWindow.cs
@@ -28,7 +28,6 @@
 
 using KSP;
 using System;
-using ToadicusTools;
 using UnityEngine;
 
 namespace VOID

--- a/VOID_Data.cs
+++ b/VOID_Data.cs
@@ -26,11 +26,14 @@
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// TODO: Remove ToadicusTools. prefixes after refactor is done.
+
 using KerbalEngineer.VesselSimulator;
 using KSP;
 using System;
 using System.Collections.Generic;
-using ToadicusTools;
+using ToadicusTools.Extensions;
+using ToadicusTools.MuMechTools;
 using UnityEngine;
 
 namespace VOID
@@ -547,10 +550,10 @@
 					thrustPos = vesselTransform.InverseTransformPoint(thrustPos);
 					thrustDir = vesselTransform.InverseTransformDirection(thrustDir);
 
-					Vector3d thrustOffset = VectorTools.PointDistanceToLine(
+					Vector3d thrustOffset = ToadicusTools.VectorTools.PointDistanceToLine(
 						                        thrustPos, thrustDir.normalized, Core.Vessel.findLocalCenterOfMass());
 
-					Tools.PostDebugMessage(typeof(VOID_Data), "vesselThrustOffset:\n" +
+					ToadicusTools.Logging.PostDebugMessage(typeof(VOID_Data), "vesselThrustOffset:\n" +
 					"\tthrustPos: {0}\n" +
 					"\tthrustDir: {1}\n" +
 					"\tthrustOffset: {2}\n" +
@@ -805,7 +808,16 @@
 		public static readonly VOID_DoubleValue horzVelocity =
 			new VOID_DoubleValue(
 				"Horizontal speed",
-				new Func<double>(() => Core.Vessel.horizontalSrfSpeed),
+				delegate
+				{
+					double srfSpeedSqr = Core.Vessel.srfSpeed;
+					srfSpeedSqr *= srfSpeedSqr;
+
+					double vrtSpeedSqr = Core.Vessel.verticalSpeed;
+					vrtSpeedSqr *= vrtSpeedSqr;
+
+					return Math.Sqrt(srfSpeedSqr - vrtSpeedSqr);
+				},
 				"m/s"
 			);
 
@@ -1271,7 +1283,7 @@
 
 		private static double burnTime(double deltaV, double initialMass, double massFlow, double thrust)
 		{
-			Tools.PostDebugMessage(typeof(VOID_Data), "calculating burnTime from:\n" +
+			ToadicusTools.Logging.PostDebugMessage(typeof(VOID_Data), "calculating burnTime from:\n" +
 			"\tdeltaV: {0}\n" +
 			"\tinitialMass: {1}\n" +
 			"\tmassFlow: {2}\n" +

--- a/VOID_DataLogger.cs
+++ b/VOID_DataLogger.cs
@@ -26,12 +26,16 @@
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// TODO: Remove ToadicusTools. prefixes after refactor is done.
+
 using KSP;
 using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Text;
-using ToadicusTools;
+using ToadicusTools.DebugTools;
+using ToadicusTools.GUIUtils;
+using ToadicusTools.Text;
 using UnityEngine;
 
 namespace VOID
@@ -124,44 +128,46 @@
 			{
 				if (this._outputFile == null)
 				{
-					Tools.DebugLogger logger = Tools.DebugLogger.New(this);
-					logger.AppendFormat("Initializing output file '{0}' with mode ", this.fileName);
-
-					if (File.Exists(this.fileName))
+					using (PooledDebugLogger logger = PooledDebugLogger.New(this))
 					{
-						logger.Append("append");
-						this._outputFile = new FileStream(
-							this.fileName,
-							FileMode.Append,
-							FileAccess.Write,
-							FileShare.Read,
-							512,
-							true
-						);
+						logger.AppendFormat("Initializing output file '{0}' with mode ", this.fileName);
+
+						if (File.Exists(this.fileName))
+						{
+							logger.Append("append");
+							this._outputFile = new FileStream(
+								this.fileName,
+								FileMode.Append,
+								FileAccess.Write,
+								FileShare.Read,
+								512,
+								true
+							);
+						}
+						else
+						{
+							logger.Append("create");
+							this._outputFile = new FileStream(
+								this.fileName,
+								FileMode.Create,
+								FileAccess.Write,
+								FileShare.Read,
+								512,
+								true
+							);
+
+							byte[] byteOrderMark = utf8Encoding.GetPreamble();
+
+							logger.Append(" and writing preamble");
+							this._outputFile.Write(byteOrderMark, 0, byteOrderMark.Length);
+						}
+
+						logger.Append('.');
+
+						logger.AppendFormat("  File is {0}opened asynchronously.", this._outputFile.IsAsync ? "" : "not ");
+
+						logger.Print();
 					}
-					else
-					{
-						logger.Append("create");
-						this._outputFile = new FileStream(
-							this.fileName,
-							FileMode.Create,
-							FileAccess.Write,
-							FileShare.Read,
-							512,
-							true
-						);
-
-						byte[] byteOrderMark = utf8Encoding.GetPreamble();
-
-						logger.Append(" and writing preamble");
-						this._outputFile.Write(byteOrderMark, 0, byteOrderMark.Length);
-					}
-
-					logger.Append('.');
-
-					logger.AppendFormat("  File is {0}opened asynchronously.", this._outputFile.IsAsync ? "" : "not ");
-
-					logger.Print();
 				}
 
 				return this._outputFile;
@@ -216,14 +222,15 @@
 
 		public void OnDestroy()
 		{
-			Tools.DebugLogger logger = Tools.DebugLogger.New(this);
-
-			logger.Append("Destroying...");
-
-			this.CloseFileIfOpen();
-
-			logger.Append(" Done.");
-			logger.Print(false);
+			using (PooledDebugLogger logger = PooledDebugLogger.New(this))
+			{
+				logger.Append("Destroying...");
+
+				this.CloseFileIfOpen();
+
+				logger.Append(" Done.");
+				logger.Print(false);
+			}
 		}
 
 		#endregion
@@ -258,14 +265,14 @@
 				activeLabelStyle = VOID_Styles.labelGreen;
 			}
 
-			this.loggingActive = GUITools.Toggle(
+			this.loggingActive = Layout.Toggle(
 				loggingActive,
 				string.Format("Data logging: {0}", activeLabelText),
 				null,
 				activeLabelStyle
 			);
 
-			this.waitForLaunch.value = GUITools.Toggle(
+			this.waitForLaunch.value = Layout.Toggle(
 				this.waitForLaunch,
 				"Wait for launch"
 			);
@@ -305,111 +312,110 @@
 			//called if logging is on and interval has passed
 			//writes one line to the csvList
 
-			StringBuilder line = Tools.GetStringBuilder();
-
-			if (firstWrite)
-			{
-				firstWrite = false;
-				line.Append(
-					"\"Kerbin Universal Time (s)\"," +
-					"\"Mission Elapsed Time (s)\t\"," +
-					"\"Altitude ASL (m)\"," +
-					"\"Altitude above terrain (m)\"," +
-					"\"Surface Latitude (°)\"," +
-					"\"Surface Longitude (°)\"," +
-					"\"Apoapsis Altitude (m)\"," +
-					"\"Periapsis Altitude (m)\"," +
-					"\"Orbital Velocity (m/s)\"," +
-					"\"Surface Velocity (m/s)\"," +
-					"\"Vertical Speed (m/s)\"," +
-					"\"Horizontal Speed (m/s)\"," +
-					"\"Gee Force (gees)\"," +
-					"\"Temperature (°C)\"," +
-					"\"Gravity (m/s²)\"," +
-					"\"Atmosphere Density (g/m³)\"," +
-					"\"Downrange Distance  (m)\"," +
-					"\n"
-				);
-			}
-
-			// Universal time
-			line.Append(Planetarium.GetUniversalTime().ToString("F2"));
-			line.Append(',');
-
-			//Mission time
-			line.Append(Vessel.missionTime.ToString("F3"));
-			line.Append(',');
-
-			//Altitude ASL
-			line.Append(VOID_Data.orbitAltitude.Value.ToString("F3"));
-			line.Append(',');
-
-			//Altitude (true)
-			line.Append(VOID_Data.trueAltitude.Value.ToString("F3"));
-			line.Append(',');
-
-			// Surface Latitude
-			line.Append('"');
-			line.Append(VOID_Data.surfLatitude.Value);
-			line.Append('"');
-			line.Append(',');
-
-			// Surface Longitude
-			line.Append('"');
-			line.Append(VOID_Data.surfLongitude.Value);
-			line.Append('"');
-			line.Append(',');
-
-			// Apoapsis Altitude
-			line.Append(VOID_Data.orbitApoAlt.Value.ToString("G3"));
-			line.Append(',');
-
-			// Periapsis Altitude
-			line.Append(VOID_Data.oribtPeriAlt.Value.ToString("G3"));
-			line.Append(',');
-
-			//Orbital velocity
-			line.Append(VOID_Data.orbitVelocity.Value.ToString("F3"));
-			line.Append(',');
-
-			//surface velocity
-			line.Append(VOID_Data.surfVelocity.Value.ToString("F3"));
-			line.Append(',');
-
-			//vertical speed
-			line.Append(VOID_Data.vertVelocity.Value.ToString("F3"));
-			line.Append(',');
-
-			//horizontal speed
-			line.Append(VOID_Data.horzVelocity.Value.ToString("F3"));
-			line.Append(',');
-
-			//gee force
-			line.Append(VOID_Data.geeForce.Value.ToString("F3"));
-			line.Append(',');
-
-			//temperature
-			line.Append(VOID_Data.temperature.Value.ToString("F2"));
-			line.Append(',');
-
-			//gravity
-			line.Append(VOID_Data.gravityAccel.Value.ToString("F3"));
-			line.Append(',');
-
-			//atm density
-			line.Append(VOID_Data.atmDensity.Value.ToString("G3"));
-			line.Append(',');
-
-			// Downrange Distance
-			line.Append((VOID_Data.downrangeDistance.Value.ToString("G3")));
-
-			line.Append('\n');
-
-			csvBytes.AddRange(this.utf8Encoding.GetBytes(line.ToString()));
-
-			this.csvCollectTimer = 0f;
-
-			Tools.PutStringBuilder(line);
+			using (PooledStringBuilder line = PooledStringBuilder.Get())
+			{
+				if (firstWrite)
+				{
+					firstWrite = false;
+					line.Append(
+						"\"Kerbin Universal Time (s)\"," +
+						"\"Mission Elapsed Time (s)\t\"," +
+						"\"Altitude ASL (m)\"," +
+						"\"Altitude above terrain (m)\"," +
+						"\"Surface Latitude (°)\"," +
+						"\"Surface Longitude (°)\"," +
+						"\"Apoapsis Altitude (m)\"," +
+						"\"Periapsis Altitude (m)\"," +
+						"\"Orbital Velocity (m/s)\"," +
+						"\"Surface Velocity (m/s)\"," +
+						"\"Vertical Speed (m/s)\"," +
+						"\"Horizontal Speed (m/s)\"," +
+						"\"Gee Force (gees)\"," +
+						"\"Temperature (°C)\"," +
+						"\"Gravity (m/s²)\"," +
+						"\"Atmosphere Density (g/m³)\"," +
+						"\"Downrange Distance  (m)\"," +
+						"\n"
+					);
+				}
+
+				// Universal time
+				line.Append(Planetarium.GetUniversalTime().ToString("F2"));
+				line.Append(',');
+
+				//Mission time
+				line.Append(Vessel.missionTime.ToString("F3"));
+				line.Append(',');
+
+				//Altitude ASL
+				line.Append(VOID_Data.orbitAltitude.Value.ToString("F3"));
+				line.Append(',');
+
+				//Altitude (true)
+				line.Append(VOID_Data.trueAltitude.Value.ToString("F3"));
+				line.Append(',');
+
+				// Surface Latitude
+				line.Append('"');
+				line.Append(VOID_Data.surfLatitude.Value);
+				line.Append('"');
+				line.Append(',');
+
+				// Surface Longitude
+				line.Append('"');
+				line.Append(VOID_Data.surfLongitude.Value);
+				line.Append('"');
+				line.Append(',');
+
+				// Apoapsis Altitude
+				line.Append(VOID_Data.orbitApoAlt.Value.ToString("G3"));
+				line.Append(',');
+
+				// Periapsis Altitude
+				line.Append(VOID_Data.oribtPeriAlt.Value.ToString("G3"));
+				line.Append(',');
+
+				//Orbital velocity
+				line.Append(VOID_Data.orbitVelocity.Value.ToString("F3"));
+				line.Append(',');
+
+				//surface velocity
+				line.Append(VOID_Data.surfVelocity.Value.ToString("F3"));
+				line.Append(',');
+
+				//vertical speed
+				line.Append(VOID_Data.vertVelocity.Value.ToString("F3"));
+				line.Append(',');
+
+				//horizontal speed
+				line.Append(VOID_Data.horzVelocity.Value.ToString("F3"));
+				line.Append(',');
+
+				//gee force
+				line.Append(VOID_Data.geeForce.Value.ToString("F3"));
+				line.Append(',');
+
+				//temperature
+				line.Append(VOID_Data.temperature.Value.ToString("F2"));
+				line.Append(',');
+
+				//gravity
+				line.Append(VOID_Data.gravityAccel.Value.ToString("F3"));
+				line.Append(',');
+
+				//atm density
+				line.Append(VOID_Data.atmDensity.Value.ToString("G3"));
+				line.Append(',');
+
+				// Downrange Distance
+				line.Append((VOID_Data.downrangeDistance.Value.ToString("G3")));
+
+				line.Append('\n');
+
+				csvBytes.AddRange(this.utf8Encoding.GetBytes(line.ToString()));
+
+				this.csvCollectTimer = 0f;
+			}
 		}
 
 		#endregion
@@ -418,7 +424,7 @@
 
 		protected void AsyncWriteCallback(IAsyncResult result)
 		{
-			Tools.PostDebugMessage(this, "Got async callback, IsCompleted = {0}", result.IsCompleted);
+			ToadicusTools.Logging.PostDebugMessage(this, "Got async callback, IsCompleted = {0}", result.IsCompleted);
 
 			this.outputFile.EndWrite(result);
 			this.outstandingWrites--;
@@ -441,31 +447,32 @@
 
 		private void CloseFileIfOpen()
 		{
-			Tools.DebugLogger logger = Tools.DebugLogger.New(this);
-
-			logger.AppendFormat("Cleaning up file {0}...", this.fileName);
-
-			if (this.csvBytes != null && this.csvBytes.Count > 0)
-			{
-				logger.Append(" Writing remaining data...");
-				this.AsyncWriteData();
-			}
-
-			logger.Append(" Waiting for writes to finish.");
-			while (this.outstandingWrites > 0)
-			{
-				logger.Append('.');
-				System.Threading.Thread.Sleep(10);
-			}
-
-			if (this._outputFile != null)
-			{
-				this._outputFile.Close();
-				this._outputFile = null;
-				logger.Append(" File closed.");
-			}
-
-			logger.Print(false);
+			using (PooledDebugLogger logger = PooledDebugLogger.New(this))
+			{
+				logger.AppendFormat("Cleaning up file {0}...", this.fileName);
+
+				if (this.csvBytes != null && this.csvBytes.Count > 0)
+				{
+					logger.Append(" Writing remaining data...");
+					this.AsyncWriteData();
+				}
+
+				logger.Append(" Waiting for writes to finish.");
+				while (this.outstandingWrites > 0)
+				{
+					logger.Append('.');
+					System.Threading.Thread.Sleep(10);
+				}
+
+				if (this._outputFile != null)
+				{
+					this._outputFile.Close();
+					this._outputFile = null;
+					logger.Append(" File closed.");
+				}
+
+				logger.Print(false);
+			}
 		}
 
 		#endregion

--- a/VOID_EditorHUD.cs
+++ b/VOID_EditorHUD.cs
@@ -26,12 +26,14 @@
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// TODO: Remove ToadicusTools. prefixes after refactor is done.
+
 using KerbalEngineer.VesselSimulator;
 using KSP;
 using System;
 using System.Collections.Generic;
 using System.Text;
-using ToadicusTools;
+using ToadicusTools.Text;
 using UnityEngine;
 
 namespace VOID
@@ -113,87 +115,86 @@
 			);
 			this.Windows.Add(this.ehudWindow);
 
-			Tools.PostDebugMessage (this.GetType().Name + ": Constructed.");
+			ToadicusTools.Logging.PostDebugMessage (this.GetType().Name + ": Constructed.");
 		}
 
 		public void ehudWindowFunc(int id)
 		{
-			StringBuilder hudString = Tools.GetStringBuilder();
-
-			if (this.core.LastStage == null)
-			{
-				return;
-			}
-
-			VOID_Styles.labelHud.alignment = TextAnchor.UpperLeft;
-
-			hudString.Append("Total Mass: ");
-			hudString.Append(this.core.LastStage.totalMass.ToString("F3"));
-			hudString.Append('t');
-
-			hudString.Append(' ');
-
-			hudString.Append("Part Count: ");
-			hudString.Append(EditorLogic.SortedShipList.Count);
-
-			hudString.Append('\n');
-
-			hudString.Append("Total Delta-V: ");
-			hudString.Append(Tools.MuMech_ToSI(this.core.LastStage.totalDeltaV));
-			hudString.Append("m/s");
-
-			hudString.Append('\n');
-
-			hudString.Append("Bottom Stage Delta-V");
-			hudString.Append(Tools.MuMech_ToSI(this.core.LastStage.deltaV));
-			hudString.Append("m/s");
-
-			hudString.Append('\n');
-
-			hudString.Append("Bottom Stage T/W Ratio: ");
-			hudString.Append(this.core.LastStage.thrustToWeight.ToString("F3"));
-
-			Tools.PostDebugMessage(this,
-				"CoMmarker.gameObject.activeInHierarchy: {0};" +
-				"CoTmarker.gameObject.activeInHierarchy: {1}",
-				this.CoMmarker.gameObject.activeInHierarchy,
-				this.CoTmarker.gameObject.activeInHierarchy
-			);
-
-			if (this.CoMmarker.gameObject.activeInHierarchy && this.CoTmarker.gameObject.activeInHierarchy)
-			{
-				Tools.PostDebugMessage(this, "CoM and CoT markers are active, doing thrust offset.");
+			using (PooledStringBuilder hudString = PooledStringBuilder.Get())
+			{
+				if (this.core.LastStage == null)
+				{
+					return;
+				}
+
+				VOID_Styles.labelHud.alignment = TextAnchor.UpperLeft;
+
+				hudString.Append("Total Mass: ");
+				hudString.Append(this.core.LastStage.totalMass.ToString("F3"));
+				hudString.Append('t');
+
+				hudString.Append(' ');
+
+				hudString.Append("Part Count: ");
+				hudString.Append(EditorLogic.SortedShipList.Count);
+
 				hudString.Append('\n');
 
-				hudString.Append("Thrust Offset: ");
-				hudString.Append(
-					Vector3.Cross(
-						this.CoTmarker.dirMarkerObject.transform.forward,
-						this.CoMmarker.posMarkerObject.transform.position - this.CoTmarker.posMarkerObject.transform.position
-					).ToString("F3"));
-			}
-			#if DEBUG
+				hudString.Append("Total Delta-V: ");
+				hudString.Append(SIFormatProvider.ToSI(this.core.LastStage.totalDeltaV));
+				hudString.Append("m/s");
+
+				hudString.Append('\n');
+
+				hudString.Append("Bottom Stage Delta-V");
+				hudString.Append(SIFormatProvider.ToSI(this.core.LastStage.deltaV));
+				hudString.Append("m/s");
+
+				hudString.Append('\n');
+
+				hudString.Append("Bottom Stage T/W Ratio: ");
+				hudString.Append(this.core.LastStage.thrustToWeight.ToString("F3"));
+
+				ToadicusTools.Logging.PostDebugMessage(this,
+					"CoMmarker.gameObject.activeInHierarchy: {0};" +
+					"CoTmarker.gameObject.activeInHierarchy: {1}",
+					this.CoMmarker.gameObject.activeInHierarchy,
+					this.CoTmarker.gameObject.activeInHierarchy
+				);
+
+				if (this.CoMmarker.gameObject.activeInHierarchy && this.CoTmarker.gameObject.activeInHierarchy)
+				{
+					ToadicusTools.Logging.PostDebugMessage(this, "CoM and CoT markers are active, doing thrust offset.");
+					hudString.Append('\n');
+
+					hudString.Append("Thrust Offset: ");
+					hudString.Append(
+						Vector3.Cross(
+							this.CoTmarker.dirMarkerObject.transform.forward,
+							this.CoMmarker.posMarkerObject.transform.position - this.CoTmarker.posMarkerObject.transform.position
+						).ToString("F3"));
+				}
+				#if DEBUG
 			else
 			{
-				Tools.PostDebugMessage(this, "CoM and CoT markers are not active, thrust offset skipped.");
-			}
-			#endif
-
-			GUILayout.Label(
-				hudString.ToString(),
-				VOID_Styles.labelHud,
-				GUILayout.ExpandWidth(true),
-				GUILayout.ExpandHeight(true)
-			);
-
-			if (!this.positionsLocked)
-			{
-				GUI.DragWindow();
-			}
-
-			GUI.BringWindowToBack(id);
-
-			Tools.PutStringBuilder(hudString);
+				ToadicusTools.Logging.PostDebugMessage(this, "CoM and CoT markers are not active, thrust offset skipped.");
+			}
+				#endif
+
+				GUILayout.Label(
+					hudString.ToString(),
+					VOID_Styles.labelHud,
+					GUILayout.ExpandWidth(true),
+					GUILayout.ExpandHeight(true)
+				);
+
+				if (!this.positionsLocked)
+				{
+					GUI.DragWindow();
+				}
+
+				GUI.BringWindowToBack(id);
+			}
 		}
 
 		public override void DrawGUI()
@@ -216,7 +217,7 @@
 				return;
 			}
 
-			Tools.PostDebugMessage(this,
+			ToadicusTools.Logging.PostDebugMessage(this,
 				"EditorPartList topLeft.parent.parent.position: {0}\n" +
 				"EditorPartList topLeft.parent.position: {1}\n" +
 				"EditorPartList topLeft.position: {2}\n" +

--- a/VOID_HUD.cs
+++ b/VOID_HUD.cs
@@ -26,12 +26,14 @@
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// TODO: Remove ToadicusTools. prefixes after refactor is done.
+
 using KerbalEngineer.VesselSimulator;
 using KSP;
 using System;
 using System.Collections.Generic;
 using System.Text;
-using ToadicusTools;
+using ToadicusTools.Text;
 using UnityEngine;
 
 namespace VOID
@@ -63,129 +65,122 @@
 			this.rightHUD = new HUDWindow("rightHUD", this.rightHUDWindow, new Rect(Screen.width * .625f, 0f, 300f, 90f));
 			this.Windows.Add(this.rightHUD);
 
-			Tools.PostDebugMessage ("VOID_HUD: Constructed.");
+			ToadicusTools.Logging.PostDebugMessage ("VOID_HUD: Constructed.");
 		}
 
 		protected void leftHUDWindow(int id)
 		{
-			StringBuilder leftHUD;
+			using (PooledStringBuilder leftHUD = PooledStringBuilder.Get())
+			{
+				VOID_Styles.labelHud.alignment = TextAnchor.UpperRight;
 
-			leftHUD = Tools.GetStringBuilder();
+				if (this.core.powerAvailable)
+				{
+					leftHUD.AppendFormat("Primary: {0} Inc: {1}",
+						VOID_Data.primaryName.ValueUnitString(),
+						VOID_Data.orbitInclination.ValueUnitString("F3")
+					);
+					leftHUD.AppendFormat("\nObt 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("\nTot Δv: {0} Stg Δv: {1}",
+						VOID_Data.totalDeltaV.ToSIString(2),
+						VOID_Data.stageDeltaV.ToSIString(2)
+					);
+				}
+				else
+				{
+					VOID_Styles.labelHud.normal.textColor = Color.red;
+					leftHUD.Append(string.Intern("-- POWER LOST --"));
+				}
 
-			VOID_Styles.labelHud.alignment = TextAnchor.UpperRight;
+				GUILayout.Label(
+					leftHUD.ToString(),
+					VOID_Styles.labelHud,
+					GUILayout.ExpandWidth(true),
+					GUILayout.ExpandHeight(true)
+				);
 
-			if (this.core.powerAvailable)
-			{
-				leftHUD.AppendFormat("Primary: {0} Inc: {1}",
-					VOID_Data.primaryName.ValueUnitString(),
-					VOID_Data.orbitInclination.ValueUnitString("F3")
-				);
-				leftHUD.AppendFormat("\nObt 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("\nTot Δv: {0} Stg Δv: {1}",
-					VOID_Data.totalDeltaV.ToSIString(2),
-					VOID_Data.stageDeltaV.ToSIString(2)
-				);
+				if (!this.positionsLocked)
+				{
+					GUI.DragWindow();
+				}
+
+				GUI.BringWindowToBack(id);
 			}
-			else
-			{
-				VOID_Styles.labelHud.normal.textColor = Color.red;
-				leftHUD.Append(string.Intern("-- POWER LOST --"));
-			}
-
-			GUILayout.Label(
-				leftHUD.ToString(),
-				VOID_Styles.labelHud,
-				GUILayout.ExpandWidth(true),
-				GUILayout.ExpandHeight(true)
-			);
-
-			if (!this.positionsLocked)
-			{
-				GUI.DragWindow();
-			}
-
-			GUI.BringWindowToBack(id);
-
-			Tools.PutStringBuilder(leftHUD);
 		}
 
 		protected void rightHUDWindow(int id)
 		{
-			StringBuilder rightHUD;
+			using (PooledStringBuilder rightHUD = PooledStringBuilder.Get())
+			{
+				VOID_Styles.labelHud.alignment = TextAnchor.UpperLeft;
 
-			rightHUD = Tools.GetStringBuilder();
+				if (this.core.powerAvailable)
+				{
+					rightHUD.AppendFormat("Biome: {0} Sit: {1}",
+						VOID_Data.currBiome.ValueUnitString(),
+						VOID_Data.expSituation.ValueUnitString()
+					);
+					rightHUD.AppendFormat("\nSrf 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.surfLatitudeString.ValueUnitString(),
+						VOID_Data.surfLongitudeString.ValueUnitString()
+					);
+					rightHUD.AppendFormat("\nHdg: {0} Pit: {1}",
+						VOID_Data.vesselHeading.ValueUnitString(),
+						VOID_Data.vesselPitch.ToSIString(2)
+					);
 
-			VOID_Styles.labelHud.alignment = TextAnchor.UpperLeft;
+					if (
+						this.core.Vessel.mainBody == this.core.HomeBody &&
+						(
+						    this.core.Vessel.situation == Vessel.Situations.FLYING ||
+						    this.core.Vessel.situation == Vessel.Situations.SUB_ORBITAL ||
+						    this.core.Vessel.situation == Vessel.Situations.LANDED ||
+						    this.core.Vessel.situation == Vessel.Situations.SPLASHED
+						))
+					{
+						rightHUD.AppendFormat("\nRange to KSC: {0}", VOID_Data.downrangeDistance.ValueUnitString(2));
+					}
+				}
+				else
+				{
+					VOID_Styles.labelHud.normal.textColor = Color.red;
+					rightHUD.Append(string.Intern("-- POWER LOST --"));
+				}
 
-			if (this.core.powerAvailable)
-			{
-				rightHUD.AppendFormat("Biome: {0} Sit: {1}",
-					VOID_Data.currBiome.ValueUnitString(),
-					VOID_Data.expSituation.ValueUnitString()
-				);
-				rightHUD.AppendFormat("\nSrf 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.surfLatitudeString.ValueUnitString(),
-					VOID_Data.surfLongitudeString.ValueUnitString()
-				);
-				rightHUD.AppendFormat("\nHdg: {0} Pit: {1}",
-					VOID_Data.vesselHeading.ValueUnitString(),
-					VOID_Data.vesselPitch.ToSIString(2)
+
+				GUILayout.Label(
+					rightHUD.ToString(),
+					VOID_Styles.labelHud,
+					GUILayout.ExpandWidth(true),
+					GUILayout.ExpandHeight(true)
 				);
 
-				if (
-					this.core.Vessel.mainBody == this.core.HomeBody &&
-					(
-						this.core.Vessel.situation == Vessel.Situations.FLYING ||
-						this.core.Vessel.situation == Vessel.Situations.SUB_ORBITAL ||
-						this.core.Vessel.situation == Vessel.Situations.LANDED ||
-						this.core.Vessel.situation == Vessel.Situations.SPLASHED
-					)
-				)
+				if (!this.positionsLocked)
 				{
-					rightHUD.AppendFormat("\nRange to KSC: {0}", VOID_Data.downrangeDistance.ValueUnitString(2));
+					GUI.DragWindow();
 				}
+
+				GUI.BringWindowToBack(id);
 			}
-			else
-			{
-				VOID_Styles.labelHud.normal.textColor = Color.red;
-				rightHUD.Append(string.Intern("-- POWER LOST --"));
-			}
-
-
-			GUILayout.Label(
-				rightHUD.ToString(),
-				VOID_Styles.labelHud,
-				GUILayout.ExpandWidth(true),
-				GUILayout.ExpandHeight(true)
-			);
-
-			if (!this.positionsLocked)
-			{
-				GUI.DragWindow();
-			}
-
-			GUI.BringWindowToBack(id);
-
-			Tools.PutStringBuilder(rightHUD);
 		}
 	}
 }

--- a/VOID_HUDAdvanced.cs
+++ b/VOID_HUDAdvanced.cs
@@ -26,12 +26,15 @@
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// TODO: Remove ToadicusTools. prefixes after refactor is done.
+
 using KerbalEngineer.VesselSimulator;
 using KSP;
 using System;
 using System.Collections.Generic;
 using System.Text;
-using ToadicusTools;
+using ToadicusTools.GUIUtils;
+using ToadicusTools.Text;
 using UnityEngine;
 
 namespace VOID
@@ -96,139 +99,133 @@
 
 			this.positionsLocked.value = true;
 
-			Tools.PostDebugMessage (this, "Constructed.");
+			ToadicusTools.Logging.PostDebugMessage (this, "Constructed.");
 		}
 
 		protected void leftHUDWindow(int id)
 		{
-			StringBuilder leftHUD;
-
-			leftHUD = Tools.GetStringBuilder();
-
-			VOID_Styles.labelHud.alignment = TextAnchor.UpperRight;
-
-			if (this.core.powerAvailable)
-			{
-				leftHUD.AppendFormat(
-					string.Intern("Mass: {0}\n"),
-					VOID_Data.totalMass.ToSIString(2)
+			using (PooledStringBuilder leftHUD = PooledStringBuilder.Get())
+			{
+				VOID_Styles.labelHud.alignment = TextAnchor.UpperRight;
+
+				if (this.core.powerAvailable)
+				{
+					leftHUD.AppendFormat(
+						string.Intern("Mass: {0}\n"),
+						VOID_Data.totalMass.ToSIString(2)
+					);
+
+					if (VOID_Data.vesselCrewCapacity > 0)
+					{
+						leftHUD.AppendFormat(
+							string.Intern("Crew: {0} / {1}\n"),
+							VOID_Data.vesselCrewCount.Value,
+							VOID_Data.vesselCrewCapacity.Value
+						);
+					}
+
+					leftHUD.AppendFormat(
+						string.Intern("Acc: {0} T:W: {1}\n"),
+						VOID_Data.vesselAccel.ToSIString(2),
+						VOID_Data.currThrustWeight.Value.ToString("f2")
+					);
+
+					leftHUD.AppendFormat(
+						string.Intern("Ang Vel: {0}\n"),
+						VOID_Data.vesselAngularVelocity.ToSIString(2)
+					);
+
+					if (VOID_Data.stageNominalThrust != 0d)
+					{
+						leftHUD.AppendFormat(
+							string.Intern("Thrust Offset: {0}\n"),
+							VOID_Data.vesselThrustOffset.Value.ToString("F1")
+						);
+					}
+				}
+				else
+				{
+					VOID_Styles.labelHud.normal.textColor = Color.red;
+					leftHUD.Append(string.Intern("-- POWER LOST --"));
+				}
+
+				GUILayout.Label(
+					leftHUD.ToString(),
+					VOID_Styles.labelHud,
+					GUILayout.ExpandWidth(true),
+					GUILayout.ExpandHeight(true)
 				);
 
-				if (VOID_Data.vesselCrewCapacity > 0)
-				{
-					leftHUD.AppendFormat(
-						string.Intern("Crew: {0} / {1}\n"),
-						VOID_Data.vesselCrewCount.Value,
-						VOID_Data.vesselCrewCapacity.Value
-					);
-				}
-
-				leftHUD.AppendFormat(
-					string.Intern("Acc: {0} T:W: {1}\n"),
-					VOID_Data.vesselAccel.ToSIString(2),
-					VOID_Data.currThrustWeight.Value.ToString("f2")
+				if (!this.positionsLocked)
+				{
+					GUI.DragWindow();
+				}
+
+				GUI.BringWindowToBack(id);
+			}
+		}
+
+		protected void rightHUDWindow(int id)
+		{
+			using (PooledStringBuilder rightHUD = PooledStringBuilder.Get())
+			{
+				VOID_Styles.labelHud.alignment = TextAnchor.UpperLeft;
+
+				if (this.core.powerAvailable)
+				{
+					rightHUD.AppendFormat(
+						"Burn Δv (Rem/Tot): {0} / {1}\n",
+						VOID_Data.currManeuverDVRemaining.ValueUnitString("f2"),
+						VOID_Data.currManeuverDeltaV.ValueUnitString("f2")
+					);
+
+					if (VOID_Data.upcomingManeuverNodes > 1)
+					{
+						rightHUD.AppendFormat("Next Burn Δv: {0}\n",
+							VOID_Data.nextManeuverDeltaV.ValueUnitString("f2")
+						);
+					}
+
+					rightHUD.AppendFormat("Burn Time (Rem/Total): {0} / {1}\n",
+						VOID_Tools.FormatInterval(VOID_Data.currentNodeBurnRemaining.Value),
+						VOID_Tools.FormatInterval(VOID_Data.currentNodeBurnDuration.Value)
+					);
+
+					if (VOID_Data.burnTimeDoneAtNode.Value != string.Empty)
+					{
+						rightHUD.AppendFormat("{0} (done @ node)\n",
+							VOID_Data.burnTimeDoneAtNode.Value
+						);
+
+						rightHUD.AppendFormat("{0} (½ done @ node)",
+							VOID_Data.burnTimeHalfDoneAtNode.Value
+						);
+					}
+					else
+					{
+						rightHUD.Append("Node is past");
+					}
+				}
+				else
+				{
+					VOID_Styles.labelHud.normal.textColor = Color.red;
+					rightHUD.Append(string.Intern("-- POWER LOST --"));
+				}
+
+				GUILayout.Label(
+					rightHUD.ToString(),
+					VOID_Styles.labelHud,
+					GUILayout.ExpandWidth(true),
+					GUILayout.ExpandHeight(true)
 				);
 
-				leftHUD.AppendFormat(
-					string.Intern("Ang Vel: {0}\n"),
-					VOID_Data.vesselAngularVelocity.ToSIString(2)
-				);
-
-				if (VOID_Data.stageNominalThrust != 0d)
-				{
-					leftHUD.AppendFormat(
-						string.Intern("Thrust Offset: {0}\n"),
-						VOID_Data.vesselThrustOffset.Value.ToString("F1")
-					);
-				}
-			}
-			else
-			{
-				VOID_Styles.labelHud.normal.textColor = Color.red;
-				leftHUD.Append(string.Intern("-- POWER LOST --"));
-			}
-
-			GUILayout.Label(
-				leftHUD.ToString(),
-				VOID_Styles.labelHud,
-				GUILayout.ExpandWidth(true),
-				GUILayout.ExpandHeight(true)
-			);
-
-			if (!this.positionsLocked)
-			{
-				GUI.DragWindow();
-			}
-
-			GUI.BringWindowToBack(id);
-
-			Tools.PutStringBuilder(leftHUD);
-		}
-
-		protected void rightHUDWindow(int id)
-		{
-			StringBuilder rightHUD;
-
-			rightHUD = Tools.GetStringBuilder();
-
-			VOID_Styles.labelHud.alignment = TextAnchor.UpperLeft;
-
-			if (this.core.powerAvailable)
-			{
-				rightHUD.AppendFormat(
-					"Burn Δv (Rem/Tot): {0} / {1}\n",
-					VOID_Data.currManeuverDVRemaining.ValueUnitString("f2"),
-					VOID_Data.currManeuverDeltaV.ValueUnitString("f2")
-				);
-
-				if (VOID_Data.upcomingManeuverNodes > 1)
-				{
-					rightHUD.AppendFormat("Next Burn Δv: {0}\n",
-						VOID_Data.nextManeuverDeltaV.ValueUnitString("f2")
-					);
-				}
-
-				rightHUD.AppendFormat("Burn Time (Rem/Total): {0} / {1}\n",
-					VOID_Tools.FormatInterval(VOID_Data.currentNodeBurnRemaining.Value),
-					VOID_Tools.FormatInterval(VOID_Data.currentNodeBurnDuration.Value)
-				);
-
-				if (VOID_Data.burnTimeDoneAtNode.Value != string.Empty)
-				{
-					rightHUD.AppendFormat("{0} (done @ node)\n",
-						VOID_Data.burnTimeDoneAtNode.Value
-					);
-
-					rightHUD.AppendFormat("{0} (½ done @ node)",
-						VOID_Data.burnTimeHalfDoneAtNode.Value
-					);
-				}
-				else
-				{
-					rightHUD.Append("Node is past");
-				}
-			}
-			else
-			{
-				VOID_Styles.labelHud.normal.textColor = Color.red;
-				rightHUD.Append(string.Intern("-- POWER LOST --"));
-			}
-
-			GUILayout.Label(
-				rightHUD.ToString(),
-				VOID_Styles.labelHud,
-				GUILayout.ExpandWidth(true),
-				GUILayout.ExpandHeight(true)
-			);
-
-			if (!this.positionsLocked)
-			{
-				GUI.DragWindow();
-			}
-
-			GUI.BringWindowToBack(id);
-
-			Tools.PutStringBuilder(rightHUD);
+				if (!this.positionsLocked)
+				{
+					GUI.DragWindow();
+				}
+
+				GUI.BringWindowToBack(id);
+			}
 		}
 
 		public override void DrawGUI()
@@ -274,7 +271,7 @@
 				}
 			}
 
-			this.positionsLocked.value = GUITools.Toggle(this.positionsLocked, string.Intern("Lock Advanced HUD Positions"));
+			this.positionsLocked.value = Layout.Toggle(this.positionsLocked, string.Intern("Lock Advanced HUD Positions"));
 		}
 	}
 }

--- a/VOID_Orbital.cs
+++ b/VOID_Orbital.cs
@@ -26,9 +26,11 @@
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// TODO: Remove ToadicusTools. prefixes after refactor is done.
+
 using KSP;
 using System;
-using ToadicusTools;
+using ToadicusTools.GUIUtils;
 using UnityEngine;
 
 namespace VOID
@@ -40,7 +42,7 @@
 
 		[AVOID_SaveValue("precisionValues")]
 		protected VOID_SaveValue<long> _precisionValues;
-		protected IntCollection precisionValues;
+		protected ToadicusTools.IntCollection precisionValues;
 
 		public VOID_Orbital()
 		{
@@ -83,7 +85,7 @@
 			this.precisionValues [idx]= (ushort)VOID_Data.gravityAccel.DoGUIHorizontal (this.precisionValues [idx]);
 			idx++;
 
-			this.toggleExtended.value = GUITools.Toggle(this.toggleExtended, "Extended info");
+			this.toggleExtended.value = Layout.Toggle(this.toggleExtended, "Extended info");
 
 			if (this.toggleExtended)
             {
@@ -120,7 +122,7 @@
 		{
 			base.LoadConfig ();
 
-			this.precisionValues = new IntCollection (4, this._precisionValues);
+			this.precisionValues = new ToadicusTools.IntCollection (4, this._precisionValues);
 		}
 
 		public override void Save (KSP.IO.PluginConfiguration config, string sceneKey)

--- a/VOID_Rendezvous.cs
+++ b/VOID_Rendezvous.cs
@@ -26,10 +26,13 @@
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// TODO: Remove ToadicusTools. prefixes after refactor is done.
+
 using KSP;
 using System;
 using System.Collections.Generic;
-using ToadicusTools;
+using ToadicusTools.GUIUtils;
+using ToadicusTools.Text;
 using UnityEngine;
 
 namespace VOID
@@ -96,7 +99,7 @@
 				if (GUILayout.Button("Unset Target", GUILayout.ExpandWidth(false)))
 				{
 					FlightGlobals.fetch.SetVesselTarget(null);
-					Tools.PostDebugMessage("VOID_Rendezvous: KSP Target set to null");
+					ToadicusTools.Logging.PostDebugMessage("VOID_Rendezvous: KSP Target set to null");
 				}
 
 			}
@@ -123,7 +126,7 @@
 						if (GUILayout.Button("Set Target", GUILayout.ExpandWidth(false)))
 						{
 							FlightGlobals.fetch.SetVesselTarget(rendezvessel);
-							Tools.PostDebugMessage("[VOID] KSP Target set to " + rendezvessel.vesselName);
+							ToadicusTools.Logging.PostDebugMessage("[VOID] KSP Target set to " + rendezvessel.vesselName);
 						}
 					}
 				}
@@ -135,7 +138,7 @@
 				}
 			}
 
-			untoggleRegisterInfo.value = GUITools.Toggle(untoggleRegisterInfo, "Hide Vessel Register Info");
+			untoggleRegisterInfo.value = Layout.Toggle(untoggleRegisterInfo, "Hide Vessel Register Info");
 
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			GUILayout.Label(" ", GUILayout.ExpandWidth(true));
@@ -166,12 +169,12 @@
 					//display orbital info for orbiting/flying/suborbital/escaping vessels only
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 					GUILayout.Label("Ap/Pe:");
-					GUILayout.Label(Tools.MuMech_ToSI(v.orbit.ApA) + "m / " + Tools.MuMech_ToSI(v.orbit.PeA) + "m", GUILayout.ExpandWidth(false));
+					GUILayout.Label(SIFormatProvider.ToSI(v.orbit.ApA, 3) + "m / " + SIFormatProvider.ToSI(v.orbit.PeA, 3) + "m", GUILayout.ExpandWidth(false));
 					GUILayout.EndHorizontal();
 
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 					GUILayout.Label("Altitude:");
-					GUILayout.Label(Tools.MuMech_ToSI(v.orbit.altitude) + "m", GUILayout.ExpandWidth(false));
+					GUILayout.Label(SIFormatProvider.ToSI(v.orbit.altitude, 3) + "m", GUILayout.ExpandWidth(false));
 					GUILayout.EndHorizontal();
 
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
@@ -190,17 +193,17 @@
 
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 					GUILayout.Label("Velocity:");
-					GUILayout.Label(Tools.MuMech_ToSI(v.orbit.vel.magnitude) + "m/s", GUILayout.ExpandWidth(false));
+					GUILayout.Label(SIFormatProvider.ToSI(v.orbit.vel.magnitude, 3) + "m/s", GUILayout.ExpandWidth(false));
 					GUILayout.EndHorizontal();
 
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 					GUILayout.Label("Relative velocity:");
-					GUILayout.Label(Tools.MuMech_ToSI(v.orbit.vel.magnitude - Vessel.orbit.vel.magnitude) + "m/s", GUILayout.ExpandWidth(false));
+					GUILayout.Label(SIFormatProvider.ToSI(v.orbit.vel.magnitude - Vessel.orbit.vel.magnitude, 3) + "m/s", GUILayout.ExpandWidth(false));
 					GUILayout.EndHorizontal();
 
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 					GUILayout.Label("Distance:");
-					GUILayout.Label(Tools.MuMech_ToSI((Vessel.findWorldCenterOfMass() - v.findWorldCenterOfMass()).magnitude) + "m", GUILayout.ExpandWidth(false));
+					GUILayout.Label(SIFormatProvider.ToSI((Vessel.findWorldCenterOfMass() - v.findWorldCenterOfMass()).magnitude, 3) + "m", GUILayout.ExpandWidth(false));
 					GUILayout.EndHorizontal();
 
 					// Toadicus edit: added local sidereal longitude.
@@ -209,7 +212,7 @@
 					GUILayout.Label(LSL.ToString("F3") + "°", VOID_Styles.labelRight);
 					GUILayout.EndHorizontal();
 
-					toggleExtendedOrbital.value = GUITools.Toggle(toggleExtendedOrbital, "Extended info");
+					toggleExtendedOrbital.value = Layout.Toggle(toggleExtendedOrbital, "Extended info");
 
 					if (toggleExtendedOrbital)
 					{
@@ -270,7 +273,7 @@
 
 					GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 					GUILayout.Label("Distance:");
-					GUILayout.Label(Tools.MuMech_ToSI((Vessel.findWorldCenterOfMass() - v.findWorldCenterOfMass()).magnitude) + "m", GUILayout.ExpandWidth(false));
+					GUILayout.Label(SIFormatProvider.ToSI((Vessel.findWorldCenterOfMass() - v.findWorldCenterOfMass()).magnitude, 3) + "m", GUILayout.ExpandWidth(false));
 					GUILayout.EndHorizontal();
 				}
 			}
@@ -281,7 +284,7 @@
 
 				GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 				GUILayout.Label("Ap/Pe:");
-				GUILayout.Label(Tools.MuMech_ToSI(cb.orbit.ApA) + "m / " + Tools.MuMech_ToSI(cb.orbit.PeA) + "m", GUILayout.ExpandWidth(false));
+				GUILayout.Label(SIFormatProvider.ToSI(cb.orbit.ApA, 3) + "m / " + SIFormatProvider.ToSI(cb.orbit.PeA, 3) + "m", GUILayout.ExpandWidth(false));
 				GUILayout.EndHorizontal();
 				//if (debugging) Debug.Log("[VOID] Ap/Pe OK");
 
@@ -302,7 +305,7 @@
 
 				GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 				GUILayout.Label("Distance:");
-				GUILayout.Label(Tools.MuMech_ToSI((Vessel.mainBody.position - cb.position).magnitude) + "m", GUILayout.ExpandWidth(false));
+				GUILayout.Label(SIFormatProvider.ToSI((Vessel.mainBody.position - cb.position).magnitude, 3) + "m", GUILayout.ExpandWidth(false));
 				GUILayout.EndHorizontal();
 
 				//if (debugging) Debug.Log("[VOID] Distance OK");

--- a/VOID_Transfer.cs
+++ b/VOID_Transfer.cs
@@ -26,10 +26,11 @@
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// TODO: Remove ToadicusTools. prefixes after refactor is done.
+
 using KSP;
 using System;
 using System.Collections.Generic;
-using ToadicusTools;
 using UnityEngine;
 
 namespace VOID
@@ -163,7 +164,7 @@
 		            if (GUILayout.Button("Set Target", GUILayout.ExpandWidth(false)))
 		            {
 		                FlightGlobals.fetch.SetVesselTarget(body);
-						Tools.PostDebugMessage("[VOID] KSP Target set to CelestialBody " + body.bodyName);
+						ToadicusTools.Logging.PostDebugMessage("[VOID] KSP Target set to CelestialBody " + body.bodyName);
 		            }
 		        }
 		        else if ((CelestialBody)FlightGlobals.fetch.VesselTarget == body)
@@ -171,7 +172,7 @@
 		            if (GUILayout.Button("Unset Target", GUILayout.ExpandWidth(false)))
 		            {
 		                FlightGlobals.fetch.SetVesselTarget(null);
-		                Tools.PostDebugMessage("[VOID] KSP Target set to null");
+		                ToadicusTools.Logging.PostDebugMessage("[VOID] KSP Target set to null");
 		            }
 		        }
 		    }
@@ -181,7 +182,7 @@
 		        if (GUILayout.Button("Set Target", GUILayout.ExpandWidth(false)))
 		        {
 		            FlightGlobals.fetch.SetVesselTarget(body);
-		            Tools.PostDebugMessage("[VOID] KSP Target set to CelestialBody " + body.bodyName);
+		            ToadicusTools.Logging.PostDebugMessage("[VOID] KSP Target set to CelestialBody " + body.bodyName);
 		        }
 		    }
 		}

--- a/VOID_VesselInfo.cs
+++ b/VOID_VesselInfo.cs
@@ -31,7 +31,6 @@
 using KSP;
 using System;
 using System.Collections.Generic;
-using ToadicusTools;
 using UnityEngine;
 
 namespace VOID

--- a/VOID_VesselRegister.cs
+++ b/VOID_VesselRegister.cs
@@ -28,7 +28,6 @@
 
 using KSP;
 using System;
-using ToadicusTools;
 using UnityEngine;
 
 namespace VOID