Index: trunk/sources/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBRunView.cs
===================================================================
--- trunk/sources/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBRunView.cs	(revision 11343)
+++ trunk/sources/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBRunView.cs	(revision 11344)
@@ -21,4 +21,5 @@
 
 using System;
+using System.ComponentModel;
 using System.Windows.Forms;
 using HeuristicLab.Core.Views;
@@ -40,10 +41,10 @@
 
     protected override void DeregisterContentEvents() {
-      Content.StoredChanged -= new System.EventHandler(Content_StoredChanged);
+      Content.PropertyChanged -= Content_PropertyChanged;
       base.DeregisterContentEvents();
     }
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      Content.StoredChanged += new System.EventHandler(Content_StoredChanged);
+      Content.PropertyChanged += Content_PropertyChanged;
     }
 
@@ -59,6 +60,7 @@
 
     #region Content Events
-    private void Content_StoredChanged(object sender, System.EventArgs e) {
-      storeButton.Enabled = !Content.Stored;
+    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      if (e.PropertyName == "Stored")
+        storeButton.Enabled = !Content.Stored;
     }
     #endregion
@@ -68,10 +70,8 @@
       try {
         Content.Store();
-      }
-      catch (MissingClientRegistrationException) {
+      } catch (MissingClientRegistrationException) {
         MessageBox.Show("You have to register your client to be able to store OKB runs." + Environment.NewLine
           + " Please click in the menu bar on Services -> Access -> Client Information and register your client. ", "Missing client registration", MessageBoxButtons.OK, MessageBoxIcon.Information);
-      }
-      catch (Exception ex) {
+      } catch (Exception ex) {
         ErrorHandling.ShowErrorDialog(this, "Store failed.", ex);
       }
Index: trunk/sources/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBRun.cs
===================================================================
--- trunk/sources/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBRun.cs	(revision 11343)
+++ trunk/sources/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBRun.cs	(revision 11344)
@@ -22,7 +22,9 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Drawing;
 using System.IO;
 using HeuristicLab.Clients.Access;
+using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -51,5 +53,5 @@
         if (value != stored) {
           stored = value;
-          OnStoredChanged();
+          OnPropertyChanged("Stored");
           OnItemImageChanged();
         }
@@ -60,8 +62,8 @@
       get { return WrappedItem.Algorithm; }
     }
-    public IDictionary<string, IItem> Parameters {
+    public IObservableDictionary<string, IItem> Parameters {
       get { return WrappedItem.Parameters; }
     }
-    public IDictionary<string, IItem> Results {
+    public IObservableDictionary<string, IItem> Results {
       get { return WrappedItem.Results; }
     }
@@ -162,26 +164,21 @@
 
     #region Events
-    public event EventHandler Changed;
-    private void OnChanged() {
-      var handler = Changed;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler StoredChanged;
-    private void OnStoredChanged() {
-      var handler = StoredChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
+    public event PropertyChangedEventHandler PropertyChanged;
+    private void OnPropertyChanged(string property) {
+      var handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(property));
     }
 
     protected override void RegisterWrappedItemEvents() {
       base.RegisterWrappedItemEvents();
-      WrappedItem.Changed += new EventHandler(WrappedItem_Changed);
+      WrappedItem.PropertyChanged += WrappedItem_PropertyChanged;
     }
     protected override void DeregisterWrappedItemEvents() {
-      WrappedItem.Changed -= new EventHandler(WrappedItem_Changed);
+      WrappedItem.PropertyChanged -= WrappedItem_PropertyChanged;
       base.DeregisterWrappedItemEvents();
     }
 
-    private void WrappedItem_Changed(object sender, EventArgs e) {
-      OnChanged();
+    private void WrappedItem_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      OnPropertyChanged(e.PropertyName);
     }
     #endregion
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs	(revision 11343)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs	(revision 11344)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Linq;
 using System.Windows.Forms;
@@ -92,9 +93,9 @@
     protected virtual void RegisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
-        run.Changed += new EventHandler(run_Changed);
+        run.PropertyChanged += run_PropertyChanged;
     }
     protected virtual void DeregisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
-        run.Changed -= new EventHandler(run_Changed);
+        run.PropertyChanged -= run_PropertyChanged;
     }
 
@@ -133,9 +134,10 @@
       }
     }
