Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/BoolArray.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/BoolArray.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/BoolArray.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -28,5 +28,5 @@
   [Item("BoolArray", "Represents an array of boolean values.")]
   [StorableClass]
-  public class BoolArray : ValueTypeArray<bool>, IStringConvertibleArray {
+  public class BoolArray : StringConvertibleArray<bool> {
     [StorableConstructor]
     protected BoolArray(bool deserializing) : base(deserializing) { }
@@ -42,5 +42,5 @@
     }
 
-    protected virtual bool Validate(string value, out string errorMessage) {
+    protected override bool Validate(string value, out string errorMessage) {
       bool val;
       bool valid = bool.TryParse(value, out val);
@@ -55,8 +55,8 @@
       return valid;
     }
-    protected virtual string GetValue(int index) {
+    protected override string GetValue(int index) {
       return this[index].ToString();
     }
-    protected virtual bool SetValue(string value, int index) {
+    protected override bool SetValue(string value, int index) {
       bool val;
       if (bool.TryParse(value, out val)) {
@@ -67,20 +67,4 @@
       }
     }
-
-    #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: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/BoolMatrix.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/BoolValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/BoolValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/BoolValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Comparison.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Comparison.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Comparison.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/ComparisonType.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/ComparisonType.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/ComparisonType.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DateTimeValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DateTimeValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DateTimeValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DoubleArray.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DoubleArray.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DoubleArray.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -28,5 +28,5 @@
   [Item("DoubleArray", "Represents an array of double values.")]
   [StorableClass]
-  public class DoubleArray : ValueTypeArray<double>, IStringConvertibleArray {
+  public class DoubleArray : StringConvertibleArray<double> {
     [StorableConstructor]
     protected DoubleArray(bool deserializing) : base(deserializing) { }
@@ -42,5 +42,5 @@
     }
 
-    protected virtual bool Validate(string value, out string errorMessage) {
+    protected override bool Validate(string value, out string errorMessage) {
       double val;
       bool valid = double.TryParse(value, out val);
@@ -55,8 +55,8 @@
       return valid;
     }
-    protected virtual string GetValue(int index) {
+    protected override string GetValue(int index) {
       return this[index].ToString("r");
     }
-    protected virtual bool SetValue(string value, int index) {
+    protected override bool SetValue(string value, int index) {
       double val;
       if (double.TryParse(value, out val)) {
@@ -67,20 +67,4 @@
       }
     }
-
-    #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: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DoubleMatrix.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DoubleRange.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DoubleRange.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DoubleRange.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DoubleValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DoubleValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/DoubleValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/EnumValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/EnumValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/EnumValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -52,6 +52,4 @@
     private EnumValue(EnumValue<T> original, Cloner cloner)
       : base(original, cloner) {
-      this.value = original.value;
-      this.readOnly = original.readOnly;
     }
 
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/FormatPatterns.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/FormatPatterns.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/FormatPatterns.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/HeuristicLab.Data-3.3.csproj
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/HeuristicLab.Data-3.3.csproj	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/HeuristicLab.Data-3.3.csproj	(revision 15973)
@@ -124,4 +124,5 @@
     <Compile Include="ComparisonType.cs" />
     <Compile Include="EnumValue.cs" />
+    <Compile Include="Interfaces\IValueTypeArray.cs" />
     <Compile Include="Path Types\DirectoryValue.cs" />
     <Compile Include="Path Types\FileValue.cs" />
@@ -148,7 +149,9 @@
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="StringArray.cs" />
+    <Compile Include="StringConvertibleArray.cs" />
     <Compile Include="StringMatrix.cs" />
     <Compile Include="StringValue.cs" />
     <Compile Include="TimeSpanValue.cs" />
+    <Compile Include="TriangularMatrix.cs" />
     <Compile Include="ValueTypeArray.cs" />
     <Compile Include="ValueTypeMatrix.cs" />
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/IntArray.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/IntArray.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/IntArray.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -28,5 +28,5 @@
   [Item("IntArray", "Represents an array of integer values.")]
   [StorableClass]
-  public class IntArray : ValueTypeArray<int>, IStringConvertibleArray {
+  public class IntArray : StringConvertibleArray<int> {
     [StorableConstructor]
     protected IntArray(bool deserializing) : base(deserializing) { }
@@ -42,5 +42,5 @@
     }
 
-    protected virtual bool Validate(string value, out string errorMessage) {
+    protected override bool Validate(string value, out string errorMessage) {
       int val;
       bool valid = int.TryParse(value, out val);
@@ -55,8 +55,8 @@
       return valid;
     }
-    protected virtual string GetValue(int index) {
+    protected override string GetValue(int index) {
       return this[index].ToString();
     }
-    protected virtual bool SetValue(string value, int index) {
+    protected override bool SetValue(string value, int index) {
       int val;
       if (int.TryParse(value, out val)) {
@@ -67,20 +67,4 @@
       }
     }
-
-    #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: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/IntMatrix.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/IntRange.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/IntRange.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/IntRange.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/IntValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/IntValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/IntValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleArray.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleArray.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleArray.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -20,22 +20,11 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
 using HeuristicLab.Common;
 
 namespace HeuristicLab.Data {
-  public interface IStringConvertibleArray : IContent {
-    int Length { get; set; }
-    IEnumerable<string> ElementNames { get; set; }
-
-    bool ReadOnly { get; }
-
+  public interface IStringConvertibleArray : IContent, IValueTypeArray {
     bool Validate(string value, out string errorMessage);
     string GetValue(int index);
     bool SetValue(string value, int index);
-
-    event EventHandler ElementNamesChanged;
-    event EventHandler<EventArgs<int>> ItemChanged;
-    event EventHandler Reset;
   }
 }
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleMatrix.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleMatrix.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleMatrix.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleValueTuple.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleValueTuple.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleValueTuple.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IValueTypeArray.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IValueTypeArray.cs	(revision 15973)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Interfaces/IValueTypeArray.cs	(revision 15973)
@@ -0,0 +1,51 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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 System;
+using System.Collections;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public interface IValueTypeArray : IItem, IEnumerable {
+    bool ReadOnly { get; }
+    IValueTypeArray AsReadOnly();
+
+    int Length { get; set; }
+    bool Resizable { get; set; }
+    event EventHandler ResizableChanged;
+
+    IEnumerable<string> ElementNames { get; set; }
+    event EventHandler ElementNamesChanged;
+
+    event EventHandler<EventArgs<int>> ItemChanged;
+    event EventHandler Reset;
+  }
+
+  public interface IValueTypeArray<T> : IValueTypeArray, IEnumerable<T> where T : struct {
+    T this[int index] { get; set; }
+  }
+}
+
+
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Path Types/DirectoryValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Path Types/DirectoryValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Path Types/DirectoryValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Path Types/FileValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Path Types/FileValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Path Types/FileValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Path Types/PathValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Path Types/PathValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Path Types/PathValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Path Types/TextFileValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Path Types/TextFileValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Path Types/TextFileValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/PercentArray.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/PercentArray.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/PercentArray.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/PercentMatrix.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/PercentMatrix.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/PercentMatrix.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/PercentValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/PercentValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/PercentValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Plugin.cs.frame
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Plugin.cs.frame	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Plugin.cs.frame	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -26,5 +26,5 @@
   /// Plugin class for HeuristicLab.Data plugin.
   /// </summary>
-  [Plugin("HeuristicLab.Data", "3.3.13.$WCREV$")]
+  [Plugin("HeuristicLab.Data", "3.3.15.$WCREV$")]
   [PluginFile("HeuristicLab.Data-3.3.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Common", "3.3")]
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Properties/AssemblyInfo.cs.frame	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/Properties/AssemblyInfo.cs.frame	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2015 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
@@ -54,3 +54,3 @@
 // by using the '*' as shown below:
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.13.$WCREV$")]
+[assembly: AssemblyFileVersion("3.3.15.$WCREV$")]
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringArray.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringArray.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringArray.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -61,5 +61,5 @@
     public virtual int Length {
       get { return array.Length; }
-      protected set {
+      set {
         if (ReadOnly) throw new NotSupportedException("Length cannot be set. StringArray is read-only.");
         if (value != Length) {
@@ -72,4 +72,16 @@
       }
     }
+    [Storable]
+    protected bool resizable = true;
+    public bool Resizable {
+      get { return resizable; }
+      set {
+        if (resizable != value) {
+          resizable = value;
+          OnResizableChanged();
+        }
+      }
+    }
+
     public virtual string this[int index] {
       get { return array[index]; }
@@ -102,4 +114,5 @@
       this.array = (string[])original.array.Clone();
       this.readOnly = original.readOnly;
+      this.resizable = original.resizable;
       this.elementNames = new List<string>(original.elementNames);
     }
@@ -107,4 +120,5 @@
       array = new string[0];
       readOnly = false;
+      resizable = true;
       elementNames = new List<string>();
     }
@@ -114,4 +128,5 @@
         array[i] = string.Empty;
       readOnly = false;
+      resizable = true;
       elementNames = new List<string>();
     }
@@ -122,4 +137,5 @@
         array[i] = elements[i] == null ? string.Empty : elements[i];
       readOnly = false;
+      resizable = true;
       elementNames = new List<string>();
     }
@@ -133,4 +149,7 @@
       readOnlyStringArray.readOnly = true;
       return readOnlyStringArray;
+    }
+    IValueTypeArray IValueTypeArray.AsReadOnly() {
+      return AsReadOnly();
     }
 
@@ -155,5 +174,4 @@
       return array.Cast<string>().GetEnumerator();
     }
-
     IEnumerator IEnumerable.GetEnumerator() {
       return GetEnumerator();
@@ -181,4 +199,10 @@
     }
 
+    public event EventHandler ResizableChanged;
+    protected virtual void OnResizableChanged() {
+      EventHandler handler = ResizableChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
     public event EventHandler ElementNamesChanged;
     protected virtual void OnElementNamesChanged() {
@@ -187,5 +211,4 @@
         handler(this, EventArgs.Empty);
     }
-
     public event EventHandler<EventArgs<int>> ItemChanged;
     protected virtual void OnItemChanged(int index) {
@@ -203,8 +226,4 @@
 
     #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);
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringConvertibleArray.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringConvertibleArray.cs	(revision 15973)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringConvertibleArray.cs	(revision 15973)
@@ -0,0 +1,57 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Data {
+  [Item("StringConvertibleArray", "Represents an array of string convertible values.")]
+  [StorableClass]
+  public abstract class StringConvertibleArray<T> : ValueTypeArray<T>, IStringConvertibleArray where T : struct {
+    [StorableConstructor]
+    protected StringConvertibleArray(bool deserializing) : base(deserializing) { }
+    protected StringConvertibleArray(StringConvertibleArray<T> original, Cloner cloner)
+      : base(original, cloner) { }
+
+    protected StringConvertibleArray() : base() { }
+    protected StringConvertibleArray(int length) : base(length) { }
+    protected StringConvertibleArray(T[] elements) : base(elements) { }
+
+    protected abstract bool Validate(string value, out string errorMessage);
+    protected abstract string GetValue(int index);
+    protected abstract bool SetValue(string value, int index);
+
+    #region IStringConvertibleArray Members
+    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: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringConvertibleValueTuple.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringConvertibleValueTuple.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringConvertibleValueTuple.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringMatrix.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/StringValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/TimeSpanValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/TimeSpanValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/TimeSpanValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -21,4 +21,5 @@
 
 using System;
+using System.Globalization;
 using System.Text;
 using HeuristicLab.Common;
@@ -52,5 +53,5 @@
     protected virtual bool Validate(string value, out string errorMessage) {
       TimeSpan val;
-      bool valid = TimeSpan.TryParse(value, out val);
+      bool valid = TimeSpan.TryParseExact(value, "c", CultureInfo.CurrentCulture, out val);
       errorMessage = string.Empty;
       if (!valid) {
@@ -64,9 +65,9 @@
     }
     protected virtual string GetValue() {
-      return Value.ToString();
+      return Value.ToString("c");
     }
     protected virtual bool SetValue(string value) {
       TimeSpan val;
-      if (TimeSpan.TryParse(value, out val)) {
+      if (TimeSpan.TryParseExact(value, "c", CultureInfo.CurrentCulture, out val)) {
         Value = val;
         return true;
@@ -74,4 +75,7 @@
         return false;
       }
+    }
+    public override string ToString() {
+      return Value.ToString("c");
     }
 
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/TriangularMatrix.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/TriangularMatrix.cs	(revision 15973)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/TriangularMatrix.cs	(revision 15973)
@@ -0,0 +1,212 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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 System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Data {
+  [Item("TriangularMatrix", "Represents a lower triangular matrix.")]
+  [StorableClass]
+  public class TriangularMatrix<T> : ValueTypeMatrix<T>, IStringConvertibleMatrix where T : struct {
+    [Storable]
+    private readonly T[] storage;
+
+    private readonly int dimension;
+    private readonly long capacity;
+
+    private TriangularMatrix() { }
+
+    public TriangularMatrix(int dimension) {
+      this.dimension = dimension;
+      capacity = (long)dimension * (dimension + 1) / 2;
+      storage = new T[capacity];
+
+      readOnly = true;
+    }
+
+    [StorableConstructor]
+    protected TriangularMatrix(bool deserializing) : base(deserializing) { }
+
+    protected TriangularMatrix(TriangularMatrix<T> original, Cloner cloner) : base(original, cloner) {
+      capacity = original.capacity;
+      dimension = original.dimension;
+      storage = (T[])original.storage.Clone();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TriangularMatrix<T>(this, cloner);
+    }
+
+    public override int Rows {
+      get { return dimension; }
+      protected set { throw new NotSupportedException(); }
+    }
+
+    public override int Columns {
+      get { return dimension; }
+      protected set { throw new NotSupportedException(); }
+    }
+
+    public int Length { get { return storage.Length; } }
+
+    // the indexing rule for the (lower-)triangular matrix is that always i <= j, otherwise an IndexOutOfBounds exception will occur 
+    public override T this[int rowIndex, int columnIndex] {
+      get {
+        // provide symmetry of returned values 
+        if (columnIndex > rowIndex) return this[columnIndex, rowIndex];
+        return storage[rowIndex * (rowIndex + 1) / 2 + columnIndex];
+      }
+      set {
+        if (columnIndex > rowIndex) this[columnIndex, rowIndex] = value;
+        else storage[rowIndex * (rowIndex + 1) / 2 + columnIndex] = value;
+      }
+    }
+
+    public T this[int index] {
+      get { return storage[index]; }
+      set { storage[index] = value; }
+    }
+
+    protected virtual string GetValue(int rowIndex, int columnIndex) {
+      return this[rowIndex, columnIndex].ToString(); // see above indexing rule
+    }
+
+    protected virtual bool SetValue(string value, int rowIndex, int columnIndex) {
+      T val;
+      if (!TryParse(value, out val))
+        return false;
+      this[rowIndex, columnIndex] = val;
+      return true;
+    }
+
+    protected virtual bool Validate(string value, out string errorMessage) {
+      T val;
+      errorMessage = "";
+      if (!TryParse(value, out val)) {
+        errorMessage = string.Format("Could not parse string \"{0}\" as {1}.", value, typeof(T));
+        return false;
+      }
+      return true;
+    }
+
+    public override IEnumerator<T> GetEnumerator() {
+      return storage.Cast<T>().GetEnumerator();
+    }
+
+    private static bool TryParse(string value, out T val) {
+      if (typeof(T) == typeof(sbyte)) {
+        sbyte v;
+        if (sbyte.TryParse(value, out v)) {
+          val = (T)(object)v;
+          return true;
+        }
+      } else if (typeof(T) == typeof(byte)) {
+        byte v;
+        if (byte.TryParse(value, out v)) {
+          val = (T)(object)v;
+          return true;
+        }
+      } else if (typeof(T) == typeof(char)) {
+        char v;
+        if (char.TryParse(value, out v)) {
+          val = (T)(object)v;
+          return true;
+        }
+      } else if (typeof(T) == typeof(short)) {
+        short v;
+        if (short.TryParse(value, out v)) {
+          val = (T)(object)v;
+          return true;
+        }
+      } else if (typeof(T) == typeof(ushort)) {
+        ushort v;
+        if (ushort.TryParse(value, out v)) {
+          val = (T)(object)v;
+          return true;
+        }
+      } else if (typeof(T) == typeof(int)) {
+        int v;
+        if (int.TryParse(value, out v)) {
+          val = (T)(object)v;
+          return true;
+        }
+      } else if (typeof(T) == typeof(uint)) {
+        uint v;
+        if (uint.TryParse(value, out v)) {
+          val = (T)(object)v;
+          return true;
+        }
+      } else if (typeof(T) == typeof(long)) {
+        long v;
+        if (long.TryParse(value, out v)) {
+          val = (T)(object)v;
+          return true;
+        }
+      } else if (typeof(T) == typeof(ulong)) {
+        ulong v;
+        if (ulong.TryParse(value, out v)) {
+          val = (T)(object)v;
+          return true;
+        }
+      }
+      val = default(T);
+      return false;
+    }
+
+    public void GetMatrixCoordinates(int index, out int row, out int col) {
+      var root = TriangularRoot(index);
+      row = (int)Math.Floor(root);
+      col = index - row * (row + 1) / 2;
+    }
+
+    private static double TriangularRoot(double x) {
+      return (Math.Sqrt(8 * x + 1) - 1) / 2;
+    }
+
+    #region IStringConvertibleMatrix Members
+    int IStringConvertibleMatrix.Rows {
+      get { return dimension; }
+      set { throw new NotSupportedException("The triangular matrix does not support changing the number of rows."); }
+    }
+
+    int IStringConvertibleMatrix.Columns {
+      get { return dimension; }
+      set { throw new NotSupportedException("The triangular matrix does not support changing the number of columns."); }
+    }
+
+    string IStringConvertibleMatrix.GetValue(int rowIndex, int columnIndex) {
+      return GetValue(rowIndex, columnIndex);
+    }
+
+    bool IStringConvertibleMatrix.SetValue(string value, int rowIndex, int columnIndex) {
+      return SetValue(value, rowIndex, columnIndex);
+    }
+
+    bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    #endregion
+  }
+}
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/ValueTypeArray.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/ValueTypeArray.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/ValueTypeArray.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -33,5 +33,5 @@
   [Item("ValueTypeArray", "An abstract base class for representing arrays of value types.")]
   [StorableClass]
-  public abstract class ValueTypeArray<T> : Item, IEnumerable<T> where T : struct {
+  public abstract class ValueTypeArray<T> : Item, IValueTypeArray<T> where T : struct {
     private const int maximumToStringLength = 100;
 
@@ -75,4 +75,18 @@
       #endregion
     }
+
+    [Storable]
+    protected bool resizable = true;
+    public bool Resizable {
+      get { return resizable; }
+      set {
+        if (resizable != value) {
+          resizable = value;
+          OnResizableChanged();
+        }
+      }
+    }
+
+
     public virtual T this[int index] {
       get { return array[index]; }
@@ -103,4 +117,5 @@
       this.array = (T[])original.array.Clone();
       this.readOnly = original.readOnly;
+      this.resizable = original.resizable;
       this.elementNames = new List<string>(original.elementNames);
     }
@@ -108,4 +123,5 @@
       array = new T[0];
       readOnly = false;
+      resizable = true;
       elementNames = new List<string>();
     }
@@ -113,4 +129,5 @@
       array = new T[length];
       readOnly = false;
+      resizable = true;
       elementNames = new List<string>();
     }
@@ -119,11 +136,17 @@
       array = (T[])elements.Clone();
       readOnly = false;
+      resizable = true;
       elementNames = new List<string>();
     }
 
-    public virtual ValueTypeArray<T> AsReadOnly() {
+    public virtual IValueTypeArray AsReadOnly() {
       ValueTypeArray<T> readOnlyValueTypeArray = (ValueTypeArray<T>)this.Clone();
       readOnlyValueTypeArray.readOnly = true;
       return readOnlyValueTypeArray;
+    }
+
+    public T[] CloneAsArray() {
+      //mkommend: this works because T must be a value type (struct constraint);
+      return (T[])array.Clone();
     }
 
@@ -153,4 +176,10 @@
     }
 
+    public event EventHandler ResizableChanged;
+    protected virtual void OnResizableChanged() {
+      EventHandler handler = ResizableChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
     public event EventHandler ElementNamesChanged;
     protected virtual void OnElementNamesChanged() {
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/ValueTypeMatrix.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -195,4 +195,22 @@
     }
 
+   
+    public T[,] CloneAsMatrix() {
+      //mkommend: this works because T must be a value type (struct constraint);
+      return (T[,])matrix.Clone();
+    }
+
+    public virtual IEnumerable<T> GetRow(int row) {
+      for (var col = 0; col < Columns; col++) {
+        yield return matrix[row, col];
+      }
+    }
+
+    public virtual IEnumerable<T> GetColumn(int col) {
+      for (var row = 0; row < Rows; row++) {
+        yield return matrix[row, col];
+      }
+    }
+
     public override string ToString() {
       if (matrix.Length == 0) return "[]";
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/ValueTypeValue.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/ValueTypeValue.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Data/3.3/ValueTypeValue.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
