diff --git a/VECTO/Input Files/Engine.vb b/VECTO/Input Files/Engine.vb
index 1772a3ab98b6f984cf034164ec863a3f684e28dc..06a41acb0793a0ab27999618450386f3f8bb5327 100644
--- a/VECTO/Input Files/Engine.vb	
+++ b/VECTO/Input Files/Engine.vb	
@@ -228,7 +228,8 @@ Public Class Engine
 			Else
 				Dim doa As EngineeringDataAdapter = New EngineeringDataAdapter()
 				Dim dummyVehicle As IVehicleEngineeringInputData = New DummyVehicle() With {
-						.IVehicleComponentsEngineering_EngineInputData = engine
+						.IVehicleComponentsEngineering_EngineInputData = engine,
+						.TankSystem = TankSystem.Compressed
 						}
 				engineData = doa.CreateEngineData(dummyVehicle, CType(engine.EngineModes.First(), IEngineModeEngineeringInputData))
 			End If
diff --git a/VectoCommon/VectoCommon/Models/HybridStrategyResponse.cs b/VectoCommon/VectoCommon/Models/HybridStrategyResponse.cs
index 6d096712c9fa353ed0be8077fa3d5da6c806eb94..6998d172512dec4103cb78a6e95051667a0d9a24 100644
--- a/VectoCommon/VectoCommon/Models/HybridStrategyResponse.cs
+++ b/VectoCommon/VectoCommon/Models/HybridStrategyResponse.cs
@@ -84,9 +84,8 @@ namespace TUGraz.VectoCommon.Models {
 			return ToString().Equals(other.ToString(), StringComparison.InvariantCultureIgnoreCase);
 		}
 
-		public override string ToString()
-		{
-			var setting = string.Join(", ", Setting.MechanicalAssistPower.Select(x => $"{x.Key}, {x.Value}"));
+		public override string ToString() {
+			var setting = Setting.MechanicalAssistPower.Select(x => $"{x.Key}, {x.Value}").Join();
 			return $"{U}: {setting} {Score} G{Gear}";
 		}
 	}
@@ -157,7 +156,7 @@ namespace TUGraz.VectoCommon.Models {
 				}
 			}
 
-			return string.Join("/", retVal);
+			return retVal.Join("/");
 		}
 
 		public static bool InvalidEngineSpeed(this HybridConfigurationIgnoreReason x)
diff --git a/VectoCommon/VectoCommon/Models/IResponse.cs b/VectoCommon/VectoCommon/Models/IResponse.cs
index ad0e0d1d5dafd24c4492303d86cc9d0f3dab5e0c..d3e3e6e18b0d918e89c6f704b9ccbe1f053e9e0a 100644
--- a/VectoCommon/VectoCommon/Models/IResponse.cs
+++ b/VectoCommon/VectoCommon/Models/IResponse.cs
@@ -44,7 +44,7 @@ namespace TUGraz.VectoCommon.Models
 		public override string ToString()
 		{
 			var t = GetType();
-			return $"{t.Name}{{{string.Join(", ", t.GetProperties().Select(p => $"{p.Name}: {p.GetValue(this)}"))}}}";
+			return $"{t.Name}{{{t.GetProperties().Select(p => $"{p.Name}: {p.GetValue(this)}").Join()}}}";
 		}
 	}
 
diff --git a/VectoCommon/VectoCommon/Models/WHRType.cs b/VectoCommon/VectoCommon/Models/WHRType.cs
index 9b4f8158cb633f0bccdc96dab1fc6505eecb4c49..b6f260f8c68cef31cf5450f6268b0aff893afc53 100644
--- a/VectoCommon/VectoCommon/Models/WHRType.cs
+++ b/VectoCommon/VectoCommon/Models/WHRType.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using TUGraz.VectoCommon.Utils;
 
 namespace TUGraz.VectoCommon.Models {
 
@@ -27,7 +28,7 @@ namespace TUGraz.VectoCommon.Models {
 				options.Add("electrical output");
 			}
 
-			return options.Count == 0 ? "none" : string.Join(", ", options);
+			return options.Count == 0 ? "none" : options.Join();
 		}
 		
 		public static bool IsElectrical(this WHRType whrType)
diff --git a/VectoCommon/VectoCommon/Utils/EnumerableExtensionMethods.cs b/VectoCommon/VectoCommon/Utils/EnumerableExtensionMethods.cs
index 20e6d1aabbea4898c4e53c68f80fd21aff9fd094..b1b2f867acb503381a628c964014bff6dedd7016 100644
--- a/VectoCommon/VectoCommon/Utils/EnumerableExtensionMethods.cs
+++ b/VectoCommon/VectoCommon/Utils/EnumerableExtensionMethods.cs
@@ -39,6 +39,12 @@ namespace TUGraz.VectoCommon.Utils
 {
 	public static class EnumerableExtensionMethods
 	{
+		/// <summary>
+		/// Joins the items of the enumerable into a string.
+		/// </summary>
+		public static string Join<T>(this IEnumerable<T> list, string separator = ", ") =>
+			string.Join(separator, list ?? Enumerable.Empty<T>());
+
 		public static IEnumerable<(T value, int index)> Select<T>(this IEnumerable<T> self) =>
 			self.Select((value, index) => (value, index));
 
@@ -51,13 +57,6 @@ namespace TUGraz.VectoCommon.Utils
 			return dest;
 		}
 
-		/// <summary>
-		/// Joins the items of the enumerable into a string.
-		/// </summary>
-		public static string JoinString(this IEnumerable<string> self, string separator = ", ") =>
-			string.Join(separator, self ?? Enumerable.Empty<string>());
-
-
 		public static IEnumerable<double> ToDouble(this IEnumerable<string> self, double? defaultValue = null)
 		{
 			return self.Select(s => s.ToDouble(defaultValue));
@@ -156,16 +155,16 @@ namespace TUGraz.VectoCommon.Utils
 			}
 		}
 
-		public static T Sum<T>(this IEnumerable<T> values) where T : SIBase<T> => 
+		public static T Sum<T>(this IEnumerable<T> values) where T : SIBase<T> =>
 			values.Sum(x => x);
 
 		public static TResult Sum<TU, TResult>(this IEnumerable<TU> values, Func<TU, TResult> selector)
 			where TResult : SIBase<TResult> =>
 			values.Select(selector).DefaultIfEmpty().Aggregate((sum, current) => sum + current);
 
-		public static T Average<T>(this IEnumerable<T> values) where T : SIBase<T> => 
+		public static T Average<T>(this IEnumerable<T> values) where T : SIBase<T> =>
 			values.Average(v => v.Value()).SI<T>();
-		
+
 		/// <summary>
 		/// Get the first two items where the predicate changes from true to false.
 		/// If the predicate is always true, the last 2 elements are returned.
diff --git a/VectoCommon/VectoCommon/Utils/SI.cs b/VectoCommon/VectoCommon/Utils/SI.cs
index 7110bb757e55df107da4cce8580a291cd85a65a0..f41f07245d0052ded32fb5049fd9c23aa6649b60 100644
--- a/VectoCommon/VectoCommon/Utils/SI.cs
+++ b/VectoCommon/VectoCommon/Utils/SI.cs
@@ -1881,6 +1881,7 @@ namespace TUGraz.VectoCommon.Utils
 		/// <param name="si">The si.</param>
 		/// <param name="tolerance">The tolerance.</param>
 		/// <returns></returns>
+		[DebuggerStepThrough]
 		public bool IsSmallerOrEqual(SI si, SI tolerance = null)
 		{
 			if (!HasEqualUnit(si)) {
diff --git a/VectoCommon/VectoCommon/Utils/Validation.cs b/VectoCommon/VectoCommon/Utils/Validation.cs
index ebfe5f6b5d21df369c3ba563e091211e249aaae4..459464c82f3e244205c5aa11c0231682ccc1ce05 100644
--- a/VectoCommon/VectoCommon/Utils/Validation.cs
+++ b/VectoCommon/VectoCommon/Utils/Validation.cs
@@ -206,8 +206,7 @@ namespace TUGraz.VectoCommon.Utils
 								if (kvResults.Any()) {
 									return new ValidationResult(
 										string.Format("{1}[{0}] in {1} invalid: {2}", valueType.GetProperty("Key").GetValue(element),
-											validationContext.DisplayName,
-											string.Join("\n", kvResults)));
+											validationContext.DisplayName, kvResults.Join("\n")));
 								}
 							}
 						}
@@ -215,8 +214,7 @@ namespace TUGraz.VectoCommon.Utils
 						var results = element.Validate(mode, jobType, emPos, gbxType, isEmsCycle);
 						if (results.Any()) {
 							return new ValidationResult(
-								string.Format("{1}[{0}] in {1} invalid: {2}", i, validationContext.DisplayName,
-									string.Join("\n", results)));
+								$"{validationContext.DisplayName}[{i}] in {validationContext.DisplayName} invalid: {results.Join("\n")}");
 						}
 					}
 					i++;
@@ -226,12 +224,12 @@ namespace TUGraz.VectoCommon.Utils
 				if (!results.Any()) {
 					return ValidationResult.Success;
 				}