-    private void run_Changed(object sender, EventArgs e) {
+    private void run_PropertyChanged(object sender, PropertyChangedEventArgs e) {
       if (InvokeRequired)
-        this.Invoke(new EventHandler(run_Changed), sender, e);
+        this.Invoke((Action<object, PropertyChangedEventArgs>)run_PropertyChanged, sender, e);
       else if (!suppressUpdates) {
-        UpdateDataPoints();
+        if (e.PropertyName == "Visible")
+          UpdateDataPoints();
       }
     }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.cs	(revision 11343)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.cs	(revision 11344)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Drawing;
 using System.Linq;
@@ -116,9 +117,9 @@
     protected virtual void RegisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
-        run.Changed += new EventHandler(run_Changed);
+        run.PropertyChanged += run_PropertyChanged;
     }
     protected virtual void DeregisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
-        run.Changed -= new EventHandler(run_Changed);
+        run.PropertyChanged -= run_PropertyChanged;
     }
 
@@ -133,14 +134,16 @@
       RegisterRunEvents(e.Items);
     }
-    private void run_Changed(object sender, EventArgs e) {
+    private void run_PropertyChanged(object sender, PropertyChangedEventArgs e) {
       if (suppressUpdates) return;
       if (InvokeRequired)
-        this.Invoke(new EventHandler(run_Changed), sender, e);
+        this.Invoke((Action<object, PropertyChangedEventArgs>)run_PropertyChanged, sender, e);
       else {
-        IRun run = (IRun)sender;
-        UpdateRun(run);
-        UpdateCursorInterval();
-        chart.ChartAreas[0].RecalculateAxesScale();
-        UpdateAxisLabels();
+        if (e.PropertyName == "Color" || e.PropertyName == "Visible") {
+          IRun run = (IRun)sender;
+          UpdateRun(run);
+          UpdateCursorInterval();
+          chart.ChartAreas[0].RecalculateAxesScale();
+          UpdateAxisLabels();
+        }
       }
     }
@@ -670,6 +673,6 @@
       if (xAxisValue != null)
         xAxis.Title = xAxisValue;
-      if(yAxisValue != null)
-      yAxis.Title = yAxisValue;
+      if (yAxisValue != null)
+        yAxis.Title = yAxisValue;
     }
 
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.cs	(revision 11343)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.cs	(revision 11344)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Linq;
 using System.Windows.Forms;
@@ -111,13 +112,18 @@
 
     private void RegisterRunEvents(IRun run) {
-      run.Changed += new System.EventHandler(run_Changed);
+      run.PropertyChanged += run_PropertyChanged;
     }
     private void DeregisterRunEvents(IRun run) {
-      run.Changed -= new System.EventHandler(run_Changed);
-    }
-    private void run_Changed(object sender, EventArgs e) {
+      run.PropertyChanged -= run_PropertyChanged;
+    }
+    private void run_PropertyChanged(object sender, PropertyChangedEventArgs e) {
       if (suppressUpdates) return;
-      var run = (IRun)sender;
-      UpdateRuns(new IRun[] { run });
+      if (InvokeRequired) {
+        Invoke((Action<object, PropertyChangedEventArgs>)run_PropertyChanged, sender, e);
+      } else {
+        var run = (IRun)sender;
+        if (e.PropertyName == "Color" || e.PropertyName == "Visible")
+          UpdateRuns(new IRun[] { run });
+      }
     }
     #endregion
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.cs	(revision 11343)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.cs	(revision 11344)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Linq;
 using System.Windows.Forms;
