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/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/ElectricMotorMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorMapReader.cs
index abff89457f51f871ee566d57f1e3d8bcc81f0afd..87ce14fdeded1a6213944426cbd71d422731da7e 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 default names.",
+					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/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..f7f914d3ef5115d6b0f59de1189a742c9152d5e7 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);
 			}
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/PTOIdleLossMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/PTOIdleLossMapReader.cs
index 074d41cad997ac52c4942fa3a5940faacdb387e3..86c7d840e748e4a84c275f5ef7d634bb151139d1 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))) {
+				LoggingObject.Logger<RetarderLossMap>().Warn(
+					"PTO Idle LossMap: Header Line is not valid. Expected: '{0}, {1}', Got: '{2}'. Falling back to default names.",
+					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;
-				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)));
 			}
 
 			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..be825fece992cea14d8d9bd891605a42a5e1bb51 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,
+					"RetarderLossMap: Header Line is not valid. Expected: '{0}, {1}', Got: '{2}'. Falling back to default names.",
+					Fields.RetarderSpeed,
+					Fields.TorqueLoss,
 					string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+				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/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 3c1aabdc634724c31451afe87ff6f9bff6bc901d..e96fb5094ab019dba56d89aee0c4fff71b6cbbd0 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/TransmissionLossMapReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/TransmissionLossMapReader.cs
@@ -108,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];
 				}