-				var messages = results.Select(r => String.Join(", ", r.MemberNames.Distinct()));
+				var messages = results.Select(r => r.MemberNames.Distinct().Join());
 				if (validationContext.MemberName == "Container" || validationContext.MemberName == "RunData") {
-					return new ValidationResult(string.Join("\n", results), messages);
+					return new ValidationResult(results.Join("\n"), messages);
 				}
 				return new ValidationResult(
-					$"{{{validationContext.DisplayName}}} invalid: {string.Join("\n", results)}", messages);
+					$"{{{validationContext.DisplayName}}} invalid: {results.Join("\n")}", messages);
 			}
 
 			return ValidationResult.Success;
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Common/AbstractXMLType.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Common/AbstractXMLType.cs
index 9d38cd19524c8f11fb0e9f269bca4ed9c60a2c97..a4c38f960ef474cdf54032b579a02c0b1a333960 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Common/AbstractXMLType.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Common/AbstractXMLType.cs
@@ -83,7 +83,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Common {
 			var node = GetNode(nodePath, required: fallbackValue == null);
 
 			if (node == null && fallbackValue == null) {
-				throw new VectoException("Node {0} not found in input data", string.Join("/", nodePath));
+				throw new VectoException("Node {0} not found in input data", nodePath.Join("/"));
 			}
 
 			return node?.InnerText.ToDouble() ?? fallbackValue.Value;
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationEngineDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationEngineDataProvider.cs
index 933c79281c63f3b2dc2819ab5db2e336505ccffc..2fd94d18f454dedbceda1186f149dff795b03804 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationEngineDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationEngineDataProvider.cs
@@ -110,7 +110,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 			public virtual FuelType FuelType
 			{
 				get {
-					var value = GetString(XMLNames.Engine_FuelType).Replace(" ","");
+					var value = GetString(XMLNames.Engine_FuelType).Replace(" ", "");
 					if ("LPG".Equals(value, StringComparison.InvariantCultureIgnoreCase)) {
 						return FuelType.LPGPI;
 					}
@@ -164,7 +164,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 		public XMLDeclarationEngineDataProviderV20(
 			IXMLDeclarationVehicleData vehicle, XmlNode componentNode, string sourceFile) : base(
-			vehicle, componentNode, sourceFile) { }
+			vehicle, componentNode, sourceFile)
+		{ }
 
 		protected override XNamespace SchemaNamespace => NAMESPACE_URI;
 	}
@@ -336,13 +337,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 					var missing = GetNodes(
 							new[] { XMLNames.Engine_FuelConsumptionMap, XMLNames.Engine_FuelConsumptionMap_Entry }, whrFuelNode)
 						.Cast<XmlNode>().Where(x => x.Attributes?[fcMapAttr] == null);
-					throw new VectoException(
-						"WHRData has to be provided for every entry in the FC-Map! {0}",
-						string.Join(
-							"; ",
-							missing.Select(
-								x => $"n: {x.Attributes?[XMLNames.Engine_FuelConsumptionMap_EngineSpeed_Attr]?.Value}, " +
-									$"T: {x.Attributes?[XMLNames.Engine_FuelConsumptionMap_Torque_Attr]?.Value}")));
+					throw new VectoException("WHRData has to be provided for every entry in the FC-Map! {0}",
+						missing.Select(x => $"n: {x.Attributes?[XMLNames.Engine_FuelConsumptionMap_EngineSpeed_Attr]?.Value}, " +
+											$"T: {x.Attributes?[XMLNames.Engine_FuelConsumptionMap_Torque_Attr]?.Value}").Join("; "));
 				}
 
 				if (correctionFactorNodes[0].ParentNode.ParentNode != whrFuelNode) {
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/AccelerationCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/AccelerationCurveReader.cs
index 3ffb4833610ebd675f36fe776bd89c3b8601aea3..3040a8b49aea54b2f575786d7acc2888976e4b6d 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/AccelerationCurveReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/AccelerationCurveReader.cs
@@ -73,11 +73,12 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 			if (HeaderIsValid(data.Columns)) {
 				return CreateFromColumnNames(data);
 			}
-			LoggingObject.Logger<AccelerationCurveData>()
-				.Warn("Acceleration Curve: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: {3}",
-					Fields.Velocity, Fields.Acceleration,
-					Fields.Deceleration,
-					string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+			LoggingObject.Logger<AccelerationCurveData>().Warn(
+				"Acceleration Curve: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: {3}. Falling back to column index.",
+				Fields.Velocity, 
+				Fields.Acceleration,
+				Fields.Deceleration,
+				data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 			return CreateFromColumnIndizes(data);
 		}
 
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/ActuationsMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/ActuationsMapReader.cs
index d4ada09049eedb141632363a38c8b278f9ccb2cf..150243d53db7a24e56afd37945a8709e7378117a 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/ActuationsMapReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/ActuationsMapReader.cs
@@ -31,8 +31,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 		{
 			if (!HeaderIsValid(data.Columns)) {
 				throw new VectoException("Invalid header for pneumatic actuations. expected: {0}, got: {1}",
-					string.Join(", ", Header),
-					string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+					Header.Join(), data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 			}
 
 			var retVal = new Dictionary<MissionType, IActuations>();
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/AlternatorReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/AlternatorReader.cs
index 7919b1bd19d0a85bcfb5caba3f58b4634bcbdc87..e9108102edccf2d4a462b24c8e4d61402ee36c6b 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/AlternatorReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/AlternatorReader.cs
@@ -76,7 +76,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 			if (g.Any(x => x.Count() < 2)) {
 				throw new ArgumentException(
 					"Insufficient rows in csv to build a usable map for alternator {0}",
-					string.Join(", ", g.Where(x => x.Count() < 2).Select(x => x.Key)));
+					g.Where(x => x.Count() < 2).Select(x => x.Key).Join());
 			}
 			return new CombinedAlternator(map, source);
 		}
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/BatteryInternalResistanceReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/BatteryInternalResistanceReader.cs
index 51f34949584695a0cb0fdb0afe60a6ff6153f924..6c765c12bcb531232c4a8d9325dfca8e7a91bebf 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/BatteryInternalResistanceReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/BatteryInternalResistanceReader.cs
@@ -27,12 +27,13 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 
 			if (data.Columns.Count == 2) {
 				if (!data.Columns.Contains(Fields.StateOfCharge) || !data.Columns.Contains(Fields.InternalResistance)) {
-					data.Columns[0].ColumnName = Fields.StateOfCharge;
-					data.Columns[1].ColumnName = Fields.InternalResistance;
 					LoggingObject.Logger<InternalResistanceMap>().Warn(
 						"Internal Resistance Map Header is invalid. Expected: '{0}, {1}', Got: '{2}'. Falling back to column index.",
-						Fields.StateOfCharge, Fields.InternalResistance,
-						string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+						Fields.StateOfCharge, 
+						Fields.InternalResistance,
+						data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
+					data.Columns[0].ColumnName = Fields.StateOfCharge;
+					data.Columns[1].ColumnName = Fields.InternalResistance;
 				}
 
 				return new InternalResistanceMap(data.Rows.Cast<DataRow>().Select(row => {
@@ -78,8 +79,8 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 				}
 				LoggingObject.Logger<InternalResistanceMap>().Warn(
 					"Internal Resistance Map Header is invalid. Expected: '{0}', Got: '{1}'. Falling back to column index.",
-					string.Join(", ", col1.Select(x => x.Item2)),
-					string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+					col1.Select(x => x.Item2).Join(),
+					data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 			}
 
 			
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/BatteryMaxCurrentReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/BatteryMaxCurrentReader.cs
index 5747491d5a31f6057510232f28f0b3051fcafd7a..612baa24643cb1b85945ac6619705acae9960117 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/BatteryMaxCurrentReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/BatteryMaxCurrentReader.cs
@@ -22,11 +22,15 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 			}
 
 			if (!data.Columns.Contains(Fields.StateOfCharge) || !data.Columns.Contains(Fields.MaxDischargeCurrent) || !data.Columns.Contains(Fields.MaxChargeCurrent)) {
+				LoggingObject.Logger<InternalResistanceMap>().Warn(
+					"Max Current  Map Header is invalid. Expected: '{0}, {1}, {2}', Got: '{3}'. Falling back to column index.",
+					Fields.StateOfCharge,
+					Fields.MaxChargeCurrent,
+					Fields.MaxDischargeCurrent,
+					data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 				data.Columns[0].ColumnName = Fields.StateOfCharge;
 				data.Columns[1].ColumnName = Fields.MaxChargeCurrent;
 				data.Columns[2].ColumnName = Fields.MaxDischargeCurrent;
-				LoggingObject.Logger<InternalResistanceMap>().Warn("Max Current  Map Header is invalid. Expected: '{0}, {1}, {2}', Got: '{3}'. Falling back to column index.",
-					Fields.StateOfCharge, Fields.MaxChargeCurrent, Fields.MaxDischargeCurrent, string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
 			}
 			return new MaxCurrentMap(data.Rows.Cast<DataRow>().Select(row => new MaxCurrentMap.MaxCurrentEntry() {
 				SoC = row.ParseDouble(Fields.StateOfCharge) / 100,
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/BatterySOCReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/BatterySOCReader.cs
index 3c6f5bd0159d49a882e0daa5110fe439a320df7b..ac3b230f9ed4ad3710a0cc62dbfce276a1595ebc 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/BatterySOCReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/BatterySOCReader.cs
@@ -30,8 +30,11 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData {
 			{
 				data.Columns[0].ColumnName = Fields.StateOfCharge;
 				data.Columns[1].ColumnName = Fields.BatteryVoltage;
-				LoggingObject.Logger<SOCMap>().Warn("SoC-Map Header is invalid. Expected: '{0}, {1}', Got: '{2}'. Falling back to column index.",
-					Fields.StateOfCharge, Fields.BatteryVoltage, string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+				LoggingObject.Logger<SOCMap>().Warn(
+					"SoC-Map Header is invalid. Expected: '{0}, {1}', Got: '{2}'. Falling back to column index.",
+					Fields.StateOfCharge, 
+					Fields.BatteryVoltage,
+					data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 			}
 			return new SOCMap(data.Rows.Cast<DataRow>().Select(row => new SOCMap.SOCMapEntry
 			{
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/CompressorMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/CompressorMapReader.cs
index 93e7c02fdd71d1ad678047abbbb770c3af85847d..98ff4d9dcc5eec61c850de7ff9a9debcfa9cae14 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/CompressorMapReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/CompressorMapReader.cs
@@ -12,7 +12,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 {
 	public class CompressorMapReader
 	{
-		public static readonly string[] Header = new[] { Fields.RPM, Fields.FlowRate, Fields.PowerOn, Fields.PowerOff };
+		public static readonly string[] Header = { Fields.RPM, Fields.FlowRate, Fields.PowerOn, Fields.PowerOff };
 
 		public static ICompressorMap ReadFile(string filename, double dragCurveFactorClutch, string technology)
 		{
@@ -27,10 +27,9 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 		public static IList<CompressorMapValues> Create(DataTable data, double dragCurveFactorClutch)
 		{
 			if (!HeaderIsValid(data.Columns)) {
-				throw new VectoException(
-					"Invalid column header. expected: {0}, got: {1}", 
-					string.Join(", ", data.Columns.Cast<DataColumn>().Select(x => x.ColumnName)),
-					string.Join(", ", Header));
+				throw new VectoException("Invalid column header. Expected: {0}, Got: {1}",
+					Header.Join(),
+					data.Columns.Cast<DataColumn>().Select(x => x.ColumnName).Join());
 			}
 
 			if (data.Rows.Count < 3) {
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/CrossWindCorrectionCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/CrossWindCorrectionCurveReader.cs
index 3766144203e7c82c60d98263abbe8c9b6f31f1bc..0fc60b969a0ec19bb9f8993c169983612daf6074 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/CrossWindCorrectionCurveReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/CrossWindCorrectionCurveReader.cs
@@ -100,8 +100,9 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 			}
 			LogManager.GetLogger(typeof(CrossWindCorrectionCurveReader).FullName).Warn(
 				"Crosswind correction file: Header line is not valid. Expected: '{0}, {1}', Got: '{2}'. Falling back to column index.",
-				FieldsSpeedDependent.Velocity, FieldsSpeedDependent.Cd,
-				string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Reverse()));
+				FieldsSpeedDependent.Velocity, 
+				FieldsSpeedDependent.Cd,
+				data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 			return ParseSpeedDependentFromColumnIndizes(data, aerodynamicDragArea);
 		}
 
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/DrivingCycleDataReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/DrivingCycleDataReader.cs
index 0e902e94c8df2de7d716e25bda085dc62453dc7d..fad460b71b359dd74fe91657b3595b5fbf526057 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/DrivingCycleDataReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/DrivingCycleDataReader.cs
@@ -388,7 +388,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 				var diff = headerStr.GroupBy(c => c).Where(g => g.Count() > 2).SelectMany(g => g).ToList();
 				if (diff.Any()) {
 					if (throwExceptions) {
-						throw new VectoException("Column(s) defined more than once: " + string.Join(", ", diff.OrderBy(x => x)));
+						throw new VectoException($"Column(s) defined more than once: {diff.OrderBy(x => x).Join()}");
 					}
 
 					return false;
@@ -401,7 +401,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 				diff = headerStr.Except(allowedCols.Select(x => x.ToLowerInvariant())).ToList();
 				if (diff.Any()) {
 					if (throwExceptions) {
-						throw new VectoException("Column(s) not allowed: " + string.Join(", ", diff));
+						throw new VectoException($"Column(s) not allowed: {diff.Join()}");
 					}
 
 					return false;
@@ -410,7 +410,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 				diff = requiredCols.Select(x => x.ToLowerInvariant()).Except(headerStr).ToList();
 				if (diff.Any()) {
 					if (throwExceptions) {
-						throw new VectoException("Column(s) required: " + string.Join(", ", diff));
+						throw new VectoException($"Column(s) required: {diff.Join()}");
 					}
 
 					return false;
@@ -427,7 +427,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 
 				if (colCount != 0 && colCount != cols.Length) {
 					if (throwExceptions) {
-						throw new VectoException("Either all columns have to be defined or none of them: {0}", string.Join(", ", cols));
+						throw new VectoException("Either all columns have to be defined or none of them: {0}", cols.Join());
 					}
 
 					return false;
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricConsumerReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricConsumerReader.cs
index 5e8bb8f525d361054e6f1a1c5352dc0c23f725d6..adf8c13612a9f96851fa5c3ee47f3ff2d519ff0f 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricConsumerReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricConsumerReader.cs
@@ -28,14 +28,14 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 		public static ElectricalConsumerList Create(TableData data)
 		{
 			if (!HeaderValid(data.Columns)) {
-				throw new VectoException("Invalid header. Expected: {0}, got: {1}",
-					string.Join(", ", Header),
-					string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+				throw new VectoException("Invalid header. Expected: {0}, Got: {1}",
+					Header.Join(),
+					data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 			}
 
 			var retVal = new List<ElectricalConsumer>();
 			foreach (DataRow row in data.Rows) {
-				var consumer = new ElectricalConsumer() {
+				var consumer = new ElectricalConsumer {
 					Category = row.Field<string>(Fields.Category),
 					ConsumerName = row.Field<string>(Fields.Consumer),
 					BaseVehicle = row.ParseBoolean(Fields.BaseVehicle),
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorMapReader.cs
index abff89457f51f871ee566d57f1e3d8bcc81f0afd..7b819b5d8a8deb2ef6724dfbc58c88fd5b2c6bed 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorMapReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorMapReader.cs
@@ -24,9 +24,11 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData {
 			if (!headerValid)
 			{
 				LoggingObject.Logger<FuelConsumptionMap>().Warn(
-					"Efficiencymap: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: {3}",
-					Fields.MotorSpeed, Fields.Torque, Fields.PowerElectrical,
-					string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+					"Efficiency Map: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: {3}. Falling back to column index.",
+					Fields.MotorSpeed, 
+					Fields.Torque, 
+					Fields.PowerElectrical,
+					data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 				data.Columns[0].ColumnName = Fields.MotorSpeed;
 				data.Columns[1].ColumnName = Fields.Torque;
 				data.Columns[2].ColumnName = Fields.PowerElectrical;
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/EnvironmentalContidionsMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/EnvironmentalContidionsMapReader.cs
index f7dd3ee0922a8a6cece5b3dcd544b8e627fc8732..ee81cf6cdd239abccca46b1f0b31953d1957bbae 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/EnvironmentalContidionsMapReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/EnvironmentalContidionsMapReader.cs
@@ -39,9 +39,9 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 
 			if (!HeaderIsValid(data.Columns)) {
 				throw new VectoException(
-					"Invalid Header for environmental conditions. Got: {0}, expected: {1}",
-					string.Join(", ", data.Columns.Cast<DataColumn>().Select(x => x.ColumnName)), 
-					string.Join(", ", Header));
+					"Invalid Header for environmental conditions. Expected: {0}, Got: {1}",
+					Header.Join(),
+					data.Columns.Cast<DataColumn>().Select(x => x.ColumnName).Join());
 			}
 
 			foreach (DataRow row in data.Rows) {
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/FuelConsumptionMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/FuelConsumptionMapReader.cs
index 19690eae244a46f6e4f7c0ae845f13798d0d1775..812dd6ad5445781fc6458fc8a86def7274515a54 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/FuelConsumptionMapReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/FuelConsumptionMapReader.cs
@@ -69,9 +69,11 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 			var headerValid = HeaderIsValid(data.Columns);
 			if (!headerValid) {
 				LoggingObject.Logger<FuelConsumptionMap>().Warn(
-					"FuelConsumptionMap: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: {3}",
-					Fields.EngineSpeed, Fields.Torque, Fields.FuelConsumption,
-					string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+					"FuelConsumptionMap: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: {3}. Falling back to column index.",
+					Fields.EngineSpeed, 
+					Fields.Torque, 
+					Fields.FuelConsumption,
+					data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 			}
 			var delaunayMap = new DelaunayMap("FuelConsumptionMap");
 
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/FullLoadCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/FullLoadCurveReader.cs
index 9f6550bb27fe0b3f41e703459a2031708798fa61..f816b8fdbb624e17bd3e315c6b8bc7db20187b4b 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/FullLoadCurveReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/FullLoadCurveReader.cs
@@ -71,8 +71,10 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 			} else {
 				LoggingObject.Logger<EngineFullLoadCurve>().Warn(
 					"FullLoadCurve: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: '{3}'. Falling back to column index.",
-					Fields.EngineSpeed, Fields.TorqueFullLoad,
-					Fields.TorqueDrag, string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+					Fields.EngineSpeed, 
+					Fields.TorqueFullLoad,
+					Fields.TorqueDrag, 
+					data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 
 				entriesFld = CreateFromColumnIndizes(data);
 			}
@@ -88,7 +90,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 										.Select(g => g.Key).ToList();
 			if (duplicates.Count > 0) {
 				throw new VectoException(
-					"Error reading full-load curve: multiple entries for engine speeds {0}", string.Join(", ", duplicates));
+					"Error reading full-load curve: multiple entries for engine speeds {0}", duplicates.Join());
 			}
 			return new EngineFullLoadCurve(entriesFld, tmp);
 		}
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/PTOIdleLossMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/PTOIdleLossMapReader.cs
index 074d41cad997ac52c4942fa3a5940faacdb387e3..e6f051bc78a337c81934fc0635384f8f02aaf11c 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/PTOIdleLossMapReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/PTOIdleLossMapReader.cs
@@ -68,11 +68,13 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 			}
 
 			if (!(data.Columns.Contains(Fields.EngineSpeed) && data.Columns.Contains(Fields.PTOTorque))) {
-				data.Columns[0].ColumnName = Fields.EngineSpeed;
-				data.Columns[1].ColumnName = Fields.PTOTorque;
 				LoggingObject.Logger<RetarderLossMap>().Warn(
 					"PTO Idle LossMap: Header Line is not valid. Expected: '{0}, {1}', Got: '{2}'. Falling back to column index.",
-					Fields.EngineSpeed, Fields.PTOTorque, string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+					Fields.EngineSpeed, 
+					Fields.PTOTorque, 
+					data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
+				data.Columns[0].ColumnName = Fields.EngineSpeed;
+				data.Columns[1].ColumnName = Fields.PTOTorque;
 			}
 
 			return new PTOLossMap(data.Rows.Cast<DataRow>()
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/RetarderLossMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/RetarderLossMapReader.cs
index 5848389660ff5ced3be6c11495f71ecc7838dca1..b4f60d00680a1aad33d832321e46afcfe73eb741 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/RetarderLossMapReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/RetarderLossMapReader.cs
@@ -69,12 +69,13 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 			}
 
 			if (!data.Columns.Contains(Fields.RetarderSpeed) || !data.Columns.Contains(Fields.TorqueLoss)) {
-				data.Columns[0].ColumnName = Fields.RetarderSpeed;
-				data.Columns[1].ColumnName = Fields.TorqueLoss;
 				LoggingObject.Logger<RetarderLossMap>().Warn(
 					"RetarderLossMap: Header Line is not valid. Expected: '{0}, {1}', Got: '{2}'. Falling back to column index.",
-					Fields.RetarderSpeed, Fields.TorqueLoss,
-					string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+					Fields.RetarderSpeed,
+					Fields.TorqueLoss,
+					data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
+				data.Columns[0].ColumnName = Fields.RetarderSpeed;
+				data.Columns[1].ColumnName = Fields.TorqueLoss;
 			}
 
 			return new RetarderLossMap(data.Rows.Cast<DataRow>()
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/SSMTechnologiesReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/SSMTechnologiesReader.cs
index 6e9cc83ea5d9a43a5fdfc56f7604a1e2a1eca2b4..ace65ad980bb95ed67a27576129dfee528a66ceb 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/SSMTechnologiesReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/SSMTechnologiesReader.cs
@@ -4,6 +4,7 @@ using System.IO;
 using System.Linq;
 using TUGraz.VectoCommon.BusAuxiliaries;
 using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Utils;
@@ -34,9 +35,9 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 		public static List<SSMTechnology> Create(DataTable data, string fileName)
 		{
 			if (!HeaderIsValid(data.Columns)) {
-				throw new VectoException("invalid header for techlist file. expected: {0} got: {1}",
-					string.Join(", ", headerCols), string.Join(", ",  data.Columns)
-					);
+				throw new VectoException("invalid header for techlist file. Expected: {0}, Got: {1}",
+					headerCols.Join(),
+					data.Columns.Cast<DataColumn>().Join());
 			}
 
 			var retVal = new List<SSMTechnology>();
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/ShiftPolygonReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/ShiftPolygonReader.cs
index 63c2d717513f6ec3a00d197ad798ff4a241bb096..0d79e0f3ba4aab9b79002e779bb4260eb2f046a6 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/ShiftPolygonReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/ShiftPolygonReader.cs
@@ -68,11 +68,12 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 				entriesDown = CreateFromColumnNames(data, Fields.AngularSpeedDown);
 				entriesUp = CreateFromColumnNames(data, Fields.AngularSpeedUp);
 			} else {
-				LoggingObject.Logger<ShiftPolygon>()
-					.Warn(
+				LoggingObject.Logger<ShiftPolygon>().Warn(
 						"ShiftPolygon: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: '{3}'. Falling back to column index",
-						Fields.Torque, Fields.AngularSpeedUp, Fields.AngularSpeedDown,
-						string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Reverse()));
+						Fields.Torque, 
+						Fields.AngularSpeedUp, 
+						Fields.AngularSpeedDown,
+						data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 				entriesDown = CreateFromColumnIndizes(data, 1);
 				entriesUp = CreateFromColumnIndizes(data, 2);
 			}
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/TransmissionLossMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/TransmissionLossMapReader.cs
index 286ab73ae4ff11bc658be6f349f0a6a8075f0eb0..e96fb5094ab019dba56d89aee0c4fff71b6cbbd0 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/TransmissionLossMapReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/TransmissionLossMapReader.cs
@@ -78,9 +78,12 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 				entries = CreateFromColumnNames(data);
 			} else {
 				LoggingObject.Logger<TransmissionLossMap>().Warn(
-					"TransmissionLossMap {5}: Header line is not valid. Expected: '{0}, {1}, {2}'. Got: '{4}'. Falling back to column index.",
-					Fields.InputSpeed, Fields.InputTorque, Fields.TorqeLoss,
-					string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Reverse()), gearName);
+					"TransmissionLossMap {0}: Header line is not valid. Expected: '{1}, {2}, {3}'. Got: '{4}'. Falling back to column index.",
+					gearName,
+					Fields.InputSpeed,
+					Fields.InputTorque,
+					Fields.TorqeLoss,
+					data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 
 				entries = CreateFromColumIndizes(data);
 			}
@@ -105,9 +108,12 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 			List<TransmissionLossMap.GearLossMapEntry> entries;
 			if (!HeaderIsValid(data.Columns)) {
 				LoggingObject.Logger<TransmissionLossMap>().Warn(
-					"TransmissionLossMap {5}: Header line is not valid. Expected: '{0}, {1}, {2}'. Got: '{4}'. Falling back to column index.",
-					Fields.InputSpeed, Fields.InputTorque, Fields.TorqeLoss,
-					string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Reverse()), gearName);
+					"TransmissionLossMap {0}: Header line is not valid. Expected: '{1}, {2}, {3}'. Got: '{4}'. Falling back to column index.",
+					gearName,
+					Fields.InputSpeed, 
+					Fields.InputTorque, 
+					Fields.TorqeLoss,
+					data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 
 				data.Columns[0].ColumnName = Fields.InputSpeed;
 				data.Columns[1].ColumnName = Fields.InputTorque;
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/WHRPowerReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/WHRPowerReader.cs
index a917796dda0b4ed14896bbf1ca501e5e848a6ec9..b3d870fe0f9e2cac82645237cbb7fc64b5d67e2b 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/WHRPowerReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/WHRPowerReader.cs
@@ -41,13 +41,15 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 			if (!headerValid) {
 				LoggingObject.Logger<FuelConsumptionMap>().Warn(
 					"WHRMap: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: {3}",
-					Fields.EngineSpeed, Fields.Torque, Fields.ElectricPower,
-					string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+					Fields.EngineSpeed, 
+					Fields.Torque, 
+					Fields.ElectricPower,
+					data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 			}
 
 			// todo mk-2021-08-26 this check is redundant. Previous code would have thrown exception otherwise.
 			if (!headerValid && (type == WHRType.ElectricalOutput || type == WHRType.MechanicalOutputDrivetrain)) {
-				throw new VectoException("expected column headers: {0}", string.Join(", ", whrColumn));
+				throw new VectoException("expected column headers: {0}", whrColumn.Join());
 			}
 
 			if (!headerValid) {
diff --git a/VectoCore/VectoCore/InputData/Reader/ShiftStrategy/LookupDataReader.cs b/VectoCore/VectoCore/InputData/Reader/ShiftStrategy/LookupDataReader.cs
index 740fdf4e864631498abbf293870305a41583dd39..debcb09b169c3f75d64405226489744d51d27070 100644
--- a/VectoCore/VectoCore/InputData/Reader/ShiftStrategy/LookupDataReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ShiftStrategy/LookupDataReader.cs
@@ -5,6 +5,7 @@ using System.Linq;
 using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
 
 namespace TUGraz.VectoCore.InputData.Reader.ShiftStrategy
 {
@@ -33,10 +34,10 @@ namespace TUGraz.VectoCore.InputData.Reader.ShiftStrategy
 
 			if (!HeaderIsValid(data.Columns)) {
 				LoggingObject.Logger<ShareIdleLowLookup>().Warn(
-					"{0} lookup: header line is not valid. Expected: '{1}', Got: {2}",
+					"{0} lookup: Header line is not valid. Expected: '{1}', Got: {2}",
 					_name,
-					string.Join(", ", _columns),
-					string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+					_columns.Join(),
+					data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Join());
 				for (var i = 0; i < Math.Min(_columns.Length, data.Columns.Count); i++) {
 					data.Columns[i].Caption = _columns[i];
 				}
diff --git a/VectoCore/VectoCore/Models/Connector/Ports/Impl/BatteryResponse.cs b/VectoCore/VectoCore/Models/Connector/Ports/Impl/BatteryResponse.cs
index 9c9675d60b1d65d6307e275f1fb3efd95b45a7c0..a64d9ad9801f8d15824061f93ee3f7d9f6a1b76f 100644
--- a/VectoCore/VectoCore/Models/Connector/Ports/Impl/BatteryResponse.cs
+++ b/VectoCore/VectoCore/Models/Connector/Ports/Impl/BatteryResponse.cs
@@ -89,7 +89,7 @@ namespace TUGraz.VectoCore.Models.Connector.Ports.Impl
 		public override string ToString()
 		{
 			var t = GetType();
-			return $"{t.Name}{{{string.Join(", ", t.GetProperties().Select(p => $"{p.Name}: {p.GetValue(this)}"))}}}";
+			return $"{t.Name}{{{t.GetProperties().Select(p => $"{p.Name}: {p.GetValue(this)}").Join()}}}";
 		}
 	}
 
diff --git a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs
index ab6c8ffcfd41a629788dcaddc54fc12d683463b1..1953ba8a193cfd6baa92efef29ea02fc21dee929 100644
--- a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs
+++ b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs
@@ -110,7 +110,7 @@ namespace TUGraz.VectoCore.Models.Connector.Ports.Impl
 		public override string ToString()
 		{
 			var t = GetType();
-			return $"{t.Name}{{{string.Join(", ", t.GetProperties().Select(p => $"{p.Name}: {p.GetValue(this)}"))}}}";
+			return $"{t.Name}{{{t.GetProperties().Select(p => $"{p.Name}: {p.GetValue(this)}").Join()}}}";
 		}
 	}
 
diff --git a/VectoCore/VectoCore/Models/Declaration/WeightingGroups.cs b/VectoCore/VectoCore/Models/Declaration/WeightingGroups.cs
index c09199e027e0fb5a16f8f903691317649ac5e718..ba02d6eb54d14f50e44b1380da8dd994d2d0579f 100644
--- a/VectoCore/VectoCore/Models/Declaration/WeightingGroups.cs
+++ b/VectoCore/VectoCore/Models/Declaration/WeightingGroups.cs
@@ -99,7 +99,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 				case WeightingGroup.Group9LH:
 				case WeightingGroup.Group10RD:
 				case WeightingGroup.Group10LH:
-					return string.Join("-", Regex.Split(group.ToString().Replace(Prefix, ""), @"(\d+|\w+)").Where(x => !string.IsNullOrWhiteSpace(x)));
+					return Regex.Split(group.ToString().Replace(Prefix, ""), @"(\d+|\w+)").Where(x => !string.IsNullOrWhiteSpace(x)).Join("-");
 				default:
 					return Constants.NOT_AVAILABLE;
 			}
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PCCSegmentPreprocessor.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PCCSegmentPreprocessor.cs
index 0362e869ec363b4d9153af13a857cd7d87522825..fa963140e55e0e9b7c89840e8bdcd8a7592f2877 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/PCCSegmentPreprocessor.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/PCCSegmentPreprocessor.cs
@@ -34,7 +34,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 			var preProcessor = new PCCEcoRollEngineStopPreprocessor(Container, slopes, PCCDriverData.MinSpeed, maxSpeed);
 			preProcessor.RunPreprocessing();
 
-			DebugWriteLine("Slopes:\n" + string.Join("\n", slopes.Select(p => $"{p.Key.AsKmph:F}\t{p.Value.ToInclinationPercent():P}")));
+			DebugWriteLine($"Slopes:\n{slopes.Select(p => $"{p.Key.AsKmph:F}\t{p.Value.ToInclinationPercent():P}").Join("\n")}");
 
 			var runData = Container.RunData;
 
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
index a92f711d82288a5ce7eb467fdef8c9869d42b514..6b902d12c2bccb46d3e3fcf0cec2ec38fc8122ec 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
@@ -288,7 +288,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 			var validationErrors = run.Validate(_mode, jobType, emPosition, gearboxtype, isEms);
 			if (validationErrors.Any()) {
 				throw new VectoException("Validation of Run-Data Failed: " +
-										string.Join("\n", validationErrors.Select(r => r.ErrorMessage + string.Join("; ", r.MemberNames))));
+										$"{validationErrors.Select(r => r.ErrorMessage + r.MemberNames.Join("; ")).Join("\n")}");
 			}
 		}
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/AccelerationCurve.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/AccelerationCurve.cs
index 784b775cc30020e7c5ae10b567035a5997d42a51..6807e36b06539670cb2518fc5241481f5d245eb5 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/AccelerationCurve.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/AccelerationCurve.cs
@@ -49,7 +49,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 			if (smallValues.Count >= 2) {
 				Log.Error(
 					"Found small velocity entries in Driver-Acceleration/Deceleration file. Values dismissed:" +
-					string.Join(", ", smallValues.Skip(1).Select(e => e.Key.AsKmph.ToString("F1"))));
+					smallValues.Skip(1).Select(e => e.Key.AsKmph.ToString("F1")).Join());
 				foreach (var kv in smallValues.Skip(1)) {
 					_entries.Remove(kv);
 				}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
index 6721ea509c6da27e9585a537570474ca52e11480..84fda24b282d73e4525dce8d03c7d8a5cc033a21 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
@@ -83,7 +83,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			EngineInertia = dataBus.RunData.EngineData?.Inertia ?? 0.SI<KilogramSquareMeter>();
 
 			if (Gears.Any(x => !x.TorqueConverterLocked.HasValue)) {
-				throw new VectoException("Gear list must have TC info for all gears! {0}", string.Join(", ", Gears));
+				throw new VectoException("Gear list must have TC info for all gears! {0}", Gears.Join());
 			}
 
 			MaxStartGear = Gears.Any() ? Gears.First() : new GearshiftPosition(0);
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatterySystem.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatterySystem.cs
index 8ea633a720e7c4af99780591fb4075cf72cc0747..638a043f1ae2cf4dfda8118b28d417ad9abd53bd 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatterySystem.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatterySystem.cs
@@ -283,7 +283,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				}
 
 				if (limitBB.Count > 0) {
-					Log.Debug($"BB ${string.Join(", ", limitBB.Keys)} are at max - recalculating power distribution");
+					Log.Debug($"BB ${limitBB.Keys.Join()} are at max - recalculating power distribution");
 				}
 			} while (!(distributedPower + (limitBB.Sum(x => x.Value) ?? 0.SI<Watt>())) .IsEqual(powerDemand, 1e-3.SI<Watt>()));
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs
index ce2a7da88666c6ae658a157ebcdc022529a64c97..48c59fab359ce6f5212f3a813dcf3379e827a8c9 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs
@@ -248,6 +248,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				// electric motor is directly connected to the ICE, ICE is off and EM is off - do not apply drag loss
 				emTorqueDt = 0.SI<NewtonMeter>();
 				emTorque = 0.SI<NewtonMeter>();
+				emOff = true;
 			}
 
 			if (ElectricPower == null || emTorqueDt == null) {
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
index 9f589092627cd34367acfef13b210fc5ccb2fc93..ca16d4e0ebd3dd34274b37e2c261f51dd0638af7 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
@@ -1191,6 +1191,22 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 					return;
 				}
 
+				var iceOn = DataBus.EngineInfo.EngineOn;
+				// if Hybrid P1 and Engine is off, the search for braking power is not possible:
+				// Therefore, switch on engine (if reasonable), otherwise simply do NOT search for mechanicalAssistPower.
+				if (emPos == PowertrainPosition.HybridP1 && !DataBus.EngineCtl.CombustionEngineOn) {
+					
+					var gearboxOut = firstResponse.Gearbox.OutputSpeed * firstResponse.Gearbox.OutputTorque;
+					var elMotor = DataBus.ElectricMotorInfo(PowertrainPosition.HybridP1);
+					var powerToleranceEl = 0.1 * elMotor.MaxPowerDrive(DataBus.BatteryInfo.InternalVoltage, firstResponse.Engine.EngineSpeed);
+					if (gearboxOut - firstResponse.Engine.DragPower < powerToleranceEl) {
+						DataBus.EngineCtl.CombustionEngineOn = true;
+						iceOn = true;
+					} else {
+						return;
+					}
+				}
+
 				// full recuperation is not possible - ICE would need to propel - search max possible EM torque
 				var emRecuperationTq = SearchAlgorithm.Search(
 					maxRecuperationResponse.ElectricMotor.ElectricMotorPowerMech /
@@ -1208,7 +1224,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 					},
 					evaluateFunction: emTq => {
 						var cfg = new HybridStrategyResponse {
-							CombustionEngineOn = DataBus.EngineInfo.EngineOn,
+							CombustionEngineOn = iceOn,
 							GearboxInNeutral = false,
 							NextGear = nextGear,
 							MechanicalAssistPower = new Dictionary<PowertrainPosition, Tuple<PerSecond, NewtonMeter>> {
diff --git a/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs b/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs
index 20a91b0ce750e49ed4a248ff037b8031b0ca3743..105ef20864a38a9d55c5a4ffb864f2afdda48519 100644
--- a/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs
+++ b/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs
@@ -183,8 +183,8 @@ namespace TUGraz.VectoCore.OutputData
 				// case C3a
 				if (runData.ElectricMachinesData.Count != 1) {
 					throw new VectoException("exactly 1 electric machine is required. got {0} ({1})",
-						runData.ElectricMachinesData.Count,
-						string.Join(",", runData.ElectricMachinesData.Select(x => x.Item1.ToString())));
+						runData.ElectricMachinesData.Count, 
+						runData.ElectricMachinesData.Select(x => x.Item1.ToString()).Join());
 				}
 
 				var emPos = runData.ElectricMachinesData.First().Item1;
@@ -271,7 +271,7 @@ namespace TUGraz.VectoCore.OutputData
 					if (runData.ElectricMachinesData.Count != 1) {
 						throw new VectoException("exactly 1 electric machine is required. got {0} ({1})",
 							runData.ElectricMachinesData.Count,
-							string.Join(",", runData.ElectricMachinesData.Select(x => x.Item1.ToString())));
+							runData.ElectricMachinesData.Select(x => x.Item1.ToString()).Join());
 					}
 
 					var emPos = runData.ElectricMachinesData.First().Item1;
diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
index e130953fc92152f03d377cb13f2322b7b7a7cc0f..df08f06bdac90e5f2835dea3e933bd81061a76c2 100644
--- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
@@ -310,7 +310,7 @@ namespace TUGraz.VectoCore.OutputData
 				passengerCount = runData.VehicleData.PassengerCount;
 			}
 
-			row[Fields.VEHICLE_FUEL_TYPE] = string.Join(", ", modData.FuelData.Select(x => x.GetLabel()));
+			row[Fields.VEHICLE_FUEL_TYPE] = modData.FuelData.Select(x => x.GetLabel().Join());
 
 			var totalTime = modData.Duration;
 			row[Fields.TIME] = (ConvertedSI)totalTime;
@@ -347,7 +347,7 @@ namespace TUGraz.VectoCore.OutputData
 											fuel => modData.TimeIntegral<Kilogram>(modData.GetColumnName(fuel.FuelData, ModalResultField.FCWHTCc)) /
 													modData.TimeIntegral<Kilogram>(modData.GetColumnName(fuel.FuelData, ModalResultField.FCMap)))
 										.Select(dummy => (double)dummy).ToArray();
-				row[Fields.ENGINE_ACTUAL_CORRECTION_FACTOR] = string.Join(" / ", fuelsWhtc);
+				row[Fields.ENGINE_ACTUAL_CORRECTION_FACTOR] = fuelsWhtc.Join(" / ");
 			}
 
 			row[Fields.P_WHEEL_POS] = modData.PowerWheelPositive().ConvertToKiloWatt();
@@ -841,7 +841,7 @@ namespace TUGraz.VectoCore.OutputData
 			row[Fields.ENGINE_MANUFACTURER] = data.Manufacturer;
 			row[Fields.ENGINE_MODEL] = data.ModelName;
 			row[Fields.ENGINE_CERTIFICATION_NUMBER] = data.CertificationNumber;
-			row[Fields.ENGINE_FUEL_TYPE] = string.Join(" / ", data.Fuels.Select(x => x.FuelData.GetLabel()));
+			row[Fields.ENGINE_FUEL_TYPE] = data.Fuels.Select(x => x.FuelData.GetLabel()).Join(" / ");
 			row[Fields.ENGINE_RATED_POWER] = data.RatedPowerDeclared != null && data.RatedPowerDeclared > 0
 				? data.RatedPowerDeclared.ConvertToKiloWatt()
 				: data.FullLoadCurves[0].MaxPower.ConvertToKiloWatt();
@@ -851,12 +851,12 @@ namespace TUGraz.VectoCore.OutputData
 				: (ConvertedSI)data.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>();
 			row[Fields.ENGINE_DISPLACEMENT] = data.Displacement.ConvertToCubicCentiMeter();
 
-			row[Fields.ENGINE_WHTC_URBAN] = string.Join(" / ", data.Fuels.Select(x => x.WHTCUrban));
-			row[Fields.ENGINE_WHTC_RURAL] = string.Join(" / ", data.Fuels.Select(x => x.WHTCRural));
-			row[Fields.ENGINE_WHTC_MOTORWAY] = string.Join(" / ", data.Fuels.Select(x => x.WHTCMotorway));
-			row[Fields.ENGINE_BF_COLD_HOT] = string.Join(" / ", data.Fuels.Select(x => x.ColdHotCorrectionFactor));
-			row[Fields.ENGINE_CF_REG_PER] = string.Join(" / ", data.Fuels.Select(x => x.CorrectionFactorRegPer));
-			row[Fields.ENGINE_ACTUAL_CORRECTION_FACTOR] = string.Join(" / ", data.Fuels.Select(x => x.FuelConsumptionCorrectionFactor));
+			row[Fields.ENGINE_WHTC_URBAN] = data.Fuels.Select(x => x.WHTCUrban).Join(" / ");
+			row[Fields.ENGINE_WHTC_RURAL] = data.Fuels.Select(x => x.WHTCRural).Join(" / ");
+			row[Fields.ENGINE_WHTC_MOTORWAY] = data.Fuels.Select(x => x.WHTCMotorway).Join(" / ");
+			row[Fields.ENGINE_BF_COLD_HOT] = data.Fuels.Select(x => x.ColdHotCorrectionFactor).Join(" / ");
+			row[Fields.ENGINE_CF_REG_PER] = data.Fuels.Select(x => x.CorrectionFactorRegPer).Join(" / ");
+			row[Fields.ENGINE_ACTUAL_CORRECTION_FACTOR] = data.Fuels.Select(x => x.FuelConsumptionCorrectionFactor).Join(" / ");
 		}
 
 		private static void WriteAxleWheelsData(List<Axle> data, DataRow row)
@@ -914,7 +914,7 @@ namespace TUGraz.VectoCore.OutputData
 						col.SetOrdinal(Table.Columns[Fields.CARGO_VOLUME].Ordinal);
 					}
 
-				row[colName] = aux.Technology == null ? "" : string.Join("; ", aux.Technology);
+				row[colName] = aux.Technology == null ? "" : aux.Technology.Join("; ");
 			}
 
 			if (busAux == null) {
@@ -924,7 +924,7 @@ namespace TUGraz.VectoCore.OutputData
 			row[string.Format(Fields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.HeatingVentilationAirCondition)] =
 				busAux.SSMInputs is ISSMDeclarationInputs inputs ? inputs.HVACTechnology : "engineering mode";
 			row[string.Format(Fields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.ElectricSystem)] =
-				string.Join("/", busAux.ElectricalUserInputsConfig.AlternatorType.GetLabel());
+				busAux.ElectricalUserInputsConfig.AlternatorType.GetLabel().Join("/");
 			row[string.Format(Fields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.PneumaticSystem)] = runData.JobType == VectoSimulationJobType.BatteryElectricVehicle ? "-" :
 				busAux.PneumaticUserInputsConfig.CompressorMap.Technology;
 		}
diff --git a/VectoCore/VectoCore/OutputData/XML/Engineering/XMLEngineeringWriter.cs b/VectoCore/VectoCore/OutputData/XML/Engineering/XMLEngineeringWriter.cs
index 523c1d2bbdfc035be37483b20397a3920ee24eac..7a264233edcb4550215c763921976fdbc3a37e38 100644
--- a/VectoCore/VectoCore/OutputData/XML/Engineering/XMLEngineeringWriter.cs
+++ b/VectoCore/VectoCore/OutputData/XML/Engineering/XMLEngineeringWriter.cs
@@ -38,6 +38,7 @@ using Ninject;
 using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Resources;
+using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.OutputData.XML.Engineering.Factory;
 using TUGraz.VectoCore.OutputData.XML.Engineering.Interfaces;
 using TUGraz.VectoCore.Utils;
@@ -127,10 +128,8 @@ namespace TUGraz.VectoCore.OutputData.XML.Engineering
 		private XAttribute GetSchemaLocations()
 		{
 			var xsns = RegisterNamespace(XMLDefinitions.XML_SCHEMA_NAMESPACE);
-
-			return new XAttribute(
-				xsns + "schemaLocation",
-				string.Join(" ", NamespaceLocationMap.Where(x => _namespaces.ContainsKey(x.Key)).Select(x => $"{x.Key} {x.Value}")));
+			return new XAttribute(xsns + "schemaLocation", 
+				NamespaceLocationMap.Where(x => _namespaces.ContainsKey(x.Key)).Select(x => $"{x.Key} {x.Value}").Join(" "));
 		}
 
 		public WriterConfiguration Configuration { get; set; }
diff --git a/VectoCore/VectoCore/Utils/DataIntegrityHelper.cs b/VectoCore/VectoCore/Utils/DataIntegrityHelper.cs
index edc9e98a1ea4aa3be9d37ae88e47430358216b33..2c02bc0442bee3d7e835d49ce8aa47a8343e9a66 100644
--- a/VectoCore/VectoCore/Utils/DataIntegrityHelper.cs
+++ b/VectoCore/VectoCore/Utils/DataIntegrityHelper.cs
@@ -31,6 +31,7 @@
 
 using System.Security.Cryptography;
 using System.Text;
+using TUGraz.VectoCommon.Utils;
 
 namespace TUGraz.VectoCore.Utils
 {
@@ -38,8 +39,7 @@ namespace TUGraz.VectoCore.Utils
 	{
 		public static string ComputeDigestValue(string[] lines)
 		{
-			var hash = System.Convert.ToBase64String(GetHash(string.Join("\n", lines)));
-
+			var hash = System.Convert.ToBase64String(GetHash(lines.Join("\n")));
 			return $"SHA256: {hash}";
 		}
 
diff --git a/VectoCore/VectoCore/Utils/DebugData.cs b/VectoCore/VectoCore/Utils/DebugData.cs
index e1c69f24b982bfd9ae15920e008c313fce2a83cc..59b053efe03ac035793f167c20a741370af74659 100644
--- a/VectoCore/VectoCore/Utils/DebugData.cs
+++ b/VectoCore/VectoCore/Utils/DebugData.cs
@@ -31,6 +31,7 @@
 
 using System.Collections.Generic;
 using System.Diagnostics;
+using TUGraz.VectoCommon.Utils;
 
 namespace TUGraz.VectoCore.Utils
 {
@@ -54,7 +55,7 @@ namespace TUGraz.VectoCore.Utils
 		public override string ToString()
 		{
 #if DEBUG
-			return string.Join("\n", Data);
+			return Data.Join("\n");
 #else
 				return "-";
 			#endif
diff --git a/VectoCore/VectoCore/Utils/DelaunayMap.cs b/VectoCore/VectoCore/Utils/DelaunayMap.cs
index 15555fb7e99f9091164c6216a66443b049732360..84afb4eb9280fd5495dc2bfbcd741f8520734d4d 100644
--- a/VectoCore/VectoCore/Utils/DelaunayMap.cs
+++ b/VectoCore/VectoCore/Utils/DelaunayMap.cs
@@ -163,7 +163,7 @@ namespace TUGraz.VectoCore.Utils
 			}
 			if (duplicates.Any()) {
 				throw new VectoException("{0}: Input Data for Delaunay map contains duplicates! \n{1}", _mapName,
-					string.Join("\n", duplicates.Select(pt => $"{pt.Key.X} / {pt.Key.Y}")));
+					duplicates.Select(pt => $"{pt.Key.X} / {pt.Key.Y}").Join("\n"));
 			}
 		}
 
@@ -220,8 +220,8 @@ namespace TUGraz.VectoCore.Utils
 				var frame = new StackFrame(2);
 				var method = frame.GetMethod();
 				System.Diagnostics.Debug.Assert(method.DeclaringType != null, "method.DeclaringType != null");
-				var type = string.Join("", method.DeclaringType.Name.Split(Path.GetInvalidFileNameChars()));
-				var methodName = string.Join("", method.Name.Split(Path.GetInvalidFileNameChars()));
+				var type = method.DeclaringType.Name.Split(Path.GetInvalidFileNameChars()).Join("");
+				var methodName = method.Name.Split(Path.GetInvalidFileNameChars()).Join("");
 				Directory.CreateDirectory("delaunay");
 				chart.SaveImage($"delaunay\\{type}_{methodName}_{superTriangle.GetHashCode()}_{i}.png",
 					ChartImageFormat.Png);
diff --git a/VectoCore/VectoCore/Utils/SearchAlgorithm.cs b/VectoCore/VectoCore/Utils/SearchAlgorithm.cs
index 158f1796acddf23d2fcd0d992b008110f4fd7870..8f86e626f6df667d569b3f269c7457fc958b6002 100644
--- a/VectoCore/VectoCore/Utils/SearchAlgorithm.cs
+++ b/VectoCore/VectoCore/Utils/SearchAlgorithm.cs
@@ -94,23 +94,14 @@ namespace TUGraz.VectoCore.Utils
 			T result;
 			try {
 				if (forceLineSearch) {
-					result = LineSearch(x, y, interval, getYValue, evaluateFunction, criterion, abortCriterion, ref iterationCount); 
-					
+					result = LineSearch(x, y, interval, getYValue, evaluateFunction, criterion, abortCriterion, ref iterationCount);
 				} else {
-					result = InterpolateSearch(
-						x, y, interval, getYValue, evaluateFunction, criterion, abortCriterion,
-						ref iterationCount);
+					result = InterpolateSearch(x, y, interval, getYValue, evaluateFunction, criterion, abortCriterion, ref iterationCount);
 				}
 			} catch (VectoException ex) {
 				var log = LogManager.GetLogger(typeof(SearchAlgorithm).FullName);
-				log.Debug("Falling back to InterpolationSearch in reverse. Normal InterpolationSearch failed: " + ex.Message);
-				try {
-					result = InterpolateSearch(x, y, -interval, getYValue, evaluateFunction, criterion, abortCriterion,
-						ref iterationCount);
-				} catch (VectoException ex1) {
-					log.Debug("Falling back to LineSearch. Reverse InterpolationSearch failed: " + ex1.Message);
-					result = LineSearch(x, y, interval, getYValue, evaluateFunction, criterion, abortCriterion, ref iterationCount);
-				}
+				log.Debug("Falling back to LineSearch. Reverse InterpolationSearch failed: " + ex.Message);
+				result = LineSearch(x, y, interval, getYValue, evaluateFunction, criterion, abortCriterion, ref iterationCount);
 			}
 			return result;
 		}
@@ -207,16 +198,16 @@ namespace TUGraz.VectoCore.Utils
 			Func<T, object> evaluateFunction, Func<object, double> criterion, Func<object, int, bool> abortCriterion,
 			ref int iterationCount) where T : SIBase<T>
 		{
-			var x1 = x1SI.Value();
+			var (x1, y1) = (x1SI.Value(), y1SI.Value());
 			var interval = intervalSI.Value();
-			var y1 = y1SI.Value();
 
 			var log = LogManager.GetLogger(typeof(SearchAlgorithm).FullName);
-			var debug = new DebugData();
-			debug.Add(new { x = x1, y = y1 });
 			log.Debug("Log Disabled during InterpolateSearch.");
 			LogManager.DisableLogging();
 
+			var debug = new DebugData();
+			debug.Add(new { x = x1, y = y1 });
+
 			try {
 				var x2 = x1 + interval;
 				var result = evaluateFunction(x2.SI<T>());
@@ -240,19 +231,21 @@ namespace TUGraz.VectoCore.Utils
 					debug.Add(new { x = x2, y = y2, delta = criterion(result), result });
 
 					var k = (y2 - y1) / (x2 - x1);
-					var d = y2 - k * x2;
-					x1 = x2;
-					x2 = -d / k;
+					if (count == 2 && k.IsEqual(0)) {
+						x2 = x1 - interval;
+						y2 = y1SI.Value();
+					} else {
+						var d = y2 - k * x2;
+						x1 = x2;
+						x2 = -d / k;
+					}
 					if (double.IsInfinity(x2) || double.IsNaN(x2)) {
 						debug.Add(new { x = x2, y = getYValue(result).Value(), delta = criterion(result), result });
 						LogManager.EnableLogging();
 						log.Debug("InterpolateSearch could not get more exact. Aborting after {0} function calls.", count);
 						LogManager.DisableLogging();
 						AppendDebug(debug);
-						//iterationCount += count;
-
-						//return x1.SI<T>();
-						throw new VectoSearchAbortedException("InterpolateLinearSearch");
+						throw new VectoSearchAbortedException("InterpolateLinearSearch: y-Value constant");
 					}
 
 					result = evaluateFunction(x2.SI<T>());
@@ -260,7 +253,7 @@ namespace TUGraz.VectoCore.Utils
 						LogManager.EnableLogging();
 						log.Debug("InterpolateSearch aborted due to abortCriterion: {0}", result);
 						LogManager.DisableLogging();
-						throw new VectoSearchAbortedException("InterpolateLinearSearch");
+						throw new VectoSearchAbortedException("InterpolateLinearSearch: AbortCriterion true");
 					}
 					if (criterion(result).IsEqual(0, Constants.SimulationSettings.InterpolateSearchTolerance)) {
 						debug.Add(new { x = x2, y = getYValue(result).Value(), delta = criterion(result), result });
@@ -270,7 +263,7 @@ namespace TUGraz.VectoCore.Utils
 						AppendDebug(debug);
 						return x2.SI<T>();
 					}
-					
+
 					y1 = y2;
 				}
 			} finally {
diff --git a/VectoCore/VectoCore/Utils/VectoCSVFile.cs b/VectoCore/VectoCore/Utils/VectoCSVFile.cs
index e4974252dbcb3c43c966eb21bdad52a54f8667f3..3f7928e12af4795b86e01068036b608398452719 100644
--- a/VectoCore/VectoCore/Utils/VectoCSVFile.cs
+++ b/VectoCore/VectoCore/Utils/VectoCSVFile.cs
@@ -208,7 +208,7 @@ namespace TUGraz.VectoCore.Utils
 				}
 			}
 			var header = table.Columns.Cast<DataColumn>().Select(col => col.Caption ?? col.ColumnName);
-			entries.Add(string.Join(Delimiter, header));
+			entries.Add(header.Join(Delimiter));
 
 			var columnFormatter = new Func<ConvertedSI, string>[table.Columns.Count];
 			for (var i = 0; i < table.Columns.Count; i++) {
@@ -241,7 +241,7 @@ namespace TUGraz.VectoCore.Utils
 						formattedList[i] = $"\"{formattedList[i]}\"";
 					}
 				}
-				entries.Add(string.Join(Delimiter, formattedList));
+				entries.Add(formattedList.Join(Delimiter));
 			}
 
 			if (addDigest) {
diff --git a/VectoCore/VectoCore/Utils/XMLHelper.cs b/VectoCore/VectoCore/Utils/XMLHelper.cs
index 49d6fff697cf95f5e99990f585ccfb94b57c375f..d9cdfdd8aa9bf8a654750b20d1c227fd0bc04094 100644
--- a/VectoCore/VectoCore/Utils/XMLHelper.cs
+++ b/VectoCore/VectoCore/Utils/XMLHelper.cs
@@ -187,7 +187,7 @@ namespace TUGraz.VectoCore.Utils
 
 		public static string QueryLocalName(params string[] nodePath)
 		{
-			return "./" + string.Join("/", nodePath.Where(x => x != null).Select(x => $"/*[local-name()='{x}']").ToArray());
+			return "./" + nodePath.Where(x => x != null).Select(x => $"/*[local-name()='{x}']").Join("/");
 		}
 
 
diff --git a/VectoCore/VectoCore/Utils/XMLValidator.cs b/VectoCore/VectoCore/Utils/XMLValidator.cs
index e477b6710b975e434f4599ea60b54ae0b4879c5f..2fc93738b9ec68c14b76972371ff72cf69aefa8b 100644
--- a/VectoCore/VectoCore/Utils/XMLValidator.cs
+++ b/VectoCore/VectoCore/Utils/XMLValidator.cs
@@ -99,7 +99,7 @@ namespace TUGraz.VectoCore.Utils
 			_validationErrorAction(args?.Severity ?? XmlSeverityType.Error, new ValidationEvent { ValidationEventArgs = args });
 		}
 
-		public string ValidationError => _validationErrors.Any() ? string.Join(Environment.NewLine, _validationErrors) : null;
+		public string ValidationError => _validationErrors.Any() ? _validationErrors.Join(Environment.NewLine) : null;
 
 		public static void CallBackExceptionOnError(XmlSeverityType severity, ValidationEvent evt)
 		{
diff --git a/VectoCore/VectoCore/Utils/XPathHelper.cs b/VectoCore/VectoCore/Utils/XPathHelper.cs
index 3f18f3a79d84279eaad183e20bb2807d41a899b2..a9177e08ce06749d05c13d0a746e4244491b554e 100644
--- a/VectoCore/VectoCore/Utils/XPathHelper.cs
+++ b/VectoCore/VectoCore/Utils/XPathHelper.cs
@@ -32,6 +32,7 @@
 using System.Linq;
 using System.Xml;
 using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Configuration;
 
 namespace TUGraz.VectoCore.Utils
@@ -49,12 +50,9 @@ namespace TUGraz.VectoCore.Utils
 				: Constants.XML.EngineeringNSPrefix;
 		}
 
-		public string Query(params string[] xpathSections)
-		{
-			return string.Join("/",
-				xpathSections.Select(
-					x => string.IsNullOrWhiteSpace(x) || x.StartsWith("..") || x.Contains(":") || x.StartsWith("@") ? x : NSPrefix(x)))
-				;
+		public string Query(params string[] xpathSections) {
+			return xpathSections.Select(
+				x => string.IsNullOrWhiteSpace(x) || x.StartsWith("..") || x.Contains(":") || x.StartsWith("@") ? x : NSPrefix(x)).Join("/");
 		}
 
 		public string QueryConstraint(string elementName, string name, string value,
diff --git a/VectoCore/VectoCoreTest/Algorithms/MeanShiftClusteringTest.cs b/VectoCore/VectoCoreTest/Algorithms/MeanShiftClusteringTest.cs
index 8bc4baba600bf587ab0e380aa6cc29510c04cbca..2ddaed78ae81533cd3424a7b57eeb9f130b0b319 100644
--- a/VectoCore/VectoCoreTest/Algorithms/MeanShiftClusteringTest.cs
+++ b/VectoCore/VectoCoreTest/Algorithms/MeanShiftClusteringTest.cs
@@ -33,6 +33,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using NUnit.Framework;
+using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Tests.Algorithms
@@ -60,14 +61,14 @@ namespace TUGraz.VectoCore.Tests.Algorithms
 
 			//Console.WriteLine(string.Join(", ", entries));
 
-			var clusterer = new MeanShiftClustering() {
+			var clusterer = new MeanShiftClustering {
 				ClusterCount = 8
 			};
 			var clusters = clusterer.FindClusters(entries.ToArray(), 10);
 
 			//Console.WriteLine(clusterer.IterationCount);
-			Console.WriteLine(string.Join(", ", centers));
-			Console.WriteLine(string.Join(", ", clusters));
+			Console.WriteLine(centers.Join());
+			Console.WriteLine(clusters.Join());
 
 			Assert.AreEqual(centers.Length, clusters.Length);
 			foreach (var center in centers) {
@@ -87,7 +88,7 @@ namespace TUGraz.VectoCore.Tests.Algorithms
 			var clusterer = new MeanShiftClustering();
 			var clusters = clusterer.FindClusters(entries.ToArray(), 0.1);
 
-			Console.WriteLine(string.Join(", ", clusters));
+			Console.WriteLine(clusters.Join());
 		}
 	}
 }
diff --git a/VectoCore/VectoCoreTest/Integration/ADAS/ADASTestsConventional.cs b/VectoCore/VectoCoreTest/Integration/ADAS/ADASTestsConventional.cs
index c37e215d09e90cd47f7b597a3c570de25c88d1a4..b964fb5da2799de934b9001b2da63e34dc73c093 100644
--- a/VectoCore/VectoCoreTest/Integration/ADAS/ADASTestsConventional.cs
+++ b/VectoCore/VectoCoreTest/Integration/ADAS/ADASTestsConventional.cs
@@ -1400,7 +1400,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 		private void TestPCC(string testname,
 			params (double start, double end, PCCStates pcc, DrivingAction action)[] data)
 		{
-			var jobName = testname.Split('_').Slice(0, -2).JoinString("_");
+			var jobName = testname.Split('_').Slice(0, -2).Join("_");
 			var cycleName = testname.Split('_').Reverse().Skip(1).First();
 			DoTestPCC(jobName, cycleName, data);
 		}
diff --git a/VectoCore/VectoCoreTest/Integration/ADAS/ADASTestsHEV.cs b/VectoCore/VectoCoreTest/Integration/ADAS/ADASTestsHEV.cs
index 3ba1c7fd3e3391b1bd41f3253bd75b394e2049d3..f6d357b10b1195932091e79b6f2104dde8707453 100644
--- a/VectoCore/VectoCoreTest/Integration/ADAS/ADASTestsHEV.cs
+++ b/VectoCore/VectoCoreTest/Integration/ADAS/ADASTestsHEV.cs
@@ -1839,7 +1839,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 		private void TestPCC(string testname,
 			params (double start, double end, PCCStates pcc, DrivingAction action)[] data)
 		{
-			var jobName = testname.Split('_').Slice(0, -2).JoinString("_");
+			var jobName = testname.Split('_').Slice(0, -2).Join("_");
 			var cycleName = testname.Split('_').Reverse().Skip(1).First();
 			DoTestPCC(jobName, cycleName, data);
 		}
diff --git a/VectoCore/VectoCoreTest/Integration/ADAS/ADASTestsPEV.cs b/VectoCore/VectoCoreTest/Integration/ADAS/ADASTestsPEV.cs
index 20800ec8df1bf844c971a68add66c26312bcbe27..e61588d3c9a29eaca2c3cb3a663a2cd6055cf930 100644
--- a/VectoCore/VectoCoreTest/Integration/ADAS/ADASTestsPEV.cs
+++ b/VectoCore/VectoCoreTest/Integration/ADAS/ADASTestsPEV.cs
@@ -53,20 +53,20 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 		#region E2
 
 		[TestCase]
-		public void Class5_E2_NoADAS_CaseA() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_NoADAS_CaseA() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 5647, OutsideSegment, Accelerate),        // len: 5647m
 			(5647, 5846, OutsideSegment, Coast),          // len: 199m
 			(5846, 1e6, OutsideSegment, Accelerate));
 
 
 		[TestCase]
-		public void Class5_E2_NoADAS_CaseB() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_NoADAS_CaseB() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 6196, OutsideSegment, Accelerate),        // len: 6196m
 			(6196, 7628, OutsideSegment, Coast),          // len: 1432m
 			(7628, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_NoADAS_CaseC() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_NoADAS_CaseC() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 5496, OutsideSegment, Accelerate),        // len: 5496m
 			(5496, 5849, OutsideSegment, Coast),          // len: 353m
 			(5849, 7111, OutsideSegment, Brake),          // len: 1262m
@@ -75,7 +75,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E2_NoADAS_CaseD() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_NoADAS_CaseD() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 2147, OutsideSegment, Accelerate),        // len: 2147m
 			(2147, 2300, OutsideSegment, Coast),          // len: 153m
 			(2300, 2469, OutsideSegment, Brake),          // len: 169m
@@ -87,7 +87,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(6947, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_NoADAS_CaseE() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_NoADAS_CaseE() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 2194, OutsideSegment, Accelerate),        // len: 2194m
 			(2194, 2440, OutsideSegment, Coast),          // len: 246m
 			(2440, 3350, OutsideSegment, Accelerate),     // len: 910m
@@ -97,7 +97,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(4208, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_NoADAS_CaseF() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_NoADAS_CaseF() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 2206, OutsideSegment, Accelerate),        // len: 2206m
 			(2206, 2463, OutsideSegment, Coast),          // len: 257m
 			(2463, 2907, OutsideSegment, Accelerate),     // len: 444m
@@ -105,7 +105,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(3400, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_NoADAS_CaseG() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_NoADAS_CaseG() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 5437, OutsideSegment, Accelerate),        // len: 5437m
 			(5437, 5614, OutsideSegment, Coast),          // len: 177m
 			(5614, 6467, OutsideSegment, Brake),          // len: 853m
@@ -113,7 +113,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(6990, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_NoADAS_CaseH() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_NoADAS_CaseH() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 5332, OutsideSegment, Accelerate),        // len: 5332m
 			(5332, 5722, OutsideSegment, Coast),          // len: 390m
 			(5722, 5962, OutsideSegment, Brake),          // len: 240m
@@ -121,11 +121,11 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(6224, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_NoADAS_CaseI() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_NoADAS_CaseI() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_NoADAS_CaseJ() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_NoADAS_CaseJ() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 4794, OutsideSegment, Accelerate),        // len: 4794m
 			(4794, 4805, OutsideSegment, Roll),           // len: 11m
 			(4805, 4837, OutsideSegment, Accelerate),     // len: 32m
@@ -149,7 +149,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(6366, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_NoADAS_CrestCoast1() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_NoADAS_CrestCoast1() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 0, OutsideSegment, Halt),                 // len: 0m
 			(0, 13, OutsideSegment, Accelerate),          // len: 13m
 			(13, 18, OutsideSegment, Roll),               // len: 5m
@@ -169,7 +169,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E2_NoADAS_CrestCoast2() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_NoADAS_CrestCoast2() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 0, OutsideSegment, Halt),                 // len: 0m
 			(0, 13, OutsideSegment, Accelerate),          // len: 13m
 			(13, 18, OutsideSegment, Roll),               // len: 5m
@@ -189,14 +189,14 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E2_PCC123_CaseA() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC123_CaseA() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 4107, OutsideSegment, Accelerate),        // len: 4107m
 			(4107, 5566, WithinSegment, Accelerate),      // len: 1459m
 			(5566, 5834, UseCase1, Coast),                // len: 268m
 			(5834, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC123_CaseB() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC123_CaseB() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 4585, OutsideSegment, Accelerate),        // len: 4585m
 			(4585, 5682, WithinSegment, Accelerate),      // len: 1097m
 			(5682, 7315, UseCase1, Coast),                // len: 1633m
@@ -204,7 +204,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(7385, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC123_CaseC() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC123_CaseC() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3955, OutsideSegment, Accelerate),        // len: 3955m
 			(3955, 4982, WithinSegment, Accelerate),      // len: 1027m
 			(4982, 6112, UseCase1, Coast),                // len: 1130m
@@ -215,7 +215,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(7533, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC123_CaseD() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC123_CaseD() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 654, OutsideSegment, Accelerate),         // len: 654m
 			(654, 1949, WithinSegment, Accelerate),       // len: 1295m
 			(1949, 2483, UseCase1, Coast),                // len: 534m
@@ -228,7 +228,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(7007, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC123_CaseE() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC123_CaseE() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 689, OutsideSegment, Accelerate),         // len: 689m
 			(689, 2112, WithinSegment, Accelerate),       // len: 1423m
 			(2112, 2380, UseCase1, Coast),                // len: 268m
@@ -239,7 +239,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(4147, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC123_CaseF() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC123_CaseF() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 689, OutsideSegment, Accelerate),         // len: 689m
 			(689, 2124, WithinSegment, Accelerate),       // len: 1435m
 			(2124, 2403, UseCase1, Coast),                // len: 279m
@@ -248,7 +248,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(3286, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC123_CaseG() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC123_CaseG() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3932, OutsideSegment, Accelerate),        // len: 3932m
 			(3932, 5134, WithinSegment, Accelerate),      // len: 1202m
 			(5134, 5917, UseCase1, Coast),                // len: 783m
@@ -258,7 +258,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E2_PCC123_CaseH() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC123_CaseH() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3804, OutsideSegment, Accelerate),        // len: 3804m
 			(3804, 4982, WithinSegment, Accelerate),      // len: 1178m
 			(4982, 6011, UseCase1, Coast),                // len: 1029m
@@ -266,11 +266,11 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(6105, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC123_CaseI() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC123_CaseI() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC123_CaseJ() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC123_CaseJ() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3547, OutsideSegment, Accelerate),        // len: 3547m
 			(3547, 4794, WithinSegment, Accelerate),      // len: 1247m
 			(4794, 4805, WithinSegment, Roll),            // len: 11m
@@ -295,7 +295,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(6473, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC123_CrestCoast1() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC123_CrestCoast1() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 0, OutsideSegment, Halt),                 // len: 0m
 			(0, 13, OutsideSegment, Accelerate),          // len: 13m
 			(13, 18, OutsideSegment, Roll),               // len: 5m
@@ -315,7 +315,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E2_PCC123_CrestCoast2() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC123_CrestCoast2() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 0, OutsideSegment, Halt),                 // len: 0m
 			(0, 13, OutsideSegment, Accelerate),          // len: 13m
 			(13, 18, OutsideSegment, Roll),               // len: 5m
@@ -336,14 +336,14 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E2_PCC12_CaseA() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC12_CaseA() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 4107, OutsideSegment, Accelerate),        // len: 4107m
 			(4107, 5566, WithinSegment, Accelerate),      // len: 1459m
 			(5566, 5834, UseCase1, Coast),                // len: 268m
 			(5834, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC12_CaseB() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC12_CaseB() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 4585, OutsideSegment, Accelerate),        // len: 4585m
 			(4585, 5682, WithinSegment, Accelerate),      // len: 1097m
 			(5682, 7315, UseCase1, Coast),                // len: 1633m
@@ -351,7 +351,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(7385, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC12_CaseC() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC12_CaseC() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3955, OutsideSegment, Accelerate),        // len: 3955m
 			(3955, 4982, WithinSegment, Accelerate),      // len: 1027m
 			(4982, 6112, UseCase1, Coast),                // len: 1130m
@@ -362,7 +362,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(7418, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC12_CaseD() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC12_CaseD() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 654, OutsideSegment, Accelerate),         // len: 654m
 			(654, 1949, WithinSegment, Accelerate),       // len: 1295m
 			(1949, 2483, UseCase1, Coast),                // len: 534m
@@ -377,7 +377,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(6941, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC12_CaseE() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC12_CaseE() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 689, OutsideSegment, Accelerate),         // len: 689m
 			(689, 2112, WithinSegment, Accelerate),       // len: 1423m
 			(2112, 2380, UseCase1, Coast),                // len: 268m
@@ -388,7 +388,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(4147, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC12_CaseF() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC12_CaseF() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 689, OutsideSegment, Accelerate),         // len: 689m
 			(689, 2124, WithinSegment, Accelerate),       // len: 1435m
 			(2124, 2403, UseCase1, Coast),                // len: 279m
@@ -398,7 +398,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E2_PCC12_CaseG() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC12_CaseG() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3932, OutsideSegment, Accelerate),        // len: 3932m
 			(3932, 5134, WithinSegment, Accelerate),      // len: 1202m
 			(5134, 5917, UseCase1, Coast),                // len: 783m
@@ -409,7 +409,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(6980, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC12_CaseH() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC12_CaseH() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3804, OutsideSegment, Accelerate),        // len: 3804m
 			(3804, 4982, WithinSegment, Accelerate),      // len: 1178m
 			(4982, 6011, UseCase1, Coast),                // len: 1029m
@@ -419,11 +419,11 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E2_PCC12_CaseI() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC12_CaseI() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC12_CaseJ() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC12_CaseJ() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3547, OutsideSegment, Accelerate),        // len: 3547m
 			(3547, 4794, WithinSegment, Accelerate),      // len: 1247m
 			(4794, 4805, WithinSegment, Roll),            // len: 11m
@@ -450,7 +450,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(6365, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E2_PCC12_CrestCoast1() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC12_CrestCoast1() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 0, OutsideSegment, Halt),                 // len: 0m
 			(0, 13, OutsideSegment, Accelerate),          // len: 13m
 			(13, 18, OutsideSegment, Roll),               // len: 5m
@@ -470,7 +470,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E2_PCC12_CrestCoast2() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E2_PCC12_CrestCoast2() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 0, OutsideSegment, Halt),                 // len: 0m
 			(0, 13, OutsideSegment, Accelerate),          // len: 13m
 			(13, 18, OutsideSegment, Roll),               // len: 5m
@@ -494,7 +494,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 		#region E3
 
 		[TestCase]
-		public void Class5_E3_PCC123_CaseA() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E3_PCC123_CaseA() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 4130, OutsideSegment, Accelerate),        // len: 4130m
 			(4130, 5531, WithinSegment, Accelerate),      // len: 1401m
 			(5531, 5810, UseCase1, Coast),                // len: 279m
@@ -502,7 +502,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E3_PCC123_CaseB() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E3_PCC123_CaseB() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 4655, OutsideSegment, Accelerate),        // len: 4655m
 			(4655, 5612, WithinSegment, Accelerate),      // len: 957m
 			(5612, 7240, UseCase1, Coast),                // len: 1628m
@@ -511,7 +511,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E3_PCC123_CaseC() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E3_PCC123_CaseC() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3979, OutsideSegment, Accelerate),        // len: 3979m
 			(3979, 4971, WithinSegment, Accelerate),      // len: 992m
 			(4971, 6090, UseCase1, Coast),                // len: 1119m
@@ -522,7 +522,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(7548, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E3_PCC123_CaseD() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E3_PCC123_CaseD() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 654, OutsideSegment, Accelerate),         // len: 654m
 			(654, 1926, WithinSegment, Accelerate),       // len: 1272m
 			(1926, 2479, UseCase1, Coast),                // len: 553m
@@ -535,7 +535,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(7046, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E3_PCC123_CaseE() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E3_PCC123_CaseE() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 700, OutsideSegment, Accelerate),         // len: 700m
 			(700, 2101, WithinSegment, Accelerate),       // len: 1401m
 			(2101, 2379, UseCase1, Coast),                // len: 278m
@@ -547,7 +547,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(4152, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E3_PCC123_CaseF() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E3_PCC123_CaseF() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 700, OutsideSegment, Accelerate),         // len: 700m
 			(700, 2112, WithinSegment, Accelerate),       // len: 1412m
 			(2112, 2391, UseCase1, Coast),                // len: 279m
@@ -558,7 +558,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(3321, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E3_PCC123_CaseG() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E3_PCC123_CaseG() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3944, OutsideSegment, Accelerate),        // len: 3944m
 			(3944, 5122, WithinSegment, Accelerate),      // len: 1178m
 			(5122, 5893, UseCase1, Coast),                // len: 771m
@@ -568,7 +568,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E3_PCC123_CaseH() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E3_PCC123_CaseH() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3815, OutsideSegment, Accelerate),        // len: 3815m
 			(3815, 4947, WithinSegment, Accelerate),      // len: 1132m
 			(4947, 5996, UseCase1, Coast),                // len: 1049m
@@ -576,11 +576,11 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(6125, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E3_PCC123_CaseI() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E3_PCC123_CaseI() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E3_PCC123_CaseJ() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E3_PCC123_CaseJ() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3559, OutsideSegment, Accelerate),        // len: 3559m
 			(3559, 5374, WithinSegment, Accelerate),      // len: 1815m
 			(5374, 5713, UseCase2, Coast),                // len: 339m
@@ -589,7 +589,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(6477, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E3_PCC123_CrestCoast1() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E3_PCC123_CrestCoast1() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 0, OutsideSegment, Halt),                 // len: 0m
 			(0, 3410, OutsideSegment, Accelerate),        // len: 3410m
 			(3410, 4441, OutsideSegment, Coast),          // len: 1031m
@@ -599,7 +599,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E3_PCC123_CrestCoast2() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E3_PCC123_CrestCoast2() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 0, OutsideSegment, Halt),                 // len: 0m
 			(0, 3614, OutsideSegment, Accelerate),        // len: 3614m
 			(3614, 4148, OutsideSegment, Coast),          // len: 534m