@@ -70,5 +71,5 @@
     private void RegisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
-        run.Changed += new EventHandler(run_Changed);
+        run.PropertyChanged += run_PropertyChanged;
     }
     protected override void DeregisterContentEvents() {
@@ -83,5 +84,5 @@
     private void DeregisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
-        run.Changed -= new EventHandler(run_Changed);
+        run.PropertyChanged -= run_PropertyChanged;
     }
     private void Content_CollectionReset(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
@@ -100,11 +101,12 @@
       else UpdateCaption();
     }
-    private void run_Changed(object sender, EventArgs e) {
+    private void run_PropertyChanged(object sender, PropertyChangedEventArgs e) {
       if (suppressUpdates) return;
       if (InvokeRequired)
-        this.Invoke(new EventHandler(run_Changed), sender, e);
+        this.Invoke((Action<object, PropertyChangedEventArgs>)run_PropertyChanged, sender, e);
       else {
         IRun run = (IRun)sender;
-        UpdateRun(run);
+        if (e.PropertyName == "Color" || e.PropertyName == "Visible")
+          UpdateRun(run);
       }
     }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionView.cs	(revision 11343)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionView.cs	(revision 11344)
@@ -23,4 +23,5 @@
 using System.Collections;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Drawing;
 using System.Linq;
@@ -79,10 +80,10 @@
       item.ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
       item.ToStringChanged -= new EventHandler(Item_ToStringChanged);
-      item.Changed -= new EventHandler(Item_Changed);
+      item.PropertyChanged -= Item_PropertyChanged;
     }
     private void RegisterItemEvents(IRun item) {
       item.ItemImageChanged += new EventHandler(Item_ItemImageChanged);
       item.ToStringChanged += new EventHandler(Item_ToStringChanged);
-      item.Changed += new EventHandler(Item_Changed);
+      item.PropertyChanged += Item_PropertyChanged;
     }
 
@@ -385,6 +386,5 @@
       try {
         RunCollection.Modify();
-      }
-      finally {
+      } finally {
         ReadOnly = false;
       }
@@ -462,10 +462,11 @@
       }
     }
-    private void Item_Changed(object sender, EventArgs e) {
+    private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) {
       if (InvokeRequired)
-        this.Invoke(new EventHandler(Item_Changed), sender, e);
+        this.Invoke((Action<object, PropertyChangedEventArgs>)Item_PropertyChanged, sender, e);
       else {
         IRun run = (IRun)sender;
-        UpdateRun(run);
+        if (e.PropertyName == "Color" || e.PropertyName == "Visible")
+          UpdateRun(run);
       }
     }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.cs	(revision 11343)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.cs	(revision 11344)
@@ -21,5 +21,9 @@
 
 using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
 using System.Windows.Forms;
