Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/ExpertSystemViewBase.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/ExpertSystemViewBase.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/ExpertSystemViewBase.cs	(revision 13720)
@@ -25,4 +25,5 @@
 using HeuristicLab.OptimizationExpertSystem.Common;
 using System;
+using System.ComponentModel;
 
 namespace HeuristicLab.OptimizationExpertSystem {
@@ -42,22 +43,118 @@
     }
 
+    #region Event Registration
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
+      Content.PropertyChanged += ContentOnPropertyChanged;
       Content.DownloadStarted += ContentOnDownloadStarted;
+      RegisterContentProblemEvents();
+      RegisterContentProblemInstancesEvents();
+      RegisterContentSolutionSeedingPoolEvents();
+      RegisterContentSuggestedInstancesEvents();
+    }
+
+    private void RegisterContentProblemEvents() {
+      Content.Problem.ProblemChanged += ContentOnProblemChanged;
+      Content.Problem.Solutions.CollectionReset += ContentOnProblemSolutionsChanged;
+      Content.Problem.Solutions.ItemsAdded += ContentOnProblemSolutionsChanged;
+      Content.Problem.Solutions.ItemsReplaced += ContentOnProblemSolutionsChanged;
+      Content.Problem.Solutions.ItemsRemoved += ContentOnProblemSolutionsChanged;
+    }
+
+    private void RegisterContentProblemInstancesEvents() {
+      Content.ProblemInstances.UpdateOfRunsInProgressChanged += ContentOnProblemInstancesChanged;
+      Content.ProblemInstances.ItemsAdded += ContentOnProblemInstancesChanged;
+      Content.ProblemInstances.ItemsRemoved += ContentOnProblemInstancesChanged;
+      Content.ProblemInstances.CollectionReset += ContentOnProblemInstancesChanged;
+      Content.ProblemInstances.ItemChanged += ContentOnProblemInstancesChanged;
+    }
+
+    private void RegisterContentSolutionSeedingPoolEvents() {
+      Content.SolutionSeedingPool.CheckedItemsChanged += ContentOnSolutionSeedingPoolChanged;
+      Content.SolutionSeedingPool.CollectionReset += ContentOnSolutionSeedingPoolChanged;
+      Content.SolutionSeedingPool.ItemsAdded += ContentOnSolutionSeedingPoolChanged;
+      Content.SolutionSeedingPool.ItemsRemoved += ContentOnSolutionSeedingPoolChanged;
+      Content.SolutionSeedingPool.ItemsReplaced += ContentOnSolutionSeedingPoolChanged;
+    }
+
+    private void RegisterContentSuggestedInstancesEvents() {
+      Content.SuggestedInstances.CollectionReset += ContentOnSuggestedInstancesChanged;
+      Content.SuggestedInstances.ItemsAdded += ContentOnSuggestedInstancesChanged;
+      Content.SuggestedInstances.ItemsMoved += ContentOnSuggestedInstancesChanged;
+      Content.SuggestedInstances.ItemsRemoved += ContentOnSuggestedInstancesChanged;
+      Content.SuggestedInstances.ItemsReplaced += ContentOnSuggestedInstancesChanged;
     }
 
     protected override void DeregisterContentEvents() {
       base.DeregisterContentEvents();
+      Content.PropertyChanged -= ContentOnPropertyChanged;
       Content.DownloadStarted -= ContentOnDownloadStarted;
+      DeregisterContentProblemEvents();
+      DeregisterContentProblemInstancesEvents();
+      DeregisterContentSolutionSeedingPoolEvents();
+      DeregisterContentSuggestedInstancesEvents();
     }
 
