Index: trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 3308)
+++ trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 3310)
@@ -29,10 +29,16 @@
   [StorableClass]
   public class BoolMatrix : ValueTypeMatrix<bool>, IStringConvertibleMatrix {
-    public BoolMatrix() : base() { }
+        public BoolMatrix() : base() { }
     public BoolMatrix(int rows, int columns) : base(rows, columns) { }
+    public BoolMatrix(int rows, int columns, IEnumerable<string> columnNames) : base(rows, columns, columnNames) { }
+    public BoolMatrix(int rows, int columns, IEnumerable<string> columnNames, IEnumerable<string> rowNames) : base(rows, columns, columnNames, rowNames) { }
     public BoolMatrix(bool[,] elements) : base(elements) { }
+    public BoolMatrix(bool[,] elements, IEnumerable<string> columnNames) : base(elements, columnNames) { }
+    public BoolMatrix(bool[,] elements, IEnumerable<string> columnNames, IEnumerable<string> rowNames) : base(elements, columnNames, rowNames) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
       BoolMatrix clone = new BoolMatrix(matrix);
+      clone.ColumnNames = new List<string>(ColumnNames);
+      clone.RowNames = new List<string>(RowNames);
       cloner.RegisterClonedObject(this, clone);
       return clone;
@@ -78,4 +84,8 @@
       set { this.ColumnNames = value; }
     }
+    IEnumerable<string> IStringConvertibleMatrix.RowNames {
+      get { return this.RowNames; }
+      set { this.RowNames = value; }
+    }
     bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
       return Validate(value, out errorMessage);
Index: trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 3308)
+++ trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 3310)
@@ -31,8 +31,14 @@
     public DoubleMatrix() : base() { }
     public DoubleMatrix(int rows, int columns) : base(rows, columns) { }
+    public DoubleMatrix(int rows, int columns, IEnumerable<string> columnNames) : base(rows, columns, columnNames) { }
+    public DoubleMatrix(int rows, int columns, IEnumerable<string> columnNames, IEnumerable<string> rowNames) : base(rows, columns, columnNames, rowNames) { }
     public DoubleMatrix(double[,] elements) : base(elements) { }
+    public DoubleMatrix(double[,] elements, IEnumerable<string> columnNames) : base(elements, columnNames) { }
+    public DoubleMatrix(double[,] elements, IEnumerable<string> columnNames, IEnumerable<string> rowNames) : base(elements, columnNames, rowNames) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
       DoubleMatrix clone = new DoubleMatrix(matrix);
+      clone.ColumnNames = new List<string>(ColumnNames);
+      clone.RowNames = new List<string>(RowNames);
       cloner.RegisterClonedObject(this, clone);
       return clone;
@@ -78,4 +84,8 @@
       set { this.ColumnNames = value; }
     }
+    IEnumerable<string> IStringConvertibleMatrix.RowNames {
+      get { return this.RowNames; }
+      set { this.RowNames = value; }
+    }
     bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
       return Validate(value, out errorMessage);
Index: trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrix.cs	(revision 3308)
+++ trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrix.cs	(revision 3310)
@@ -30,4 +30,5 @@
 
     IEnumerable<string> ColumnNames { get; set; }
+    IEnumerable<string> RowNames { get; set; }
     //bool SortableView { get; }
 
Index: trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 3308)
+++ trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 3310)
@@ -31,8 +31,14 @@
     public IntMatrix() : base() { }
     public IntMatrix(int rows, int columns) : base(rows, columns) { }
+    public IntMatrix(int rows, int columns, IEnumerable<string> columnNames) : base(rows, columns, columnNames) { }
+    public IntMatrix(int rows, int columns, IEnumerable<string> columnNames,IEnumerable<string> rowNames) : base(rows, columns, columnNames,rowNames) { }
     public IntMatrix(int[,] elements) : base(elements) { }
+    public IntMatrix(int[,] elements, IEnumerable<string> columnNames) : base(elements,columnNames) { }
+    public IntMatrix(int[,] elements, IEnumerable<string> columnNames, IEnumerable<string> rowNames) : base(elements,columnNames,rowNames) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
       IntMatrix clone = new IntMatrix(matrix);
+      clone.ColumnNames = new List<string>(ColumnNames);
+      clone.RowNames = new List<string>(RowNames);
       cloner.RegisterClonedObject(this, clone);
       return clone;
@@ -78,4 +84,8 @@
       set { this.ColumnNames = value; }
     }
+    IEnumerable<string> IStringConvertibleMatrix.RowNames {
+      get { return this.RowNames; }
+      set { this.RowNames = value; }
+    }
     bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
       return Validate(value, out errorMessage);
Index: trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 3308)
+++ trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 3310)
@@ -42,5 +42,5 @@
 
     [Storable]