+using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -34,4 +38,6 @@
   [Content(typeof(IRun), true)]
   public sealed partial class RunView : NamedItemView {
+    private readonly Dictionary<string, ListViewItem> parametersItemToListViewItem;
+    private readonly Dictionary<string, ListViewItem> resultsItemToListViewItem;
     /// <summary>
     /// Gets or sets the variable to represent visually.
@@ -49,19 +55,82 @@
     public RunView() {
       InitializeComponent();
+      parametersItemToListViewItem = new Dictionary<string, ListViewItem>();
+      resultsItemToListViewItem = new Dictionary<string, ListViewItem>();
     }
 
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      Content.Changed += new EventHandler(Content_Changed);
+      Content.PropertyChanged += Content_PropertyChanged;
+      RegisterContentParametersEvents();
+      RegisterContentResultsEents();
+    }
+    private void RegisterContentParametersEvents() {
+      Content.Parameters.ItemsAdded += ParametersOnItemsChanged;
+      Content.Parameters.ItemsRemoved += ParametersOnItemsChanged;
+      Content.Parameters.ItemsReplaced += ParametersOnItemsChanged;
+      Content.Parameters.CollectionReset += ParametersOnItemsChanged;
+    }
+    private void RegisterContentResultsEents() {
+      Content.Results.ItemsAdded += ResultsOnItemsChanged;
+      Content.Results.ItemsRemoved += ResultsOnItemsChanged;
+      Content.Results.ItemsReplaced += ResultsOnItemsChanged;
+      Content.Results.CollectionReset += ResultsOnItemsChanged;
     }
     protected override void DeregisterContentEvents() {
       base.DeregisterContentEvents();
-      Content.Changed -= new EventHandler(Content_Changed);
-    }
-    private void Content_Changed(object sender, EventArgs e) {
-      if (InvokeRequired)
-        this.Invoke(new EventHandler(Content_Changed), sender, e);
-      else
-        UpdateColor();
+      Content.PropertyChanged -= Content_PropertyChanged;
+      DeregisterContentParametersEvents();
+      DeregisterContentResultsEvents();
+    }
+    private void DeregisterContentParametersEvents() {
+      Content.Parameters.ItemsAdded -= ParametersOnItemsChanged;
+      Content.Parameters.ItemsRemoved -= ParametersOnItemsChanged;
+      Content.Parameters.ItemsReplaced -= ParametersOnItemsChanged;
+      Content.Parameters.CollectionReset -= ParametersOnItemsChanged;
+    }
+    private void DeregisterContentResultsEvents() {
+      Content.Results.ItemsAdded -= ResultsOnItemsChanged;
+      Content.Results.ItemsRemoved -= ResultsOnItemsChanged;
+      Content.Results.ItemsReplaced -= ResultsOnItemsChanged;
+      Content.Results.CollectionReset -= ResultsOnItemsChanged;
+    }
+
+    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      if (e.PropertyName == "Color") {
+        if (InvokeRequired) this.Invoke((Action)UpdateColor, null);
+        else UpdateColor();
+      } else if (e.PropertyName == "Parameters") {
+        if (InvokeRequired) this.Invoke((Action<bool>)FillParametersListView, true);
+        else FillParametersListView();
+        RegisterContentParametersEvents();
+      } else if (e.PropertyName == "Results") {
+        if (InvokeRequired) this.Invoke((Action<bool>)FillResultsListView, true);
+        else FillResultsListView();
+        RegisterContentResultsEents();
+      }
+    }
+
+    private void ParametersOnItemsChanged(object sender, CollectionItemsChangedEventArgs<KeyValuePair<string, IItem>> e) {
+      foreach (var item in e.OldItems) {
+        listView.Items.Remove(parametersItemToListViewItem[item.Key]);
+        parametersItemToListViewItem.Remove(item.Key);
+      }
+      foreach (var item in e.Items) {
+        var listViewItem = CreateListViewItem(item.Key, Content.Parameters[item.Key], listView.Groups["parametersGroup"]);
+        listView.Items.Add(listViewItem);
+        parametersItemToListViewItem[item.Key] = listViewItem;
+      }
+    }
+
+    private void ResultsOnItemsChanged(object sender, CollectionItemsChangedEventArgs<KeyValuePair<string, IItem>> e) {
+      foreach (var item in e.OldItems) {
+        listView.Items.Remove(resultsItemToListViewItem[item.Key]);
+        resultsItemToListViewItem.Remove(item.Key);
+      }
+      foreach (var item in e.Items) {
+        var listViewItem = CreateListViewItem(item.Key, Content.Results[item.Key], listView.Groups["resultsGroup"]);
+        listView.Items.Add(listViewItem);
+        resultsItemToListViewItem[item.Key] = listViewItem;
+      }
     }
 
@@ -101,27 +170,74 @@
       if (listView.SelectedItems.Count == 1) selectedName = listView.SelectedItems[0].SubItems[0].Text;
 
