diff --git a/VectoCommon/VectoCommon/Utils/Validation.cs b/VectoCommon/VectoCommon/Utils/Validation.cs
index ebfe5f6b5d21df369c3ba563e091211e249aaae4..0f8a09e0fae001de5bdf70dfeae665e1deb77048 100644
--- a/VectoCommon/VectoCommon/Utils/Validation.cs
+++ b/VectoCommon/VectoCommon/Utils/Validation.cs
@@ -114,19 +114,31 @@ namespace TUGraz.VectoCommon.Utils
 			const BindingFlags flags =
 				BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public |
 				BindingFlags.FlattenHierarchy;
-			var prop = obj.GetProperty(m.Name, flags);
-			if (prop != null) {
-				attributes = prop.GetCustomAttributes(typeof(T))
-					.Cast<T>()
-					.Concat(obj.GetInterfaces().SelectMany(m.GetAttributes<T>));
+
+			if (m.MemberType == MemberTypes.Property) {
+				PropertyInfo prop = m as PropertyInfo ?? obj.GetProperty(m.Name, flags);
+				//var prop = obj.GetProperty(m.Name, flags);
+				if (prop != null)
+				{
+					//if (m is PropertyInfo prop) {
+					attributes = prop.GetCustomAttributes(typeof(T))
+						.Cast<T>()
+						.Concat(obj.GetInterfaces().SelectMany(m.GetAttributes<T>));
+				}
 			}
 
-			var field = obj.GetField(m.Name, flags);
-			if (field != null) {
-				attributes =
-					attributes.Concat(
-						field.GetCustomAttributes(typeof(T)).Cast<T>().Concat(obj.GetInterfaces().SelectMany(m.GetAttributes<T>)));
+			if (m.MemberType == MemberTypes.Field) {
+				FieldInfo field = m as FieldInfo ?? obj.GetField(m.Name, flags);
+				//var field = obj.GetField(m.Name, flags);
+				if (field != null)
+				{
+					//if (m is FieldInfo field) {
+					attributes =
+						attributes.Concat(
+							field.GetCustomAttributes(typeof(T)).Cast<T>().Concat(obj.GetInterfaces().SelectMany(m.GetAttributes<T>)));
+				}
 			}
+            
 
 			return attributes;
 		}
diff --git a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs
index 5d70de6d7b96c3569973e759548e1aafa5e10131..1de50e55976c3988d07b31c83ef3a116f8a2807c 100644
--- a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs
@@ -30,6 +30,7 @@
 */
 
 using System;
+using System.Collections.Concurrent;
 using System.Reflection;
 using System.Text.RegularExpressions;
 using TUGraz.VectoCommon.Utils;
@@ -473,6 +474,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 
 	public static class ModalResultFieldExtensionMethods
 	{
+		private static ConcurrentDictionary<ModalResultField, ModalResultFieldAttribute> _attributeDictionary =
+			new ConcurrentDictionary<ModalResultField, ModalResultFieldAttribute>();
 		public static string GetName(this ModalResultField field)
 		{
 			return GetAttribute(field).Name ?? field.ToString();
@@ -480,7 +483,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 
 		public static string GetCaption(this ModalResultField field)
 		{
-			return GetAttribute(field).Caption ?? GetAttribute(field).Name ?? field.ToString();
+			var attribute = GetAttribute(field);
+			return attribute.Caption ?? attribute.Name ?? field.ToString();
 		}
 
 		public static string GetShortCaption(this ModalResultField field)
@@ -496,7 +500,14 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 
 		public static ModalResultFieldAttribute GetAttribute(this ModalResultField field)
 		{
-			return (ModalResultFieldAttribute)Attribute.GetCustomAttribute(ForValue(field), typeof(ModalResultFieldAttribute));
+			var attributeCached = _attributeDictionary.TryGetValue(field, out var attribute);
+			if (attributeCached) {
+				return attribute;
+			} else {
+				attribute = (ModalResultFieldAttribute)Attribute.GetCustomAttribute(ForValue(field), typeof(ModalResultFieldAttribute));
+				_attributeDictionary.TryAdd(field, attribute);
+			}
+			return attribute;
 		}
 
 		private static MemberInfo ForValue(ModalResultField field)
diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
index eced7a84e0c870660fa6a9234122bfa8f6c303a0..eb7b0ee71169ccb8397289f64937aafa21a25f05 100644
--- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
@@ -76,7 +76,7 @@ namespace TUGraz.VectoCore.OutputData
 		};
 
 		// ReSharper restore InconsistentNaming
-
+		private object _tableLock = new object();
 		internal readonly DataTable Table;
 		private readonly ISummaryWriter _sumWriter;
 
@@ -272,18 +272,29 @@ namespace TUGraz.VectoCore.OutputData
 		/// <summary>
 		/// Writes the result of one run into the summary data container.
 		/// </summary>
-		[MethodImpl(MethodImplOptions.Synchronized)]
+		//[MethodImpl(MethodImplOptions.Synchronized)]
 		protected DataRow GetResultRow(IModalDataContainer modData, VectoRunData runData)
 		{
-			if (modData.HasCombustionEngine) {
-				UpdateTableColumns(modData.FuelData, runData.EngineData.MultipleEngineFuelModes);
+			lock (_tableLock) {
+				if (modData.HasCombustionEngine)
+				{
+					UpdateTableColumns(modData.FuelData, runData.EngineData.MultipleEngineFuelModes);
+				}
+
+				var row = Table.NewRow();
+				//Table.Rows.Add(row);
+				return row;
 			}
+		}
 
-			var row = Table.NewRow();
-			Table.Rows.Add(row);
-			return row;
+		protected void AddResultRow(DataRow row)
+		{
+			lock (_tableLock) {
+				Table.Rows.Add(row);
+			}
 		}
 
+		//[MethodImpl(MethodImplOptions.Synchronized)]
 		public virtual void Write(IModalDataContainer modData, int jobNr, int runNr, VectoRunData runData)
 		{
 			var row = GetResultRow(modData, runData);
@@ -375,6 +386,8 @@ namespace TUGraz.VectoCore.OutputData
 			}
 
 			WriteGearshiftStats(modData, row, gearCount);
+
+			AddResultRow(row);
 		}