-    protected List<string> columnNames;
+    private List<string> columnNames;
     public IEnumerable<string> ColumnNames {
       get { return this.columnNames; }
@@ -49,7 +49,20 @@
           columnNames = new List<string>();
         else if (value.Count() != Columns)
-          throw new ArgumentException("A columnName must be for each column specified.");
+          throw new ArgumentException("A column name must be specified for each column .");
         else
           columnNames = new List<string>(value);
+      }
+    }
+    [Storable]
+    private List<string> rowNames;
+    public IEnumerable<string> RowNames {
+      get { return this.rowNames; }
+      set {
+        if (value == null || value.Count() == 0)
+          rowNames = new List<string>();
+        else if (value.Count() != Rows)
+          throw new ArgumentException("A row name must be specified for each row.");
+        else
+          rowNames = new List<string>(value);
       }
     }
@@ -93,4 +106,5 @@
       matrix = new string[0, 0];
       columnNames = new List<string>();
+      rowNames = new List<string>();
     }
     public StringMatrix(int rows, int columns) {
@@ -101,8 +115,13 @@
       }
       columnNames = new List<string>();
+      rowNames = new List<string>();
     }
     protected StringMatrix(int rows, int columns, IEnumerable<string> columnNames)
       : this(rows, columns) {
       ColumnNames = columnNames;
+    }
+    protected StringMatrix(int rows, int columns, IEnumerable<string> columnNames, IEnumerable<string> rowNames)
+      : this(rows, columns,columnNames) {
+      RowNames = rowNames;
     }
     public StringMatrix(string[,] elements) {
@@ -114,8 +133,13 @@
       }
       columnNames = new List<string>();
+      rowNames = new List<string>();
     }
     protected StringMatrix(string[,] elements, IEnumerable<string> columnNames)
       : this(elements) {
       ColumnNames = columnNames;
+    }
+    protected StringMatrix(string[,] elements, IEnumerable<string> columnNames,IEnumerable<string> rowNames)
+      : this(elements,columnNames) {
+      RowNames = rowNames;
     }
 
@@ -124,4 +148,6 @@
       cloner.RegisterClonedObject(this, clone);
       clone.matrix = (string[,])matrix.Clone();
+      clone.columnNames = new List<string>(columnNames);
+      clone.rowNames = new List<string>(rowNames);
       return clone;
     }
@@ -193,4 +219,8 @@
       set { this.ColumnNames = value; }
     }
+    IEnumerable<string> IStringConvertibleMatrix.RowNames {
+      get { return this.RowNames; }
+      set { this.RowNames = value; }
+    }
     bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
       return Validate(value, out errorMessage);
Index: trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 3308)
+++ trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 3310)
@@ -42,5 +42,5 @@
 
     [Storable]
-    protected List<string> columnNames;
+    private List<string> columnNames;
     public IEnumerable<string> ColumnNames {
       get { return this.columnNames; }
@@ -49,7 +49,20 @@
           columnNames = new List<string>();
         else if (value.Count() != Columns)
-          throw new ArgumentException("A columnName must be for each column specified.");
+          throw new ArgumentException("A column name must be specified for each column.");
         else
           columnNames = new List<string>(value);
+      }
+    }
+    [Storable]
+    private List<string> rowNames;
+    public IEnumerable<string> RowNames {
+      get { return this.rowNames; }
+      set {
+        if (value == null || value.Count() == 0)
+          rowNames = new List<string>();
+        else if (value.Count() != Rows)
+          throw new ArgumentException("A row name must be specified for each row.");
+        else
+          rowNames = new List<string>(value);
       }
     }
@@ -91,8 +104,10 @@
       matrix = new T[0, 0];
       columnNames = new List<string>();
+      rowNames = new List<string>();
     }
     protected ValueTypeMatrix(int rows, int columns) {
       matrix = new T[rows, columns];
       columnNames = new List<string>();
+      rowNames = new List<string>();
     }
     protected ValueTypeMatrix(int rows, int columns, IEnumerable<string> columnNames)
@@ -100,8 +115,13 @@
       ColumnNames = columnNames;
     }
+    protected ValueTypeMatrix(int rows, int columns, IEnumerable<string> columnNames,IEnumerable<string> rowNames)
+      : this(rows, columns, columnNames) {
+      RowNames = rowNames;
+    }
     protected ValueTypeMatrix(T[,] elements) {
       if (elements == null) throw new ArgumentNullException();
       matrix = (T[,])elements.Clone();
       columnNames = new List<string>();
+      rowNames = new List<string>();
     }
     protected ValueTypeMatrix(T[,] elements, IEnumerable<string> columnNames)
@@ -109,8 +129,14 @@
       ColumnNames = columnNames;
     }
+    protected ValueTypeMatrix(T[,] elements, IEnumerable<string> columnNames, IEnumerable<string> rowNames)
+      : this(elements,columnNames) {
+      RowNames = rowNames;
+    }
 
     public override IDeepCloneable Clone(Cloner cloner) {
       ValueTypeMatrix<T> clone = (ValueTypeMatrix<T>)base.Clone(cloner);
       clone.matrix = (T[,])matrix.Clone();
+      clone.columnNames = new List<string>(columnNames);
+      clone.rowNames = new List<string>(rowNames);
       return clone;
     }