-      listView.Items.Clear();
-      listView.SmallImageList.Images.Clear();
+      FillParametersListView(false);
+      FillResultsListView(false);
+      if (listView.Items.Count > 0) {
+        for (int i = 0; i < listView.Columns.Count; i++)
+          listView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+        selectedName = null;
+      }
+    }
+
+    private void FillParametersListView(bool resize = true) {
+      listView.BeginUpdate();
+      foreach (var item in listView.Groups["parametersGroup"].Items.OfType<ListViewItem>().OrderByDescending(x => x.ImageIndex).ToList()) {
+        listView.SmallImageList.Images.RemoveAt(item.ImageIndex);
+        listView.Items.Remove(item);
+      }
+      parametersItemToListViewItem.Clear();
+
+      var counter = 0;
+      foreach (var item in listView.Items.OfType<ListViewItem>().OrderBy(x => x.ImageIndex).ToList())
+        item.ImageIndex = counter++;
+      listView.EndUpdate();
+
       if (Content != null) {
-        foreach (string key in Content.Parameters.Keys)
-          CreateListViewItem(key, Content.Parameters[key], listView.Groups["parametersGroup"], selectedName);
-        foreach (string key in Content.Results.Keys)
-          CreateListViewItem(key, Content.Results[key], listView.Groups["resultsGroup"], selectedName);
-        if (listView.Items.Count > 0) {
+        foreach (string key in Content.Parameters.Keys) {
+          var listViewItem = CreateListViewItem(key, Content.Parameters[key], listView.Groups["parametersGroup"]);
+          listView.Items.Add(listViewItem);
+          if ((selectedName != null) && key.Equals(selectedName)) listViewItem.Selected = true;
+          parametersItemToListViewItem[key] = listViewItem;
+        }
+        if (resize && listView.Items.Count > 0) {
           for (int i = 0; i < listView.Columns.Count; i++)
             listView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
-          selectedName = null;
-        }
-      }
-    }
-
-    private void CreateListViewItem(string name, IItem value, ListViewGroup group, string selectedName) {
-      ListViewItem item = new ListViewItem(new string[] { name, value != null ? value.ToString() : "-" });
+        }
+      }
+    }
+
+    private void FillResultsListView(bool resize = true) {
+      listView.BeginUpdate();
+      foreach (var item in listView.Groups["resultsGroup"].Items.OfType<ListViewItem>().OrderByDescending(x => x.ImageIndex).ToList()) {
+        listView.SmallImageList.Images.RemoveAt(item.ImageIndex);
+        listView.Items.Remove(item);
+      }
+      resultsItemToListViewItem.Clear();
+
+      var counter = 0;
+      foreach (var item in listView.Items.OfType<ListViewItem>().OrderBy(x => x.ImageIndex).ToList())
+        item.ImageIndex = counter++;
+      listView.EndUpdate();
+
+      if (Content != null) {
+        foreach (string key in Content.Results.Keys) {
+          var listViewItem = CreateListViewItem(key, Content.Results[key], listView.Groups["resultsGroup"]);
+          listView.Items.Add(listViewItem);
+          if ((selectedName != null) && key.Equals(selectedName)) listViewItem.Selected = true;
+          resultsItemToListViewItem[key] = listViewItem;
+        }
+        if (resize && listView.Items.Count > 0) {
+          for (int i = 0; i < listView.Columns.Count; i++)
+            listView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+        }
+      }
+    }
+
+    private ListViewItem CreateListViewItem(string name, IItem value, ListViewGroup group) {
+      var item = new ListViewItem(new string[] { name, value != null ? value.ToString() : "-" });
       item.Tag = value;
       item.Group = group;
       listView.SmallImageList.Images.Add(value == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : value.ItemImage);
       item.ImageIndex = listView.SmallImageList.Images.Count - 1;
-      listView.Items.Add(item);
-      if ((selectedName != null) && name.Equals(selectedName)) item.Selected = true;
+      return item;
     }
 
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IRun.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IRun.cs	(revision 11343)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IRun.cs	(revision 11344)
@@ -20,7 +20,7 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
+using System.ComponentModel;
 using System.Drawing;
