Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs	(revision 17364)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs	(revision 17365)
@@ -142,6 +142,10 @@
         else if (iter.Current[i] is string s)
           transposed.Add(new List<string>() { s });
-        else if (iter.Current[i] is IReadOnlyList<double> dv)
-          transposed.Add(new List<IReadOnlyList<double>>() { dv });
+        else if (iter.Current[i] is DoubleVector dv)
+          transposed.Add(new List<DoubleVector>() { dv });
+        else if (iter.Current[i] is StringVector sv)
+          transposed.Add(new List<StringVector>() { sv });
+        else if (iter.Current[i] is DateTimeVector dtv)
+          transposed.Add(new List<DateTimeVector>() { dtv });
         else throw new NotSupportedException(string.Format("Variable {0} has type {1}. This is not supported when converting from row-wise data.", vnames[i], iter.Current[i].GetType()));
       }
@@ -221,5 +225,11 @@
     }
     public IEnumerable<string> DoubleVectorVariables {
-      get { return variableValues.Where(p => p.Value is IList<IReadOnlyList<double>>).Select(p => p.Key); }
+      get { return variableValues.Where(p => p.Value is IList<DoubleVector>).Select(p => p.Key); }
+    }
+    public IEnumerable<string> StringVectorVariables {
+      get { return variableValues.Where(p => p.Value is IList<StringVector>).Select(p => p.Key); }
+    }
+    public IEnumerable<string> DateTimeVectorVariables {
+      get { return variableValues.Where(p => p.Value is IList<DateTimeVector>).Select(p => p.Key); }
     }
 
@@ -233,6 +243,12 @@
       return GetValues<DateTime>(variableName);
     }
-    public IEnumerable<IReadOnlyList<double>> GetDoubleVectorValues(string variableName) {
-      return GetValues<IReadOnlyList<double>>(variableName);
+    public IEnumerable<DoubleVector> GetDoubleVectorValues(string variableName) {
+      return GetValues<DoubleVector>(variableName);
+    }
+    public IEnumerable<StringVector> GetStringVectorValues(string variableName) {
+      return GetValues<StringVector>(variableName);
+    }
+    public IEnumerable<DateTimeVector> GetDateTimeVectorValues(string variableName) {
+      return GetValues<DateTimeVector>(variableName);
     }
 
@@ -273,14 +289,38 @@
     }
 
-    public IReadOnlyList<double> GetDoubleVectorValue(string variableName, int row) {
-      var values = GetValues<IReadOnlyList<double>>(variableName);
-      return values[row];
-    }
-    public IEnumerable<IReadOnlyList<double>> GetDoubleVectorValues(string variableName, IEnumerable<int> rows) {
-      return GetValues<IReadOnlyList<double>>(variableName, rows);
-    }
-    public ReadOnlyCollection<IReadOnlyList<double>> GetReadOnlyDoubleVectorValues(string variableName) {
-      var values = GetValues<IReadOnlyList<double>>(variableName);
-      return new ReadOnlyCollection<IReadOnlyList<double>>(values);
+    public DoubleVector GetDoubleVectorValue(string variableName, int row) {
+      var values = GetValues<DoubleVector>(variableName);
+      return values[row];
+    }
+    public IEnumerable<DoubleVector> GetDoubleVectorValues(string variableName, IEnumerable<int> rows) {
+      return GetValues<DoubleVector>(variableName, rows);
+    }
+    public ReadOnlyCollection<DoubleVector> GetReadOnlyDoubleVectorValues(string variableName) {
+      var values = GetValues<DoubleVector>(variableName);
+      return new ReadOnlyCollection<DoubleVector>(values);
+    }
+
+    public StringVector GetStringVectorValue(string variableName, int row) {
+      var values = GetValues<StringVector>(variableName);
+      return values[row];
+    }
+    public IEnumerable<StringVector> GetStringVectorValues(string variableName, IEnumerable<int> rows) {
+      return GetValues<StringVector>(variableName, rows);
+    }
+    public ReadOnlyCollection<StringVector> GetReadOnlyStringVectorValues(string variableName) {
+      var values = GetValues<StringVector>(variableName);
+      return new ReadOnlyCollection<StringVector>(values);
+    }
+
+    public DateTimeVector GetDateTimeVectorValue(string variableName, int row) {
+      var values = GetValues<DateTimeVector>(variableName);
+      return values[row];
+    }
+    public IEnumerable<DateTimeVector> GetDateTimeVectorValues(string variableName, IEnumerable<int> rows) {
+      return GetValues<DateTimeVector>(variableName, rows);
+    }
+    public ReadOnlyCollection<DateTimeVector> GetReadOnlyDateTimeVectorValues(string variableName) {
+      var values = GetValues<DateTimeVector>(variableName);
+      return new ReadOnlyCollection<DateTimeVector>(values);
     }
 
@@ -316,5 +356,6 @@
     }
     protected static bool IsAllowedType(Type type) {
-      return type == typeof(double) || type == typeof(string) || type == typeof(DateTime) || type == typeof(IReadOnlyList<double>);
+      return type == typeof(double) || type == typeof(string) || type == typeof(DateTime)
+             || type == typeof(DoubleVector) || type == typeof(StringVector) || type == typeof(DateTimeVector);
     }
 
