diff --git a/.gitignore b/.gitignore
index c2960974ac4e1a4cf6ccce8e5ae960f59bcc4ac1..0f4bd7bb9eb175ec9e68009448ae79a99b7038fd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -217,3 +217,4 @@ Documentation/VehiclesReleaseComparisonDeclarationMode/tmp/
 /VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/test+.xml
 /VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/test.VIF_Report_5.xml
 /VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/tests.xml
+/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/finalGroup41.VIF_Report_4.xml
diff --git a/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs b/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs
index 8b001c0ecdb1484a2ddcf1c8d0ba42655157409f..c98a24d601ddbf7cf0417da84c11d6d3657895b6 100644
--- a/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs
+++ b/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs
@@ -11,6 +11,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Data;
+using System.Windows.Forms;
 using System.Windows.Input;
 using System.Xml;
 using System.Xml.Linq;
@@ -335,7 +336,113 @@ namespace VECTO3GUI2020.ViewModel.Implementation
 						});
 				}
 			}
+			foreach (var cycle in jobContainer.GetCycleTypes())
+			{
+				outputMessages.Report(new MessageEntry()
+				{
+					Type = MessageType.StatusMessage, Message = $"Detected cycle {cycle.Name}: {cycle.CycleType}"
+				});
+			}
+
+			outputMessages.Report(new MessageEntry() {
+				Type = MessageType.StatusMessage,
+				Message = $"Starting simulation ({jobs.Length} jobs, {jobContainer.GetProgress().Count} runs)",
+			});
+
+			var start = Stopwatch.StartNew();
+			jobContainer.Execute(true);
+			while (!jobContainer.AllCompleted)
+			{
+				if (ct.IsCancellationRequested)
+				{
+					jobContainer.Cancel();
+					return;
+				}
+
+				var jobProgress = jobContainer.GetProgress();
+				var sumProgress = jobProgress.Sum(x => x.Value.Progress);
+				var duration = start.Elapsed.TotalSeconds;
+
+				progress.Report(Convert.ToInt32(sumProgress * 100 / jobProgress.Count));
+				//outputMessages.Report(
+				//	new MessageEntry()
+				//	{
+				//		Type = VectoSimulationProgress.MsgType.Progress,
+				//		Message = string.Format(
+				//			"Duration: {0:F1}s, Curernt Progress: {1:P} ({2})", duration, sumProgress / progress.Count,
+				//			string.Join(", ", progress.Select(x => string.Format("{0,4:P}", x.Value.Progress))))
+				//	});
+				var justFinished = jobProgress.Where(x => x.Value.Done & !finishedRuns.Contains(x.Key))
+					.ToDictionary(x => x.Key, x => x.Value);
+				//PrintRuns(justFinished, fileWriters);
+				finishedRuns.AddRange(justFinished.Select(x => x.Key));
+				Thread.Sleep(100);
+			}
+			start.Stop();
 
+			var remainingRuns = jobContainer.GetProgress().Where(x => x.Value.Done && !finishedRuns.Contains(x.Key))
+				.ToDictionary(x => x.Key, x => x.Value);
+			//PrintRuns(remainingRuns, fileWriters);
+
+			finishedRuns.Clear();
+			fileWriters.Clear();
+			foreach (var progressEntry in jobContainer.GetProgress())
+			{
+				outputMessages.Report(new MessageEntry()
+				{
+					Type = MessageType.StatusMessage,
+					Message =
+						string.Format("{0,-60} {1,8:P} {2,10:F2}s - {3}",
+							$"{progressEntry.Value.RunName} {progressEntry.Value.CycleName} {progressEntry.Value.RunSuffix}",
+							progressEntry.Value.Progress,
+							progressEntry.Value.ExecTime / 1000.0,
+							progressEntry.Value.Success ? "Success" : "Aborted")
+				});
+				if (!progressEntry.Value.Success)
+				{
+					outputMessages.Report(
+						new MessageEntry()
+						{
+							Type = MessageType.StatusMessage,
+							Message = progressEntry.Value.Error.Message
+						}
+					);
+				}
+			}
+			foreach (var jobEntry in jobs)
+			{
+				var w = new FileOutputWriter(GetOutputDirectory(jobEntry.DataSource.SourceFile));
+				foreach (var entry in new Dictionary<string, string>() { { w.XMLFullReportName, "XML ManufacturereReport" }, { w.XMLCustomerReportName, "XML Customer Report" }, { w.XMLVTPReportName, "VTP Report" }, { w.XMLPrimaryVehicleReportName, "Primary Vehicle Information File" } })
+				{
+					if (File.Exists(entry.Key))
+					{
+						outputMessages.Report(
+							new MessageEntry()
+							{
+								Type = MessageType.StatusMessage,
+								Message = string.Format(
+									"{2} for '{0}' written to {1}", Path.GetFileName(jobEntry.DataSource.SourceFile), entry.Key, entry.Value),
+								//Link = "<XML>" + entry.Key
+							});
+					}
+				}
+			}
+
+			if (File.Exists(sumFileWriter.SumFileName))
+			{
+				outputMessages.Report(new MessageEntry()
+				{
+					Type = MessageType.StatusMessage,
+					Message = string.Format("Sum file written to {0}", sumFileWriter.SumFileName),
+					//Link = "<CSV>" + sumFileWriter.SumFileName
+				});
+			}
+
+			outputMessages.Report(new MessageEntry()
+			{
+				Type = MessageType.StatusMessage,
+				Message = string.Format("Simulation finished in {0:F1}s", start.Elapsed.TotalSeconds)
+			});
 
 
 		}
