Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Analysis/3.3/DataVisualization/DataTable.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Analysis/3.3/DataVisualization/DataTable.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Analysis/3.3/DataVisualization/DataTable.cs	(revision 9306)
@@ -245,15 +245,15 @@
       throw new NotSupportedException();
     }
-    bool IStringConvertibleMatrix.SetValue(RowColumnValue rowColumnValue) {
-      throw new NotSupportedException();
-    }
-    bool IStringConvertibleMatrix.SetValue(IEnumerable<RowColumnValue> rowColumnValues) {
-      throw new NotSupportedException();
-    }
-
-    public event EventHandler<EventArgs<IEnumerable<Position>>> ItemsChanged;
-    protected virtual void OnItemsChanged(IEnumerable<Position> positions) {
+    bool IStringConvertibleMatrix.SetValue(MatrixValue<string> rowColumnValue) {
+      throw new NotSupportedException();
+    }
+    bool IStringConvertibleMatrix.SetValues(IEnumerable<MatrixValue<string>> rowColumnValues) {
+      throw new NotSupportedException();
+    }
+
+    public event EventHandler<MatrixValuesChangedEventArgs> ItemsChanged;
+    protected virtual void OnItemsChanged(IEnumerable<MatrixPosition> positions) {
       var handler = ItemsChanged;
-      if (handler != null) handler(this, new EventArgs<IEnumerable<Position>>(positions));
+      if (handler != null) handler(this, new MatrixValuesChangedEventArgs(positions));
       OnToStringChanged();
     }
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Analysis/3.3/DataVisualization/ScatterPlot.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Analysis/3.3/DataVisualization/ScatterPlot.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Analysis/3.3/DataVisualization/ScatterPlot.cs	(revision 9306)
@@ -259,15 +259,15 @@
       throw new NotSupportedException();
     }