+using HeuristicLab.Collections;
 using HeuristicLab.Core;
 
@@ -29,12 +29,11 @@
   /// Represents the parameters and results of an algorithm run.
   /// </summary>
-  public interface IRun : INamedItem {
+  public interface IRun : INamedItem, INotifyPropertyChanged {
     IAlgorithm Algorithm { get; }
-    IDictionary<string, IItem> Parameters { get; }
-    IDictionary<string, IItem> Results { get; }
+    IObservableDictionary<string, IItem> Parameters { get; }
+    IObservableDictionary<string, IItem> Results { get; }
 
     Color Color { get; set; }
     bool Visible { get; set; }
-    event EventHandler Changed;
   }
 }
Index: trunk/sources/HeuristicLab.Optimization/3.3/Run.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Run.cs	(revision 11343)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Run.cs	(revision 11344)
@@ -22,6 +22,7 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Drawing;
-using System.Linq;
+using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -44,12 +45,13 @@
       algorithm = cloner.Clone(original.algorithm);
 
-      parameters = new Dictionary<string, IItem>();
+      parameters = new ObservableDictionary<string, IItem>();
       foreach (string key in original.parameters.Keys)
         parameters.Add(key, cloner.Clone(original.parameters[key]));
 
-      results = new Dictionary<string, IItem>();
+      results = new ObservableDictionary<string, IItem>();
       foreach (string key in original.results.Keys)
         results.Add(key, cloner.Clone(original.results[key]));
     }
+
     public override IDeepCloneable Clone(Cloner cloner) {
       return new Run(this, cloner);
@@ -62,6 +64,6 @@
       color = Color.Black;
       algorithm = null;
-      parameters = new Dictionary<string, IItem>();
-      results = new Dictionary<string, IItem>();
+      parameters = new ObservableDictionary<string, IItem>();
+      results = new ObservableDictionary<string, IItem>();
     }
     public Run(IAlgorithm algorithm)
@@ -88,9 +90,9 @@
 
     private void Initialize(IAlgorithm algorithm) {
-      parameters = new Dictionary<string, IItem>();
-      results = new Dictionary<string, IItem>();
+      parameters = new ObservableDictionary<string, IItem>();
+      results = new ObservableDictionary<string, IItem>();
 
       if (algorithm.StoreAlgorithmInEachRun) {
-        IAlgorithm clone = (IAlgorithm)algorithm.Clone();
+        var clone = (IAlgorithm)algorithm.Clone();
         clone.CollectParameterValues(parameters);
         clone.CollectResultValues(results);
@@ -98,9 +100,11 @@
         this.algorithm = clone;
       } else {
-        algorithm.CollectParameterValues(parameters);
-        algorithm.CollectResultValues(results);
-        Cloner cloner = new Cloner();
-        parameters = parameters.Select(x => new KeyValuePair<string, IItem>(x.Key, cloner.Clone(x.Value))).ToDictionary(x => x.Key, x => x.Value);
-        results = results.Select(x => new KeyValuePair<string, IItem>(x.Key, cloner.Clone(x.Value))).ToDictionary(x => x.Key, x => x.Value);
+        var par = new Dictionary<string, IItem>();
+        var res = new Dictionary<string, IItem>();
+        algorithm.CollectParameterValues(par);
+        algorithm.CollectResultValues(res);
+        var cloner = new Cloner();
+        foreach (var k in par) parameters.Add(k.Key, cloner.Clone(k.Value));
+        foreach (var k in res) results.Add(k.Key, cloner.Clone(k.Value));
       }
     }
@@ -115,13 +119,43 @@
       get { return algorithm; }
     }