-    protected virtual void OnDownloadStarted() { }
+    private void DeregisterContentProblemEvents() {
+      Content.Problem.ProblemChanged -= ContentOnProblemChanged;
+      Content.Problem.Solutions.CollectionReset -= ContentOnProblemSolutionsChanged;
+      Content.Problem.Solutions.ItemsAdded -= ContentOnProblemSolutionsChanged;
+      Content.Problem.Solutions.ItemsReplaced -= ContentOnProblemSolutionsChanged;
+      Content.Problem.Solutions.ItemsRemoved -= ContentOnProblemSolutionsChanged;
+    }
+
+    private void DeregisterContentProblemInstancesEvents() {
+      Content.ProblemInstances.UpdateOfRunsInProgressChanged -= ContentOnProblemInstancesChanged;
+      Content.ProblemInstances.ItemsAdded -= ContentOnProblemInstancesChanged;
+      Content.ProblemInstances.ItemsRemoved -= ContentOnProblemInstancesChanged;
+      Content.ProblemInstances.CollectionReset -= ContentOnProblemInstancesChanged;
+      Content.ProblemInstances.ItemChanged -= ContentOnProblemInstancesChanged;
+    }
+
+    private void DeregisterContentSolutionSeedingPoolEvents() {
+      Content.SolutionSeedingPool.CheckedItemsChanged -= ContentOnSolutionSeedingPoolChanged;
+      Content.SolutionSeedingPool.CollectionReset -= ContentOnSolutionSeedingPoolChanged;
+      Content.SolutionSeedingPool.ItemsAdded -= ContentOnSolutionSeedingPoolChanged;
+      Content.SolutionSeedingPool.ItemsRemoved -= ContentOnSolutionSeedingPoolChanged;
+      Content.SolutionSeedingPool.ItemsReplaced -= ContentOnSolutionSeedingPoolChanged;
+    }
+
+    private void DeregisterContentSuggestedInstancesEvents() {
+      Content.SuggestedInstances.CollectionReset -= ContentOnSuggestedInstancesChanged;
+      Content.SuggestedInstances.ItemsAdded -= ContentOnSuggestedInstancesChanged;
+      Content.SuggestedInstances.ItemsMoved -= ContentOnSuggestedInstancesChanged;
+      Content.SuggestedInstances.ItemsRemoved -= ContentOnSuggestedInstancesChanged;
+      Content.SuggestedInstances.ItemsReplaced -= ContentOnSuggestedInstancesChanged;
+    }
+    #endregion
+
+    private void ContentOnPropertyChanged(object sender, PropertyChangedEventArgs e) {
+      if (InvokeRequired) Invoke((Action<string>)OnPropertyChanged, e.PropertyName);
+      else {
+        switch (e.PropertyName) {
+          case "Problem": RegisterContentProblemEvents(); break;
+          case "ProblemInstances": RegisterContentProblemInstancesEvents(); break;
+          case "SolutionSeedingPool": RegisterContentSolutionSeedingPoolEvents(); break;
+          case "SuggestedInstances": RegisterContentSuggestedInstancesEvents(); break;
+        }
+        OnPropertyChanged(e.PropertyName);
+      }
+    }
+
+    protected virtual void OnDownloadStarted(IProgress progress) { }
     protected virtual void OnDownloadEnded() { }
+    protected virtual void OnPropertyChanged(string propertyName) { }
+    protected virtual void OnProblemChanged() { }
+    protected virtual void OnProblemSolutionsChanged() { }
+    protected virtual void OnProblemInstancesChanged() { }
+    protected virtual void OnSolutionSeedingPoolChanged() { }
+    protected virtual void OnSuggestedInstancesChanged() { }
 
+    #region Content Event Handlers
     private void ContentOnDownloadStarted(object sender, EventArgs<IProgress> e) {
       if (InvokeRequired) { Invoke((Action<object, EventArgs<IProgress>>)ContentOnDownloadStarted, sender, e); return; }
       MainForm.AddOperationProgressToView(this, e.Value);
       e.Value.ProgressStateChanged += ProgressOnStateChanged;
-      OnDownloadStarted();
+      OnDownloadStarted(e.Value);
     }
 
@@ -68,4 +165,30 @@
       OnDownloadEnded();
     }
+
+    private void ContentOnProblemChanged(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke((Action)OnProblemChanged);
+      else OnProblemChanged();
+    }
+
+    private void ContentOnProblemSolutionsChanged(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke((Action)OnProblemSolutionsChanged);
+      else OnProblemSolutionsChanged();
+    }
+
+    private void ContentOnProblemInstancesChanged(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke((Action)OnProblemInstancesChanged);
+      else OnProblemInstancesChanged();
+    }
+
+    private void ContentOnSolutionSeedingPoolChanged(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke((Action)OnSolutionSeedingPoolChanged);
+      else OnSolutionSeedingPoolChanged();
+    }
+
+    private void ContentOnSuggestedInstancesChanged(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke((Action)OnSuggestedInstancesChanged);
+      else OnSuggestedInstancesChanged();
+    }
+    #endregion
   }
 }