-    bool IStringConvertibleMatrix.SetValue(RowColumnValue rowColumnValue) {
+    bool IStringConvertibleMatrix.SetValue(MatrixValue<string> rowColumnValue) {
       throw new NotSupportedException();
     }
-    bool IStringConvertibleMatrix.SetValue(IEnumerable<RowColumnValue> rowColumnValues) {
+    bool IStringConvertibleMatrix.SetValues(IEnumerable<MatrixValue<string>> rowColumnValues) {
       throw new NotSupportedException();
     }
 
-    public event EventHandler<EventArgs<IEnumerable<Position>>> ItemsChanged;
-    protected virtual void OnItemsChanged(IEnumerable<Position> positions) {
+    public event EventHandler<MatrixValuesChangedEventArgs> ItemsChanged;
+    protected virtual void OnItemsChanged(IEnumerable<MatrixPosition> positions) {
       var handler = ItemsChanged;
-      if (handler != null) handler(this, new EventArgs<IEnumerable<Position>>(positions));
+      if (handler != null) handler(this, new MatrixValuesChangedEventArgs(positions));
       OnToStringChanged();
     }
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs	(revision 9306)
@@ -87,5 +87,5 @@
 
     protected override void DeregisterContentEvents() {
-      Content.ItemsChanged -= new EventHandler<EventArgs<IEnumerable<Position>>>(Content_ItemChanged);
+      Content.ItemsChanged -= new EventHandler<MatrixValuesChangedEventArgs>(Content_ItemChanged);
       Content.Reset -= new EventHandler(Content_Reset);
       Content.ColumnNamesChanged -= new EventHandler(Content_ColumnNamesChanged);
@@ -95,5 +95,5 @@
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      Content.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(Content_ItemChanged);
+      Content.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(Content_ItemChanged);
       Content.Reset += new EventHandler(Content_Reset);
       Content.ColumnNamesChanged += new EventHandler(Content_ColumnNamesChanged);
@@ -130,7 +130,9 @@
       virtualRowIndices = Enumerable.Range(0, Content.Rows).ToArray();
 
-      if (Content.Columns == 0 && dataGridView.ColumnCount != Content.Columns && !Content.ReadOnly)
-        Content.Columns = dataGridView.ColumnCount;
-      else {
+      //dataGridView.RowCount = 0;
+
+      if (Content.Columns == 0) {
+        Content.Columns = 1;
+      } else {
         DataGridViewColumn[] columns = new DataGridViewColumn[Content.Columns];
         for (int i = 0; i < columns.Length; ++i) {
@@ -143,10 +145,5 @@
       }
 
-      //DataGridViews with rows but no columns are not allowed !
-      if (Content.Rows == 0 && dataGridView.RowCount != Content.Rows && !Content.ReadOnly)
-        Content.Rows = dataGridView.RowCount;
-      else
-        dataGridView.RowCount = Content.Rows;
-
+      dataGridView.RowCount = Content.Rows;
 
       ClearSorting();
@@ -200,7 +197,7 @@
         UpdateColumnHeaders();
     }
-    private void Content_ItemChanged(object sender, EventArgs<IEnumerable<Position>> e) {
+    private void Content_ItemChanged(object sender, MatrixValuesChangedEventArgs e) {
       if (InvokeRequired)
-        Invoke(new EventHandler<EventArgs<IEnumerable<Position>>>(Content_ItemChanged), sender, e);
+        Invoke(new EventHandler<MatrixValuesChangedEventArgs>(Content_ItemChanged), sender, e);
       else {
         foreach (var pos in e.Value) {
@@ -268,5 +265,5 @@
         string errorMessage;
         if (Content != null && !Content.Validate(e.FormattedValue.ToString(), out errorMessage)) {
-          e.Cancel = true;
+          //e.Cancel = true;
           dataGridView.Rows[e.RowIndex].ErrorText = errorMessage;
         }
@@ -376,12 +373,11 @@
       if (Content.Columns < values.GetLength(0) + columnIndex) Content.Columns = values.GetLength(0) + columnIndex;
 
-      List<RowColumnValue> setValues = new List<RowColumnValue>(values.GetLength(0) * values.GetLength(1));
+      List<MatrixValue<string>> setValues = new List<MatrixValue<string>>(values.GetLength(0) * values.GetLength(1));
       for (int row = 0; row < values.GetLength(1); row++) {
         for (int col = 0; col < values.GetLength(0); col++) {
-          setValues.Add(new RowColumnValue(new Position(row + rowIndex, col + columnIndex), values[col, row]));
-          //Content.SetValue(values[col, row], row + rowIndex, col + columnIndex);
-        }
-      }
-      Content.SetValue(setValues);
+          setValues.Add(new MatrixValue<string>(new MatrixPosition(row + rowIndex, col + columnIndex), values[col, row]));
+        }
+      }
+      Content.SetValues(setValues);
       ClearSorting();
     }
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/BoolMatrix.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 9306)
@@ -74,21 +74,16 @@
       }
     }
-    protected override bool SetValue(IEnumerable<RowColumnValue> rowColumnValues) {
-      if (ReadOnly) throw new NotSupportedException("Item cannot be set. StringMatrix is read-only.");
-      List<Tuple<Position, bool>> newValues = new List<Tuple<Position, bool>>();
+    protected override bool SetValues(IEnumerable<MatrixValue<string>> matrixValues) {
+      if (ReadOnly) throw new NotSupportedException("Item cannot be set. BoolMatrix is read-only.");
       bool parsed;
-      foreach (var curValue in rowColumnValues) {
-        if (bool.TryParse(curValue.Value, out parsed)) {
-          newValues.Add(new Tuple<Position, bool>(curValue.Position, parsed));
-        } else {
-          return false;
+      if (!matrixValues.All(v => bool.TryParse(v.Value, out parsed))) return false;
+      List<MatrixPosition> positions = new List<MatrixPosition>();
+      foreach (var v in matrixValues) {
+        parsed = bool.Parse(v.Value);
+        if (matrix[v.Position.Row, v.Position.Column] != parsed) {
+          matrix[v.Position.Row, v.Position.Column] = parsed;
+          positions.Add(v.Position);
         }
       }
-      Position pos;
-      foreach (var curValue in newValues) {
-        pos = curValue.Item1;
-        matrix[pos.Row, pos.Column] = curValue.Item2;
-      }
-      OnItemsChanged(rowColumnValues.Select(x => x.Position));
       return true;
     }
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/DoubleMatrix.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 9306)
@@ -74,21 +74,17 @@
       }
     }
-    protected override bool SetValue(IEnumerable<RowColumnValue> rowColumnValues) {
-      if (ReadOnly) throw new NotSupportedException("Item cannot be set. StringMatrix is read-only.");
-      List<Tuple<Position, double>> newValues = new List<Tuple<Position, double>>();
+    protected override bool SetValues(IEnumerable<MatrixValue<string>> matrixValues) {
+      if (ReadOnly) throw new NotSupportedException("Item cannot be set. DoubleMatrix is read-only.");
+
       double parsed;
-      foreach (var curValue in rowColumnValues) {
-        if (double.TryParse(curValue.Value, out parsed)) {
-          newValues.Add(new Tuple<Position, double>(curValue.Position, parsed));
-        } else {
-          return false;
+      if (!matrixValues.All(v => double.TryParse(v.Value, out parsed))) return false;
+      List<MatrixPosition> positions = new List<MatrixPosition>();
+      foreach (var v in matrixValues) {
+        parsed = double.Parse(v.Value);
+        if (matrix[v.Position.Row, v.Position.Column] != parsed) {
+          matrix[v.Position.Row, v.Position.Column] = parsed;
+          positions.Add(v.Position);
         }
       }
-      Position pos;
-      foreach (var curValue in newValues) {
-        pos = curValue.Item1;
-        matrix[pos.Row, pos.Column] = curValue.Item2;
-      }
-      OnItemsChanged(rowColumnValues.Select(x => x.Position));
       return true;
     }
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/IntMatrix.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 9306)
@@ -74,21 +74,16 @@
       }
     }
-    protected override bool SetValue(IEnumerable<RowColumnValue> rowColumnValues) {
-      if (ReadOnly) throw new NotSupportedException("Item cannot be set. StringMatrix is read-only.");
-      List<Tuple<Position, int>> newValues = new List<Tuple<Position, int>>();
+    protected override bool SetValues(IEnumerable<MatrixValue<string>> matrixValues) {
+      if (ReadOnly) throw new NotSupportedException("Item cannot be set. IntMatrix is read-only.");
       int parsed;
-      foreach (var curValue in rowColumnValues) {
-        if (int.TryParse(curValue.Value, out parsed)) {
-          newValues.Add(new Tuple<Position, int>(curValue.Position, parsed));
-        } else {
-          return false;
+      if (!matrixValues.All(v => int.TryParse(v.Value, out parsed))) return false;
+      List<MatrixPosition> positions = new List<MatrixPosition>();
+      foreach (var v in matrixValues) {
+        parsed = int.Parse(v.Value);
+        if (matrix[v.Position.Row, v.Position.Column] != parsed) {
+          matrix[v.Position.Row, v.Position.Column] = parsed;
+          positions.Add(v.Position);
         }
       }
-      Position pos;
-      foreach (var curValue in newValues) {
-        pos = curValue.Item1;
-        matrix[pos.Row, pos.Column] = curValue.Item2;
-      }
-      OnItemsChanged(rowColumnValues.Select(x => x.Position));
       return true;
     }
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleMatrix.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleMatrix.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleMatrix.cs	(revision 9306)
@@ -37,6 +37,6 @@
     string GetValue(int rowIndex, int columnIndex);
     bool SetValue(string value, int rowIndex, int columnIndex);
-    bool SetValue(RowColumnValue rowColumnValue);
-    bool SetValue(IEnumerable<RowColumnValue> rowColumnValues);
+    bool SetValue(MatrixValue<string> matrixValue);
+    bool SetValues(IEnumerable<MatrixValue<string>> matrixValues);
 
     event EventHandler ColumnsChanged;
@@ -45,19 +45,25 @@
     event EventHandler RowNamesChanged;
     event EventHandler SortableViewChanged;
-    event EventHandler<EventArgs<IEnumerable<Position>>> ItemsChanged;
+    event EventHandler<MatrixValuesChangedEventArgs> ItemsChanged;
     event EventHandler Reset;
   }
-  public struct Position {
-    public readonly int Row, Column;
-    public Position(int row, int column) {
+  public class MatrixValuesChangedEventArgs : EventArgs<IEnumerable<MatrixPosition>> {
+    public MatrixValuesChangedEventArgs(IEnumerable<MatrixPosition> matrixPositions) : base(matrixPositions) { }
+  }
+  public struct MatrixPosition {
+    public int Row { get; private set; }
+    public int Column { get; private set; }
+    public MatrixPosition(int row, int column)
+      : this() {
       Row = row;
       Column = column;
     }
   }
-  public struct RowColumnValue {
-    public readonly Position Position;
-    public readonly string Value;
+  public struct MatrixValue<T> {
+    public MatrixPosition Position { get; private set; }
+    public T Value { get; private set; }
 
-    public RowColumnValue(Position position, string value) {
+    public MatrixValue(MatrixPosition position, T value)
+      : this() {
       Position = position;
       Value = value;
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/StringMatrix.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 9306)
@@ -128,5 +128,5 @@
           if ((value != null) || (matrix[rowIndex, columnIndex] != string.Empty)) {
             matrix[rowIndex, columnIndex] = value != null ? value : string.Empty;
-            OnItemsChanged(new List<Position>(1) { new Position(rowIndex, columnIndex) });
+            OnItemsChanged(new List<MatrixPosition>(1) { new MatrixPosition(rowIndex, columnIndex) });
           }
         }
@@ -250,13 +250,13 @@
       }
     }
-    protected virtual bool SetValue(IEnumerable<RowColumnValue> rowColumnValues) {
+    public virtual bool SetValue(IEnumerable<MatrixValue<string>> matrixValues) {
       if (ReadOnly) throw new NotSupportedException("Item cannot be set. StringMatrix is read-only.");
-      if (rowColumnValues.Any(x => x.Value == null)) { return false; }
-      Position pos;
-      foreach (var curValue in rowColumnValues) {
+      if (!matrixValues.All(v => v.Value != null)) return false;
+      MatrixPosition pos;
+      foreach (var curValue in matrixValues) {
         pos = curValue.Position;
         matrix[pos.Row, pos.Column] = curValue.Value;
       }
-      OnItemsChanged(rowColumnValues.Select(x => x.Position));
+      OnItemsChanged(matrixValues.Select(x => x.Position));
       return true;
     }
@@ -293,8 +293,8 @@
         handler(this, EventArgs.Empty);
     }
-    public event EventHandler<EventArgs<IEnumerable<Position>>> ItemsChanged;
-    protected virtual void OnItemsChanged(IEnumerable<Position> positions) {
+    public event EventHandler<MatrixValuesChangedEventArgs> ItemsChanged;
+    protected virtual void OnItemsChanged(IEnumerable<MatrixPosition> positions) {
       if (ItemsChanged != null)
-        ItemsChanged(this, new EventArgs<IEnumerable<Position>>(positions));
+        ItemsChanged(this, new MatrixValuesChangedEventArgs(positions));
       OnToStringChanged();
     }
@@ -325,8 +325,8 @@
       return SetValue(value, rowIndex, columnIndex);
     }
-    public bool SetValue(RowColumnValue rowColumnValue) {
+    public bool SetValue(MatrixValue<string> rowColumnValue) {
       return SetValue(rowColumnValue.Value, rowColumnValue.Position.Row, rowColumnValue.Position.Column);
     }
-    bool IStringConvertibleMatrix.SetValue(IEnumerable<RowColumnValue> rowColumnValues) {
+    bool IStringConvertibleMatrix.SetValues(IEnumerable<MatrixValue<string>> rowColumnValues) {
       return SetValue(rowColumnValues);
     }
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/ValueTypeMatrix.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 9306)
@@ -127,7 +127,19 @@
         if (!value.Equals(matrix[rowIndex, columnIndex])) {
           matrix[rowIndex, columnIndex] = value;
-          OnItemsChanged(new List<Position>(1) { new Position(rowIndex, columnIndex) });
-        }
-      }
+          OnItemsChanged(new List<MatrixPosition>(1) { new MatrixPosition(rowIndex, columnIndex) });
+        }
+      }
+    }
+
+    public virtual void SetValues(IEnumerable<MatrixValue<T>> matrixValues) {
+      if (ReadOnly) throw new NotSupportedException("Item cannot be set. ValueTypeMatrix is read-only.");
+      List<MatrixPosition> positions = new List<MatrixPosition>();
+      foreach (var matrixValue in matrixValues) {
+        if (!matrixValue.Value.Equals(matrix[matrixValue.Position.Row, matrixValue.Position.Column])) {
+          matrix[matrixValue.Position.Row, matrixValue.Position.Column] = matrixValue.Value;
+          positions.Add(matrixValue.Position);
+        }
+      }
+      OnItemsChanged(positions);
     }
 
@@ -247,8 +259,8 @@
         handler(this, EventArgs.Empty);
     }
-    public event EventHandler<EventArgs<IEnumerable<Position>>> ItemsChanged;
-    protected virtual void OnItemsChanged(IEnumerable<Position> positions) {
+    public event EventHandler<MatrixValuesChangedEventArgs> ItemsChanged;
+    protected virtual void OnItemsChanged(IEnumerable<MatrixPosition> positions) {
       if (ItemsChanged != null)
-        ItemsChanged(this, new EventArgs<IEnumerable<Position>>(positions));
+        ItemsChanged(this, new MatrixValuesChangedEventArgs(positions));
       OnToStringChanged();
     }
@@ -264,5 +276,5 @@
     protected abstract bool SetValue(string value, int rowIndex, int columnIndex);
     protected abstract string GetValue(int rowIndex, int columIndex);
-    protected abstract bool SetValue(IEnumerable<RowColumnValue> rowColumnValues);
+    protected abstract bool SetValues(IEnumerable<MatrixValue<string>> rowColumnValues);
 
     #region IStringConvertibleMatrix Members
@@ -286,10 +298,10 @@
     }
 
-    bool IStringConvertibleMatrix.SetValue(RowColumnValue rowColumnValue) {
+    bool IStringConvertibleMatrix.SetValue(MatrixValue<string> rowColumnValue) {
       return SetValue(rowColumnValue.Value, rowColumnValue.Position.Row, rowColumnValue.Position.Column);
     }
 
-    bool IStringConvertibleMatrix.SetValue(IEnumerable<RowColumnValue> rowColumnValues) {
-      return SetValue(rowColumnValues);
+    bool IStringConvertibleMatrix.SetValues(IEnumerable<MatrixValue<string>> rowColumnValues) {
+      return SetValues(rowColumnValues);
     }
     #endregion
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Optimization/3.3/RunCollection.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 9306)
@@ -324,8 +324,8 @@
     }
 
-    public event EventHandler<EventArgs<IEnumerable<Position>>> ItemsChanged;
+    public event EventHandler<MatrixValuesChangedEventArgs> ItemsChanged;
     protected virtual void OnItemsChanged(int rowIndex, int columnIndex) {
-      EventHandler<EventArgs<IEnumerable<Position>>> handler = ItemsChanged;
-      if (handler != null) handler(this, new EventArgs<IEnumerable<Position>>(new List<Position>(1) { new Position(rowIndex, columnIndex) }));
+      EventHandler<MatrixValuesChangedEventArgs> handler = ItemsChanged;
+      if (handler != null) handler(this, new MatrixValuesChangedEventArgs(new List<MatrixPosition>(1) { new MatrixPosition(rowIndex, columnIndex) }));
       OnToStringChanged();
     }
@@ -364,6 +364,6 @@
     public bool Validate(string value, out string errorMessage) { throw new NotSupportedException(); }
     public bool SetValue(string value, int rowIndex, int columnIndex) { throw new NotSupportedException(); }
-    public bool SetValue(RowColumnValue rowColumnValue) { throw new NotSupportedException(); }
-    public bool SetValue(IEnumerable<RowColumnValue> rowColumnValues) { throw new NotSupportedException(); }
+    public bool SetValue(MatrixValue<string> rowColumnValue) { throw new NotSupportedException(); }
+    public bool SetValues(IEnumerable<MatrixValue<string>> rowColumnValues) { throw new NotSupportedException(); }
     #endregion
 
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.ArtificialAnt/3.4/AntTrail.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.ArtificialAnt/3.4/AntTrail.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.ArtificialAnt/3.4/AntTrail.cs	(revision 9306)
@@ -21,5 +21,4 @@
 
 using System;
-using System.Collections.Generic;
 using System.Drawing;
 using HeuristicLab.Common;
@@ -141,9 +140,9 @@
 
     private void RegisterWorldEvents() {
-      World.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(World_ItemChanged);
+      World.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(World_ItemChanged);
       World.Reset += new EventHandler(World_Reset);
     }
     private void DeregisterWorldEvents() {
-      World.ItemsChanged -= new EventHandler<EventArgs<IEnumerable<Position>>>(World_ItemChanged);
+      World.ItemsChanged -= new EventHandler<MatrixValuesChangedEventArgs>(World_ItemChanged);
       World.Reset -= new EventHandler(World_Reset);
     }
@@ -158,5 +157,5 @@
       OnMaxTimeStepsChanged();
     }
-    private void World_ItemChanged(object sender, EventArgs<IEnumerable<Position>> e) {
+    private void World_ItemChanged(object sender, MatrixValuesChangedEventArgs e) {
       OnWorldChanged();
     }
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs	(revision 9306)
@@ -234,8 +234,8 @@
       throw new NotSupportedException();
     }
-    public bool SetValue(RowColumnValue rowColumnValue) {
-      throw new NotSupportedException();
-    }
-    public bool SetValue(IEnumerable<RowColumnValue> rowColumnValues) {
+    public bool SetValue(MatrixValue<string> rowColumnValue) {
+      throw new NotSupportedException();
+    }
+    public bool SetValues(IEnumerable<MatrixValue<string>> rowColumnValues) {
       throw new NotSupportedException();
     }
@@ -246,5 +246,5 @@
     public event EventHandler RowNamesChanged { add { } remove { } }
     public event EventHandler SortableViewChanged { add { } remove { } }
-    public event EventHandler<EventArgs<IEnumerable<Position>>> ItemsChanged { add { } remove { } }
+    public event EventHandler<MatrixValuesChangedEventArgs> ItemsChanged { add { } remove { } }
     public event EventHandler Reset { add { } remove { } }
     #endregion
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs	(revision 9306)
@@ -383,6 +383,6 @@
       TargetVariableParameter.ValueChanged += new EventHandler(TargetVariableParameter_ValueChanged);
       ClassNamesParameter.Value.Reset += new EventHandler(Parameter_ValueChanged);
-      ClassNamesParameter.Value.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(Parameter_ValueChanged);
-      ClassificationPenaltiesParameter.Value.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(Parameter_ValueChanged);
+      ClassNamesParameter.Value.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(Parameter_ValueChanged);
+      ClassificationPenaltiesParameter.Value.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(Parameter_ValueChanged);
       ClassificationPenaltiesParameter.Value.Reset += new EventHandler(Parameter_ValueChanged);
     }
@@ -390,6 +390,6 @@
       TargetVariableParameter.ValueChanged -= new EventHandler(TargetVariableParameter_ValueChanged);
       ClassNamesParameter.Value.Reset -= new EventHandler(Parameter_ValueChanged);
-      ClassNamesParameter.Value.ItemsChanged -= new EventHandler<EventArgs<IEnumerable<Position>>>(Parameter_ValueChanged);
-      ClassificationPenaltiesParameter.Value.ItemsChanged -= new EventHandler<EventArgs<IEnumerable<Position>>>(Parameter_ValueChanged);
+      ClassNamesParameter.Value.ItemsChanged -= new EventHandler<MatrixValuesChangedEventArgs>(Parameter_ValueChanged);
+      ClassificationPenaltiesParameter.Value.ItemsChanged -= new EventHandler<MatrixValuesChangedEventArgs>(Parameter_ValueChanged);
       ClassificationPenaltiesParameter.Value.Reset -= new EventHandler(Parameter_ValueChanged);
     }
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 9306)
@@ -183,5 +183,5 @@
       UpdateStrategyVectorBounds();
     }
