Index: /trunk/sources/HeuristicLab.Algorithms.SGA/3.3/Tests/HeuristicLab.Algorithms.SGA-3.3.Tests.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.SGA/3.3/Tests/HeuristicLab.Algorithms.SGA-3.3.Tests.csproj	(revision 3053)
+++ /trunk/sources/HeuristicLab.Algorithms.SGA/3.3/Tests/HeuristicLab.Algorithms.SGA-3.3.Tests.csproj	(revision 3054)
@@ -78,4 +78,8 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\..\HeuristicLab.Algorithms.TS\3.3\HeuristicLab.Algorithms.TS-3.3.csproj">
+      <Project>{D58A232D-04BA-4186-B73E-0EC86FD31ABE}</Project>
+      <Name>HeuristicLab.Algorithms.TS-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
       <Project>{887425B4-4348-49ED-A457-B7D2C26DDBF9}</Project>
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs	(revision 3054)
@@ -28,23 +28,16 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class BoolArray : ValueTypeArray<bool>, IStringConvertibleArray {
+  public class BoolArray : ValueTypeArray<bool>, IStringConvertibleArray {
     public BoolArray() : base() { }
     public BoolArray(int length) : base(length) { }
     public BoolArray(bool[] elements) : base(elements) { }
-    private BoolArray(BoolArray elements) : base(elements) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      BoolArray clone = new BoolArray(this);
+      BoolArray clone = new BoolArray(array);
       cloner.RegisterClonedObject(this, clone);
       return clone;
     }
 
-    #region IStringConvertibleArray Members
-    int IStringConvertibleArray.Length {
-      get { return Length; }
-      set { Length = value; }
-    }
-
-    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
+    protected virtual bool Validate(string value, out string errorMessage) {
       bool val;
       bool valid = bool.TryParse(value, out val);
@@ -59,8 +52,8 @@
       return valid;
     }
-    string IStringConvertibleArray.GetValue(int index) {
+    protected virtual string GetValue(int index) {
       return this[index].ToString();
     }
-    bool IStringConvertibleArray.SetValue(string value, int index) {
+    protected virtual bool SetValue(string value, int index) {
       bool val;
       if (bool.TryParse(value, out val)) {
@@ -71,4 +64,19 @@
       }
     }
+
+    #region IStringConvertibleArray Members
+    int IStringConvertibleArray.Length {
+      get { return Length; }
+      set { Length = value; }
+    }
+    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleArray.GetValue(int index) {
+      return GetValue(index);
+    }
+    bool IStringConvertibleArray.SetValue(string value, int index) {
+      return SetValue(value, index);
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 3054)
@@ -28,27 +28,16 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class BoolMatrix : ValueTypeMatrix<bool>, IStringConvertibleMatrix {
+  public class BoolMatrix : ValueTypeMatrix<bool>, IStringConvertibleMatrix {
     public BoolMatrix() : base() { }
     public BoolMatrix(int rows, int columns) : base(rows, columns) { }
     public BoolMatrix(bool[,] elements) : base(elements) { }
-    private BoolMatrix(BoolMatrix elements) : base(elements) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      BoolMatrix clone = new BoolMatrix(this);
+      BoolMatrix clone = new BoolMatrix(matrix);
       cloner.RegisterClonedObject(this, clone);
       return clone;
     }
 
-    #region IStringConvertibleMatrix Members
-    int IStringConvertibleMatrix.Rows {
-      get { return Rows; }
-      set { Rows = value; }
-    }
-    int IStringConvertibleMatrix.Columns {
-      get { return Columns; }
-      set { Columns = value; }
-    }
-
-    bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
+    protected virtual bool Validate(string value, out string errorMessage) {
       bool val;
       bool valid = bool.TryParse(value, out val);
@@ -63,8 +52,8 @@
       return valid;
     }
-    string IStringConvertibleMatrix.GetValue(int rowIndex, int columIndex) {
+    protected virtual string GetValue(int rowIndex, int columIndex) {
       return this[rowIndex, columIndex].ToString();
     }
-    bool IStringConvertibleMatrix.SetValue(string value, int rowIndex, int columnIndex) {
+    protected virtual bool SetValue(string value, int rowIndex, int columnIndex) {
       bool val;
       if (bool.TryParse(value, out val)) {
@@ -75,4 +64,23 @@
       }
     }
+
+    #region IStringConvertibleMatrix Members
+    int IStringConvertibleMatrix.Rows {
+      get { return Rows; }
+      set { Rows = value; }
+    }
+    int IStringConvertibleMatrix.Columns {
+      get { return Columns; }
+      set { Columns = value; }
+    }
+    bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleMatrix.GetValue(int rowIndex, int columIndex) {
+      return GetValue(rowIndex, columIndex);
+    }
+    bool IStringConvertibleMatrix.SetValue(string value, int rowIndex, int columnIndex) {
+      return SetValue(value, rowIndex, columnIndex);
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolValue.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolValue.cs	(revision 3054)
@@ -29,15 +29,15 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class BoolValue : ValueTypeValue<bool>, IComparable, IStringConvertibleValue {
+  public class BoolValue : ValueTypeValue<bool>, IComparable, IStringConvertibleValue {
     public BoolValue() : base() { }
     public BoolValue(bool value) : base(value) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      BoolValue clone = new BoolValue(Value);
+      BoolValue clone = new BoolValue(value);
       cloner.RegisterClonedObject(this, clone);
       return clone;
     }
 
-    public int CompareTo(object obj) {
+    public virtual int CompareTo(object obj) {
       BoolValue other = obj as BoolValue;
       if (other != null)
@@ -47,6 +47,5 @@
     }
 
-    #region IStringConvertibleValue Members
-    bool IStringConvertibleValue.Validate(string value, out string errorMessage) {
+    protected virtual bool Validate(string value, out string errorMessage) {
       bool val;
       bool valid = bool.TryParse(value, out val);
@@ -61,8 +60,8 @@
       return valid;
     }
-    string IStringConvertibleValue.GetValue() {
+    protected virtual string GetValue() {
       return Value.ToString();
     }
-    bool IStringConvertibleValue.SetValue(string value) {
+    protected virtual bool SetValue(string value) {
       bool val;
       if (bool.TryParse(value, out val)) {
@@ -73,4 +72,15 @@
       }
     }
+
+    #region IStringConvertibleValue Members
+    bool IStringConvertibleValue.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleValue.GetValue() {
+      return GetValue();
+    }
+    bool IStringConvertibleValue.SetValue(string value) {
+      return SetValue(value);
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Data/3.3/Comparison.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/Comparison.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/Comparison.cs	(revision 3054)
@@ -28,15 +28,15 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class Comparison : ValueTypeValue<ComparisonType>, IComparable {
+  public class Comparison : ValueTypeValue<ComparisonType>, IComparable {
     public Comparison() : base() { }
     public Comparison(ComparisonType value) : base(value) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      Comparison clone = new Comparison(Value);
+      Comparison clone = new Comparison(value);
       cloner.RegisterClonedObject(this, clone);
       return clone;
     }
 
-    public int CompareTo(object obj) {
+    public virtual int CompareTo(object obj) {
       Comparison other = obj as Comparison;
       if (other != null)
Index: /trunk/sources/HeuristicLab.Data/3.3/DateTimeValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DateTimeValue.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/DateTimeValue.cs	(revision 3054)
@@ -28,10 +28,10 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class DateTimeValue : ValueTypeValue<DateTime>, IComparable, IStringConvertibleValue {
+  public class DateTimeValue : ValueTypeValue<DateTime>, IComparable, IStringConvertibleValue {
     public DateTimeValue() : base() { }
     public DateTimeValue(DateTime value) : base(value) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      DateTimeValue clone = new DateTimeValue(Value);
+      DateTimeValue clone = new DateTimeValue(value);
       cloner.RegisterClonedObject(this, clone);
       return clone;
@@ -42,5 +42,5 @@
     }
 
-    public int CompareTo(object obj) {
+    public virtual int CompareTo(object obj) {
       DateTimeValue other = obj as DateTimeValue;
       if (other != null)
@@ -50,6 +50,5 @@
     }
 
-    #region IStringConvertibleValue Members
-    bool IStringConvertibleValue.Validate(string value, out string errorMessage) {
+    protected virtual bool Validate(string value, out string errorMessage) {
       DateTime val;
       bool valid = DateTime.TryParse(value, out val);
@@ -57,8 +56,8 @@
       return valid;
     }
-    string IStringConvertibleValue.GetValue() {
+    protected virtual string GetValue() {
       return Value.ToString("o");  // round-trip format
     }
-    bool IStringConvertibleValue.SetValue(string value) {
+    protected virtual bool SetValue(string value) {
       DateTime val;
       if (DateTime.TryParse(value, out val)) {
@@ -69,4 +68,15 @@
       }
     }
+
+    #region IStringConvertibleValue Members
+    bool IStringConvertibleValue.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleValue.GetValue() {
+      return GetValue();
+    }
+    bool IStringConvertibleValue.SetValue(string value) {
+      return SetValue(value);
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs	(revision 3054)
@@ -28,23 +28,16 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class DoubleArray : ValueTypeArray<double>, IStringConvertibleArray {
+  public class DoubleArray : ValueTypeArray<double>, IStringConvertibleArray {
     public DoubleArray() : base() { }
     public DoubleArray(int length) : base(length) { }
     public DoubleArray(double[] elements) : base(elements) { }
-    private DoubleArray(DoubleArray elements) : base(elements) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      DoubleArray clone = new DoubleArray(this);
+      DoubleArray clone = new DoubleArray(array);
       cloner.RegisterClonedObject(this, clone);
       return clone;
     }
 
-    #region IStringConvertibleArray Members
-    int IStringConvertibleArray.Length {
-      get { return Length; }
-      set { Length = value; }
-    }
-
-    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
+    protected virtual bool Validate(string value, out string errorMessage) {
       double val;
       bool valid = double.TryParse(value, out val);
@@ -59,8 +52,8 @@
       return valid;
     }
-    string IStringConvertibleArray.GetValue(int index) {
+    protected virtual string GetValue(int index) {
       return this[index].ToString();
     }
-    bool IStringConvertibleArray.SetValue(string value, int index) {
+    protected virtual bool SetValue(string value, int index) {
       double val;
       if (double.TryParse(value, out val)) {
@@ -71,4 +64,19 @@
       }
     }
+
+    #region IStringConvertibleArray Members
+    int IStringConvertibleArray.Length {
+      get { return Length; }
+      set { Length = value; }
+    }
+    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleArray.GetValue(int index) {
+      return GetValue(index);
+    }
+    bool IStringConvertibleArray.SetValue(string value, int index) {
+      return SetValue(value, index);
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 3054)
@@ -28,27 +28,16 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class DoubleMatrix : ValueTypeMatrix<double>, IStringConvertibleMatrix {
+  public class DoubleMatrix : ValueTypeMatrix<double>, IStringConvertibleMatrix {
     public DoubleMatrix() : base() { }
     public DoubleMatrix(int rows, int columns) : base(rows, columns) { }
     public DoubleMatrix(double[,] elements) : base(elements) { }
-    private DoubleMatrix(DoubleMatrix elements) : base(elements) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      DoubleMatrix clone = new DoubleMatrix(this);
+      DoubleMatrix clone = new DoubleMatrix(matrix);
       cloner.RegisterClonedObject(this, clone);
       return clone;
     }
 
-    #region IStringConvertibleMatrix Members
-    int IStringConvertibleMatrix.Rows {
-      get { return Rows; }
-      set { Rows = value; }
-    }
-    int IStringConvertibleMatrix.Columns {
-      get { return Columns; }
-      set { Columns = value; }
-    }
-
-    bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
+    protected virtual bool Validate(string value, out string errorMessage) {
       double val;
       bool valid = double.TryParse(value, out val);
@@ -63,8 +52,8 @@
       return valid;
     }
-    string IStringConvertibleMatrix.GetValue(int rowIndex, int columIndex) {
+    protected virtual string GetValue(int rowIndex, int columIndex) {
       return this[rowIndex, columIndex].ToString();
     }
-    bool IStringConvertibleMatrix.SetValue(string value, int rowIndex, int columnIndex) {
+    protected virtual bool SetValue(string value, int rowIndex, int columnIndex) {
       double val;
       if (double.TryParse(value, out val)) {
@@ -75,4 +64,23 @@
       }
     }
+
+    #region IStringConvertibleMatrix Members
+    int IStringConvertibleMatrix.Rows {
+      get { return Rows; }
+      set { Rows = value; }
+    }
+    int IStringConvertibleMatrix.Columns {
+      get { return Columns; }
+      set { Columns = value; }
+    }
+    bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleMatrix.GetValue(int rowIndex, int columIndex) {
+      return GetValue(rowIndex, columIndex);
+    }
+    bool IStringConvertibleMatrix.SetValue(string value, int rowIndex, int columnIndex) {
+      return SetValue(value, rowIndex, columnIndex);
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleValue.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleValue.cs	(revision 3054)
@@ -29,10 +29,10 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class DoubleValue : ValueTypeValue<double>, IComparable, IStringConvertibleValue {
+  public class DoubleValue : ValueTypeValue<double>, IComparable, IStringConvertibleValue {
     public DoubleValue() : base() { }
     public DoubleValue(double value) : base(value) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      DoubleValue clone = new DoubleValue(Value);
+      DoubleValue clone = new DoubleValue(value);
       cloner.RegisterClonedObject(this, clone);
       return clone;
@@ -43,5 +43,5 @@
     }
 
-    public int CompareTo(object obj) {
+    public virtual int CompareTo(object obj) {
       DoubleValue other = obj as DoubleValue;
       if (other != null)
@@ -51,6 +51,5 @@
     }
 
-    #region IStringConvertibleValue Members
-    bool IStringConvertibleValue.Validate(string value, out string errorMessage) {
+    protected virtual bool Validate(string value, out string errorMessage) {
       double val;
       bool valid = double.TryParse(value, out val);
@@ -65,8 +64,8 @@
       return valid;
     }
-    string IStringConvertibleValue.GetValue() {
+    protected virtual string GetValue() {
       return Value.ToString("r");  // round-trip format
     }
-    bool IStringConvertibleValue.SetValue(string value) {
+    protected virtual bool SetValue(string value) {
       double val;
       if (double.TryParse(value, out val)) {
@@ -77,4 +76,15 @@
       }
     }
+
+    #region IStringConvertibleValue Members
+    bool IStringConvertibleValue.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleValue.GetValue() {
+      return GetValue();
+    }
+    bool IStringConvertibleValue.SetValue(string value) {
+      return SetValue(value);
+    }
     #endregion
   }
Index: unk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.cs	(revision 3053)
+++ 	(revision )
@@ -1,49 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Text;
-using System.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.MainForm; 
-
-namespace HeuristicLab.Data {
-  /// <summary>
-  /// A visual representation to visualize a key-value pair.
-  /// </summary>
-  public partial class EditKeyValueDialog : Form {
-    private IItem key; 
-    /// <summary>
-    /// Gets the current key.
-    /// </summary>
-    public IItem Key {
-      get { return key; }
-    }
-
-    private IItem value;
-    /// <summary>
-    /// Gets the current value.
-    /// </summary>
-    public IItem Value {
-      get { return value; }
-    }
-
-    /// <summary>
-    /// Initializes a new instance of the class <see cref="EditKeyValueDialog"/> with the given types of 
-    /// key and value.
-    /// </summary>
-    /// <param name="keyType">The type of the key.</param>
-    /// <param name="valueType">The type of the value.</param>
-    public EditKeyValueDialog(Type keyType, Type valueType) {
-      InitializeComponent();
-      key = (IItem) Activator.CreateInstance(keyType);
-      value = (IItem) Activator.CreateInstance(valueType); 
-      keyPanel.Controls.Add((Control)MainFormManager.CreateDefaultView(key));
-      valuePanel.Controls.Add((Control)MainFormManager.CreateDefaultView(value)); 
-    }
-
-    private void okButton_Click(object sender, EventArgs e) {
-      this.DialogResult = DialogResult.OK;
-      this.Close();
-    }
-  }
-}
Index: unk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.designer.cs	(revision 3053)
+++ 	(revision )
@@ -1,131 +1,0 @@
-﻿namespace HeuristicLab.Data {
-  partial class EditKeyValueDialog {
-    /// <summary>
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary>
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Windows Form Designer generated code
-
-    /// <summary>
-    /// Required method for Designer support - do not modify
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.okButton = new System.Windows.Forms.Button();
-      this.cancelButton = new System.Windows.Forms.Button();
-      this.keyPanel = new System.Windows.Forms.Panel();
-      this.valuePanel = new System.Windows.Forms.Panel();
-      this.groupBox1 = new System.Windows.Forms.GroupBox();
-      this.groupBox2 = new System.Windows.Forms.GroupBox();
-      this.groupBox1.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // okButton
-      // 
-      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.okButton.Location = new System.Drawing.Point(135, 198);
-      this.okButton.Name = "okButton";
-      this.okButton.Size = new System.Drawing.Size(75, 23);
-      this.okButton.TabIndex = 0;
-      this.okButton.Text = "&OK";
-      this.okButton.UseVisualStyleBackColor = true;
-      this.okButton.Click += new System.EventHandler(this.okButton_Click);
-      // 
-      // cancelButton
-      // 
-      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-      this.cancelButton.Location = new System.Drawing.Point(216, 198);
-      this.cancelButton.Name = "cancelButton";
-      this.cancelButton.Size = new System.Drawing.Size(75, 23);
-      this.cancelButton.TabIndex = 1;
-      this.cancelButton.Text = "&Cancel";
-      this.cancelButton.UseVisualStyleBackColor = true;
-      // 
-      // keyPanel
-      // 
-      this.keyPanel.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.keyPanel.AutoScroll = true;
-      this.keyPanel.Location = new System.Drawing.Point(15, 31);
-      this.keyPanel.Name = "keyPanel";
-      this.keyPanel.Size = new System.Drawing.Size(276, 39);
-      this.keyPanel.TabIndex = 2;
-      // 
-      // valuePanel
-      // 
-      this.valuePanel.Anchor = ((System.Windows.Forms.AnchorStyles) ((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.valuePanel.AutoScroll = true;
-      this.valuePanel.Location = new System.Drawing.Point(9, 19);
-      this.valuePanel.Name = "valuePanel";
-      this.valuePanel.Size = new System.Drawing.Size(270, 80);
-      this.valuePanel.TabIndex = 3;
-      // 
-      // groupBox1
-      // 
-      this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles) ((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.groupBox1.Controls.Add(this.valuePanel);
-      this.groupBox1.Location = new System.Drawing.Point(12, 82);
-      this.groupBox1.Name = "groupBox1";
-      this.groupBox1.Size = new System.Drawing.Size(283, 109);
-      this.groupBox1.TabIndex = 4;
-      this.groupBox1.TabStop = false;
-      this.groupBox1.Text = "Value: ";
-      // 
-      // groupBox2
-      // 
-      this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles) ((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.groupBox2.Location = new System.Drawing.Point(12, 12);
-      this.groupBox2.Name = "groupBox2";
-      this.groupBox2.Size = new System.Drawing.Size(283, 64);
-      this.groupBox2.TabIndex = 5;
-      this.groupBox2.TabStop = false;
-      this.groupBox2.Text = "Key:";
-      // 
-      // EditKeyValueDialog
-      // 
-      this.AcceptButton = this.okButton;
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.CancelButton = this.cancelButton;
-      this.ClientSize = new System.Drawing.Size(301, 233);
-      this.Controls.Add(this.groupBox1);
-      this.Controls.Add(this.keyPanel);
-      this.Controls.Add(this.cancelButton);
-      this.Controls.Add(this.okButton);
-      this.Controls.Add(this.groupBox2);
-      this.Name = "EditKeyValueDialog";
-      this.Text = "KeyValuePair";
-      this.groupBox1.ResumeLayout(false);
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.Button okButton;
-    private System.Windows.Forms.Button cancelButton;
-    private System.Windows.Forms.Panel keyPanel;
-    private System.Windows.Forms.Panel valuePanel;
-    private System.Windows.Forms.GroupBox groupBox1;
-    private System.Windows.Forms.GroupBox groupBox2;
-  }
-}
Index: unk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.resx	(revision 3053)
+++ 	(revision )
@@ -1,120 +1,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-</root>
Index: /trunk/sources/HeuristicLab.Data/3.3/HeuristicLab.Data-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/HeuristicLab.Data-3.3.csproj	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/HeuristicLab.Data-3.3.csproj	(revision 3054)
@@ -95,6 +95,4 @@
     </Reference>
     <Reference Include="System.Data" />
-    <Reference Include="System.Drawing" />
-    <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml" />
   </ItemGroup>
Index: /trunk/sources/HeuristicLab.Data/3.3/IntArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntArray.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntArray.cs	(revision 3054)
@@ -28,23 +28,16 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class IntArray : ValueTypeArray<int>, IStringConvertibleArray {
+  public class IntArray : ValueTypeArray<int>, IStringConvertibleArray {
     public IntArray() : base() { }
     public IntArray(int length) : base(length) { }
     public IntArray(int[] elements) : base(elements) { }
-    private IntArray(IntArray elements) : base(elements) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      IntArray clone = new IntArray(this);
+      IntArray clone = new IntArray(array);
       cloner.RegisterClonedObject(this, clone);
       return clone;
     }
 
-    #region IStringConvertibleArray Members
-    int IStringConvertibleArray.Length {
-      get { return Length; }
-      set { Length = value; }
-    }
-
-    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
+    protected virtual bool Validate(string value, out string errorMessage) {
       int val;
       bool valid = int.TryParse(value, out val);
@@ -59,8 +52,8 @@
       return valid;
     }
-    string IStringConvertibleArray.GetValue(int index) {
+    protected virtual string GetValue(int index) {
       return this[index].ToString();
     }
-    bool IStringConvertibleArray.SetValue(string value, int index) {
+    protected virtual bool SetValue(string value, int index) {
       int val;
       if (int.TryParse(value, out val)) {
@@ -71,4 +64,19 @@
       }
     }
+
+    #region IStringConvertibleArray Members
+    int IStringConvertibleArray.Length {
+      get { return Length; }
+      set { Length = value; }
+    }
+    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleArray.GetValue(int index) {
+      return GetValue(index);
+    }
+    bool IStringConvertibleArray.SetValue(string value, int index) {
+      return SetValue(value, index);
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 3054)
@@ -28,27 +28,16 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class IntMatrix : ValueTypeMatrix<int>, IStringConvertibleMatrix {
+  public class IntMatrix : ValueTypeMatrix<int>, IStringConvertibleMatrix {
     public IntMatrix() : base() { }
     public IntMatrix(int rows, int columns) : base(rows, columns) { }
     public IntMatrix(int[,] elements) : base(elements) { }
-    private IntMatrix(IntMatrix elements) : base(elements) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      IntMatrix clone = new IntMatrix(this);
+      IntMatrix clone = new IntMatrix(matrix);
       cloner.RegisterClonedObject(this, clone);
       return clone;
     }
 
-    #region IStringConvertibleMatrix Members
-    int IStringConvertibleMatrix.Rows {
-      get { return Rows; }
-      set { Rows = value; }
-    }
-    int IStringConvertibleMatrix.Columns {
-      get { return Columns; }
-      set { Columns = value; }
-    }
-
-    bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
+    protected virtual bool Validate(string value, out string errorMessage) {
       int val;
       bool valid = int.TryParse(value, out val);
@@ -63,8 +52,8 @@
       return valid;
     }
-    string IStringConvertibleMatrix.GetValue(int rowIndex, int columIndex) {
+    protected virtual string GetValue(int rowIndex, int columIndex) {
       return this[rowIndex, columIndex].ToString();
     }
-    bool IStringConvertibleMatrix.SetValue(string value, int rowIndex, int columnIndex) {
+    protected virtual bool SetValue(string value, int rowIndex, int columnIndex) {
       int val;
       if (int.TryParse(value, out val)) {
@@ -75,4 +64,23 @@
       }
     }
+
+    #region IStringConvertibleMatrix Members
+    int IStringConvertibleMatrix.Rows {
+      get { return Rows; }
+      set { Rows = value; }
+    }
+    int IStringConvertibleMatrix.Columns {
+      get { return Columns; }
+      set { Columns = value; }
+    }
+    bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleMatrix.GetValue(int rowIndex, int columIndex) {
+      return GetValue(rowIndex, columIndex);
+    }
+    bool IStringConvertibleMatrix.SetValue(string value, int rowIndex, int columnIndex) {
+      return SetValue(value, rowIndex, columnIndex);
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Data/3.3/IntValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntValue.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntValue.cs	(revision 3054)
@@ -29,15 +29,15 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class IntValue : ValueTypeValue<int>, IComparable, IStringConvertibleValue {
+  public class IntValue : ValueTypeValue<int>, IComparable, IStringConvertibleValue {
     public IntValue() : base() { }
     public IntValue(int value) : base(value) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      IntValue clone = new IntValue(Value);
+      IntValue clone = new IntValue(value);
       cloner.RegisterClonedObject(this, clone);
       return clone;
     }
 
-    public int CompareTo(object obj) {
+    public virtual int CompareTo(object obj) {
       IntValue other = obj as IntValue;
       if (other != null)
@@ -47,6 +47,5 @@
     }
 
-    #region IStringConvertibleValue Members
-    bool IStringConvertibleValue.Validate(string value, out string errorMessage) {
+    protected virtual bool Validate(string value, out string errorMessage) {
       int val;
       bool valid = int.TryParse(value, out val);
@@ -61,8 +60,8 @@
       return valid;
     }
-    string IStringConvertibleValue.GetValue() {
+    protected virtual string GetValue() {
       return Value.ToString();
     }
-    bool IStringConvertibleValue.SetValue(string value) {
+    protected virtual bool SetValue(string value) {
       int val;
       if (int.TryParse(value, out val)) {
@@ -73,4 +72,15 @@
       }
     }
+
+    #region IStringConvertibleValue Members
+    bool IStringConvertibleValue.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleValue.GetValue() {
+      return GetValue();
+    }
+    bool IStringConvertibleValue.SetValue(string value) {
+      return SetValue(value);
+    }
     #endregion
   }
Index: unk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.cs	(revision 3053)
+++ 	(revision )
@@ -1,219 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Text;
-using System.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
-using HeuristicLab.Common;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Data {
-  /// <summary>
-  /// The visual representation of the class <see cref="HeuristicLab.Data.ItemDictionary&lt;K,V&gt;"/>.
-  /// </summary>
-  /// <typeparam name="K">The type of the keys of the dictionary.</typeparam>
-  /// <typeparam name="V">The type of the values of the dictionary.</typeparam>
-  [Content(typeof(ItemDictionary<IItem, IItem>), true)]
-  public partial class ItemDictionaryView<K, V> : ItemViewBase
-    where K : IItem
-    where V : IItem {
-
-    private EditKeyValueDialog editKeyValueDialog;
-
-    /// <summary>
-    /// Gets or sets the dictionary to represent visually.
-    /// </summary>
-    /// <remarks>Uses property <see cref="HeuristicLab.Core.ViewBase.Item"/> of base class <see cref="ViewBase"/>.
-    /// No own data storage present.</remarks>
-    public ItemDictionary<K, V> ItemDictionary {
-      get { return (ItemDictionary<K, V>) Item; }
-      set { base.Item = value; }
-    }
-
-    /// <summary>
-    /// Creates a new list view item with the given <paramref name="key"/> and <paramref name="value"/>.
-    /// </summary>
-    /// <param name="key">The key to show in the list item.</param>
-    /// <param name="value">The value to show in the list item.</param>
-    /// <returns>The created list item as <see cref="ListViewItem"/>.</returns>
-    private ListViewItem CreateListViewItem(K key, V value) {
-      ListViewItem item = new ListViewItem(key.ToString());
-      item.Name = key.ToString();
-      item.SubItems.Add(value.ToString());
-      item.SubItems[0].Tag = key;
-      item.SubItems[1].Tag = value;
-      return item;
-    }
-
-    /// <summary>
-    /// Initializes a new instance of the class <see cref="ItemDictionaryView&lt;K,V&gt;"/>.
-    /// </summary>
-    public ItemDictionaryView() {
-      InitializeComponent();
-      listView.View = View.Details;
-      listView.Columns[0].Text = "Key";
-      listView.Columns[1].Text = "Value";
-      valueTypeTextBox.Text = typeof(V).ToString();
-      keyTypeTextBox.Text = typeof(K).ToString();
-    }
-
-    /// <summary>
-    /// Initializes a new instance of the class <see cref="ItemDictionaryView&lt;K,V&gt;"/> with the given
-    /// <paramref name="dictionary"/>.
-    /// <note type="caution"> No CopyConstructor! <paramref name="dictionary"/> is not copied!</note>
-    /// </summary>
-    /// <param name="dictionary">The dictionary to represent visually.</param>
-    public ItemDictionaryView(ItemDictionary<K, V> dictionary)
-      : this() {
-      ItemDictionary = dictionary;
-    }
-
-    /// <summary>
-    /// Removes the eventhandlers from the underlying 
-    /// <see cref="HeuristicLab.Data.ItemDictionary&lt;K,V&gt;"/>.
-    /// </summary>
-    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
-    /// </remarks>
-    protected override void RemoveItemEvents() {
-      ItemDictionary.ItemAdded -= new EventHandler<EventArgs<IItem, IItem>>(ItemDictionary_ItemInserted);
-      ItemDictionary.ItemRemoved -= new EventHandler<EventArgs<IItem, IItem>>(ItemDictionary_ItemRemoved);
-      ItemDictionary.Cleared -= new EventHandler(ItemDictionary_Cleared);
-      base.RemoveItemEvents();
-    }
-
-    /// <summary>
-    /// Adds eventhandlers to the underlying <see cref="HeuristicLab.Data.ItemDictionary&lt;K,V&gt;"/>.
-    /// </summary>
-    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
-    /// </remarks>
-    protected override void AddItemEvents() {
-      base.AddItemEvents();
-      ItemDictionary.ItemAdded += new EventHandler<EventArgs<IItem, IItem>>(ItemDictionary_ItemInserted);
-      ItemDictionary.ItemRemoved += new EventHandler<EventArgs<IItem, IItem>>(ItemDictionary_ItemRemoved);
-      ItemDictionary.Cleared += new EventHandler(ItemDictionary_Cleared);
-    }
-
-    private void listView_SelectedIndexChanged(object sender, EventArgs e) {
-      if (detailsPanel.Controls.Count > 0)
-        detailsPanel.Controls[0].Dispose();
-      if (keyPanel.Controls.Count > 0)
-        keyPanel.Controls[0].Dispose();
-      detailsPanel.Controls.Clear();
-      keyPanel.Controls.Clear();
-      detailsPanel.Enabled = false;
-      keyPanel.Enabled = false;
-      removeButton.Enabled = false;
-      if (listView.SelectedItems.Count > 0) {
-        removeButton.Enabled = true;
-      }
-      if (listView.SelectedItems.Count == 1) {
-        K key = (K) listView.SelectedItems[0].SubItems[0].Tag;
-        V data = (V) listView.SelectedItems[0].SubItems[1].Tag;
-        Control keyView = (Control) MainFormManager.CreateDefaultView(key);
-        Control dataView = (Control) MainFormManager.CreateDefaultView(data);
-        keyPanel.Controls.Add(keyView);
-        detailsPanel.Controls.Add(dataView);
-        detailsPanel.Enabled = true;
-      }
-      keyPanel.Enabled = false;
-    }
-
-    #region Item and ItemDictionary Events
-    private void ItemDictionary_ItemInserted(object sender, EventArgs<IItem, IItem> e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler<EventArgs<IItem, IItem>>(ItemDictionary_ItemInserted), sender, e);
-      else {
-        ListViewItem item = CreateListViewItem((K) e.Value, (V) e.Value2);
-        listView.Items.Insert(listView.Items.Count, item);
-        item.Name = e.Value.ToString();
-        e.Value2.Changed += new EventHandler(Item_Changed);
-        e.Value.Changed += new EventHandler(Item_Changed);
-      }
-    }
-
-    private void ItemDictionary_ItemRemoved(object sender, EventArgs<IItem, IItem> e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler<EventArgs<IItem, IItem>>(ItemDictionary_ItemRemoved), sender, e);
-      else {
-        int index = listView.Items.IndexOfKey(e.Value.ToString());
-        listView.Items.RemoveAt(index);
-        e.Value.Changed -= new EventHandler(Item_Changed);
-        e.Value2.Changed += new EventHandler(Item_Changed);
-      }
-    }
-
-    private void ItemDictionary_Cleared(object sender, EventArgs e) {
-      Refresh();
-    }
-
-    private void Item_Changed(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Item_Changed), sender, e);
-      else {
-        IItem data = (IItem) sender;
-        foreach (ListViewItem item in listView.Items) {
-          if (item.SubItems[0].Tag == data) {
-            item.SubItems[0].Text = data.ToString();
-            item.Name = data.ToString();
-          } else if (item.SubItems[1].Tag == data) {
-            item.SubItems[1].Text = data.ToString();
-          }
-        }
-      }
-    }
-    #endregion
-
-    #region Update Controls
-    /// <summary>
-    /// Updates the controls with the latest elements of the dictionary.
-    /// </summary>
-    protected override void UpdateControls() {
-      base.UpdateControls();
-      detailsPanel.Controls.Clear();
-      keyPanel.Controls.Clear();
-      detailsPanel.Enabled = false;
-      keyPanel.Enabled = false;
-      removeButton.Enabled = false;
-      if (ItemDictionary != null) {
-        foreach (ListViewItem item in listView.Items) {
-          ((IItem) item.SubItems[0]).Changed -= new EventHandler(Item_Changed);
-          ((IItem) item.SubItems[1]).Changed -= new EventHandler(Item_Changed);
-        }
-        listView.Items.Clear();
-        foreach (KeyValuePair<K, V> data in ItemDictionary) {
-          ListViewItem item = CreateListViewItem(data.Key, data.Value);
-          listView.Items.Add(item);
-          data.Key.Changed += new EventHandler(Item_Changed);
-          data.Value.Changed += new EventHandler(Item_Changed);
-        }
-        addButton.Enabled = true; 
-      } else {
-        addButton.Enabled = false; 
-      }
-    }
-    #endregion
-
-    #region Button Events
-    private void addButton_Click(object sender, EventArgs e) {
-      editKeyValueDialog = new EditKeyValueDialog(typeof(K), typeof(V));
-      if (editKeyValueDialog.ShowDialog(this) == DialogResult.OK) {
-        try {
-          if (!ItemDictionary.ContainsKey((K) editKeyValueDialog.Key)) {
-            ItemDictionary.Add((K) editKeyValueDialog.Key, (V) editKeyValueDialog.Value);
-          }
-        } catch (Exception ex) {
-          HeuristicLab.Core.Views.Auxiliary.ShowErrorMessageBox(ex);
-        }
-      }
-    }
-
-    private void removeButton_Click(object sender, EventArgs e) {
-      while (listView.SelectedIndices.Count > 0)
-        ItemDictionary.Remove((K) listView.SelectedItems[0].SubItems[0].Tag);
-    }
-    #endregion
-  }
-}
Index: unk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.designer.cs	(revision 3053)
+++ 	(revision )
@@ -1,210 +1,0 @@
-﻿namespace HeuristicLab.Data {
-  partial class ItemDictionaryView<K, V> {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.groupBox1 = new System.Windows.Forms.GroupBox();
-      this.removeButton = new System.Windows.Forms.Button();
-      this.addButton = new System.Windows.Forms.Button();
-      this.listView = new System.Windows.Forms.ListView();
-      this.keyHeader = new System.Windows.Forms.ColumnHeader();
-      this.valueHeader = new System.Windows.Forms.ColumnHeader();
-      this.label1 = new System.Windows.Forms.Label();
-      this.label2 = new System.Windows.Forms.Label();
-      this.keyTypeTextBox = new System.Windows.Forms.TextBox();
-      this.valueTypeTextBox = new System.Windows.Forms.TextBox();
-      this.detailsPanel = new System.Windows.Forms.Panel();
-      this.keyPanel = new System.Windows.Forms.Panel();
-      this.groupBox2 = new System.Windows.Forms.GroupBox();
-      this.groupBox3 = new System.Windows.Forms.GroupBox();
-      this.groupBox1.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // groupBox1
-      // 
-      this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)));
-      this.groupBox1.Controls.Add(this.removeButton);
-      this.groupBox1.Controls.Add(this.addButton);
-      this.groupBox1.Controls.Add(this.listView);
-      this.groupBox1.Location = new System.Drawing.Point(5, 70);
-      this.groupBox1.Name = "groupBox1";
-      this.groupBox1.Size = new System.Drawing.Size(170, 175);
-      this.groupBox1.TabIndex = 0;
-      this.groupBox1.TabStop = false;
-      this.groupBox1.Text = "KeyValuePairs:";
-      // 
-      // removeButton
-      // 
-      this.removeButton.Location = new System.Drawing.Point(89, 145);
-      this.removeButton.Name = "removeButton";
-      this.removeButton.Size = new System.Drawing.Size(75, 23);
-      this.removeButton.TabIndex = 2;
-      this.removeButton.Text = "&Remove";
-      this.removeButton.UseVisualStyleBackColor = true;
-      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
-      // 
-      // addButton
-      // 
-      this.addButton.Location = new System.Drawing.Point(8, 145);
-      this.addButton.Name = "addButton";
-      this.addButton.Size = new System.Drawing.Size(75, 23);
-      this.addButton.TabIndex = 1;
-      this.addButton.Text = "&Add...";
-      this.addButton.UseVisualStyleBackColor = true;
-      this.addButton.Click += new System.EventHandler(this.addButton_Click);
-      // 
-      // listView
-      // 
-      this.listView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.keyHeader,
-            this.valueHeader});
-      this.listView.Location = new System.Drawing.Point(7, 19);
-      this.listView.Name = "listView";
-      this.listView.Size = new System.Drawing.Size(157, 120);
-      this.listView.TabIndex = 0;
-      this.listView.UseCompatibleStateImageBehavior = false;
-      this.listView.SelectedIndexChanged += new System.EventHandler(this.listView_SelectedIndexChanged);
-      // 
-      // label1
-      // 
-      this.label1.AutoSize = true;
-      this.label1.Location = new System.Drawing.Point(11, 12);
-      this.label1.Name = "label1";
-      this.label1.Size = new System.Drawing.Size(52, 13);
-      this.label1.TabIndex = 1;
-      this.label1.Text = "KeyType:";
-      // 
-      // label2
-      // 
-      this.label2.AutoSize = true;
-      this.label2.Location = new System.Drawing.Point(11, 40);
-      this.label2.Name = "label2";
-      this.label2.Size = new System.Drawing.Size(61, 13);
-      this.label2.TabIndex = 2;
-      this.label2.Text = "ValueType:";
-      // 
-      // keyTypeTextBox
-      // 
-      this.keyTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.keyTypeTextBox.BackColor = System.Drawing.SystemColors.ControlLight;
-      this.keyTypeTextBox.Location = new System.Drawing.Point(73, 5);
-      this.keyTypeTextBox.Name = "keyTypeTextBox";
-      this.keyTypeTextBox.Size = new System.Drawing.Size(301, 20);
-      this.keyTypeTextBox.TabIndex = 3;
-      // 
-      // valueTypeTextBox
-      // 
-      this.valueTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.valueTypeTextBox.BackColor = System.Drawing.SystemColors.ControlLight;
-      this.valueTypeTextBox.Location = new System.Drawing.Point(73, 33);
-      this.valueTypeTextBox.Name = "valueTypeTextBox";
-      this.valueTypeTextBox.Size = new System.Drawing.Size(301, 20);
-      this.valueTypeTextBox.TabIndex = 4;
-      // 
-      // detailsPanel
-      // 
-      this.detailsPanel.Anchor = ((System.Windows.Forms.AnchorStyles) ((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.detailsPanel.AutoScroll = true;
-      this.detailsPanel.ForeColor = System.Drawing.SystemColors.ControlText;
-      this.detailsPanel.Location = new System.Drawing.Point(187, 164);
-      this.detailsPanel.Name = "detailsPanel";
-      this.detailsPanel.Size = new System.Drawing.Size(187, 76);
-      this.detailsPanel.TabIndex = 9;
-      // 
-      // keyPanel
-      // 
-      this.keyPanel.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.keyPanel.AutoScroll = true;
-      this.keyPanel.ForeColor = System.Drawing.SystemColors.ControlText;
-      this.keyPanel.Location = new System.Drawing.Point(187, 90);
-      this.keyPanel.Name = "keyPanel";
-      this.keyPanel.Size = new System.Drawing.Size(187, 43);
-      this.keyPanel.TabIndex = 0;
-      // 
-      // groupBox2
-      // 
-      this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.groupBox2.Location = new System.Drawing.Point(180, 70);
-      this.groupBox2.Name = "groupBox2";
-      this.groupBox2.Size = new System.Drawing.Size(198, 69);
-      this.groupBox2.TabIndex = 10;
-      this.groupBox2.TabStop = false;
-      this.groupBox2.Text = "Key:";
-      // 
-      // groupBox3
-      // 
-      this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.groupBox3.Location = new System.Drawing.Point(181, 145);
-      this.groupBox3.Name = "groupBox3";
-      this.groupBox3.Size = new System.Drawing.Size(197, 100);
-      this.groupBox3.TabIndex = 11;
-      this.groupBox3.TabStop = false;
-      this.groupBox3.Text = "Value:";
-      // 
-      // ItemDictionaryView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.keyPanel);
-      this.Controls.Add(this.detailsPanel);
-      this.Controls.Add(this.valueTypeTextBox);
-      this.Controls.Add(this.keyTypeTextBox);
-      this.Controls.Add(this.label2);
-      this.Controls.Add(this.label1);
-      this.Controls.Add(this.groupBox1);
-      this.Controls.Add(this.groupBox2);
-      this.Controls.Add(this.groupBox3);
-      this.Name = "ItemDictionaryView";
-      this.Size = new System.Drawing.Size(381, 253);
-      this.groupBox1.ResumeLayout(false);
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.GroupBox groupBox1;
-    private System.Windows.Forms.Button removeButton;
-    private System.Windows.Forms.Button addButton;
-    private System.Windows.Forms.ListView listView;
-    private System.Windows.Forms.Label label1;
-    private System.Windows.Forms.Label label2;
-    private System.Windows.Forms.TextBox keyTypeTextBox;
-    private System.Windows.Forms.TextBox valueTypeTextBox;
-    private System.Windows.Forms.ColumnHeader keyHeader;
-    private System.Windows.Forms.ColumnHeader valueHeader;
-    private System.Windows.Forms.Panel detailsPanel;
-    private System.Windows.Forms.Panel keyPanel;
-    private System.Windows.Forms.GroupBox groupBox2;
-    private System.Windows.Forms.GroupBox groupBox3;
-  }
-}
Index: unk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.resx	(revision 3053)
+++ 	(revision )
@@ -1,120 +1,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-</root>
Index: unk/sources/HeuristicLab.Data/3.3/ItemDictionary_T.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemDictionary_T.cs	(revision 3053)
+++ 	(revision )
@@ -1,307 +1,0 @@
-﻿using System;
-using System.Collections; 
-using System.Collections.Generic;
-using System.Text;
-using System.Xml;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Common;
-
-namespace HeuristicLab.Data {
-  /// <summary>
-  /// A dictionary having key-value pairs of the type <see cref="IItem"/>.
-  /// </summary>
-  /// <typeparam name="K">The type of the keys, which must implement the interface <see cref="IItem"/>.</typeparam>
-  /// <typeparam name="V">The type of the values, which must imlement the interface <see cref="IItem"/>.</typeparam>
-  public class ItemDictionary<K,V> : ItemBase, IDictionary<K,V> 
-    where K : IItem
-    where V : IItem {
-
-    [Storable]
-    private Dictionary<K, V> dict;
-
-    /// <summary>
-    /// Gets the dictionary of key-value pairs.
-    /// </summary>
-    public Dictionary<K, V> Dictionary {
-      get { return dict; }
-    }
-
-    /// <summary>
-    /// Initializes a new instance of <see cref="ItemDictionary&lt;TKey,TValue&gt;"/>.
-    /// </summary>
-    /// <remarks>Creates a new <see cref="Dictionary"/> 
-    /// having <see cref="IItem"/> as type of keys and values 
-    /// and a new <see cref="IItemKeyComparer&lt;T&gt;"/> as <see cref="IEqualityComparer"/>.</remarks>
-    public ItemDictionary() {
-      dict = new Dictionary<K, V>(new IItemKeyComparer<K>());
-    }
-
-    #region ItemBase Members
-    /// <summary>
-    /// Clones the current instance and adds it to the dictionary <paramref name="clonedObjects"/>.
-    /// </summary>
-    /// <remarks>Also the keys and values in the dictionary are cloned and saved to the dictionary <paramref name="clonedObjects"/>,
-    /// when they are not already contained (deep copy).</remarks>
-    /// <param name="clonedObjects">A dictionary of all already cloned objects.</param>
-    /// <returns>The cloned instance as <see cref="ItemDictionary&lt;K,V&gt;"/>.</returns>
-    public override IItem Clone(ICloner cloner) {
-      ItemDictionary<K,V> clone = new ItemDictionary<K,V>();
-      cloner.RegisterClonedObject(this, clone);
-      foreach (KeyValuePair<K, V> item in dict) {
-        clone.dict.Add((K) cloner.Clone(item.Key), (V) cloner.Clone(item.Value));
-      }
-      return clone;
-    }
-
-    /// <summary>
-    /// The string representation of the dictionary
-    /// </summary>
-    /// <returns>The elements of the dictionary as string, each key-value pair in the format 
-    /// <c>Key:Value</c>, separated by a semicolon. <br/>
-    /// If the dictionary contains no entries, "Empty Dictionary" is returned.</returns>
-    public override string ToString() {
-      if (dict.Count > 0) {
-        StringBuilder builder = new StringBuilder();
-        foreach (KeyValuePair<K, V> item in dict) {
-          builder.Append(item.Key.ToString());
-          builder.Append(":");
-          builder.Append(item.Value.ToString());
-          builder.Append("; ");
-        }
-        return builder.ToString();
-      } else {
-        return "Empty Dictionary";
-      }
-    }
-    #endregion
-
-    #region IDictionary<K,V> Members
-
-    ///// <summary>
-    ///// Adds a new key value pair to the dictionary.
-    ///// </summary>
-    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;K,V&gt;.Add"/>
-    /// <remarks>Calls <see cref="OnItemAdded"/>.</remarks>
-    ///// <param name="key">The key to add.</param>
-    ///// <param name="value">The value to add.</param>
-    public void Add(K key, V value) {
-      dict.Add(key, value);
-      OnItemAdded(key, value);
-    }
-
-    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;TKey,TValue&gt;.ContainsKey"/>
-    public bool ContainsKey(K key) {
-      return dict.ContainsKey(key);
-    }
-
-    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;TKey,TValue&gt;.Keys"/>
-    public ICollection<K> Keys {
-      get { return dict.Keys; }
-    }
-
-    /// <summary>
-    /// Removes a key-value pair having the specified <paramref name="key"/>.
-    /// </summary>
-    /// <remarks>Calls <see cref="OnItemRemoved"/>.</remarks>
-    /// <param name="key">The key of the key-value pair, which should be removed.</param>
-    /// <returns><c>true</c> if the key was found and successfully removed, 
-    /// <c>false</c> if the key was not found.</returns>
-    public bool Remove(K key) {
-      V value = dict[key]; 
-      bool removed = dict.Remove(key);
-      OnItemRemoved(key, value); 
-      return removed; 
-    }
-
-    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;K,V&gt;.TryGetValue"/>
-    public bool TryGetValue(K key, out V value) {
-      return dict.TryGetValue(key, out value);
-    }
-
-    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;TKey,TValue&gt;.Values"/>
-    public ICollection<V> Values {
-      get { return dict.Values; }
-    }
-
-    /// <summary>
-    /// Gets or sets the value of a specified <paramref name="key"/>.
-    /// </summary>
-    /// <param name="key">The key of the value which should be received or changed.</param>
-    /// <returns>The value of the <paramref name="key"/>.</returns>
-    public V this[K key] {
-      get { return dict[key]; }
-      set { dict[key] = value; }
-    }
-
-    #endregion
-
-    #region ICollection<KeyValuePair<K,V>> Members
-
-    /// <summary>
-    /// Adds a key-value pair to the current instance.
-    /// </summary>
-    /// <remarks>Calls <see cref="OnItemAdded"/>.</remarks>
-    /// <param name="item">The key-value pair to add.</param>
-    public void Add(KeyValuePair<K, V> item) {
-      dict.Add(item.Key, item.Value);
-      OnItemAdded(item.Key, item.Value); 
-    }
-
-    ///// <summary>
-    ///// Empties the dictionary.
-    ///// </summary>
-    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;K,V&gt;.Clear"/>
-    /// <remarks>Calls <see cref="OnCleared"/>.</remarks>
-    public void Clear() {
-      dict.Clear();
-      OnCleared(); 
-    }
-
-    /// <summary>
-    /// Checks whether the specified key-value pair exists in the current instance of the dictionary.
-    /// </summary>
-    /// <param name="item">The key-value pair to check.</param>
-    /// <returns><c>true</c> if both, the key and the value exist in the dictionary, 
-    /// <c>false</c> otherwise.</returns>
-    public bool Contains(KeyValuePair<K, V> item) {
-      return (dict.ContainsKey(item.Key) && dict[item.Key].Equals(item.Value));
-    }
-
-    /// <summary>
-    /// TODO
-    /// </summary>
-    /// <param name="array"></param>
-    /// <param name="arrayIndex"></param>
-    public void CopyTo(KeyValuePair<K, V>[] array, int arrayIndex) {
-      throw new NotImplementedException(); 
-    }
-
-    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;K,V&gt;.Count"/>
-    public int Count {
-      get { return dict.Count; }
-    }
-
-    /// <summary>
-    /// Checks whether the dictionary is read-only.
-    /// </summary>
-    /// <remarks>Always returns <c>false</c>.</remarks>
-    public bool IsReadOnly {
-      get { return false; }
-    }
-
-    /// <summary>
-    /// Removes the specified key-value pair.
-    /// </summary>
-    /// <remarks>Calls <see cref="OnItemRemoved"/> when the removal was successful.</remarks>
-    /// <param name="item">The key-value pair to remove.</param>
-    /// <returns><c>true</c> if the removal was successful, <c>false</c> otherwise.</returns>
-    public bool Remove(KeyValuePair<K, V> item) {
-      bool removed = dict.Remove(item.Key);
-      if (removed) {
-        OnItemRemoved(item.Key, item.Value);
-      } 
-      return removed; 
-    }
-    #endregion
-
-    #region IEnumerable<KeyValuePair<K,V>> Members
-    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;K,V&gt;.GetEnumerator"/>
-    public IEnumerator<KeyValuePair<K, V>> GetEnumerator() {
-      return dict.GetEnumerator();
-    }
-    #endregion
-
-    #region IEnumerable Members
-    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;K,V&gt;.GetEnumerator"/>
-    IEnumerator IEnumerable.GetEnumerator() {
-      return dict.GetEnumerator();
-    }
-    #endregion
-
-    #region Event Handler
-    /// <summary>
-    /// Occurs when a new item is added to the dictionary.
-    /// </summary>
-    public event EventHandler<EventArgs<IItem, IItem>> ItemAdded;
-    /// <summary>
-    /// Fires a new <c>ItemAdded</c> event.
-    /// </summary>
-    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/>.</remarks>
-    /// <param name="key">The key that was added.</param>
-    /// <param name="value">The value that was added.</param>
-    protected virtual void OnItemAdded(K key, V value) {
-      if (ItemAdded != null)
-        ItemAdded(this, new EventArgs<IItem, IItem>(key, value));
-      OnChanged();
-    }
-
-    /// <summary>
-    /// Occurs when an item is removed from the dictionary.
-    /// </summary>
-    public event EventHandler<EventArgs<IItem, IItem>> ItemRemoved;
-    /// <summary>
-    /// Fires a new <c>ItemRemoved</c> event.
-    /// </summary>
-    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/>.</remarks>
-    /// <param name="key">The key that was removed.</param>
-    /// <param name="value">The value that was removed</param>
-    protected virtual void OnItemRemoved(K key, V value) {
-      if (ItemRemoved != null)
-        ItemRemoved(this, new EventArgs<IItem, IItem>(key, value));
-      OnChanged();
-    }
-
-    /// <summary>
-    /// Occurs when the dictionary is emptied.
-    /// </summary>
-    public event EventHandler Cleared;
-    /// <summary>
-    /// Fires a new <c>Cleared</c> event.
-    /// </summary>
-    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/>.</remarks>
-    protected virtual void OnCleared() {
-      if (Cleared != null)
-        Cleared(this, new EventArgs());
-      OnChanged();
-    }
-    #endregion
-
-    #region IEqualityComparer
-    /// <summary>
-    /// Compares two keys with each other.
-    /// </summary>
-    /// <typeparam name="T">The type of the keys.</typeparam>
-    internal sealed class IItemKeyComparer<T> : IEqualityComparer<T>
-        where T : IItem {
-      /// <summary>
-      /// Checks whether two keys are equal to each other.
-      /// </summary>
-      /// <param name="x">Key number one.</param>
-      /// <param name="y">Key number two.</param>
-      /// <returns><c>true</c> if the two keys are the same, <c>false</c> otherwise.</returns>
-      public bool Equals(T x, T y) {
-        if (x is IComparable) {
-          return (((IComparable) x).CompareTo(y) == 0); 
-        }
-        if (y is IComparable) {
-          return (((IComparable) y).CompareTo(x) == 0); 
-        }
-        return x.Equals(y); 
-      }
-
-      /// <summary>
-      /// Serves as a hash function for a particular type.
-      /// </summary>
-      /// <param name="obj">The object where the hash code is searched for.</param>
-      /// <returns>A hash code for the given <paramref name="obj"/>.</returns>
-      public int GetHashCode(T obj) {
-        if (obj is IObjectData) {
-          return ((IObjectData) obj).Data.GetHashCode(); 
-        }
-        return obj.GetHashCode(); 
-      }
-    }
-    #endregion
-  }
-}
Index: /trunk/sources/HeuristicLab.Data/3.3/StringArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/StringArray.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/StringArray.cs	(revision 3054)
@@ -31,11 +31,11 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class StringArray : Item, IEnumerable, IStringConvertibleArray {
+  public class StringArray : Item, IEnumerable, IStringConvertibleArray {
     [Storable]
-    private string[] array;
+    protected string[] array;
 
-    public int Length {
+    public virtual int Length {
       get { return array.Length; }
-      private set {
+      protected set {
         if (value != Length) {
           Array.Resize<string>(ref array, value);
@@ -44,5 +44,5 @@
       }
     }
-    public string this[int index] {
+    public virtual string this[int index] {
       get { return array[index]; }
       set {
@@ -70,12 +70,9 @@
         array[i] = elements[i] == null ? string.Empty : elements[i];
     }
-    private StringArray(StringArray elements) {
-      if (elements == null) throw new ArgumentNullException();
-      array = (string[])elements.array.Clone();
-    }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      StringArray clone = new StringArray(this);
+      StringArray clone = new StringArray();
       cloner.RegisterClonedObject(this, clone);
+      clone.array = (string[])array.Clone();
       return clone;
     }
@@ -93,15 +90,9 @@
     }
 
-    public IEnumerator GetEnumerator() {
+    public virtual IEnumerator GetEnumerator() {
       return array.GetEnumerator();
     }
 
-    #region IStringConvertibleArray Members
-    int IStringConvertibleArray.Length {
-      get { return Length; }
-      set { Length = value; }
-    }
-
-    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
+    protected virtual bool Validate(string value, out string errorMessage) {
       if (value == null) {
         errorMessage = "Invalid Value (string must not be null)";
@@ -112,8 +103,8 @@
       }
     }
-    string IStringConvertibleArray.GetValue(int index) {
+    protected virtual string GetValue(int index) {
       return this[index];
     }
-    bool IStringConvertibleArray.SetValue(string value, int index) {
+    protected virtual bool SetValue(string value, int index) {
       if (value != null) {
         this[index] = value;
@@ -123,6 +114,7 @@
       }
     }
+
     public event EventHandler<EventArgs<int>> ItemChanged;
-    private void OnItemChanged(int index) {
+    protected virtual void OnItemChanged(int index) {
       if (ItemChanged != null)
         ItemChanged(this, new EventArgs<int>(index));
@@ -130,9 +122,24 @@
     }
     public event EventHandler Reset;
-    private void OnReset() {
+    protected virtual void OnReset() {
       if (Reset != null)
         Reset(this, EventArgs.Empty);
       OnToStringChanged();
     }
+
+    #region IStringConvertibleArray Members
+    int IStringConvertibleArray.Length {
+      get { return Length; }
+      set { Length = value; }
+    }
+    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleArray.GetValue(int index) {
+      return GetValue(index);
+    }
+    bool IStringConvertibleArray.SetValue(string value, int index) {
+      return SetValue(value, index);
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 3054)
@@ -31,37 +31,37 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class StringMatrix : Item, IEnumerable, IStringConvertibleMatrix {
+  public class StringMatrix : Item, IEnumerable, IStringConvertibleMatrix {
     [Storable]
-    private string[,] array;
+    protected string[,] matrix;
 
-    public int Rows {
-      get { return array.GetLength(0); }
-      private set {
+    public virtual int Rows {
+      get { return matrix.GetLength(0); }
+      protected set {
         if (value != Rows) {
-          string[,] newArray = new string[value, Columns];
-          Array.Copy(array, newArray, Math.Min(value * Columns, array.Length));
-          array = newArray;
+          string[,] newMatrix = new string[value, Columns];
+          Array.Copy(matrix, newMatrix, Math.Min(value * Columns, matrix.Length));
+          matrix = newMatrix;
           OnReset();
         }
       }
     }
-    public int Columns {
-      get { return array.GetLength(1); }
-      private set {
+    public virtual int Columns {
+      get { return matrix.GetLength(1); }
+      protected set {
         if (value != Columns) {
-          string[,] newArray = new string[Rows, value];
+          string[,] newMatrix = new string[Rows, value];
           for (int i = 0; i < Rows; i++)
-            Array.Copy(array, i * Columns, newArray, i * value, Math.Min(value, Columns));
-          array = newArray;
+            Array.Copy(matrix, i * Columns, newMatrix, i * value, Math.Min(value, Columns));
+          matrix = newMatrix;
           OnReset();
         }
       }
     }
-    public string this[int rowIndex, int columnIndex] {
-      get { return array[rowIndex, columnIndex]; }
+    public virtual string this[int rowIndex, int columnIndex] {
+      get { return matrix[rowIndex, columnIndex]; }
       set {
-        if (value != array[rowIndex, columnIndex]) {
-          if ((value != null) || (array[rowIndex, columnIndex] != string.Empty)) {
-            array[rowIndex, columnIndex] = value != null ? value : string.Empty;
+        if (value != matrix[rowIndex, columnIndex]) {
+          if ((value != null) || (matrix[rowIndex, columnIndex] != string.Empty)) {
+            matrix[rowIndex, columnIndex] = value != null ? value : string.Empty;
             OnItemChanged(rowIndex, columnIndex);
           }
@@ -71,29 +71,26 @@
 
     public StringMatrix() {
-      array = new string[0, 0];
+      matrix = new string[0, 0];
     }
     public StringMatrix(int rows, int columns) {
-      array = new string[rows, columns];
-      for (int i = 0; i < array.GetLength(0); i++) {
-        for (int j = 0; j < array.GetLength(1); j++)
-          array[i, j] = string.Empty;
+      matrix = new string[rows, columns];
+      for (int i = 0; i < matrix.GetLength(0); i++) {
+        for (int j = 0; j < matrix.GetLength(1); j++)
+          matrix[i, j] = string.Empty;
       }
     }
     public StringMatrix(string[,] elements) {
       if (elements == null) throw new ArgumentNullException();
-      array = new string[elements.GetLength(0), elements.GetLength(1)];
-      for (int i = 0; i < array.GetLength(0); i++) {
-        for (int j = 0; j < array.GetLength(1); j++)
-          array[i, j] = elements[i, j] == null ? string.Empty : elements[i, j];
+      matrix = new string[elements.GetLength(0), elements.GetLength(1)];
+      for (int i = 0; i < matrix.GetLength(0); i++) {
+        for (int j = 0; j < matrix.GetLength(1); j++)
+          matrix[i, j] = elements[i, j] == null ? string.Empty : elements[i, j];
       }
-    }
-    private StringMatrix(StringMatrix elements) {
-      if (elements == null) throw new ArgumentNullException();
-      array = (string[,])elements.array.Clone();
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      StringMatrix clone = new StringMatrix(this);
+      StringMatrix clone = new StringMatrix();
       cloner.RegisterClonedObject(this, clone);
+      clone.matrix = (string[,])matrix.Clone();
       return clone;
     }
@@ -102,9 +99,9 @@
       StringBuilder sb = new StringBuilder();
       sb.Append("[");
-      if (array.Length > 0) {
+      if (matrix.Length > 0) {
         for (int i = 0; i < Rows; i++) {
-          sb.Append("[").Append(array[i, 0]);
+          sb.Append("[").Append(matrix[i, 0]);
           for (int j = 1; j < Columns; j++)
-            sb.Append(";").Append(array[i, j]);
+            sb.Append(";").Append(matrix[i, j]);
           sb.Append("]");
         }
@@ -114,6 +111,40 @@
     }
 
-    public IEnumerator GetEnumerator() {
-      return array.GetEnumerator();
+    public virtual IEnumerator GetEnumerator() {
+      return matrix.GetEnumerator();
+    }
+
+    protected virtual bool Validate(string value, out string errorMessage) {
+      if (value == null) {
+        errorMessage = "Invalid Value (string must not be null)";
+        return false;
+      } else {
+        errorMessage = string.Empty;
+        return true;
+      }
+    }
+    protected virtual string GetValue(int rowIndex, int columIndex) {
+      return this[rowIndex, columIndex];
+    }
+    protected virtual bool SetValue(string value, int rowIndex, int columnIndex) {
+      if (value != null) {
+        this[rowIndex, columnIndex] = value;
+        return true;
+      } else {
+        return false;
+      }
+    }
+
+    public event EventHandler<EventArgs<int, int>> ItemChanged;
+    protected virtual void OnItemChanged(int rowIndex, int columnIndex) {
+      if (ItemChanged != null)
+        ItemChanged(this, new EventArgs<int, int>(rowIndex, columnIndex));
+      OnToStringChanged();
+    }
+    public event EventHandler Reset;
+    protected virtual void OnReset() {
+      if (Reset != null)
+        Reset(this, EventArgs.Empty);
+      OnToStringChanged();
     }
 
@@ -127,36 +158,12 @@
       set { Columns = value; }
     }
-
     bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
-      if (value == null) {
-        errorMessage = "Invalid Value (string must not be null)";
-        return false;
-      } else {
-        errorMessage = string.Empty;
-        return true;
-      }
+      return Validate(value, out errorMessage);
     }
     string IStringConvertibleMatrix.GetValue(int rowIndex, int columIndex) {
-      return this[rowIndex, columIndex];
+      return GetValue(rowIndex, columIndex);
     }
     bool IStringConvertibleMatrix.SetValue(string value, int rowIndex, int columnIndex) {
-      if (value != null) {
-        this[rowIndex, columnIndex] = value;
-        return true;
-      } else {
-        return false;
-      }
-    }
-    public event EventHandler<EventArgs<int, int>> ItemChanged;
-    private void OnItemChanged(int rowIndex, int columnIndex) {
-      if (ItemChanged != null)
-        ItemChanged(this, new EventArgs<int, int>(rowIndex, columnIndex));
-      OnToStringChanged();
-    }
-    public event EventHandler Reset;
-    private void OnReset() {
-      if (Reset != null)
-        Reset(this, EventArgs.Empty);
-      OnToStringChanged();
+      return SetValue(value, rowIndex, columnIndex);
     }
     #endregion
Index: /trunk/sources/HeuristicLab.Data/3.3/StringValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/StringValue.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/StringValue.cs	(revision 3054)
@@ -28,8 +28,8 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class StringValue : Item, IComparable, IStringConvertibleValue {
+  public class StringValue : Item, IComparable, IStringConvertibleValue {
     [Storable]
-    private string value;
-    public string Value {
+    protected string value;
+    public virtual string Value {
       get { return value; }
       set {
@@ -51,5 +51,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      StringValue clone = new StringValue(Value);
+      StringValue clone = new StringValue(value);
       cloner.RegisterClonedObject(this, clone);
       return clone;
@@ -60,5 +60,5 @@
     }
 
-    public int CompareTo(object obj) {
+    public virtual int CompareTo(object obj) {
       StringValue other = obj as StringValue;
       if (other != null)
@@ -69,5 +69,5 @@
 
     public event EventHandler ValueChanged;
-    private void OnValueChanged() {
+    protected virtual void OnValueChanged() {
       if (ValueChanged != null)
         ValueChanged(this, EventArgs.Empty);
@@ -75,6 +75,5 @@
     }
 
-    #region IStringConvertibleValue Members
-    bool IStringConvertibleValue.Validate(string value, out string errorMessage) {
+    protected virtual bool Validate(string value, out string errorMessage) {
       if (value == null) {
         errorMessage = "Invalid Value (string must not be null)";
@@ -85,8 +84,8 @@
       }
     }
-    string IStringConvertibleValue.GetValue() {
+    protected virtual string GetValue() {
       return Value;
     }
-    bool IStringConvertibleValue.SetValue(string value) {
+    protected virtual bool SetValue(string value) {
       if (value != null) {
         Value = value;
@@ -96,4 +95,15 @@
       }
     }
+
+    #region IStringConvertibleValue Members
+    bool IStringConvertibleValue.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleValue.GetValue() {
+      return GetValue();
+    }
+    bool IStringConvertibleValue.SetValue(string value) {
+      return SetValue(value);
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Data/3.3/TimeSpanValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/TimeSpanValue.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/TimeSpanValue.cs	(revision 3054)
@@ -29,15 +29,15 @@
   [Creatable("Test")]
   [StorableClass]
-  public sealed class TimeSpanValue : ValueTypeValue<TimeSpan>, IComparable, IStringConvertibleValue {
+  public class TimeSpanValue : ValueTypeValue<TimeSpan>, IComparable, IStringConvertibleValue {
     public TimeSpanValue() : base() { }
     public TimeSpanValue(TimeSpan value) : base(value) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      TimeSpanValue clone = new TimeSpanValue(Value);
+      TimeSpanValue clone = new TimeSpanValue(value);
       cloner.RegisterClonedObject(this, clone);
       return clone;
     }
 
-    public int CompareTo(object obj) {
+    public virtual int CompareTo(object obj) {
       TimeSpanValue other = obj as TimeSpanValue;
       if (other != null)
@@ -47,6 +47,5 @@
     }
 
-    #region IStringConvertibleValue Members
-    bool IStringConvertibleValue.Validate(string value, out string errorMessage) {
+    protected virtual bool Validate(string value, out string errorMessage) {
       TimeSpan val;
       bool valid = TimeSpan.TryParse(value, out val);
@@ -61,8 +60,8 @@
       return valid;
     }
-    string IStringConvertibleValue.GetValue() {
+    protected virtual string GetValue() {
       return Value.ToString();
     }
-    bool IStringConvertibleValue.SetValue(string value) {
+    protected virtual bool SetValue(string value) {
       TimeSpan val;
       if (TimeSpan.TryParse(value, out val)) {
@@ -73,4 +72,15 @@
       }
     }
+
+    #region IStringConvertibleValue Members
+    bool IStringConvertibleValue.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleValue.GetValue() {
+      return GetValue();
+    }
+    bool IStringConvertibleValue.SetValue(string value) {
+      return SetValue(value);
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs	(revision 3054)
@@ -28,11 +28,11 @@
 
 namespace HeuristicLab.Data {
-  [Item("ValueTypeArray<T>", "A base class for representing arrays of value types.")]
+  [Item("ValueTypeArray<T>", "An abstract base class for representing arrays of value types.")]
   [StorableClass]
-  public class ValueTypeArray<T> : Item, IEnumerable where T : struct {
+  public abstract class ValueTypeArray<T> : Item, IEnumerable where T : struct {
     [Storable]
-    private T[] array;
+    protected T[] array;
 
-    public int Length {
+    public virtual int Length {
       get { return array.Length; }
       protected set {
@@ -43,5 +43,5 @@
       }
     }
-    public T this[int index] {
+    public virtual T this[int index] {
       get { return array[index]; }
       set {
@@ -53,17 +53,13 @@
     }
 
-    public ValueTypeArray() {
+    protected ValueTypeArray() {
       array = new T[0];
     }
-    public ValueTypeArray(int length) {
+    protected ValueTypeArray(int length) {
       array = new T[length];
     }
-    public ValueTypeArray(T[] elements) {
+    protected ValueTypeArray(T[] elements) {
       if (elements == null) throw new ArgumentNullException();
       array = (T[])elements.Clone();
-    }
-    protected ValueTypeArray(ValueTypeArray<T> elements) {
-      if (elements == null) throw new ArgumentNullException();
-      array = (T[])elements.array.Clone();
     }
 
@@ -86,10 +82,10 @@
     }
 
-    public IEnumerator GetEnumerator() {
+    public virtual IEnumerator GetEnumerator() {
       return array.GetEnumerator();
     }
 
     public event EventHandler<EventArgs<int>> ItemChanged;
-    private void OnItemChanged(int index) {
+    protected virtual void OnItemChanged(int index) {
       if (ItemChanged != null)
         ItemChanged(this, new EventArgs<int>(index));
@@ -97,5 +93,5 @@
     }
     public event EventHandler Reset;
-    private void OnReset() {
+    protected virtual void OnReset() {
       if (Reset != null)
         Reset(this, EventArgs.Empty);
Index: /trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 3054)
@@ -28,38 +28,38 @@
 
 namespace HeuristicLab.Data {
-  [Item("ValueTypeMatrix<T>", "A base class for representing matrices of value types.")]
+  [Item("ValueTypeMatrix<T>", "An abstract base class for representing matrices of value types.")]
   [StorableClass]
-  public class ValueTypeMatrix<T> : Item, IEnumerable where T : struct {
+  public abstract class ValueTypeMatrix<T> : Item, IEnumerable where T : struct {
     [Storable]
-    private T[,] array;
+    protected T[,] matrix;
 
-    public int Rows {
-      get { return array.GetLength(0); }
+    public virtual int Rows {
+      get { return matrix.GetLength(0); }
       protected set {
         if (value != Rows) {
           T[,] newArray = new T[value, Columns];
-          Array.Copy(array, newArray, Math.Min(value * Columns, array.Length));
-          array = newArray;
+          Array.Copy(matrix, newArray, Math.Min(value * Columns, matrix.Length));
+          matrix = newArray;
           OnReset();
         }
       }
     }
-    public int Columns {
-      get { return array.GetLength(1); }
+    public virtual int Columns {
+      get { return matrix.GetLength(1); }
       protected set {
         if (value != Columns) {
           T[,] newArray = new T[Rows, value];
           for (int i = 0; i < Rows; i++)
-            Array.Copy(array, i * Columns, newArray, i * value, Math.Min(value, Columns));
-          array = newArray;
+            Array.Copy(matrix, i * Columns, newArray, i * value, Math.Min(value, Columns));
+          matrix = newArray;
           OnReset();
         }
       }
     }
-    public T this[int rowIndex, int columnIndex] {
-      get { return array[rowIndex, columnIndex]; }
+    public virtual T this[int rowIndex, int columnIndex] {
+      get { return matrix[rowIndex, columnIndex]; }
       set {
-        if (!value.Equals(array[rowIndex, columnIndex])) {
-          array[rowIndex, columnIndex] = value;
+        if (!value.Equals(matrix[rowIndex, columnIndex])) {
+          matrix[rowIndex, columnIndex] = value;
           OnItemChanged(rowIndex, columnIndex);
         }
@@ -67,22 +67,18 @@
     }
 
-    public ValueTypeMatrix() {
-      array = new T[0, 0];
+    protected ValueTypeMatrix() {
+      matrix = new T[0, 0];
     }
-    public ValueTypeMatrix(int rows, int columns) {
-      array = new T[rows, columns];
+    protected ValueTypeMatrix(int rows, int columns) {
+      matrix = new T[rows, columns];
     }
-    public ValueTypeMatrix(T[,] elements) {
+    protected ValueTypeMatrix(T[,] elements) {
       if (elements == null) throw new ArgumentNullException();
-      array = (T[,])elements.Clone();
-    }
-    protected ValueTypeMatrix(ValueTypeMatrix<T> elements) {
-      if (elements == null) throw new ArgumentNullException();
-      array = (T[,])elements.array.Clone();
+      matrix = (T[,])elements.Clone();
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
       ValueTypeMatrix<T> clone = (ValueTypeMatrix<T>)base.Clone(cloner);
-      clone.array = (T[,])array.Clone();
+      clone.matrix = (T[,])matrix.Clone();
       return clone;
     }
@@ -91,9 +87,9 @@
       StringBuilder sb = new StringBuilder();
       sb.Append("[");
-      if (array.Length > 0) {
+      if (matrix.Length > 0) {
         for (int i = 0; i < Rows; i++) {
-          sb.Append("[").Append(array[i, 0].ToString());
+          sb.Append("[").Append(matrix[i, 0].ToString());
           for (int j = 1; j < Columns; j++)
-            sb.Append(";").Append(array[i, j].ToString());
+            sb.Append(";").Append(matrix[i, j].ToString());
           sb.Append("]");
         }
@@ -103,10 +99,10 @@
     }
 
-    public IEnumerator GetEnumerator() {
-      return array.GetEnumerator();
+    public virtual IEnumerator GetEnumerator() {
+      return matrix.GetEnumerator();
     }
 
     public event EventHandler<EventArgs<int, int>> ItemChanged;
-    private void OnItemChanged(int rowIndex, int columnIndex) {
+    protected virtual void OnItemChanged(int rowIndex, int columnIndex) {
       if (ItemChanged != null)
         ItemChanged(this, new EventArgs<int, int>(rowIndex, columnIndex));
@@ -114,5 +110,5 @@
     }
     public event EventHandler Reset;
-    private void OnReset() {
+    protected virtual void OnReset() {
       if (Reset != null)
         Reset(this, EventArgs.Empty);
Index: /trunk/sources/HeuristicLab.Data/3.3/ValueTypeValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ValueTypeValue.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Data/3.3/ValueTypeValue.cs	(revision 3054)
@@ -25,10 +25,10 @@
 
 namespace HeuristicLab.Data {
-  [Item("ValueTypeValue<T>", "A base class for representing value types.")]
+  [Item("ValueTypeValue<T>", "An abstract base class for representing values of value types.")]
   [StorableClass]
-  public class ValueTypeValue<T> : Item where T : struct {
+  public abstract class ValueTypeValue<T> : Item where T : struct {
     [Storable]
-    private T value;
-    public T Value {
+    protected T value;
+    public virtual T Value {
       get { return value; }
       set {
@@ -40,8 +40,8 @@
     }
 
-    public ValueTypeValue() {
+    protected ValueTypeValue() {
       this.value = default(T);
     }
-    public ValueTypeValue(T value) {
+    protected ValueTypeValue(T value) {
       this.value = value;
     }
Index: /trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVector.cs	(revision 3054)
+++ /trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVector.cs	(revision 3054)
@@ -0,0 +1,61 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.BinaryVectorEncoding {
+  [StorableClass]
+  [Item("BinaryVector", "Represents a vector of binary values.")]
+  [Creatable("Test")]
+  public class BinaryVector : BoolArray {
+    public BinaryVector() : base() { }
+    public BinaryVector(int length) : base(length) { }
+    public BinaryVector(int length, IRandom random)
+      : this(length) {
+      Randomize(random);
+    }
+    public BinaryVector(bool[] elements) : base(elements) { }
+    public BinaryVector(BoolArray elements)
+      : this(elements.Length) {
+      for (int i = 0; i < array.Length; i++)
+        array[i] = elements[i];
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      BinaryVector clone = new BinaryVector(array);
+      cloner.RegisterClonedObject(this, clone);
+      return clone;
+    }
+
+    public virtual void Randomize(IRandom random, int startIndex, int length) {
+      if (length > 0) {
+        for (int i = 0; i < length; i++)
+          array[startIndex + i] = random.Next(2) == 0;
+        OnReset();
+      }
+    }
+    public void Randomize(IRandom random) {
+      Randomize(random, 0, Length);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/HeuristicLab.Encodings.BinaryVectorEncoding-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/HeuristicLab.Encodings.BinaryVectorEncoding-3.3.csproj	(revision 3053)
+++ /trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/HeuristicLab.Encodings.BinaryVectorEncoding-3.3.csproj	(revision 3054)
@@ -86,4 +86,5 @@
   <ItemGroup>
     <Compile Include="HeuristicLabEncodingsBinaryVectorEncodingPlugin.cs" />
+    <Compile Include="BinaryVector.cs" />
     <Compile Include="Interfaces\IBinaryVectorCreator.cs" />
     <Compile Include="Interfaces\IBinaryVectorCrossover.cs" />
Index: /trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/HeuristicLab.Encodings.IntegerVectorEncoding-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/HeuristicLab.Encodings.IntegerVectorEncoding-3.3.csproj	(revision 3053)
+++ /trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/HeuristicLab.Encodings.IntegerVectorEncoding-3.3.csproj	(revision 3054)
@@ -96,4 +96,5 @@
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="IntegerVector.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="IntVectorCreator.cs" />
Index: /trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVector.cs	(revision 3054)
+++ /trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVector.cs	(revision 3054)
@@ -0,0 +1,61 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.IntegerVectorEncoding {
+  [StorableClass]
+  [Item("IntegerVector", "Represents a vector of integer values.")]
+  [Creatable("Test")]
+  public class IntegerVector : IntArray {
+    public IntegerVector() : base() { }
+    public IntegerVector(int length) : base(length) { }
+    public IntegerVector(int length, IRandom random, int min, int max)
+      : this(length) {
+      Randomize(random, min, max);
+    }
+    public IntegerVector(int[] elements) : base(elements) { }
+    public IntegerVector(IntArray elements)
+      : this(elements.Length) {
+      for (int i = 0; i < array.Length; i++)
+        array[i] = elements[i];
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      IntegerVector clone = new IntegerVector(array);
+      cloner.RegisterClonedObject(this, clone);
+      return clone;
+    }
+
+    public virtual void Randomize(IRandom random, int startIndex, int length, int min, int max) {
+      if (length > 0) {
+        for (int i = 0; i < length; i++)
+          array[startIndex + i] = random.Next(min, max);
+        OnReset();
+      }
+    }
+    public void Randomize(IRandom random, int min, int max) {
+      Randomize(random, 0, Length, min, max);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Permutation.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Permutation.cs	(revision 3053)
+++ /trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Permutation.cs	(revision 3054)
@@ -20,7 +20,4 @@
 #endregion
 
-using System;
-using System.Text;
-using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -31,5 +28,5 @@
   [Item("Permutation", "Represents a permutation of integer values.")]
   [Creatable("Test")]
-  public sealed class Permutation : ValueTypeArray<int>, IStringConvertibleArray {
+  public class Permutation : IntArray {
     public Permutation() : base() { }
     public Permutation(int length)
@@ -42,16 +39,18 @@
       Randomize(random);
     }
-    public Permutation(int[] elements)
-      : base(elements) {
+    public Permutation(int[] elements) : base(elements) { }
+    public Permutation(IntArray elements)
+      : this(elements.Length) {
+      for (int i = 0; i < array.Length; i++)
+        array[i] = elements[i];
     }
-    private Permutation(Permutation elements) : base(elements) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      Permutation clone = new Permutation(this);
+      Permutation clone = new Permutation(array);
       cloner.RegisterClonedObject(this, clone);
       return clone;
     }
 
-    public bool Validate() {
+    public virtual bool Validate() {
       bool[] values = new bool[Length];
       int value;
@@ -68,15 +67,19 @@
     }
 
-    public void Randomize(IRandom random, int startIndex, int length) {  // Knuth shuffle
-      int index1, index2;
-      int val;
-      for (int i = length - 1; i > 0; i--) {
-        index1 = startIndex + i;
-        index2 = startIndex + random.Next(i + 1);
-        if (index1 != index2) {
-          val = this[index1];
-          this[index1] = this[index2];
-          this[index2] = val;
+    public virtual void Randomize(IRandom random, int startIndex, int length) {
+      if (length > 1) {
+        // Knuth shuffle
+        int index1, index2;
+        int val;
+        for (int i = length - 1; i > 0; i--) {
+          index1 = startIndex + i;
+          index2 = startIndex + random.Next(i + 1);
+          if (index1 != index2) {
+            val = array[index1];
+            array[index1] = array[index2];
+            array[index2] = val;
+          }
         }
+        OnReset();
       }
     }
@@ -85,42 +88,9 @@
     }
 
-    public int GetCircular(int position) {
+    public virtual int GetCircular(int position) {
       if (position >= Length) position = position % Length;
       while (position < 0) position += Length;
       return this[position];
     }
-
-    #region IStringConvertibleArrayData Members
-    int IStringConvertibleArray.Length {
-      get { return Length; }
-      set { Length = value; }
-    }
-
-    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
-      int val;
-      bool valid = int.TryParse(value, out val);
-      errorMessage = string.Empty;
-      if (!valid) {
-        StringBuilder sb = new StringBuilder();
-        sb.Append("Invalid Value (Valid Value Format: \"");
-        sb.Append(FormatPatterns.GetIntFormatPattern());
-        sb.Append("\")");
-        errorMessage = sb.ToString();
-      }
-      return valid;
-    }
-    string IStringConvertibleArray.GetValue(int index) {
-      return this[index].ToString();
-    }
-    bool IStringConvertibleArray.SetValue(string value, int index) {
-      int val;
-      if (int.TryParse(value, out val)) {
-        this[index] = val;
-        return true;
-      } else {
-        return false;
-      }
-    }
-    #endregion
   }
 }
Index: /trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj	(revision 3053)
+++ /trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj	(revision 3054)
@@ -103,4 +103,5 @@
     <Compile Include="Crossovers\UniformSomePositionsArithmeticCrossover.cs" />
     <Compile Include="HeuristicLabEncodingsRealVectorEncodingPlugin.cs" />
+    <Compile Include="RealVector.cs" />
     <Compile Include="Manipulators\BreederGeneticAlgorithmManipulator.cs" />
     <Compile Include="Manipulators\PolynomialAllPositionManipulator.cs" />
Index: /trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVector.cs	(revision 3054)
+++ /trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVector.cs	(revision 3054)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.RealVectorEncoding {
+  [StorableClass]
+  [Item("RealVector", "Represents a vector of real values.")]
+  [Creatable("Test")]
+  public class RealVector : DoubleArray {
+    public RealVector() : base() { }
+    public RealVector(int length) : base(length) { }
+    public RealVector(int length, IRandom random, double min, double max)
+      : this(length) {
+      Randomize(random, min, max);
+    }
+    public RealVector(double[] elements) : base(elements) { }
+    public RealVector(DoubleArray elements)
+      : this(elements.Length) {
+      for (int i = 0; i < array.Length; i++)
+        array[i] = elements[i];
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      RealVector clone = new RealVector(array);
+      cloner.RegisterClonedObject(this, clone);
+      return clone;
+    }
+
+    public virtual void Randomize(IRandom random, int startIndex, int length, double min, double max) {
+      double delta = max - min;
+      if (length > 0) {
+        for (int i = 0; i < length; i++)
+          array[startIndex + i] = min + delta * random.NextDouble();
+        OnReset();
+      }
+    }
+    public void Randomize(IRandom random, double min, double max) {
+      Randomize(random, 0, Length, min, max);
+    }
+  }
+}