@@ -612,7 +612,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 		#region E4
 
 		[TestCase]
-		public void Class5_E4_PCC123_CaseA() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E4_PCC123_CaseA() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 4130, OutsideSegment, Accelerate),        // len: 4130m
 			(4130, 5531, WithinSegment, Accelerate),      // len: 1401m
 			(5531, 5810, UseCase1, Coast),                // len: 279m
@@ -621,7 +621,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E4_PCC123_CaseB() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E4_PCC123_CaseB() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 4655, OutsideSegment, Accelerate),        // len: 4655m
 			(4655, 5601, WithinSegment, Accelerate),      // len: 946m
 			(5601, 7252, UseCase1, Coast),                // len: 1651m
@@ -629,7 +629,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(7522, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E4_PCC123_CaseC() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E4_PCC123_CaseC() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3979, OutsideSegment, Accelerate),        // len: 3979m
 			(3979, 4959, WithinSegment, Accelerate),      // len: 980m
 			(4959, 6088, UseCase1, Coast),                // len: 1129m
@@ -640,7 +640,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(7523, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E4_PCC123_CaseD() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E4_PCC123_CaseD() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 654, OutsideSegment, Accelerate),         // len: 654m
 			(654, 1926, WithinSegment, Accelerate),       // len: 1272m
 			(1926, 2480, UseCase1, Coast),                // len: 554m