-    private void Bounds_ItemChanged(object sender, EventArgs<IEnumerable<Position>> e) {
+    private void Bounds_ItemChanged(object sender, MatrixValuesChangedEventArgs e) {
       foreach (var pos in e.Value) {
         if (pos.Column == 0 && Bounds[pos.Row, 1] <= Bounds[pos.Row, 0])
@@ -242,5 +242,5 @@
       BoundsParameter.ValueChanged += new EventHandler(BoundsParameter_ValueChanged);
       Bounds.ToStringChanged += new EventHandler(Bounds_ToStringChanged);
-      Bounds.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(Bounds_ItemChanged);
+      Bounds.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(Bounds_ItemChanged);
       SolutionCreator.RealVectorParameter.ActualNameChanged += new EventHandler(SolutionCreator_RealVectorParameter_ActualNameChanged);
       Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionSolution.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionSolution.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionSolution.cs	(revision 9306)
@@ -21,5 +21,4 @@
 
 using System;
-using System.Collections.Generic;
 using System.Drawing;
 using HeuristicLab.Collections;
@@ -237,9 +236,9 @@
     }
     private void RegisterBoundsEvents() {
-      Bounds.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(Bounds_ItemChanged);
+      Bounds.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(Bounds_ItemChanged);
       Bounds.Reset += new EventHandler(Bounds_Reset);
     }
     private void DeregisterBoundsEvents() {
-      Bounds.ItemsChanged -= new EventHandler<EventArgs<IEnumerable<Position>>>(Bounds_ItemChanged);
+      Bounds.ItemsChanged -= new EventHandler<MatrixValuesChangedEventArgs>(Bounds_ItemChanged);
       Bounds.Reset -= new EventHandler(Bounds_Reset);
     }
@@ -269,5 +268,5 @@
       OnPopulationChanged();
     }
-    private void Bounds_ItemChanged(object sender, EventArgs<IEnumerable<Position>> e) {
+    private void Bounds_ItemChanged(object sender, MatrixValuesChangedEventArgs e) {
       OnBoundsChanged();
     }
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.TravelingSalesman/3.3/PathTSPTour.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.TravelingSalesman/3.3/PathTSPTour.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.TravelingSalesman/3.3/PathTSPTour.cs	(revision 9306)
@@ -21,5 +21,4 @@
 
 using System;
-using System.Collections.Generic;
 using System.Drawing;
 using HeuristicLab.Common;
@@ -145,9 +144,9 @@
 
     private void RegisterCoordinatesEvents() {
-      Coordinates.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(Coordinates_ItemChanged);
+      Coordinates.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(Coordinates_ItemChanged);
       Coordinates.Reset += new EventHandler(Coordinates_Reset);
     }
     private void DeregisterCoordinatesEvents() {
-      Coordinates.ItemsChanged -= new EventHandler<EventArgs<IEnumerable<Position>>>(Coordinates_ItemChanged);
+      Coordinates.ItemsChanged -= new EventHandler<MatrixValuesChangedEventArgs>(Coordinates_ItemChanged);
       Coordinates.Reset -= new EventHandler(Coordinates_Reset);
     }
@@ -167,5 +166,5 @@
     }
 
-    private void Coordinates_ItemChanged(object sender, EventArgs<IEnumerable<Position>> e) {
+    private void Coordinates_ItemChanged(object sender, MatrixValuesChangedEventArgs e) {
       OnCoordinatesChanged();
     }
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 9306)
@@ -158,5 +158,5 @@
     private void CoordinatesParameter_ValueChanged(object sender, EventArgs e) {
       if (Coordinates != null) {
-        Coordinates.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(Coordinates_ItemChanged);
+        Coordinates.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(Coordinates_ItemChanged);
         Coordinates.Reset += new EventHandler(Coordinates_Reset);
       }
@@ -166,5 +166,5 @@
       }
     }