-    [Storable]
-    private Dictionary<string, IItem> parameters;
-    public IDictionary<string, IItem> Parameters {
+
+    [Storable(Name = "parameters")]
+    private IDictionary<string, IItem> StorableParameters {
       get { return parameters; }
+      set {
+        if (!(value is IObservableDictionary<string, IItem>))
+          parameters = new ObservableDictionary<string, IItem>(value);
+        else parameters = (IObservableDictionary<string, IItem>)value;
+      }
     }
-    [Storable]
-    private Dictionary<string, IItem> results;
-    public IDictionary<string, IItem> Results {
+    private IObservableDictionary<string, IItem> parameters;
+    public IObservableDictionary<string, IItem> Parameters {
+      get { return parameters; }
+      private set {
+        if (parameters != value) {
+          parameters = value;
+          OnPropertyChanged("Parameters");
+        }
+      }
+    }
+
+    [Storable(Name = "results")]
+    private IDictionary<string, IItem> StorableResults {
       get { return results; }
+      set {
+        if (!(value is IObservableDictionary<string, IItem>))
+          results = new ObservableDictionary<string, IItem>(value);
+        else results = (IObservableDictionary<string, IItem>)value;
+      }
+    }
+    private IObservableDictionary<string, IItem> results;
+    public IObservableDictionary<string, IItem> Results {
+      get { return results; }
+      set {
+        if (results != value) {
+          results = value;
+          OnPropertyChanged("Results");
+        }
+      }
     }
 
@@ -133,5 +167,5 @@
         if (color != value) {
           this.color = value;
-          this.OnChanged();
+          OnPropertyChanged("Color");
         }
       }
@@ -143,13 +177,13 @@
         if (visible != value) {
           this.visible = value;
-          this.OnChanged();
+          OnPropertyChanged("Visible");
         }
       }
     }
-    public event EventHandler Changed;
-    private void OnChanged() {
-      EventHandler handler = Changed;
-      if (handler != null)
-        handler(this, EventArgs.Empty);
+
+    public event PropertyChangedEventHandler PropertyChanged;
+    private void OnPropertyChanged(string property) {
+      var handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(property));
     }
   }
Index: trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 11343)
+++ trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 11344)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Linq;
 using HeuristicLab.Collections;
@@ -160,4 +161,12 @@
         foreach (KeyValuePair<string, IItem> result in run.Results)
           AddResult(result.Key, result.Value);
+        run.PropertyChanged += RunOnPropertyChanged;
+        RegisterRunParametersEvents(run);
+        RegisterRunResultsEvents(run);
+      }
+      foreach (IRun run in oldItems) {
+        run.PropertyChanged -= RunOnPropertyChanged;
+        DeregisterRunParametersEvents(run);
+        DeregisterRunResultsEvents(run);
       }
       columnNameCache = null;
@@ -178,4 +187,7 @@
         foreach (KeyValuePair<string, IItem> result in run.Results)
           columnsChanged |= AddResult(result.Key, result.Value);
+        run.PropertyChanged += RunOnPropertyChanged;
+        RegisterRunParametersEvents(run);
+        RegisterRunResultsEvents(run);
       }
       if (columnsChanged) columnNameCache = null;
@@ -198,4 +210,7 @@
         foreach (string resultName in run.Results.Keys)
           columnsChanged |= RemoveResultName(resultName);
+        run.PropertyChanged -= RunOnPropertyChanged;
+        DeregisterRunParametersEvents(run);
+        DeregisterRunResultsEvents(run);
       }
       if (columnsChanged) columnNameCache = null;
@@ -205,4 +220,72 @@
       OnRowsChanged();
       OnRowNamesChanged();