@@ -361,6 +402,12 @@
       if (dateTimeValues != null) return new List<DateTime>(dateTimeValues);
 
-      var doubleVectorValues = values as IList<IReadOnlyList<double>>;
-      if (doubleVectorValues != null) return doubleVectorValues.Select(x => new List<double>(x)).Cast<IReadOnlyList<double>>().ToList();
+      var doubleVectorValues = values as IList<DoubleVector>;
+      if (doubleVectorValues != null) return doubleVectorValues.Select(x => new DoubleVector(x)).ToList();
+
+      var stringVectorValues = values as IList<StringVector>;
+      if (stringVectorValues != null) return stringVectorValues.Select(x => new StringVector(x)).ToList();
+
+      var dateTimeVectorValues = values as IList<DateTimeVector>;
+      if (dateTimeVectorValues != null) return dateTimeVectorValues.Select(x => new DateTimeVector(x)).ToList();
 
       throw new ArgumentException(string.Format("Unsupported variable type {0}.", GetElementType(values)));
@@ -403,7 +450,7 @@
     string IStringConvertibleMatrix.GetValue(int rowIndex, int columnIndex) {
       var value = variableValues[variableNames[columnIndex]][rowIndex];
-      if (value is IReadOnlyList<double> doubleVector)
-        return $"[{string.Join(", ", doubleVector)}]";
-      return variableValues[variableNames[columnIndex]][rowIndex].ToString();
+      if (value is IVector vector)
+        return $"[{string.Join(", ", vector.Cast<object>())}]";
+      return value.ToString();
     }
     bool IStringConvertibleMatrix.SetValue(string value, int rowIndex, int columnIndex) {
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj	(revision 17364)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj	(revision 17365)
@@ -167,4 +167,8 @@
     <Compile Include="Implementation\Transformations\ShiftToRangeTransformation.cs" />
     <Compile Include="Implementation\Transformations\Transformation.cs" />
+    <Compile Include="Implementation\Vectors\DateTimeVector.cs" />
+    <Compile Include="Implementation\Vectors\StringVector.cs" />
+    <Compile Include="Implementation\Vectors\DoubleVector.cs" />
+    <Compile Include="Implementation\Vectors\Vector.cs" />
     <Compile Include="Interfaces\Classification\IClassificationEnsembleModel.cs">
       <SubType>Code</SubType>
@@ -179,4 +183,5 @@
     <Compile Include="Interfaces\ITransformation.cs" />
     <Compile Include="Interfaces\ITransformationMapper.cs" />
+    <Compile Include="Interfaces\IVector.cs" />
     <Compile Include="Interfaces\Regression\IConfidenceRegressionModel.cs" />
     <Compile Include="Interfaces\Regression\IConfidenceRegressionSolution.cs" />
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs	(revision 17364)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs	(revision 17365)
@@ -162,5 +162,5 @@
 
       var variables = dataset.VariableNames.Where(variable =>
-        dataset.VariableHasType<double>(variable) || dataset.VariableHasType<string>(variable) || dataset.VariableHasType<IReadOnlyList<double>>(variable));
+        dataset.VariableHasType<double>(variable) || dataset.VariableHasType<string>(variable) || dataset.VariableHasType<DoubleVector> (variable));
       var inputVariables = new CheckedItemList<StringValue>(variables.Select(x => new StringValue(x).AsReadOnly()));
       foreach (StringValue x in inputVariables)
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Vectors/DateTimeVector.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Vectors/DateTimeVector.cs	(revision 17365)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Vectors/DateTimeVector.cs	(revision 17365)
@@ -0,0 +1,39 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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 HEAL.Attic;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableType("14536555-9FDD-428B-9E9F-52D27AD7F681")]
+  public class DateTimeVector : Vector<DateTime> {
+
+    public DateTimeVector(IEnumerable<DateTime> values)
+      : base(values) { }
+
+
+    [StorableConstructor]
+    protected DateTimeVector(StorableConstructorFlag _)
+      : base(_) { }
+
+  }
+}
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Vectors/DoubleVector.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Vectors/DoubleVector.cs	(revision 17365)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Vectors/DoubleVector.cs	(revision 17365)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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.Collections.Generic;
+using HEAL.Attic;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableType("D42922EF-3634-4750-9D3E-B3C327D005F5")]
+  public class DoubleVector : Vector<double> {
+
+    public DoubleVector(IEnumerable<double> values)
+      : base(values) { }
+
+
+    [StorableConstructor]
+    protected DoubleVector(StorableConstructorFlag _)
+      : base(_) { }
+
+  }
+}
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Vectors/StringVector.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Vectors/StringVector.cs	(revision 17365)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Vectors/StringVector.cs	(revision 17365)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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.Collections.Generic;
+using HEAL.Attic;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableType("485336A0-10F7-47D0-8D7C-4D095DFC7D65")]
+  public class StringVector : Vector<string> {
+
+    public StringVector(IEnumerable<string> values)
+      : base(values) { }
+
+
+    [StorableConstructor]
+    protected StringVector(StorableConstructorFlag _)
+      : base(_) { }
+
+  }
+}
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Vectors/Vector.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Vectors/Vector.cs	(revision 17365)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Vectors/Vector.cs	(revision 17365)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using HEAL.Attic;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableType("3574E222-1167-4F1B-93D2-01B15A7F1E84")]
+  public abstract class Vector<T> : IVector<T> {
+    private readonly List<T> values;
+
+    protected Vector(IEnumerable<T> values) {
+      this.values = values.ToList();
+    }
+
+    [StorableConstructor]
+    protected Vector(StorableConstructorFlag _) { }
+
+
+    #region Interface members
+
+    public int Count {
+      get { return values.Count; }
+    }
+
+    public T this[int index] {
+      get { return values[index]; }
+    }
+
+    public IEnumerator<T> GetEnumerator() {
+      return values.GetEnumerator();
+    }
+
+    IEnumerator IEnumerable.GetEnumerator() {
+      return GetEnumerator();
+    }
+
+    #endregion
+  }
+}
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataset.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataset.cs	(revision 17364)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataset.cs	(revision 17365)
@@ -35,4 +35,6 @@
     IEnumerable<string> DateTimeVariables { get; }
     IEnumerable<string> DoubleVectorVariables { get; }