-    private void Coordinates_ItemChanged(object sender, EventArgs<IEnumerable<Position>> e) {
+    private void Coordinates_ItemChanged(object sender, MatrixValuesChangedEventArgs e) {
       if (Evaluator is ITSPCoordinatesPathEvaluator) {
         ClearDistanceMatrix();
@@ -223,5 +223,5 @@
       CoordinatesParameter.ValueChanged += new EventHandler(CoordinatesParameter_ValueChanged);
       if (Coordinates != null) {
-        Coordinates.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(Coordinates_ItemChanged);
+        Coordinates.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(Coordinates_ItemChanged);
         Coordinates.Reset += new EventHandler(Coordinates_Reset);
       }
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.VehicleRouting/3.3/VRPSolution.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.VehicleRouting/3.3/VRPSolution.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.VehicleRouting/3.3/VRPSolution.cs	(revision 9306)
@@ -21,5 +21,4 @@
 
 using System;
-using System.Collections.Generic;
 using System.Drawing;
 using HeuristicLab.Common;
@@ -312,9 +311,9 @@
 
     private void RegisterCoordinatesEvents() {
-      Coordinates.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(Coordinates_ItemChanged);
+      Coordinates.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(Coordinates_ItemChanged);
       Coordinates.Reset += new EventHandler(Coordinates_Reset);
     }
     private void DeregisterCoordinatesEvents() {
-      Coordinates.ItemsChanged -= new EventHandler<EventArgs<IEnumerable<Position>>>(Coordinates_ItemChanged);
+      Coordinates.ItemsChanged -= new EventHandler<MatrixValuesChangedEventArgs>(Coordinates_ItemChanged);
       Coordinates.Reset -= new EventHandler(Coordinates_Reset);
     }
@@ -362,5 +361,5 @@
     }
 
-    private void Coordinates_ItemChanged(object sender, EventArgs<IEnumerable<Position>> e) {
+    private void Coordinates_ItemChanged(object sender, MatrixValuesChangedEventArgs e) {
       OnCoordinatesChanged();
     }
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.VehicleRouting/3.3/VehicleRoutingProblem.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.VehicleRouting/3.3/VehicleRoutingProblem.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.VehicleRouting/3.3/VehicleRoutingProblem.cs	(revision 9306)
@@ -212,5 +212,5 @@
     }
     private void CoordinatesParameter_ValueChanged(object sender, EventArgs e) {
-      Coordinates.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(Coordinates_ItemChanged);
+      Coordinates.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(Coordinates_ItemChanged);
       Coordinates.Reset += new EventHandler(Coordinates_Reset);
       ParameterizeSolutionCreator();
@@ -219,5 +219,5 @@
       BestKnownSolution = null;
     }
-    private void Coordinates_ItemChanged(object sender, EventArgs<IEnumerable<Position>> e) {
+    private void Coordinates_ItemChanged(object sender, MatrixValuesChangedEventArgs e) {
       ClearDistanceMatrix();
 
@@ -271,5 +271,5 @@
     void DistanceMatrixParameter_ValueChanged(object sender, EventArgs e) {
       if (DistanceMatrix != null) {
-        DistanceMatrix.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(DistanceMatrix_ItemChanged);
+        DistanceMatrix.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(DistanceMatrix_ItemChanged);
         DistanceMatrix.Reset += new EventHandler(DistanceMatrix_Reset);
       }
@@ -279,5 +279,5 @@
       EvalBestKnownSolution();
     }
-    void DistanceMatrix_ItemChanged(object sender, EventArgs<IEnumerable<Position>> e) {
+    void DistanceMatrix_ItemChanged(object sender, MatrixValuesChangedEventArgs e) {
       EvalBestKnownSolution();
     }
@@ -367,5 +367,5 @@
     private void RegisterEventHandlers() {
       CoordinatesParameter.ValueChanged += new EventHandler(CoordinatesParameter_ValueChanged);
-      Coordinates.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(Coordinates_ItemChanged);
+      Coordinates.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(Coordinates_ItemChanged);
       Coordinates.Reset += new EventHandler(Coordinates_Reset);
 
Index: /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs
===================================================================
--- /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs	(revision 9305)
+++ /branches/ImprovingStringConvertibleMatrix/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs	(revision 9306)
@@ -281,5 +281,5 @@
       DistanceMatrixParameter.ValueChanged += new EventHandler(DistanceMatrixParameter_ValueChanged);
       if (DistanceMatrix != null) {
-        DistanceMatrix.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(DistanceMatrix_ItemChanged);
+        DistanceMatrix.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(DistanceMatrix_ItemChanged);
         DistanceMatrix.Reset += new EventHandler(DistanceMatrix_Reset);
       }
@@ -311,5 +311,5 @@
     void DistanceMatrixParameter_ValueChanged(object sender, EventArgs e) {
       if (DistanceMatrix != null) {
-        DistanceMatrix.ItemsChanged += new EventHandler<EventArgs<IEnumerable<Position>>>(DistanceMatrix_ItemChanged);
+        DistanceMatrix.ItemsChanged += new EventHandler<MatrixValuesChangedEventArgs>(DistanceMatrix_ItemChanged);
         DistanceMatrix.Reset += new EventHandler(DistanceMatrix_Reset);
       }
@@ -320,5 +320,5 @@
       EvalBestKnownSolution();
     }
-    void DistanceMatrix_ItemChanged(object sender, EventArgs<IEnumerable<Position>> e) {
+    void DistanceMatrix_ItemChanged(object sender, MatrixValuesChangedEventArgs e) {
       distanceMatrix = DistanceMatrix;
       EvalBestKnownSolution();