@@ -654,7 +654,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E4_PCC123_CaseE() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E4_PCC123_CaseE() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 689, OutsideSegment, Accelerate),         // len: 689m
 			(689, 2101, WithinSegment, Accelerate),       // len: 1412m
 			(2101, 2379, UseCase1, Coast),                // len: 278m
@@ -667,7 +667,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E4_PCC123_CaseF() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E4_PCC123_CaseF() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 700, OutsideSegment, Accelerate),         // len: 700m
 			(700, 2112, WithinSegment, Accelerate),       // len: 1412m
 			(2112, 2391, UseCase1, Coast),                // len: 279m
@@ -678,7 +678,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(3320, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E4_PCC123_CaseG() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E4_PCC123_CaseG() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3941, OutsideSegment, Accelerate),        // len: 3941m
 			(3941, 5117, WithinSegment, Accelerate),      // len: 1176m
 			(5117, 5888, UseCase1, Coast),                // len: 771m
@@ -689,7 +689,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 
 		[TestCase]
-		public void Class5_E4_PCC123_CaseH() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E4_PCC123_CaseH() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3815, OutsideSegment, Accelerate),        // len: 3815m
 			(3815, 4936, WithinSegment, Accelerate),      // len: 1121m
 			(4936, 5994, UseCase1, Coast),                // len: 1058m