+      if (columnsChanged) {
+        OnColumnsChanged();
+        OnColumnNamesChanged();
+      }
+    }
+
+    private void RunOnPropertyChanged(object sender, PropertyChangedEventArgs e) {
+      if (e.PropertyName == "Parameters") {
+        RegisterRunParametersEvents((IRun)sender);
+      } else if (e.PropertyName == "Results") {
+        RegisterRunResultsEvents((IRun)sender);
+      }
+    }
+
+    private void RegisterRunParametersEvents(IRun run) {
+      IObservableDictionary<string, IItem> dict = run.Parameters;
+      dict.ItemsAdded += RunOnParameterChanged;
+      dict.ItemsRemoved += RunOnParameterChanged;
+      dict.ItemsReplaced += RunOnParameterChanged;
+      dict.CollectionReset += RunOnParameterChanged;
+    }
+
+    private void RegisterRunResultsEvents(IRun run) {
+      IObservableDictionary<string, IItem> dict = run.Results;
+      dict.ItemsAdded += RunOnResultChanged;
+      dict.ItemsRemoved += RunOnResultChanged;
+      dict.ItemsReplaced += RunOnResultChanged;
+      dict.CollectionReset += RunOnResultChanged;
+    }
+
+    private void DeregisterRunParametersEvents(IRun run) {
+      IObservableDictionary<string, IItem> dict = run.Parameters;
+      dict.ItemsAdded -= RunOnParameterChanged;
+      dict.ItemsRemoved -= RunOnParameterChanged;
+      dict.ItemsReplaced -= RunOnParameterChanged;
+      dict.CollectionReset -= RunOnParameterChanged;
+    }
+
+    private void DeregisterRunResultsEvents(IRun run) {
+      IObservableDictionary<string, IItem> dict = run.Results;
+      dict.ItemsAdded -= RunOnResultChanged;
+      dict.ItemsRemoved -= RunOnResultChanged;
+      dict.ItemsReplaced -= RunOnResultChanged;
+      dict.CollectionReset -= RunOnResultChanged;
+    }
+
+    private void RunOnParameterChanged(object sender, CollectionItemsChangedEventArgs<KeyValuePair<string, IItem>> e) {
+      bool columnsChanged = false;
+      foreach (var param in e.Items)
+        columnsChanged |= AddParameter(param.Key, param.Value);
+      foreach (var param in e.OldItems)
+        columnsChanged |= RemoveParameterName(param.Key);
+      if (columnsChanged) columnNameCache = null;
+      OnReset();
+      if (columnsChanged) {
+        OnColumnsChanged();
+        OnColumnNamesChanged();
+      }
+    }
+
+    private void RunOnResultChanged(object sender, CollectionItemsChangedEventArgs<KeyValuePair<string, IItem>> e) {
+      bool columnsChanged = false;
+      foreach (var result in e.Items)
+        columnsChanged |= AddResult(result.Key, result.Value);
+      foreach (var result in e.OldItems)
+        columnsChanged |= RemoveResultName(result.Key);
+      if (columnsChanged) columnNameCache = null;
+      OnReset();
       if (columnsChanged) {
         OnColumnsChanged();
Index: trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/RunCollectionVariableImpactView.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/RunCollectionVariableImpactView.cs	(revision 11343)
+++ trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/RunCollectionVariableImpactView.cs	(revision 11344)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Drawing;
 using System.Linq;
@@ -66,9 +67,9 @@
     private void RegisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
-        run.Changed += Run_Changed;
+        run.PropertyChanged += Run_PropertyChanged;
     }
     private void DeregisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
-        run.Changed -= Run_Changed;
+        run.PropertyChanged -= Run_PropertyChanged;
     }
     private void Content_ItemsAdded(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
@@ -88,6 +89,7 @@
       if (!Content.UpdateOfRunsInProgress) UpdateData();
     }
-    private void Run_Changed(object sender, EventArgs e) {
-      if (!Content.UpdateOfRunsInProgress) UpdateData();
+    private void Run_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      if (!Content.UpdateOfRunsInProgress && e.PropertyName == "Visible")
+        UpdateData();
     }
     #endregion
