Index: stable/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.cs
===================================================================
--- stable/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.cs	(revision 17499)
+++ stable/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.cs	(revision 17500)
@@ -25,23 +25,16 @@
 namespace HeuristicLab.MainForm.WindowsForms {
   internal sealed partial class ProgressView : UserControl {
-    private readonly Control control;
-    public Control Control {
-      get { return control; }
-    }
-
-    private readonly IProgress content;
-    public IProgress Content {
-      get { return content; }
-    }
-
-    public ProgressView(Control control, IProgress content)
+    public Control TargetControl { get; }
+    public IProgress Content { get; }
+
+    public ProgressView(Control targetControl, IProgress content)
       : base() {
-      if (control == null) throw new ArgumentNullException("control");
-      if (control.Parent == null) throw new InvalidOperationException("A Progress can only be shown on controls that have a Parent-control. Therefore, Dialogs and Forms cannot have an associated ProgressView.");
-      if (content == null) throw new ArgumentNullException("content");
+      if (targetControl == null) throw new ArgumentNullException(nameof(targetControl));
+      if (targetControl.Parent == null) throw new InvalidOperationException("A Progress can only be shown on controls that have a Parent-control. Therefore, Dialogs and Forms cannot have an associated ProgressView.");
+      if (content == null) throw new ArgumentNullException(nameof(content));
       InitializeComponent();
 
-      this.control = control;
-      this.content = content;
+      this.TargetControl = targetControl;
+      this.Content = content;
 
       if (content.ProgressState != ProgressState.Finished)
@@ -52,7 +45,9 @@
     protected override void Dispose(bool disposing) {
       DeregisterContentEvents();
-      HideProgress();
-
-      if (disposing && (components != null)) {
+
+      if (!TargetControl.IsDisposed)
+        HideProgress();
+
+      if (disposing && components != null) {
         components.Dispose();
       }
@@ -101,12 +96,12 @@
 
     private void ShowProgress() {
-      if (Control.InvokeRequired) {
-        Control.Invoke((Action)ShowProgress);
+      if (TargetControl.InvokeRequired) {
+        TargetControl.Invoke((Action)ShowProgress);
         return;
       }
       if (Parent != null) return;
 
-      Left = (Control.ClientRectangle.Width / 2) - (Width / 2);
-      Top = (Control.ClientRectangle.Height / 2) - (Height / 2);
+      Left = (TargetControl.ClientRectangle.Width / 2) - (Width / 2);
+      Top = (TargetControl.ClientRectangle.Height / 2) - (Height / 2);
       Anchor = AnchorStyles.None;
 
@@ -115,15 +110,16 @@
       UpdateButtonsState();
 
-      Control.SuspendRepaint();
-      Control.Enabled = false;
-      Parent = Control.Parent;
+      TargetControl.SuspendRepaint();
+      TargetControl.Enabled = false;
+      RegisterTargetControlEvents();
+      Parent = TargetControl.Parent;
       BringToFront();
-      Control.ResumeRepaint(true);
+      TargetControl.ResumeRepaint(true);
       Visible = true;
     }
 
     private void HideProgress() {
-      if (Control.InvokeRequired) {
-        Control.Invoke((Action)HideProgress);
+      if (TargetControl.InvokeRequired) {
+        TargetControl.Invoke((Action)HideProgress);
         return;
       }
@@ -131,13 +127,37 @@
 
       Visible = false;
-      Control.SuspendRepaint();
-      Control.Enabled = true;
-      Control.ResumeRepaint(true);
+      TargetControl.SuspendRepaint();
+      TargetControl.Enabled = true;
+      DeregisterTargetControlEvents();
       Parent = null;
+      TargetControl.ResumeRepaint(TargetControl.Visible);
+    }
+
+
+    private void RegisterTargetControlEvents() {
+      TargetControl.Disposed += TargetControl_Disposed;
+      TargetControl.VisibleChanged += TargetControl_VisibleChanged;
+      TargetControl.ParentChanged += TargetControl_ParentChanged;
+    }
+
+    private void DeregisterTargetControlEvents() {
+      TargetControl.Disposed -= TargetControl_Disposed;
+      TargetControl.VisibleChanged -= TargetControl_VisibleChanged;
+      TargetControl.ParentChanged -= TargetControl_ParentChanged;
+    }
+
+    private void TargetControl_Disposed(object sender, EventArgs e) {
+      Dispose();
+    }
+    private void TargetControl_VisibleChanged(object sender, EventArgs e) {
+      Visible = TargetControl.Visible;
+    }
+    private void TargetControl_ParentChanged(object sender, EventArgs e) {
+      Parent = TargetControl.Parent;
     }
 
     private void UpdateProgressState() {
-      if (Control.InvokeRequired) {
-        Control.Invoke((Action)UpdateProgressState);
+      if (TargetControl.InvokeRequired) {
+        TargetControl.Invoke((Action)UpdateProgressState);
         return;
       }
@@ -150,10 +170,10 @@
 
     private void UpdateProgressMessage() {
-      if (Control.InvokeRequired) {
-        Control.Invoke((Action)UpdateProgressMessage);
-        return;
-      }
-
-      messageLabel.Text = content.Message;
+      if (TargetControl.InvokeRequired) {
+        TargetControl.Invoke((Action)UpdateProgressMessage);
+        return;
+      }
+
+      messageLabel.Text = Content.Message;
     }
 
@@ -167,5 +187,5 @@
         case ProgressMode.Determinate:
           progressBar.Style = ProgressBarStyle.Continuous;
-          progressBar.Value = (int)Math.Round(progressBar.Minimum + content.ProgressValue * (progressBar.Maximum - progressBar.Minimum));
+          progressBar.Value = (int)Math.Round(progressBar.Minimum + Content.ProgressValue * (progressBar.Maximum - progressBar.Minimum));
           break;
         case ProgressMode.Indeterminate:
@@ -174,19 +194,19 @@
           break;
         default:
-          throw new NotImplementedException($"Invalid Progress Mode: {content.ProgressMode}");
+          throw new NotImplementedException($"Invalid Progress Mode: {Content.ProgressMode}");
       }
     }
 
     private void UpdateButtonsState() {
-      if (Control.InvokeRequired) {
-        Control.Invoke((Action)UpdateButtonsState);
+      if (TargetControl.InvokeRequired) {
+        TargetControl.Invoke((Action)UpdateButtonsState);
         return;
       }
 
       stopButton.Visible = Content.CanBeStopped;
-      stopButton.Enabled = Content.CanBeStopped && content.ProgressState == ProgressState.Started;
+      stopButton.Enabled = Content.CanBeStopped && Content.ProgressState == ProgressState.Started;
 
       cancelButton.Visible = Content.CanBeCanceled;
-      cancelButton.Enabled = Content.CanBeCanceled && content.ProgressState == ProgressState.Started;
+      cancelButton.Enabled = Content.CanBeCanceled && Content.ProgressState == ProgressState.Started;
     }
 
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/SymbolicClassificationSolutionView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/SymbolicClassificationSolutionView.Designer.cs	(revision 17499)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/SymbolicClassificationSolutionView.Designer.cs	(revision 17500)
@@ -73,5 +73,5 @@
       this.btnSimplify.UseVisualStyleBackColor = true;
       this.btnSimplify.Click += new System.EventHandler(this.btn_SimplifyModel_Click);
-      this.toolTip.SetToolTip(this.btnSimplify, "Simplify solution");
+      this.toolTip.SetToolTip(this.btnSimplify, "Opens a new view for model simplification and manipulation.");
       // 
       // exportButton
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/SymbolicDiscriminantFunctionClassificationSolutionView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/SymbolicDiscriminantFunctionClassificationSolutionView.Designer.cs	(revision 17499)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/SymbolicDiscriminantFunctionClassificationSolutionView.Designer.cs	(revision 17500)
@@ -73,5 +73,5 @@
       this.btnSimplify.UseVisualStyleBackColor = true;
       this.btnSimplify.Click += new System.EventHandler(this.btn_SimplifyModel_Click);
-      this.toolTip.SetToolTip(this.btnSimplify, "Simplify solution");
+      this.toolTip.SetToolTip(this.btnSimplify, "Opens a new view for model simplification and manipulation.");
       // 
       // exportButton
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/InteractiveSymbolicRegressionSolutionSimplifierView.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/InteractiveSymbolicRegressionSolutionSimplifierView.cs	(revision 17499)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/InteractiveSymbolicRegressionSolutionSimplifierView.cs	(revision 17500)
@@ -53,9 +53,10 @@
     protected override ISymbolicExpressionTree OptimizeConstants(ISymbolicExpressionTree tree, IProgress progress) {
       const int constOptIterations = 50;
-      const int maxRepetitions = 1000;
+      const int maxRepetitions = 100;
+      const double minimumImprovement = 1e-10;
       var regressionProblemData = Content.ProblemData;
       var model = Content.Model;
       progress.CanBeStopped = true;
-      var prevResult = 0.0;
+      double prevResult = 0.0, improvement = 0.0;
       var result = 0.0;
       int reps = 0;
@@ -66,9 +67,10 @@
           applyLinearScaling: true, maxIterations: constOptIterations, updateVariableWeights: true, lowerEstimationLimit: model.LowerEstimationLimit, upperEstimationLimit: model.UpperEstimationLimit,
           iterationCallback: (args, func, obj) => {
-            double newProgressValue = progress.ProgressValue + 1.0 / (constOptIterations + 2); // (maxIterations + 2) iterations are reported
+            double newProgressValue = progress.ProgressValue + (1.0 / (constOptIterations + 2) / maxRepetitions); // (constOptIterations + 2) iterations are reported
             progress.ProgressValue = Math.Min(newProgressValue, 1.0);
           });
         reps++;
-      } while (prevResult < result && reps < maxRepetitions &&
+        improvement = result - prevResult;
+      } while (improvement > minimumImprovement && reps < maxRepetitions &&
                progress.ProgressState != ProgressState.StopRequested &&
                progress.ProgressState != ProgressState.CancelRequested);
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/SymbolicRegressionSolutionView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/SymbolicRegressionSolutionView.Designer.cs	(revision 17499)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/SymbolicRegressionSolutionView.Designer.cs	(revision 17500)
@@ -75,5 +75,5 @@
       this.btnSimplify.UseVisualStyleBackColor = true;
       this.btnSimplify.Click += new System.EventHandler(this.btn_SimplifyModel_Click);
-      this.toolTip.SetToolTip(this.btnSimplify, "Simplify solution");
+      this.toolTip.SetToolTip(this.btnSimplify, "Opens a new view for model simplification and manipulation.");
       // 
       // exportButton
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis.Views/3.4/SymbolicTimeSeriesPrognosisSolutionView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis.Views/3.4/SymbolicTimeSeriesPrognosisSolutionView.Designer.cs	(revision 17499)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis.Views/3.4/SymbolicTimeSeriesPrognosisSolutionView.Designer.cs	(revision 17500)
@@ -70,5 +70,5 @@
       this.btnSimplify.UseVisualStyleBackColor = true;
       this.btnSimplify.Click += new System.EventHandler(this.btn_SimplifyModel_Click);
-      this.toolTip.SetToolTip(this.btnSimplify, "Simplify solution");
+      this.toolTip.SetToolTip(this.btnSimplify, "Opens a new view for model simplification and manipulation.");
       // 
       // SymbolicTimeSeriesPrognosisSolutionView
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.Designer.cs	(revision 17499)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.Designer.cs	(revision 17500)
@@ -57,4 +57,5 @@
       this.grpViewHost = new System.Windows.Forms.GroupBox();
       this.treeChart = new HeuristicLab.Problems.DataAnalysis.Symbolic.Views.InteractiveSymbolicExpressionTreeChart();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
       this.splitContainer.Panel1.SuspendLayout();
@@ -148,4 +149,5 @@
       this.btnSimplify.Text = "Simplify";
       this.btnSimplify.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.btnSimplify, "Simplifies the model structure based on mathematical simplification rules.");
       this.btnSimplify.UseVisualStyleBackColor = true;
       this.btnSimplify.Click += new System.EventHandler(this.btnSimplify_Click);
@@ -162,4 +164,6 @@
       this.btnOptimizeConstants.Text = "Optimize";
       this.btnOptimizeConstants.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.btnOptimizeConstants, "Optimizes the numerical constants of the model. \r\nIf the algorithm converges, opt" +
+        "imization is stopped.");
       this.btnOptimizeConstants.UseVisualStyleBackColor = true;
       this.btnOptimizeConstants.Click += new System.EventHandler(this.btnOptimizeConstants_Click);
@@ -226,4 +230,5 @@
     protected System.Windows.Forms.Button btnOptimizeConstants;
     private System.Windows.Forms.Label treeStatusValue;
+    private System.Windows.Forms.ToolTip toolTip;
   }
 }
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs	(revision 17499)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs	(revision 17500)
@@ -193,16 +193,22 @@
 
       progress.Start("Calculate Impact and Replacement Values ...");
+      cancellationTokenSource = new CancellationTokenSource();
       progress.CanBeStopped = true;
-      cancellationTokenSource = new CancellationTokenSource();
-      var impactAndReplacementValues = await Task.Run(() => CalculateImpactAndReplacementValues(tree));
       try {
-        await Task.Delay(500, cancellationTokenSource.Token); // wait for progressbar to finish animation
-      } catch (OperationCanceledException) { }
-      var replacementValues = impactAndReplacementValues.ToDictionary(x => x.Key, x => x.Value.Item2);
-      foreach (var pair in replacementValues.Where(pair => !(pair.Key is ConstantTreeNode))) {
-        foldedNodes[pair.Key] = MakeConstantTreeNode(pair.Value);
-      }
-      nodeImpacts = impactAndReplacementValues.ToDictionary(x => x.Key, x => x.Value.Item1);
-      progress.Finish();
+        var impactAndReplacementValues = await Task.Run(() => CalculateImpactAndReplacementValues(tree));
+        try {
+          await Task.Delay(300, cancellationTokenSource.Token); // wait for progressbar to finish animation
+        } catch (OperationCanceledException) { }
+
+        var replacementValues = impactAndReplacementValues.ToDictionary(x => x.Key, x => x.Value.Item2);
+        foreach (var pair in replacementValues.Where(pair => !(pair.Key is ConstantTreeNode))) {
+          foldedNodes[pair.Key] = MakeConstantTreeNode(pair.Value);
+        }
+
+        nodeImpacts = impactAndReplacementValues.ToDictionary(x => x.Key, x => x.Value.Item1);
+      } finally {
+        progress.Finish();
+      }
+
       progress.CanBeStopped = false;
       PaintNodeImpacts();
@@ -314,10 +320,15 @@
     private async void btnOptimizeConstants_Click(object sender, EventArgs e) {
       progress.Start("Optimizing Constants ...");
+      cancellationTokenSource = new CancellationTokenSource();
+      progress.CanBeStopped = true;
       try {
         var tree = (ISymbolicExpressionTree)Content.Model.SymbolicExpressionTree.Clone();
+
         var newTree = await Task.Run(() => OptimizeConstants(tree, progress));
-        await Task.Delay(500); // wait for progressbar to finish animation
-        UpdateModel(newTree);
-      } finally {
+        try {
+          await Task.Delay(300, cancellationTokenSource.Token); // wait for progressbar to finish animation
+        } catch (OperationCanceledException) { }
+        UpdateModel(newTree); // triggers progress.Finish after calculating the node impacts when model is changed
+      } catch {
         progress.Finish();
       }
Index: stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationSolutionVariableImpactsView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationSolutionVariableImpactsView.Designer.cs	(revision 17499)
+++ stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationSolutionVariableImpactsView.Designer.cs	(revision 17500)
@@ -192,5 +192,4 @@
       this.Name = "ClassificationSolutionVariableImpactsView";
       this.Size = new System.Drawing.Size(712, 365);
-      this.VisibleChanged += new System.EventHandler(this.ClassificationSolutionVariableImpactsView_VisibleChanged);
       this.ResumeLayout(false);
       this.PerformLayout();
Index: stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationSolutionVariableImpactsView.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationSolutionVariableImpactsView.cs	(revision 17499)
+++ stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationSolutionVariableImpactsView.cs	(revision 17500)
@@ -25,4 +25,5 @@
 using System.Threading;
 using System.Threading.Tasks;
+using System.Windows.Forms;
 using HeuristicLab.Common;
 using HeuristicLab.Data;
@@ -86,5 +87,13 @@
       }
     }
-    private void ClassificationSolutionVariableImpactsView_VisibleChanged(object sender, EventArgs e) {
+    protected override void OnVisibleChanged(EventArgs e) {
+      base.OnVisibleChanged(e);
+      if (!this.Visible) {
+        cancellationToken.Cancel();
+      }
+    }
+
+    protected override void OnClosed(FormClosedEventArgs e) {
+      base.OnClosed(e);
       cancellationToken.Cancel();
     }
@@ -137,10 +146,9 @@
           .ToList();
 
-        List<Tuple<string, double>> impacts = null;
-        await Task.Run(() => { impacts = CalculateVariableImpacts(originalVariableOrdering, Content.Model, problemData, Content.EstimatedClassValues, dataPartition, replMethod, factorReplMethod, cancellationToken.Token, progress); });
-        if (impacts == null) { return; }
+        var impacts = await Task.Run(() => CalculateVariableImpacts(originalVariableOrdering, Content.Model, problemData, Content.EstimatedClassValues, dataPartition, replMethod, factorReplMethod, cancellationToken.Token, progress));
 
         rawVariableImpacts.AddRange(impacts);
         UpdateOrdering();
+      } catch (OperationCanceledException) {
       } finally {
         Progress.Hide(this);
@@ -169,5 +177,5 @@
       var clonedModel = (IClassificationModel)model.Clone();
       foreach (var variableName in originalVariableOrdering) {
-        if (cancellationToken.Token.IsCancellationRequested) { return null; }
+        token.ThrowIfCancellationRequested();
         progress.ProgressValue = (double)++i / count;
         progress.Message = string.Format("Calculating impact for variable {0} ({1} of {2})", variableName, i, count);
Index: stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionVariableImpactsView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionVariableImpactsView.Designer.cs	(revision 17499)
+++ stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionVariableImpactsView.Designer.cs	(revision 17500)
@@ -192,5 +192,4 @@
       this.Name = "RegressionSolutionVariableImpactsView";
       this.Size = new System.Drawing.Size(712, 365);
-      this.VisibleChanged += new System.EventHandler(this.RegressionSolutionVariableImpactsView_VisibleChanged);
       this.ResumeLayout(false);
       this.PerformLayout();
Index: stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionVariableImpactsView.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionVariableImpactsView.cs	(revision 17499)
+++ stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionVariableImpactsView.cs	(revision 17500)
@@ -25,4 +25,5 @@
 using System.Threading;
 using System.Threading.Tasks;
+using System.Windows.Forms;
 using HeuristicLab.Common;
 using HeuristicLab.Data;
@@ -86,5 +87,14 @@
       }
     }
-    private void RegressionSolutionVariableImpactsView_VisibleChanged(object sender, EventArgs e) {
+
+    protected override void OnVisibleChanged(EventArgs e) {
+      base.OnVisibleChanged(e);
+      if (!this.Visible) {
+        cancellationToken.Cancel();
+      }
+    }
+
+    protected override void OnClosed(FormClosedEventArgs e) {
+      base.OnClosed(e);
       cancellationToken.Cancel();
     }
@@ -135,12 +145,10 @@
           .ToList();
 
-        List<Tuple<string, double>> impacts = null;
-        await Task.Run(() => { impacts = CalculateVariableImpacts(originalVariableOrdering, Content.Model, problemData, Content.EstimatedValues, dataPartition, replMethod, factorReplMethod, cancellationToken.Token, progress); });
-        if (impacts == null) { return; }
+        var impacts = await Task.Run(() => CalculateVariableImpacts(originalVariableOrdering, Content.Model, problemData, Content.EstimatedValues, dataPartition, replMethod, factorReplMethod, cancellationToken.Token, progress));
 
         rawVariableImpacts.AddRange(impacts);
         UpdateOrdering();
-      }
-      finally {
+      } catch (OperationCanceledException) {
+      } finally {
         Progress.Hide(this);
       }
@@ -168,5 +176,5 @@
 
       foreach (var variableName in originalVariableOrdering) {
-        if (cancellationToken.Token.IsCancellationRequested) { return null; }
+        token.ThrowIfCancellationRequested();
         progress.ProgressValue = (double)++i / count;
         progress.Message = string.Format("Calculating impact for variable {0} ({1} of {2})", variableName, i, count);