@@ -697,11 +697,11 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(6135, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E4_PCC123_CaseI() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E4_PCC123_CaseI() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E4_PCC123_CaseJE4() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E4_PCC123_CaseJE4() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 3430, OutsideSegment, Accelerate),        // len: 3430m
 			(3430, 5236, WithinSegment, Accelerate),      // len: 1806m
 			(5236, 6125, UseCase2, Coast),                // len: 889m
@@ -710,7 +710,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(6531, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E4_PCC123_CrestCoast1() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E4_PCC123_CrestCoast1() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 0, OutsideSegment, Halt),                 // len: 0m
 			(0, 3417, OutsideSegment, Accelerate),        // len: 3417m
 			(3417, 4400, OutsideSegment, Coast),          // len: 983m
@@ -719,7 +719,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			(5422, 1e6, OutsideSegment, Accelerate));
 
 		[TestCase]
-		public void Class5_E4_PCC123_CrestCoast2() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).JoinString("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
+		public void Class5_E4_PCC123_CrestCoast2() => TestPCC(MethodBase.GetCurrentMethod().Name.Split('_').Slice(0, -1).Join("_"), MethodBase.GetCurrentMethod().Name.Split('_').Last(),
 			(0, 0, OutsideSegment, Halt),                 // len: 0m
 			(0, 3612, OutsideSegment, Accelerate),        // len: 3612m
 			(3612, 4126, OutsideSegment, Coast),          // len: 514m
diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
index 255c280cec46a2ce71ce3acdbeb32a865f1be010..5719c0f557702d7b5f36f2b8aa9bad7d8f440933 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
@@ -2022,11 +2022,11 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
             Assert.AreEqual(missionType, m.MissionType);
             Assert.AreEqual(cosswindCorrection, m.CrossWindCorrectionParameters);
             CollectionAssert.AreEqual(axleWeightDistribution, m.AxleWeightDistribution,
-                "Axle distribution not equal.\nexpected: {0}\nactual: {1}", string.Join(",", axleWeightDistribution),
-                string.Join(",", m.AxleWeightDistribution));
+                "Axle distribution not equal.\nexpected: {0}\nactual: {1}", axleWeightDistribution.Join(),
+                m.AxleWeightDistribution.Join());
             CollectionAssert.AreEqual(trailerAxleWeightDistribution, m.Trailer.Select(t => t.TrailerAxleWeightShare),
-                "Trailer axle distribution not equal.\nexpected: {0}\nactual: {1}", string.Join(",", trailerAxleWeightDistribution),
-                string.Join(",", m.Trailer.Select(t => t.TrailerAxleWeightShare)));
+                "Trailer axle distribution not equal.\nexpected: {0}\nactual: {1}", trailerAxleWeightDistribution.Join(),
+                m.Trailer.Select(t => t.TrailerAxleWeightShare).Join());
             Assert.AreEqual(bodyCurbWeight.SI<Kilogram>(), m.BodyCurbWeight);
             CollectionAssert.AreEqual(trailerCurbWeight, m.Trailer.Select(t => t.TrailerCurbWeight.Value()));
             CollectionAssert.AreEqual(trailerType, m.Trailer.Select(t => t.TrailerType));
diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationSegmentHeavyBusesTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationSegmentHeavyBusesTest.cs
index c3c33b3ec2e8f52f664eaf1b905818559b3185a9..82a3184342d45b4a026f0749cc96f08cb5de70d8 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationSegmentHeavyBusesTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationSegmentHeavyBusesTest.cs
@@ -691,8 +691,8 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			Assert.AreEqual(lowLoad, m.LowLoad.Value(), 1e-9);
 			foreach (var tuple in axleWeightDistribution.ZipAll(m.AxleWeightDistribution, Tuple.Create))
 			{
-				Assert.AreEqual(tuple.Item1, tuple.Item2, 1e-0, "Axle distribution not equal.\nexpected: {0}\nactual: {1}", string.Join(",", axleWeightDistribution),
-					string.Join(",", m.AxleWeightDistribution));
+				Assert.AreEqual(tuple.Item1, tuple.Item2, 1e-0, "Axle distribution not equal.\nexpected: {0}\nactual: {1}", 
+					axleWeightDistribution.Join(), m.AxleWeightDistribution.Join());
 			}
 
 			foreach (var entry in expVehicleEquipment) {
diff --git a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
index 44b0a43b6ac6726bf8df11e32b6e54ff7962b3fa..903e9647042fbe3c496db25bff2c83829bac18be 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
@@ -842,7 +842,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 						InputDataHelper.InputDataAsStream("engine torque,downshift rpm [rpm],upshift rpm [rpm]	", vgbs)));
 
 			var results = shiftPolygon.Validate(ExecutionMode.Engineering, VectoSimulationJobType.ConventionalVehicle, null, GearboxType.MT, false);