+    IEnumerable<string> StringVectorVariables { get; }
+    IEnumerable<string> DateTimeVectorVariables { get; }
 
     bool ContainsVariable(string variablename);
@@ -54,8 +56,18 @@
     ReadOnlyCollection<DateTime> GetReadOnlyDateTimeValues(string variableName);
 
-    IReadOnlyList<double> GetDoubleVectorValue(string variableName, int row);
-    IEnumerable<IReadOnlyList<double>> GetDoubleVectorValues(string variableName);
-    IEnumerable<IReadOnlyList<double>> GetDoubleVectorValues(string variableName, IEnumerable<int> rows);
-    ReadOnlyCollection<IReadOnlyList<double>> GetReadOnlyDoubleVectorValues(string variableName);
+    DoubleVector GetDoubleVectorValue(string variableName, int row);
+    IEnumerable<DoubleVector> GetDoubleVectorValues(string variableName);
+    IEnumerable<DoubleVector> GetDoubleVectorValues(string variableName, IEnumerable<int> rows);
+    ReadOnlyCollection<DoubleVector> GetReadOnlyDoubleVectorValues(string variableName);
+
+    StringVector GetStringVectorValue(string variableName, int row);
+    IEnumerable<StringVector> GetStringVectorValues(string variableName);
+    IEnumerable<StringVector> GetStringVectorValues(string variableName, IEnumerable<int> rows);
+    ReadOnlyCollection<StringVector> GetReadOnlyStringVectorValues(string variableName);
+
+    DateTimeVector GetDateTimeVectorValue(string variableName, int row);
+    IEnumerable<DateTimeVector> GetDateTimeVectorValues(string variableName);
+    IEnumerable<DateTimeVector> GetDateTimeVectorValues(string variableName, IEnumerable<int> rows);
+    ReadOnlyCollection<DateTimeVector> GetReadOnlyDateTimeVectorValues(string variableName);
   }
 }
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IVector.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IVector.cs	(revision 17365)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IVector.cs	(revision 17365)
@@ -0,0 +1,13 @@
+﻿using System.Collections;
+using System.Collections.Generic;
+using HEAL.Attic;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableType("E6B5D191-F094-4A6C-91C1-011191C13A16")]
+  public interface IVector : IEnumerable {
+  }
+
+  [StorableType("FAAFAE70-9240-49FF-9614-EE4A2C17A3C7")]
+  public interface IVector<out T> : IVector, IReadOnlyList<T> {
+  }
+}
Index: /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataTestOne.cs
===================================================================
--- /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataTestOne.cs	(revision 17364)
+++ /branches/3040_VectorBasedGP/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/VectorData/VectorDataTestOne.cs	(revision 17365)
@@ -24,6 +24,6 @@
 using System.Collections.Generic;
 using System.Linq;
-using System.Runtime.Remoting.Messaging;
 using HeuristicLab.Core;
+using HeuristicLab.Problems.DataAnalysis;
 using HeuristicLab.Random;
 
@@ -57,5 +57,5 @@
 
       double x1, x2, x3;
-      IReadOnlyList<double> v1, v2;
+      DoubleVector v1, v2;
       double y;
 
@@ -63,6 +63,6 @@
       var x2Column = new List<double>(100);
       var x3Column = new List<double>(100);
-      var v1Column = new List<IReadOnlyList<double>>(100);
-      var v2Column = new List<IReadOnlyList<double>>(100);
+      var v1Column = new List<DoubleVector>(100);
+      var v2Column = new List<DoubleVector>(100);
       var yColumn = new List<double>(100);
 
@@ -91,10 +91,10 @@
       return (max - min) * rand.NextDouble() + min;
     }
-    private static double[] GetRandomDoubleVector(double min, double max, int length, IRandom rand) {
+    private static DoubleVector GetRandomDoubleVector(double min, double max, int length, IRandom rand) {
       var values = new double[length];
       for (int i = 0; i < values.Length; i++) {
         values[i] = GetRandomDouble(min, max, rand);
       }
-      return values;
+      return new DoubleVector(values);
     }
   }