diff --git a/VECTO3GUI2020/Views/Multistage/MultistageAirDragView.xaml b/VECTO3GUI2020/Views/Multistage/MultistageAirDragView.xaml
index 3eb4584508a506adcebea3e1751586bf590a7697..2b7cf405dff4475dcd99a4fea093e590e40558b9 100644
--- a/VECTO3GUI2020/Views/Multistage/MultistageAirDragView.xaml
+++ b/VECTO3GUI2020/Views/Multistage/MultistageAirDragView.xaml
@@ -30,13 +30,13 @@
                     </DockPanel>
 
                     <StackPanel HorizontalAlignment="Stretch" Margin="4" >
-                        
+                        <Label Style="{DynamicResource LabelStyle1}">Consolidated Airdrag Data</Label>
                         <StackPanel Visibility="{Binding ConsolidatedAirdragData, Converter={StaticResource NullToVisibilityConverter}}">
-                            <Label Style="{DynamicResource LabelStyle1}">Consolidated Airdrag Data</Label>
                             <customControlsMultistage:LabledTextBoxMultistage Content="{Binding ConsolidatedAirdragData.Manufacturer, Mode=OneWay}" ReadOnly="True"/>
                             <customControlsMultistage:LabledTextBoxMultistage Content="{Binding ConsolidatedAirdragData.Model, Mode=OneWay}" ReadOnly="True"/>
                             <customControlsMultistage:LabledTextBoxMultistage Content="{Binding ConsolidatedAirdragData.AirDragArea, Mode=OneWay}" ReadOnly="True"/>
                         </StackPanel>
+                        <Label Visibility="{Binding ConsolidatedAirdragData, Converter={StaticResource NullToVisibilityConverter}, ConverterParameter=invert}">No data set</Label>
                         <Label Style="{DynamicResource LabelStyle1}">Data from File</Label>
                         <ContentControl Content="{Binding AirDragViewModel}" 
                                         Visibility="{Binding AirDragViewModel, Converter={StaticResource NullToVisibilityConverter}}">
diff --git a/VECTO3GUI2020/Views/OutputView.xaml b/VECTO3GUI2020/Views/OutputView.xaml
index 03784a8b05949d55c1fc1fe9811e1a66d349eb84..89a5c64cec674706e509832a5e5295d41a458ee2 100644
--- a/VECTO3GUI2020/Views/OutputView.xaml
+++ b/VECTO3GUI2020/Views/OutputView.xaml
@@ -14,7 +14,13 @@
                       IsReadOnly="True" HeadersVisibility="All"  RowHeaderWidth="5" Name="MessageList">
 
             <DataGrid.Columns>
-                <DataGridTextColumn Header="Message" Binding="{Binding Message}" Width="*" />
+                    <DataGridTextColumn Header="Message" Binding="{Binding Message}" Width="*">
+                        <DataGridTextColumn.ElementStyle>
+                            <Style>
+                                <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
+                            </Style>
+                        </DataGridTextColumn.ElementStyle>
+                    </DataGridTextColumn>
                     <DataGridTextColumn Header="Time" Binding="{Binding Time}" Width="130" />
                 </DataGrid.Columns>
             <DataGrid.RowStyle>