-			Assert.IsFalse(results.Any(), string.Join("\n", results.Select(r => r.ErrorMessage)));
+			Assert.IsFalse(results.Any(), results.Select(r => r.ErrorMessage).Join("\n"));
 		}
 
 		[
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/BatterySystemTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/BatterySystemTest.cs
index 85cd34b222187ff93ef7467c77c533a509673bc0..e513e94a440b4aa7eab2f3fe06ec21d4a9504f73 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponent/BatterySystemTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/BatterySystemTest.cs
@@ -166,7 +166,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			}
 
 			var socs = bat.Batteries.SelectMany(x => x.Value.Batteries.Select(y => y.StateOfCharge)).ToArray();
-			Console.WriteLine(string.Join(", ", socs));
+			Console.WriteLine(socs.Join());
 			for (var i = 0; i < socs.Length; i++) {
 				Assert.AreEqual(expectedSoC[i], socs[i], 1e-9, $"Bat_{i} SoC");
 			}
@@ -234,7 +234,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			}
 
 			var socs = bat.Batteries.SelectMany(x => x.Value.Batteries.Select(y => y.StateOfCharge)).ToArray();
-			Console.WriteLine(string.Join(", ", socs));
+			Console.WriteLine(socs.Join());
 			Console.WriteLine(bat.StateOfCharge);
 			for (var i = 0; i < socs.Length; i++) {
 				Assert.AreEqual(expectedSoC[i], socs[i], 1e-9, $"Bat_{i} SoC");
@@ -303,7 +303,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			}
 
 			var socs = bat.Batteries.SelectMany(x => x.Value.Batteries.Select(y => y.StateOfCharge)).ToArray();
-			Console.WriteLine(string.Join(", ", socs));
+			Console.WriteLine(socs.Join());
 			Console.WriteLine(bat.StateOfCharge);
 			for (var i = 0; i < socs.Length; i++) {
 				Assert.AreEqual(expectedSoC[i], socs[i], 1e-9, $"Bat_{i} SoC");
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs
index 16602da9dbe35b5e12238133fd183d234bb87e5b..2857d8a00c0d5542be77ea0d7d6a5a3fc90068e3 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs
@@ -108,7 +108,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			data.FullLoadCurves[0].EngineData = data;
 
 			var results = data.Validate(ExecutionMode.Declaration, VectoSimulationJobType.ConventionalVehicle, null, null, false);
-			Assert.IsFalse(results.Any(), "Validation Failed: " + string.Join("; ", results.Select(r => r.ErrorMessage)));
+			Assert.IsFalse(results.Any(), "Validation Failed: " + results.Select(r => r.ErrorMessage).Join("; "));
 			Assert.IsTrue(data.IsValid());
 		}
 
@@ -144,7 +144,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			var engineData = dao.CreateEngineData(data, data.EngineModes.First());
 
 			var results = engineData.Validate(ExecutionMode.Engineering, VectoSimulationJobType.ConventionalVehicle, null, null, false);
-			Assert.IsFalse(results.Any(), "Validation failed: " + string.Join("; ", results.Select(r => r.ErrorMessage)));
+			Assert.IsFalse(results.Any(), "Validation failed: " + results.Select(r => r.ErrorMessage).Join("; "));
 			Assert.IsTrue(engineData.IsValid());
 		}
 
@@ -190,7 +190,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			var engineData = dao.CreateEngineData(vehicle, data.EngineModes.First(), new Mission() {MissionType = MissionType.LongHaul});
 
 			var results = engineData.Validate(ExecutionMode.Declaration, VectoSimulationJobType.ConventionalVehicle, null, null, false);
-			Assert.IsFalse(results.Any(), "Validation failed: " + string.Join("; ", results.Select(r => r.ErrorMessage)));
+			Assert.IsFalse(results.Any(), "Validation failed: " + results.Select(r => r.ErrorMessage).Join("; "));
 
 			Assert.IsTrue(engineData.IsValid());
 		}
@@ -360,8 +360,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 
 			// every field and property should be tested except private parent fields and properties and 
 			// (4*4+1) * 2 = 17*2= 34 - 4 private parent fields (+2 public field and property which are tested twice) = 32
-			Assert.AreEqual(32, results.Count,
-				"Validation Error: " + string.Join("\n_eng_avg", results.Select(r => r.ErrorMessage)));
+			Assert.AreEqual(32, results.Count, "Validation Error: " + results.Select(r => r.ErrorMessage).Join("\n_eng_avg"));
 		}
 
 		[TestCase]
diff --git a/VectoCore/VectoCoreTest/Utils/ResultFileHelper.cs b/VectoCore/VectoCoreTest/Utils/ResultFileHelper.cs
index 0f36502f3b8efbee0ad36d1a5def5c7588bf7733..1502ea3b16f11c38cd862afb1315dc73abd8879a 100644
--- a/VectoCore/VectoCoreTest/Utils/ResultFileHelper.cs
+++ b/VectoCore/VectoCoreTest/Utils/ResultFileHelper.cs
@@ -107,10 +107,11 @@ namespace TUGraz.VectoCore.Tests.Utils
 				}
 
 				CollectionAssert.AreEqual(expectedCols, actualCols,
-					string.Format("Moddata {3}: Columns differ:\nExpected: {0}\nMissing:{1},\nToo Much:{2}",
-						string.Join(", ", expectedCols),
-						string.Join(", ", expectedCols.Except(actualCols)),
-						string.Join(", ", actualCols.Except(expectedCols)), result.actualFile));
+					"Moddata {0}: Columns differ:\nExpected: {1}\nMissing:{2},\nToo Much:{3}",
+					result.actualFile,
+					expectedCols.Join(),
+					expectedCols.Except(actualCols).Join(),
+					actualCols.Except(expectedCols).Join());
 
 				for (var i = 0; testRowcount && i < expected.Rows.Count; i++) {
 					var expectedRow = expected.Rows[i];
@@ -138,11 +139,11 @@ namespace TUGraz.VectoCore.Tests.Utils
 			var expectedCols = expected.Columns.Cast<DataColumn>().Select(x => x.ColumnName).OrderBy(x => x).ToList();
 
 			CollectionAssert.AreEqual(expectedCols, actualCols,
-				string.Format("SUM FILE {3}: Columns differ:\nExpected: {0}\nMissing:{1},\nToo Much:{2}",
-					string.Join(", ", expectedCols),
-					string.Join(", ", expectedCols.Except(actualCols)),
-					string.Join(", ", actualCols.Except(expectedCols)),
-					actualFile));
+				"SUM FILE {0}: Columns differ:\nExpected: {1}\nMissing:{2},\nToo Much:{3}",
+				actualFile,
+				expectedCols.Join(),
+				expectedCols.Except(actualCols).Join(),
+				actualCols.Except(expectedCols).Join());
 
 			for (var i = 0; i < expected.Rows.Count; i++) {
 				var expectedRow = expected.Rows[i];
diff --git a/VectoCore/VectoCoreTest/Utils/VectoMathTest.cs b/VectoCore/VectoCoreTest/Utils/VectoMathTest.cs
index 2d7f9c6d95b31809e94156acf6b966d23889ec42..630a838fffdf4b504afecfbdc546bb7f2c53ab13 100644
--- a/VectoCore/VectoCoreTest/Utils/VectoMathTest.cs
+++ b/VectoCore/VectoCoreTest/Utils/VectoMathTest.cs
@@ -119,7 +119,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 		{
 			var results = VectoMath.Polynom4Solver(a, b, c, d, e);
 
-			Console.WriteLine(string.Join(", ", results));
+			Console.WriteLine(results.Join());
 
 			Assert.AreEqual(expected.Length, results.Length);
 
diff --git a/VectoCore/VectoCoreTest/XML/XMLReportTest.cs b/VectoCore/VectoCoreTest/XML/XMLReportTest.cs
index d88ce535c17b527c5cc484ba83803e2f8543feb9..7f595f7ff669ceee478fa43a87c1ccb87ba0812c 100644
--- a/VectoCore/VectoCoreTest/XML/XMLReportTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLReportTest.cs
@@ -35,6 +35,7 @@ using System.Xml;
 using Ninject;
 using NUnit.Framework;
 using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData.FileIO.XML;
 using TUGraz.VectoCore.Models.Simulation.Impl;
 using TUGraz.VectoCore.OutputData;
@@ -96,13 +97,13 @@ namespace TUGraz.VectoCore.Tests.XML
 			var validator1 = new XMLValidator(XmlReader.Create(customerRecord), validationErrorAction: (s,e) => {
 				validationMsg1.Add(e?.ValidationEventArgs?.Message ?? "no schema found?");
 			});
-			Assert.IsTrue(validator1.ValidateXML(XmlDocumentType.CustomerReport), string.Join("\n", validationMsg1));
+			Assert.IsTrue(validator1.ValidateXML(XmlDocumentType.CustomerReport), validationMsg1.Join("\n"));
 
 			var validationMsg2 = new List<string> {manufacturerRecord};
 			var validator2 = new XMLValidator(XmlReader.Create(manufacturerRecord), validationErrorAction: (s,e) => {
 				validationMsg2.Add(e?.ValidationEventArgs?.Message ?? "no schema found");
 			});
-			Assert.IsTrue(validator2.ValidateXML(XmlDocumentType.ManufacturerReport), string.Join("\n", validationMsg2));
+			Assert.IsTrue(validator2.ValidateXML(XmlDocumentType.ManufacturerReport), validationMsg2.Join("\n"));
 		}
 	}
 }
\ No newline at end of file