Index: addons/HeuristicLab.DataImporter/Build.cmd
===================================================================
--- addons/HeuristicLab.DataImporter/Build.cmd	(revision 15690)
+++ addons/HeuristicLab.DataImporter/Build.cmd	(revision 15690)
@@ -0,0 +1,94 @@
+@ECHO OFF
+
+SET CLEANBEFOREBUILD=1
+
+SET SELECTED=
+SET CONFIGURATION=
+SET PLATFORM=
+
+IF "%~1"=="" GOTO :prompt_solution
+
+SET SELECTED=%1
+IF NOT EXIST %SELECTED% (
+  ECHO Solution file %SELECTED% could not be found.
+  GOTO :end
+)
+ECHO Building solution %SELECTED% ...
+GOTO :config_selection
+
+:prompt_solution
+SET /A COUNT=0
+FOR /F "tokens=*" %%A IN ('dir /B *.sln') DO (
+  CALL :forloopbody "%%A"
+)
+
+IF "%COUNT%"=="1" (
+  SET SELECTED=%SOLUTIONS.1%
+  ECHO Building %SOLUTIONS.1% as it is the only solution that was found ...
+  GOTO :config_selection
+)
+
+ECHO Found the following solutions:
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO ECHO %%A = %%B
+ECHO.
+SET /P SOLUTIONINDEX=Which solution to build? Type the number: 
+
+SET SELECTED=""
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO (
+  IF "%%A"=="%SOLUTIONINDEX%" SET SELECTED=%%B
+)
+
+IF %SELECTED%=="" GOTO :eof
+
+:config_selection
+IF "%~2"==""  GOTO :prompt_config
+
+SET CONFIGURATION=%~2
+ECHO Building configuration %CONFIGURATION% ...
+GOTO :platform_selection
+
+:prompt_config
+SET /P CONFIGURATION=Which configuration to build [Release]: 
+IF "%CONFIGURATION%"=="" SET CONFIGURATION=Release
+
+:platform_selection
+IF "%~3"=="" GOTO :prompt_platform
+  
+SET PLATFORM=%~3
+ECHO Building platform %PLATFORM% ...
+GOTO :main
+
+:prompt_platform
+SET /P PLATFORM=Which platform to build [Any CPU]: 
+IF "%PLATFORM%"=="" SET PLATFORM=Any CPU
+
+:main
+REM First find the path to the msbuild.exe by performing a registry query
+FOR /F "tokens=1,3 delims=	 " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0"') DO (
+  IF "%%A"=="MSBuildToolsPath" SET MSBUILDPATH=%%B)
+
+REM Then execute msbuild to clean and build the solution
+REM Disable that msbuild creates a cache file of the solution
+SET MSBuildUseNoSolutionCache=1
+REM Run msbuild to clean and then build
+IF "%CLEANBEFOREBUILD%"=="1" (
+  ECHO Cleaning ...
+  %MSBUILDPATH%msbuild.exe %SELECTED% /target:Clean /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+)
+ECHO Building ...
+%MSBUILDPATH%msbuild.exe %SELECTED% /target:Build /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+
+ECHO.
+ECHO DONE.
+
+:end
+
+PAUSE
+
+GOTO :eof
+
+REM This workaround is necessary so that COUNT gets reevaluated
+:forloopbody
+SET /A COUNT+=1
+SET SOLUTIONS.%COUNT%=%1
+GOTO :eof
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvExporter.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvExporter.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvExporter.cs	(revision 15690)
@@ -0,0 +1,85 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using System.IO;
+using System.Globalization;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.DataImporter.DataProcessor;
+
+namespace HeuristicLab.DataImporter.Backend.Csv {
+  public class CsvExporter : IExporter{
+    public string Description {
+      get { return "Export as CSV file"; }
+    }
+
+    private CsvExporterView view;
+    public System.Windows.Forms.UserControl SettingsControl {
+      get {
+        if (view == null)
+          view = new CsvExporterView();
+        return view;
+      }
+    }
+
+    public void Export(DataSet dataSet) {
+      StreamWriter stream = new StreamWriter(view.FileName, false);      
+      if (dataSet.ColumnGroups.Count() != 0) {
+        StringBuilder sb = new StringBuilder();
+        if (view.IncludeColumnNames) {
+          foreach (ColumnGroup grp in dataSet.ColumnGroups)
+            foreach (ColumnBase col in grp.Columns)
+              sb.Append(col.Name + ';');
+          sb.Remove(sb.Length - 1, 1);
+          sb.Append(Environment.NewLine);
+          stream.Write(sb);
+          sb.Remove(0, sb.Length);
+        }
+
+        IComparable value;
+        for (int i = 0; i < dataSet.ColumnGroups.Max(x => x.RowCount); i++) {
+          foreach (ColumnGroup grp in dataSet.ColumnGroups) {
+              foreach (ColumnBase col in grp.Columns) {
+                value = col.GetValue(i);
+                if (value == null)
+                  sb.Append(';');
+                else if (value is double)
+                  sb.Append(((double)value).ToString(CultureInfo.InvariantCulture) + ';');
+                else
+                  sb.Append(value.ToString() + ';');
+              }
+          } //foreach columngroup
+          sb.Remove(sb.Length - 1, 1);
+          sb.Append(Environment.NewLine);
+          if (i % 100 == 0) {
+            stream.Write(sb.ToString());
+            sb.Remove(0, sb.Length);
+          }
+        } //foreach row
+        stream.Write(sb);
+      }
+      stream.Close();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvExporterView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvExporterView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvExporterView.Designer.cs	(revision 15690)
@@ -0,0 +1,114 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Backend.Csv {
+  partial class CsvExporterView {
+    /// <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.chbIncludeColumnNames = new System.Windows.Forms.CheckBox();
+      this.btnBrowse = new System.Windows.Forms.Button();
+      this.label1 = new System.Windows.Forms.Label();
+      this.txtFileName = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // chbIncludeColumnNames
+      // 
+      this.chbIncludeColumnNames.AutoSize = true;
+      this.chbIncludeColumnNames.Checked = true;
+      this.chbIncludeColumnNames.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.chbIncludeColumnNames.Location = new System.Drawing.Point(54, 30);
+      this.chbIncludeColumnNames.Name = "chbIncludeColumnNames";
+      this.chbIncludeColumnNames.Size = new System.Drawing.Size(133, 17);
+      this.chbIncludeColumnNames.TabIndex = 3;
+      this.chbIncludeColumnNames.Text = "Include Column names";
+      this.chbIncludeColumnNames.UseVisualStyleBackColor = true;
+      // 
+      // btnBrowse
+      // 
+      this.btnBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.btnBrowse.Location = new System.Drawing.Point(323, 3);
+      this.btnBrowse.Name = "btnBrowse";
+      this.btnBrowse.Size = new System.Drawing.Size(75, 23);
+      this.btnBrowse.TabIndex = 17;
+      this.btnBrowse.Text = "Browse";
+      this.btnBrowse.UseVisualStyleBackColor = true;
+      this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(1, 7);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(49, 13);
+      this.label1.TabIndex = 16;
+      this.label1.Text = "Filename";
+      // 
+      // txtFileName
+      // 
+      this.txtFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtFileName.Location = new System.Drawing.Point(54, 4);
+      this.txtFileName.Name = "txtFileName";
+      this.txtFileName.Size = new System.Drawing.Size(263, 20);
+      this.txtFileName.TabIndex = 15;
+      // 
+      // CsvExporterView
+      // 
+      this.Controls.Add(this.btnBrowse);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.txtFileName);
+      this.Controls.Add(this.chbIncludeColumnNames);
+      this.Name = "CsvExporterView";
+      this.Size = new System.Drawing.Size(400, 57);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.CheckBox chbIncludeColumnNames;
+    private System.Windows.Forms.Button btnBrowse;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TextBox txtFileName;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvExporterView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvExporterView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvExporterView.cs	(revision 15690)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Backend.Csv {
+  public partial class CsvExporterView : UserControl {
+    private SaveFileDialog saveFileDialog;
+    public CsvExporterView() {
+      InitializeComponent();
+      this.saveFileDialog = new SaveFileDialog();
+      saveFileDialog.AddExtension = true;
+      saveFileDialog.RestoreDirectory = true;
+      saveFileDialog.DefaultExt = "csv";
+      saveFileDialog.Filter = "Comma-Separated-Values file (*.csv)|*.csv|All files (*.*)|*.*";
+    }
+
+    public string FileName {
+      get { return txtFileName.Text; }
+    }
+
+    public bool IncludeColumnNames {
+      get { return this.chbIncludeColumnNames.Checked; }
+    }
+
+    private void btnBrowse_Click(object sender, EventArgs e) {
+      if (saveFileDialog.ShowDialog() == DialogResult.OK) {
+        this.txtFileName.Text = saveFileDialog.FileName;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvImportCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvImportCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvImportCommand.cs	(revision 15690)
@@ -0,0 +1,97 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.IO;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Backend.Csv {
+  [StorableClass]
+  public class CsvImportCommand : DataSetCommandBase {
+    private ColumnGroup newColumnGroup;
+
+    [StorableConstructor]
+    protected CsvImportCommand(bool deserializing) : base(deserializing) { }
+
+    public CsvImportCommand(DataSet dataSet)
+      : base(dataSet) {
+    }
+
+    [Storable]
+    private string fileName;
+    public string FileName {
+      get { return fileName; }
+      set { this.fileName = value; }
+    }
+
+    [Storable]
+    private char[] delimiter;
+    public char[] Delimiter {
+      get { return this.delimiter; }
+      set { this.delimiter = value; }
+    }
+
+    [Storable]
+    private bool columnNamesInFirstRow;
+    public bool ColumnNamesInFirstRow {
+      get { return this.columnNamesInFirstRow; }
+      set { this.columnNamesInFirstRow = value; }
+    }
+
+    public override string Description {
+      get { return "Import CSV file"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      newColumnGroup = new ColumnGroup(fileName.Substring(fileName.LastIndexOf('\\') + 1));
+      StreamReader reader = new StreamReader(fileName);
+      string firstLine = reader.ReadLine();
+
+      int i = 1;
+      string[] values = firstLine.Split(delimiter);
+      foreach (string value in values) {
+        if (columnNamesInFirstRow)
+          newColumnGroup.AddColumn(new StringColumn(value));
+        else {
+          newColumnGroup.AddColumn(new StringColumn("Column " + i));
+        }
+        i++;
+      }
+      if (!columnNamesInFirstRow)
+        newColumnGroup.AddRow(values);
+      while (!reader.EndOfStream) {
+        newColumnGroup.AddRow(reader.ReadLine().Split(delimiter));
+      }
+      reader.Close();
+      DataSet.AddColumnGroup(newColumnGroup);
+      DataSet.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      DataSet.RemoveColumnGroup(newColumnGroup);
+      newColumnGroup = null;
+      DataSet.FireChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvImporter.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvImporter.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvImporter.cs	(revision 15690)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.DataImporter.DataProcessor;
+
+namespace HeuristicLab.DataImporter.Backend.Csv {
+  public class CsvImporter : IImporter {
+
+    public string Description {
+      get { return "Import CSV file"; }
+    }
+
+    private CsvImporterView view;
+    public System.Windows.Forms.UserControl SettingsControl {
+      get {
+        if (view == null)
+          view = new CsvImporterView();
+        return view;
+      }
+    }
+
+    public ICommand CreateImportCommand(DataSet dataSet) {
+      CsvImportCommand cmd = new CsvImportCommand(dataSet);
+      cmd.FileName = view.FileName;
+      cmd.ColumnNamesInFirstRow = view.ColumnNamesInFirstRow;
+      cmd.Delimiter = view.Delimiter;
+      return cmd;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvImporterView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvImporterView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvImporterView.Designer.cs	(revision 15690)
@@ -0,0 +1,137 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Backend.Csv {
+  partial class CsvImporterView {
+    /// <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.chbIncludeColumnNames = new System.Windows.Forms.CheckBox();
+      this.btnBrowse = new System.Windows.Forms.Button();
+      this.label1 = new System.Windows.Forms.Label();
+      this.txtFileName = new System.Windows.Forms.TextBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.txtDelimiter = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // chbIncludeColumnNames
+      // 
+      this.chbIncludeColumnNames.AutoSize = true;
+      this.chbIncludeColumnNames.Checked = true;
+      this.chbIncludeColumnNames.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.chbIncludeColumnNames.Location = new System.Drawing.Point(54, 56);
+      this.chbIncludeColumnNames.Name = "chbIncludeColumnNames";
+      this.chbIncludeColumnNames.Size = new System.Drawing.Size(151, 17);
+      this.chbIncludeColumnNames.TabIndex = 3;
+      this.chbIncludeColumnNames.Text = "Column names in first row?";
+      this.chbIncludeColumnNames.UseVisualStyleBackColor = true;
+      // 
+      // btnBrowse
+      // 
+      this.btnBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.btnBrowse.Location = new System.Drawing.Point(323, 3);
+      this.btnBrowse.Name = "btnBrowse";
+      this.btnBrowse.Size = new System.Drawing.Size(75, 23);
+      this.btnBrowse.TabIndex = 17;
+      this.btnBrowse.Text = "Browse";
+      this.btnBrowse.UseVisualStyleBackColor = true;
+      this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(1, 7);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(49, 13);
+      this.label1.TabIndex = 16;
+      this.label1.Text = "Filename";
+      // 
+      // txtFileName
+      // 
+      this.txtFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtFileName.Location = new System.Drawing.Point(54, 4);
+      this.txtFileName.Name = "txtFileName";
+      this.txtFileName.Size = new System.Drawing.Size(263, 20);
+      this.txtFileName.TabIndex = 15;
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(1, 33);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(47, 13);
+      this.label2.TabIndex = 21;
+      this.label2.Text = "Delimiter";
+      // 
+      // txtDelimiter
+      // 
+      this.txtDelimiter.Location = new System.Drawing.Point(54, 30);
+      this.txtDelimiter.MaxLength = 1;
+      this.txtDelimiter.Name = "txtDelimiter";
+      this.txtDelimiter.Size = new System.Drawing.Size(66, 20);
+      this.txtDelimiter.TabIndex = 20;
+      // 
+      // CsvImporterView
+      // 
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.txtDelimiter);
+      this.Controls.Add(this.btnBrowse);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.txtFileName);
+      this.Controls.Add(this.chbIncludeColumnNames);
+      this.Name = "CsvImporterView";
+      this.Size = new System.Drawing.Size(400, 83);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.CheckBox chbIncludeColumnNames;
+    private System.Windows.Forms.Button btnBrowse;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TextBox txtFileName;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox txtDelimiter;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvImporterView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvImporterView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/CsvImporterView.cs	(revision 15690)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Backend.Csv {
+  public partial class CsvImporterView : UserControl {
+    private OpenFileDialog openFileDialog;
+    public CsvImporterView() {
+      InitializeComponent();
+      this.openFileDialog = new OpenFileDialog();
+      openFileDialog.AddExtension = true;
+      openFileDialog.RestoreDirectory = true;
+      openFileDialog.DefaultExt = "csv";
+      openFileDialog.Filter = "Comma-Separated-Values file (*.csv)|*.csv|All files (*.*)|*.*";
+      txtDelimiter.Text = ";";
+    }
+
+    public string FileName {
+      get { return txtFileName.Text; }
+    }
+
+    public bool ColumnNamesInFirstRow {
+      get { return this.chbIncludeColumnNames.Checked; }
+    }
+
+    public char[] Delimiter {
+      get { return new char[] { txtDelimiter.Text[0] }; }
+    }
+
+    private void btnBrowse_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog() == DialogResult.OK) {
+        this.txtFileName.Text = openFileDialog.FileName;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/HeuristicLab.DataImporter.Backend.Csv.csproj
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/HeuristicLab.DataImporter.Backend.Csv.csproj	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/HeuristicLab.DataImporter.Backend.Csv.csproj	(revision 15690)
@@ -0,0 +1,192 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F83B3E02-FCAA-46CA-8712-C41B960D19C3}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.DataImporter.Backend.Csv</RootNamespace>
+    <AssemblyName>HeuristicLab.DataImporter.Backend.Csv-1.0</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="CsvImportCommand.cs" />
+    <Compile Include="CsvImporterView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CsvImporterView.Designer.cs">
+      <DependentUpon>CsvImporterView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CsvExporter.cs" />
+    <Compile Include="CsvExporterView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CsvExporterView.Designer.cs">
+      <DependentUpon>CsvExporterView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CsvImporter.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.DataProcessor\HeuristicLab.DataImporter.DataProcessor.csproj">
+      <Project>{D7EE47DB-4D07-4BAC-9E9F-3F0393AEF605}</Project>
+      <Name>HeuristicLab.DataImporter.DataProcessor</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.Data\HeuristicLab.DataImporter.Data.csproj">
+      <Project>{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}</Project>
+      <Name>HeuristicLab.DataImporter.Data</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/Plugin.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/Plugin.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/Plugin.cs.frame	(revision 15690)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.DataImporter.Backend.Csv {
+  [Plugin("HeuristicLab.DataImporter.Backend.Csv","1.0.0.$WCREV$")]
+  [PluginFile("HeuristicLab.DataImporter.Backend.Csv-1.0.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.DataImporter.DataProcessor","1.0")]
+  [PluginDependency("HeuristicLab.Persistence","3.3")]
+  public class HeuristicLabDataImporterBackendCsvPlugin : PluginBase {
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/Properties/AssemblyInfo.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/Properties/AssemblyInfo.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Csv/Properties/AssemblyInfo.cs.frame	(revision 15690)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.DataImporter.Backends.Csv")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(C) 2008-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7d0840b8-3382-4b99-ab4e-5d1eb91fbec1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.$WCREV$")]
+[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat.csproj
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat.csproj	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat.csproj	(revision 15690)
@@ -0,0 +1,193 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{67E69744-D0D3-48C3-8F9D-51EE1A64E3F6}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.DataImporter.Backend.Hl2ImporterFormat</RootNamespace>
+    <AssemblyName>HeuristicLab.DataImporter.Backend.Hl2ImporterFormat-1.0</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLabDataImporterBackendHl2ImporterFormatPlugin.cs.frame" />
+    <Compile Include="Hl2ImporterCommand.cs" />
+    <Compile Include="Hl2ImporterView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Hl2ImporterView.Designer.cs">
+      <DependentUpon>Hl2ImporterView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HeuristicLabDataImporterBackendHl2ImporterFormatPlugin.cs" />
+    <Compile Include="Hl2Exporter.cs" />
+    <Compile Include="Hl2ExporterView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Hl2ExporterView.Designer.cs">
+      <DependentUpon>Hl2ExporterView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Hl2Importer.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.DataProcessor\HeuristicLab.DataImporter.DataProcessor.csproj">
+      <Project>{D7EE47DB-4D07-4BAC-9E9F-3F0393AEF605}</Project>
+      <Name>HeuristicLab.DataImporter.DataProcessor</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.Data\HeuristicLab.DataImporter.Data.csproj">
+      <Project>{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}</Project>
+      <Name>HeuristicLab.DataImporter.Data</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\HeuristicLabDataImporterBackendHl2ImporterFormatPlugin.cs.frame" "%25ProjectDir%25\HeuristicLabDataImporterBackendHl2ImporterFormatPlugin.cs"</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/HeuristicLabDataImporterBackendHl2ImporterFormatPlugin.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/HeuristicLabDataImporterBackendHl2ImporterFormatPlugin.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/HeuristicLabDataImporterBackendHl2ImporterFormatPlugin.cs.frame	(revision 15690)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.DataImporter.Backend.Hl2ImporterFormat {
+  [Plugin("HeuristicLab.DataImporter.Backend.Hl2ImporterFormat","1.0.0.$WCREV$")]
+  [PluginFile("HeuristicLab.DataImporter.Backend.Hl2ImporterFormat-1.0.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.DataImporter.DataProcessor","1.0")]
+  [PluginDependency("HeuristicLab.Persistence","3.3")]
+  public class HeuristicLabDataImporterBackendHl2ImporterFormatPlugin : PluginBase {
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2Exporter.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2Exporter.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2Exporter.cs	(revision 15690)
@@ -0,0 +1,112 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using System.IO;
+using System.Globalization;
+using HeuristicLab.DataImporter.DataProcessor;
+using HeuristicLab.DataImporter.Data.Model;
+
+namespace HeuristicLab.DataImporter.Backend.Hl2ImporterFormat {
+  public class Hl2Exporter : IExporter {
+    public const string METATAG = "@";
+    public const string PROBLEMNAME = "PROBLEMNAME";
+    public const string VARIABLENAMES = "VARIABLENAMES";
+    public const string TARGETVARIABLE = "TARGETVARIABLE";
+    public const string NONINPUTVARIABLES = "NONINPUTVARIABLES";
+    public const string MINIMUMTIMEOFFSET = "MINIMUMTIMEOFFSET";
+    public const string MAXIMUMTIMEOFFSET = "MAXIMUMTIMEOFFSET";
+    public const string MAXIMUMTREEHEIGHT = "MAXIMUMTREEHEIGHT";
+    public const string MAXIMUMTREESIZE = "MAXIMUMTREESIZE";
+    public const string TRAININGSAMPLESSTART = "TRAININGSAMPLESSTART";
+    public const string TRAININGSAMPLESEND = "TRAININGSAMPLESEND";
+    public const string VALIDATIONSAMPLESSTART = "VALIDATIONSAMPLESSTART";
+    public const string VALIDATIONSAMPLESEND = "VALIDATIONSAMPLESEND";
+    public const string TESTSAMPLESSTART = "TESTSAMPLESSTART";
+    public const string TESTSAMPLESEND = "TESTSAMPLESEND";
+
+
+    public string Description {
+      get { return "Export data as HL2 importer file"; }
+    }
+
+    private Hl2ExporterView view;
+    public System.Windows.Forms.UserControl SettingsControl {
+      get {
+        if (view == null)
+          view = new Hl2ExporterView();
+        return view;
+      }
+    }
+
+    public void Export(DataSet dataSet) {
+      StreamWriter stream = new StreamWriter(view.FileName, false);
+      stream.WriteLine(METATAG + PROBLEMNAME + '=' + view.ProblemName);
+      StringBuilder sb = new StringBuilder();
+      foreach (ColumnGroup grp in dataSet.ColumnGroups) {
+        foreach (ColumnBase col in grp.Columns)
+          sb.Append(col.Name + ';');
+      }
+      sb = sb.Remove(sb.Length - 1, 1);  //remove last ';'
+      stream.WriteLine(METATAG + VARIABLENAMES + '=' + sb.ToString());
+      sb = sb.Remove(0, sb.Length);
+      stream.WriteLine(METATAG + TARGETVARIABLE + '=' + view.TargetVariable);
+      stream.WriteLine(METATAG + NONINPUTVARIABLES + '=' + view.NonInputVariables);
+      stream.WriteLine(METATAG + MINIMUMTIMEOFFSET + '=' + view.MinimumTimeOffset);
+      stream.WriteLine(METATAG + MAXIMUMTIMEOFFSET + '=' + view.MaximumTimeOffset);
+      stream.WriteLine(METATAG + MAXIMUMTREEHEIGHT + '=' + view.MaximumTreeHeight);
+      stream.WriteLine(METATAG + MAXIMUMTREESIZE + '=' + view.MaximumTreeSize);
+      stream.WriteLine(METATAG + TRAININGSAMPLESSTART + '=' + view.TrainingStart);
+      stream.WriteLine(METATAG + TRAININGSAMPLESEND + '=' + view.TrainingEnd);
+      stream.WriteLine(METATAG + VALIDATIONSAMPLESSTART + '=' + view.ValidationStart);
+      stream.WriteLine(METATAG + VALIDATIONSAMPLESEND + '=' + view.ValidationEnd);
+      stream.WriteLine(METATAG + TESTSAMPLESSTART + '=' + view.TestStart);
+      stream.WriteLine(METATAG + TESTSAMPLESEND + '=' + view.TestEnd);
+
+      for (int i = 0; i < dataSet.ColumnGroups.Max(x => x.RowCount); i++) {
+        foreach (ColumnGroup grp in dataSet.ColumnGroups) {
+          foreach (ColumnBase col in grp.Columns) {
+            if (col.GetValue(i) == null)
+              sb.Append(';');
+            else if (col.DataType == typeof(double?))
+              sb.Append(((double)col.GetValue(i)).ToString("r", CultureInfo.InvariantCulture.NumberFormat) + ';');
+            else if (col.DataType == typeof(DateTime?))
+              sb.Append(((DateTime)col.GetValue(i)).ToString(CultureInfo.InvariantCulture.DateTimeFormat) + ';');
+            else
+              sb.Append(col.GetValue(i).ToString() + ';');
+          }
+        } //foreach columngroup
+        sb = sb.Remove(sb.Length - 1, 1);
+        sb.Append(Environment.NewLine);
+        if (i % 100 == 0) {
+          stream.Write(sb.ToString());
+          sb.Remove(0, sb.Length);
+        }
+      } //foreach row
+      stream.Write(sb);
+      stream.Close();
+    }
+
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ExporterView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ExporterView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ExporterView.Designer.cs	(revision 15690)
@@ -0,0 +1,421 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Backend.Hl2ImporterFormat {
+  partial class Hl2ExporterView {
+    /// <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.txtProblemName = new System.Windows.Forms.TextBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.label3 = new System.Windows.Forms.Label();
+      this.label4 = new System.Windows.Forms.Label();
+      this.txtNonInputVariables = new System.Windows.Forms.TextBox();
+      this.txtMinimumTimeOffset = new System.Windows.Forms.TextBox();
+      this.label5 = new System.Windows.Forms.Label();
+      this.label6 = new System.Windows.Forms.Label();
+      this.label7 = new System.Windows.Forms.Label();
+      this.label8 = new System.Windows.Forms.Label();
+      this.txtMaximumTimeOffset = new System.Windows.Forms.TextBox();
+      this.txtMaximumTreeHeight = new System.Windows.Forms.TextBox();
+      this.txtMaximumTreeSize = new System.Windows.Forms.TextBox();
+      this.label9 = new System.Windows.Forms.Label();
+      this.label10 = new System.Windows.Forms.Label();
+      this.label11 = new System.Windows.Forms.Label();
+      this.txtTrainingStart = new System.Windows.Forms.TextBox();
+      this.txtTrainingEnd = new System.Windows.Forms.TextBox();
+      this.txtValidationEnd = new System.Windows.Forms.TextBox();
+      this.txtValidationStart = new System.Windows.Forms.TextBox();
+      this.label12 = new System.Windows.Forms.Label();
+      this.label13 = new System.Windows.Forms.Label();
+      this.label14 = new System.Windows.Forms.Label();
+      this.txtTestEnd = new System.Windows.Forms.TextBox();
+      this.txtTestStart = new System.Windows.Forms.TextBox();
+      this.label15 = new System.Windows.Forms.Label();
+      this.label16 = new System.Windows.Forms.Label();
+      this.label17 = new System.Windows.Forms.Label();
+      this.btnBrowse = new System.Windows.Forms.Button();
+      this.label1 = new System.Windows.Forms.Label();
+      this.txtFileName = new System.Windows.Forms.TextBox();
+      this.txtTargetVariable = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // txtProblemName
+      // 
+      this.txtProblemName.Location = new System.Drawing.Point(177, 30);
+      this.txtProblemName.Name = "txtProblemName";
+      this.txtProblemName.Size = new System.Drawing.Size(140, 20);
+      this.txtProblemName.TabIndex = 1;
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(51, 33);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(71, 13);
+      this.label2.TabIndex = 4;
+      this.label2.Text = "Problemname";
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(51, 58);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(79, 13);
+      this.label3.TabIndex = 5;
+      this.label3.Text = "Target Variable";
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(51, 84);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(100, 13);
+      this.label4.TabIndex = 7;
+      this.label4.Text = "Non-Input Variables";
+      // 
+      // txtNonInputVariables
+      // 
+      this.txtNonInputVariables.Location = new System.Drawing.Point(177, 81);
+      this.txtNonInputVariables.Name = "txtNonInputVariables";
+      this.txtNonInputVariables.Size = new System.Drawing.Size(140, 20);
+      this.txtNonInputVariables.TabIndex = 3;
+      // 
+      // txtMinimumTimeOffset
+      // 
+      this.txtMinimumTimeOffset.Location = new System.Drawing.Point(177, 106);
+      this.txtMinimumTimeOffset.Name = "txtMinimumTimeOffset";
+      this.txtMinimumTimeOffset.Size = new System.Drawing.Size(140, 20);
+      this.txtMinimumTimeOffset.TabIndex = 4;
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(51, 109);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(105, 13);
+      this.label5.TabIndex = 10;
+      this.label5.Text = "Minimum Time Offset";
+      // 
+      // label6
+      // 
+      this.label6.AutoSize = true;
+      this.label6.Location = new System.Drawing.Point(51, 134);
+      this.label6.Name = "label6";
+      this.label6.Size = new System.Drawing.Size(108, 13);
+      this.label6.TabIndex = 11;
+      this.label6.Text = "Maximum Time Offset";
+      // 
+      // label7
+      // 
+      this.label7.AutoSize = true;
+      this.label7.Location = new System.Drawing.Point(51, 159);
+      this.label7.Name = "label7";
+      this.label7.Size = new System.Drawing.Size(110, 13);
+      this.label7.TabIndex = 12;
+      this.label7.Text = "Maximum Tree Height";
+      // 
+      // label8
+      // 
+      this.label8.AutoSize = true;
+      this.label8.Location = new System.Drawing.Point(51, 184);
+      this.label8.Name = "label8";
+      this.label8.Size = new System.Drawing.Size(99, 13);
+      this.label8.TabIndex = 13;
+      this.label8.Text = "Maximum Tree Size";
+      // 
+      // txtMaximumTimeOffset
+      // 
+      this.txtMaximumTimeOffset.Location = new System.Drawing.Point(177, 131);
+      this.txtMaximumTimeOffset.Name = "txtMaximumTimeOffset";
+      this.txtMaximumTimeOffset.Size = new System.Drawing.Size(140, 20);
+      this.txtMaximumTimeOffset.TabIndex = 5;
+      // 
+      // txtMaximumTreeHeight
+      // 
+      this.txtMaximumTreeHeight.Location = new System.Drawing.Point(177, 156);
+      this.txtMaximumTreeHeight.Name = "txtMaximumTreeHeight";
+      this.txtMaximumTreeHeight.Size = new System.Drawing.Size(140, 20);
+      this.txtMaximumTreeHeight.TabIndex = 6;
+      // 
+      // txtMaximumTreeSize
+      // 
+      this.txtMaximumTreeSize.Location = new System.Drawing.Point(177, 181);
+      this.txtMaximumTreeSize.Name = "txtMaximumTreeSize";
+      this.txtMaximumTreeSize.Size = new System.Drawing.Size(140, 20);
+      this.txtMaximumTreeSize.TabIndex = 7;
+      // 
+      // label9
+      // 
+      this.label9.AutoSize = true;
+      this.label9.Location = new System.Drawing.Point(51, 209);
+      this.label9.Name = "label9";
+      this.label9.Size = new System.Drawing.Size(45, 13);
+      this.label9.TabIndex = 14;
+      this.label9.Text = "Training";
+      // 
+      // label10
+      // 
+      this.label10.AutoSize = true;
+      this.label10.Location = new System.Drawing.Point(130, 210);
+      this.label10.Name = "label10";
+      this.label10.Size = new System.Drawing.Size(29, 13);
+      this.label10.TabIndex = 15;
+      this.label10.Text = "Start";
+      // 
+      // label11
+      // 
+      this.label11.AutoSize = true;
+      this.label11.Location = new System.Drawing.Point(241, 210);
+      this.label11.Name = "label11";
+      this.label11.Size = new System.Drawing.Size(26, 13);
+      this.label11.TabIndex = 16;
+      this.label11.Text = "End";
+      // 
+      // txtTrainingStart
+      // 
+      this.txtTrainingStart.Location = new System.Drawing.Point(177, 207);
+      this.txtTrainingStart.Name = "txtTrainingStart";
+      this.txtTrainingStart.Size = new System.Drawing.Size(44, 20);
+      this.txtTrainingStart.TabIndex = 8;
+      // 
+      // txtTrainingEnd
+      // 
+      this.txtTrainingEnd.Location = new System.Drawing.Point(273, 207);
+      this.txtTrainingEnd.Name = "txtTrainingEnd";
+      this.txtTrainingEnd.Size = new System.Drawing.Size(44, 20);
+      this.txtTrainingEnd.TabIndex = 9;
+      // 
+      // txtValidationEnd
+      // 
+      this.txtValidationEnd.Location = new System.Drawing.Point(273, 233);
+      this.txtValidationEnd.Name = "txtValidationEnd";
+      this.txtValidationEnd.Size = new System.Drawing.Size(44, 20);
+      this.txtValidationEnd.TabIndex = 11;
+      // 
+      // txtValidationStart
+      // 
+      this.txtValidationStart.Location = new System.Drawing.Point(177, 233);
+      this.txtValidationStart.Name = "txtValidationStart";
+      this.txtValidationStart.Size = new System.Drawing.Size(44, 20);
+      this.txtValidationStart.TabIndex = 10;
+      // 
+      // label12
+      // 
+      this.label12.AutoSize = true;
+      this.label12.Location = new System.Drawing.Point(241, 236);
+      this.label12.Name = "label12";
+      this.label12.Size = new System.Drawing.Size(26, 13);
+      this.label12.TabIndex = 24;
+      this.label12.Text = "End";
+      // 
+      // label13
+      // 
+      this.label13.AutoSize = true;
+      this.label13.Location = new System.Drawing.Point(130, 236);
+      this.label13.Name = "label13";
+      this.label13.Size = new System.Drawing.Size(29, 13);
+      this.label13.TabIndex = 23;
+      this.label13.Text = "Start";
+      // 
+      // label14
+      // 
+      this.label14.AutoSize = true;
+      this.label14.Location = new System.Drawing.Point(51, 235);
+      this.label14.Name = "label14";
+      this.label14.Size = new System.Drawing.Size(53, 13);
+      this.label14.TabIndex = 22;
+      this.label14.Text = "Validation";
+      // 
+      // txtTestEnd
+      // 
+      this.txtTestEnd.Location = new System.Drawing.Point(273, 259);
+      this.txtTestEnd.Name = "txtTestEnd";
+      this.txtTestEnd.Size = new System.Drawing.Size(44, 20);
+      this.txtTestEnd.TabIndex = 13;
+      // 
+      // txtTestStart
+      // 
+      this.txtTestStart.Location = new System.Drawing.Point(177, 259);
+      this.txtTestStart.Name = "txtTestStart";
+      this.txtTestStart.Size = new System.Drawing.Size(44, 20);
+      this.txtTestStart.TabIndex = 12;
+      // 
+      // label15
+      // 
+      this.label15.AutoSize = true;
+      this.label15.Location = new System.Drawing.Point(241, 262);
+      this.label15.Name = "label15";
+      this.label15.Size = new System.Drawing.Size(26, 13);
+      this.label15.TabIndex = 29;
+      this.label15.Text = "End";
+      // 
+      // label16
+      // 
+      this.label16.AutoSize = true;
+      this.label16.Location = new System.Drawing.Point(130, 262);
+      this.label16.Name = "label16";
+      this.label16.Size = new System.Drawing.Size(29, 13);
+      this.label16.TabIndex = 28;
+      this.label16.Text = "Start";
+      // 
+      // label17
+      // 
+      this.label17.AutoSize = true;
+      this.label17.Location = new System.Drawing.Point(51, 261);
+      this.label17.Name = "label17";
+      this.label17.Size = new System.Drawing.Size(28, 13);
+      this.label17.TabIndex = 27;
+      this.label17.Text = "Test";
+      // 
+      // btnBrowse
+      // 
+      this.btnBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.btnBrowse.Location = new System.Drawing.Point(323, 3);
+      this.btnBrowse.Name = "btnBrowse";
+      this.btnBrowse.Size = new System.Drawing.Size(75, 23);
+      this.btnBrowse.TabIndex = 14;
+      this.btnBrowse.Text = "Browse";
+      this.btnBrowse.UseVisualStyleBackColor = true;
+      this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(1, 7);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(49, 13);
+      this.label1.TabIndex = 2;
+      this.label1.Text = "Filename";
+      // 
+      // txtFileName
+      // 
+      this.txtFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtFileName.Location = new System.Drawing.Point(54, 4);
+      this.txtFileName.Name = "txtFileName";
+      this.txtFileName.Size = new System.Drawing.Size(263, 20);
+      this.txtFileName.TabIndex = 0;
+      // 
+      // txtTargetVariable
+      // 
+      this.txtTargetVariable.Location = new System.Drawing.Point(177, 55);
+      this.txtTargetVariable.Name = "txtTargetVariable";
+      this.txtTargetVariable.Size = new System.Drawing.Size(140, 20);
+      this.txtTargetVariable.TabIndex = 2;
+      // 
+      // Hl2ExporterView
+      // 
+      this.Controls.Add(this.txtTargetVariable);
+      this.Controls.Add(this.btnBrowse);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.txtFileName);
+      this.Controls.Add(this.txtTestEnd);
+      this.Controls.Add(this.txtTestStart);
+      this.Controls.Add(this.label15);
+      this.Controls.Add(this.label16);
+      this.Controls.Add(this.label17);
+      this.Controls.Add(this.txtValidationEnd);
+      this.Controls.Add(this.txtValidationStart);
+      this.Controls.Add(this.label12);
+      this.Controls.Add(this.label13);
+      this.Controls.Add(this.label14);
+      this.Controls.Add(this.txtTrainingEnd);
+      this.Controls.Add(this.txtTrainingStart);
+      this.Controls.Add(this.txtMaximumTreeSize);
+      this.Controls.Add(this.txtMaximumTreeHeight);
+      this.Controls.Add(this.txtMaximumTimeOffset);
+      this.Controls.Add(this.label11);
+      this.Controls.Add(this.label10);
+      this.Controls.Add(this.label9);
+      this.Controls.Add(this.label8);
+      this.Controls.Add(this.label7);
+      this.Controls.Add(this.label6);
+      this.Controls.Add(this.label5);
+      this.Controls.Add(this.txtMinimumTimeOffset);
+      this.Controls.Add(this.txtNonInputVariables);
+      this.Controls.Add(this.txtProblemName);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label3);
+      this.Controls.Add(this.label4);
+      this.Name = "Hl2ExporterView";
+      this.Size = new System.Drawing.Size(401, 293);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox txtProblemName;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.TextBox txtNonInputVariables;
+    private System.Windows.Forms.TextBox txtMinimumTimeOffset;
+    private System.Windows.Forms.Label label5;
+    private System.Windows.Forms.Label label6;
+    private System.Windows.Forms.Label label7;
+    private System.Windows.Forms.Label label8;
+    private System.Windows.Forms.TextBox txtMaximumTimeOffset;
+    private System.Windows.Forms.TextBox txtMaximumTreeHeight;
+    private System.Windows.Forms.TextBox txtMaximumTreeSize;
+    private System.Windows.Forms.Label label9;
+    private System.Windows.Forms.Label label10;
+    private System.Windows.Forms.Label label11;
+    private System.Windows.Forms.TextBox txtTrainingStart;
+    private System.Windows.Forms.TextBox txtTrainingEnd;
+    private System.Windows.Forms.TextBox txtValidationEnd;
+    private System.Windows.Forms.TextBox txtValidationStart;
+    private System.Windows.Forms.Label label12;
+    private System.Windows.Forms.Label label13;
+    private System.Windows.Forms.Label label14;
+    private System.Windows.Forms.TextBox txtTestEnd;
+    private System.Windows.Forms.TextBox txtTestStart;
+    private System.Windows.Forms.Label label15;
+    private System.Windows.Forms.Label label16;
+    private System.Windows.Forms.Label label17;
+    private System.Windows.Forms.Button btnBrowse;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TextBox txtFileName;
+    private System.Windows.Forms.TextBox txtTargetVariable;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ExporterView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ExporterView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ExporterView.cs	(revision 15690)
@@ -0,0 +1,105 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Backend.Hl2ImporterFormat {
+  public partial class Hl2ExporterView  : UserControl  {
+    private SaveFileDialog saveFileDialog;
+    public Hl2ExporterView() {
+      InitializeComponent();
+      this.saveFileDialog = new SaveFileDialog();
+      saveFileDialog.AddExtension = true;
+      saveFileDialog.RestoreDirectory = true;
+      saveFileDialog.DefaultExt = "hl2";
+      saveFileDialog.Filter = "HL2-Importer file (*.hl2)|*.hl2|All files (*.*)|*.*";
+    }
+
+    public string FileName {
+      get { return txtFileName.Text; }
+    }
+
+    public string ProblemName {
+      get { return txtProblemName.Text; }
+    }
+
+    public string TargetVariable {
+      get { return txtTargetVariable.Text; }
+    }
+
+    public string NonInputVariables {
+      get { return txtNonInputVariables.Text; }
+    }
+
+    public string MinimumTimeOffset {
+      get { return txtMinimumTimeOffset.Text; }
+    }
+
+    public string MaximumTimeOffset {
+      get { return txtMaximumTimeOffset.Text; }
+    }
+
+    public string MaximumTreeHeight {
+      get { return txtMaximumTreeHeight.Text; }
+    }
+
+    public string MaximumTreeSize {
+      get { return txtMaximumTreeSize.Text; }
+    }
+
+    public string TrainingStart {
+      get { return txtTrainingStart.Text; }
+    }
+
+    public string TrainingEnd {
+      get { return txtTrainingEnd.Text; }
+    }
+
+    public string ValidationStart {
+      get { return txtValidationStart.Text; }
+    }
+
+    public string ValidationEnd {
+      get { return txtValidationEnd.Text; }
+    }
+
+    public string TestStart {
+      get { return txtTestStart.Text; }
+    }
+
+    public string TestEnd {
+      get { return txtTestEnd.Text; }
+    }
+
+    private void btnBrowse_Click(object sender, EventArgs e) {
+      if (saveFileDialog.ShowDialog() == DialogResult.OK) {
+        this.txtFileName.Text = saveFileDialog.FileName;
+      }
+    }
+
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2Importer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2Importer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2Importer.cs	(revision 15690)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.DataImporter.DataProcessor;
+
+namespace HeuristicLab.DataImporter.Backend.Hl2ImporterFormat {
+  public class Hl2Importer : IImporter {
+
+    public string Description {
+      get { return "Import HL2 file"; }
+    }
+
+    Hl2ImporterView view;
+    public System.Windows.Forms.UserControl SettingsControl {
+      get {
+        if (view == null)
+          view = new Hl2ImporterView();
+        return view;
+      }
+    }
+
+    public ICommand CreateImportCommand(DataSet dataSet) {
+      Hl2ImporterCommand cmd = new Hl2ImporterCommand(dataSet);
+      cmd.FileName = view.FileName;
+      return cmd;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ImporterCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ImporterCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ImporterCommand.cs	(revision 15690)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.IO;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Backend.Hl2ImporterFormat {
+  [StorableClass]
+  public class Hl2ImporterCommand : DataSetCommandBase {
+    private ColumnGroup newColumnGroup;
+
+    [StorableConstructor]
+    protected Hl2ImporterCommand(bool deserializing) : base(deserializing) { }
+
+    public Hl2ImporterCommand(DataSet dataSet)
+      : base(dataSet) {
+    }
+
+    public override string Description {
+      get { return "Import HL2 file"; }
+    }
+
+    [Storable]
+    private string fileName;
+    public string FileName {
+      get { return fileName; }
+      set { this.fileName = value; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      newColumnGroup = new ColumnGroup(fileName.Substring(fileName.LastIndexOf('\\') + 1));
+      StreamReader reader = new StreamReader(fileName);
+      string firstLine = reader.ReadLine();
+      string[] variableNames = new string[0];
+
+      //skip meta information && extract variable/column names
+      while (firstLine.Trim()[0] == Hl2Exporter.METATAG[0]) {
+        if (firstLine.Contains(Hl2Exporter.VARIABLENAMES)) {
+          firstLine = firstLine.Replace(Hl2Exporter.METATAG + Hl2Exporter.VARIABLENAMES + "=", "");
+          variableNames = firstLine.Split(new char[] { ';' });
+        }
+        firstLine = reader.ReadLine();
+      }
+      string[] values = firstLine.Split(new char[] { ';' });
+      for (int i = 0; i < values.Length; i++) {
+        if (i < variableNames.Length)
+          newColumnGroup.AddColumn(new StringColumn(variableNames[i]));
+        else
+          newColumnGroup.AddColumn(new StringColumn("Column " + i));
+      }
+
+      while (!reader.EndOfStream) {
+        newColumnGroup.AddRow(reader.ReadLine().Split(new char[] { ';' }));
+      }
+      reader.Close();
+      DataSet.AddColumnGroup(newColumnGroup);
+      DataSet.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      DataSet.RemoveColumnGroup(newColumnGroup);
+      newColumnGroup = null;
+      DataSet.FireChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ImporterView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ImporterView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ImporterView.Designer.cs	(revision 15690)
@@ -0,0 +1,99 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Backend.Hl2ImporterFormat {
+  partial class Hl2ImporterView {
+    /// <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.btnBrowse = new System.Windows.Forms.Button();
+      this.label1 = new System.Windows.Forms.Label();
+      this.txtFileName = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // btnBrowse
+      // 
+      this.btnBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.btnBrowse.Location = new System.Drawing.Point(323, 3);
+      this.btnBrowse.Name = "btnBrowse";
+      this.btnBrowse.Size = new System.Drawing.Size(75, 23);
+      this.btnBrowse.TabIndex = 17;
+      this.btnBrowse.Text = "Browse";
+      this.btnBrowse.UseVisualStyleBackColor = true;
+      this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(1, 7);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(49, 13);
+      this.label1.TabIndex = 16;
+      this.label1.Text = "Filename";
+      // 
+      // txtFileName
+      // 
+      this.txtFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtFileName.Location = new System.Drawing.Point(54, 4);
+      this.txtFileName.Name = "txtFileName";
+      this.txtFileName.Size = new System.Drawing.Size(263, 20);
+      this.txtFileName.TabIndex = 15;
+      // 
+      // Hl2ImporterView
+      // 
+      this.Controls.Add(this.btnBrowse);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.txtFileName);
+      this.Name = "Hl2ImporterView";
+      this.Size = new System.Drawing.Size(400, 32);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button btnBrowse;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TextBox txtFileName;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ImporterView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ImporterView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Hl2ImporterView.cs	(revision 15690)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Backend.Hl2ImporterFormat {
+  public partial class Hl2ImporterView : UserControl {
+    private OpenFileDialog openFileDialog;
+    public Hl2ImporterView() {
+      InitializeComponent();
+      this.openFileDialog = new OpenFileDialog();
+      openFileDialog.AddExtension = true;
+      openFileDialog.RestoreDirectory = true;
+      openFileDialog.DefaultExt = "hl2";
+      openFileDialog.Filter = "HL2-Importer file (*.hl2)|*.hl2|All files (*.*)|*.*";
+    }
+
+    public string FileName {
+      get { return txtFileName.Text; }
+    }
+
+    private void btnBrowse_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog() == DialogResult.OK) {
+        this.txtFileName.Text = openFileDialog.FileName;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Properties/AssemblyInfo.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Properties/AssemblyInfo.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Backend.Hl2ImporterFormat/Properties/AssemblyInfo.cs.frame	(revision 15690)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.DataImporter.Backends.Hl2ImporterFormat")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(C) 2008-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7d0840b8-3382-4b99-ab4e-5d1eb91fbec1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.$WCREV$")]
+[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateCommandBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateCommandBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateCommandBase.cs	(revision 15690)
@@ -0,0 +1,130 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  public abstract class AggregateCommandBase : ColumnGroupCommandWithAffectedColumnsBase {
+    [StorableConstructor]
+    protected AggregateCommandBase(bool deserializing)
+      : base(deserializing) {
+      oldColumns = new List<ColumnBase>();
+      newColumns = new List<ColumnBase>();
+      positions = new List<int>();
+    }
+
+    protected AggregateCommandBase(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+      oldColumns = new List<ColumnBase>();
+      newColumns = new List<ColumnBase>();
+      positions = new List<int>();
+      changeNullValuesOnly = true;
+    }
+
+    private List<ColumnBase> oldColumns;
+    protected List<ColumnBase> OldColumns {
+      get { return this.oldColumns; }
+    }
+
+    private List<ColumnBase> newColumns;
+    protected List<ColumnBase> NewColumns {
+      get { return this.newColumns; }
+    }
+
+    private List<int> positions;
+    protected List<int> Positions {
+      get { return this.positions; }
+    }
+
+    [Storable]
+    private bool changeNullValuesOnly;
+    public bool ChangeNullValueOnly {
+      get { return this.changeNullValuesOnly; }
+      set { this.changeNullValuesOnly = value; }
+    }
+
+    protected abstract IComparable AggregationFunction(ColumnBase col, int startIndex, int endIndex);
+
+    public override void Execute() {
+      base.Execute();
+      if (!ColumnGroup.Columns.Any()) return;
+      if (!ColumnGroup.Sorted)
+        throw new CommandExecutionException("ColumnGroup must be sorted to use aggregation commands.", this);
+      ColumnBase col;
+      for (int i = 0; i < AffectedColumns.Length; i++) {
+        col = ColumnGroup.Columns.ElementAt(AffectedColumns[i]);
+        if (col.DataType == typeof(double?) && !ColumnGroup.SortedColumnIndexes.Contains(AffectedColumns[i])) {
+          OldColumns.Add(col);
+          NewColumns.Add(col.CreateCopyOfColumnWithoutValues());
+          Positions.Add(AffectedColumns[i]);
+        }
+      }
+      IComparable keyValue = ColumnGroup.KeyString(0);
+      IComparable aggregatedValue;
+      int startIndex = 0;
+      int endIndex = -1;
+      for (int i = 1; i <= ColumnGroup.RowCount; i++) {
+        if (i == ColumnGroup.RowCount || keyValue.CompareTo(ColumnGroup.KeyString(i)) != 0) {
+          endIndex = i;
+          for (int colIndex = 0; colIndex < OldColumns.Count; colIndex++) {
+            aggregatedValue = AggregationFunction(OldColumns[colIndex], startIndex, endIndex);
+            //add aggregatedValue for each row with the same keyColumnValue
+            for (int j = startIndex; j < endIndex; j++) {
+              if (!changeNullValuesOnly || OldColumns[colIndex].GetValue(j) == null)
+                NewColumns[colIndex].AddValue(aggregatedValue);
+              else
+                NewColumns[colIndex].AddValue(OldColumns[colIndex].GetValue(j));
+            }
+          }
+          if (i != ColumnGroup.RowCount) {
+            startIndex = i;
+            keyValue = ColumnGroup.KeyString(i);
+          }
+        }
+      }
+
+      for (int i = 0; i < Positions.Count; i++) {
+        ColumnGroup.ReplaceColumn(Positions[i], NewColumns[i]);
+        OldColumns[i].Selected = false;
+      }
+      NewColumns.Clear();
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      for (int i = 0; i < Positions.Count; i++) {
+        ColumnGroup.ReplaceColumn(Positions[i], OldColumns[i]);
+      }
+      OldColumns.Clear();
+      Positions.Clear();
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithMaxCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithMaxCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithMaxCommand.cs	(revision 15690)
@@ -0,0 +1,58 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Maximum", 1, ColumnGroupState.DoubleColumnSelected | ColumnGroupState.AnySelectedColumnNotSorted
+    , "Aggregation", Position = 4, OptionsView = typeof(AggregationCommandView))]
+  public class AggregateWithMaxCommand : AggregateCommandBase {
+    [StorableConstructor]
+    protected AggregateWithMaxCommand(bool deserializing) : base(deserializing) { }
+
+    public AggregateWithMaxCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override string Description {
+      get { return "Aggregate with max function"; }
+    }
+
+    protected override IComparable AggregationFunction(ColumnBase col, int startIndex, int endIndex) {
+      IComparable maxValue = null;
+      IComparable val;
+      for (int i = startIndex; i < endIndex; i++) {
+        val = col.GetValue(i);
+        if (val != null) {
+          if (maxValue == null || val.CompareTo(maxValue) > 0)
+            maxValue = val;
+        }
+      }
+      return maxValue;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithMeanCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithMeanCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithMeanCommand.cs	(revision 15690)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Mean", 1, ColumnGroupState.DoubleColumnSelected | ColumnGroupState.AnySelectedColumnNotSorted,
+    "Aggregation", Position = 0, OptionsView = typeof(AggregationCommandView))]
+  public class AggregateWithMeanCommand : AggregateCommandBase {
+    [StorableConstructor]
+    protected AggregateWithMeanCommand(bool deserializing) : base(deserializing) { }
+
+    public AggregateWithMeanCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override string Description {
+      get { return "Aggregate with mean function"; }
+    }
+
+    protected override IComparable AggregationFunction(ColumnBase col, int startIndex, int endIndex) {
+      double value = 0;
+      IComparable val;
+      int cnt = 0;
+      for (int i = startIndex; i < endIndex; i++) {
+        val = col.GetValue(i);
+        if (val != null) {
+          value += (double)val;
+          cnt++;
+        }
+      }
+      return cnt != 0 ? value / cnt : (double?)null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithMedianCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithMedianCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithMedianCommand.cs	(revision 15690)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Median", 1, ColumnGroupState.DoubleColumnSelected | ColumnGroupState.AnySelectedColumnNotSorted,
+   "Aggregation", Position = 1, OptionsView = typeof(AggregationCommandView))]
+  public class AggregateWithMedianCommand : AggregateCommandBase {
+    [StorableConstructor]
+    protected AggregateWithMedianCommand(bool deserializing) : base(deserializing) { }
+
+    public AggregateWithMedianCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override string Description {
+      get { return "Aggregate with median function"; }
+    }
+
+    protected override IComparable AggregationFunction(ColumnBase col, int startIndex, int endIndex) {
+      if (col is DoubleColumn)
+        return ((DoubleColumn)col).GetMedian(startIndex, endIndex);
+      else
+        return null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithMinCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithMinCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithMinCommand.cs	(revision 15690)
@@ -0,0 +1,58 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Minimum", 1, ColumnGroupState.DoubleColumnSelected | ColumnGroupState.AnySelectedColumnNotSorted,
+   "Aggregation", Position = 3, OptionsView = typeof(AggregationCommandView))]
+  public class AggregateWithMinCommand : AggregateCommandBase {
+    [StorableConstructor]
+    protected AggregateWithMinCommand(bool deserializing) : base(deserializing) { }
+
+    public AggregateWithMinCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override string Description {
+      get { return "Aggregate with min function"; }
+    }
+
+    protected override IComparable AggregationFunction(ColumnBase col, int startIndex, int endIndex) {
+      IComparable minValue = null;
+      IComparable val;
+      for (int i = startIndex; i < endIndex; i++) {
+        val = col.GetValue(i);
+        if (val != null) {
+          if (minValue == null || val.CompareTo(minValue) < 0)
+            minValue = val;
+        }
+      }
+      return minValue;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithSumCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithSumCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/AggregateWithSumCommand.cs	(revision 15690)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Sum", 1, ColumnGroupState.DoubleColumnSelected | ColumnGroupState.AnySelectedColumnNotSorted,
+   "Aggregation", Position = 2, OptionsView = typeof(AggregationCommandView))]
+  public class AggregateWithSumCommand : AggregateCommandBase {
+    [StorableConstructor]
+    protected AggregateWithSumCommand(bool deserializing) : base(deserializing) { }
+
+    public AggregateWithSumCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override string Description {
+      get { return "Aggregate with sum function"; }
+    }
+
+    protected override IComparable AggregationFunction(ColumnBase col, int startIndex, int endIndex) {
+      double value = 0;
+      bool allNull = true;
+      IComparable val;
+      for (int i = startIndex; i < endIndex; i++) {
+        val = col.GetValue(i);
+        if (val != null) {
+          allNull = false;
+          value += (double)val;
+        }
+      }
+      return allNull ? (double?)null : value;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/DeleteRowsWithDuplicateKeyValuesCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/DeleteRowsWithDuplicateKeyValuesCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Aggregation/DeleteRowsWithDuplicateKeyValuesCommand.cs	(revision 15690)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Delete Rows", 1, ColumnGroupState.Sorted, "Aggregation", Position = 5)]
+  public class DeleteRowsWithDuplicateKeyValuesCommand : ColumnGroupCommandBase {
+    private Dictionary<int, IComparable[]> deletedRows;
+    [StorableConstructor]
+    protected DeleteRowsWithDuplicateKeyValuesCommand(bool deserializing)
+      : base(deserializing) {
+      deletedRows = new Dictionary<int, IComparable[]>();
+    }
+
+    public DeleteRowsWithDuplicateKeyValuesCommand(DataSet dataSet, string columnGroupName)
+      : base(dataSet, columnGroupName) {
+      deletedRows = new Dictionary<int, IComparable[]>();
+    }
+
+    public override string Description {
+      get { return "Delete rows with duplicate key values"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      if (!ColumnGroup.Columns.Any()) return;
+      if (!ColumnGroup.Sorted)
+        throw new CommandExecutionException("ColumnGroup must be sorted to delete rows with duplicate key.", this);
+
+      for (int i = 0; i < ColumnGroup.RowCount - 1; i++) {
+        if (ColumnGroup.KeyString(i) == ColumnGroup.KeyString(i + 1))
+          deletedRows[i + 1] = ColumnGroup.GetRow(i + 1);
+      }
+
+      foreach (int i in deletedRows.Keys.Reverse())
+        ColumnGroup.DeleteRow(i);
+
+      ColumnGroup.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      foreach (KeyValuePair<int, IComparable[]> deletedRow in deletedRows)
+        ColumnGroup.InsertRow(deletedRow.Key, deletedRow.Value);
+      deletedRows.Clear();
+      ColumnGroup.FireChanged();
+
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewColumnCommandBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewColumnCommandBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewColumnCommandBase.cs	(revision 15690)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Linq;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  public abstract class AddNewColumnCommandBase : ColumnGroupCommandBase {
+    [StorableConstructor]
+    protected AddNewColumnCommandBase(bool deserializing) : base(deserializing) { }
+
+    protected AddNewColumnCommandBase(DataSet dataSet, string columnGroupName, string columnName, Type columnType)
+      : base(dataSet, columnGroupName) {
+      this.ColumnName = columnName;
+      if (!columnType.IsSubclassOf(typeof(ColumnBase)) || columnType == null)
+        throw new CommandExecutionException("Added Column must be a subtype of ColumnBase", this);
+      this.ColumnType = columnType;
+    }
+
+    private ColumnBase newColumn;
+    protected ColumnBase NewColumn {
+      get { return this.newColumn; }
+      set { this.newColumn = value; }
+    }
+
+    [Storable]
+    private int columnIndex = -1;
+    protected int ColumnIndex {
+      get { return this.columnIndex; }
+      set { this.columnIndex = value; }
+    }
+
+    [Storable]
+    private string columnName;
+    protected string ColumnName {
+      get { return this.columnName; }
+      set { this.columnName = value; }
+    }
+
+    [Storable]
+    private Type columnType;
+    protected Type ColumnType {
+      get { return this.columnType; }
+      set { this.columnType = value; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      newColumn = (ColumnBase)Activator.CreateInstance(ColumnType, new object[] { this.ColumnName });
+      newColumn.Resize(ColumnGroup.RowCount);
+
+      if (ColumnIndex == -1) {
+        ColumnBase cb = ColumnGroup.Columns.FirstOrDefault(x => x.Selected);
+        if (cb != null) ColumnIndex = ColumnGroup.IndexOfColumn(cb);
+      }
+      if (ColumnIndex != -1) {
+        ColumnGroup.InsertColumn(ColumnIndex + 1, NewColumn);
+      } else {
+        ColumnGroup.AddColumn(NewColumn);
+      }
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      ColumnGroup.RemoveColumn(NewColumn);
+      newColumn = null;
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewDateTimeColumnCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewDateTimeColumnCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewDateTimeColumnCommand.cs	(revision 15690)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("New DateTimeColumn", 1, ColumnGroupState.Active, "Column Commands", Position = 9)]
+  public class AddNewDateTimeColumnCommand : AddNewColumnCommandBase {
+    [StorableConstructor]
+    protected AddNewDateTimeColumnCommand(bool deserializing) : base(deserializing) { }
+
+    public AddNewDateTimeColumnCommand(DataSet dataSet, string columnGroupName)
+      : this(dataSet, columnGroupName, "New DataTimeColumn") {
+    }
+
+    public AddNewDateTimeColumnCommand(DataSet dataSet, string columnGroupName, string columnName)
+      : base(dataSet, columnGroupName, columnName, typeof(DateTimeColumn)) {
+    }
+
+    public override string Description {
+      get { return "New DateTimeColumn"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewDoubleColumnCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewDoubleColumnCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewDoubleColumnCommand.cs	(revision 15690)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("New DoubleColumn", 1, ColumnGroupState.Active, "Column Commands", Position = 7)]
+  public class AddNewDoubleColumnCommand : AddNewColumnCommandBase {
+    [StorableConstructor]
+    protected AddNewDoubleColumnCommand(bool deserializing) : base(deserializing) { }
+
+    public AddNewDoubleColumnCommand(DataSet dataSet, string columnGroupName)
+      : this(dataSet, columnGroupName, "New DoubleColumn") {
+    }
+
+    public AddNewDoubleColumnCommand(DataSet dataSet, string columnGroupName, string columnName)
+      : base(dataSet, columnGroupName, columnName, typeof(DoubleColumn)) {
+    }
+
+    public override string Description {
+      get { return "New DoubleColumn"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewProgrammableColumnCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewProgrammableColumnCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewProgrammableColumnCommand.cs	(revision 15690)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Linq;
+using HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("New ProgrammableColumn", 1, ColumnGroupState.Active, "Column Commands", Position = 10,
+  OptionsView = typeof(ProgrammableColumnCommandView))]
+  public class AddNewProgrammableColumnCommand : AddNewColumnCommandBase {
+    [StorableConstructor]
+    protected AddNewProgrammableColumnCommand(bool deserializing) : base(deserializing) { }
+
+    public AddNewProgrammableColumnCommand(DataSet dataSet, string columnGroupName)
+      : this(dataSet, columnGroupName, "New ProgrammableColumn") {
+    }
+
+    public AddNewProgrammableColumnCommand(DataSet dataSet, string columnGroupName, string columnName)
+      : base(dataSet, columnGroupName, columnName, typeof(ProgrammableColumn)) {
+    }
+
+    public override string Description {
+      get { return "New programmable column"; }
+    }
+
+    [Storable]
+    private string expression;
+    public string Expression {
+      get { return expression; }
+      set { expression = value; }
+    }
+
+    public override void Execute() {
+      this.UpdateColumnGroup();
+      NewColumn = new ProgrammableColumn(ColumnName, ColumnGroup);
+      NewColumn.Resize(ColumnGroup.RowCount);
+      try {
+        ((ProgrammableColumn)NewColumn).Expression = expression;
+      }
+      catch (ParseException ex) {
+        throw new CommandExecutionException("Error occured during parsing of expression.", ex, this);
+      }
+
+      if (ColumnIndex == -1) {
+        ColumnBase cb = ColumnGroup.Columns.FirstOrDefault(x => x.Selected);
+        if (cb != null) ColumnIndex = ColumnGroup.IndexOfColumn(cb);
+      }
+      if (ColumnIndex != -1) {
+        ColumnGroup.InsertColumn(ColumnIndex + 1, NewColumn);
+      } else {
+        ColumnGroup.AddColumn(NewColumn);
+      }
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewStringColumnCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewStringColumnCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/AddNewStringColumnCommand.cs	(revision 15690)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("New StringColumn", 1, ColumnGroupState.Active, "Column Commands", Position = 8)]
+  public class AddNewStringColumnCommand : AddNewColumnCommandBase {
+    [StorableConstructor]
+    protected AddNewStringColumnCommand(bool deserializing) : base(deserializing) { }
+
+    public AddNewStringColumnCommand(DataSet dataSet, string columnGroupName)
+      : this(dataSet, columnGroupName, "New StringColumn") {
+    }
+
+    public AddNewStringColumnCommand(DataSet dataSet, string columnGroupName, string columnName)
+      : base(dataSet, columnGroupName, columnName, typeof(StringColumn)) {
+    }
+
+    public override string Description {
+      get { return "New StringColumn"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/ChangeColumnCommandBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/ChangeColumnCommandBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/ChangeColumnCommandBase.cs	(revision 15690)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  public abstract class ChangeColumnCommandBase : ColumnGroupCommandWithAffectedColumnsBase {
+    [Storable]
+    protected Type columnType;
+
+    protected List<ColumnBase> newColumns;
+    protected List<ColumnBase> oldColumns;
+    protected List<int> positions;
+    protected ICollection<int> oldSortedColumnIndexes;
+    protected IEnumerable<SortOrder> oldSortOrder;
+
+    [StorableConstructor]
+    protected ChangeColumnCommandBase(bool deserializing)
+      : base(deserializing) {
+      newColumns = new List<ColumnBase>();
+      oldColumns = new List<ColumnBase>();
+      positions = new List<int>();
+    }
+
+    protected ChangeColumnCommandBase(DataSet dataSet, string columnGroupName, int[] affectedColumns, Type newColumnType) :
+      base(dataSet, columnGroupName, affectedColumns) {
+      if (!newColumnType.IsSubclassOf(typeof(ColumnBase)))
+        throw new CommandExecutionException("Given columntype no subtype of ColumnBase.", this);
+
+      this.columnType = newColumnType;
+      newColumns = new List<ColumnBase>();
+      oldColumns = new List<ColumnBase>();
+      positions = new List<int>();
+    }
+
+    public override void Execute() {
+      base.Execute();
+      ColumnBase newCol;
+      ColumnBase oldCol;
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+      oldSortedColumnIndexes = new List<int>(ColumnGroup.SortedColumnIndexes);
+      for (int j = 0; j < AffectedColumns.Length; j++) {
+        oldCol = ColumnGroup.Columns.ElementAt(AffectedColumns[j]);
+        if (oldCol.GetType() != columnType) {
+          positions.Add(AffectedColumns[j]);
+          oldColumns.Add(oldCol);
+          newCol = (ColumnBase)Activator.CreateInstance(columnType, new object[] { oldCol.Name, oldCol.TotalValuesCount });
+          for (int i = 0; i < oldCol.TotalValuesCount; i++)
+            newCol.AddValueOrNull(oldCol.GetValue(i));
+          newColumns.Add(newCol);
+        }
+      }
+
+      for (int i = 0; i < positions.Count; i++)
+        ColumnGroup.ReplaceColumn(positions[i], newColumns[i]);
+      ColumnGroup.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      for (int i = 0; i < positions.Count; i++)
+        ColumnGroup.ReplaceColumn(positions[i], oldColumns[i]);
+      ColumnGroup.SortOrdersForColumns = oldSortOrder;
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndexes;
+      oldSortedColumnIndexes = null;
+      oldSortOrder = null;
+      oldColumns.Clear();
+      newColumns.Clear();
+      positions.Clear();
+      ColumnGroup.FireChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/ChangeColumnToDateTimeColumnCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/ChangeColumnToDateTimeColumnCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/ChangeColumnToDateTimeColumnCommand.cs	(revision 15690)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Change to DateTimeColumn", 1, ColumnGroupState.ColumnSelected, "Column Commands", Position = 13)]
+  public class ChangeColumnToDateTimeColumnCommand : ChangeColumnCommandBase {
+    [StorableConstructor]
+    protected ChangeColumnToDateTimeColumnCommand(bool deserializing) : base(deserializing) { }
+
+    public ChangeColumnToDateTimeColumnCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns, typeof(DateTimeColumn)) {
+    }
+
+    public override string Description {
+      get { return "Change to DateTimeColumn"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/ChangeColumnToDoubleColumnCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/ChangeColumnToDoubleColumnCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/ChangeColumnToDoubleColumnCommand.cs	(revision 15690)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Change to DoubleColumn", 1, ColumnGroupState.ColumnSelected, "Column Commands", Position = 11)]
+  public class ChangeColumnToDoubleColumnCommand : ChangeColumnCommandBase {
+    [StorableConstructor]
+    protected ChangeColumnToDoubleColumnCommand(bool deserializing) : base(deserializing) { }
+
+    public ChangeColumnToDoubleColumnCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns, typeof(DoubleColumn)) {
+    }
+
+    public override string Description {
+      get { return "Change to DoubleColumn"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/ChangeColumnToStringColumnCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/ChangeColumnToStringColumnCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/ChangeColumnToStringColumnCommand.cs	(revision 15690)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Change to StringColumn", 1, ColumnGroupState.ColumnSelected, "Column Commands", Position = 12)]
+  public class ChangeColumnToStringColumnCommand : ChangeColumnCommandBase {
+    [StorableConstructor]
+    protected ChangeColumnToStringColumnCommand(bool deserializing) : base(deserializing) { }
+
+    public ChangeColumnToStringColumnCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns, typeof(StringColumn)) {
+    }
+
+    public override string Description {
+      get { return "Change to StringColumn"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/CreateTimeSeriesColumnsCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/CreateTimeSeriesColumnsCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/CreateTimeSeriesColumnsCommand.cs	(revision 15690)
@@ -0,0 +1,234 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Linq;
+using System.Windows.Forms.DataVisualization.Charting;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfo("Create time series columns", 1, ColumnGroupState.DoubleColumnSelected, "Column Commands",
+    Position = 16, SelectedColumns = 4)]
+  public class CreateTimeSeriesColumnsCommand : ColumnGroupCommandWithAffectedColumnsBase {
+    private int addedColumnsCount;
+    [StorableConstructor]
+    protected CreateTimeSeriesColumnsCommand(bool deserializing) : base(deserializing) { }
+    public CreateTimeSeriesColumnsCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override string Description {
+      get { return "Create time series columns"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      if (AffectedColumns.Length != 4) throw new CommandExecutionException("The selected columns must include high, low, open, and close price.", this);
+      string[] seriesNames = { "high", "low", "open", "close" };
+      Chart chart1 = new Chart();
+      // Y = high
+      // Y2 = low
+      // Y3 = open
+      // Y4 = close
+      List<DoubleColumn> columns = new List<DoubleColumn>();
+      for (int i = 0; i < 4; i++) {
+        int columnIndex = AffectedColumns[i];
+        DoubleColumn doubleColumn = ColumnGroup.GetColumn(columnIndex) as DoubleColumn;
+        if (doubleColumn == null) throw new CommandExecutionException("The selection column does not contain double columns.", this);
+        columns.Add(doubleColumn);
+      }
+      Series series = new Series();
+      series.ChartArea = "Default";
+      series.ChartType = SeriesChartType.Stock;
+      series.Name = "Input";
+      series.YValuesPerPoint = 4;
+      for (int i = 0; i < columns[0].TotalValuesCount; i++) {
+        DataPoint point = new DataPoint();
+        List<double> values = new List<double>();
+        for (int j = 0; j < 4; j++) {
+          double? v = (double?)columns[j].GetValue(i);
+          if (!v.HasValue) throw new CommandExecutionException("Columns must not contain missing values.", this);
+          values.Add(v.Value);
+        }
+        point.YValues = values.ToArray();
+        series.Points.AddXY(i, values[0]);
+        series.Points[i].YValues[1] = values[1];
+        series.Points[i].YValues[2] = values[2];
+        series.Points[i].YValues[3] = values[3];
+      }
+      chart1.Series.Add(series);
+
+
+      DoubleColumn firstAffectedColumn = (DoubleColumn)ColumnGroup.GetColumn(AffectedColumns[0]);
+      int lastAffectedColumn = AffectedColumns[3];
+
+      // formulas using only the close price
+      FinancialFormula[] formulae = new FinancialFormula[] { 
+        FinancialFormula.DetrendedPriceOscillator, 
+        FinancialFormula.MovingAverageConvergenceDivergence,
+        FinancialFormula.Performance, 
+        FinancialFormula.RateOfChange, 
+        FinancialFormula.RelativeStrengthIndex, 
+        FinancialFormula.StandardDeviation };
+      int currentColumnIndex = lastAffectedColumn + 1;
+      addedColumnsCount = 0;
+      foreach (var formula in formulae) {
+        chart1.DataManipulator.FinancialFormula(formula, "10", "Input:Y4", "Indicators");
+
+        DoubleColumn newColumn = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
+        newColumn.Name = formula + "(" + firstAffectedColumn.Name + ")";
+        for (int i = 0; i < chart1.Series["Indicators"].Points.First().XValue; i++) {
+          newColumn.AddValue(null);
+        }
+        foreach (var value in chart1.Series["Indicators"].Points) {
+          newColumn.AddValue(value.YValues[0]);
+        }
+        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumn);
+        currentColumnIndex++;
+        addedColumnsCount++;
+      }
+
+      // Formulas with two input value
+      formulae = new FinancialFormula[] {
+        FinancialFormula.MassIndex,
+        FinancialFormula.VolatilityChaikins
+      };
+      foreach (var formula in formulae) {
+        chart1.DataManipulator.FinancialFormula(formula, "20", "Input:Y,Input:Y2", "Indicators");
+
+        DoubleColumn newColumn = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
+        newColumn.Name = formula + "(" + firstAffectedColumn.Name + ")";
+        for (int i = 0; i < chart1.Series["Indicators"].Points.First().XValue; i++) {
+          newColumn.AddValue(null);
+        }
+        foreach (var value in chart1.Series["Indicators"].Points) {
+          newColumn.AddValue(value.YValues[0]);
+        }
+        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumn);
+        currentColumnIndex++;
+        addedColumnsCount++;
+      }
+
+      // Williams %R
+      {
+        chart1.DataManipulator.FinancialFormula(FinancialFormula.WilliamsR, "Input:Y,Input:Y2,Input:Y4", "Indicators");
+        DoubleColumn newColumn = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
+        newColumn.Name = "WilliamsR(" + firstAffectedColumn.Name + ")";
+        for (int i = 0; i < chart1.Series["Indicators"].Points.First().XValue; i++) {
+          newColumn.AddValue(null);
+        }
+        foreach (var value in chart1.Series["Indicators"].Points) {
+          newColumn.AddValue(value.YValues[0]);
+        }
+        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumn);
+        currentColumnIndex++;
+        addedColumnsCount++;
+      }
+
+      // StochasticIndicator
+      {
+        chart1.DataManipulator.FinancialFormula(FinancialFormula.StochasticIndicator, "15", "Input:Y,Input:Y2,Input:Y4", "Indicators,SMA");
+        DoubleColumn newColumn = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
+        newColumn.Name = "StochasticIndicator(" + firstAffectedColumn.Name + ")";
+        for (int i = 0; i < chart1.Series["Indicators"].Points.First().XValue; i++) {
+          newColumn.AddValue(null);
+        }
+        foreach (var value in chart1.Series["Indicators"].Points) {
+          newColumn.AddValue(value.YValues[0]);
+        }
+        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumn);
+        currentColumnIndex++;
+        addedColumnsCount++;
+
+        DoubleColumn newColumnSma = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
+        newColumnSma.Name = "StochasticIndicator-SMA(" + firstAffectedColumn.Name + ")";
+        for (int i = 0; i < chart1.Series["SMA"].Points.First().XValue; i++) {
+          newColumnSma.AddValue(null);
+        }
+        foreach (var value in chart1.Series["SMA"].Points) {
+          newColumnSma.AddValue(value.YValues[0]);
+        }
+        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumnSma);
+        currentColumnIndex++;
+        addedColumnsCount++;
+      }
+
+
+      // All other formulas.
+      formulae = new FinancialFormula[] {
+        FinancialFormula.AverageTrueRange,
+        FinancialFormula.CommodityChannelIndex,
+      };
+      foreach (var formula in formulae) {
+        chart1.DataManipulator.FinancialFormula(formula, "Input:Y,Input:Y2,Input:Y4", "Indicators");
+        DoubleColumn newColumn = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
+        newColumn.Name = formula + "(" + firstAffectedColumn.Name + ")";
+        for (int i = 0; i < chart1.Series["Indicators"].Points.First().XValue; i++) {
+          newColumn.AddValue(null);
+        }
+        foreach (var value in chart1.Series["Indicators"].Points) {
+          newColumn.AddValue(value.YValues[0]);
+        }
+        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumn);
+        currentColumnIndex++;
+        addedColumnsCount++;
+      }
+
+      // moving averages.
+      formulae = new FinancialFormula[] {
+        FinancialFormula.ExponentialMovingAverage,
+        FinancialFormula.MovingAverage,
+        FinancialFormula.TriangularMovingAverage,
+        FinancialFormula.TripleExponentialMovingAverage, 
+        FinancialFormula.WeightedMovingAverage,
+      };
+      foreach (var formula in formulae) {
+        chart1.DataManipulator.FinancialFormula(formula, "15", "Input:Y4", "Indicators");
+        DoubleColumn newColumn = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
+        newColumn.Name = formula + "(" + firstAffectedColumn.Name + ")";
+        for (int i = 0; i < chart1.Series["Indicators"].Points.First().XValue; i++) {
+          newColumn.AddValue(null);
+        }
+        foreach (var value in chart1.Series["Indicators"].Points) {
+          newColumn.AddValue(value.YValues[0]);
+        }
+        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumn);
+        currentColumnIndex++;
+        addedColumnsCount++;
+      }
+
+      ColumnGroup.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      int lastAffectedColumnIndex = AffectedColumns[3];
+      for (int i = 0; i < addedColumnsCount; i++)
+        this.ColumnGroup.RemoveColumn(lastAffectedColumnIndex + 1);
+      addedColumnsCount = 0;
+      ColumnGroup.FireChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/SplitCategorialColumnCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/SplitCategorialColumnCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/SplitCategorialColumnCommand.cs	(revision 15690)
@@ -0,0 +1,85 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfo("Split categorial column", 1, ColumnGroupState.ColumnSelected, "Column Commands",
+    Position = 16, SelectedColumns = 1)]
+  public class SplitCategorialColumnCommand : ColumnCommandBase {
+    private int addedColumnsCount;
+    private const double SETVALUE = 1.0;
+    private const double NOTSETVALUE = 0.0;
+
+    [StorableConstructor]
+    protected SplitCategorialColumnCommand(bool deserializing) : base(deserializing) { }
+
+    public SplitCategorialColumnCommand(DataSet dataSet, string columnGroupName, int columnIndex)
+      : base(dataSet, columnGroupName, columnIndex) {
+    }
+
+    public override string Description {
+      get { return "Split categorial column"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      if (Column.NullValuesCount != 0)
+        throw new CommandExecutionException("Categorial column must not contain null values.", this);
+
+      int columnIndex = this.ColumnGroup.IndexOfColumn(Column);
+      Dictionary<string, DoubleColumn> addedColumns = new Dictionary<string, DoubleColumn>();
+      foreach (string value in Column.ValuesEnumerable.Cast<IComparable>().Distinct().OrderBy(c => c).Select(o => o.ToString())) {
+        DoubleColumn doubleColumn = new DoubleColumn(Column.Name + " " + value.ToString());
+        addedColumns[value] = doubleColumn;
+        ColumnGroup.InsertColumn(columnIndex + addedColumnsCount + 1, doubleColumn);
+        addedColumnsCount++;
+      }
+
+      for (int row = 0; row < ColumnGroup.RowCount; row++) {
+        string value = Column.GetValue(row).ToString();
+        foreach (KeyValuePair<string, DoubleColumn> pair in addedColumns) {
+          if (pair.Key == value)
+            pair.Value.AddValue(SETVALUE);
+          else
+            pair.Value.AddValue(NOTSETVALUE);
+        }
+      }
+      ColumnGroup.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      int columnIndex = this.ColumnGroup.IndexOfColumn(Column);
+      for (int i = 0; i < addedColumnsCount; i++)
+        this.ColumnGroup.RemoveColumn(columnIndex + 1);
+      addedColumnsCount = 0;
+      ColumnGroup.FireChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/SplitDictionaryStyleDataCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/SplitDictionaryStyleDataCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/SplitDictionaryStyleDataCommand.cs	(revision 15690)
@@ -0,0 +1,110 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfo("Split Dictionary-style Data", 1, ColumnGroupState.ColumnSelected | ColumnGroupState.Sorted, "Column Commands",
+    Position = 15)]
+  public class SplitDictionaryStyleDataCommand : ColumnGroupCommandWithAffectedColumnsBase {
+    private int addedColumnsCount;
+    [StorableConstructor]
+    protected SplitDictionaryStyleDataCommand(bool deserializing) : base(deserializing) { }
+
+    public SplitDictionaryStyleDataCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override string Description {
+      get { return "Split dictionary style data"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      if (ColumnGroup.SortedColumnIndexes.Except(AffectedColumns).Count() != 1 &&
+        ColumnGroup.SortedColumnIndexes.Except(AffectedColumns).FirstOrDefault() == ColumnGroup.SortedColumnIndexes.ElementAt(0))
+        throw new CommandExecutionException("Exactly one column must be sorted as first sorted column and not selected to define the equality of the rows.", this);
+      if (AffectedColumns.Intersect(ColumnGroup.SortedColumnIndexes).Count() != 1)
+        throw new CommandExecutionException("Exactly one column must be sorted and selected to define the column which holds the grouping value.", this);
+      if (!AffectedColumns.Except(ColumnGroup.SortedColumnIndexes).Any())
+        throw new CommandExecutionException("At least one column must not be sorted but selected to define the column which holds the values for new columns.", this);
+
+      Dictionary<IComparable, List<ColumnBase>> newColumns = new Dictionary<IComparable, List<ColumnBase>>();
+
+      ColumnBase groupColumn = ColumnGroup.GetColumn(ColumnGroup.SortedColumnIndexes.Except(AffectedColumns).First());
+      if (groupColumn.ContainsNullValues) throw new CommandExecutionException("Column which defines the equality (" + groupColumn.Name + ") must not contain NULL values.", this);
+
+      ColumnBase splitColumn = ColumnGroup.GetColumn(ColumnGroup.SortedColumnIndexes.Intersect(AffectedColumns).First());
+      var valueColumns = AffectedColumns.Except(ColumnGroup.SortedColumnIndexes).Select(index => ColumnGroup.GetColumn(index)).ToList();
+
+      IComparable groupValue = groupColumn.GetValue(0); ;
+      IComparable splitValue;
+      int groupStartIndex = 0;
+      for (int row = 0; row < ColumnGroup.RowCount; row++) {
+        //check if equality value is still the same
+        if (groupValue.CompareTo(groupColumn.GetValue(row)) != 0) {
+          groupValue = groupColumn.GetValue(row);
+          groupStartIndex = row;
+        }
+        splitValue = splitColumn.GetValue(row);
+
+        //create new column if new group value was detected
+        if (!newColumns.ContainsKey(splitValue)) {
+          newColumns.Add(splitValue, new List<ColumnBase>(valueColumns.Count));
+          int i = 0;
+          foreach (var valueColumn in valueColumns) {
+            var newColumn = valueColumn.CreateCopyOfColumnWithoutValues(valueColumn.TotalValuesCount);
+            newColumn.Name += "_" + splitValue;
+            newColumn.Resize(ColumnGroup.RowCount);
+            newColumns[splitValue].Add(newColumn);
+            i++;
+          }
+        }
+
+
+        for (int i = groupStartIndex; i < ColumnGroup.RowCount && groupValue.CompareTo(groupColumn.GetValue(i)) == 0; i++) {
+          for (int col = 0; col < valueColumns.Count; col++)
+            newColumns[splitValue][col].ChangeValue(i, valueColumns[col].GetValue(row));
+        }
+      }
+
+      ColumnGroup.AddColumns(newColumns.Values.SelectMany(col => col));
+      addedColumnsCount = newColumns.Values.Sum(columns => columns.Count);
+      this.ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      for (int i = 0; i < addedColumnsCount; i++)
+        ColumnGroup.RemoveColumn(ColumnGroup.Columns.Count() - 1);
+      this.ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/AddNewColumnGroupCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/AddNewColumnGroupCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/AddNewColumnGroupCommand.cs	(revision 15690)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using System.Xml;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("New ColumnGroup", 0, ColumnGroupState.None, "ColumnGroup Commands", Position = 0)]
+  public class AddNewColumnGroupCommand : DataSetCommandBase {
+    [Storable]
+    private string newColumnGroupName;
+
+    private ColumnGroup newColumnGroup;
+
+    [StorableConstructor]
+    protected AddNewColumnGroupCommand(bool deserializing) : base(deserializing) { }
+
+    public AddNewColumnGroupCommand(DataSet dataSet)
+      : base(dataSet) {
+      int i = 0;
+      string columnGroupName = "New ColumnGroup " + i;
+      while (dataSet.ColumnGroups.Any(cg => cg.Name == columnGroupName)) {
+        i++;
+        columnGroupName = "New ColumnGroup " + i;
+      }
+      this.newColumnGroupName = columnGroupName;
+    }
+
+    private AddNewColumnGroupCommand(DataSet dataSet, string name)
+      : base(dataSet) {
+      this.newColumnGroupName = name;
+    }
+
+    public override string Description {
+      get { return "New column group"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      this.newColumnGroup = new ColumnGroup(newColumnGroupName);
+      this.DataSet.AddColumnGroup(newColumnGroup);
+      this.newColumnGroup.Active = true;
+      this.DataSet.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      this.DataSet.RemoveColumnGroup(newColumnGroup);
+      this.newColumnGroup = null;
+      this.DataSet.FireChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/AlignColumnGroupsCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/AlignColumnGroupsCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/AlignColumnGroupsCommand.cs	(revision 15690)
@@ -0,0 +1,221 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfo("Align ColumnGroups", 2, ColumnGroupState.Sorted, "ColumnGroup Commands", Position = 4)]
+  public class AlignColumnGroupsCommand : DataSetCommandWithAffectedColumnGroupsBase {
+    private ColumnGroup newColumnGroup1;
+    private ColumnGroup newColumnGroup2;
+    private ColumnGroup oldColumnGroup1;
+    private ColumnGroup oldColumnGroup2;
+    private int removePos1;
+    private int removePos2;
+
+    [StorableConstructor]
+    protected AlignColumnGroupsCommand(bool deserializing) : base(deserializing) { }
+
+    public AlignColumnGroupsCommand(DataSet dataSet, List<string> affectedColumnGroupNames)
+      : base(dataSet, affectedColumnGroupNames) {
+    }
+
+    public override void Execute() {
+      base.Execute();
+      this.oldColumnGroup1 = this.DataSet.GetColumnGroup(AffectedColumnGroupNames[0]);
+      this.oldColumnGroup2 = this.DataSet.GetColumnGroup(AffectedColumnGroupNames[1]);
+      this.removePos1 = this.DataSet.IndexOfColumnGroup(oldColumnGroup1);
+      this.removePos2 = this.DataSet.IndexOfColumnGroup(oldColumnGroup2);
+
+      if (!oldColumnGroup1.Columns.Any() || !oldColumnGroup2.Columns.Any()) return;
+
+      if (oldColumnGroup1.SortedColumnsCount < 1 || oldColumnGroup1.SortedColumnsCount != oldColumnGroup2.SortedColumnsCount)
+        throw new CommandExecutionException("Both ColumnGroups must be sorted by at least one column and must be sorted by the same number of columns.", this);
+      for (int i = 0; i < oldColumnGroup1.SortedColumnsCount; i++) {
+        if (this.oldColumnGroup1.SortOrdersForColumns.ElementAt(oldColumnGroup1.SortedColumnIndexes.ElementAt(i)) !=
+            this.oldColumnGroup2.SortOrdersForColumns.ElementAt(oldColumnGroup2.SortedColumnIndexes.ElementAt(i)))
+          throw new CommandExecutionException("Both ColumnGroups must be sorted in the same direction.", this);
+        if (this.oldColumnGroup1.Columns.ElementAt(oldColumnGroup1.SortedColumnIndexes.ElementAt(i)).DataType !=
+            this.oldColumnGroup2.Columns.ElementAt(oldColumnGroup2.SortedColumnIndexes.ElementAt(i)).DataType)
+          throw new CommandExecutionException("Both ColumnGroups must be sorted by columns of the same type", this);
+      }
+
+      foreach (int sortColIndex in oldColumnGroup1.SortedColumnIndexes) {
+        if (oldColumnGroup1.Columns.ElementAt(sortColIndex).ContainsNullValues)
+          throw new CommandExecutionException("KeyColumn " + oldColumnGroup1.GetColumn(sortColIndex).Name + " not contain null values.", this);
+      }
+      foreach (int sortColIndex in oldColumnGroup2.SortedColumnIndexes) {
+        if (oldColumnGroup2.Columns.ElementAt(sortColIndex).ContainsNullValues)
+          throw new CommandExecutionException("KeyColumn " + oldColumnGroup1.GetColumn(sortColIndex).Name + " must not contain null values.", this);
+      }
+      SampleColumnGroup();
+
+      DataSet.ReplaceColumnGroup(removePos1, newColumnGroup1);
+      DataSet.ReplaceColumnGroup(removePos2, newColumnGroup2);
+      newColumnGroup1 = null;
+      newColumnGroup2 = null;
+      DataSet.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      DataSet.ReplaceColumnGroup(removePos1, oldColumnGroup1);
+      DataSet.ReplaceColumnGroup(removePos2, oldColumnGroup2);
+      oldColumnGroup1 = null;
+      oldColumnGroup2 = null;
+      DataSet.FireChanged();
+    }
+
+
+    public void SampleColumnGroup() {
+      var keyColumnIndex1 = oldColumnGroup1.SortedColumnIndexes;
+      var keyColumnIndex2 = oldColumnGroup2.SortedColumnIndexes;
+
+      this.newColumnGroup1 = new ColumnGroup(this.oldColumnGroup1.Name);
+      this.newColumnGroup2 = new ColumnGroup(this.oldColumnGroup2.Name);
+      this.newColumnGroup1.SortedColumnIndexes = this.oldColumnGroup1.SortedColumnIndexes;
+      this.newColumnGroup2.SortedColumnIndexes = this.oldColumnGroup2.SortedColumnIndexes;
+
+      ColumnBase column;
+      foreach (ColumnBase col in this.oldColumnGroup1.Columns) {
+        column = col.CreateCopyOfColumnWithoutValues();
+        column.SortOrder = col.SortOrder;
+        this.newColumnGroup1.AddColumn(column);
+      }
+      foreach (ColumnBase col in this.oldColumnGroup2.Columns) {
+        column = col.CreateCopyOfColumnWithoutValues();
+        column.SortOrder = col.SortOrder;
+        this.newColumnGroup2.AddColumn(column);
+      }
+
+      int compareDirection = this.oldColumnGroup1.SortOrdersForColumns.ElementAt(oldColumnGroup1.SortedColumnIndexes.ElementAt(0))
+        == SortOrder.Ascending ? -1 : +1;
+      int i = 0;
+      int j = 0;
+      IComparable[] row1;
+      IComparable[] row2;
+      while (i < oldColumnGroup1.RowCount && j < oldColumnGroup2.RowCount) {
+        //key1 < key2
+        int cmpResult = CompareRows(oldColumnGroup1, i, keyColumnIndex1, oldColumnGroup2, j, keyColumnIndex2);
+        if (cmpResult == compareDirection) {//keyColumn1.GetValue(i).CompareTo(keyColumn2.GetValue(j)) == compareDirection) {
+          row1 = this.oldColumnGroup1.GetRow(i);
+          row2 = this.oldColumnGroup2.GetEmptyRow();
+          CopyRow(row1, keyColumnIndex1, row2, keyColumnIndex2);// row2[keyColumnIndex2] = row1[keyColumnIndex1];
+          i++;
+        }
+          //key1 == key2
+        else if (/*keyColumn1.GetValue(i).CompareTo(keyColumn2.GetValue(j))*/ cmpResult == 0) {
+          row1 = this.oldColumnGroup1.GetRow(i);
+          row2 = this.oldColumnGroup2.GetRow(j);
+          bool columnGroup1Dup = false;
+          bool columnGroup2Dup = false;
+          if (i + 1 < oldColumnGroup1.RowCount) {
+            columnGroup1Dup = CompareRows(oldColumnGroup1, i, keyColumnIndex1, oldColumnGroup1, i + 1, keyColumnIndex1) == 0;
+          }
+          if (j + 1 < oldColumnGroup2.RowCount) {
+            columnGroup2Dup = CompareRows(oldColumnGroup2, j, keyColumnIndex2, oldColumnGroup2, j + 1, keyColumnIndex2) == 0;
+          }
+          if (columnGroup1Dup && !columnGroup2Dup) {
+            i++; // only advance to the row of the duplicate
+          } else if (!columnGroup1Dup && columnGroup2Dup) {
+            j++;
+          } else {
+            // either both are a duplicates or neither is
+            i++;
+            j++;
+          }
+        }
+          //key1 > key2
+        else {
+          row1 = this.oldColumnGroup1.GetEmptyRow();
+          row2 = this.oldColumnGroup2.GetRow(j);
+          CopyRow(row2, keyColumnIndex2, row1, keyColumnIndex1);// row1[keyColumnIndex1] = row2[keyColumnIndex2];
+          j++;
+        }
+        this.newColumnGroup1.AddRow(row1);
+        this.newColumnGroup2.AddRow(row2);
+      }
+      for (; i < oldColumnGroup1.RowCount; i++) {
+        this.newColumnGroup1.AddRow(this.oldColumnGroup1.GetRow(i));
+        this.newColumnGroup2.AddRow(this.oldColumnGroup2.GetEmptyRow());
+        CopyRow(newColumnGroup2.GetRow(newColumnGroup2.RowCount - 1), keyColumnIndex2, oldColumnGroup1.GetRow(i), keyColumnIndex1);
+        ChangeRow(newColumnGroup2, newColumnGroup2.RowCount - 1, keyColumnIndex2, oldColumnGroup1, i, keyColumnIndex1);
+      }
+      for (; j < oldColumnGroup2.RowCount; j++) {
+        this.newColumnGroup1.AddRow(oldColumnGroup1.GetEmptyRow());
+        this.newColumnGroup2.AddRow(oldColumnGroup2.GetRow(j));
+        ChangeRow(newColumnGroup1, newColumnGroup1.RowCount - 1, keyColumnIndex1, oldColumnGroup2, j, keyColumnIndex2);
+      }
+    }
+
+    private void ChangeRow(ColumnGroup destGroup, int destRowIndex, IEnumerable<int> destColumnIndexes, ColumnGroup srcGroup, int srcRowIndex, IEnumerable<int> srcColumnIndexes) {
+      foreach (var indexPair in Zip(destColumnIndexes, srcColumnIndexes, (d, s) => new { DestIndex = d, SrcIndex = s })) {
+        destGroup.GetColumn(indexPair.DestIndex).ChangeValue(destRowIndex, srcGroup.GetColumn(indexPair.SrcIndex).GetValue(srcRowIndex));
+      }
+    }
+
+    private void CopyRow(IComparable[] src, IEnumerable<int> srcIndexes, IComparable[] dest, IEnumerable<int> destIndexes) {
+      if (srcIndexes.Count() != destIndexes.Count()) throw new ArgumentException();
+      foreach (var indexPair in Zip(srcIndexes, destIndexes, (k, l) => new { First = k, Second = l })) {
+        dest[indexPair.Second] = src[indexPair.First];
+      }
+    }
+
+    int CompareRows(ColumnGroup oldColumnGroup1, int i, IEnumerable<int> keyColumnIndex1, ColumnGroup oldColumnGroup2, int j, IEnumerable<int> keyColumnIndex2) {
+      if (keyColumnIndex1.Count() != keyColumnIndex2.Count()) throw new ArgumentException();
+      var valuePairs = from x in
+                         Zip(from index in keyColumnIndex1
+                             select oldColumnGroup1.GetColumn(index).GetValue(i),
+                             from index in keyColumnIndex2
+                             select oldColumnGroup2.GetColumn(index).GetValue(j),
+                             (k, l) => new { First = k, Second = l })
+                       select x;
+      foreach (var p in valuePairs) {
+        var result = p.First.CompareTo(p.Second);
+        if (result != 0) return result;
+      }
+      return 0;
+    }
+
+
+    private static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>
+     (IEnumerable<TFirst> first,
+     IEnumerable<TSecond> second,
+     Func<TFirst, TSecond, TResult> resultSelector) {
+      using (IEnumerator<TFirst> e1 = first.GetEnumerator())
+      using (IEnumerator<TSecond> e2 = second.GetEnumerator())
+        while (e1.MoveNext() && e2.MoveNext())
+          yield return resultSelector(e1.Current, e2.Current);
+    }
+
+    public override string Description {
+      get { return "Align column groups"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/DeleteColumnGroupCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/DeleteColumnGroupCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/DeleteColumnGroupCommand.cs	(revision 15690)
@@ -0,0 +1,69 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Delete ColumnGroup", 1, ColumnGroupState.Active, "ColumnGroup Commands", Position = 1, MinActiveColumnGroups = 1)]
+  public class DeleteColumnGroupCommand : DataSetCommandWithAffectedColumnGroupsBase {
+    private List<KeyValuePair<int, ColumnGroup>> deletedColumnGroups;
+
+    [StorableConstructor]
+    protected DeleteColumnGroupCommand(bool deserializing)
+      : base(deserializing) {
+      deletedColumnGroups = new List<KeyValuePair<int, ColumnGroup>>();
+    }
+
+    public DeleteColumnGroupCommand(DataSet dataSet, List<string> affectedColumnGroupNames)
+      : base(dataSet, affectedColumnGroupNames) {
+      deletedColumnGroups = new List<KeyValuePair<int, ColumnGroup>>();
+    }
+
+    public override string Description {
+      get { return "Delete ColumnGroup"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      ColumnGroup columnGroup;
+      foreach (string columnGroupName in AffectedColumnGroupNames) {
+        columnGroup = this.DataSet.GetColumnGroup(columnGroupName);
+        deletedColumnGroups.Add(new KeyValuePair<int, ColumnGroup>(this.DataSet.IndexOfColumnGroup(columnGroup), columnGroup));
+        this.DataSet.RemoveColumnGroup(columnGroup);
+      }
+      this.DataSet.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      deletedColumnGroups.Reverse();
+      for (int i = 0; i < deletedColumnGroups.Count; i++)
+        this.DataSet.InsertColumnGroup(deletedColumnGroups[i].Key, deletedColumnGroups[i].Value);
+      deletedColumnGroups.Clear();
+      this.DataSet.FireChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/DeleteColumnsWithTooFewValuesCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/DeleteColumnsWithTooFewValuesCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/DeleteColumnsWithTooFewValuesCommand.cs	(revision 15690)
@@ -0,0 +1,67 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Delete Columns with too few Values", 1, ColumnGroupState.Active, "ColumnGroup Commands",
+   Position = 14, OptionsView = typeof(ThresholdCommandView))]
+  public class DeleteColumnsWithTooFewValuesCommand : ColumnGroupCommandBase {
+    private SortedDictionary<int, ColumnBase> deletedColumns;
+    private ICollection<int> oldSortedColumnIndices;
+    [StorableConstructor]
+    protected DeleteColumnsWithTooFewValuesCommand(bool deserializing)
+      : base(deserializing) {
+      deletedColumns = new SortedDictionary<int, ColumnBase>();
+    }
+
+    public DeleteColumnsWithTooFewValuesCommand(DataSet dataSet, string columnGroupName)
+      : base(dataSet, columnGroupName) {
+      deletedColumns = new SortedDictionary<int, ColumnBase>();
+    }
+
+    [Storable]
+    private double threshold;
+    public double Threshold {
+      get { return this.threshold; }
+      set { this.threshold = value; }
+    }
+
+    public override string Description {
+      get { return "Delete Columns with too few values"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      ColumnBase column;
+      for (int i = 0; i < ColumnGroup.Columns.Count(); i++) {
+        column = ColumnGroup.GetColumn(i);
+        if ((1 - ((double)column.NullValuesCount) / column.TotalValuesCount) < threshold)
+          deletedColumns.Add(i, column);
+      }
+      oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      foreach (ColumnBase col in deletedColumns.Values)
+        ColumnGroup.RemoveColumn(col);
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      foreach (KeyValuePair<int, ColumnBase> pair in deletedColumns)
+        ColumnGroup.InsertColumn(pair.Key, pair.Value);
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      oldSortedColumnIndices = null;
+      deletedColumns.Clear();
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/MergeColumnGroupsCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/MergeColumnGroupsCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/MergeColumnGroupsCommand.cs	(revision 15690)
@@ -0,0 +1,96 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfo("Merge ColumnGroups", 2, ColumnGroupState.Active, "ColumnGroup Commands", Position = 5, MinActiveColumnGroups = 2)]
+  public class MergeColumnGroupsCommand : DataSetCommandWithAffectedColumnGroupsBase {
+    private SortedDictionary<int, ColumnGroup> oldColumnGroups;
+    private List<int> oldRowCounts;
+    private ColumnGroup newColumnGroup;
+
+    [StorableConstructor]
+    protected MergeColumnGroupsCommand(bool deserializing)
+      : base(deserializing) {
+      oldColumnGroups = new SortedDictionary<int, ColumnGroup>();
+      oldRowCounts = new List<int>();
+    }
+
+    public MergeColumnGroupsCommand(DataSet dataSet, List<string> affectedColumnGroupNames)
+      : base(dataSet, affectedColumnGroupNames) {
+      oldColumnGroups = new SortedDictionary<int, ColumnGroup>();
+      oldRowCounts = new List<int>();
+    }
+
+    public override void Execute() {
+      base.Execute();
+      string name = "";
+      ColumnGroup columnGroup;
+      foreach (string columnGroupName in AffectedColumnGroupNames) {
+        columnGroup = this.DataSet.GetColumnGroup(columnGroupName);
+        oldColumnGroups.Add(this.DataSet.IndexOfColumnGroup(columnGroup), columnGroup);
+        oldRowCounts.Add(columnGroup.RowCount);
+        name = name + " & " + columnGroup.Name;
+      }
+      name = name.Remove(0, 3);
+      this.newColumnGroup = new ColumnGroup(name);
+      foreach (ColumnGroup grp in oldColumnGroups.Values) {
+        newColumnGroup.AddColumns(grp.Columns);
+        DataSet.RemoveColumnGroup(grp);
+      }
+
+      foreach (ColumnBase col in this.newColumnGroup.Columns) {
+        col.Resize(oldRowCounts.Max());
+        col.SortOrder = SortOrder.None;
+      }
+      DataSet.InsertColumnGroup(oldColumnGroups.Keys.ElementAt(0), this.newColumnGroup);
+      DataSet.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      DataSet.RemoveColumnGroup(newColumnGroup);
+      int col;
+      for (int i = 0; i < oldColumnGroups.Count; i++) {
+        col = oldColumnGroups.Keys.ElementAt(i);
+        DataSet.InsertColumnGroup(col, oldColumnGroups[col]);
+        foreach (ColumnBase column in oldColumnGroups[col].Columns)
+          column.Resize(oldRowCounts[i]);
+      }
+      oldColumnGroups.Clear();
+      newColumnGroup = null;
+      oldRowCounts.Clear();
+      DataSet.FireChanged();
+    }
+
+    public override string Description {
+      get { return "Merge column groups"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/MoveColumnGroupLeftCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/MoveColumnGroupLeftCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/MoveColumnGroupLeftCommand.cs	(revision 15690)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Linq;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Move ColumnGroup left", 1, ColumnGroupState.Active, "ColumnGroup Commands", Position = 2)]
+  public class MoveColumnGroupLeftCommand : DataSetCommandWithAffectedColumnGroupsBase {
+    [StorableConstructor]
+    protected MoveColumnGroupLeftCommand(bool deserializing) : base(deserializing) { }
+    public MoveColumnGroupLeftCommand(DataSet dataSet, List<string> affectedColumnGroups)
+      : base(dataSet, affectedColumnGroups) {
+    }
+
+    public override string Description {
+      get { return "Move column group left"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      ColumnGroup cg = this.DataSet.GetColumnGroup(AffectedColumnGroupNames[0]);
+      int columnGroupIndex = DataSet.IndexOfColumnGroup(cg);
+      if (columnGroupIndex != 0) {
+        DataSet.RemoveColumnGroup(cg);
+        DataSet.InsertColumnGroup(columnGroupIndex - 1, cg);
+        DataSet.FireChanged();
+      }
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      ColumnGroup cg = this.DataSet.GetColumnGroup(this.AffectedColumnGroupNames[0]);
+      int columnGroupIndex = this.DataSet.IndexOfColumnGroup(cg);
+      if (columnGroupIndex != this.DataSet.ColumnGroups.Count() - 1) {
+        DataSet.RemoveColumnGroup(cg);
+        DataSet.InsertColumnGroup(columnGroupIndex + 1, cg);
+        DataSet.FireChanged();
+      }
+      this.DataSet.FireChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/MoveColumnGroupRightCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/MoveColumnGroupRightCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/MoveColumnGroupRightCommand.cs	(revision 15690)
@@ -0,0 +1,68 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Linq;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Move ColumnGroup right", 1, ColumnGroupState.Active, "ColumnGroup Commands", Position = 3)]
+  public class MoveColumnGroupRightCommand : DataSetCommandWithAffectedColumnGroupsBase {
+    [StorableConstructor]
+    protected MoveColumnGroupRightCommand(bool deserializing) : base(deserializing) { }
+
+    public MoveColumnGroupRightCommand(DataSet dataSet, List<string> affectedColumnGroups)
+      : base(dataSet, affectedColumnGroups) {
+    }
+
+    public override string Description {
+      get { return "Move column group right"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      ColumnGroup cg = this.DataSet.GetColumnGroup(AffectedColumnGroupNames[0]);
+      int columnGroupIndex = DataSet.IndexOfColumnGroup(cg);
+      if (columnGroupIndex != DataSet.ColumnGroups.Count() - 1) {
+        DataSet.RemoveColumnGroup(cg);
+        DataSet.InsertColumnGroup(columnGroupIndex + 1, cg);
+        DataSet.FireChanged();
+      }
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      ColumnGroup cg = this.DataSet.GetColumnGroup(AffectedColumnGroupNames[0]);
+      int columnGroupIndex = DataSet.IndexOfColumnGroup(cg);
+      if (columnGroupIndex == 0) {
+        DataSet.RemoveColumnGroup(cg);
+        DataSet.InsertColumnGroup(columnGroupIndex - 1, cg);
+        DataSet.FireChanged();
+      }
+      this.DataSet.FireChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/SplitColumnGroupCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/SplitColumnGroupCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeDataset/SplitColumnGroupCommand.cs	(revision 15690)
@@ -0,0 +1,85 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfo("Split ColumnGroup", 1, ColumnGroupState.ColumnSelected, "ColumnGroup Commands", Position = 6, SelectedColumns = 2)]
+  public class SplitColumnGroupsCommand : ColumnGroupCommandWithAffectedColumnsBase {
+    private IEnumerable<SortOrder> oldSortOrder;
+    private ColumnGroup oldColumnGroup;
+    private int oldColumnGroupIndex;
+    private ColumnGroup newColumnGroup1;
+    private ColumnGroup newColumnGroup2;
+
+    [StorableConstructor]
+    protected SplitColumnGroupsCommand(bool deserializing) : base(deserializing) { }
+    public SplitColumnGroupsCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override void Execute() {
+      base.Execute();
+      int splitPosition = AffectedColumns[0] + 1;
+      oldColumnGroup = this.ColumnGroup;
+      oldColumnGroupIndex = this.DataSet.IndexOfColumnGroup(oldColumnGroup);
+      oldSortOrder = oldColumnGroup.SortOrdersForColumns.ToList();
+      newColumnGroup1 = new ColumnGroup(oldColumnGroup.Name);
+      newColumnGroup2 = new ColumnGroup(oldColumnGroup.Name);
+
+      for (int i = 0; i < splitPosition; i++)
+        newColumnGroup1.AddColumn(oldColumnGroup.Columns.ElementAt(i));
+      for (int i = splitPosition; i < oldColumnGroup.Columns.Count(); i++)
+        newColumnGroup2.AddColumn(oldColumnGroup.Columns.ElementAt(i));
+
+      newColumnGroup1.ResetSorting();
+      newColumnGroup2.ResetSorting();
+      this.DataSet.RemoveColumnGroup(oldColumnGroup);
+      this.DataSet.InsertColumnGroup(oldColumnGroupIndex, newColumnGroup1);
+      this.DataSet.InsertColumnGroup(oldColumnGroupIndex + 1, newColumnGroup2);
+      this.DataSet.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      this.DataSet.RemoveColumnGroup(newColumnGroup1);
+      this.DataSet.RemoveColumnGroup(newColumnGroup2);
+      this.DataSet.InsertColumnGroup(oldColumnGroupIndex, oldColumnGroup);
+      oldColumnGroup.SortOrdersForColumns = oldSortOrder;
+      newColumnGroup1 = null;
+      newColumnGroup2 = null;
+      oldSortOrder = null;
+      oldColumnGroup = null;
+      this.DataSet.FireChanged();
+    }
+
+    public override string Description {
+      get { return "Split column group"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/BoxCoxTransformationCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/BoxCoxTransformationCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/BoxCoxTransformationCommand.cs	(revision 15690)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Box-Cox Transformation", 1, ColumnGroupState.DoubleColumnSelected, "Change Values",
+  Position = 6, OptionsView = typeof(BoxCoxTransformationCommandView))]
+  public class BoxCoxTransformationCommand : ColumnGroupCommandWithAffectedColumnsBase {
+    [StorableConstructor]
+    protected BoxCoxTransformationCommand(bool deserializing) : base(deserializing) { }
+
+    public BoxCoxTransformationCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    [Storable]
+    private double lambda;
+    public double Lambda {
+      get { return this.lambda; }
+      set { this.lambda = value; }
+    }
+    [Storable]
+    private double c;
+    public double C {
+      get { return this.c; }
+      set { this.c = value; }
+    }
+
+    public override string Description {
+      get { return "Box-Cox Transformation"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      DoubleColumn column;
+      foreach (int col in AffectedColumns) {
+        if (ColumnGroup.GetColumn(col) is DoubleColumn) {
+          column = (DoubleColumn)ColumnGroup.GetColumn(col);
+          for (int i = 0; i < column.TotalValuesCount; i++)
+            if (column.GetValue(i) != null) {
+              if (lambda != 0.0) {
+                column.ChangeValue(i, Math.Pow((double)column.GetValue(i) + c, lambda) - 1);
+              } else {
+                column.ChangeValue(i, Math.Log((double)column.GetValue(i) + c));
+              }
+            }
+        }
+      }
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      DoubleColumn column;
+      foreach (int col in AffectedColumns) {
+        if (ColumnGroup.GetColumn(col) is DoubleColumn) {
+          column = (DoubleColumn)ColumnGroup.GetColumn(col);
+          for (int i = 0; i < column.TotalValuesCount; i++)
+            if (column.GetValue(i) != null) {
+              if (lambda != 0.0) {
+                column.ChangeValue(i, Math.Pow((double)column.GetValue(i) + 1, 1.0 / lambda) - c);
+              } else {
+                column.ChangeValue(i, Math.Exp((double)column.GetValue(i)) - c);
+              }
+            }
+        }
+      }
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/DeleteRowsWithGivenValueCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/DeleteRowsWithGivenValueCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/DeleteRowsWithGivenValueCommand.cs	(revision 15690)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Drawing;
+using System.Linq;
+using HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Search and Remove Rows", 1, ColumnGroupState.ColumnSelected, "Change Values",
+    Position = 1, OptionsView = typeof(SearchWithMatchOperationCommandView))]
+  public class DeleteRowsWithGivenValueCommand : SearchWithMatchOperationCommandBase {
+    private Dictionary<int, IComparable[]> deletedRows;
+
+    [StorableConstructor]
+    protected DeleteRowsWithGivenValueCommand(bool deserializing)
+      : base(deserializing) {
+      deletedRows = new Dictionary<int, IComparable[]>();
+    }
+
+    public DeleteRowsWithGivenValueCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+      deletedRows = new Dictionary<int, IComparable[]>();
+    }
+
+    public override string Description {
+      get { return "Delete rows which match given value"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      Point[] affectedCells = this.GetAffectedCells();
+      int[] rows = affectedCells.Select(c => c.Y).Distinct().OrderBy(x => x).Reverse().ToArray();
+
+      foreach (int rowIndex in rows) {
+        deletedRows[rowIndex] = ColumnGroup.GetRow(rowIndex);
+        ColumnGroup.DeleteRow(rowIndex);
+      }
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      foreach (KeyValuePair<int, IComparable[]> row in deletedRows.OrderBy(x => x.Key))
+        ColumnGroup.InsertRow(row.Key, row.Value);
+      deletedRows.Clear();
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/FilterCommandBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/FilterCommandBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/FilterCommandBase.cs	(revision 15690)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  public abstract class FilterCommandBase : ColumnGroupCommandWithAffectedColumnsBase {
+    [StorableConstructor]
+    protected FilterCommandBase(bool deserializing) : base(deserializing) { }
+
+    public FilterCommandBase(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    [Storable]
+    private int windowSize;
+    public int WindowSize {
+      get { return this.windowSize; }
+      set { this.windowSize = value; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/FilterMovingAverageCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/FilterMovingAverageCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/FilterMovingAverageCommand.cs	(revision 15690)
@@ -0,0 +1,119 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Moving Average", 1, ColumnGroupState.DoubleColumnSelected, "Change Values", Position = 2,
+    OptionsView = typeof(FilterCommandView))]
+  public class FilterMovingAverageCommand : FilterCommandBase {
+    private Dictionary<int, DoubleColumn> oldColumns;
+    private ICollection<int> oldSortedColumnIndices;
+
+    [StorableConstructor]
+    protected FilterMovingAverageCommand(bool deserializing)
+      : base(deserializing) {
+      oldColumns = new Dictionary<int, DoubleColumn>();
+    }
+
+    public FilterMovingAverageCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+      oldColumns = new Dictionary<int, DoubleColumn>();
+    }
+
+    public override string Description {
+      get { return "Filter Column - Moving Average"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      if (this.WindowSize < 1)
+        throw new CommandExecutionException("Window size for filter commands must no be smaller than 1.", this);
+      DoubleColumn column;
+      oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      foreach (int col in AffectedColumns) {
+        if (ColumnGroup.GetColumn(col) is DoubleColumn) {
+          column = (DoubleColumn)ColumnGroup.GetColumn(col);
+          oldColumns.Add(col, column);
+          ColumnGroup.ReplaceColumn(col, CalcNewColumn(column, this.WindowSize));
+        }
+      }
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      foreach (KeyValuePair<int, DoubleColumn> pair in oldColumns)
+        ColumnGroup.ReplaceColumn(pair.Key, pair.Value);
+
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      oldSortedColumnIndices = null;
+      oldColumns.Clear();
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    private DoubleColumn CalcNewColumn(DoubleColumn oldColumn, int windowSize) {
+      DoubleColumn newCol = (DoubleColumn)oldColumn.CreateCopyOfColumnWithoutValues();
+      int left = windowSize / 2;
+      int right = windowSize / 2;
+      if (windowSize % 2 == 0) left--;
+
+      double sum = 0;
+      double? val;
+      int cnt = 0;
+      //initialize sum and count for iterative moving average
+      for (int i = 0; i <= right; i++) {
+        val = (double?)oldColumn.GetValue(i);
+        if (val != null) {
+          sum += val.Value;
+          cnt++;
+        }
+      }
+      //first value newColumn[0]
+      newCol.AddValue(cnt == 0 ? null : (IComparable)(sum / cnt));
+      for (int i = 1; i < oldColumn.TotalValuesCount; i++) {
+        val = (double?)oldColumn.GetValue(i - left - 1);
+        if (val != null) {
+          sum -= val.Value;
+          cnt--;
+        }
+        val = (double?)oldColumn.GetValue(i + right);
+        if (val != null) {
+          sum += val.Value;
+          cnt++;
+        }
+        newCol.AddValue(cnt == 0 ? null : (IComparable)(sum / cnt));
+      }
+      newCol.SortOrder = oldColumn.SortOrder;
+      return newCol;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/FilterMovingMedianCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/FilterMovingMedianCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/FilterMovingMedianCommand.cs	(revision 15690)
@@ -0,0 +1,104 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Moving Median", 1, ColumnGroupState.DoubleColumnSelected, "Change Values", Position = 3,
+   OptionsView = typeof(FilterCommandView))]
+  public class FilterMovingMedianCommand : FilterCommandBase {
+    private Dictionary<int, DoubleColumn> oldColumns;
+    private ICollection<int> oldSortedColumnIndices;
+
+    [StorableConstructor]
+    protected FilterMovingMedianCommand(bool deserializing)
+      : base(deserializing) {
+      oldColumns = new Dictionary<int, DoubleColumn>();
+    }
+
+    public FilterMovingMedianCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+      oldColumns = new Dictionary<int, DoubleColumn>();
+    }
+
+    public override string Description {
+      get { return "Filter Column - Moving Median"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      if (this.WindowSize < 1)
+        throw new CommandExecutionException("Window size for filter commands must no be smaller than 1.", this);
+      oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      DoubleColumn column;
+      foreach (int col in AffectedColumns) {
+        if (ColumnGroup.GetColumn(col) is DoubleColumn) {
+          column = (DoubleColumn)ColumnGroup.GetColumn(col);
+          oldColumns.Add(col, column);
+          ColumnGroup.ReplaceColumn(col, CalcNewColumn(column, this.WindowSize));
+        }
+      }
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      foreach (KeyValuePair<int, DoubleColumn> pair in oldColumns)
+        ColumnGroup.ReplaceColumn(pair.Key, pair.Value);
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      oldSortedColumnIndices = null;
+      oldColumns.Clear();
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    private DoubleColumn CalcNewColumn(DoubleColumn oldColumn, int windowSize) {
+      DoubleColumn newCol = (DoubleColumn)oldColumn.CreateCopyOfColumnWithoutValues();
+      int left = windowSize / 2;
+      int right = windowSize / 2;
+      if (windowSize % 2 == 0) left--;
+
+      int startIndex = -1;
+      int endIndex = oldColumn.TotalValuesCount;
+      //first value newColumn[0]
+      newCol.AddValue(oldColumn.GetMedian(0, right >= oldColumn.TotalValuesCount ? oldColumn.TotalValuesCount : right + 1));
+      for (int i = 1; i < oldColumn.TotalValuesCount; i++) {
+        startIndex = i - left;
+        if (startIndex < 0)
+          startIndex = 0;
+        endIndex = i + right;
+        if (endIndex >= oldColumn.TotalValuesCount)
+          endIndex = oldColumn.TotalValuesCount - 1;
+        newCol.AddValue(oldColumn.GetMedian(startIndex, endIndex + 1));
+      }
+      newCol.SortOrder = oldColumn.SortOrder;
+      return newCol;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/FilterSavitzkyGolayCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/FilterSavitzkyGolayCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/FilterSavitzkyGolayCommand.cs	(revision 15690)
@@ -0,0 +1,164 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Savitzky Golay", 1, ColumnGroupState.DoubleColumnSelected, "Change Values", Position = 2,
+    OptionsView = typeof(FilterSavitzkyGolayCommandView))]
+  public class FilterSavitzkyGolayCommand : ColumnGroupCommandWithAffectedColumnsBase {
+    private Dictionary<int, DoubleColumn> oldColumns;
+    private ICollection<int> oldSortedColumnIndices;
+
+    [Storable]
+    public int WindowLeft { get; set; }
+    [Storable]
+    public int WindowRight { get; set; }
+    [Storable]
+    public int Order { get; set; }
+    [Storable]
+    public int OrderOfDerivative { get; set; }
+
+    [StorableConstructor]
+    protected FilterSavitzkyGolayCommand(bool deserializing)
+      : base(deserializing) {
+      oldColumns = new Dictionary<int, DoubleColumn>();
+    }
+
+    public FilterSavitzkyGolayCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+      oldColumns = new Dictionary<int, DoubleColumn>();
+      this.WindowLeft = -16;
+      this.WindowRight = 16;
+      this.Order = 2;
+      this.OrderOfDerivative = 0;
+    }
+
+    public override string Description {
+      get { return "Filter Column - Savitzky Golay"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      if (this.WindowLeft >= WindowRight)
+        throw new CommandExecutionException("Window size for filter commands must no be smaller than 1.", this);
+      foreach (int col in AffectedColumns) {
+        DoubleColumn doubleCol = ColumnGroup.GetColumn(col) as DoubleColumn;
+        if (doubleCol == null) throw new CommandExecutionException("Filtering is only supported for double columns.", this);
+      }
+      DoubleColumn column;
+      oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      foreach (int col in AffectedColumns) {
+        if (ColumnGroup.GetColumn(col) is DoubleColumn) {
+          column = (DoubleColumn)ColumnGroup.GetColumn(col);
+          oldColumns.Add(col, column);
+          ColumnGroup.ReplaceColumn(col, CalcNewColumn(column, this.WindowLeft, this.WindowRight, this.OrderOfDerivative, this.Order));
+        }
+      }
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      foreach (KeyValuePair<int, DoubleColumn> pair in oldColumns)
+        ColumnGroup.ReplaceColumn(pair.Key, pair.Value);
+
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      oldSortedColumnIndices = null;
+      oldColumns.Clear();
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    private DoubleColumn CalcNewColumn(DoubleColumn oldColumn, int windowLeft, int windowRight, int derivativeOrder, int order) {
+      double[] c;
+      SavitzkyGolay(Math.Abs(windowLeft), Math.Abs(windowRight), derivativeOrder, order, out c);
+
+      DoubleColumn newCol = (DoubleColumn)oldColumn.CreateCopyOfColumnWithoutValues();
+      double[] data = oldColumn.ValuesEnumerable.Cast<double?>().Select(x => x.HasValue ? x.Value : double.NaN).ToArray();
+      double[] ans = new double[oldColumn.TotalValuesCount];
+      alglib.convr1d(data, data.Length, c, c.Length, out ans);
+      for (int i = Math.Abs(windowRight); i < ans.Length - Math.Abs(windowLeft); i++) {
+        if (!double.IsNaN(ans[i]))
+          newCol.AddValue(ans[i]);
+        else
+          newCol.AddValueOrNull(null);
+      }
+      newCol.SortOrder = oldColumn.SortOrder;
+      return newCol;
+    }
+
+    /// <summary>
+    /// Calculates coefficients for Savitzky-Golay filtering. (Numerical Recipes, page 769), one important change is that the coefficients are returned in normal order instead of wraparound order
+    /// </summary>
+    /// <param name="nl">number of samples to the left</param>
+    /// <param name="nr">number of samples to the right</param>
+    /// <param name="ld">order of derivative (smoothing=0)</param>
+    /// <param name="order">order of the polynomial to fit</param>
+    /// <param name="c">resulting coefficients for convolution, in correct order (t-nl, ... t-1, t+0, t+1, ... t+nr)</param>
+    private void SavitzkyGolay(int nl, int nr, int ld, int order, out double[] c) {
+      int np = nl + nr + 1;
+
+      int j, k, imj, ipj, kk, mm;
+      double fac = 0;
+      double sum = 0;
+      if (nl < 0 || nr < 0 || ld > order || nl + nr < order) throw new ArgumentException();
+
+      double[,] a = new double[order + 1, order + 1];
+      double[] b = new double[order + 1];
+      c = new double[np];
+
+      for (ipj = 0; ipj <= (order << 1); ipj++) {
+        sum = (ipj > 0 ? 0.0 : 1.0);
+        for (k = 1; k <= nr; k++) sum += Math.Pow((double)k, (double)ipj);
+        for (k = 1; k <= nl; k++) sum += Math.Pow((double)-k, (double)ipj);
+        mm = Math.Min(ipj, 2 * order - ipj);
+        for (imj = -mm; imj <= mm; imj += 2)
+          a[(ipj + imj) / 2, (ipj - imj) / 2] = sum;
+      }
+      for (j = 0; j < order + 1; j++) b[j] = 0;
+      b[ld] = 1.0;
+      alglib.densesolverreport rep;
+      int info;
+      double[] x = new double[b.Length];
+      alglib.rmatrixsolve(a, b.Length, b, out info, out rep, out x);
+
+      for (kk = 0; kk < np; kk++) c[kk] = 0.0;
+      for (k = -nl; k <= nr; k++) {
+        sum = x[0];
+        fac = 1.0;
+        for (mm = 1; mm <= order; mm++) sum += x[mm] * (fac *= k);
+        kk = k + nl;
+        c[kk] = sum;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/LinearTransformationCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/LinearTransformationCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/LinearTransformationCommand.cs	(revision 15690)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Linear Transformation", 1, ColumnGroupState.DoubleColumnSelected, "Change Values",
+  Position = 6, OptionsView = typeof(LinearTransformationCommandView))]
+  public class LinearTransformationCommand : ColumnGroupCommandWithAffectedColumnsBase {
+    [StorableConstructor]
+    protected LinearTransformationCommand(bool deserializing) : base(deserializing) { }
+
+    public LinearTransformationCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    [Storable]
+    private double slope;
+    public double Slope {
+      get { return this.slope; }
+      set { this.slope = value; }
+    }
+
+    [Storable]
+    private double offset;
+    public double Offset {
+      get { return this.offset; }
+      set { this.offset = value; }
+    }
+
+    public override string Description {
+      get { return "Lineare Transformation"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      DoubleColumn column;
+      foreach (int col in AffectedColumns) {
+        if (ColumnGroup.GetColumn(col) is DoubleColumn) {
+          column = (DoubleColumn)ColumnGroup.GetColumn(col);
+          for (int i = 0; i < column.TotalValuesCount; i++)
+            if (column.GetValue(i) != null)
+              column.ChangeValue(i, (double)column.GetValue(i) * slope + offset);
+        }
+      }
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      DoubleColumn column;
+      foreach (int col in AffectedColumns) {
+        if (ColumnGroup.GetColumn(col) is DoubleColumn) {
+          column = (DoubleColumn)ColumnGroup.GetColumn(col);
+          for (int i = 0; i < column.TotalValuesCount; i++)
+            if (column.GetValue(i) != null)
+              column.ChangeValue(i, ((double)column.GetValue(i) - offset) / slope);
+        }
+      }
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/NormalDistributionScalingCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/NormalDistributionScalingCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/NormalDistributionScalingCommand.cs	(revision 15690)
@@ -0,0 +1,123 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Scale to normal distribution", 1, ColumnGroupState.DoubleColumnSelected, "Change Values",
+   Position = 5, OptionsView = typeof(NormalDistributionCommandView))]
+  public class NormalDistributionScalingCommand : ColumnGroupCommandWithAffectedColumnsBase {
+    private List<KeyValuePair<double, double>> oldNormalDistribution;
+
+    [StorableConstructor]
+    protected NormalDistributionScalingCommand(bool deserializing)
+      : base(deserializing) {
+      oldNormalDistribution = new List<KeyValuePair<double, double>>();
+    }
+
+    public NormalDistributionScalingCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+      oldNormalDistribution = new List<KeyValuePair<double, double>>();
+    }
+
+    public override string Description {
+      get { return "Scale to normal distribution"; }
+    }
+
+    [Storable]
+    private double newMean;
+    public double Mean {
+      get { return this.newMean; }
+      set { this.newMean = value; }
+    }
+
+    [Storable]
+    private double newStddev;
+    public double StandardDeviation {
+      get { return this.newStddev; }
+      set { this.newStddev = value; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      DoubleColumn column;
+      double oldMean;
+      double oldStddev;
+      for (int i = 0; i < AffectedColumns.Length; i++) {
+        if (ColumnGroup.GetColumn(AffectedColumns[i]) is DoubleColumn) {
+          column = (DoubleColumn)ColumnGroup.GetColumn(AffectedColumns[i]);
+          if (column.NonNullValuesCount == 0)
+            continue;
+          oldMean = (double)column.Mean;
+          oldStddev = (double)column.StandardDeviation;
+          CalculateNewColumn(column, newMean, newStddev, oldMean, oldStddev);
+          oldNormalDistribution.Add(new KeyValuePair<double, double>(oldMean, oldStddev));
+        }
+      }
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      DoubleColumn column;
+      double oldMean;
+      double oldStddev;
+      int j = 0;
+      for (int i = 0; i < AffectedColumns.Length; i++) {
+        if (ColumnGroup.GetColumn(AffectedColumns[i]) is DoubleColumn) {
+          column = (DoubleColumn)ColumnGroup.GetColumn(AffectedColumns[i]);
+          if (column.NonNullValuesCount == 0)
+            continue;
+          oldMean = oldNormalDistribution[j].Key;
+          oldStddev = oldNormalDistribution[j].Value;
+          CalculateNewColumn(column, oldMean, oldStddev, newMean, newStddev);
+          j++;
+        }
+      }
+      oldNormalDistribution.Clear();
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+
+    }
+
+    private void CalculateNewColumn(DoubleColumn column, double newMean, double newStddev, double oldMean, double oldStddev) {
+      double newValue;
+      double oldValue;
+      for (int val = 0; val < column.TotalValuesCount; val++) {
+        if (column.GetValue(val) == null)
+          continue;
+        oldValue = (double)column.GetValue(val);
+        if (oldStddev == 0)
+          newValue = oldValue - oldMean + newMean;
+        else
+          newValue = ((oldValue - oldMean) / oldStddev) * newStddev + newMean;
+        column.ChangeValue(val, newValue);
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/PercentalChangeCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/PercentalChangeCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/PercentalChangeCommand.cs	(revision 15690)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Linq;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Percental Change", 1, ColumnGroupState.DoubleColumnSelected, "Change Values", Position = 3)]
+  public class PercentalChangeCommand : ColumnGroupCommandWithAffectedColumnsBase {
+    private Dictionary<int, DoubleColumn> oldColumns;
+    private ICollection<int> oldSortedColumnIndices;
+
+    [StorableConstructor]
+    protected PercentalChangeCommand(bool deserializing)
+      : base(deserializing) {
+      oldColumns = new Dictionary<int, DoubleColumn>();
+    }
+
+    public PercentalChangeCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+      oldColumns = new Dictionary<int, DoubleColumn>();
+    }
+
+    public override string Description {
+      get { return "Calculate the percental change from last to the current value"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      foreach (int col in AffectedColumns) {
+        DoubleColumn doubleCol = ColumnGroup.GetColumn(col) as DoubleColumn;
+        if (doubleCol == null) throw new CommandExecutionException("Filtering is only supported for double columns.", this);
+      }
+      DoubleColumn column;
+      oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      foreach (int col in AffectedColumns) {
+        if (ColumnGroup.GetColumn(col) is DoubleColumn) {
+          column = (DoubleColumn)ColumnGroup.GetColumn(col);
+          oldColumns.Add(col, column);
+          ColumnGroup.ReplaceColumn(col, CalcNewColumn(column));
+        }
+      }
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      foreach (KeyValuePair<int, DoubleColumn> pair in oldColumns)
+        ColumnGroup.ReplaceColumn(pair.Key, pair.Value);
+
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      oldSortedColumnIndices = null;
+      oldColumns.Clear();
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    private DoubleColumn CalcNewColumn(DoubleColumn oldColumn) {
+      DoubleColumn newCol = (DoubleColumn)oldColumn.CreateCopyOfColumnWithoutValues();
+      var data = oldColumn.ValuesEnumerable.Cast<double?>();
+
+      var ans = new double?[] { null } // insert an empty value at the beginning
+      .Concat(data)
+      .Zip(data, (prev, cur) => (cur.HasValue && prev.HasValue) ? (cur - prev) / prev : null)
+      .ToArray();
+
+      foreach (var e in ans) newCol.AddValue(e);
+
+      newCol.SortOrder = oldColumn.SortOrder;
+      return newCol;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/ScalingBetweenMinAndMaxCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/ScalingBetweenMinAndMaxCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/ScalingBetweenMinAndMaxCommand.cs	(revision 15690)
@@ -0,0 +1,123 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Scaling between Min/Max", 1, ColumnGroupState.DoubleColumnSelected, "Change Values",
+ Position = 4, OptionsView = typeof(MinMaxCommandView))]
+  public class ScalingBetweenMinAndMaxCommand : ColumnGroupCommandWithAffectedColumnsBase {
+    private List<double> oldMinValues;
+    private List<double> oldMaxValues;
+
+    [StorableConstructor]
+    protected ScalingBetweenMinAndMaxCommand(bool deserializing)
+      : base(deserializing) {
+      oldMinValues = new List<double>();
+      oldMaxValues = new List<double>();
+    }
+
+    public ScalingBetweenMinAndMaxCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+      oldMinValues = new List<double>();
+      oldMaxValues = new List<double>();
+    }
+
+    public override string Description {
+      get { return "Scale Values between minimum and maximum"; }
+    }
+
+    [Storable]
+    private double minValue;
+    public double MinValue {
+      get { return this.minValue; }
+      set { this.minValue = value; }
+    }
+
+    [Storable]
+    private double maxValue;
+    public double MaxValue {
+      get { return maxValue; }
+      set { this.maxValue = value; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      if (maxValue < minValue)
+        throw new CommandExecutionException("Minimum must be smaller or equal than Maximum.", this);
+      DoubleColumn column;
+      int j = 0;
+      for (int i = 0; i < AffectedColumns.Length; i++) {
+        if (ColumnGroup.GetColumn(AffectedColumns[i]) is DoubleColumn) {
+          column = (DoubleColumn)ColumnGroup.GetColumn(AffectedColumns[i]);
+          if (column.ContainsNotNullValues) {
+            oldMinValues.Add((double)column.Minimum);
+            oldMaxValues.Add((double)column.Maximum);
+            ScaleLinear(column, oldMinValues[j], oldMaxValues[j], minValue, maxValue);
+            j++;
+          }
+        }
+      }
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      DoubleColumn column;
+      int j = 0;
+      for (int i = 0; i < AffectedColumns.Length; i++) {
+        if (ColumnGroup.GetColumn(i) is DoubleColumn) {
+          column = (DoubleColumn)ColumnGroup.GetColumn(AffectedColumns[i]);
+          if (column.ContainsNotNullValues) {
+            oldMinValues.Add((double)column.Minimum);
+            oldMaxValues.Add((double)column.Maximum);
+            ScaleLinear(column, minValue, maxValue, oldMinValues[j], oldMaxValues[j]);
+            j++;
+          }
+        }
+      }
+      oldMinValues.Clear();
+      oldMaxValues.Clear();
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    private void ScaleLinear(DoubleColumn column, double oldMin, double oldMax, double newMin, double newMax) {
+      double newRange = newMax - newMin;
+      double? actValue;
+      double oldRange = oldMax - oldMin;
+      if (oldRange == 0)
+        oldRange = 1;
+      for (int i = 0; i < column.TotalValuesCount; i++) {
+        actValue = (double?)column.GetValue(i);
+        if (actValue != null)
+          column.ChangeValue(i, newMin + newRange * (((double)actValue) - oldMin) / oldRange);
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/SearchAndReplaceCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/SearchAndReplaceCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/SearchAndReplaceCommand.cs	(revision 15690)
@@ -0,0 +1,107 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Drawing;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Search and Replace", 1, ColumnGroupState.ColumnSelected, "Change Values",
+  Position = 0, OptionsView = typeof(SearchAndReplaceCommandView))]
+  public class SearchAndReplaceCommand : SearchWithMatchOperationCommandBase {
+    private Dictionary<Point, IComparable> changedCells;
+    private List<int> oldSorteColumnIndices;
+    private Dictionary<ColumnBase, SortOrder> oldSortOrder;
+
+    [StorableConstructor]
+    protected SearchAndReplaceCommand(bool deserializing)
+      : base(deserializing) {
+      changedCells = new Dictionary<Point, IComparable>();
+      oldSorteColumnIndices = new List<int>();
+      oldSortOrder = new Dictionary<ColumnBase, SortOrder>();
+    }
+
+    public SearchAndReplaceCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+      changedCells = new Dictionary<Point, IComparable>();
+      oldSorteColumnIndices = new List<int>();
+      oldSortOrder = new Dictionary<ColumnBase, SortOrder>();
+    }
+
+    public override string Description {
+      get { return "Search and Replace"; }
+    }
+
+    [Storable]
+    private string replaceValue;
+    public string ReplaceValue {
+      get { return this.replaceValue; }
+      set { this.replaceValue = string.IsNullOrEmpty(value) ? null : value.Trim(); }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      Point[] affectedCells = this.GetAffectedCells();
+      ColumnBase column;
+      foreach (Point cell in affectedCells) {
+        column = this.ColumnGroup.GetColumn(cell.X);
+        changedCells[cell] = column.GetValue(cell.Y);
+        column.ChangeValueOrLeaveOldValue(cell.Y, ReplaceValue);
+      }
+
+      foreach (ColumnBase col in this.ColumnGroup.Columns)
+        oldSortOrder.Add(col, col.SortOrder);
+
+      oldSorteColumnIndices = new List<int>(this.ColumnGroup.SortedColumnIndexes);
+      this.ColumnGroup.ResetSorting();
+
+      this.ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      //needed because otherwise unchanged cells with the same replaceValue would also be affected
+      ColumnBase column;
+      foreach (KeyValuePair<Point, IComparable> cell in changedCells) {
+        column = this.ColumnGroup.GetColumn(cell.Key.X);
+        column.ChangeValueOrLeaveOldValue(cell.Key.Y, cell.Value);
+      }
+
+      this.ColumnGroup.SortedColumnIndexes = this.oldSorteColumnIndices;
+      foreach (KeyValuePair<ColumnBase, SortOrder> pair in oldSortOrder)
+        pair.Key.SortOrder = pair.Value;
+
+      oldSortOrder.Clear();
+      oldSorteColumnIndices.Clear();
+      changedCells.Clear();
+      this.ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/SearchCommandBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/SearchCommandBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/SearchCommandBase.cs	(revision 15690)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  public abstract class SearchCommandBase : ColumnGroupCommandWithAffectedColumnsBase {
+    [StorableConstructor]
+    protected SearchCommandBase(bool deserializing) : base(deserializing) { }
+    protected SearchCommandBase(DataSet dataSet, string columnGroupName, int[] affectedColumns) :
+      base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    [Storable]
+    private string searchValue;
+    public string SearchValue {
+      get { return this.searchValue; }
+      set { this.searchValue = string.IsNullOrEmpty(value) ? null : value.Trim(); }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/SearchWithMatchOperationCommandBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/SearchWithMatchOperationCommandBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeValues/SearchWithMatchOperationCommandBase.cs	(revision 15690)
@@ -0,0 +1,132 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Drawing;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  public enum MatchOperation {
+    Equal = 0,
+    NotEqual = 1,
+    Smaller = 2,
+    Larger = 3,
+  }
+
+  [StorableClass]
+  public abstract class SearchWithMatchOperationCommandBase : SearchCommandBase {
+    [StorableConstructor]
+    protected SearchWithMatchOperationCommandBase(bool deserializing) : base(deserializing) { }
+    protected SearchWithMatchOperationCommandBase(DataSet dataSet, string columnGroupName, int[] affectedColumns) :
+      base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    [Storable]
+    private MatchOperation matchOperation;
+    public MatchOperation MatchOperation {
+      get { return this.matchOperation; }
+      set { this.matchOperation = value; }
+    }
+
+    protected Point[] GetAffectedCells() {
+      List<Point> affectedCells = new List<Point>();
+      Func<IComparable, IComparable, bool> compareFunction = this.GetCompareFunction(this.matchOperation);
+      ColumnBase column;
+      IComparable compareValue;
+      IComparable value;
+
+      for (int col = 0; col < AffectedColumns.Length; col++) {
+        column = ColumnGroup.GetColumn(AffectedColumns[col]);
+        compareValue = this.GetCompareValue(column, SearchValue);
+        for (int row = 0; row < column.TotalValuesCount; row++) {
+          value = column.GetValue(row);
+          if (compareFunction(compareValue, value))
+            affectedCells.Add(new Point(AffectedColumns[col], row));
+        }
+      }
+
+      return affectedCells.ToArray();
+    }
+
+    private IComparable GetCompareValue(ColumnBase column, string searchValue) {
+      if (string.IsNullOrEmpty(searchValue))
+        return null;
+
+      IComparable compareValue;
+      if (column is DoubleColumn) {
+        double v;
+        if (!double.TryParse(SearchValue, out v)) throw new CommandExecutionException("Can't use value " + SearchValue + " to filter a DoubleColumn.", this);
+        compareValue = v;
+      } else if (column is DateTimeColumn) {
+        DateTime d;
+        if (!DateTime.TryParse(SearchValue, out d)) throw new CommandExecutionException("Can't use value " + SearchValue + " to filter a DateTimeColumn.", this);
+        compareValue = d;
+      } else if (column is StringColumn) {
+        compareValue = SearchValue;
+      } else throw new CommandExecutionException("Column type " + column.GetType() + " is not supported.", this);
+      return compareValue;
+    }
+
+    private Func<IComparable, IComparable, bool> GetCompareFunction(MatchOperation matchOperation) {
+      Func<IComparable, IComparable, bool> compareFunction;
+      switch (matchOperation) {
+        case MatchOperation.Equal:
+          compareFunction = (left, right) => {
+            if (left == null && right == null) return true;
+            else if (left != null && right == null) return false;
+            else if (left == null && right != null) return false;
+            return left.CompareTo(right) == 0;
+          };
+          break;
+        case MatchOperation.NotEqual:
+          compareFunction = (left, right) => {
+            if (left == null && right == null) return false;
+            else if (left != null && right == null) return true;
+            else if (left == null && right != null) return true;
+            return left.CompareTo(right) != 0;
+          };
+          break;
+        case MatchOperation.Smaller:
+          compareFunction = (left, right) => {
+            if (left == null && right == null) return false;
+            else if (left != null && right == null) return false;
+            else if (left == null && right != null) return false;
+            return left.CompareTo(right) > 0;
+          };
+          break;
+        case MatchOperation.Larger:
+          compareFunction = (left, right) => {
+            if (left == null && right == null) return false;
+            else if (left != null && right == null) return false;
+            else if (left == null && right != null) return false;
+            return left.CompareTo(right) < 0;
+          };
+          break;
+        default:
+          throw new ArgumentException("Undefined compare function.");
+      }
+      return compareFunction;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/HeuristicLab.DataImporter.Command.csproj
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/HeuristicLab.DataImporter.Command.csproj	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/HeuristicLab.DataImporter.Command.csproj	(revision 15690)
@@ -0,0 +1,318 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{62625144-AC9E-4970-A79C-882B72A1601C}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.DataImporter.Command</RootNamespace>
+    <AssemblyName>HeuristicLab.DataImporter.Command-1.0</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="ALGLIB-3.7.0, Version=3.7.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\..\trunk\bin\ALGLIB-3.7.0.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Windows.Forms.DataVisualization" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ChangeColumnGroup\CreateTimeSeriesColumnsCommand.cs" />
+    <Compile Include="ChangeColumnGroup\SplitCategorialColumnCommand.cs" />
+    <Compile Include="ChangeDataset\AlignColumnGroupsCommand.cs" />
+    <Compile Include="ChangeColumnGroup\SplitDictionaryStyleDataCommand.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ChangeValues\BoxCoxTransformationCommand.cs" />
+    <Compile Include="ChangeValues\PercentalChangeCommand.cs" />
+    <Compile Include="ChangeValues\FilterSavitzkyGolayCommand.cs" />
+    <Compile Include="ChangeValues\SearchWithMatchOperationCommandBase.cs" />
+    <Compile Include="ChangeValues\FilterCommandBase.cs" />
+    <Compile Include="ChangeValues\LinearTransformationCommand.cs" />
+    <Compile Include="ChangeValues\ScalingBetweenMinAndMaxCommand.cs" />
+    <Compile Include="ChangeValues\NormalDistributionScalingCommand.cs" />
+    <Compile Include="ChangeValues\SearchCommandBase.cs" />
+    <Compile Include="ChangeColumnGroup\AddNewColumnCommandBase.cs" />
+    <Compile Include="ChangeColumnGroup\AddNewStringColumnCommand.cs" />
+    <Compile Include="ChangeDataset\AddNewColumnGroupCommand.cs" />
+    <Compile Include="Aggregation\AggregateCommandBase.cs" />
+    <Compile Include="Aggregation\AggregateWithMaxCommand.cs" />
+    <Compile Include="Aggregation\AggregateWithMeanCommand.cs" />
+    <Compile Include="Aggregation\AggregateWithMedianCommand.cs" />
+    <Compile Include="Aggregation\AggregateWithMinCommand.cs" />
+    <Compile Include="Aggregation\AggregateWithSumCommand.cs" />
+    <Compile Include="ChangeColumnGroup\ChangeColumnCommandBase.cs" />
+    <Compile Include="ChangeColumnGroup\ChangeColumnToDoubleColumnCommand.cs" />
+    <Compile Include="ChangeColumnGroup\AddNewDoubleColumnCommand.cs" />
+    <Compile Include="ChangeColumnGroup\AddNewDateTimeColumnCommand.cs" />
+    <Compile Include="ChangeColumnGroup\ChangeColumnToStringColumnCommand.cs" />
+    <Compile Include="ChangeColumnGroup\ChangeColumnToDateTimeColumnCommand.cs" />
+    <Compile Include="ChangeColumnGroup\AddNewProgrammableColumnCommand.cs" />
+    <Compile Include="ChangeDataset\MoveColumnGroupRightCommand.cs" />
+    <Compile Include="ChangeDataset\MoveColumnGroupLeftCommand.cs" />
+    <Compile Include="MissingValues\DeleteColumnsWithMissingValuesThresholdCommand.cs" />
+    <Compile Include="MissingValues\DeleteRowsWithMissingValuesThresholdCommand.cs" />
+    <Compile Include="MissingValues\IThresholdCommand.cs" />
+    <Compile Include="TimeSeries\ChangeDateTimeColumnToDoubleColumn.cs" />
+    <Compile Include="TimeSeries\EquidistantTimeSeriesCommandBase.cs" />
+    <Compile Include="ChangeDataset\DeleteColumnGroupCommand.cs" />
+    <Compile Include="MissingValues\FillMissingValueCommandBase.cs" />
+    <Compile Include="TimeSeries\DeleteNotEquidistantRowsCommand.cs" />
+    <Compile Include="Aggregation\DeleteRowsWithDuplicateKeyValuesCommand.cs" />
+    <Compile Include="ChangeValues\DeleteRowsWithGivenValueCommand.cs" />
+    <Compile Include="MissingValues\DeleteRowsWithMissingValuesCommand.cs" />
+    <Compile Include="TimeSeries\EquidistantSamplingCommand.cs" />
+    <Compile Include="MissingValues\FillMissingValuesWithLinearInterpolation.cs" />
+    <Compile Include="MissingValues\FillMissingValuesWithMeanCommand.cs" />
+    <Compile Include="MissingValues\FillMissingValuesWithMedianCommand.cs" />
+    <Compile Include="MissingValues\FillMissingValuesWithPreviousValuesCommand.cs" />
+    <Compile Include="ChangeValues\FilterMovingAverageCommand.cs" />
+    <Compile Include="ChangeValues\FilterMovingMedianCommand.cs" />
+    <Compile Include="ChangeDataset\MergeColumnGroupsCommand.cs" />
+    <Compile Include="ChangeValues\SearchAndReplaceCommand.cs" />
+    <Compile Include="ChangeDataset\SplitColumnGroupCommand.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TimeSeries\SetPartOfDateTimeCommand.cs" />
+    <Compile Include="TimeSeries\InterpolateMissingValues.cs" />
+    <Compile Include="View\AggregationCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\AggregationCommandView.Designer.cs">
+      <DependentUpon>AggregationCommandView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\ChangeDateTimeCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\ChangeDateTimeCommandView.Designer.cs">
+      <DependentUpon>ChangeDateTimeCommandView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\BoxCoxTransformationCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\BoxCoxTransformationCommandView.Designer.cs">
+      <DependentUpon>BoxCoxTransformationCommandView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\DeleteWithThresholdView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\DeleteWithThresholdView.Designer.cs">
+      <DependentUpon>DeleteWithThresholdView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\FilterSavitzkyGolayCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\FilterSavitzkyGolayCommandView.Designer.cs">
+      <DependentUpon>FilterSavitzkyGolayCommandView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\SearchWithMatchOperationCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\SearchWithMatchOperationCommandView.Designer.cs">
+      <DependentUpon>SearchWithMatchOperationCommandView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\SearchCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\SearchCommandView.Designer.cs">
+      <DependentUpon>SearchCommandView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\LinearTransformationCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\LinearTransformationCommandView.Designer.cs">
+      <DependentUpon>LinearTransformationCommandView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\NormalDistribuationCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\NormalDistribuationCommandView.Designer.cs">
+      <DependentUpon>NormalDistribuationCommandView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\MinMaxCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\MinMaxCommandView.Designer.cs">
+      <DependentUpon>MinMaxCommandView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\ProgrammableColumnCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\ProgrammableColumnCommandView.Designer.cs">
+      <DependentUpon>ProgrammableColumnCommandView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\TimeBasedWithoutOffsetCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\TimeBasedWithoutOffsetCommandView.Designer.cs">
+      <DependentUpon>TimeBasedWithoutOffsetCommandView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\FilterCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\FilterCommandView.Designer.cs">
+      <DependentUpon>FilterCommandView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\SearchAndReplaceCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\SearchAndReplaceCommandView.Designer.cs">
+      <DependentUpon>SearchAndReplaceCommandView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\TimeBasedCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\TimeBasedCommandView.Designer.cs">
+      <DependentUpon>TimeBasedCommandView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.Data\HeuristicLab.DataImporter.Data.csproj">
+      <Project>{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}</Project>
+      <Name>HeuristicLab.DataImporter.Data</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/DeleteColumnsWithMissingValuesThresholdCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/DeleteColumnsWithMissingValuesThresholdCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/DeleteColumnsWithMissingValuesThresholdCommand.cs	(revision 15690)
@@ -0,0 +1,78 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Delete Columns beneath Threshold", 1, ColumnGroupState.AnySelectedColumnContainsNull,
+    "Handle Missing Values", Position = 6, OptionsView = typeof(DeleteWithThresholdView))]
+  public class DeleteColumnsWithMissingValuesThresholdCommand : ColumnGroupCommandWithAffectedColumnsBase, IThresholdCommand {
+    private ColumnBase oldColumn;
+    private int oldColumnIndex;
+
+    [Storable]
+    private double threshold = 0.8;
+    public double Threshold { get { return threshold; } set { threshold = value; } }
+
+    [StorableConstructor]
+    protected DeleteColumnsWithMissingValuesThresholdCommand(bool deserializing) : base(deserializing) { }
+
+    public DeleteColumnsWithMissingValuesThresholdCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override void Execute() {
+      base.Execute();
+
+      oldColumnIndex = AffectedColumns[0];
+
+      oldColumn = ColumnGroup.GetColumn(oldColumnIndex);
+      if ((double)oldColumn.NonNullValuesCount / (double)oldColumn.TotalValuesCount < Threshold) {
+        ColumnGroup.RemoveColumn(oldColumn);
+      } else {
+        oldColumn = null;
+      }
+
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      if (oldColumn != null) {
+        ColumnGroup.InsertColumn(oldColumnIndex, oldColumn);
+      }
+      oldColumn = null;
+      oldColumnIndex = -1;
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override string Description {
+      get { return "Delete columns with a missing value percentage beneath a certain threshold"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/DeleteRowsWithMissingValuesCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/DeleteRowsWithMissingValuesCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/DeleteRowsWithMissingValuesCommand.cs	(revision 15690)
@@ -0,0 +1,97 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Linq;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Delete Rows", 1, ColumnGroupState.AnySelectedColumnContainsNull,
+    "Handle Missing Values", Position = 4)]
+  public class DeleteRowsWithMissingValuesCommand : ColumnGroupCommandWithAffectedColumnsBase {
+    private List<ColumnBase> oldColumns;
+    private ICollection<int> oldSortedColumnIndices;
+
+    [StorableConstructor]
+    protected DeleteRowsWithMissingValuesCommand(bool deserializing)
+      : base(deserializing) {
+      oldColumns = new List<ColumnBase>();
+    }
+
+    public DeleteRowsWithMissingValuesCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+      oldColumns = new List<ColumnBase>();
+    }
+
+    public override void Execute() {
+      base.Execute();
+      ColumnGroup tempColumnGroup = new ColumnGroup();
+      HashSet<int> positions = new HashSet<int>();
+      ColumnBase column;
+
+      for (int col = 0; col < AffectedColumns.Length; col++) {
+        column = ColumnGroup.GetColumn(AffectedColumns[col]);
+        for (int row = 0; row < ColumnGroup.RowCount; row++) {
+          if (column.GetValue(row) == null && !positions.Contains(row))
+            positions.Add(row);
+        }
+      }
+
+      foreach (ColumnBase x in ColumnGroup.Columns) {
+        oldColumns.Add(x);
+        tempColumnGroup.AddColumn(x.CreateCopyOfColumnWithoutValues());
+      }
+
+      for (int i = 0; i < ColumnGroup.RowCount; i++)
+        if (!positions.Contains(i))
+          tempColumnGroup.AddRow(ColumnGroup.GetRow(i));
+
+      oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      for (int i = 0; i < ColumnGroup.Columns.Count(); i++) {
+        tempColumnGroup.Columns.ElementAt(i).SortOrder = ColumnGroup.GetColumn(i).SortOrder;
+        ColumnGroup.ReplaceColumn(i, tempColumnGroup.Columns.ElementAt(i));
+      }
+
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      for (int i = 0; i < ColumnGroup.Columns.Count(); i++)
+        ColumnGroup.ReplaceColumn(i, oldColumns[i]);
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      oldColumns.Clear();
+      oldSortedColumnIndices = null;
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override string Description {
+      get { return "Delete rows with missing values"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/DeleteRowsWithMissingValuesThresholdCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/DeleteRowsWithMissingValuesThresholdCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/DeleteRowsWithMissingValuesThresholdCommand.cs	(revision 15690)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Delete Rows beneath Threshold", 1, ColumnGroupState.Active,
+    "Handle Missing Values", Position = 5, OptionsView = typeof(DeleteWithThresholdView))]
+  public class DeleteRowsWithMissingValuesThresholdCommand : ColumnGroupCommandBase, IThresholdCommand {
+    private Dictionary<int, IComparable[]> deletedRows;
+
+    [Storable]
+    private double threshold = 0.8;
+    public double Threshold { get { return threshold; } set { threshold = value; } }
+
+    [StorableConstructor]
+    protected DeleteRowsWithMissingValuesThresholdCommand(bool deserializing)
+      : base(deserializing) {
+      deletedRows = new Dictionary<int, IComparable[]>();
+    }
+
+    public DeleteRowsWithMissingValuesThresholdCommand(DataSet dataSet, string columnGroupName)
+      : base(dataSet, columnGroupName) {
+      deletedRows = new Dictionary<int, IComparable[]>();
+    }
+
+    public override void Execute() {
+      base.Execute();
+      IComparable[] row;
+
+      double columnsCount = ColumnGroup.Columns.Count();
+      for (int rowInd = 0; rowInd < ColumnGroup.RowCount; rowInd++) {
+        row = ColumnGroup.GetRow(rowInd);
+        double setValues = ColumnGroup.GetRow(rowInd).Where(x => x != null).Count();
+        if (setValues / columnsCount < Threshold) {
+          deletedRows[rowInd] = row;
+        }
+      }
+
+      foreach (int rowInd in deletedRows.Select(x => x.Key).Reverse()) {
+        ColumnGroup.DeleteRow(rowInd);
+      }
+
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      foreach (KeyValuePair<int, IComparable[]> pair in deletedRows) {
+        ColumnGroup.InsertRow(pair.Key, pair.Value);
+      }
+      deletedRows.Clear();
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override string Description {
+      get { return "Delete rows with a missing value percentage beneath a certain threshold"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValueCommandBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValueCommandBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValueCommandBase.cs	(revision 15690)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  public abstract class FillMissingValueCommandBase : ColumnGroupCommandWithAffectedColumnsBase {
+    protected Dictionary<int, List<int>> nullValues;
+    protected ICollection<int> oldSortedColumnIndexes;
+    protected IEnumerable<SortOrder> oldSortOrder;
+
+    [StorableConstructor]
+    protected FillMissingValueCommandBase(bool deserializing)
+      : base(deserializing) {
+      nullValues = new Dictionary<int, List<int>>();
+    }
+
+    protected FillMissingValueCommandBase(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+      nullValues = new Dictionary<int, List<int>>();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      ColumnBase column;
+      foreach (int col in nullValues.Keys) {
+        column = ColumnGroup.GetColumn(col);
+        for (int j = 0; j < this.nullValues[col].Count; j++)
+          column.ChangeValue(this.nullValues[col][j], null);
+      }
+      ColumnGroup.SortOrdersForColumns = oldSortOrder;
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndexes;
+      oldSortedColumnIndexes = null;
+      oldSortOrder = null;
+      nullValues.Clear();
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValuesWithLinearInterpolation.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValuesWithLinearInterpolation.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValuesWithLinearInterpolation.cs	(revision 15690)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Linear Interpolation", 1, ColumnGroupState.DoubleColumnSelected | ColumnGroupState.AnySelectedColumnContainsNull,
+    "Handle Missing Values", Position = 2)]
+  public class FillMissingValuesWithLinearInterpolation : FillMissingValueCommandBase {
+    [StorableConstructor]
+    protected FillMissingValuesWithLinearInterpolation(bool deserializing) : base(deserializing) { }
+    public FillMissingValuesWithLinearInterpolation(DataSet dataSet, string columnGroupName, int[] affectedColumns) :
+      base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override string Description {
+      get { return "Interpolate missing values"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      DoubleColumn column;
+      int startIndex = -1;
+      int endIndex = -1;
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+      oldSortedColumnIndexes = new List<int>(ColumnGroup.SortedColumnIndexes);
+      foreach (int col in AffectedColumns) {
+        if (ColumnGroup.GetColumn(col) is DoubleColumn && ColumnGroup.GetColumn(col).ContainsNullValues) {
+          column = (DoubleColumn)ColumnGroup.Columns.ElementAt(col);
+          if (column.SortOrder != SortOrder.None)
+            ColumnGroup.ResetSorting();
+          nullValues.Add(col, new List<int>());
+          startIndex = FindNextNotNullValueIndex(column, startIndex);
+          endIndex = FindNextNotNullValueIndex(column, startIndex);
+          while (endIndex != -1) {
+            if (endIndex - startIndex != 1) {
+              nullValues[col].AddRange(Enumerable.Range(startIndex + 1, endIndex - startIndex - 1));
+              InterpolateValues(column, startIndex, endIndex);
+            }
+            startIndex = endIndex;
+            endIndex = FindNextNotNullValueIndex(column, endIndex);
+          }
+          startIndex = -1;
+        }
+      }
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    private int FindNextNotNullValueIndex(DoubleColumn column, int startIndex) {
+      int endIndex = -1;
+      for (int i = startIndex + 1; i < column.TotalValuesCount && endIndex == -1; i++)
+        if (column.GetValue(i) != null)
+          endIndex = i;
+      return endIndex;
+    }
+
+    private void InterpolateValues(DoubleColumn column, int startIndex, int endIndex) {
+      double startValue = (double)column.GetValue(startIndex);
+      double endValue = (double)column.GetValue(endIndex);
+      double stepwidth = (endValue - startValue) / (endIndex - startIndex);
+
+      for (int i = startIndex + 1; i < endIndex; i++) {
+        if (column.GetValue(i) != null)
+          throw new CommandExecutionException("Tried to manipulate non null value!", this);
+        column.ChangeValue(i, startValue + stepwidth * (i - startIndex));
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValuesWithMeanCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValuesWithMeanCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValuesWithMeanCommand.cs	(revision 15690)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Mean", 1, ColumnGroupState.DoubleColumnSelected | ColumnGroupState.AnySelectedColumnContainsNull,
+    "Handle Missing Values", Position = 0)]
+  public class FillMissingValuesWithMeanCommand : FillMissingValueCommandBase {
+    [StorableConstructor]
+    protected FillMissingValuesWithMeanCommand(bool deserializing) : base(deserializing) { }
+    public FillMissingValuesWithMeanCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns) :
+      base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override void Execute() {
+      base.Execute();
+      DoubleColumn column;
+      double? mean;
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+      oldSortedColumnIndexes = new List<int>(ColumnGroup.SortedColumnIndexes);
+      foreach (int col in AffectedColumns) {
+        if (ColumnGroup.GetColumn(col) is DoubleColumn && ColumnGroup.GetColumn(col).ContainsNullValues) {
+          column = (DoubleColumn)ColumnGroup.Columns.ElementAt(col);
+          if (column.SortOrder != SortOrder.None)
+            ColumnGroup.ResetSorting();
+          nullValues.Add(col, new List<int>());
+          mean = column.Mean;
+          for (int j = 0; j < column.TotalValuesCount; j++) {
+            if (column.GetValue(j) == null) {
+              column.ChangeValue(j, mean);
+              this.nullValues[col].Add(j);
+            }
+          }
+        }
+      }
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override string Description {
+      get { return "Fill missing values with mean"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValuesWithMedianCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValuesWithMedianCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValuesWithMedianCommand.cs	(revision 15690)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Median", 1, ColumnGroupState.DoubleColumnSelected | ColumnGroupState.AnySelectedColumnContainsNull,
+    "Handle Missing Values", Position = 1)]
+  public class FillMissingValuesWithMedianCommand : FillMissingValueCommandBase {
+    [StorableConstructor]
+    protected FillMissingValuesWithMedianCommand(bool deserializing) : base(deserializing) { }
+    public FillMissingValuesWithMedianCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns) :
+      base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override string Description {
+      get { return "Fill missing values with median"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      DoubleColumn column;
+      double? median;
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+      oldSortedColumnIndexes = new List<int>(ColumnGroup.SortedColumnIndexes);
+      foreach (int col in AffectedColumns) {
+        if (ColumnGroup.GetColumn(col) is DoubleColumn && ColumnGroup.GetColumn(col).ContainsNullValues) {
+          column = (DoubleColumn)ColumnGroup.Columns.ElementAt(col);
+          if (column.SortOrder != SortOrder.None)
+            ColumnGroup.ResetSorting();
+          nullValues.Add(col, new List<int>());
+          median = column.Median;
+          for (int j = 0; j < column.TotalValuesCount; j++) {
+            if (column.GetValue(j) == null) {
+              column.ChangeValue(j, median);
+              this.nullValues[col].Add(j);
+            }
+          }
+        }
+      }
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValuesWithPreviousValuesCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValuesWithPreviousValuesCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/FillMissingValuesWithPreviousValuesCommand.cs	(revision 15690)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Previous Value", 1, ColumnGroupState.AnySelectedColumnContainsNull, "Handle Missing Values", Position = 3)]
+  public class FillMissingValuesWithPreviousValuesCommand : FillMissingValueCommandBase {
+    [StorableConstructor]
+    protected FillMissingValuesWithPreviousValuesCommand(bool deserializing) : base(deserializing) { }
+    public FillMissingValuesWithPreviousValuesCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns) :
+      base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override void Execute() {
+      base.Execute();
+      IComparable val = null;
+      ColumnBase column;
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+      oldSortedColumnIndexes = new List<int>(ColumnGroup.SortedColumnIndexes);
+      foreach (int col in AffectedColumns) {
+        column = ColumnGroup.GetColumn(col);
+        if (column.ContainsNullValues) {
+          if (column.SortOrder != SortOrder.None)
+            ColumnGroup.ResetSorting();
+          nullValues.Add(col, new List<int>());
+          val = null;
+          for (int j = 0; j < column.TotalValuesCount; j++) {
+            if (column.GetValue(j) != null)
+              val = column.GetValue(j);
+            else {
+              column.ChangeValue(j, val);
+              this.nullValues[col].Add(j);
+            }
+          }
+        }
+      }
+      ColumnGroup.FireChanged();
+      ColumnGroup = null;
+    }
+
+    public override string Description {
+      get { return "Fill missing values with previous value"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/IThresholdCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/IThresholdCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/MissingValues/IThresholdCommand.cs	(revision 15690)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data.CommandBase;
+
+namespace HeuristicLab.DataImporter.Command {
+  public interface IThresholdCommand : ICommand {
+    double Threshold { get; set; }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Properties/AssemblyInfo.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Properties/AssemblyInfo.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/Properties/AssemblyInfo.cs.frame	(revision 15690)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.DataImporter.Command")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(C) 2008-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7d0840b8-3382-4b99-ab4e-5d1eb91fbec1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.$WCREV$")]
+[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/ChangeDateTimeColumnToDoubleColumn.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/ChangeDateTimeColumnToDoubleColumn.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/ChangeDateTimeColumnToDoubleColumn.cs	(revision 15690)
@@ -0,0 +1,136 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Change DateTimeColumn to DoubleColumn", 1, ColumnGroupState.DateTimeColumnSelected, "Time Series",
+Position = 5, OptionsView = typeof(ChangeDateTimeCommandView))]
+  public class ChangeDateTimeColumnToDoubleColumn : ColumnGroupCommandWithAffectedColumnsBase {
+    private List<ColumnBase> newColumns;
+    private List<ColumnBase> oldColumns;
+    private List<int> positions;
+    private ICollection<int> oldSortedColumnIndexes;
+    private IEnumerable<SortOrder> oldSortOrder;
+
+    [StorableConstructor]
+    protected ChangeDateTimeColumnToDoubleColumn(bool deserializing)
+      : base(deserializing) {
+      newColumns = new List<ColumnBase>();
+      oldColumns = new List<ColumnBase>();
+      positions = new List<int>();
+    }
+
+    public ChangeDateTimeColumnToDoubleColumn(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+      newColumns = new List<ColumnBase>();
+      oldColumns = new List<ColumnBase>();
+      positions = new List<int>();
+    }
+
+    public override string Description {
+      get { return "Changes the date values to double by substracting from a given date and converting the result to the given unit."; }
+    }
+
+    [Storable]
+    private DateTimeSpan frequency;
+    public DateTimeSpan Frequency {
+      get { return this.frequency; }
+      set { this.frequency = value; }
+    }
+
+    [Storable]
+    private DateTime startTime;
+    public DateTime StartTime {
+      get { return this.startTime; }
+      set { this.startTime = value; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+      oldSortedColumnIndexes = new List<int>(ColumnGroup.SortedColumnIndexes);
+
+      DateTimeColumn oldColumn;
+      DoubleColumn newColumn;
+      DateTime? value;
+      double newValue;
+      for (int j = 0; j < AffectedColumns.Length; j++) {
+        oldColumn = (DateTimeColumn)ColumnGroup.Columns.ElementAt(AffectedColumns[j]);
+        positions.Add(AffectedColumns[j]);
+        oldColumns.Add(oldColumn);
+
+        newColumn = new DoubleColumn(oldColumn.Name, oldColumn.TotalValuesCount);
+        for (int i = 0; i < oldColumn.TotalValuesCount; i++) {
+          value = (DateTime?)oldColumn.GetValue(i);
+          if (!value.HasValue)
+            newColumn.AddValue(null);
+          else {
+            TimeSpan elapsedTime = value.Value - startTime;
+            if (frequency.Seconds == 1)
+              newValue = elapsedTime.TotalSeconds;
+            else if (frequency.Minutes == 1)
+              newValue = elapsedTime.TotalMinutes;
+            else if (frequency.Hours == 1)
+              newValue = elapsedTime.TotalHours;
+            else if (frequency.Days == 1)
+              newValue = elapsedTime.TotalDays;
+            else
+              throw new CommandExecutionException("Unit for ChangeDateTimeColumnToDoubleColumn not correclty set.", this);
+            newColumn.AddValue(newValue);
+          }
+        }
+        newColumns.Add(newColumn);
+      }
+
+      for (int i = 0; i < positions.Count; i++)
+        ColumnGroup.ReplaceColumn(positions[i], newColumns[i]);
+      ColumnGroup.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+
+      for (int i = 0; i < positions.Count; i++)
+        ColumnGroup.ReplaceColumn(positions[i], oldColumns[i]);
+
+      ColumnGroup.SortOrdersForColumns = oldSortOrder;
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndexes;
+      oldSortedColumnIndexes = null;
+      oldSortOrder = null;
+      oldColumns.Clear();
+      newColumns.Clear();
+      positions.Clear();
+
+      ColumnGroup.FireChanged();
+    }
+
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/DeleteNotEquidistantRowsCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/DeleteNotEquidistantRowsCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/DeleteNotEquidistantRowsCommand.cs	(revision 15690)
@@ -0,0 +1,115 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Delete not equidistant rows", 1, ColumnGroupState.Sorted, "Time Series",
+Position = 1, OptionsView = typeof(TimeBasedCommandView))]
+  public class DeleteNotEquidistantRowsCommand : EquidistantTimeSeriesCommandBase {
+    private DateTimeColumn columnToSample;
+    private List<ColumnBase> oldColumns;
+    private ICollection<int> oldSortedColumnIndices;
+    private IEnumerable<SortOrder> oldSortOrder;
+
+    [StorableConstructor]
+    protected DeleteNotEquidistantRowsCommand(bool deserializing)
+      : base(deserializing) {
+      oldColumns = new List<ColumnBase>();
+    }
+
+    public DeleteNotEquidistantRowsCommand(DataSet dataSet, string columnGroupName)
+      : base(dataSet, columnGroupName) {
+      oldColumns = new List<ColumnBase>();
+    }
+
+    public override string Description {
+      get { return "Delete not equidistant rows"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      if (!(ColumnGroup.GetColumn(ColumnGroup.SortedColumnIndexes.ElementAt(0)) is DateTimeColumn)
+        || ColumnGroup.SortedColumnIndexes.Count != 1)
+        throw new CommandExecutionException("ColumnGroup must be sorted after a datetime column.", this);
+      columnToSample = (DateTimeColumn)ColumnGroup.GetColumn(ColumnGroup.SortedColumnIndexes.ElementAt(0));
+      if (columnToSample.SortOrder != SortOrder.Ascending)
+        throw new CommandExecutionException("ColumnGroup must be sorted ascending after the selected datetime column.", this);
+      if (columnToSample.ContainsNullValues)
+        throw new CommandExecutionException("The datetime column must not contain null values.", this);
+
+      oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+
+      DateTime value;
+      DateTime actPoint = StartTime;
+      ColumnGroup tempColumnGroup = new ColumnGroup();
+      List<int> positions = new List<int>();
+
+      for (int i = 0; i < ColumnGroup.RowCount; i++) {
+        value = (DateTime)columnToSample.GetValue(i);
+        while (actPoint < value)
+          actPoint += SampleFrequency;
+        if (actPoint == value) {
+          positions.Add(i);
+        }
+      }
+
+      foreach (ColumnBase x in ColumnGroup.Columns) {
+        oldColumns.Add(x);
+        tempColumnGroup.AddColumn(x.CreateCopyOfColumnWithoutValues());
+      }
+
+      for (int i = 0; i < positions.Count; i++)
+        tempColumnGroup.AddRow(ColumnGroup.GetRow(positions[i]));
+
+      for (int i = 0; i < ColumnGroup.Columns.Count(); i++)
+        ColumnGroup.ReplaceColumn(i, tempColumnGroup.Columns.ElementAt(i));
+
+      ColumnGroup.SortOrdersForColumns = oldSortOrder;
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      for (int i = 0; i < ColumnGroup.Columns.Count(); i++)
+        ColumnGroup.ReplaceColumn(i, oldColumns[i]);
+      ColumnGroup.SortOrdersForColumns = oldSortOrder;
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      oldSortedColumnIndices = null;
+      oldSortOrder = null;
+      oldColumns.Clear();
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/EquidistantSamplingCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/EquidistantSamplingCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/EquidistantSamplingCommand.cs	(revision 15690)
@@ -0,0 +1,96 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Equidistant Sampling", 1, ColumnGroupState.Sorted, "Time Series",
+Position = 0, OptionsView = typeof(TimeBasedCommandView))]
+  public class EquidistantSamplingCommand : EquidistantTimeSeriesCommandBase {
+    private List<int> insertedRows;
+    private DateTimeColumn columnToSample;
+
+    [StorableConstructor]
+    protected EquidistantSamplingCommand(bool deserializing) : base(deserializing) { }
+    public EquidistantSamplingCommand(DataSet dataSet, string columnGroupName)
+      : base(dataSet, columnGroupName) {
+    }
+
+    public override string Description {
+      get { return "Equidistant Sampling"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      if (!(ColumnGroup.GetColumn(ColumnGroup.SortedColumnIndexes.ElementAt(0)) is DateTimeColumn)
+    || ColumnGroup.SortedColumnIndexes.Count != 1)
+        throw new CommandExecutionException("ColumnGroup mus be sorted a the datetime column.", this);
+
+      columnToSample = (DateTimeColumn)ColumnGroup.GetColumn(ColumnGroup.SortedColumnIndexes.ElementAt(0));
+      if (columnToSample.SortOrder != SortOrder.Ascending)
+        throw new CommandExecutionException("ColumnGroup must be sorted ascending after the selected datetime column.", this);
+      if (columnToSample.ContainsNullValues)
+        throw new CommandExecutionException("The datetime column must not contain null values.", this);
+
+      for (int i = 1; i < columnToSample.TotalValuesCount; i++) {
+        if (columnToSample.GetValue(i) == columnToSample.GetValue(i - 1))
+          throw new CommandExecutionException("The datetime column must not contain duplicate values.", this);
+      }
+
+      insertedRows = new List<int>();
+      DateTime actPoint = StartTime;
+      int j = 0;
+      IComparable[] row;
+      while (j < columnToSample.TotalValuesCount &&
+        actPoint <= ((DateTime)columnToSample.GetValue(columnToSample.TotalValuesCount - 1)) + SampleFrequency) {
+        if (actPoint < (DateTime)columnToSample.GetValue(j)) {
+          row = ColumnGroup.GetEmptyRow();
+          row[ColumnGroup.SortedColumnIndexes.ElementAt(0)] = actPoint;
+          ColumnGroup.InsertRow(j, row);
+          actPoint = actPoint + SampleFrequency;
+          insertedRows.Add(j);
+        } else if (actPoint == (DateTime)columnToSample.GetValue(j))
+          actPoint = actPoint + SampleFrequency;
+        j++;
+      }
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      for (int i = insertedRows.Count - 1; i >= 0; i--)
+        ColumnGroup.DeleteRow(insertedRows[i]);
+      insertedRows.Clear();
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/EquidistantTimeSeriesCommandBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/EquidistantTimeSeriesCommandBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/EquidistantTimeSeriesCommandBase.cs	(revision 15690)
@@ -0,0 +1,51 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  public abstract class EquidistantTimeSeriesCommandBase : ColumnGroupCommandBase {
+    [StorableConstructor]
+    protected EquidistantTimeSeriesCommandBase(bool deserializing) : base(deserializing) { }
+    public EquidistantTimeSeriesCommandBase(DataSet dataSet, string columnGroupName)
+      : base(dataSet, columnGroupName) {
+    }
+
+    [Storable]
+    private DateTimeSpan sampleFrequency;
+    public DateTimeSpan SampleFrequency {
+      get { return this.sampleFrequency; }
+      set { this.sampleFrequency = value; }
+    }
+
+    [Storable]
+    private DateTime startTime;
+    public DateTime StartTime {
+      get { return this.startTime; }
+      set { this.startTime = value; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/FuzzyLinkColumnGroupsCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/FuzzyLinkColumnGroupsCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/FuzzyLinkColumnGroupsCommand.cs	(revision 15690)
@@ -0,0 +1,138 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfo("Fuzzy-link ColumnGroups", 2, ColumnGroupState.Sorted, "Time Series", Position = 4)]
+  public class FuzzyLinkColumnGroupsCommand : DataSetCommandWithAffectedColumnGroupsBase {
+    private ColumnGroup newColumnGroup;
+    private ColumnGroup oldColumnGroup;
+    private int removePos;
+
+    private FuzzyLinkColumnGroupsCommand()
+      : base(null, null) {
+    }
+
+    public FuzzyLinkColumnGroupsCommand(DataSet dataSet, List<string> affectedColumnGroups)
+      : base(dataSet, affectedColumnGroups) {
+    }
+
+    //IMPORTANT this method has not been tested and therefore it is not guaranteed that it works as expected
+    public override void Execute() {
+      if (AffectedColumnGroupNames.Count != 2)
+        throw new CommandExecutionException("This command only works if excatly two column groups are activated.", this);
+      ColumnGroup leftColumnGroup = this.DataSet.GetColumnGroup(AffectedColumnGroupNames[0]);
+      ColumnGroup rightColumnGroup = this.DataSet.GetColumnGroup(AffectedColumnGroupNames[1]);
+      int leftIndex = this.DataSet.IndexOfColumnGroup(leftColumnGroup);
+      int rightIndex = this.DataSet.IndexOfColumnGroup(rightColumnGroup);
+
+      this.oldColumnGroup = rightColumnGroup;
+      this.removePos = rightIndex;
+
+      if (leftColumnGroup.SortedColumnsCount != 2 || rightColumnGroup.SortedColumnsCount != 2)
+        throw new CommandExecutionException("Both ColumnGroups must be sorted by exactly two columns.", this);
+
+      if (leftColumnGroup.SortOrdersForColumns.ElementAt(leftColumnGroup.SortedColumnIndexes.ElementAt(0)) !=
+          rightColumnGroup.SortOrdersForColumns.ElementAt(rightColumnGroup.SortedColumnIndexes.ElementAt(0)) ||
+          leftColumnGroup.SortOrdersForColumns.ElementAt(leftColumnGroup.SortedColumnIndexes.ElementAt(1)) !=
+          rightColumnGroup.SortOrdersForColumns.ElementAt(rightColumnGroup.SortedColumnIndexes.ElementAt(1)) ||
+          leftColumnGroup.SortOrdersForColumns.ElementAt(leftColumnGroup.SortedColumnIndexes.ElementAt(0)) != SortOrder.Ascending ||
+          leftColumnGroup.SortOrdersForColumns.ElementAt(leftColumnGroup.SortedColumnIndexes.ElementAt(1)) != SortOrder.Ascending
+        )
+        throw new CommandExecutionException("Both ColumnGroups must be sorted in the same direction and ascending.", this);
+
+      foreach (int sortColIndex in leftColumnGroup.SortedColumnIndexes) {
+        if (leftColumnGroup.Columns.ElementAt(sortColIndex).ContainsNullValues)
+          throw new CommandExecutionException("KeyColumns must not contain null values.", this);
+      }
+      foreach (int sortColIndex in rightColumnGroup.SortedColumnIndexes) {
+        if (rightColumnGroup.Columns.ElementAt(sortColIndex).ContainsNullValues)
+          throw new CommandExecutionException("KeyColumns must not contain null values.", this);
+      }
+      FuzzyLinkColumnGroups(leftColumnGroup, rightColumnGroup);
+
+      DataSet.ReplaceColumnGroup(removePos, newColumnGroup);
+      DataSet.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      DataSet.ReplaceColumnGroup(removePos, oldColumnGroup);
+      DataSet.FireChanged();
+    }
+
+
+    public void FuzzyLinkColumnGroups(ColumnGroup left, ColumnGroup right) {
+      ColumnBase keyColumn1 = left.Columns.ElementAt(left.SortedColumnIndexes.ElementAt(0));
+      ColumnBase keyColumn2 = right.Columns.ElementAt(right.SortedColumnIndexes.ElementAt(0));
+      ColumnBase fuzzyKeyColumn1 = left.Columns.ElementAt(left.SortedColumnIndexes.ElementAt(1));
+      ColumnBase fuzzyKeyColumn2 = right.Columns.ElementAt(right.SortedColumnIndexes.ElementAt(1));
+
+      this.newColumnGroup = new ColumnGroup(right.Name);
+      foreach (ColumnBase col in right.Columns)
+        newColumnGroup.AddColumn(col.CreateCopyOfColumnWithoutValues());
+
+      // FOR NOW WE ASSERT THAT SORT ORDER IS ASCENDING
+      //int keyCompareDirection = this.oldColumnGroup1.SortOrdersForColumns.ElementAt(oldColumnGroup1.SortedColumnIndices.ElementAt(0))
+      //  == SortOrder.Ascending ? -1 : +1;
+      //int fuzzyKeyCompareDirection = this.oldColumnGroup1.SortOrdersForColumns.ElementAt(oldColumnGroup1.SortedColumnIndices.ElementAt(1))
+      //  == SortOrder.Ascending ? -1 : +1;
+
+      IComparable[] row2;
+      int[] firstMatchingColumn = new int[left.RowCount];
+      int j = 0;
+      // for all keys on left side fuzzy link to right side
+      // first pass find indices of last rows on the right side with matching keys
+      for (int i = 0; i < left.RowCount; i++) {
+        // skip on the right side while the right side key is smaller than the left side key
+        while (j < right.RowCount && keyColumn1.GetValue(i).CompareTo(keyColumn2.GetValue(j)) > 0) {
+          j++;
+        }
+        // store the first j with the same key
+        if (j < right.RowCount && keyColumn1.GetValue(i).CompareTo(keyColumn2.GetValue(j)) == 0) {
+          firstMatchingColumn[i] = j;
+        } else {
+          firstMatchingColumn[i] = -1;
+        }
+      }
+      // second pass to find the best fuzzy link (=same or next smaller value)
+      j = firstMatchingColumn[0];
+      for (int i = 0; i < left.RowCount; i++) {
+        if (keyColumn1.GetValue(i).CompareTo(keyColumn2.GetValue(j)) != 0) j = firstMatchingColumn[i];
+        if (j < 0) {
+          // no matching key => add an empty row
+          newColumnGroup.AddRow(right.GetEmptyRow());
+        } else {
+          int bestMatch = j;
+          // go forward while the fuzzy key on the right is smaller than or equal to the fuzzy key on the left
+          while (j < right.RowCount &&
+            keyColumn1.GetValue(i).CompareTo(keyColumn2.GetValue(j)) == 0 &&
+            fuzzyKeyColumn1.GetValue(i).CompareTo(fuzzyKeyColumn2.GetValue(j)) >= 0) {
+            bestMatch = j;
+            j++;
+          }
+          // invariant: j = right.RowCount OR best fuzzy-link = fuzzyKeyColumn2(bestMatch)
+          // if we found a match take that row and otherwise use the empty row
+          if (keyColumn1.GetValue(i).CompareTo(keyColumn2.GetValue(bestMatch)) == 0 &&
+            fuzzyKeyColumn1.GetValue(i).CompareTo(fuzzyKeyColumn2.GetValue(bestMatch)) >= 0) {
+            row2 = right.GetRow(bestMatch);
+            j = bestMatch;
+          } else {
+            row2 = right.GetEmptyRow();
+          }
+          newColumnGroup.AddRow(row2);
+        }
+      }
+    }
+
+    public override string Description {
+      get { return "Fuzzy-link column groups"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/InterpolateMissingValues.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/InterpolateMissingValues.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/InterpolateMissingValues.cs	(revision 15690)
@@ -0,0 +1,109 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Interpolate Missing Values", 1, ColumnGroupState.Sorted | ColumnGroupState.DoubleColumnSelected, "Time Series",
+Position = 2)]
+  public class InterpolateMissingValues : FillMissingValueCommandBase {
+    private DateTimeColumn columnToSample;
+
+    [StorableConstructor]
+    protected InterpolateMissingValues(bool deserializing) : base(deserializing) { }
+    public InterpolateMissingValues(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    public override string Description {
+      get { return "Interpolate Missing Values"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      if (!(ColumnGroup.GetColumn(ColumnGroup.SortedColumnIndexes.ElementAt(0)) is DateTimeColumn)
+   || ColumnGroup.SortedColumnIndexes.Count != 1)
+        throw new CommandExecutionException("ColumnGroup must be sorted after a datetime column.", this);
+      columnToSample = (DateTimeColumn)ColumnGroup.Columns.ElementAt(ColumnGroup.SortedColumnIndexes.ElementAt(0));
+      if (columnToSample.SortOrder != SortOrder.Ascending)
+        throw new CommandExecutionException("ColumnGroup must be sorted ascending by the datetime column.", this);
+      if (columnToSample.ContainsNullValues)
+        throw new CommandExecutionException("The datetime column must not contain null values.", this);
+
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+      oldSortedColumnIndexes = new List<int>(ColumnGroup.SortedColumnIndexes);
+      DoubleColumn column;
+      int startIndex = -1;
+      int endIndex = -1;
+      foreach (int col in AffectedColumns) {
+        if (ColumnGroup.GetColumn(col) is DoubleColumn && ColumnGroup.GetColumn(col).ContainsNullValues) {
+          column = (DoubleColumn)ColumnGroup.Columns.ElementAt(col);
+          nullValues.Add(col, new List<int>());
+          startIndex = FindNextNotNullValueIndex(column, startIndex);
+          endIndex = FindNextNotNullValueIndex(column, startIndex);
+          while (endIndex != -1) {
+            if (endIndex - startIndex != 1) {
+              nullValues[col].AddRange(Enumerable.Range(startIndex + 1, endIndex - startIndex - 1));
+              InterpolateValues(column, startIndex, endIndex);
+            }
+            startIndex = endIndex;
+            endIndex = FindNextNotNullValueIndex(column, endIndex);
+          }
+          startIndex = -1;
+        }
+      }
+      ColumnGroup.FireChanged();
+      columnToSample = null;
+      this.ColumnGroup = null;
+    }
+
+    private int FindNextNotNullValueIndex(DoubleColumn column, int startIndex) {
+      int endIndex = -1;
+      for (int i = startIndex + 1; i < column.TotalValuesCount && endIndex == -1; i++)
+        if (column.GetValue(i) != null)
+          endIndex = i;
+      return endIndex;
+    }
+
+    private void InterpolateValues(DoubleColumn column, int startIndex, int endIndex) {
+      double startValue = (double)column.GetValue(startIndex);
+      double endValue = (double)column.GetValue(endIndex);
+      DateTime start = (DateTime)columnToSample.GetValue(startIndex);
+      DateTime end = (DateTime)columnToSample.GetValue(endIndex);
+
+      for (int i = startIndex + 1; i < endIndex; i++) {
+        if (column.GetValue(i) != null)
+          throw new CommandExecutionException("Tried to manipulate non null value.", this);
+        column.ChangeValue(i, ((double)(((DateTime)columnToSample.GetValue(i) - start).TotalSeconds / (end - start).TotalSeconds)) *
+          (endValue - startValue) + startValue);
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/SetPartOfDateTimeCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/SetPartOfDateTimeCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/TimeSeries/SetPartOfDateTimeCommand.cs	(revision 15690)
@@ -0,0 +1,105 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.DataImporter.Command.View;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Command {
+  [StorableClass]
+  [ViewableCommandInfoAttribute("Set Part of DateTime", 1, ColumnGroupState.DateTimeColumnSelected, "Time Series",
+Position = 2, SelectedColumns = 1, OptionsView = typeof(TimeBasedWithoutOffsetCommandView))]
+  public class SetPartOfDateTimeCommand : ColumnGroupCommandWithAffectedColumnsBase {
+    private DateTimeColumn oldColumn;
+    private ICollection<int> oldSortedColumnIndices;
+    private IEnumerable<SortOrder> oldSortOrder;
+
+    [StorableConstructor]
+    protected SetPartOfDateTimeCommand(bool deserializing) : base(deserializing) { }
+    public SetPartOfDateTimeCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+    }
+
+    [Storable]
+    private DateTimeSpan dateTimePart;
+    public DateTimeSpan DateTimePart {
+      get { return this.dateTimePart; }
+      set { this.dateTimePart = value; }
+    }
+
+    public override string Description {
+      get { return "Set specific part of datetime"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      oldColumn = (DateTimeColumn)ColumnGroup.GetColumn(AffectedColumns[0]);
+      DateTimeColumn newColumn = (DateTimeColumn)oldColumn.CreateCopyOfColumnWithoutValues();
+      DateTime? value;
+      DateTimeSpan newValue;
+      oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+
+      for (int i = 0; i < oldColumn.TotalValuesCount; i++) {
+        newValue = (DateTimeSpan)dateTimePart.Clone();
+        value = (DateTime?)oldColumn.GetValue(i);
+        if (value != null) {
+          if (newValue.Seconds == -1)
+            newValue.Seconds = value.Value.Second;
+          if (newValue.Minutes == -1)
+            newValue.Minutes = value.Value.Minute;
+          if (newValue.Hours == -1)
+            newValue.Hours = value.Value.Hour;
+          if (newValue.Days == -1)
+            newValue.Days = value.Value.Day;
+          if (newValue.Months == -1)
+            newValue.Months = value.Value.Month;
+          if (newValue.Years == -1)
+            newValue.Years = value.Value.Year;
+
+          newColumn.AddValue(new DateTime(newValue.Years, newValue.Months, newValue.Days, newValue.Hours, newValue.Minutes, newValue.Seconds));
+        } else
+          newColumn.AddValue(null);
+      }
+      ColumnGroup.ReplaceColumn(AffectedColumns[0], newColumn);
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      ColumnGroup.ReplaceColumn(AffectedColumns[0], oldColumn);
+      ColumnGroup.SortOrdersForColumns = oldSortOrder;
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      oldSortedColumnIndices = null;
+      oldSortOrder = null;
+      oldColumn = null;
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/AggregationCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/AggregationCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/AggregationCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class AggregationCommandView {
+    /// <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.chbChangeNullValues = new System.Windows.Forms.CheckBox();
+      this.SuspendLayout();
+      // 
+      // chbChangeNullValues
+      // 
+      this.chbChangeNullValues.AutoSize = true;
+      this.chbChangeNullValues.Checked = true;
+      this.chbChangeNullValues.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.chbChangeNullValues.Location = new System.Drawing.Point(19, 12);
+      this.chbChangeNullValues.Name = "chbChangeNullValues";
+      this.chbChangeNullValues.Size = new System.Drawing.Size(138, 17);
+      this.chbChangeNullValues.TabIndex = 0;
+      this.chbChangeNullValues.Text = "Change only null values";
+      this.chbChangeNullValues.UseVisualStyleBackColor = true;
+      this.chbChangeNullValues.CheckedChanged += new System.EventHandler(chbChangeNullValues_CheckedChanged);
+      // 
+      // AggregationCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.chbChangeNullValues);
+      this.Name = "AggregationCommandView";
+      this.Size = new System.Drawing.Size(176, 41);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+    }
+    #endregion
+
+    private System.Windows.Forms.CheckBox chbChangeNullValues;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/AggregationCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/AggregationCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/AggregationCommandView.cs	(revision 15690)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class AggregationCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    private AggregationCommandView()
+      : base() {
+      InitializeComponent();
+    }
+
+    public AggregationCommandView(AggregateCommandBase command)
+      : this() {
+      this.Command = command;
+    }
+
+    public new AggregateCommandBase Command {
+      get { return (AggregateCommandBase)base.Command; }
+      protected set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    public bool ChangeNullValueOnly {
+      get { return this.Command.ChangeNullValueOnly; }
+    }
+
+    private void chbChangeNullValues_CheckedChanged(object sender, System.EventArgs e) {
+      this.UpdateCommand();
+    }
+
+    private void UpdateCommand() {
+      if (this.Command != null)
+        this.Command.ChangeNullValueOnly = this.chbChangeNullValues.Checked;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/BoxCoxTransformationCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/BoxCoxTransformationCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/BoxCoxTransformationCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,110 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class BoxCoxTransformationCommandView {
+    /// <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.label2 = new System.Windows.Forms.Label();
+      this.txtLambda = new System.Windows.Forms.TextBox();
+      this.txtC = new System.Windows.Forms.TextBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // label2
+      // 
+      this.label2.Location = new System.Drawing.Point(8, 11);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(48, 13);
+      this.label2.TabIndex = 2;
+      this.label2.Text = "Lambda";
+      // 
+      // txtLambda
+      // 
+      this.txtLambda.Location = new System.Drawing.Point(62, 8);
+      this.txtLambda.Name = "txtLambda";
+      this.txtLambda.Size = new System.Drawing.Size(100, 20);
+      this.txtLambda.TabIndex = 1;
+      this.txtLambda.Text = "0";
+      this.txtLambda.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // txtC
+      // 
+      this.txtC.Location = new System.Drawing.Point(62, 34);
+      this.txtC.Name = "txtC";
+      this.txtC.Size = new System.Drawing.Size(100, 20);
+      this.txtC.TabIndex = 3;
+      this.txtC.Text = "1";
+      // 
+      // label1
+      // 
+      this.label1.Location = new System.Drawing.Point(8, 37);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(48, 13);
+      this.label1.TabIndex = 4;
+      this.label1.Text = "C";
+      // 
+      // BoxCoxTransformationCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoSize = true;
+      this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.Controls.Add(this.txtC);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.txtLambda);
+      this.Controls.Add(this.label2);
+      this.Name = "BoxCoxTransformationCommandView";
+      this.Padding = new System.Windows.Forms.Padding(5);
+      this.Size = new System.Drawing.Size(170, 62);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox txtLambda;
+    private System.Windows.Forms.TextBox txtC;
+    private System.Windows.Forms.Label label1;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/BoxCoxTransformationCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/BoxCoxTransformationCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/BoxCoxTransformationCommandView.cs	(revision 15690)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class BoxCoxTransformationCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    private BoxCoxTransformationCommandView() {
+      InitializeComponent();
+    }
+
+    public BoxCoxTransformationCommandView(BoxCoxTransformationCommand command)
+      : this() {
+      this.Command = command;
+    }
+
+    public new BoxCoxTransformationCommand Command {
+      get { return (BoxCoxTransformationCommand)base.Command; }
+      set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    public double Lambda {
+      get { return this.Command.Lambda; }
+    }
+    public double C {
+      get { return this.Command.C; }
+    }
+
+    private void textBox_Validating(object sender, CancelEventArgs e) {
+      TextBox textBox = (TextBox)sender;
+      double value;
+      if (!double.TryParse(textBox.Text, out value)) {
+        e.Cancel = true;
+        MessageBox.Show("A numeric value must be entered!");
+      } else
+        this.UpdateCommand();
+    }
+
+    private void UpdateCommand() {
+      if (this.Command != null) {
+        double value;
+        if (double.TryParse(this.txtLambda.Text, out value))
+          this.Command.Lambda = value;
+        if (double.TryParse(this.txtC.Text, out value)) {
+          this.Command.C = value;
+        }
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ChangeDateTimeCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ChangeDateTimeCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ChangeDateTimeCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,115 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class ChangeDateTimeCommandView {
+    /// <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.cmbUnit = new System.Windows.Forms.ComboBox();
+      this.txtStartTime = new System.Windows.Forms.TextBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // cmbUnit
+      // 
+      this.cmbUnit.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.cmbUnit.FormattingEnabled = true;
+      this.cmbUnit.Items.AddRange(new object[] {
+            "Seconds",
+            "Minutes",
+            "Hours",
+            "Days"});
+      this.cmbUnit.Location = new System.Drawing.Point(38, 29);
+      this.cmbUnit.Name = "cmbUnit";
+      this.cmbUnit.Size = new System.Drawing.Size(188, 21);
+      this.cmbUnit.TabIndex = 2;
+      this.cmbUnit.SelectedIndexChanged += new System.EventHandler(this.cmbUnit_SelectedIndexChanged);
+      // 
+      // txtStartTime
+      // 
+      this.txtStartTime.Location = new System.Drawing.Point(38, 3);
+      this.txtStartTime.Name = "txtStartTime";
+      this.txtStartTime.Size = new System.Drawing.Size(188, 20);
+      this.txtStartTime.TabIndex = 0;
+      this.txtStartTime.Validating += new System.ComponentModel.CancelEventHandler(this.txtStartTime_Validating);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 6);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(29, 13);
+      this.label1.TabIndex = 3;
+      this.label1.Text = "Start";
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(3, 32);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(26, 13);
+      this.label2.TabIndex = 4;
+      this.label2.Text = "Unit";
+      // 
+      // ChangeDateTimeCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.txtStartTime);
+      this.Controls.Add(this.cmbUnit);
+      this.Name = "ChangeDateTimeCommandView";
+      this.Size = new System.Drawing.Size(235, 59);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ComboBox cmbUnit;
+    private System.Windows.Forms.TextBox txtStartTime;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ChangeDateTimeCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ChangeDateTimeCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ChangeDateTimeCommandView.cs	(revision 15690)
@@ -0,0 +1,100 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class ChangeDateTimeCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    private ChangeDateTimeCommandView() {
+      InitializeComponent();
+      cmbUnit.SelectedIndex = 0;
+      startTime = new DateTime(1900, 1, 1);
+      txtStartTime.Text = startTime.ToString();
+      UpdateCommand();
+    }
+
+    public ChangeDateTimeCommandView(ChangeDateTimeColumnToDoubleColumn command)
+      : this() {
+      this.Command = command;
+    }
+
+    public new ChangeDateTimeColumnToDoubleColumn Command {
+      get { return (ChangeDateTimeColumnToDoubleColumn)base.Command; }
+      set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    private DateTimeSpan frequency;
+    public DateTimeSpan Frequency {
+      get { return this.frequency; }
+    }
+
+    private DateTime startTime;
+    public DateTime StartTime {
+      get { return this.startTime; }
+    }
+
+    private void UpdateCommand() {
+      if(this.Command != null) {
+        this.Command.StartTime = this.startTime;
+        this.Command.Frequency = this.Frequency;
+      }
+    }
+
+    private void txtStartTime_Validating(object sender, CancelEventArgs e) {
+      if (!DateTime.TryParse(txtStartTime.Text, out startTime)) {
+        e.Cancel = true;
+        MessageBox.Show("A date value must be entered (e.g. " + DateTime.Now.ToString() + ").");
+      } else
+        this.UpdateCommand();
+    }
+
+    private void cmbUnit_SelectedIndexChanged(object sender, EventArgs e) {
+      CalculateNewFrequency();
+    }
+
+    private void CalculateNewFrequency() {
+      frequency = new DateTimeSpan();
+      switch (cmbUnit.SelectedIndex) {
+        case 0:
+          frequency.Seconds = 1;
+          break;
+        case 1:
+          frequency.Minutes = 1;
+          break;
+        case 2:
+          frequency.Hours = 1;
+          break;
+        case 3:
+          frequency.Days = 1;
+          break;
+      }
+      this.UpdateCommand();
+    }
+    
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/DeleteWithThresholdView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/DeleteWithThresholdView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/DeleteWithThresholdView.Designer.cs	(revision 15690)
@@ -0,0 +1,67 @@
+﻿namespace HeuristicLab.DataImporter.Command.View {
+  partial class DeleteWithThresholdView {
+    /// <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.txtThreshold = new System.Windows.Forms.TextBox();
+      this.lblThreshold = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // txtThreshold
+      // 
+      this.txtThreshold.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtThreshold.Location = new System.Drawing.Point(66, 3);
+      this.txtThreshold.Name = "txtThreshold";
+      this.txtThreshold.Size = new System.Drawing.Size(100, 20);
+      this.txtThreshold.TabIndex = 0;
+      this.txtThreshold.Validating += new System.ComponentModel.CancelEventHandler(this.txtThreshold_Validating);
+      // 
+      // lblThreshold
+      // 
+      this.lblThreshold.AutoSize = true;
+      this.lblThreshold.Location = new System.Drawing.Point(3, 6);
+      this.lblThreshold.Name = "lblThreshold";
+      this.lblThreshold.Size = new System.Drawing.Size(57, 13);
+      this.lblThreshold.TabIndex = 1;
+      this.lblThreshold.Text = "Threshold:";
+      // 
+      // DeleteWithThreshold
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.lblThreshold);
+      this.Controls.Add(this.txtThreshold);
+      this.Name = "DeleteWithThreshold";
+      this.Size = new System.Drawing.Size(173, 28);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox txtThreshold;
+    private System.Windows.Forms.Label lblThreshold;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/DeleteWithThresholdView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/DeleteWithThresholdView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/DeleteWithThresholdView.cs	(revision 15690)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Windows.Forms;
+using HeuristicLab.DataImporter.Data.CommandBase;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class DeleteWithThresholdView : CommandViewBase {
+    public DeleteWithThresholdView() {
+      InitializeComponent();
+    }
+
+    public DeleteWithThresholdView(IThresholdCommand command)
+      : this() {
+      if (command != null) {
+        threshold = command.Threshold;
+        txtThreshold.Text = command.Threshold.ToString();
+      }
+      this.Command = command;
+    }
+
+    public new IThresholdCommand Command {
+      get { return (IThresholdCommand)base.Command; }
+      set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    private double threshold;
+
+    private void txtThreshold_Validating(object sender, System.ComponentModel.CancelEventArgs e) {
+      TextBox textBox = (TextBox)sender;
+      e.Cancel = !Double.TryParse(textBox.Text, out threshold);
+      e.Cancel = e.Cancel || threshold < 0.0 || threshold > 1.0;
+      if (e.Cancel) {
+        MessageBox.Show("Threshold has to be between 0.0 and 1.0");
+      } else {
+        UpdateCommand();
+      }
+    }
+
+    private void UpdateCommand() {
+      if (this.Command != null) {
+        Command.Threshold = this.threshold;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/FilterCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/FilterCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/FilterCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class FilterCommandView {
+    /// <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.numWindowSize = new System.Windows.Forms.NumericUpDown();
+      this.label1 = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.numWindowSize)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // numWindowSize
+      // 
+      this.numWindowSize.Location = new System.Drawing.Point(83, 8);
+      this.numWindowSize.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.numWindowSize.Name = "numWindowSize";
+      this.numWindowSize.Size = new System.Drawing.Size(120, 20);
+      this.numWindowSize.TabIndex = 0;
+      this.numWindowSize.Value = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.numWindowSize.ValueChanged += new System.EventHandler(numWindowSize_ValueChanged);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(8, 10);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(69, 13);
+      this.label1.TabIndex = 1;
+      this.label1.Text = "Window Size";
+      // 
+      // FilterCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoSize = true;
+      this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.numWindowSize);
+      this.Name = "FilterCommandView";
+      this.Padding = new System.Windows.Forms.Padding(5);
+      this.Size = new System.Drawing.Size(211, 36);
+      ((System.ComponentModel.ISupportInitialize)(this.numWindowSize)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+    }
+    #endregion
+
+    private System.Windows.Forms.NumericUpDown numWindowSize;
+    private System.Windows.Forms.Label label1;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/FilterCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/FilterCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/FilterCommandView.cs	(revision 15690)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class FilterCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    private FilterCommandView() {
+      InitializeComponent();
+    }
+
+    public FilterCommandView(FilterCommandBase command)
+      : this() {
+      this.Command = command;
+    }
+
+    public new FilterCommandBase Command {
+      get { return (FilterCommandBase)base.Command; }
+      protected set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    public int WindowSize {
+      get { return this.Command.WindowSize; }
+    }
+
+    private void numWindowSize_ValueChanged(object sender, System.EventArgs e) {
+      this.UpdateCommand();
+    }
+
+    private void UpdateCommand() {
+      if (Command != null)
+        this.Command.WindowSize = (int)this.numWindowSize.Value;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/FilterSavitzkyGolayCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/FilterSavitzkyGolayCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/FilterSavitzkyGolayCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,203 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class FilterSavitzkyGolayCommandView {
+    /// <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.numWindowLeft = new System.Windows.Forms.NumericUpDown();
+      this.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.numWindowRight = new System.Windows.Forms.NumericUpDown();
+      this.label3 = new System.Windows.Forms.Label();
+      this.numOrder = new System.Windows.Forms.NumericUpDown();
+      this.numOrderOfDerivative = new System.Windows.Forms.NumericUpDown();
+      this.label4 = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.numWindowLeft)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.numWindowRight)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.numOrder)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.numOrderOfDerivative)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // numWindowLeft
+      // 
+      this.numWindowLeft.Location = new System.Drawing.Point(115, 8);
+      this.numWindowLeft.Maximum = new decimal(new int[] {
+            0,
+            0,
+            0,
+            0});
+      this.numWindowLeft.Minimum = new decimal(new int[] {
+            128,
+            0,
+            0,
+            -2147483648});
+      this.numWindowLeft.Name = "numWindowLeft";
+      this.numWindowLeft.Size = new System.Drawing.Size(120, 20);
+      this.numWindowLeft.TabIndex = 1;
+      this.numWindowLeft.Value = new decimal(new int[] {
+            4,
+            0,
+            0,
+            -2147483648});
+      this.numWindowLeft.ValueChanged += new System.EventHandler(this.numWindowLeft_ValueChanged);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(8, 10);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(101, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "Window start offset:";
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(8, 36);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(99, 13);
+      this.label2.TabIndex = 2;
+      this.label2.Text = "Window end offset:";
+      // 
+      // numWindowRight
+      // 
+      this.numWindowRight.Location = new System.Drawing.Point(115, 34);
+      this.numWindowRight.Maximum = new decimal(new int[] {
+            128,
+            0,
+            0,
+            0});
+      this.numWindowRight.Name = "numWindowRight";
+      this.numWindowRight.Size = new System.Drawing.Size(120, 20);
+      this.numWindowRight.TabIndex = 3;
+      this.numWindowRight.Value = new decimal(new int[] {
+            4,
+            0,
+            0,
+            0});
+      this.numWindowRight.ValueChanged += new System.EventHandler(this.numWindowRight_ValueChanged);
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(9, 89);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(100, 13);
+      this.label3.TabIndex = 6;
+      this.label3.Text = "Order of polynomial:";
+      // 
+      // numOrder
+      // 
+      this.numOrder.Location = new System.Drawing.Point(115, 87);
+      this.numOrder.Maximum = new decimal(new int[] {
+            8,
+            0,
+            0,
+            0});
+      this.numOrder.Name = "numOrder";
+      this.numOrder.Size = new System.Drawing.Size(120, 20);
+      this.numOrder.TabIndex = 7;
+      this.numOrder.Value = new decimal(new int[] {
+            2,
+            0,
+            0,
+            0});
+      this.numOrder.ValueChanged += new System.EventHandler(this.numOrder_ValueChanged);
+      // 
+      // numOrderOfDerivative
+      // 
+      this.numOrderOfDerivative.Location = new System.Drawing.Point(115, 60);
+      this.numOrderOfDerivative.Maximum = new decimal(new int[] {
+            3,
+            0,
+            0,
+            0});
+      this.numOrderOfDerivative.Name = "numOrderOfDerivative";
+      this.numOrderOfDerivative.Size = new System.Drawing.Size(120, 20);
+      this.numOrderOfDerivative.TabIndex = 5;
+      this.numOrderOfDerivative.ValueChanged += new System.EventHandler(this.numOrderOfDerivative_ValueChanged);
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(8, 62);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(97, 13);
+      this.label4.TabIndex = 4;
+      this.label4.Text = "Order of derivative:";
+      // 
+      // FilterSavitzkyGolayCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.Controls.Add(this.numOrderOfDerivative);
+      this.Controls.Add(this.label4);
+      this.Controls.Add(this.numOrder);
+      this.Controls.Add(this.label3);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.numWindowRight);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.numWindowLeft);
+      this.Name = "FilterSavitzkyGolayCommandView";
+      this.Padding = new System.Windows.Forms.Padding(5);
+      this.Size = new System.Drawing.Size(246, 117);
+      ((System.ComponentModel.ISupportInitialize)(this.numWindowLeft)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.numWindowRight)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.numOrder)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.numOrderOfDerivative)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+    #endregion
+
+    private System.Windows.Forms.NumericUpDown numWindowLeft;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.NumericUpDown numWindowRight;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.NumericUpDown numOrder;
+    private System.Windows.Forms.NumericUpDown numOrderOfDerivative;
+    private System.Windows.Forms.Label label4;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/FilterSavitzkyGolayCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/FilterSavitzkyGolayCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/FilterSavitzkyGolayCommandView.cs	(revision 15690)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class FilterSavitzkyGolayCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    private FilterSavitzkyGolayCommandView() {
+      InitializeComponent();
+    }
+
+    public FilterSavitzkyGolayCommandView(FilterSavitzkyGolayCommand command)
+      : this() {
+      this.Command = command;
+    }
+
+    public new FilterSavitzkyGolayCommand Command {
+      get { return (FilterSavitzkyGolayCommand)base.Command; }
+      protected set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    public int WindowLeft {
+      get { return this.Command.WindowLeft; }
+    }
+    public int WindowRight {
+      get { return this.Command.WindowRight; }
+    }
+    public int Order {
+      get { return this.Command.Order; }
+    }
+    public int OrderOfDerivative {
+      get { return this.Command.OrderOfDerivative; }
+    }
+
+    private void numWindowLeft_ValueChanged(object sender, System.EventArgs e) {
+      this.UpdateCommand();
+    }
+
+    private void numWindowRight_ValueChanged(object sender, System.EventArgs e) {
+      this.UpdateCommand();
+    }
+
+    private void numOrder_ValueChanged(object sender, EventArgs e) {
+      this.UpdateCommand();
+    }
+
+    private void numOrderOfDerivative_ValueChanged(object sender, EventArgs e) {
+      this.UpdateCommand();
+    }
+
+    private void UpdateCommand() {
+      if (Command != null) {
+        this.Command.WindowLeft = (int)this.numWindowLeft.Value;
+        this.Command.WindowRight = (int)this.numWindowRight.Value;
+        this.Command.Order = (int)this.numOrder.Value;
+        this.Command.OrderOfDerivative = (int) this.numOrderOfDerivative.Value;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/LinearTransformationCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/LinearTransformationCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/LinearTransformationCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,112 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class LinearTransformationCommandView {
+    /// <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.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.txtSlope = new System.Windows.Forms.TextBox();
+      this.txtOffset = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(8, 10);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(34, 13);
+      this.label1.TabIndex = 1;
+      this.label1.Text = "Slope";
+      // 
+      // label2
+      // 
+      this.label2.Location = new System.Drawing.Point(8, 36);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(48, 13);
+      this.label2.TabIndex = 2;
+      this.label2.Text = "Offset";
+      // 
+      // txtSlope
+      // 
+      this.txtSlope.Location = new System.Drawing.Point(62, 7);
+      this.txtSlope.Name = "txtSlope";
+      this.txtSlope.Size = new System.Drawing.Size(100, 20);
+      this.txtSlope.TabIndex = 0;
+      this.txtSlope.Text = "0";
+      this.txtSlope.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // txtOffset
+      // 
+      this.txtOffset.Location = new System.Drawing.Point(62, 33);
+      this.txtOffset.Name = "txtOffset";
+      this.txtOffset.Size = new System.Drawing.Size(100, 20);
+      this.txtOffset.TabIndex = 1;
+      this.txtOffset.Text = "0";
+      this.txtOffset.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // LinearTransformationCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoSize = true;
+      this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.Controls.Add(this.txtOffset);
+      this.Controls.Add(this.txtSlope);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label1);
+      this.Name = "LinearTransformationCommandView";
+      this.Padding = new System.Windows.Forms.Padding(5);
+      this.Size = new System.Drawing.Size(170, 61);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox txtSlope;
+    private System.Windows.Forms.TextBox txtOffset;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/LinearTransformationCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/LinearTransformationCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/LinearTransformationCommandView.cs	(revision 15690)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class LinearTransformationCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    private LinearTransformationCommandView() {
+      InitializeComponent();
+    }
+
+    public LinearTransformationCommandView(LinearTransformationCommand command)
+      : this() {
+      this.Command = command;
+    }
+
+    public new LinearTransformationCommand Command {
+      get { return (LinearTransformationCommand)base.Command; }
+      set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    public double Slope {
+      get { return this.Command.Offset; }
+    }
+
+    public double Offset {
+      get { return this.Command.Slope; }
+    }
+
+    private void textBox_Validating(object sender, CancelEventArgs e) {
+      TextBox textBox = (TextBox)sender;
+      double value;
+      if (!double.TryParse(textBox.Text, out value)) {
+        e.Cancel = true;
+        MessageBox.Show("A numeric value must be entered!");
+      } else
+        this.UpdateCommand();
+    }
+
+    private void UpdateCommand() {
+      if (this.Command != null) {
+        double value;
+        if (double.TryParse(this.txtOffset.Text, out value))
+          this.Command.Offset = value;
+        if (double.TryParse(this.txtSlope.Text, out value))
+          this.Command.Slope = value;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/MinMaxCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/MinMaxCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/MinMaxCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,112 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class MinMaxCommandView {
+    /// <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.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.txtMin = new System.Windows.Forms.TextBox();
+      this.txtMax = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(8, 10);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(48, 13);
+      this.label1.TabIndex = 1;
+      this.label1.Text = "Minimum";
+      // 
+      // label2
+      // 
+      this.label2.Location = new System.Drawing.Point(8, 36);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(48, 13);
+      this.label2.TabIndex = 2;
+      this.label2.Text = "Maximum";
+      // 
+      // txtMin
+      // 
+      this.txtMin.Location = new System.Drawing.Point(62, 7);
+      this.txtMin.Name = "txtMin";
+      this.txtMin.Size = new System.Drawing.Size(100, 20);
+      this.txtMin.TabIndex = 0;
+      this.txtMin.Text = "0";
+      this.txtMin.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // txtMax
+      // 
+      this.txtMax.Location = new System.Drawing.Point(62, 33);
+      this.txtMax.Name = "txtMax";
+      this.txtMax.Size = new System.Drawing.Size(100, 20);
+      this.txtMax.TabIndex = 1;
+      this.txtMax.Text = "0";
+      this.txtMax.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // MinMaxCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoSize = true;
+      this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.Controls.Add(this.txtMax);
+      this.Controls.Add(this.txtMin);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label1);
+      this.Name = "MinMaxCommandView";
+      this.Padding = new System.Windows.Forms.Padding(5);
+      this.Size = new System.Drawing.Size(170, 61);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox txtMin;
+    private System.Windows.Forms.TextBox txtMax;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/MinMaxCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/MinMaxCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/MinMaxCommandView.cs	(revision 15690)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class MinMaxCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    private MinMaxCommandView() {
+      InitializeComponent();
+    }
+
+    public MinMaxCommandView(ScalingBetweenMinAndMaxCommand command)
+      : this() {
+      this.Command = command;
+    }
+
+    public new ScalingBetweenMinAndMaxCommand Command {
+      get { return (ScalingBetweenMinAndMaxCommand)base.Command; }
+      set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    public double MinValue {
+      get { return Command.MinValue; }
+    }
+
+    public double MaxValue {
+      get { return Command.MaxValue; }
+    }
+
+    private void textBox_Validating(object sender, CancelEventArgs e) {
+      TextBox textBox = (TextBox)sender;
+      double value;
+      if (!double.TryParse(textBox.Text, out value)) {
+        e.Cancel = true;
+        MessageBox.Show("A numeric value must be entered!");
+      } else
+        this.UpdateCommand();
+    }
+
+    private void UpdateCommand() {
+      if (this.Command != null) {
+        double value;
+        if (double.TryParse(this.txtMin.Text, out value))
+          this.Command.MinValue = value;
+        if (double.TryParse(this.txtMax.Text, out value))
+          this.Command.MaxValue = value;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/NormalDistribuationCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/NormalDistribuationCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/NormalDistribuationCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,112 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class NormalDistributionCommandView {
+    /// <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.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.txtMean = new System.Windows.Forms.TextBox();
+      this.txtStandardDeviation = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(8, 10);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(34, 13);
+      this.label1.TabIndex = 1;
+      this.label1.Text = "Mean";
+      // 
+      // label2
+      // 
+      this.label2.Location = new System.Drawing.Point(8, 36);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(48, 13);
+      this.label2.TabIndex = 2;
+      this.label2.Text = "StdDev";
+      // 
+      // txtMean
+      // 
+      this.txtMean.Location = new System.Drawing.Point(62, 7);
+      this.txtMean.Name = "txtMean";
+      this.txtMean.Size = new System.Drawing.Size(100, 20);
+      this.txtMean.TabIndex = 0;
+      this.txtMean.Text = "0";
+      this.txtMean.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // txtStandardDeviation
+      // 
+      this.txtStandardDeviation.Location = new System.Drawing.Point(62, 33);
+      this.txtStandardDeviation.Name = "txtStandardDeviation";
+      this.txtStandardDeviation.Size = new System.Drawing.Size(100, 20);
+      this.txtStandardDeviation.TabIndex = 1;
+      this.txtStandardDeviation.Text = "0";
+      this.txtStandardDeviation.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // NormalDistributionCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoSize = true;
+      this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.Controls.Add(this.txtStandardDeviation);
+      this.Controls.Add(this.txtMean);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label1);
+      this.Name = "NormalDistributionCommandView";
+      this.Padding = new System.Windows.Forms.Padding(5);
+      this.Size = new System.Drawing.Size(170, 61);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox txtMean;
+    private System.Windows.Forms.TextBox txtStandardDeviation;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/NormalDistribuationCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/NormalDistribuationCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/NormalDistribuationCommandView.cs	(revision 15690)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class NormalDistributionCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    private NormalDistributionCommandView() {
+      InitializeComponent();
+    }
+
+    public NormalDistributionCommandView(NormalDistributionScalingCommand command)
+      : this() {
+      this.Command = command;
+    }
+
+    public new NormalDistributionScalingCommand Command {
+      get { return (NormalDistributionScalingCommand)base.Command; }
+      set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    public double Mean {
+      get { return Command.Mean; }
+    }
+
+    public double StandardDeviation {
+      get { return Command.StandardDeviation; }
+    }
+
+    private void textBox_Validating(object sender, CancelEventArgs e) {
+      TextBox textBox = (TextBox)sender;
+      double value;
+      if (!double.TryParse(textBox.Text, out value)) {
+        e.Cancel = true;
+        MessageBox.Show("A numeric value must be entered!");
+      } else
+        this.UpdateCommand();
+    }
+
+    private void UpdateCommand() {
+      if (this.Command != null) {
+        double value;
+        if (double.TryParse(this.txtMean.Text, out value))
+          this.Command.Mean = value;
+        if (double.TryParse(this.txtStandardDeviation.Text, out value))
+          this.Command.StandardDeviation = value;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ProgrammableColumnCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ProgrammableColumnCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ProgrammableColumnCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class ProgrammableColumnCommandView {
+    /// <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.expressionLabel = new System.Windows.Forms.Label();
+      this.expressionTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // expressionLabel
+      // 
+      this.expressionLabel.AutoSize = true;
+      this.expressionLabel.Location = new System.Drawing.Point(8, 10);
+      this.expressionLabel.Name = "expressionLabel";
+      this.expressionLabel.Size = new System.Drawing.Size(61, 13);
+      this.expressionLabel.TabIndex = 1;
+      this.expressionLabel.Text = "Expression:";
+      // 
+      // expressionTextBox
+      // 
+      this.expressionTextBox.Location = new System.Drawing.Point(79, 7);
+      this.expressionTextBox.Name = "expressionTextBox";
+      this.expressionTextBox.Size = new System.Drawing.Size(187, 20);
+      this.expressionTextBox.TabIndex = 2;
+      this.expressionTextBox.TextChanged += new System.EventHandler(this.expressionTextBox_TextChanged);
+      // 
+      // ProgrammableColumnCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoSize = true;
+      this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.Controls.Add(this.expressionTextBox);
+      this.Controls.Add(this.expressionLabel);
+      this.Name = "ProgrammableColumnCommandView";
+      this.Padding = new System.Windows.Forms.Padding(5);
+      this.Size = new System.Drawing.Size(274, 35);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label expressionLabel;
+    private System.Windows.Forms.TextBox expressionTextBox;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ProgrammableColumnCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ProgrammableColumnCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ProgrammableColumnCommandView.cs	(revision 15690)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class ProgrammableColumnCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    private ProgrammableColumnCommandView() {
+      InitializeComponent();
+      this.expressionTextBox.Text = "A";
+    }
+
+    public ProgrammableColumnCommandView(AddNewProgrammableColumnCommand command)
+      : this() {
+      this.Command = command;
+    }
+
+    public new AddNewProgrammableColumnCommand Command {
+      get { return (AddNewProgrammableColumnCommand)base.Command; }
+      set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    public string Expression {
+      get { return expressionTextBox.Text; }
+    }
+
+    private void UpdateCommand() {
+      if (Command != null)
+        Command.Expression = this.expressionTextBox.Text;
+    }
+
+    private void expressionTextBox_TextChanged(object sender, EventArgs e) {
+      this.UpdateCommand();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchAndReplaceCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchAndReplaceCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchAndReplaceCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,97 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class SearchAndReplaceCommandView {
+    /// <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.txtReplaceValue = new System.Windows.Forms.TextBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.label4 = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // txtReplaceValue
+      // 
+      this.txtReplaceValue.Location = new System.Drawing.Point(100, 66);
+      this.txtReplaceValue.Name = "txtReplaceValue";
+      this.txtReplaceValue.Size = new System.Drawing.Size(130, 20);
+      this.txtReplaceValue.TabIndex = 2;
+      this.txtReplaceValue.TextChanged += new System.EventHandler(this.txtReplaceValue_TextChanged);
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(8, 69);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(69, 13);
+      this.label2.TabIndex = 5;
+      this.label2.Text = "Replace with";
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(8, 69);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(77, 13);
+      this.label4.TabIndex = 8;
+      this.label4.Text = "Replace Value";
+      // 
+      // SearchAndReplaceCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.label4);
+      this.Controls.Add(this.txtReplaceValue);
+      this.Name = "SearchAndReplaceCommandView";
+      this.Size = new System.Drawing.Size(240, 98);
+      this.Controls.SetChildIndex(this.txtReplaceValue, 0);
+      this.Controls.SetChildIndex(this.label4, 0);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+    #endregion
+
+    private System.Windows.Forms.TextBox txtReplaceValue;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label label4;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchAndReplaceCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchAndReplaceCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchAndReplaceCommandView.cs	(revision 15690)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class SearchAndReplaceCommandView : SearchWithMatchOperationCommandView {
+    public SearchAndReplaceCommandView()
+      : base() {
+      InitializeComponent();
+      this.txtReplaceValue.Text = "0";
+    }
+
+    public SearchAndReplaceCommandView(SearchAndReplaceCommand command)
+      : this() {
+      this.Command = command;
+    }
+
+    public new SearchAndReplaceCommand Command {
+      get { return (SearchAndReplaceCommand)base.Command; }
+      set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    public string ReplaceValue {
+      get { return this.Command.ReplaceValue; }
+    }
+
+    private void txtReplaceValue_TextChanged(object sender, System.EventArgs e) {
+      this.UpdateCommand();
+    }
+
+    private void UpdateCommand() {
+      if (this.Command != null)
+        this.Command.ReplaceValue = this.txtReplaceValue.Text;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class SearchCommandView {
+    /// <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.txtSearchValue = new System.Windows.Forms.TextBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // txtSearchValue
+      // 
+      this.txtSearchValue.Location = new System.Drawing.Point(100, 13);
+      this.txtSearchValue.Name = "txtSearchValue";
+      this.txtSearchValue.Size = new System.Drawing.Size(130, 20);
+      this.txtSearchValue.TabIndex = 0;
+      this.txtSearchValue.TextChanged += new System.EventHandler(this.txtSearchValue_TextChanged);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(8, 16);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(71, 13);
+      this.label1.TabIndex = 4;
+      this.label1.Text = "Search Value";
+      // 
+      // SearchCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.txtSearchValue);
+      this.Name = "SearchCommandView";
+      this.Size = new System.Drawing.Size(240, 42);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+    #endregion
+
+    private System.Windows.Forms.TextBox txtSearchValue;
+    private System.Windows.Forms.Label label1;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchCommandView.cs	(revision 15690)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class SearchCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    public SearchCommandView() :base() {
+      InitializeComponent();
+      txtSearchValue.Text = "0";
+    }
+
+    public SearchCommandView(SearchCommandBase command) {
+      this.Command = command;
+    }
+
+    public new SearchCommandBase Command {
+      get { return (SearchCommandBase)base.Command; }
+      set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    public string SearchValue {
+      get { return this.Command.SearchValue; }
+    }
+
+    private void txtSearchValue_TextChanged(object sender, System.EventArgs e) {
+      this.UpdateCommand();
+    }
+
+    private void UpdateCommand() {
+      if (this.Command != null) 
+        this.Command.SearchValue = this.txtSearchValue.Text;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchWithMatchOperationCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchWithMatchOperationCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchWithMatchOperationCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,85 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class SearchWithMatchOperationCommandView {
+    /// <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.label3 = new System.Windows.Forms.Label();
+      this.cmbMatchOperation = new System.Windows.Forms.ComboBox();
+      this.SuspendLayout();
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(8, 42);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(37, 13);
+      this.label3.TabIndex = 7;
+      this.label3.Text = "Match";
+      // 
+      // cmbMatchOperation
+      // 
+      this.cmbMatchOperation.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.cmbMatchOperation.FormattingEnabled = true;
+      this.cmbMatchOperation.Location = new System.Drawing.Point(100, 39);
+      this.cmbMatchOperation.Name = "cmbMatchOperation";
+      this.cmbMatchOperation.Size = new System.Drawing.Size(130, 21);
+      this.cmbMatchOperation.TabIndex = 1;
+      this.cmbMatchOperation.SelectedIndexChanged += new System.EventHandler(cmbMatchOperation_SelectedIndexChanged);
+      // 
+      // ClearValuesWithConditionCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.label3);
+      this.Controls.Add(this.cmbMatchOperation);
+      this.Name = "ClearValuesWithConditionCommandView";
+      this.Size = new System.Drawing.Size(240, 72);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+    }
+    #endregion
+
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.ComboBox cmbMatchOperation;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchWithMatchOperationCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchWithMatchOperationCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/SearchWithMatchOperationCommandView.cs	(revision 15690)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class SearchWithMatchOperationCommandView : SearchCommandView {
+    public SearchWithMatchOperationCommandView()
+      : base() {
+      InitializeComponent();
+      cmbMatchOperation.Items.AddRange(Enum.GetNames(typeof(HeuristicLab.DataImporter.Command.MatchOperation)));
+      cmbMatchOperation.SelectedIndex = 0;
+    }
+
+    public SearchWithMatchOperationCommandView(SearchWithMatchOperationCommandBase command) :this(){
+      this.Command = command;
+    }
+
+    public new SearchWithMatchOperationCommandBase Command {
+      get { return (SearchWithMatchOperationCommandBase)base.Command; }
+      set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    public MatchOperation MatchOperation {
+      get { return this.Command.MatchOperation; }
+    }
+
+    private void cmbMatchOperation_SelectedIndexChanged(object sender, System.EventArgs e) {
+      this.UpdateCommand();
+    }
+
+    private void UpdateCommand() {
+      if (Command != null)
+        this.Command.MatchOperation = (MatchOperation)Enum.Parse(typeof(MatchOperation), cmbMatchOperation.SelectedItem.ToString());
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ThresholdCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ThresholdCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ThresholdCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,68 @@
+﻿namespace HeuristicLab.DataImporter.Command.View {
+  partial class ThresholdCommandView {
+    /// <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.label1 = new System.Windows.Forms.Label();
+      this.txtThreshold = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(8, 10);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(54, 13);
+      this.label1.TabIndex = 1;
+      this.label1.Text = "Threshold";
+      // 
+      // txtThreshold
+      // 
+      this.txtThreshold.Location = new System.Drawing.Point(62, 7);
+      this.txtThreshold.Name = "txtThreshold";
+      this.txtThreshold.Size = new System.Drawing.Size(100, 20);
+      this.txtThreshold.TabIndex = 0;
+      this.txtThreshold.Text = "0";
+      this.txtThreshold.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // ThresholdCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoSize = true;
+      this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.Controls.Add(this.txtThreshold);
+      this.Controls.Add(this.label1);
+      this.Name = "ThresholdCommandView";
+      this.Padding = new System.Windows.Forms.Padding(5);
+      this.Size = new System.Drawing.Size(170, 35);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TextBox txtThreshold;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ThresholdCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ThresholdCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ThresholdCommandView.cs	(revision 15690)
@@ -0,0 +1,52 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class ThresholdCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    private ThresholdCommandView() {
+      InitializeComponent();
+      this.txtThreshold.Text = (0.5).ToString();
+    }
+
+    public ThresholdCommandView(DeleteColumnsWithTooFewValuesCommand command)
+      : this() {
+      this.Command = command;
+      this.UpdateCommand();
+    }
+
+    public new DeleteColumnsWithTooFewValuesCommand Command {
+      get { return (DeleteColumnsWithTooFewValuesCommand)base.Command; }
+      set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    public double Threshold {
+      get { return Command.Threshold; }
+    }
+
+    private void textBox_Validating(object sender, CancelEventArgs e) {
+      TextBox textBox = (TextBox)sender;
+      double value;
+      if (!double.TryParse(textBox.Text, out value))
+        e.Cancel = true;
+      if (value < 0 || value > 1)
+        e.Cancel = true;
+      if (e.Cancel)
+        MessageBox.Show("A numeric value between 0 and 1 must be entered!");
+      else
+        this.UpdateCommand();
+    }
+
+    private void UpdateCommand() {
+      if (this.Command != null) {
+        double value;
+        if (double.TryParse(txtThreshold.Text, out value))
+          this.Command.Threshold = value;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ThresholdCommandView.resx
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ThresholdCommandView.resx	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/ThresholdCommandView.resx	(revision 15690)
@@ -0,0 +1,120 @@
+<?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: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/TimeBasedCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/TimeBasedCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/TimeBasedCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,129 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class TimeBasedCommandView {
+    /// <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.txtFrequency = new System.Windows.Forms.TextBox();
+      this.cmbUnit = new System.Windows.Forms.ComboBox();
+      this.txtStartTime = new System.Windows.Forms.TextBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // txtFrequency
+      // 
+      this.txtFrequency.Location = new System.Drawing.Point(67, 29);
+      this.txtFrequency.Name = "txtFrequency";
+      this.txtFrequency.Size = new System.Drawing.Size(61, 20);
+      this.txtFrequency.TabIndex = 1;
+      this.txtFrequency.Text = "1";
+      this.txtFrequency.Validating += new System.ComponentModel.CancelEventHandler(this.txtFrequency_Validating);
+      // 
+      // cmbUnit
+      // 
+      this.cmbUnit.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.cmbUnit.FormattingEnabled = true;
+      this.cmbUnit.Items.AddRange(new object[] {
+            "Seconds",
+            "Minutes",
+            "Hours",
+            "Days",
+            "Months",
+            "Years"});
+      this.cmbUnit.Location = new System.Drawing.Point(134, 29);
+      this.cmbUnit.Name = "cmbUnit";
+      this.cmbUnit.Size = new System.Drawing.Size(121, 21);
+      this.cmbUnit.TabIndex = 2;
+      this.cmbUnit.SelectedIndexChanged += new System.EventHandler(this.cmbUnit_SelectedIndexChanged);
+      // 
+      // txtStartTime
+      // 
+      this.txtStartTime.Location = new System.Drawing.Point(67, 3);
+      this.txtStartTime.Name = "txtStartTime";
+      this.txtStartTime.Size = new System.Drawing.Size(188, 20);
+      this.txtStartTime.TabIndex = 0;
+      this.txtStartTime.Validating += new System.ComponentModel.CancelEventHandler(this.txtStartTime_Validating);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(32, 6);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(29, 13);
+      this.label1.TabIndex = 3;
+      this.label1.Text = "Start";
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(4, 32);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(57, 13);
+      this.label2.TabIndex = 4;
+      this.label2.Text = "Frequency";
+      // 
+      // TimeBasedCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.txtStartTime);
+      this.Controls.Add(this.cmbUnit);
+      this.Controls.Add(this.txtFrequency);
+      this.Name = "TimeBasedCommandView";
+      this.Size = new System.Drawing.Size(262, 59);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox txtFrequency;
+    private System.Windows.Forms.ComboBox cmbUnit;
+    private System.Windows.Forms.TextBox txtStartTime;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/TimeBasedCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/TimeBasedCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/TimeBasedCommandView.cs	(revision 15690)
@@ -0,0 +1,122 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class TimeBasedCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    private TimeBasedCommandView() {
+      InitializeComponent();
+      cmbUnit.SelectedIndex = 0;
+      frequency = new DateTimeSpan();
+      frequency.Seconds = 1;
+      startTime = DateTime.Now;
+      txtStartTime.Text = startTime.ToString();
+      UpdateCommand();
+    }
+
+    public TimeBasedCommandView(EquidistantTimeSeriesCommandBase command)
+      : this() {
+      this.Command = command;
+    }
+
+    public new EquidistantTimeSeriesCommandBase Command {
+      get { return (EquidistantTimeSeriesCommandBase)base.Command; }
+      set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    private DateTimeSpan frequency;
+    public DateTimeSpan SampleFrequency {
+      get { return this.frequency; }
+    }
+
+    private DateTime startTime;
+    public DateTime StartTime {
+      get { return this.startTime; }
+    }
+
+    private void txtFrequency_Validating(object sender, CancelEventArgs e) {
+      int value;
+      if (!Int32.TryParse(txtFrequency.Text, out value))
+        e.Cancel = true;
+      else if (value <= 0)
+        e.Cancel = true;
+
+      if (e.Cancel)
+        MessageBox.Show("A numeric positive value must be entered!");
+      else
+        CalculateNewFrequency();
+    }
+
+    private void UpdateCommand() {
+      if(this.Command != null) {
+        this.Command.StartTime = this.startTime;
+        this.Command.SampleFrequency = this.SampleFrequency;
+      }
+    }
+
+    private void txtStartTime_Validating(object sender, CancelEventArgs e) {
+      if (!DateTime.TryParse(txtStartTime.Text, out startTime)) {
+        e.Cancel = true;
+        MessageBox.Show("A date value must be entered (e.g. " + DateTime.Now.ToString() + ").");
+      } else
+        this.UpdateCommand();
+    }
+
+    private void cmbUnit_SelectedIndexChanged(object sender, EventArgs e) {
+      CalculateNewFrequency();
+    }
+
+    private void CalculateNewFrequency() {
+      int value = Int32.Parse(txtFrequency.Text);
+      frequency = new DateTimeSpan();
+      switch (cmbUnit.SelectedIndex) {
+        case 0:
+          frequency.Seconds = value;
+          break;
+        case 1:
+          frequency.Minutes = value;
+          break;
+        case 2:
+          frequency.Hours = value;
+          break;
+        case 3:
+          frequency.Days = value;
+          break;
+        case 4:
+          frequency.Months = value;
+          break;
+        case 5:
+          frequency.Years = value;
+          break;
+      }
+      this.UpdateCommand();
+    }
+    
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/TimeBasedWithoutOffsetCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/TimeBasedWithoutOffsetCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/TimeBasedWithoutOffsetCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,200 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Command.View {
+  partial class TimeBasedWithoutOffsetCommandView {
+    /// <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.txtSeconds = new System.Windows.Forms.TextBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.label1 = new System.Windows.Forms.Label();
+      this.label3 = new System.Windows.Forms.Label();
+      this.label4 = new System.Windows.Forms.Label();
+      this.label5 = new System.Windows.Forms.Label();
+      this.label6 = new System.Windows.Forms.Label();
+      this.txtMinutes = new System.Windows.Forms.TextBox();
+      this.txtDays = new System.Windows.Forms.TextBox();
+      this.txtMonths = new System.Windows.Forms.TextBox();
+      this.txtHours = new System.Windows.Forms.TextBox();
+      this.txtYears = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // txtSeconds
+      // 
+      this.txtSeconds.Location = new System.Drawing.Point(93, 3);
+      this.txtSeconds.Name = "txtSeconds";
+      this.txtSeconds.Size = new System.Drawing.Size(61, 20);
+      this.txtSeconds.TabIndex = 0;
+      this.txtSeconds.Validating += new System.ComponentModel.CancelEventHandler(this.txtDateTimePart_Validating);
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(5, 6);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(49, 13);
+      this.label2.TabIndex = 4;
+      this.label2.Text = "Seconds";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(5, 32);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(44, 13);
+      this.label1.TabIndex = 5;
+      this.label1.Text = "Minutes";
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(5, 58);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(35, 13);
+      this.label3.TabIndex = 6;
+      this.label3.Text = "Hours";
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(5, 84);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(31, 13);
+      this.label4.TabIndex = 7;
+      this.label4.Text = "Days";
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(3, 110);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(42, 13);
+      this.label5.TabIndex = 8;
+      this.label5.Text = "Months";
+      // 
+      // label6
+      // 
+      this.label6.AutoSize = true;
+      this.label6.Location = new System.Drawing.Point(5, 136);
+      this.label6.Name = "label6";
+      this.label6.Size = new System.Drawing.Size(34, 13);
+      this.label6.TabIndex = 9;
+      this.label6.Text = "Years";
+      // 
+      // txtMinutes
+      // 
+      this.txtMinutes.Location = new System.Drawing.Point(93, 29);
+      this.txtMinutes.Name = "txtMinutes";
+      this.txtMinutes.Size = new System.Drawing.Size(61, 20);
+      this.txtMinutes.TabIndex = 1;
+      this.txtMinutes.Validating += new System.ComponentModel.CancelEventHandler(this.txtDateTimePart_Validating);
+      // 
+      // txtDays
+      // 
+      this.txtDays.Location = new System.Drawing.Point(93, 81);
+      this.txtDays.Name = "txtDays";
+      this.txtDays.Size = new System.Drawing.Size(61, 20);
+      this.txtDays.TabIndex = 3;
+      this.txtDays.Validating += new System.ComponentModel.CancelEventHandler(this.txtDateTimePart_Validating);
+      // 
+      // txtMonths
+      // 
+      this.txtMonths.Location = new System.Drawing.Point(93, 107);
+      this.txtMonths.Name = "txtMonths";
+      this.txtMonths.Size = new System.Drawing.Size(61, 20);
+      this.txtMonths.TabIndex = 4;
+      this.txtMonths.Validating += new System.ComponentModel.CancelEventHandler(this.txtDateTimePart_Validating);
+      // 
+      // txtHours
+      // 
+      this.txtHours.Location = new System.Drawing.Point(93, 55);
+      this.txtHours.Name = "txtHours";
+      this.txtHours.Size = new System.Drawing.Size(61, 20);
+      this.txtHours.TabIndex = 2;
+      this.txtHours.Validating += new System.ComponentModel.CancelEventHandler(this.txtDateTimePart_Validating);
+      // 
+      // txtYears
+      // 
+      this.txtYears.Location = new System.Drawing.Point(93, 133);
+      this.txtYears.Name = "txtYears";
+      this.txtYears.Size = new System.Drawing.Size(61, 20);
+      this.txtYears.TabIndex = 5;
+      this.txtYears.Validating += new System.ComponentModel.CancelEventHandler(this.txtDateTimePart_Validating);
+      // 
+      // TimeBasedWithoutOffsetCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.txtYears);
+      this.Controls.Add(this.txtHours);
+      this.Controls.Add(this.txtMonths);
+      this.Controls.Add(this.txtDays);
+      this.Controls.Add(this.txtMinutes);
+      this.Controls.Add(this.label6);
+      this.Controls.Add(this.label5);
+      this.Controls.Add(this.label4);
+      this.Controls.Add(this.label3);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.txtSeconds);
+      this.Name = "TimeBasedWithoutOffsetCommandView";
+      this.Size = new System.Drawing.Size(184, 163);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox txtSeconds;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.Label label5;
+    private System.Windows.Forms.Label label6;
+    private System.Windows.Forms.TextBox txtMinutes;
+    private System.Windows.Forms.TextBox txtDays;
+    private System.Windows.Forms.TextBox txtMonths;
+    private System.Windows.Forms.TextBox txtHours;
+    private System.Windows.Forms.TextBox txtYears;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/TimeBasedWithoutOffsetCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/TimeBasedWithoutOffsetCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/View/TimeBasedWithoutOffsetCommandView.cs	(revision 15690)
@@ -0,0 +1,110 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data;
+
+namespace HeuristicLab.DataImporter.Command.View {
+  public partial class TimeBasedWithoutOffsetCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    private TimeBasedWithoutOffsetCommandView() {
+      InitializeComponent();
+      dateTimePart = new DateTimeSpan();
+      CalculateNewDateTimePart();
+    }
+
+    public TimeBasedWithoutOffsetCommandView(SetPartOfDateTimeCommand command) :this() {
+      this.Command = command;
+    }
+
+    public new SetPartOfDateTimeCommand Command {
+      get { return (SetPartOfDateTimeCommand)base.Command; }
+      set { base.Command = value; this.UpdateCommand(); }
+    }
+
+    private DateTimeSpan dateTimePart;
+    public DateTimeSpan DateTimePart {
+      get { return Command.DateTimePart; }
+    }
+
+
+    private void txtDateTimePart_Validating(object sender, CancelEventArgs e) {
+      TextBox textBox = (TextBox) sender;
+      int value;
+      if (string.IsNullOrEmpty(textBox.Text))
+        e.Cancel = false;
+      else if (!Int32.TryParse(textBox.Text, out value))
+        e.Cancel = true;
+      else if (value < 0)
+        e.Cancel = true;
+
+      if (e.Cancel)
+        MessageBox.Show("A numeric positive value or 0 must be entered!");
+      else
+        CalculateNewDateTimePart();
+    }
+
+    private void CalculateNewDateTimePart() {
+      if (!string.IsNullOrEmpty(txtSeconds.Text))
+        dateTimePart.Seconds = Int32.Parse(txtSeconds.Text);
+      else
+        dateTimePart.Seconds = -1;
+
+      if (!string.IsNullOrEmpty(txtMinutes.Text))
+        dateTimePart.Minutes = Int32.Parse(txtMinutes.Text);
+      else
+        dateTimePart.Minutes = -1;
+
+      if (!string.IsNullOrEmpty(txtHours.Text))
+        dateTimePart.Hours = Int32.Parse(txtHours.Text);
+      else
+        dateTimePart.Hours = -1;
+
+      if (!string.IsNullOrEmpty(txtDays.Text))
+        dateTimePart.Days = Int32.Parse(txtDays.Text);
+      else
+        dateTimePart.Days = -1;
+
+      if (!string.IsNullOrEmpty(txtMonths.Text))
+        dateTimePart.Months = Int32.Parse(txtMonths.Text);
+      else
+        dateTimePart.Months = -1;
+
+      if (!string.IsNullOrEmpty(txtYears.Text))
+        dateTimePart.Years = Int32.Parse(txtYears.Text);
+      else
+        dateTimePart.Years  = -1;
+
+      this.UpdateCommand();
+    }
+
+    private void UpdateCommand() {
+      if (this.Command != null) {
+        Command.DateTimePart = this.dateTimePart;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/AddRowCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/AddRowCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/AddRowCommand.cs	(revision 15690)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Command {
+  [StorableClass]
+  public class AddRowCommand : ColumnGroupCommandBase {
+    [Storable]
+    private IComparable[] newRow;
+
+    private int position;
+    private ICollection<int> oldSortedColumnIndices;
+    private IEnumerable<SortOrder> oldSortOrder;
+
+    [StorableConstructor]
+    protected AddRowCommand(bool deserializing) : base(deserializing) { }
+
+    public AddRowCommand(DataSet dataSet, string columnGroupName, IComparable[] row)
+      : base(dataSet, columnGroupName) {
+      this.newRow = row;
+    }
+
+    public override void Execute() {
+      base.Execute();
+      oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+      ColumnGroup.AddRow(newRow);
+      this.position = ColumnGroup.RowCount - 1;
+      ColumnGroup.ResetSorting();
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      ColumnGroup.DeleteRow(position);
+      ColumnGroup.SortOrdersForColumns = oldSortOrder;
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      oldSortedColumnIndices = null;
+      oldSortOrder = null;
+      this.position = -1;
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override string Description {
+      get { return "New row added"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/ChangeValueCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/ChangeValueCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/ChangeValueCommand.cs	(revision 15690)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Command {
+  [StorableClass]
+  public class ChangeValueCommand : ColumnCommandBase {
+    [Storable]
+    private int position;
+    [Storable]
+    private IComparable newValue;
+
+    private IComparable oldValue;
+    private ICollection<int> oldSortedColumnIndices;
+    private IEnumerable<SortOrder> oldSortOrder;
+
+    [StorableConstructor]
+    protected ChangeValueCommand(bool deserializing) : base(deserializing) { }
+
+    public ChangeValueCommand(DataSet dataSet, string columnGroupName, int columnIndex, int position, IComparable newValue)
+      : base(dataSet, columnGroupName, columnIndex) {
+      this.position = position;
+      this.newValue = newValue;
+    }
+
+    public override void Execute() {
+      base.Execute();
+      this.oldValue = Column.GetValue(position);
+      Column.ChangeValueOrNull(position, newValue);
+      oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+      ColumnGroup.ResetSorting();
+      Column.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      Column.ChangeValue(position, oldValue);
+      ColumnGroup.SortOrdersForColumns = oldSortOrder;
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      oldSortedColumnIndices = null;
+      oldSortOrder = null;
+      Column.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override string Description {
+      get { return "Column value changed"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/ChangeValuesToNullCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/ChangeValuesToNullCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/ChangeValuesToNullCommand.cs	(revision 15690)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Command {
+  [StorableClass]
+  public class ChangeValuesToNullCommand : ColumnGroupCommandBase {
+    [Storable]
+    private Dictionary<Point, IComparable> cellValues;
+
+    private ICollection<int> oldSortedColumnIndexes;
+    private IEnumerable<SortOrder> oldSortOrder;
+
+    [StorableConstructor]
+    protected ChangeValuesToNullCommand(bool deserializing) : base(deserializing) { }
+
+    public ChangeValuesToNullCommand(DataSet dataSet, string columnGroupName, IEnumerable<Point> cellIndexes)
+      : base(dataSet, columnGroupName) {
+      cellValues = new Dictionary<Point, IComparable>();
+      foreach (Point cellIndex in cellIndexes)
+        cellValues.Add(cellIndex, null);
+    }
+
+    public override void Execute() {
+      base.Execute();
+      foreach (Point cellIndex in cellValues.Keys.ToList()) {
+        cellValues[cellIndex] = ColumnGroup.GetColumn(cellIndex.X).GetValue(cellIndex.Y);
+        ColumnGroup.GetColumn(cellIndex.X).ChangeValue(cellIndex.Y, null);
+      }
+      oldSortedColumnIndexes = new List<int>(ColumnGroup.SortedColumnIndexes);
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      foreach (Point cellIndex in cellValues.Keys.ToList()) {
+        ColumnGroup.GetColumn(cellIndex.X).ChangeValueOrNull(cellIndex.Y, cellValues[cellIndex]);
+        cellValues[cellIndex] = null;
+      }
+      ColumnGroup.SortOrdersForColumns = oldSortOrder;
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndexes;
+      oldSortedColumnIndexes = null;
+      oldSortOrder = null;
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override string Description {
+      get { return "Column values deleted"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/DeleteColumnCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/DeleteColumnCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/DeleteColumnCommand.cs	(revision 15690)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Command {
+  [StorableClass]
+  public class DeleteColumnCommand : ColumnGroupCommandWithAffectedColumnsBase {
+    private List<ColumnBase> deletedColumns;
+    private List<int> oldSortedColumnIndices;
+
+    [StorableConstructor]
+    protected DeleteColumnCommand(bool deserializing)
+      : base(deserializing) {
+      deletedColumns = new List<ColumnBase>();
+    }
+
+    public DeleteColumnCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName, affectedColumns) {
+      deletedColumns = new List<ColumnBase>();
+    }
+
+    public override void Execute() {
+      base.Execute();
+      this.oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      if (!ColumnGroup.Columns.Any()) return;
+
+      ColumnBase column;
+      foreach (int columnIndex in AffectedColumns.OrderByDescending(i => i)) {
+        column = ColumnGroup.GetColumn(columnIndex);
+        deletedColumns.Insert(0, column);
+        ColumnGroup.RemoveColumn(column);
+        if (column.SortOrder != SortOrder.None)
+          ColumnGroup.SortedColumnIndexes.Remove(columnIndex);
+      }
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      for (int i = 0; i < deletedColumns.Count; i++)
+        ColumnGroup.InsertColumn(AffectedColumns[i], deletedColumns[i]);
+
+      deletedColumns.Clear();
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      oldSortedColumnIndices = null;
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override string Description {
+      get { return "Columns deleted"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/DeleteRowsCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/DeleteRowsCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/DeleteRowsCommand.cs	(revision 15690)
@@ -0,0 +1,69 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Command {
+  [StorableClass]
+  public class DeleteRowsCommand : ColumnGroupCommandBase {
+    [Storable]
+    private List<int> rowIndexes;
+
+    private List<IComparable[]> oldrows;
+
+    [StorableConstructor]
+    protected DeleteRowsCommand(bool deserializing) : base(deserializing) { }
+
+    public DeleteRowsCommand(DataSet dataSet, string columnGroupName, IEnumerable<int> rowIndexes)
+      : base(dataSet, columnGroupName) {
+      this.rowIndexes = new List<int>(rowIndexes);
+      this.oldrows = new List<IComparable[]>();
+    }
+
+    public override void Execute() {
+      base.Execute();
+      foreach (int pos in this.rowIndexes.Reverse<int>()) {
+        oldrows.Insert(0, ColumnGroup.GetRow(pos));
+        ColumnGroup.DeleteRow(pos);
+      }
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      for (int i = 0; i < rowIndexes.Count; i++)
+        ColumnGroup.InsertRow(this.rowIndexes[i], this.oldrows[i]);
+      oldrows.Clear();
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override string Description {
+      get { return "Delete Rows"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/InsertRowCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/InsertRowCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/InsertRowCommand.cs	(revision 15690)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Command {
+  [StorableClass]
+  public class InsertRowCommand : ColumnGroupCommandBase {
+    [Storable]
+    private int position;
+
+    private ICollection<int> oldSortedColumnIndices;
+    private IEnumerable<SortOrder> oldSortOrder;
+
+    [StorableConstructor]
+    protected InsertRowCommand(bool deserializing) : base(deserializing) { }
+
+    public InsertRowCommand(DataSet dataSet, string columnGroupName, int position)
+      : base(dataSet, columnGroupName) {
+      this.position = position;
+    }
+
+    public override void Execute() {
+      base.Execute();
+      ColumnGroup.InsertRow(position, ColumnGroup.GetEmptyRow());
+      oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      ColumnGroup.DeleteRow(position);
+      ColumnGroup.SortOrdersForColumns = oldSortOrder;
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      oldSortedColumnIndices = null;
+      oldSortOrder = null;
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override string Description {
+      get { return "Empty row inserted"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/PasteValuesCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/PasteValuesCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/PasteValuesCommand.cs	(revision 15690)
@@ -0,0 +1,114 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Command {
+  [StorableClass]
+  public class PasteValuesCommand : ColumnGroupCommandBase {
+    [Storable]
+    private IComparable[,] newValues;
+    [Storable]
+    private int columnIndex;
+    [Storable]
+    private int rowIndex;
+
+    private IComparable[,] oldValues;
+    private int insertedRows;
+    private ICollection<int> oldSortedColumnIndices;
+    private IEnumerable<SortOrder> oldSortOrder;
+
+    [StorableConstructor]
+    protected PasteValuesCommand(bool deserializing) : base(deserializing) { }
+
+    public PasteValuesCommand(DataSet dataSet, string columnGroupName, int columnIndex, int rowIndex, string values)
+      : base(dataSet, columnGroupName) {
+      this.columnIndex = columnIndex;
+      this.rowIndex = rowIndex;
+
+      string[] lines = values.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
+      string[] cells;
+      for (int i = 0; i < lines.Length; i++) {
+        cells = lines[i].Split('\t');
+        if (this.newValues == null) {
+          newValues = new IComparable[cells.Length, lines.Length];
+        }
+        for (int j = 0; j < cells.Length; j++)
+          newValues[j, i] = string.IsNullOrEmpty(cells[j]) ? null : cells[j];
+      }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      oldValues = new IComparable[
+        Math.Min(ColumnGroup.Columns.Count() - columnIndex, newValues.GetLength(0)),
+        Math.Min(ColumnGroup.RowCount - rowIndex, newValues.GetLength(1))];
+      bool rowAdded = false;
+      oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      oldSortOrder = ColumnGroup.SortOrdersForColumns.ToList();
+      for (int row = 0; row < newValues.GetLength(1); row++) {
+        if (row + rowIndex >= ColumnGroup.RowCount) {
+          ColumnGroup.AddRow(ColumnGroup.GetEmptyRow());
+          this.insertedRows++;
+          rowAdded = true;
+        }
+        for (int col = 0; col < newValues.GetLength(0); col++) {
+          if (col + columnIndex < ColumnGroup.Columns.Count()) {
+            if (!rowAdded)
+              oldValues[col, row] = ColumnGroup.Columns.ElementAt(col + columnIndex).GetValue(row + rowIndex);
+            ColumnGroup.Columns.ElementAt(col + columnIndex).ChangeValueOrNull(row + rowIndex, newValues[col, row]);
+          }
+        }
+      }
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      for (int row = 0; row < oldValues.GetLength(1); row++) {
+        for (int col = 0; col < oldValues.GetLength(0); col++) {
+          ColumnGroup.Columns.ElementAt(col + columnIndex).ChangeValue(row + rowIndex, oldValues[col, row]);
+        }
+      }
+      for (int i = 0; i < insertedRows; i++)
+        ColumnGroup.DeleteRow(ColumnGroup.RowCount - 1);
+      oldValues = null;
+      insertedRows = 0;
+      ColumnGroup.SortOrdersForColumns = oldSortOrder;
+      ColumnGroup.SortedColumnIndexes = oldSortedColumnIndices;
+      oldSortedColumnIndices = null;
+      oldSortOrder = null;
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override string Description {
+      get { return "Copied values pasted"; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/RenameColumnCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/RenameColumnCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/RenameColumnCommand.cs	(revision 15690)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Command {
+  [StorableClass]
+  public class RenameColumnCommand : ColumnCommandBase {
+    [Storable]
+    private string newName;
+
+    private string oldName;
+
+    [StorableConstructor]
+    protected RenameColumnCommand(bool deserializing) : base(deserializing) { }
+
+    public RenameColumnCommand(DataSet dataSet, string columnGroupName, int columnIndex, string newName)
+      : base(dataSet, columnGroupName, columnIndex) {
+      this.newName = newName;
+    }
+
+    public override string Description {
+      get { return "Rename Column"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      oldName = Column.Name;
+      Column.Name = newName;
+      Column.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      Column.Name = oldName;
+      oldName = null;
+      Column.FireChanged();
+      this.ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/RenameColumnGroupCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/RenameColumnGroupCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/RenameColumnGroupCommand.cs	(revision 15690)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Linq;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Command {
+  [StorableClass]
+  public class RenameColumnGroupCommand : ColumnGroupCommandBase {
+    [Storable]
+    private string newName;
+
+    private string oldName;
+
+    [StorableConstructor]
+    protected RenameColumnGroupCommand(bool deserializing) : base(deserializing) { }
+
+    public RenameColumnGroupCommand(DataSet dataSet, string columnGroupName, string newName)
+      : base(dataSet, columnGroupName) {
+      this.newName = newName;
+    }
+
+    public override string Description {
+      get { return "Rename ColumnGroup"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      oldName = ColumnGroup.Name;
+      ColumnGroup.Name = newName;
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      ColumnGroup ColumnGroup = this.DataSet.ColumnGroups.Where(cg => cg.Name == newName).First();
+      ColumnGroup.Name = oldName;
+      oldName = null;
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/SortCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/SortCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Command/SortCommand.cs	(revision 15690)
@@ -0,0 +1,155 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+namespace HeuristicLab.DataImporter.Data.Command {
+  [StorableClass]
+  public class SortCommand : ColumnGroupCommandBase {
+    [Storable]
+    private bool addToSortedColumns;
+    [Storable]
+    private int sortColumnIndex;
+
+    private ICollection<int> oldSortedColumnIndices;
+    private IEnumerable<SortOrder> oldSortOrdersForColumns;
+    private int[] indices;
+
+    [StorableConstructor]
+    protected SortCommand(bool deserializing) : base(deserializing) { }
+
+    public SortCommand(DataSet dataSet, string columnGroupName, int sortColumnIndex) :
+      this(dataSet, columnGroupName, sortColumnIndex, false) {
+    }
+
+    public SortCommand(DataSet dataSet, string columnGroupName, int sortColumnIndex, bool addToSortedColumns)
+      : base(dataSet, columnGroupName) {
+      this.addToSortedColumns = addToSortedColumns;
+      this.sortColumnIndex = sortColumnIndex;
+    }
+
+    public override void Execute() {
+      base.Execute();
+      oldSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+      oldSortOrdersForColumns = ColumnGroup.SortOrdersForColumns.ToList();
+
+      if (!addToSortedColumns) {
+        ColumnGroup.SortedColumnIndexes.Clear();
+        for (int i = 0; i < ColumnGroup.Columns.Count(); i++)
+          if (i != sortColumnIndex)
+            ColumnGroup.Columns.ElementAt(i).SortOrder = SortOrder.None;
+      }
+      if (!ColumnGroup.SortedColumnIndexes.Contains(sortColumnIndex))
+        ColumnGroup.SortedColumnIndexes.Add(sortColumnIndex);
+      ICollection<int> tempSortedColumnIndices = new List<int>(ColumnGroup.SortedColumnIndexes);
+
+      RowComparer rowComparer = new RowComparer(ColumnGroup, sortColumnIndex);
+      indices = Enumerable.Range(0, ColumnGroup.RowCount).OrderBy(k => k, rowComparer).ToArray();
+
+      List<ColumnBase> newColumns = Sort();
+      ColumnGroup.ClearColumns();
+      ColumnGroup.AddColumns(newColumns);
+      ColumnGroup.SortedColumnIndexes = tempSortedColumnIndices;
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      indices = Enumerable.Range(0, ColumnGroup.RowCount).OrderBy<int, int>(i => indices[i]).ToArray();
+      List<ColumnBase> newColumns = Sort();
+      ColumnGroup.ClearColumns();
+      ColumnGroup.AddColumns(newColumns);
+      ColumnGroup.SortedColumnIndexes = this.oldSortedColumnIndices;
+      ColumnGroup.SortOrdersForColumns = oldSortOrdersForColumns;
+      indices = null;
+      oldSortedColumnIndices = null;
+      oldSortOrdersForColumns = null;
+      ColumnGroup.FireChanged();
+      this.ColumnGroup = null;
+    }
+
+    public override string Description {
+      get { return "Sort ColumnGroup"; }
+    }
+
+    private List<ColumnBase> Sort() {
+      List<ColumnBase> newColumns = new List<ColumnBase>();
+      ColumnBase newColumn;
+      ColumnBase oldColumn;
+
+      for (int col = 0; col < ColumnGroup.Columns.Count(); col++) {
+        oldColumn = ColumnGroup.GetColumn(col);
+        newColumn = oldColumn.CreateCopyOfColumnWithoutValues();
+        newColumn.SortOrder = oldColumn.SortOrder;
+        if (col == sortColumnIndex) {
+          if (newColumn.SortOrder == SortOrder.None || newColumn.SortOrder == SortOrder.Descending)
+            newColumn.SortOrder = SortOrder.Ascending;
+          else
+            newColumn.SortOrder = SortOrder.Descending;
+        }
+        newColumns.Add(newColumn);
+      }
+
+      for (int j = 0; j < indices.Length; j++) {
+        for (int col = 0; col < ColumnGroup.Columns.Count(); col++)
+          newColumns[col].AddValue(ColumnGroup.Columns.ElementAt(col).GetValue(indices[j]));
+      }
+      return newColumns;
+    }
+
+    private class RowComparer : IComparer<int> {
+      private ColumnGroup columnGroup;
+      private int sortColumnIndex;
+      public RowComparer(ColumnGroup columnGroup, int sortColumnIndex) {
+        this.columnGroup = columnGroup;
+        this.sortColumnIndex = sortColumnIndex;
+      }
+
+      #region IComparer<int> Members
+      public int Compare(int i, int j) {
+        IEnumerator<int> e = columnGroup.SortedColumnIndexes.GetEnumerator();
+        int result = 0;
+        while (result == 0 && e.MoveNext()) {
+          IComparable x = columnGroup.GetColumn(e.Current).GetValue(i);
+          IComparable y = columnGroup.GetColumn(e.Current).GetValue(j);
+          if (x == null) {
+            result = -1;
+            if (y == null)
+              result = 0;
+          } else
+            result = x.CompareTo(y);
+          if (columnGroup.SortOrdersForColumns.ElementAt(e.Current) == SortOrder.Descending)
+            result *= -1;
+          if (e.Current == sortColumnIndex && columnGroup.Columns.ElementAt(e.Current).SortOrder != SortOrder.None)
+            result *= -1;
+        }
+        return result;
+      }
+      #endregion
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ColumnCommandBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ColumnCommandBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ColumnCommandBase.cs	(revision 15690)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using System.Xml;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.CommandBase {
+  [StorableClass]
+  public abstract class ColumnCommandBase : ColumnGroupCommandBase {
+    [Storable]
+    private int columnIndex;
+
+    [StorableConstructor]
+    protected ColumnCommandBase(bool deserializing) : base(deserializing) { }
+
+    protected ColumnCommandBase(DataSet dataSet, string columnGroupName, int columnIndex)
+      : base(dataSet, columnGroupName) {
+      this.columnIndex = columnIndex;
+    }
+
+    protected ColumnBase Column {
+      get { return this.ColumnGroup.GetColumn(columnIndex); }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ColumnGroupCommandBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ColumnGroupCommandBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ColumnGroupCommandBase.cs	(revision 15690)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Linq;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.CommandBase {
+  [StorableClass]
+  public abstract class ColumnGroupCommandBase : DataSetCommandBase {
+    [StorableConstructor]
+    protected ColumnGroupCommandBase(bool deserializing) : base(deserializing) { }
+
+    protected ColumnGroupCommandBase(DataSet dataSet, string columnGroupName)
+      : base(dataSet) {
+      this.columnGroupName = columnGroupName;
+    }
+
+    [Storable]
+    private string columnGroupName;
+    protected string ColumnGroupName {
+      get { return this.columnGroupName; }
+    }
+
+    protected void UpdateColumnGroup() {
+      this.columnGroup = this.DataSet.ColumnGroups.FirstOrDefault(cg => cg.Name == this.columnGroupName);
+    }
+
+    public override void Execute() {
+      base.Execute();
+      this.UpdateColumnGroup();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      this.UpdateColumnGroup();
+    }
+
+    private ColumnGroup columnGroup;
+    protected ColumnGroup ColumnGroup {
+      get { return this.columnGroup; }
+      set { this.columnGroup = value; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ColumnGroupCommandWithAffectedColumnsBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ColumnGroupCommandWithAffectedColumnsBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ColumnGroupCommandWithAffectedColumnsBase.cs	(revision 15690)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.CommandBase {
+  [StorableClass]
+  public abstract class ColumnGroupCommandWithAffectedColumnsBase : ColumnGroupCommandBase {
+    [StorableConstructor]
+    protected ColumnGroupCommandWithAffectedColumnsBase(bool deserializing) : base(deserializing) { }
+
+    protected ColumnGroupCommandWithAffectedColumnsBase(DataSet dataSet, string columnGroupName, int[] affectedColumns)
+      : base(dataSet, columnGroupName) {
+      this.affectedColumns = affectedColumns;
+    }
+
+    [Storable]
+    private int[] affectedColumns;
+    protected int[] AffectedColumns {
+      get { return this.affectedColumns; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/CommandBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/CommandBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/CommandBase.cs	(revision 15690)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.CommandBase {
+  [StorableClass]
+  public abstract class CommandBase : ICommand {
+    [StorableConstructor]
+    protected CommandBase(bool deserializing) : base() { }
+    protected CommandBase() { }
+
+    public abstract void Execute();
+    public abstract void UndoExecute();
+    public abstract string Description { get; }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/CommandExecutionException.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/CommandExecutionException.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/CommandExecutionException.cs	(revision 15690)
@@ -0,0 +1,45 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+
+namespace HeuristicLab.DataImporter.Data.CommandBase {
+  public class CommandExecutionException : Exception {
+
+    public CommandExecutionException(string message, ICommand command)
+      : base(message) {
+      this.command = command;
+    }
+
+    public CommandExecutionException(string message, Exception innerException, ICommand command)
+      : base(message, innerException) {
+      this.command = command;
+    }
+
+    private ICommand command;
+    public ICommand Command {
+      get {return command;}
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/CommandViewBase.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/CommandViewBase.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/CommandViewBase.Designer.cs	(revision 15690)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Data.CommandBase {
+  partial class CommandViewBase {
+    /// <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.SuspendLayout();
+      // 
+      // CommandViewBase
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "CommandViewBase";
+      this.Size = new System.Drawing.Size(176, 100);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/CommandViewBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/CommandViewBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/CommandViewBase.cs	(revision 15690)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Data.CommandBase {
+  public partial class CommandViewBase : UserControl {
+    public CommandViewBase() {
+      InitializeComponent();
+    }
+
+    private ICommand command;
+    public ICommand Command {
+      get { return this.command;}
+      protected set { this.command = value; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/DataSetCommandBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/DataSetCommandBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/DataSetCommandBase.cs	(revision 15690)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.CommandBase {
+  [StorableClass]
+  public abstract class DataSetCommandBase : CommandBase {
+    [StorableConstructor]
+    protected DataSetCommandBase(bool deserializing) : base(deserializing) { }
+
+    protected DataSetCommandBase(DataSet dataSet) {
+      this.dataset = dataSet;
+    }
+
+    private DataSet dataset;
+    public virtual DataSet DataSet {
+      get { return this.dataset; }
+      set { this.dataset = value; }
+    }
+
+    public override void Execute() {
+    }
+
+    public override void UndoExecute() {
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/DataSetCommandWithAffectedColumnGroupsBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/DataSetCommandWithAffectedColumnGroupsBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/DataSetCommandWithAffectedColumnGroupsBase.cs	(revision 15690)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.CommandBase {
+  [StorableClass]
+  public abstract class DataSetCommandWithAffectedColumnGroupsBase : DataSetCommandBase {
+    [StorableConstructor]
+    protected DataSetCommandWithAffectedColumnGroupsBase(bool deserializing) : base(deserializing) { }
+    protected DataSetCommandWithAffectedColumnGroupsBase(DataSet dataSet, List<string> affectedColumnGroupNames)
+      : base(dataSet) {
+      this.affectedColumnGroupNames = affectedColumnGroupNames;
+    }
+
+    [Storable]
+    private List<string> affectedColumnGroupNames;
+    protected List<string> AffectedColumnGroupNames {
+      get { return this.affectedColumnGroupNames; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ICommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ICommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ICommand.cs	(revision 15690)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+
+namespace HeuristicLab.DataImporter.Data.CommandBase {
+  public interface ICommand {
+    void Execute();
+    void UndoExecute();
+    string Description { get;}
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ICommandGenerator.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ICommandGenerator.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ICommandGenerator.cs	(revision 15690)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using HeuristicLab.DataImporter.Data.Model;
+
+namespace HeuristicLab.DataImporter.Data.CommandBase {
+  public interface ICommandGenerator {
+    bool Enabled(DataSetState state);
+    ICommand GenerateCommand(DataSet dataSet);
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ViewableCommandInfoAttribute.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ViewableCommandInfoAttribute.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandBase/ViewableCommandInfoAttribute.cs	(revision 15690)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+
+namespace HeuristicLab.DataImporter.Data.CommandBase {
+  [AttributeUsage(AttributeTargets.Class,AllowMultiple=false,Inherited=false)]
+  public sealed class ViewableCommandInfoAttribute : Attribute{
+    public ViewableCommandInfoAttribute(string name, int activeColumnGroups, ColumnGroupState state, string groupName) {
+      this.name = name;
+      this.groupName = groupName;
+      this.state = new DataSetState(activeColumnGroups, state);
+      this.position = Int32.MaxValue;
+    }
+
+    private DataSetState state;
+    public DataSetState State {
+      get { return this.state; }
+    }
+
+    private string groupName;
+    public string GroupName {
+      get { return this.groupName; }
+    }
+
+    private string name;
+    public string Name {
+      get { return this.name; }
+    }
+
+    private int position;
+    public int Position {
+      get { return this.position; }
+      set { this.position = value; }
+    }
+
+    private Type optionsView;
+    public Type OptionsView {
+      get { return this.optionsView; }
+      set {
+        if (!value.IsSubclassOf(typeof(CommandViewBase)) || value.IsAbstract)
+          throw new ArgumentException("Expected type T with base class CommandInfoViewBase");
+        this.optionsView = value; }
+    }
+
+    public int SelectedColumns {
+      get { return this.state.SelectedColumns; }
+      set { this.state.SelectedColumns = value; }
+    }
+
+    public int MinActiveColumnGroups {
+      get { return state.MinActiveColumnGroups; }
+      set { state.MinActiveColumnGroups = value; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandChain.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandChain.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/CommandChain.cs	(revision 15690)
@@ -0,0 +1,195 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+
+namespace HeuristicLab.DataImporter.Data {
+  [StorableClass]
+  public class CommandChain : IEnumerable<ICommand> {
+    private LinkedList<ICommand> commands;
+    private LinkedListNode<ICommand> lastExecutedCommand;
+    private LinkedListNode<ICommand> startMacroRecordingCommand;
+    private bool isMacroRecording;
+
+    [Storable]
+    private List<ICommand> CommandStorable {
+      get {
+        LinkedListNode<ICommand> cmdNode = null;
+        if (this.isMacroRecording && startMacroRecordingCommand != null)
+          cmdNode = startMacroRecordingCommand.Next;
+        else
+          cmdNode = commands.First;
+
+        List<ICommand> list = new List<ICommand>();
+        while (cmdNode != lastExecutedCommand.Next) {
+          list.Add(cmdNode.Value);
+          cmdNode = cmdNode.Next;
+        }
+        return list;
+      }
+      set {
+        foreach (ICommand command in value)
+          commands.AddLast(command);
+        this.lastExecutedCommand = commands.Last;
+        this.FireChanged();
+      }
+    }
+
+    [StorableConstructor]
+    protected CommandChain(bool deserializing)
+      : base() {
+      this.commands = new LinkedList<ICommand>();
+    }
+    public CommandChain() {
+      this.commands = new LinkedList<ICommand>();
+    }
+
+    public ICommand LastExecutedCommand {
+      get { return lastExecutedCommand == null ? null : lastExecutedCommand.Value; }
+    }
+
+    public int CommandsCount {
+      get { return this.commands.Count; }
+    }
+
+    public bool FirstCommandReached {
+      get { return this.commands.Count == 0 || this.lastExecutedCommand == null; }
+    }
+
+    public bool LastCommandReached {
+      get { return this.commands.Count == 0 || this.lastExecutedCommand == this.commands.Last; }
+    }
+
+    public bool IsMacroRecording {
+      get { return isMacroRecording; }
+    }
+
+    public string NextCommandDescription {
+      get {
+        if (LastCommandReached)
+          return "Redo";
+        else if (lastExecutedCommand == null)
+          return commands.First.Value.Description;
+        else
+          return lastExecutedCommand.Next.Value.Description;
+      }
+    }
+
+    public string PreviousCommandDescription {
+      get { return FirstCommandReached ? "Undo" : lastExecutedCommand.Value.Description; }
+    }
+
+    public event EventHandler Changed;
+    protected virtual void OnChanged() {
+      if (this.Changed != null)
+        this.Changed(this, EventArgs.Empty);
+    }
+    public void FireChanged() {
+      this.OnChanged();
+    }
+
+    public void Add(ICommand command) {
+      this.Add(command, true);
+    }
+
+    public void Add(ICommand command, bool fireChangedEvent) {
+      try {
+        System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
+        command.Execute();
+        while (this.commands.Count != 0 && this.commands.Last != this.lastExecutedCommand)
+          this.commands.RemoveLast();
+        this.commands.AddLast(command);
+        this.lastExecutedCommand = this.commands.Last;
+        GC.Collect();
+        if (fireChangedEvent)
+          this.OnChanged();
+      }
+      finally {
+        System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;
+      }
+    }
+
+    public void Clear() {
+      this.commands.Clear();
+      this.OnChanged();
+    }
+
+    public void Redo() {
+      if (this.lastExecutedCommand != this.commands.Last) {
+        System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
+        if (this.lastExecutedCommand == null)
+          this.lastExecutedCommand = this.commands.First;
+        else
+          this.lastExecutedCommand = this.lastExecutedCommand.Next;
+        try {
+          this.lastExecutedCommand.Value.Execute();
+          this.OnChanged();
+        }
+        catch (CommandExecutionException) {
+          this.lastExecutedCommand = this.lastExecutedCommand.Previous;
+          throw;
+        }
+        finally {
+          System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;
+        }
+      }
+    }
+
+    public void Undo() {
+      if (this.lastExecutedCommand != null) {
+        System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
+        try {
+          this.lastExecutedCommand.Value.UndoExecute();
+          if (this.lastExecutedCommand == this.startMacroRecordingCommand)
+            isMacroRecording = false;
+          this.lastExecutedCommand = this.lastExecutedCommand.Previous;
+          this.OnChanged();
+        }
+        finally {
+          System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;
+        }
+      }
+    }
+
+    public void ToggleMacroRecording() {
+      if (!isMacroRecording)
+        this.startMacroRecordingCommand = lastExecutedCommand;
+      isMacroRecording = !isMacroRecording;
+      this.OnChanged();
+    }
+
+    #region IEnumerable<ICommand> Members
+    public IEnumerator<ICommand> GetEnumerator() {
+      return commands.GetEnumerator();
+    }
+    #endregion
+
+    #region IEnumerable Members
+    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
+      return commands.GetEnumerator();
+    }
+    #endregion
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/DataSetState.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/DataSetState.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/DataSetState.cs	(revision 15690)
@@ -0,0 +1,112 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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;
+
+namespace HeuristicLab.DataImporter.Data {
+  [Flags]
+  public enum ColumnGroupState {
+    None = 0,
+    Active = 1,
+    ColumnSelected = 2 | Active,
+    DoubleColumnSelected = 4 | ColumnSelected,
+    DateTimeColumnSelected = 8 | ColumnSelected,
+    StringColumnSelected = 16 | ColumnSelected,
+    ProgrammableColumnSelected = 32 | ColumnSelected,
+    AnySelectedColumnContainsNull = 64 | ColumnSelected,
+    Sorted = 128 | Active,
+    AnySelectedColumnNotSorted = 256 | Sorted | ColumnSelected
+  }
+
+  public class DataSetState {
+    public DataSetState(int activeColumnGroups, ColumnGroupState state)
+      : this(activeColumnGroups, -1, state) {
+    }
+
+    public DataSetState(int activeColumnGroups, int selectedColumns, ColumnGroupState state) {
+      this.selectedColumns = selectedColumns;
+      this.activeColumnGroups = activeColumnGroups;
+      this.state = state;
+    }
+
+    private int activeColumnGroups;
+    public int ActiveColumnGroups {
+      get { return this.activeColumnGroups; }
+    }
+
+    private int minActiveColumnGroups = int.MaxValue;
+    public int MinActiveColumnGroups {
+      get { return minActiveColumnGroups; }
+      set { minActiveColumnGroups = value; }
+    }
+
+    //only meaningful if activeColumnGroups == 1
+    private int selectedColumns;
+    public int SelectedColumns {
+      get { return activeColumnGroups == 1 ? this.selectedColumns : -1; } //throw Exception instead of return -1
+      set { this.selectedColumns = value; }
+    }
+
+    private ColumnGroupState state;
+    public ColumnGroupState State {
+      get { return this.state; }
+    }
+
+    public void AddColumnGroupState(ColumnGroupState state) {
+      if (state == ColumnGroupState.None)
+        return;
+      activeColumnGroups++;
+      if (this.state == ColumnGroupState.None)
+        this.state = state;
+      else
+        this.state &= state;
+    }
+
+    public bool Enabled(DataSetState other) {
+      if (this.activeColumnGroups == 0)
+        return true;
+      else if (other.activeColumnGroups != this.activeColumnGroups)
+        if (other.activeColumnGroups >= minActiveColumnGroups) return true;
+        else return false;
+      else if (SelectedColumns != -1 && other.SelectedColumns != SelectedColumns)
+        return false;
+      return (this.state & other.state) == this.state;
+    }
+
+    public override bool Equals(object obj) {
+      if (obj == this)
+        return true;
+      else if(obj is DataSetState) {
+        DataSetState other = (DataSetState)obj;
+        return
+          other.activeColumnGroups == this.activeColumnGroups &&
+          other.state == this.state &&
+          this.selectedColumns == other.selectedColumns;
+      }
+      return false;
+    }
+
+    public override int GetHashCode() {
+      return this.activeColumnGroups.GetHashCode() ^ this.state.GetHashCode() ^ this.selectedColumns.GetHashCode();
+    }
+
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/DateTimeSpan.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/DateTimeSpan.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/DateTimeSpan.cs	(revision 15690)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data {
+  [StorableClass]
+  public class DateTimeSpan : ICloneable {
+    public DateTimeSpan() : base() { }
+    [StorableConstructor]
+    protected DateTimeSpan(bool deserializing) : base() { }
+
+    [Storable]
+    public int Seconds { get; set; }
+    [Storable]
+    public int Minutes { get; set; }
+    [Storable]
+    public int Hours { get; set; }
+    [Storable]
+    public int Days { get; set; }
+    [Storable]
+    public int Months { get; set; }
+    [Storable]
+    public int Years { get; set; }
+
+    public static DateTime operator +(DateTime start, DateTimeSpan span) {
+      DateTime ret = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second);
+      ret = ret.AddSeconds(span.Seconds);
+      ret = ret.AddMinutes(span.Minutes);
+      ret = ret.AddHours(span.Hours);
+      ret = ret.AddDays(span.Days);
+      ret = ret.AddMonths(span.Months);
+      ret = ret.AddYears(span.Years);
+      return ret;
+    }
+
+    public object Clone() {
+      DateTimeSpan obj = new DateTimeSpan();
+      obj.Seconds = this.Seconds;
+      obj.Minutes = this.Minutes;
+      obj.Hours = this.Hours;
+      obj.Days = this.Days;
+      obj.Months = this.Months;
+      obj.Years = this.Years;
+      return obj;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/HeuristicLab.DataImporter.Data.csproj
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/HeuristicLab.DataImporter.Data.csproj	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/HeuristicLab.DataImporter.Data.csproj	(revision 15690)
@@ -0,0 +1,217 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.DataImporter.Data</RootNamespace>
+    <AssemblyName>HeuristicLab.DataImporter.Data-1.0</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="CommandBase\ColumnGroupCommandWithAffectedColumnsBase.cs" />
+    <Compile Include="CommandBase\CommandExecutionException.cs" />
+    <Compile Include="CommandBase\CommandViewBase.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CommandBase\CommandViewBase.Designer.cs">
+      <DependentUpon>CommandViewBase.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CommandBase\DataSetCommandWithAffectedColumnGroupsBase.cs" />
+    <Compile Include="CommandBase\ICommandGenerator.cs" />
+    <Compile Include="CommandBase\ViewableCommandInfoAttribute.cs" />
+    <Compile Include="Command\AddRowCommand.cs" />
+    <Compile Include="Command\ChangeValueCommand.cs" />
+    <Compile Include="Command\ChangeValuesToNullCommand.cs" />
+    <Compile Include="Command\InsertRowCommand.cs" />
+    <Compile Include="Command\PasteValuesCommand.cs" />
+    <Compile Include="CommandBase\CommandBase.cs" />
+    <Compile Include="Command\DeleteColumnCommand.cs" />
+    <Compile Include="Command\DeleteRowsCommand.cs" />
+    <Compile Include="Command\RenameColumnCommand.cs" />
+    <Compile Include="Command\RenameColumnGroupCommand.cs" />
+    <Compile Include="DataSetState.cs" />
+    <Compile Include="DateTimeSpan.cs" />
+    <Compile Include="Model\DynamicValueList.cs" />
+    <Compile Include="Model\ProgrammableColumn.cs" />
+    <Compile Include="Model\DateTimeColumn.cs" />
+    <Compile Include="CommandBase\ColumnGroupCommandBase.cs" />
+    <Compile Include="CommandBase\ColumnCommandBase.cs" />
+    <Compile Include="Command\SortCommand.cs" />
+    <Compile Include="Model\DataSet.cs" />
+    <Compile Include="Model\DoubleColumn.cs" />
+    <Compile Include="Model\ColumnGroup.cs" />
+    <Compile Include="Model\ColumnBase.cs" />
+    <Compile Include="View\ColumnGroupView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\ColumnGroupView.Designer.cs">
+      <DependentUpon>ColumnGroupView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Model\StringColumn.cs" />
+    <Compile Include="CommandBase\DataSetCommandBase.cs" />
+    <Compile Include="View\CommandListViewItem.cs" />
+    <Compile Include="View\CommandViewDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="View\CommandViewDialog.Designer.cs">
+      <DependentUpon>CommandViewDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="View\DataSetView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="View\DataSetView.Designer.cs">
+      <DependentUpon>DataSetView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CommandChain.cs">
+    </Compile>
+    <Compile Include="CommandBase\ICommand.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/ColumnBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/ColumnBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/ColumnBase.cs	(revision 15690)
@@ -0,0 +1,168 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Windows.Forms;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Model {
+  [StorableClass]
+  public abstract class ColumnBase {
+    [StorableConstructor]
+    protected ColumnBase(bool deserializing) : base() { }
+
+    protected ColumnBase(string name)
+      : base() {
+      this.sortOrder = SortOrder.None;
+      this.name = name;
+    }
+
+    public abstract Type DataType { get; }
+
+    [Storable]
+    private string name;
+    public string Name {
+      get { return name; }
+      set { this.name = value; }
+    }
+
+    private bool selected;
+    public bool Selected {
+      get { return this.selected; }
+      set { this.selected = value; }
+    }
+
+    [Storable]
+    private SortOrder sortOrder;
+    public SortOrder SortOrder {
+      get { return sortOrder; }
+      set { this.sortOrder = value; }
+    }
+
+    public override string ToString() {
+      return this.name;
+    }
+
+    protected abstract IList Values { get; }
+    public IEnumerable ValuesEnumerable {
+      get { return this.Values; }
+    }
+
+    public IComparable Minimum {
+      get {
+        IComparable min = null;
+        foreach (IComparable val in Values)
+          if (val != null && (min == null || val.CompareTo(min) <= 0))
+            min = val;
+        return min;
+      }
+    }
+
+    public IComparable Maximum {
+      get {
+        IComparable max = null;
+        foreach (IComparable val in Values)
+          if (val != null && (max == null || val.CompareTo(max) >= 0))
+            max = val;
+        return max;
+      }
+    }
+
+    public int TotalValuesCount {
+      get { return this.Values.Count; }
+    }
+
+    public int NonNullValuesCount {
+      get { return TotalValuesCount - NullValuesCount; }
+    }
+
+    public int NullValuesCount {
+      get {
+        int i = 0;
+        foreach (IComparable value in Values)
+          if (value == null)
+            i++;
+        return i;
+      }
+    }
+
+    public IComparable GetValue(int index) {
+      if (index >= this.TotalValuesCount || index < 0)
+        return null;
+      return (IComparable)this.Values[index];
+    }
+
+    public bool ContainsNullValues {
+      get {
+        for (int i = 0; i < this.Values.Count; i++) {
+          if (this.Values[i] == null)
+            return true;
+        }
+        return false;
+      }
+    }
+
+    public bool ContainsNotNullValues {
+      get {
+        for (int i = 0; i < this.Values.Count; i++) {
+          if (this.Values[i] != null)
+            return true;
+        }
+        return false;
+      }
+    }
+
+    public void Resize(int size) {
+      int oldCnt = this.TotalValuesCount;
+      if (size > oldCnt) {
+        for (int i = 0; i < size - oldCnt; i++)
+          this.AddValue(null);
+      } else {
+        for (int i = 0; i < oldCnt - size; i++)
+          this.Values.RemoveAt(this.TotalValuesCount - 1);
+      }
+    }
+
+    public abstract void AddValue(IComparable value);
+    public abstract void AddValueOrNull(IComparable value);
+    public abstract void InsertValue(int position, IComparable value);
+    public abstract void ChangeValue(int position, IComparable value);
+    public abstract void ChangeValueOrNull(int position, IComparable value);
+    public abstract void ChangeValueOrLeaveOldValue(int position, IComparable value);
+
+    public void RemoveValue(int position) {
+      this.Values.RemoveAt(position);
+    }
+
+    public abstract ColumnBase CreateCopyOfColumnWithoutValues();
+    public abstract ColumnBase CreateCopyOfColumnWithoutValues(int capacity);
+
+    public event EventHandler Changed;
+    protected virtual void OnChanged() {
+      if (this.Changed != null)
+        this.Changed(this, EventArgs.Empty);
+    }
+    public void FireChanged() {
+      this.OnChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/ColumnGroup.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/ColumnGroup.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/ColumnGroup.cs	(revision 15690)
@@ -0,0 +1,238 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Windows.Forms;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Model {
+  [StorableClass]
+  public class ColumnGroup {
+    [StorableConstructor]
+    protected ColumnGroup(bool deserializing) : base() { }
+    public ColumnGroup()
+      : base() {
+      this.columns = new List<ColumnBase>();
+      this.sortedColumnIndexes = new List<int>();
+    }
+
+    public ColumnGroup(string name)
+      : this() {
+      this.name = name;
+    }
+
+    private bool active;
+    public bool Active {
+      get { return active; }
+      set { this.active = value; }
+    }
+
+    public IEnumerable<SortOrder> SortOrdersForColumns {
+      get { return columns.Select(col => col.SortOrder); }
+      set {
+        int i = 0;
+        foreach (SortOrder order in value) {
+          columns[i].SortOrder = order;
+          i++;
+        }
+      }
+    }
+
+    [Storable]
+    private ICollection<int> sortedColumnIndexes;
+    public ICollection<int> SortedColumnIndexes {
+      get { return this.sortedColumnIndexes; }
+      set { this.sortedColumnIndexes = value; }
+    }
+
+    public bool Sorted {
+      get { return SortOrdersForColumns.Any(x => x != SortOrder.None); }
+    }
+
+    public int SortedColumnsCount {
+      get { return SortOrdersForColumns.Count(x => x != SortOrder.None); }
+    }
+
+    public void ResetSorting() {
+      foreach (ColumnBase column in this.columns)
+        column.SortOrder = SortOrder.None;
+      sortedColumnIndexes.Clear();
+    }
+
+    public string KeyString(int row) {
+      string x = "";
+      IComparable val;
+      foreach (int colIndex in sortedColumnIndexes) {
+        val = columns[colIndex].GetValue(row);
+        if (val != null)
+          x += val.ToString();
+      }
+      return x;
+    }
+
+    [Storable]
+    private string name;
+    public string Name {
+      get { return this.name; }
+      set { this.name = value; }
+    }
+
+    [Storable]
+    private List<ColumnBase> columns;
+    public IEnumerable<ColumnBase> Columns {
+      get { return this.columns; }
+    }
+
+    public int RowCount {
+      get {
+        return this.columns.Count == 0 ? 0 :
+          this.columns.Max<ColumnBase, int>(x => x.TotalValuesCount);
+      }
+    }
+
+    public IEnumerable<ColumnBase> SelectedColumns {
+      get { return this.columns.Where<ColumnBase>(col => col.Selected); }
+    }
+
+    public int[] SelectedColumnIndexes {
+      get {
+        List<int> selectedIndexes = new List<int>();
+        for (int i = 0; i < this.columns.Count; i++)
+          if (columns[i].Selected)
+            selectedIndexes.Add(i);
+        return selectedIndexes.ToArray();
+      }
+    }
+
+    public void ClearSelectedColumns() {
+      foreach (ColumnBase col in this.columns)
+        col.Selected = false;
+    }
+
+    public void SelectAllColumns() {
+      foreach (ColumnBase col in this.columns)
+        col.Selected = true;
+    }
+
+
+    public void AddColumn(ColumnBase column) {
+      column.Changed += ColumnChanged;
+      this.columns.Add(column);
+    }
+
+    public void AddColumns(IEnumerable<ColumnBase> columns) {
+      foreach (ColumnBase col in columns)
+        this.AddColumn(col);
+    }
+
+    public void InsertColumn(int position, ColumnBase column) {
+      column.Changed += ColumnChanged;
+      this.columns.Insert(position, column);
+    }
+
+    public void RemoveColumn(ColumnBase column) {
+      if (sortedColumnIndexes.Contains(IndexOfColumn(column)))
+        ResetSorting();
+      column.Changed -= ColumnChanged;
+      this.columns.Remove(column);
+    }
+
+    public void RemoveColumn(int columnIndex) {
+      if (sortedColumnIndexes.Contains(columnIndex))
+        ResetSorting();
+      columns[columnIndex].Changed -= ColumnChanged;
+      this.columns.RemoveAt(columnIndex);
+    }
+
+    public int IndexOfColumn(ColumnBase column) {
+      return this.columns.IndexOf(column);
+    }
+
+    public void ClearColumns() {
+      foreach (ColumnBase col in this.columns)
+        col.Changed -= ColumnChanged;
+      ResetSorting();
+      this.columns.Clear();
+    }
+
+    public ColumnBase GetColumn(int position) {
+      return this.columns[position];
+    }
+
+    public void ReplaceColumn(int position, ColumnBase column) {
+      if (sortedColumnIndexes.Contains(position))
+        ResetSorting();
+      this.columns[position].Changed -= ColumnChanged;
+      column.Changed += ColumnChanged;
+      this.columns[position] = column;
+    }
+
+    #region methods for row manipulation
+    public IComparable[] GetRow(int index) {
+      IComparable[] ret = new IComparable[this.columns.Count];
+      for (int i = 0; i < this.columns.Count; i++)
+        ret[i] = this.columns[i].GetValue(index);
+      return ret;
+    }
+
+    public IComparable[] GetEmptyRow() {
+      IComparable[] ret = new IComparable[this.columns.Count];
+      for (int i = 0; i < this.columns.Count; i++)
+        ret[i] = null;
+      return ret;
+    }
+
+    public void AddRow(IComparable[] row) {
+      for (int i = 0; i < this.columns.Count; i++)
+        this.columns[i].AddValueOrNull(row[i]);
+    }
+
+    public void DeleteRow(int index) {
+      for (int i = 0; i < this.columns.Count; i++)
+        this.columns[i].RemoveValue(index);
+    }
+
+    public void InsertRow(int index, IComparable[] row) {
+      for (int i = 0; i < this.columns.Count; i++)
+        this.columns[i].InsertValue(index, row[i]);
+    }
+    #endregion
+
+    public void ColumnChanged(object sender, EventArgs e) {
+      this.OnChanged();
+    }
+
+    public override string ToString() {
+      return this.name;
+    }
+
+    public event EventHandler Changed;
+    protected virtual void OnChanged() {
+      if (this.Changed != null)
+        this.Changed(this, EventArgs.Empty);
+    }
+    public void FireChanged() {
+      this.OnChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/DataSet.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/DataSet.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/DataSet.cs	(revision 15690)
@@ -0,0 +1,105 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Model {
+  [StorableClass]
+  public class DataSet {
+
+    [Storable]
+    private List<ColumnGroup> columnGroups;
+    public IEnumerable<ColumnGroup> ColumnGroups {
+      get { return this.columnGroups; }
+    }
+    [StorableConstructor]
+    protected DataSet(bool deserializing) : base() { }
+    public DataSet() {
+      this.columnGroups = new List<ColumnGroup>();
+    }
+
+    public event EventHandler Changed;
+    protected virtual void OnChanged() {
+      if (this.Changed != null)
+        this.Changed(this, EventArgs.Empty);
+    }
+    public void FireChanged() {
+      this.OnChanged();
+    }
+
+    public void AddColumnGroup(ColumnGroup columnGroup) {
+      this.CheckColumnGroupName(columnGroup);
+      this.columnGroups.Add(columnGroup);
+    }
+
+    public void AddColumnGroups(IEnumerable<ColumnGroup> columnGroups) {
+      foreach (ColumnGroup columnGroup in columnGroups) {
+        this.CheckColumnGroupName(columnGroup);
+      }
+      this.columnGroups.AddRange(columnGroups);
+    }
+
+    private void CheckColumnGroupName(ColumnGroup columnGroup) {
+      int i = 0;
+      string columnGroupName = columnGroup.Name;
+      while (this.ColumnGroups.Any(cg => cg.Name == columnGroupName && cg != columnGroup)) {
+        i++;
+        columnGroupName = columnGroup.Name + " " + i;
+      }
+      columnGroup.Name = columnGroupName;
+    }
+
+    public void InsertColumnGroup(int position, ColumnGroup columnGroup) {
+      this.CheckColumnGroupName(columnGroup);
+      this.columnGroups.Insert(position, columnGroup);
+    }
+
+    public void ReplaceColumnGroup(int position, ColumnGroup columnGroup) {
+      this.columnGroups[position] = columnGroup;
+      this.CheckColumnGroupName(columnGroup);
+    }
+
+    public void RemoveColumnGroup(ColumnGroup columnGroup) {
+      this.columnGroups.Remove(columnGroup);
+    }
+
+    public int IndexOfColumnGroup(ColumnGroup columnGroup) {
+      return this.columnGroups.IndexOf(columnGroup);
+    }
+
+    public ColumnGroup GetColumnGroup(string columnGroupName) {
+      IEnumerable<ColumnGroup> groups = this.columnGroups.Where(g => g.Name == columnGroupName);
+      if (groups.Count() != 1)
+        throw new InvalidOperationException("Found 0 or more than 1 column group with the name \"" + columnGroupName + "\".");
+      return groups.First();
+
+    }
+
+    public IEnumerable<ColumnGroup> ActiveColumnGroups {
+      get {
+        return this.columnGroups.Where(cg => cg.Active);
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/DateTimeColumn.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/DateTimeColumn.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/DateTimeColumn.cs	(revision 15690)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Globalization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Model {
+  [StorableClass]
+  public class DateTimeColumn : ColumnBase {
+    [Storable]
+    private List<DateTime?> values;
+
+    [StorableConstructor]
+    protected DateTimeColumn(bool deserializing) : base(deserializing) { }
+
+    public DateTimeColumn(string columnName)
+      : base(columnName) {
+      this.values = new List<DateTime?>();
+    }
+
+    public DateTimeColumn(string columnName, int capacity)
+      : this(columnName) {
+      this.values.Capacity = capacity;
+    }
+
+    public override Type DataType {
+      get { return typeof(DateTime?); }
+    }
+
+    public override string ToString() {
+      return base.ToString() + " <Date>";
+    }
+
+    protected override System.Collections.IList Values {
+      get { return this.values; }
+    }
+
+    public override void AddValue(IComparable value) {
+      this.values.Add((DateTime?)value);
+    }
+
+    public override void AddValueOrNull(IComparable value) {
+      this.values.Add(ConvertToDateTime(value));
+    }
+
+    public override void ChangeValue(int position, IComparable value) {
+      this.values[position] = (DateTime?)value;
+    }
+
+    public override void ChangeValueOrNull(int position, IComparable value) {
+      this.values[position] = ConvertToDateTime(value);
+    }
+
+    public override void ChangeValueOrLeaveOldValue(int position, IComparable value) {
+      if (value == null)
+        this.values[position] = null;
+      else {
+        DateTime? val = ConvertToDateTime(value);
+        if (val != null)
+          this.values[position] = val;
+      }
+    }
+
+    public override void InsertValue(int position, IComparable value) {
+      this.values.Insert(position, (DateTime?)value);
+    }
+
+    private DateTime? ConvertToDateTime(IComparable value) {
+      DateTime val;
+
+      if (value == null)
+        return null;
+
+      if (DateTime.TryParse(value.ToString(), out val))
+        return val;
+
+      if (DateTime.TryParseExact(value.ToString(), "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.None, out val))
+        return val;
+
+      return null;
+    }
+
+    public override ColumnBase CreateCopyOfColumnWithoutValues() {
+      return CreateCopyOfColumnWithoutValues(this.values.Capacity);
+    }
+
+    public override ColumnBase CreateCopyOfColumnWithoutValues(int capacity) {
+      return new DateTimeColumn(this.Name, capacity);
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/DoubleColumn.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/DoubleColumn.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/DoubleColumn.cs	(revision 15690)
@@ -0,0 +1,172 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Globalization;
+using System.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Model {
+  [StorableClass]
+  public class DoubleColumn : ColumnBase {
+    [Storable]
+    private List<double?> values;
+
+    [StorableConstructor]
+    protected DoubleColumn(bool deserializing) : base(deserializing) { }
+
+    public DoubleColumn(string columnName)
+      : base(columnName) {
+      this.values = new List<double?>();
+    }
+
+    public DoubleColumn(string columnName, int capacity)
+      : this(columnName) {
+      this.values.Capacity = capacity;
+    }
+
+    public override Type DataType {
+      get { return typeof(double?); }
+    }
+
+    public override string ToString() {
+      return base.ToString() + " <Double>";
+    }
+
+    protected override IList Values {
+      get { return this.values; }
+    }
+
+    public override void AddValue(IComparable value) {
+      this.values.Add((double?)value);
+    }
+
+    public override void AddValueOrNull(IComparable value) {
+      this.values.Add(ConvertToDouble(value));
+    }
+
+    public override void InsertValue(int position, IComparable value) {
+      this.values.Insert(position, (double?)value);
+    }
+
+    public override void ChangeValue(int position, IComparable value) {
+      this.values[position] = (double?)value;
+    }
+
+    public override void ChangeValueOrNull(int position, IComparable value) {
+      this.values[position] = ConvertToDouble(value);
+    }
+
+    public override void ChangeValueOrLeaveOldValue(int position, IComparable value) {
+      if (value == null)
+        this.values[position] = null;
+      else {
+        double? val = ConvertToDouble(value);
+        if (val != null)
+          this.values[position] = val;
+      }
+    }
+
+    private double? ConvertToDouble(IComparable value) {
+      double? val = null;
+      double test;
+      if (value != null) {
+        if (value is DateTime)
+          val = double.Parse(((DateTime)value).ToString("yyyyMMddHHmmss"));
+        else if (value is string) {
+          string s = value.ToString();
+          if (s.StartsWith("."))
+            s = s.Insert(0, "0");
+          else if (s.StartsWith("-."))
+            s = s.Insert(1, "0");
+          CultureInfo culture = CultureInfo.CurrentCulture;
+          if (s.Contains('.'))
+            culture = CultureInfo.InvariantCulture;
+          if (double.TryParse(s, NumberStyles.Any, culture, out test))
+            val = test;
+        } else if (value is double)
+          val = (double)value;
+      }
+      return val;
+    }
+
+    public double? Mean {
+      get {
+        double sum = 0;
+        int cnt = 0;
+        for (int i = 0; i < this.values.Count; i++) {
+          if (this.values[i] != null) {
+            sum += (double)this.values[i];
+            cnt++;
+          }
+        }
+        if (cnt != 0)
+          return sum / cnt;
+        else
+          return null;
+      }
+    }
+
+    public double? StandardDeviation {
+      get {
+        double? mean = Mean;
+        double sum = 0;
+        if (mean == null)
+          return null;
+
+        for (int i = 0; i < this.values.Count; i++) {
+          if (values[i] == null)
+            continue;
+          sum += Math.Pow((double)(values[i] - mean), 2.0);
+        }
+        return Math.Sqrt(sum / NonNullValuesCount);
+      }
+    }
+
+    public double? Median {
+      get {
+        return GetMedian(0, this.TotalValuesCount);
+      }
+    }
+
+    public double? GetMedian(int startIndex, int endIndex) {
+      List<double?> sortedValues = values.GetRange(startIndex, endIndex - startIndex).Where(x => x != null).ToList(); ;
+      if (sortedValues.Count == 0)
+        return null;
+
+      sortedValues.Sort();
+      if (sortedValues.Count % 2 == 0)
+        return (sortedValues[sortedValues.Count / 2] + sortedValues[sortedValues.Count / 2 - 1]) / 2;
+      else
+        return sortedValues[sortedValues.Count / 2];
+    }
+
+    public override ColumnBase CreateCopyOfColumnWithoutValues() {
+      return CreateCopyOfColumnWithoutValues(this.values.Capacity);
+    }
+
+    public override ColumnBase CreateCopyOfColumnWithoutValues(int capacity) {
+      return new DoubleColumn(this.Name, capacity);
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/DynamicValueList.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/DynamicValueList.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/DynamicValueList.cs	(revision 15690)
@@ -0,0 +1,319 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Collections;
+using System.Linq;
+using System.Text;
+using System.Xml;
+using System.Globalization;
+using System.Linq.Expressions;
+using System.Diagnostics;
+
+namespace HeuristicLab.DataImporter.Data.Model {
+  internal class DynamicValueList : IList {
+
+    private Func<int, int, double?> expression;
+    private ColumnGroup columnGroup;
+    private int count;
+    private int recursiveIndex;
+
+    public int RecursiveIndex {
+      get { return recursiveIndex; }
+      set { recursiveIndex = value; }
+    }
+    private object syncRoot = new object();
+
+    public DynamicValueList(string expression, ColumnGroup columnGroup) {
+      this.columnGroup = columnGroup;
+      recursiveIndex = -1;
+      this.expression = Parse(expression);
+      count = columnGroup.RowCount;
+    }
+
+    public void IncreaseLength() {
+      count++;
+    }
+
+    public void DecreaseLength() {
+      count--;
+    }
+
+    #region IList Members
+
+    public int IndexOf(object item) {
+      if (!(item is double?)) return -1;
+      double? d = (double?)item;
+      for (int i = 0; i < Count; i++) {
+        if (d == (double?)this[i]) return i;
+      }
+      // not found
+      return -1;
+    }
+
+    public void Insert(int index, object item) {
+      throw new NotSupportedException();
+    }
+
+    public void RemoveAt(int index) {
+      throw new NotSupportedException();
+    }
+
+    public object this[int index] {
+      get {
+        return EvaluateExpression(index);
+      }
+      set {
+        throw new NotSupportedException();
+      }
+    }
+
+    int IList.Add(object value) {
+      throw new NotSupportedException();
+    }
+
+    public bool IsFixedSize {
+      get { return false; }
+    }
+
+    void IList.Remove(object value) {
+      throw new NotSupportedException();
+    }
+
+
+
+    private Func<int, int, double?> Parse(string expression) {
+      // make sure that every operator is separated from other tokens with a whitespace
+      // to allow splitting into tokens by whitespace
+      expression = expression.Replace("+", " + ");
+      expression = expression.Replace("-", " - ");
+      expression = expression.Replace("*", " * ");
+      expression = expression.Replace("/", " / ");
+      expression = expression.Replace("(", " ( ");
+      expression = expression.Replace(")", " ) ");
+
+      var tokens = expression.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
+      LookAheadOneEnumerator enumerator = new LookAheadOneEnumerator(tokens);
+      ParameterExpression parameter = Expression.Parameter(typeof(int), "index");
+      ParameterExpression forbiddenColumnIndexParameter = Expression.Parameter(typeof(int), "forbiddenIndex");
+      // move to first token
+      if (tokens.Length == 0) {
+        // empty expression => evaluate to missing value
+        return Expression.Lambda<Func<int, int, double?>>(Expression.Constant(null, typeof(double?)), parameter, forbiddenColumnIndexParameter).Compile();
+      } else {
+        // "index" is a free parameter to access rows of columns by index
+        // all Invoke expressions for column symbols must use the same index parameter (referentially equal)
+        // so we have to create it at root level and push it down to the terminals
+        return Expression.Lambda<Func<int, int, double?>>(ParseSimpleExpression(enumerator, parameter, forbiddenColumnIndexParameter), parameter, forbiddenColumnIndexParameter).Compile();
+      }
+    }
+
+    private Expression ParseSimpleExpression(LookAheadOneEnumerator tokens, ParameterExpression indexParameter, ParameterExpression forbiddenColumnIndexParameter) {
+      Expression term;
+      string peek = tokens.Peek;
+      if (peek == "-") {
+        tokens.MoveNext(); // move to "-"  
+        term = Expression.Negate(ParseTerm(tokens, indexParameter, forbiddenColumnIndexParameter));
+      } else if (peek == "+") {
+        tokens.MoveNext(); // move to "+" 
+        term = ParseTerm(tokens, indexParameter, forbiddenColumnIndexParameter);
+      } else {
+        term = ParseTerm(tokens, indexParameter, forbiddenColumnIndexParameter);
+      }
+      while (tokens.HasNext &&
+        (tokens.Peek == "+" || tokens.Peek == "-")) {
+        tokens.MoveNext(); // move to operator
+        if (tokens.Current == "+") {
+          term = Expression.Add(term, ParseTerm(tokens, indexParameter, forbiddenColumnIndexParameter));
+        } else if (tokens.Current == "-") {
+          term = Expression.Subtract(term, ParseTerm(tokens, indexParameter, forbiddenColumnIndexParameter));
+        }
+      }
+      if (tokens.HasNext && tokens.Peek != ")") throw new ParseException("Couldn't parse the full exception.");
+      return term;
+    }
+
+    private Expression ParseTerm(LookAheadOneEnumerator tokens, ParameterExpression indexParameter, ParameterExpression forbiddenColumnIndexParameter) {
+      Expression fact = ParseFact(tokens, indexParameter, forbiddenColumnIndexParameter);
+      while (tokens.HasNext &&
+        (tokens.Peek == "*" || tokens.Peek == "/")) {
+        tokens.MoveNext(); // set to operator
+        if (tokens.Current == "*") {
+          fact = Expression.Multiply(fact, ParseFact(tokens, indexParameter, forbiddenColumnIndexParameter));
+        } else if (tokens.Current == "/") {
+          fact = Expression.Divide(fact, ParseFact(tokens, indexParameter, forbiddenColumnIndexParameter));
+        }
+      }
+      return fact;
+    }
+
+    private Expression ParseFact(LookAheadOneEnumerator tokens, ParameterExpression indexParameter, ParameterExpression forbiddenColumnIndexParameter) {
+      Expression fact;
+      if (tokens.Peek == "(") {
+        tokens.MoveNext(); // set to "("
+        fact = ParseSimpleExpression(tokens, indexParameter, forbiddenColumnIndexParameter);
+        // expect ")"
+        if (!(tokens.HasNext && tokens.Peek == ")")) throw new ParseException(@""")"" expected instead of """ + tokens + @""".");
+        tokens.MoveNext(); // set to ")"
+        return fact;
+      } else {
+        double c;
+        int columnIndex;
+        tokens.MoveNext(); // set to terminal
+        if (double.TryParse(tokens.Current, out c)) {
+          return Expression.Constant(c, typeof(double?));
+        } else if (TryTranslateColumnIndex(tokens.Current.ToUpper(), out columnIndex)) {
+          Expression<Func<int, int, double?>> readValueExp =
+            (index, forbiddenIndex) =>
+              (columnIndex < columnGroup.Columns.Count() &&
+               columnIndex != forbiddenIndex &&
+               columnGroup.GetColumn(columnIndex).DataType == typeof(double?) &&
+               index < columnGroup.GetColumn(columnIndex).TotalValuesCount) ?
+              (double?)columnGroup.GetColumn(columnIndex).GetValue(index) : null;
+          return Expression.Invoke(readValueExp, indexParameter, forbiddenColumnIndexParameter);
+        } else {
+          throw new ParseException("Unknown terminal: " + tokens.Current);
+        }
+      }
+    }
+
+    private bool TryTranslateColumnIndex(string symb, out int columnIndex) {
+      if (symb.Length == 1) {       // 'A' .. 'Z'
+        return TryTranslateColumnIndexDigit(symb[0], out columnIndex);
+      } else if (symb.Length == 2) { // 'AA' ... 'ZZ'
+        bool ok;
+        int d0, d1;
+        ok = TryTranslateColumnIndexDigit(symb[0], out d1) & TryTranslateColumnIndexDigit(symb[1], out d0);
+        columnIndex = (d1 + 1) * 26 + d0;
+        return ok;
+      } else {
+        columnIndex = 0;
+        return false;
+      }
+    }
+
+    private bool TryTranslateColumnIndexDigit(char d, out int columnIndex) {
+      if (d < 'A' || d > 'Z') {
+        columnIndex = 0;
+        return false;
+      } else {
+        columnIndex = d - 'A';
+        return true;
+      }
+    }
+
+    private double? EvaluateExpression(int index) {
+      return expression(index, recursiveIndex);
+    }
+
+    #endregion
+
+    #region ICollection Members
+
+    public void Add(object item) {
+      throw new NotSupportedException();
+    }
+
+    public void Clear() {
+      throw new NotSupportedException();
+    }
+
+    public bool Contains(object item) {
+      return IndexOf(item) != -1;
+    }
+
+    public int Count {
+      get { return count; }
+    }
+
+    public bool IsReadOnly {
+      get { return true; }
+    }
+
+    public bool Remove(object item) {
+      throw new NotSupportedException();
+    }
+
+    public void CopyTo(Array array, int index) {
+      for (int i = index; i < array.Length && i < Count; i++) {
+        array.SetValue(this[i], i);
+      }
+    }
+
+    public bool IsSynchronized {
+      get { return false; }
+    }
+
+    public object SyncRoot {
+      get { return syncRoot; }
+    }
+
+    #endregion
+
+    #region IEnumerable Members
+
+    IEnumerator IEnumerable.GetEnumerator() {
+      for (int i = 0; i < Count; i++)
+        yield return this[i];
+    }
+
+    #endregion
+
+    // private enumerator class with one lookahead symbol (Peek) needed to parse expressions
+    private class LookAheadOneEnumerator {
+      private string[] tokens;
+      private int index;
+
+      public LookAheadOneEnumerator(string[] tokens) {
+        this.tokens = tokens;
+        index = -1;
+      }
+
+      public void MoveNext() {
+        if (HasNext) index++;
+        else throw new InvalidOperationException("End of the token stream");
+      }
+
+      public bool HasNext {
+        get { return index < tokens.Length - 1; }
+      }
+      public string Current {
+        get {
+          if (index < 0) throw new InvalidOperationException("Not initialized. Call MoveNext() first");
+          else return tokens[index];
+        }
+      }
+      public string Peek {
+        get {
+          if (HasNext) {
+            return tokens[index + 1];
+          } else
+            return "";
+        }
+      }
+    }
+  }
+
+  public class ParseException : Exception {
+    public ParseException(string message) : base(message) { }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/ProgrammableColumn.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/ProgrammableColumn.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/ProgrammableColumn.cs	(revision 15690)
@@ -0,0 +1,130 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Linq;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Model {
+  [StorableClass]
+  public class ProgrammableColumn : ColumnBase {
+    private DynamicValueList dynamicValues;
+    [Storable]
+    private int myIndexInColumnGroup;
+
+    [StorableConstructor]
+    protected ProgrammableColumn(bool deserializing) : base(deserializing) { }
+
+    public ProgrammableColumn(string columnName, ColumnGroup columnGroup)
+      : base(columnName) {
+      this.ColumnGroup = columnGroup;
+      Expression = string.Empty;
+    }
+
+    public override Type DataType {
+      get { return typeof(double?); }
+    }
+
+    private string expression;
+    [Storable]
+    public string Expression {
+      get { return expression; }
+      set {
+        expression = value;
+        dynamicValues = new DynamicValueList(expression, columnGroup);
+        dynamicValues.RecursiveIndex = myIndexInColumnGroup;
+      }
+    }
+
+    private ColumnGroup columnGroup;
+    [Storable]
+    private ColumnGroup ColumnGroup {
+      get { return this.columnGroup; }
+      set {
+        if (this.columnGroup != null)
+          this.columnGroup.Changed -= new EventHandler(columnGroup_Changed);
+        this.columnGroup = value;
+        RefreshMyIndex();
+        if (this.columnGroup != null)
+          columnGroup.Changed += new EventHandler(columnGroup_Changed);
+      }
+    }
+
+    public void columnGroup_Changed(object sender, EventArgs e) {
+      RefreshMyIndex();
+      dynamicValues.RecursiveIndex = myIndexInColumnGroup;
+    }
+
+    private void RefreshMyIndex() {
+      // find the index of this column to prevent recursive expressions
+      for (int i = 0; i < columnGroup.Columns.Count(); i++) {
+        if (columnGroup.GetColumn(i) == this) {
+          myIndexInColumnGroup = i;
+          return;
+        }
+      }
+      myIndexInColumnGroup = columnGroup.Columns.Count();
+    }
+
+    public override string ToString() {
+      return base.ToString() + " <Programmable>\n" + expression;
+    }
+
+    protected override IList Values {
+      get { return (IList)dynamicValues; }
+    }
+
+    public override void AddValue(IComparable value) {
+      dynamicValues.IncreaseLength();
+    }
+
+    public override void AddValueOrNull(IComparable value) {
+      dynamicValues.IncreaseLength();
+    }
+
+    public override void InsertValue(int position, IComparable value) {
+      dynamicValues.IncreaseLength();
+    }
+
+    public override void ChangeValue(int position, IComparable value) {
+      throw new NotSupportedException("Can't change values of a programmable column");
+    }
+
+    public override void ChangeValueOrNull(int position, IComparable value) {
+      throw new NotSupportedException("Can't change values of a programmable column");
+    }
+
+    public override void ChangeValueOrLeaveOldValue(int position, IComparable value) {
+      throw new NotSupportedException("Can't change values of a programmable column");
+    }
+
+    public override ColumnBase CreateCopyOfColumnWithoutValues(int capacity) {
+      return CreateCopyOfColumnWithoutValues();
+    }
+
+    public override ColumnBase CreateCopyOfColumnWithoutValues() {
+      ProgrammableColumn clone = new ProgrammableColumn(this.Name, this.columnGroup);
+      clone.Expression = expression;
+      return clone;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/StringColumn.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/StringColumn.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Model/StringColumn.cs	(revision 15690)
@@ -0,0 +1,101 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.Data.Model {
+  [StorableClass]
+  public class StringColumn : ColumnBase {
+    [Storable]
+    private List<string> values;
+
+    [StorableConstructor]
+    protected StringColumn(bool deserializing) : base(deserializing) { }
+
+    public StringColumn(string columnName)
+      : base(columnName) {
+      this.values = new List<string>();
+    }
+
+    public StringColumn(string columnName, int capacity)
+      : this(columnName) {
+      this.values.Capacity = capacity;
+    }
+
+    public override Type DataType {
+      get { return typeof(string); }
+    }
+
+    public override string ToString() {
+      return base.ToString() + " <String>";
+    }
+
+    protected override IList Values {
+      get { return this.values; }
+    }
+
+    public override void AddValue(IComparable value) {
+      this.values.Add(CheckInput(value));
+    }
+
+    public override void AddValueOrNull(IComparable value) {
+      if (value == null)
+        this.values.Add(null);
+      else
+        this.values.Add(CheckInput(value.ToString()));
+    }
+
+    public override void InsertValue(int position, IComparable value) {
+      this.values.Insert(position, CheckInput(value));
+    }
+
+    public override void ChangeValue(int position, IComparable value) {
+      this.values[position] = CheckInput(value);
+    }
+
+    public override void ChangeValueOrNull(int position, IComparable value) {
+      this.values[position] = CheckInput(value);
+    }
+
+    public override void ChangeValueOrLeaveOldValue(int position, IComparable value) {
+      this.values[position] = CheckInput(value);
+    }
+
+    public override ColumnBase CreateCopyOfColumnWithoutValues() {
+      return CreateCopyOfColumnWithoutValues(this.values.Capacity);
+    }
+    public override ColumnBase CreateCopyOfColumnWithoutValues(int capacity) {
+      return new StringColumn(this.Name, capacity);
+    }
+
+    private string CheckInput(IComparable value) {
+      if (value == null)
+        return null;
+      string tmp = value.ToString().Trim();
+      if (string.IsNullOrEmpty(tmp))
+        tmp = null;
+      return tmp;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Properties/AssemblyInfo.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Properties/AssemblyInfo.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/Properties/AssemblyInfo.cs.frame	(revision 15690)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.DataImporter.Data")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(C) 2008-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7d0840b8-3382-4b99-ab4e-5d1eb91fbec1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.$WCREV$")]
+[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/ColumnGroupView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/ColumnGroupView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/ColumnGroupView.Designer.cs	(revision 15690)
@@ -0,0 +1,378 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Data.View {
+  partial class ColumnGroupView {
+    /// <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) {
+        if ((components != null))
+          components.Dispose();
+
+        ColumnGroup.Changed -= ColumnGroupChanged;
+        StateChanged = null;
+        Activated = null;
+
+        dataGridView.ColumnHeaderMouseClick -= dataGridView_ColumnHeaderMouseClick;
+        dataGridView.ColumnWidthChanged -= dataGridView_ColumnWidthChanged;
+        dataGridView.MouseClick -= dataGridView_MouseClick;
+        dataGridView.SelectionChanged -= dataGridView_SelectionChanged;
+        dataGridView.AllowUserToOrderColumnsChanged -= dataGridView_AllowUserToOrderColumnsChanged;
+        dataGridView.KeyDown -= dataGridView_KeyDown;
+
+        dataGridView.CellValueNeeded -= dataGridView_CellValueNeeded;
+        dataGridView.CellValuePushed -= dataGridView_CellValuePushed;
+        dataGridView.UserDeletingRow -= dataGridView_UserDeletingRow;
+
+        //commented because otherwise dispose crashes while editing a cell
+        //dataGridView.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.components = new System.ComponentModel.Container();
+      System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
+      System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
+      this.dataGridView = new System.Windows.Forms.DataGridView();
+      this.txtColumnGroupName = new System.Windows.Forms.TextBox();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+      this.label1 = new System.Windows.Forms.Label();
+      this.lblMean = new System.Windows.Forms.Label();
+      this.label5 = new System.Windows.Forms.Label();
+      this.lblMinimum = new System.Windows.Forms.Label();
+      this.label3 = new System.Windows.Forms.Label();
+      this.lblNullValues = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.lblValues = new System.Windows.Forms.Label();
+      this.lblMedian = new System.Windows.Forms.Label();
+      this.label8 = new System.Windows.Forms.Label();
+      this.label4 = new System.Windows.Forms.Label();
+      this.lblNullPercentage = new System.Windows.Forms.Label();
+      this.label6 = new System.Windows.Forms.Label();
+      this.label7 = new System.Windows.Forms.Label();
+      this.lblStdDev = new System.Windows.Forms.Label();
+      this.lblMaximum = new System.Windows.Forms.Label();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.tableLayoutPanel1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // dataGridView
+      // 
+      this.dataGridView.AllowUserToAddRows = false;
+      this.dataGridView.AllowUserToResizeRows = false;
+      this.dataGridView.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.Disable;
+      dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
+      dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
+      dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
+      dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
+      dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
+      dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
+      this.dataGridView.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
+      this.dataGridView.ColumnHeadersHeight = 45;
+      this.dataGridView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.dataGridView.Location = new System.Drawing.Point(0, 0);
+      this.dataGridView.MinimumSize = new System.Drawing.Size(400, 0);
+      this.dataGridView.Name = "dataGridView";
+      dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
+      dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Control;
+      dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.WindowText;
+      dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;
+      dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
+      dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
+      this.dataGridView.RowHeadersDefaultCellStyle = dataGridViewCellStyle2;
+      this.dataGridView.RowHeadersWidth = 60;
+      this.dataGridView.Size = new System.Drawing.Size(400, 380);
+      this.dataGridView.TabIndex = 0;
+      // 
+      // txtColumnGroupName
+      // 
+      this.txtColumnGroupName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtColumnGroupName.ForeColor = System.Drawing.SystemColors.WindowText;
+      this.txtColumnGroupName.Location = new System.Drawing.Point(1, -1);
+      this.txtColumnGroupName.Name = "txtColumnGroupName";
+      this.txtColumnGroupName.ReadOnly = true;
+      this.txtColumnGroupName.Size = new System.Drawing.Size(397, 20);
+      this.txtColumnGroupName.TabIndex = 1;
+      this.txtColumnGroupName.Click += new System.EventHandler(this.txtColumnGroupName_Click);
+      this.txtColumnGroupName.DoubleClick += new System.EventHandler(this.txtColumnGroupName_DoubleClick);
+      this.txtColumnGroupName.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtColumnGroupName_KeyDown);
+      this.txtColumnGroupName.Leave += new System.EventHandler(this.txtColumnGroupName_Leave);
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer1.IsSplitterFixed = true;
+      this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer1.Name = "splitContainer1";
+      this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.txtColumnGroupName);
+      this.splitContainer1.Panel1.Controls.Add(this.tableLayoutPanel1);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.dataGridView);
+      this.splitContainer1.Size = new System.Drawing.Size(398, 490);
+      this.splitContainer1.SplitterDistance = 106;
+      this.splitContainer1.TabIndex = 2;
+      // 
+      // tableLayoutPanel1
+      // 
+      this.tableLayoutPanel1.ColumnCount = 4;
+      this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 59F));
+      this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 51.00671F));
+      this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 95F));
+      this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 48.99329F));
+      this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
+      this.tableLayoutPanel1.Controls.Add(this.lblMean, 1, 2);
+      this.tableLayoutPanel1.Controls.Add(this.label5, 0, 2);
+      this.tableLayoutPanel1.Controls.Add(this.lblMinimum, 1, 1);
+      this.tableLayoutPanel1.Controls.Add(this.label3, 0, 1);
+      this.tableLayoutPanel1.Controls.Add(this.lblNullValues, 3, 0);
+      this.tableLayoutPanel1.Controls.Add(this.label2, 2, 0);
+      this.tableLayoutPanel1.Controls.Add(this.lblValues, 1, 0);
+      this.tableLayoutPanel1.Controls.Add(this.lblMedian, 1, 3);
+      this.tableLayoutPanel1.Controls.Add(this.label8, 2, 1);
+      this.tableLayoutPanel1.Controls.Add(this.label4, 2, 2);
+      this.tableLayoutPanel1.Controls.Add(this.lblNullPercentage, 3, 1);
+      this.tableLayoutPanel1.Controls.Add(this.label6, 0, 3);
+      this.tableLayoutPanel1.Controls.Add(this.label7, 2, 3);
+      this.tableLayoutPanel1.Controls.Add(this.lblStdDev, 3, 3);
+      this.tableLayoutPanel1.Controls.Add(this.lblMaximum, 3, 2);
+      this.tableLayoutPanel1.Location = new System.Drawing.Point(-1, 20);
+      this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+      this.tableLayoutPanel1.RowCount = 4;
+      this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+      this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+      this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+      this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+      this.tableLayoutPanel1.Size = new System.Drawing.Size(401, 78);
+      this.tableLayoutPanel1.TabIndex = 26;
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 0);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(42, 13);
+      this.label1.TabIndex = 14;
+      this.label1.Text = "Values:";
+      // 
+      // lblMean
+      // 
+      this.lblMean.AutoSize = true;
+      this.lblMean.Location = new System.Drawing.Point(62, 40);
+      this.lblMean.Name = "lblMean";
+      this.lblMean.Size = new System.Drawing.Size(0, 13);
+      this.lblMean.TabIndex = 23;
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(3, 40);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(37, 13);
+      this.label5.TabIndex = 22;
+      this.label5.Text = "Mean:";
+      // 
+      // lblMinimum
+      // 
+      this.lblMinimum.AutoSize = true;
+      this.lblMinimum.Location = new System.Drawing.Point(62, 20);
+      this.lblMinimum.Name = "lblMinimum";
+      this.lblMinimum.Size = new System.Drawing.Size(0, 13);
+      this.lblMinimum.TabIndex = 19;
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(3, 20);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(51, 13);
+      this.label3.TabIndex = 18;
+      this.label3.Text = "Minimum:";
+      // 
+      // lblNullValues
+      // 
+      this.lblNullValues.AutoSize = true;
+      this.lblNullValues.Location = new System.Drawing.Point(282, 0);
+      this.lblNullValues.Name = "lblNullValues";
+      this.lblNullValues.Size = new System.Drawing.Size(0, 13);
+      this.lblNullValues.TabIndex = 17;
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(187, 0);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(60, 13);
+      this.label2.TabIndex = 16;
+      this.label2.Text = "NullValues:";
+      // 
+      // lblValues
+      // 
+      this.lblValues.AutoSize = true;
+      this.lblValues.Location = new System.Drawing.Point(62, 0);
+      this.lblValues.Name = "lblValues";
+      this.lblValues.Size = new System.Drawing.Size(0, 13);
+      this.lblValues.TabIndex = 15;
+      // 
+      // lblMedian
+      // 
+      this.lblMedian.AutoSize = true;
+      this.lblMedian.Location = new System.Drawing.Point(62, 60);
+      this.lblMedian.Name = "lblMedian";
+      this.lblMedian.Size = new System.Drawing.Size(0, 13);
+      this.lblMedian.TabIndex = 25;
+      // 
+      // label8
+      // 
+      this.label8.AutoSize = true;
+      this.label8.Location = new System.Drawing.Point(187, 20);
+      this.label8.Name = "label8";
+      this.label8.Size = new System.Drawing.Size(83, 13);
+      this.label8.TabIndex = 28;
+      this.label8.Text = "NullPercentage:";
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(187, 40);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(54, 13);
+      this.label4.TabIndex = 20;
+      this.label4.Text = "Maximum:";
+      // 
+      // lblNullPercentage
+      // 
+      this.lblNullPercentage.AutoSize = true;
+      this.lblNullPercentage.Location = new System.Drawing.Point(282, 20);
+      this.lblNullPercentage.Name = "lblNullPercentage";
+      this.lblNullPercentage.Size = new System.Drawing.Size(0, 13);
+      this.lblNullPercentage.TabIndex = 29;
+      // 
+      // label6
+      // 
+      this.label6.AutoSize = true;
+      this.label6.Location = new System.Drawing.Point(3, 60);
+      this.label6.Name = "label6";
+      this.label6.Size = new System.Drawing.Size(45, 13);
+      this.label6.TabIndex = 24;
+      this.label6.Text = "Median:";
+      // 
+      // label7
+      // 
+      this.label7.AutoSize = true;
+      this.label7.Location = new System.Drawing.Point(187, 60);
+      this.label7.Name = "label7";
+      this.label7.Size = new System.Drawing.Size(43, 13);
+      this.label7.TabIndex = 26;
+      this.label7.Text = "StdDev";
+      // 
+      // lblStdDev
+      // 
+      this.lblStdDev.AutoSize = true;
+      this.lblStdDev.Location = new System.Drawing.Point(282, 60);
+      this.lblStdDev.Name = "lblStdDev";
+      this.lblStdDev.Size = new System.Drawing.Size(0, 13);
+      this.lblStdDev.TabIndex = 27;
+      // 
+      // lblMaximum
+      // 
+      this.lblMaximum.AutoSize = true;
+      this.lblMaximum.Location = new System.Drawing.Point(282, 40);
+      this.lblMaximum.Name = "lblMaximum";
+      this.lblMaximum.Size = new System.Drawing.Size(0, 13);
+      this.lblMaximum.TabIndex = 21;
+      // 
+      // ColumnGroupView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.Controls.Add(this.splitContainer1);
+      this.MinimumSize = new System.Drawing.Size(400, 2);
+      this.Name = "ColumnGroupView";
+      this.Size = new System.Drawing.Size(398, 490);
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel1.PerformLayout();
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+      this.splitContainer1.ResumeLayout(false);
+      this.tableLayoutPanel1.ResumeLayout(false);
+      this.tableLayoutPanel1.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.DataGridView dataGridView;
+    private System.Windows.Forms.TextBox txtColumnGroupName;
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label lblValues;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label lblNullValues;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.Label lblMinimum;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.Label lblMaximum;
+    private System.Windows.Forms.Label label5;
+    private System.Windows.Forms.Label lblMedian;
+    private System.Windows.Forms.Label label6;
+    private System.Windows.Forms.Label lblMean;
+    private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
+    private System.Windows.Forms.Label label7;
+    private System.Windows.Forms.Label lblStdDev;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Label label8;
+    private System.Windows.Forms.Label lblNullPercentage;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/ColumnGroupView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/ColumnGroupView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/ColumnGroupView.cs	(revision 15690)
@@ -0,0 +1,650 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.Command;
+using HeuristicLab.DataImporter.Data.Model;
+
+
+namespace HeuristicLab.DataImporter.Data.View {
+  public delegate void ColumnGroupActivatedEventHandler(object sender, bool addToActiveColumnGroups);
+  public partial class ColumnGroupView : UserControl {
+
+    private TextBox txtColumnName;
+    private ColumnGroupView()
+      : base() {
+      InitializeComponent();
+      txtColumnName = new TextBox();
+      this.splitContainer1.Panel2.Controls.Add(txtColumnName);
+      txtColumnName.Visible = false;
+      txtColumnName.Validated += new EventHandler(txtColumnName_Validated);
+      txtColumnName.KeyDown += new KeyEventHandler(txtColumnName_KeyDown);
+
+      this.dataGridView.EnableHeadersVisualStyles = false;
+      this.dataGridView.Dock = DockStyle.Top | DockStyle.Bottom;
+      this.dataGridView.VirtualMode = true;
+      this.dataGridView.ShowCellToolTips = false;
+
+      this.dataGridView.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(dataGridView_ColumnHeaderMouseClick);
+      this.dataGridView.ColumnHeaderMouseDoubleClick += new DataGridViewCellMouseEventHandler(dataGridView_ColumnHeaderMouseDoubleClick);
+      this.dataGridView.ColumnWidthChanged += new DataGridViewColumnEventHandler(dataGridView_ColumnWidthChanged);
+      this.dataGridView.MouseClick += new MouseEventHandler(dataGridView_MouseClick);
+      this.dataGridView.SelectionChanged += new EventHandler(dataGridView_SelectionChanged);
+      this.dataGridView.AllowUserToOrderColumnsChanged += new EventHandler(dataGridView_AllowUserToOrderColumnsChanged);
+      this.dataGridView.KeyDown += new KeyEventHandler(dataGridView_KeyDown);
+      this.dataGridView.RowHeadersWidthChanged += new EventHandler(dataGridView_RowHeadersWidthChanged);
+      this.dataGridView.CellMouseEnter += new DataGridViewCellEventHandler(dataGridView_CellMouseEnter);
+      this.dataGridView.Scroll += new ScrollEventHandler(dataGridView_Scroll);
+      this.dataGridView.Resize += new EventHandler(dataGridView_Resize);
+
+      //delegates for virtual mode
+      this.dataGridView.CellValueNeeded += new DataGridViewCellValueEventHandler(dataGridView_CellValueNeeded);
+      this.dataGridView.CellValuePushed += new DataGridViewCellValueEventHandler(dataGridView_CellValuePushed);
+      this.dataGridView.UserDeletingRow += new DataGridViewRowCancelEventHandler(dataGridView_UserDeletingRow);
+    }
+
+    private ColumnGroupView(ColumnGroup columnGroup)
+      : this() {
+      this.ColumnGroup = columnGroup;
+      this.ColumnGroup.Changed += this.ColumnGroupChanged;
+      this.dataGridView.ClearSelection();
+      this.state = ColumnGroupState.None;
+      this.UpdateDataGridView();
+    }
+
+    public ColumnGroupView(ColumnGroup columnGroup, CommandChain commandChain)
+      : this(columnGroup) {
+      this.commandChain = commandChain;
+    }
+
+    public bool ColumnGroupActive {
+      get { return this.ColumnGroup.Active; }
+      set {
+        this.ColumnGroup.Active = value;
+        if (this.ColumnGroup.Active)
+          this.txtColumnGroupName.BackColor = Color.LightGreen;
+        else {
+          this.dataGridView.ClearSelection();
+          this.txtColumnGroupName.BackColor = Control.DefaultBackColor;
+        }
+        UpdateStateInformation();
+      }
+    }
+
+    private ColumnGroup columnGroup;
+    public ColumnGroup ColumnGroup {
+      get { return (ColumnGroup)this.columnGroup; }
+      private set { this.columnGroup = value; }
+    }
+
+    private Data.Model.DataSet DataSet {
+      get { return ((DataSetView)this.Parent).DataSet; }
+    }
+
+    private CommandChain commandChain;
+    public CommandChain CommandChain {
+      get { return this.commandChain; }
+      set { this.commandChain = value; }
+    }
+
+    public bool AllowReorderColumns {
+      get { return this.dataGridView.AllowUserToOrderColumns; }
+      set { this.dataGridView.AllowUserToOrderColumns = value; }
+    }
+
+    public int[] DisplayIndexes {
+      get {
+        int[] ret = new int[this.ColumnGroup.Columns.Count()];
+        for (int i = 0; i < this.dataGridView.Columns.Count; i++) {
+          ret[dataGridView.Columns[i].DisplayIndex] = i;
+        }
+        return ret;
+      }
+    }
+
+    public int MaxWidth {
+      get { return this.MaximumSize.Width; }
+      set {
+        this.MaximumSize = new Size(value, this.MaximumSize.Height);
+        this.dataGridView.MaximumSize = new Size(value, this.MaximumSize.Height);
+        RecalculateWidthOfControl();
+      }
+    }
+
+    //IMPORTANT: use the defined property to change the state, because the event StateChanged must be fired!
+    private ColumnGroupState state;
+    public ColumnGroupState State {
+      get { return this.state; }
+      protected set {
+        this.state = value;
+        FireStateChanged();
+      }
+    }
+
+    public event EventHandler StateChanged;
+    protected void FireStateChanged() {
+      OnStateChanged();
+    }
+
+    protected virtual void OnStateChanged() {
+      if (StateChanged != null) {
+        StateChanged(this, new EventArgs());
+      }
+    }
+
+    public event ColumnGroupActivatedEventHandler Activated;
+    public void FireActivated(bool addToActiveColumnGroups) {
+      OnActivated(addToActiveColumnGroups);
+    }
+
+    protected virtual void OnActivated(bool addToActiveColumnGroups) {
+      if (Activated != null) {
+        Activated(this, addToActiveColumnGroups);
+      }
+    }
+
+    private void UpdateStateInformation() {
+      this.UpdateStateInformation(false);
+    }
+
+    private void UpdateStateInformation(bool selectionChanged) {
+      ColumnGroupState newState = this.ColumnGroupActive ? ColumnGroupState.Active : ColumnGroupState.None;
+      foreach (ColumnBase col in ColumnGroup.SelectedColumns) {
+        if (col is DoubleColumn)
+          newState |= ColumnGroupState.DoubleColumnSelected;
+        else if (col is StringColumn)
+          newState |= ColumnGroupState.StringColumnSelected;
+        else if (col is DateTimeColumn)
+          newState |= ColumnGroupState.DateTimeColumnSelected;
+        else if (col is ProgrammableColumn)
+          newState |= ColumnGroupState.ProgrammableColumnSelected;
+        if (col.ContainsNullValues)
+          newState |= ColumnGroupState.AnySelectedColumnContainsNull;
+      }
+      if (ColumnGroup.Sorted) {
+        if (ColumnGroup.SelectedColumns.Any(col => col.SortOrder == SortOrder.None))
+          newState |= ColumnGroupState.AnySelectedColumnNotSorted;
+        else
+          newState |= ColumnGroupState.Sorted;
+      }
+      if (newState != this.State || selectionChanged)
+        this.State = newState;
+    }
+
+    private void PasteClipboardContent() {
+      if (dataGridView.CurrentCell != null) {
+        string values = Clipboard.GetText();
+        values = values.Remove(values.Length - Environment.NewLine.Length);
+        this.commandChain.Add(new PasteValuesCommand(DataSet, this.ColumnGroup.Name, dataGridView.CurrentCell.ColumnIndex,
+          dataGridView.CurrentCell.RowIndex, values));
+      }
+    }
+
+    private void CopyClipboardContent() {
+      if (dataGridView.SelectedCells.Count != 0) {
+        StringBuilder s = new StringBuilder();
+        DataGridViewCell cell;
+        int minRowIndex = dataGridView.SelectedCells[0].RowIndex;
+        int maxRowIndex = dataGridView.SelectedCells[dataGridView.SelectedCells.Count - 1].RowIndex;
+        int minColIndex = dataGridView.SelectedCells[0].ColumnIndex;
+        int maxColIndex = dataGridView.SelectedCells[dataGridView.SelectedCells.Count - 1].ColumnIndex;
+
+        if (minRowIndex > maxRowIndex) {
+          int temp = minRowIndex;
+          minRowIndex = maxRowIndex;
+          maxRowIndex = temp;
+        }
+
+        if (minColIndex > maxColIndex) {
+          int temp = minColIndex;
+          minColIndex = maxColIndex;
+          maxColIndex = temp;
+        }
+        if (maxRowIndex == dataGridView.RowCount - 1)
+          maxRowIndex--;
+
+        for (int i = minRowIndex; i < maxRowIndex + 1; i++) {
+          for (int j = minColIndex; j < maxColIndex + 1; j++) {
+            cell = dataGridView[j, i];
+            if (cell.Selected) {
+              if (cell.Value != null)
+                s.Append(cell.Value.ToString());
+            }
+            if (j != maxColIndex)
+              s.Append("\t");
+          }
+          s.Append(Environment.NewLine);
+        }
+        Clipboard.SetText(s.ToString());
+      }
+    }
+
+    public override void Refresh() {
+      base.Refresh();
+      if (ColumnGroup != null) {
+        this.UpdateDataGridView();
+      } else {
+        dataGridView.ColumnCount = 0;
+        dataGridView.RowCount = 0;
+      }
+    }
+
+    public void ColumnGroupChanged(object sender, EventArgs e) {
+      this.UpdateDataGridView();
+    }
+
+    private void UpdateDataGridView() {
+      int firstVisibleRowIndex = 0;
+      int firstVisibleColIndex = 0;
+      if (dataGridView.FirstDisplayedCell != null) {
+        if (firstVisibleColIndex < ColumnGroup.Columns.Count())
+          firstVisibleColIndex = dataGridView.FirstDisplayedCell.ColumnIndex;
+        if (firstVisibleRowIndex < ColumnGroup.RowCount)
+          firstVisibleRowIndex = dataGridView.FirstDisplayedCell.RowIndex;
+      }
+
+      //needed because otherwise columns could not be added
+      this.dataGridView.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
+      if (dataGridView.ColumnCount != ColumnGroup.Columns.Count()) {
+        this.dataGridView.ColumnCount = ColumnGroup.Columns.Count();
+        for (int i = 0; i < ColumnGroup.Columns.Count(); i++) {
+          dataGridView.Columns[i].SortMode = DataGridViewColumnSortMode.Programmatic;
+        }
+      }
+      for (int i = 0; i < ColumnGroup.Columns.Count(); i++)
+        dataGridView.Columns[i].HeaderText = ColumnGroup.Columns.ElementAt(i).ToString().Insert(ColumnGroup.Columns.ElementAt(i).ToString().IndexOf('<'), "\n");
+
+      // needed for performance reasons; further information at http://whiletrue.nl/blog/?p=38
+      if (dataGridView.RowCount != ColumnGroup.RowCount + (ColumnGroup.Columns.Count() == 0 ? 0 : 1)) {
+        //event handler must be deregistered cause otherwise cellvaluepushed is fired again
+        this.dataGridView.CellValuePushed -= new DataGridViewCellValueEventHandler(dataGridView_CellValuePushed);
+        if (Math.Abs(dataGridView.RowCount - ColumnGroup.RowCount) > 10)
+          dataGridView.Rows.Clear();
+        bool rowAdded = dataGridView.RowCount == ColumnGroup.RowCount && dataGridView.RowCount != 0;
+        dataGridView.RowCount = ColumnGroup.RowCount + (!ColumnGroup.Columns.Any() ? 0 : 1);
+
+        if (rowAdded) {
+          Point p = this.dataGridView.CurrentCellAddress;
+          p.Y += 1;
+          this.dataGridView.CurrentCell = this.dataGridView.Rows[p.Y].Cells[p.X];
+          this.dataGridView.ClearSelection();
+          this.dataGridView.CurrentCell.Selected = true;
+        }
+        this.dataGridView.CellValuePushed += new DataGridViewCellValueEventHandler(dataGridView_CellValuePushed);
+      }
+
+      UpdateDataGridViewHeaderCells();
+      this.dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells);
+      this.dataGridView.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders);
+      if (dataGridView.RowCount != 0 && dataGridView.ColumnCount != 0) {
+        if (firstVisibleColIndex >= dataGridView.ColumnCount)
+          firstVisibleColIndex = 0;
+        if (firstVisibleRowIndex >= dataGridView.RowCount)
+          firstVisibleRowIndex = 0;
+        dataGridView.FirstDisplayedCell = dataGridView[firstVisibleColIndex, firstVisibleRowIndex];
+      }
+
+      UpdateSortGlyph();
+      this.txtColumnGroupName.Text = this.ColumnGroup.Name + "  " + ColumnGroup.RowCount + " rows";
+      RecalculateWidthOfControl();
+      this.dataGridView.Invalidate();
+      UpdateStateInformation();
+    }
+
+    private void UpdateDataGridViewHeaderCells() {
+      int index = dataGridView.FirstDisplayedScrollingRowIndex;
+      if (index == -1) index = 0;
+      int updatedRows = 0;
+      int count = dataGridView.DisplayedRowCount(true);
+
+      while (updatedRows < count) {
+        dataGridView.Rows[index].HeaderCell.Value = (index + 1).ToString();
+        if (dataGridView.Rows[index].Visible)
+          updatedRows++;
+        index++;
+      }
+    }
+
+    private void dataGridView_ColumnHeaderMouseClick(object sender, System.Windows.Forms.DataGridViewCellMouseEventArgs e) {
+      if (e.Button == MouseButtons.Right) {
+        this.commandChain.Add(new SortCommand(DataSet, this.ColumnGroup.Name,
+          e.ColumnIndex, (Control.ModifierKeys & Keys.Control) == Keys.Control));
+      }
+    }
+
+    private void dataGridView_ColumnHeaderMouseDoubleClick(object sender, System.Windows.Forms.DataGridViewCellMouseEventArgs e) {
+      if (e.Button == MouseButtons.Left) {
+        dataGridView.ClearSelection();
+        Rectangle rect = dataGridView.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
+        ColumnBase col = this.ColumnGroup.Columns.ElementAt(e.ColumnIndex);
+        txtColumnName.Text = col.Name;
+        txtColumnName.Size = rect.Size;
+        txtColumnName.Location = rect.Location;
+        txtColumnName.Visible = true;
+        txtColumnName.Focus();
+        txtColumnName.BringToFront();
+      }
+    }
+
+    private void UpdateSortGlyph() {
+      System.Collections.IEnumerator e = this.dataGridView.Columns.GetEnumerator();
+      e.MoveNext();
+      foreach (SortOrder sortOrder in this.ColumnGroup.SortOrdersForColumns) {
+        ((DataGridViewColumn)e.Current).HeaderCell.SortGlyphDirection = sortOrder;
+        e.MoveNext();
+      }
+    }
+
+    private void dataGridView_SelectionChanged(object sender, EventArgs e) {
+      int nullValuesCount = 0;
+      int totalValuesCount = 0;
+      IComparable minimum = "";
+      IComparable maximum = "";
+      double? mean = null;
+      double? median = null;
+      double? stddev = null;
+      ColumnBase column;
+
+      this.ColumnGroup.ClearSelectedColumns();
+      if (this.dataGridView.SelectedColumns.Count != 0) {
+        foreach (DataGridViewColumn col in this.dataGridView.SelectedColumns) {
+          column = this.ColumnGroup.Columns.ElementAt(col.Index);
+          column.Selected = true;
+          nullValuesCount += column.NullValuesCount;
+          totalValuesCount += column.NonNullValuesCount;
+        }
+        if (this.dataGridView.SelectedColumns.Count == 1) {
+          column = this.ColumnGroup.Columns.ElementAt(dataGridView.SelectedColumns[0].Index);
+          minimum = column.Minimum;
+          maximum = column.Maximum;
+          if (column is DoubleColumn) {
+            mean = ((DoubleColumn)column).Mean;
+            stddev = ((DoubleColumn)column).StandardDeviation;
+            median = ((DoubleColumn)column).Median;
+          }
+        }
+      }
+      lblNullValues.Text = nullValuesCount.ToString();
+      double nullPercentage = (100.0 / (double)(totalValuesCount + nullValuesCount)) * (double)nullValuesCount;
+      lblNullPercentage.Text = Double.IsNaN(nullPercentage) ? "" : nullPercentage.ToString();
+      lblValues.Text = totalValuesCount.ToString();
+      lblMinimum.Text = minimum == null ? "" : minimum.ToString();
+      lblMaximum.Text = maximum == null ? "" : maximum.ToString();
+      lblMean.Text = mean == null ? "" : mean.ToString();
+      lblStdDev.Text = stddev == null ? "" : stddev.ToString();
+      lblMedian.Text = median == null ? "" : median.ToString();
+      UpdateStateInformation(true);
+    }
+
+    private void dataGridView_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e) {
+      RecalculateWidthOfControl();
+    }
+
+    private void RecalculateWidthOfControl() {
+      int width = 0;
+      foreach (DataGridViewColumn col in this.dataGridView.Columns)
+        width += col.Width;
+      //no columns in datagrid
+      if (width != 0) {
+        width += this.dataGridView.RowHeadersWidth;
+        //datagridview.controls[1] is always the vertical scrollbar
+        if (dataGridView.Controls[1].Visible)
+          width += 20;
+      }
+      this.dataGridView.Width = width;
+      this.Width = width;
+    }
+
+    private void dataGridView_MouseClick(object sender, MouseEventArgs e) {
+      this.ColumnGroupActive = true;
+      this.FireActivated(false);
+
+      if (this.dataGridView.AllowUserToOrderColumns || e.Clicks >= 2)
+        return;
+
+      System.Windows.Forms.DataGridView.HitTestInfo hit = dataGridView.HitTest(e.X, e.Y);
+      // row header click
+      if (hit.ColumnIndex == -1 && hit.RowIndex >= 0) {
+        if (e.Button == MouseButtons.Right) {
+          this.commandChain.Add(new InsertRowCommand(DataSet, this.ColumnGroup.Name, hit.RowIndex));
+        } else {
+          if (dataGridView.SelectionMode != DataGridViewSelectionMode.RowHeaderSelect)
+            dataGridView.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
+        }
+      } // column header click
+      else if (hit.RowIndex == -1 && hit.ColumnIndex >= 0 && e.Button == MouseButtons.Left) {
+        if (dataGridView.SelectionMode != DataGridViewSelectionMode.ColumnHeaderSelect)
+          dataGridView.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
+      }
+    }
+
+    private void dataGridView_AllowUserToOrderColumnsChanged(object sender, EventArgs e) {
+      if (this.dataGridView.AllowUserToOrderColumns)
+        this.dataGridView.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
+    }
+
+    private void dataGridView_KeyDown(object sender, KeyEventArgs e) {
+      //handle deletion of columns and emptying of cells
+      if (e.KeyCode == Keys.Delete) {
+        if (this.dataGridView.SelectedColumns.Count != 0)
+          this.commandChain.Add(new DeleteColumnCommand(DataSet, this.ColumnGroup.Name, ColumnGroup.SelectedColumnIndexes));
+        else if (this.dataGridView.SelectedRows.Count != 0) {
+          //to ensure that cells are not emptied before the rows got deleted
+          //deleting of rows handled by user deleting rows
+        } else if (this.dataGridView.SelectedCells.Count != 0) {
+          List<Point> cells = new List<Point>();
+          foreach (DataGridViewCell cell in this.dataGridView.SelectedCells) {
+            if (cell.RowIndex < this.ColumnGroup.Columns.ElementAt(cell.ColumnIndex).TotalValuesCount && cell.Value != null)
+              cells.Add(new Point(cell.ColumnIndex, cell.RowIndex));
+          }
+          if (cells.Count != 0)
+            this.commandChain.Add(new ChangeValuesToNullCommand(DataSet, this.ColumnGroup.Name, cells));
+        }
+      }
+        //handle paste of values
+      else if (e.Control && e.KeyCode == Keys.V)
+        PasteClipboardContent();
+      else if (e.Control && e.KeyCode == Keys.C)
+        CopyClipboardContent();
+    }
+
+    private void dataGridView_RowHeadersWidthChanged(object sender, EventArgs e) {
+      this.RecalculateWidthOfControl();
+    }
+
+    private void dataGridView_CellMouseEnter(object sender, DataGridViewCellEventArgs e) {
+      if (e.RowIndex == -1 && e.ColumnIndex != -1) {
+        toolTip.SetToolTip(this.dataGridView, ToExcelColumnIndex(e.ColumnIndex));
+      } else if (toolTip.Active) {
+        toolTip.RemoveAll();
+      }
+    }
+
+    private void dataGridView_Resize(object sender, EventArgs e) {
+      UpdateDataGridViewHeaderCells();
+    }
+
+    private void dataGridView_Scroll(object sender, ScrollEventArgs e) {
+      if (e.ScrollOrientation == ScrollOrientation.VerticalScroll)
+        UpdateDataGridViewHeaderCells();
+    }
+
+    private string ToExcelColumnIndex(int index) {
+      #region digits
+      var digits = new char[] { 
+        '#',
+        'A',
+        'B',
+        'C',
+        'D',
+        'E',
+        'F',
+        'G',
+        'H',
+        'I',
+        'J',
+        'K',
+        'L',
+        'M',
+        'N',
+        'O',
+        'P',
+        'Q',
+        'R',
+        'S',
+        'T',
+        'U',
+        'V',
+        'W',
+        'X',
+        'Y',
+        'Z'};
+      int b = digits.Length - 1;
+      #endregion
+      string excelIndex = string.Empty;
+      index = index + 1;
+      while (index > 0) {
+        int d = index / b;
+        int rem = index % b;
+        index = d;
+        excelIndex = digits[rem] + excelIndex;
+      }
+      return excelIndex;
+    }
+
+    #region DataGridView virtual mode event handler
+    private void dataGridView_CellValueNeeded(object sender, System.Windows.Forms.DataGridViewCellValueEventArgs e) {
+      if (e.ColumnIndex >= ColumnGroup.Columns.Count()) return;
+      if (e.RowIndex >= ColumnGroup.RowCount) return;
+      e.Value = ColumnGroup.Columns.ElementAt(e.ColumnIndex).GetValue(e.RowIndex);
+    }
+
+    private void dataGridView_CellValuePushed(object sender, System.Windows.Forms.DataGridViewCellValueEventArgs e) {
+      IComparable value = null;
+      try {
+        if (e.Value == null)
+          value = null;
+        else if (this.ColumnGroup.Columns.ElementAt(e.ColumnIndex).DataType == typeof(double?))
+          value = double.Parse((string)e.Value);
+        else if (this.ColumnGroup.Columns.ElementAt(e.ColumnIndex).DataType == typeof(DateTime?))
+          value = DateTime.Parse((string)e.Value);
+        else
+          value = e.Value.ToString();
+      }
+      catch (FormatException) {
+      }
+
+      if (e.RowIndex == this.dataGridView.RowCount - 1) {
+        IComparable[] row = new IComparable[this.ColumnGroup.Columns.Count()];
+        row[e.ColumnIndex] = value;
+        this.commandChain.Add(new AddRowCommand(this.DataSet, this.ColumnGroup.Name, row));
+      } else {
+        this.commandChain.Add(new ChangeValueCommand(this.DataSet, this.ColumnGroup.Name, e.ColumnIndex, e.RowIndex, value));
+      }
+    }
+
+    private void dataGridView_UserDeletingRow(object sender, System.Windows.Forms.DataGridViewRowCancelEventArgs e) {
+      e.Cancel = true;
+      if (e.Row.Index < this.ColumnGroup.RowCount) {
+        List<int> positions;
+        if (this.dataGridView.AreAllCellsSelected(true))
+          positions = Enumerable.Range(0, this.ColumnGroup.RowCount).ToList();
+        else {
+          positions = new List<int>();
+          for (int i = 0; i < this.dataGridView.SelectedRows.Count; i++)
+            if (this.dataGridView.SelectedRows[i].Index < this.ColumnGroup.RowCount)
+              positions.Add(this.dataGridView.SelectedRows[i].Index);
+          positions.Sort();
+        }
+        if (positions.Count != 0) {
+          this.commandChain.Add(new DeleteRowsCommand(DataSet, this.ColumnGroup.Name, positions));
+        }
+        this.dataGridView.ClearSelection();
+      }
+    }
+    #endregion
+
+    #region txtColumnName event handler
+    private void txtColumnName_Validated(object source, EventArgs e) {
+      if (!this.txtColumnName.Visible) return;
+      this.txtColumnName.Visible = false;
+
+      DataGridView.HitTestInfo h = this.dataGridView.HitTest(txtColumnName.Location.X, txtColumnName.Location.Y);
+      if (txtColumnName.Text != this.ColumnGroup.GetColumn(h.ColumnIndex).Name)
+        this.commandChain.Add(new RenameColumnCommand(DataSet, this.ColumnGroup.Name, h.ColumnIndex, txtColumnName.Text));
+    }
+
+    private void txtColumnName_KeyDown(object source, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Escape) {
+        DataGridView.HitTestInfo h = this.dataGridView.HitTest(txtColumnName.Location.X, txtColumnName.Location.Y);
+        this.txtColumnName.Text = this.ColumnGroup.GetColumn(h.ColumnIndex).Name;
+        dataGridView.Select();
+      } else if (e.KeyCode == Keys.Enter)
+        dataGridView.Select();
+    }
+    #endregion
+
+    #region txtColumnGroupName event handler
+    private void txtColumnGroupName_Click(object sender, EventArgs e) {
+      bool ctrlPressed = (Control.ModifierKeys & Keys.Control) == Keys.Control;
+      this.dataGridView.ClearSelection();
+      this.ColumnGroupActive = !this.ColumnGroupActive;
+      FireActivated(ctrlPressed);
+      UpdateStateInformation();
+    }
+
+    private void txtColumnGroupName_DoubleClick(object sender, EventArgs e) {
+      txtColumnGroupName.ReadOnly = false;
+      txtColumnGroupName.Text = ColumnGroup.Name;
+    }
+
+    private void txtColumnGroupName_Leave(object sender, EventArgs e) {
+      if (!txtColumnGroupName.ReadOnly) {
+        txtColumnGroupName.ReadOnly = true;
+        if (CheckIfNewColumnGroupNameIsAllowed(txtColumnGroupName.Text))
+          this.commandChain.Add(new RenameColumnGroupCommand(DataSet, this.ColumnGroup.Name, txtColumnGroupName.Text));
+      }
+    }
+
+    private void txtColumnGroupName_KeyDown(object sender, KeyEventArgs e) {
+      if (this.txtColumnGroupName.ReadOnly) //user can not change the name if it is readonly
+        return;
+      if (e.KeyCode != Keys.Enter && e.KeyCode != Keys.Escape)
+        return;
+      if (e.KeyCode == Keys.Enter && CheckIfNewColumnGroupNameIsAllowed(txtColumnGroupName.Text)) {
+        this.commandChain.Add(new RenameColumnGroupCommand(DataSet, this.ColumnGroup.Name, txtColumnGroupName.Text));
+      }
+      txtColumnGroupName.ReadOnly = true;
+      this.Focus();
+      this.Refresh();
+    }
+
+    private bool CheckIfNewColumnGroupNameIsAllowed(string newName) {
+      return this.DataSet.ColumnGroups.All(cg => cg.Name != newName);
+    }
+    #endregion
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/CommandListViewItem.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/CommandListViewItem.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/CommandListViewItem.cs	(revision 15690)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using System.Windows.Forms;
+using System.Reflection;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+
+
+namespace HeuristicLab.DataImporter.Data.View {
+  public class CommandListViewItem<T> : ListViewItem, ICommandGenerator where T : ICommand {
+    private ViewableCommandInfoAttribute commandInfo;
+    public CommandListViewItem() {
+      commandInfo = (ViewableCommandInfoAttribute)Attribute.GetCustomAttribute(typeof(T), typeof(ViewableCommandInfoAttribute));
+      if (commandInfo == null)
+        throw new ArgumentException("ViewableCommandInfoAttribute must be specified!");
+      this.Text = commandInfo.Name;
+      this.Group = new ListViewGroup(commandInfo.GroupName, commandInfo.GroupName);
+    }
+
+    public virtual ICommand GenerateCommand(DataSet dataSet) {
+      T cmd;
+      ColumnGroup activeColumnGroup = null;
+      int[] selectedColumnIndizes = new int[0];
+      if (dataSet.ActiveColumnGroups.Count() > 0)
+        activeColumnGroup = dataSet.ActiveColumnGroups.ElementAt(0);
+      if (activeColumnGroup != null)
+        selectedColumnIndizes = activeColumnGroup.SelectedColumnIndexes;
+      //call ctor according to super class
+      if (typeof(T).IsSubclassOf(typeof(ColumnCommandBase)))
+        cmd = (T)Activator.CreateInstance(typeof(T), new object[] { dataSet, activeColumnGroup.Name, activeColumnGroup.SelectedColumnIndexes[0] });
+      else if (typeof(T).IsSubclassOf(typeof(ColumnGroupCommandWithAffectedColumnsBase)))
+        cmd = (T)Activator.CreateInstance(typeof(T), new object[] { dataSet, activeColumnGroup.Name, selectedColumnIndizes });
+      else if (typeof(T).IsSubclassOf(typeof(ColumnGroupCommandBase)))
+        cmd = (T)Activator.CreateInstance(typeof(T), new object[] { dataSet, activeColumnGroup.Name });
+      else if (typeof(T).IsSubclassOf(typeof(DataSetCommandWithAffectedColumnGroupsBase)))
+        cmd = (T)Activator.CreateInstance(typeof(T), new object[] { dataSet, dataSet.ActiveColumnGroups.Select(x =>x.Name).ToList() });
+      else
+        cmd = (T)Activator.CreateInstance(typeof(T), new object[] { dataSet });
+
+      if (commandInfo.OptionsView != null) {
+        CommandViewDialog dlg = new CommandViewDialog();
+        dlg.StartPosition = FormStartPosition.CenterParent;
+        UserControl ctrl = (UserControl)Activator.CreateInstance(commandInfo.OptionsView,cmd);
+        dlg.Panel.Controls.Add(ctrl);
+        dlg.ShowDialog(this.ListView.TopLevelControl);
+        if (dlg.DialogResult == DialogResult.Cancel)
+          return null;
+      }
+      return cmd;
+    }
+
+    public bool Enabled(DataSetState state) {
+      return commandInfo.State.Enabled(state);
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/CommandViewDialog.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/CommandViewDialog.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/CommandViewDialog.Designer.cs	(revision 15690)
@@ -0,0 +1,129 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Data.View {
+  partial class CommandViewDialog {
+    /// <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);
+    }
+
+    private System.Windows.Forms.Button btnOk;
+    private System.Windows.Forms.Button btnCancel;
+    private System.Windows.Forms.Panel panel2;
+    private System.Windows.Forms.Panel panel;
+    public System.Windows.Forms.Panel Panel {
+      get { return this.panel; }
+    }
+
+    #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.btnOk = new System.Windows.Forms.Button();
+      this.btnCancel = new System.Windows.Forms.Button();
+      this.panel2 = new System.Windows.Forms.Panel();
+      this.panel = new System.Windows.Forms.Panel();
+      this.panel2.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // btnOk
+      // 
+      this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.btnOk.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.btnOk.Location = new System.Drawing.Point(5, 4);
+      this.btnOk.Name = "btnOk";
+      this.btnOk.Size = new System.Drawing.Size(75, 23);
+      this.btnOk.TabIndex = 0;
+      this.btnOk.Text = "Ok";
+      this.btnOk.UseVisualStyleBackColor = true;
+      // 
+      // btnCancel
+      // 
+      this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.btnCancel.Location = new System.Drawing.Point(86, 4);
+      this.btnCancel.Name = "btnCancel";
+      this.btnCancel.Size = new System.Drawing.Size(75, 23);
+      this.btnCancel.TabIndex = 1;
+      this.btnCancel.Text = "Cancel";
+      this.btnCancel.UseVisualStyleBackColor = true;
+      // 
+      // panel2
+      // 
+      this.panel2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.panel2.Controls.Add(this.btnOk);
+      this.panel2.Controls.Add(this.btnCancel);
+      this.panel2.Location = new System.Drawing.Point(110, 146);
+      this.panel2.Name = "panel2";
+      this.panel2.Size = new System.Drawing.Size(166, 30);
+      this.panel2.TabIndex = 3;
+      // 
+      // panel
+      // 
+      this.panel.Location = new System.Drawing.Point(8, 8);
+      this.panel.Name = "panel";
+      this.panel.Size = new System.Drawing.Size(268, 100);
+      this.panel.TabIndex = 0;
+      this.panel.ControlAdded += new System.Windows.Forms.ControlEventHandler(this.Panel_ControlAdded);
+      // 
+      // CommandViewDialog
+      // 
+      this.AcceptButton = this.btnOk;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.CancelButton = this.btnCancel;
+      this.ClientSize = new System.Drawing.Size(284, 184);
+      this.Controls.Add(this.panel);
+      this.Controls.Add(this.panel2);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "CommandViewDialog";
+      this.Padding = new System.Windows.Forms.Padding(5);
+      this.ShowInTaskbar = false;
+      this.Text = "Command Dialog";
+      this.panel2.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+
+
+
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/CommandViewDialog.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/CommandViewDialog.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/CommandViewDialog.cs	(revision 15690)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Data.View {
+  public partial class CommandViewDialog : Form {
+    public CommandViewDialog() {
+      InitializeComponent();
+      this.FormBorderStyle = FormBorderStyle.FixedDialog;
+    }
+
+    private void Panel_ControlAdded(object sender, ControlEventArgs e) {
+      int width = e.Control.Size.Width + 10;
+      int heigth = e.Control.Size.Height + 80;
+      Panel.Size = new Size(e.Control.Size.Width, e.Control.Size.Height);
+      this.Size = new Size(width, heigth);
+      this.Refresh();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/DataSetView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/DataSetView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/DataSetView.Designer.cs	(revision 15690)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.Data.View {
+  partial class DataSetView {
+    /// <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 ) {
+        if(components!=null)
+          components.Dispose();
+
+        StateChanged = null;
+        DataSet.Changed -= DataSetChanged;
+
+        //clean up - caution: view.dispose removes disposed view from controls
+        for (int i = 0, backupCount = this.Controls.Count; i < backupCount; i++)
+          this.Controls[0].Dispose();
+      }
+      base.Dispose(disposing);
+      System.GC.Collect();
+    }
+
+    #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.SuspendLayout();
+      // 
+      // DataSetView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "DataSetView";
+      this.Size = new System.Drawing.Size(305, 186);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+
+
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/DataSetView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/DataSetView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Data/View/DataSetView.cs	(revision 15690)
@@ -0,0 +1,180 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.Data.View {
+  public partial class DataSetView : UserControl {
+    private DataSetView() {
+      InitializeComponent();
+      columnGroupViews = new List<ColumnGroupView>();
+      this.AutoScroll = true;
+      this.Scroll += new ScrollEventHandler(DataSetView_Scroll);
+      this.state = new DataSetState(0, ColumnGroupState.None);
+    }
+
+    public DataSetView(Model.DataSet dataSet)
+      : this() {
+      this.DataSet = dataSet;
+      this.DataSet.Changed += this.DataSetChanged;
+      this.Refresh();
+    }
+
+    public DataSetView(Model.DataSet dataSet, CommandChain commandChain)
+      : this(dataSet) {
+      this.CommandChain = commandChain;
+    }
+
+    private List<ColumnGroupView> columnGroupViews;
+
+    private CommandChain commandChain;
+    public CommandChain CommandChain {
+      get { return this.commandChain; }
+      set {
+        this.commandChain = value;
+        foreach (ColumnGroupView view in this.columnGroupViews)
+          view.CommandChain = value;
+      }
+    }
+
+    private int columnGroupMaxWidth;
+    public int ColumnGroupMaxWidth {
+      get { return columnGroupMaxWidth; }
+      set {
+        columnGroupMaxWidth = value;
+        foreach (ColumnGroupView view in columnGroupViews)
+          view.MaxWidth = value;
+      }
+    }
+
+    private Model.DataSet dataSet;
+    public Model.DataSet DataSet {
+      get { return (Model.DataSet)this.dataSet; }
+      private set { this.dataSet = value; }
+    }
+
+    private DataSetState state;
+    public DataSetState State {
+      get { return this.state; }
+      protected set {
+        this.state = value;
+        FireStateChanged();
+      }
+    }
+
+    private bool allowReorderColumns;
+    public bool AllowReorderColumns {
+      set {
+        allowReorderColumns = value;
+        foreach (ColumnGroupView view in this.columnGroupViews) {
+          view.AllowReorderColumns = value;
+        }
+      }
+      get { return allowReorderColumns; }
+    }
+
+    public override void Refresh() {
+      base.Refresh();
+
+      //clean up - caution: view.dispose removes disposed view from controls collection
+      this.SuspendLayout();
+      this.Controls.Clear();
+      foreach (ColumnGroupView view in this.columnGroupViews.Reverse<ColumnGroupView>())
+        view.Dispose();
+      this.columnGroupViews.Clear();
+
+      ColumnGroupView ctrl;
+      //necessary because otherwise columnGroupsViews are in reverse order
+      for (int i = 0; i < this.DataSet.ColumnGroups.Count(); i++) {
+        ctrl = new ColumnGroupView(this.DataSet.ColumnGroups.ElementAt(i), this.commandChain);
+        ctrl.Activated += new ColumnGroupActivatedEventHandler(ColumnGroupActivated);
+        ctrl.StateChanged += new EventHandler(ColumnGroupStateChanged);
+        ctrl.MaxWidth = this.columnGroupMaxWidth;
+        if (this.DataSet.ColumnGroups.ElementAt(i).Active) {
+          ctrl.ColumnGroupActive = true;
+          ctrl.FireActivated(false);
+        }
+        ctrl.Dock = DockStyle.Top | DockStyle.Bottom;
+        this.columnGroupViews.Add(ctrl);
+      }
+      this.Controls.AddRange(this.columnGroupViews.Reverse<ColumnGroupView>().ToArray());
+      this.Invalidate();
+      this.ResumeLayout();
+    }
+
+    public void DataSetChanged(object sender, EventArgs e) {
+      this.Refresh();
+      this.UpdateStateInformation();
+    }
+
+    public void ColumnGroupActivated(object sender, bool addToActiveColumnGroups) {
+      if (!addToActiveColumnGroups) {
+        foreach (ColumnGroupView view in this.columnGroupViews)
+          view.ColumnGroupActive = view == sender;
+      }
+      UpdateStateInformation();
+    }
+
+    public void ColumnGroupStateChanged(object sender, EventArgs e) {
+      UpdateStateInformation();
+    }
+
+    private void UpdateStateInformation() {
+      DataSetState state = new DataSetState(0, ColumnGroupState.None);
+      foreach (ColumnGroupView view in this.columnGroupViews.Where(cg => cg.ColumnGroupActive))
+        state.AddColumnGroupState(view.State);
+      if (state.ActiveColumnGroups == 1)
+        state.SelectedColumns = DataSet.ActiveColumnGroups.ElementAt(0).SelectedColumns.Count();
+      if (!this.state.Equals(state))
+        this.State = state;
+    }
+
+    public event EventHandler StateChanged;
+    protected void FireStateChanged() {
+      OnStateChanged();
+    }
+
+    protected virtual void OnStateChanged() {
+      if (StateChanged != null) {
+        StateChanged(this, new EventArgs());
+      }
+    }
+
+    #region GUI interaction with scroll bars
+    private Point scrollposition;
+    private void DataSetView_Scroll(object sender, ScrollEventArgs e) {
+      scrollposition.X = this.DisplayRectangle.X;
+      scrollposition.Y = this.DisplayRectangle.Y;
+    }
+
+    protected override Point ScrollToControl(Control activeControl) {
+      return scrollposition;
+    }
+    #endregion
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/DataBaseCommandBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/DataBaseCommandBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/DataBaseCommandBase.cs	(revision 15690)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.DataImporter.DbExplorer.Interfaces;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.DataProcessor.Command {
+  [StorableClass]
+  public abstract class DatabaseCommandBase : DataSetCommandBase {
+    [StorableConstructor]
+    protected DatabaseCommandBase(bool deserializing) : base(deserializing) { }
+    protected DatabaseCommandBase(DataSet dataSet, IDbExplorer dbExplorer)
+      : base(dataSet) {
+      this.dbExplorer = dbExplorer;
+    }
+
+    private IDbExplorer dbExplorer;
+    public IDbExplorer DbExplorer {
+      get { return this.dbExplorer; }
+      set { this.dbExplorer = value; }
+    }
+  }
+}
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/LoadColumnGroupWithSqlStringFromDBCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/LoadColumnGroupWithSqlStringFromDBCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/LoadColumnGroupWithSqlStringFromDBCommand.cs	(revision 15690)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.DataImporter.DbExplorer.Interfaces;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.DataProcessor.Command {
+  [StorableClass]
+  public class LoadColumnGroupWithSqlStringFromDBCommand : DatabaseCommandBase {
+    [Storable]
+    private string sqlString;
+
+    private ColumnGroup newColumnGroup;
+
+    [StorableConstructor]
+    protected LoadColumnGroupWithSqlStringFromDBCommand(bool deserializing) : base(deserializing) { }
+    public LoadColumnGroupWithSqlStringFromDBCommand(DataSet dataSet, IDbExplorer dbExplorer, string sqlString)
+      : base(dataSet, dbExplorer) {
+      this.sqlString = sqlString;
+    }
+
+    public override string Description {
+      get { return "Load ColumnGroups from database"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      if (DbExplorer == null || !DbExplorer.IsConnected)
+        throw new CommandExecutionException("Could not load data because no connection to the database exists", this);
+      newColumnGroup = DbExplorer.CreateColumnGroup(sqlString);
+      newColumnGroup.Name = "New ColumnGroup from SQL string";
+      this.DataSet.AddColumnGroup(newColumnGroup);
+      this.DataSet.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      this.DataSet.RemoveColumnGroup(newColumnGroup);
+      newColumnGroup = null;
+      this.DataSet.FireChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/LoadColumnGroupsFromDBCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/LoadColumnGroupsFromDBCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/LoadColumnGroupsFromDBCommand.cs	(revision 15690)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.DataImporter.DbExplorer.Interfaces;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.DataProcessor.Command {
+  [StorableClass]
+  public class LoadColumnGroupsFromDBCommand : DatabaseCommandBase {
+    [Storable]
+    private List<DbTable> tables;
+
+    private List<ColumnGroup> newColumnGroups;
+
+    [StorableConstructor]
+    protected LoadColumnGroupsFromDBCommand(bool deserializing)
+      : base(deserializing) {
+      this.newColumnGroups = new List<ColumnGroup>();
+    }
+
+    public LoadColumnGroupsFromDBCommand(DataSet dataSet, IDbExplorer dbExplorer, IEnumerable<DbTable> tables)
+      : base(dataSet, dbExplorer) {
+      this.tables = new List<DbTable>(tables);
+      this.newColumnGroups = new List<ColumnGroup>();
+    }
+
+    public override string Description {
+      get { return "Load ColumnGroups from database"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      if (DbExplorer == null || !DbExplorer.IsConnected)
+        throw new CommandExecutionException("Could not load data because no connection to the database exists", this);
+      ColumnGroup columnGroup;
+      foreach (DbTable table in tables) {
+        columnGroup = DbExplorer.CreateColumnGroup(table);
+        this.DataSet.AddColumnGroup(columnGroup);
+        newColumnGroups.Add(columnGroup);
+      }
+      this.DataSet.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      foreach (ColumnGroup columnGroup in newColumnGroups)
+        this.DataSet.RemoveColumnGroup(columnGroup);
+      newColumnGroups.Clear();
+      this.DataSet.FireChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/ReorderColumnsCommand.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/ReorderColumnsCommand.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/ReorderColumnsCommand.cs	(revision 15690)
@@ -0,0 +1,92 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Linq;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.DataProcessor.Command {
+  [StorableClass]
+  public class ReorderColumnsCommand : DataSetCommandBase {
+    [Storable]
+    private Dictionary<string, int[]> displayedIndexes;
+
+    [StorableConstructor]
+    protected ReorderColumnsCommand(bool deserializing) : base(deserializing) { }
+    public ReorderColumnsCommand(DataSet ds, Dictionary<string, int[]> displayedIndexes)
+      : base(ds) {
+      this.displayedIndexes = displayedIndexes;
+    }
+
+    public override string Description {
+      get { return "Reorder Columns"; }
+    }
+
+    public override void Execute() {
+      base.Execute();
+      ReorderColumns(true);
+      this.DataSet.FireChanged();
+    }
+
+    public override void UndoExecute() {
+      base.UndoExecute();
+      ReorderColumns(false);
+      this.DataSet.FireChanged();
+    }
+
+    private void ReorderColumns(bool forward) {
+      ColumnGroup grp;
+      int[] indices;
+      List<int> sortedColumnIndices;
+      int newIndex;
+      int oldIndex;
+      List<ColumnBase> columns;
+      foreach (KeyValuePair<string, int[]> pair in displayedIndexes) {
+        grp = this.DataSet.GetColumnGroup(pair.Key);
+        indices = pair.Value;
+        columns = grp.Columns.ToList();
+        sortedColumnIndices = new List<int>(grp.SortedColumnIndexes);
+        for (int j = 0; j < indices.Length; j++) {
+          sortedColumnIndices = new List<int>(grp.SortedColumnIndexes);
+          if (forward) {
+            newIndex = j;
+            oldIndex = indices[j];
+          } else {
+            newIndex = indices[j];
+            oldIndex = j;
+          }
+          grp.ReplaceColumn(newIndex, columns[oldIndex]);
+          grp.SortedColumnIndexes = sortedColumnIndices;
+          //corrects the SortedColumnIndices if sorted colum got reordered
+          if (grp.SortedColumnIndexes.Contains(oldIndex)) {
+            int insertPos = sortedColumnIndices.IndexOf(oldIndex);
+            sortedColumnIndices.Remove(oldIndex);
+            sortedColumnIndices.Insert(insertPos, newIndex);
+          }
+        }
+        grp.SortedColumnIndexes = sortedColumnIndices;
+        grp.FireChanged();
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/SqlCommandView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/SqlCommandView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/SqlCommandView.Designer.cs	(revision 15690)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.DataProcessor.Command {
+  partial class SqlCommandView {
+    /// <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.txtSqlCommand = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // txtSqlCommand
+      // 
+      this.txtSqlCommand.Location = new System.Drawing.Point(3, 3);
+      this.txtSqlCommand.Multiline = true;
+      this.txtSqlCommand.Name = "txtSqlCommand";
+      this.txtSqlCommand.Size = new System.Drawing.Size(290, 147);
+      this.txtSqlCommand.TabIndex = 0;
+      // 
+      // SqlCommandView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.txtSqlCommand);
+      this.Name = "SqlCommandView";
+      this.Size = new System.Drawing.Size(293, 153);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox txtSqlCommand;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/SqlCommandView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/SqlCommandView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Command/SqlCommandView.cs	(revision 15690)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.DataProcessor.Command {
+  public partial class SqlCommandView : HeuristicLab.DataImporter.Data.CommandBase.CommandViewBase {
+    public SqlCommandView() {
+      InitializeComponent();
+    }
+
+    public string SqlCommand {
+      get { return this.txtSqlCommand.Text; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DataProcessor.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DataProcessor.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DataProcessor.cs	(revision 15690)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.DataImporter.DbExplorer.Interfaces;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  [StorableClass]
+  public class DataProcessor {
+    public DataProcessor() {
+      this.commandChain = new CommandChain();
+      this.dataSet = new DataSet();
+    }
+    [StorableConstructor]
+    protected DataProcessor(bool deserializing)
+      : base() {
+      this.commandChain = new CommandChain();
+    }
+
+    public DataProcessor(DataSet ds) {
+      this.commandChain = new CommandChain();
+      this.dataSet = ds;
+    }
+
+    private IDbExplorer dbExplorer;
+    public IDbExplorer DatabaseExplorer {
+      get { return this.dbExplorer; }
+      set { this.dbExplorer = value; }
+    }
+
+    [Storable]
+    private DataSet dataSet;
+    public DataSet DataSet {
+      get { return this.dataSet; }
+    }
+
+    private CommandChain commandChain;
+    public CommandChain CommandChain {
+      get { return this.commandChain; }
+    }
+
+    public void Reset() {
+      this.dataSet = new DataSet();
+      this.commandChain.Clear();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DataProcessorView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DataProcessorView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DataProcessorView.Designer.cs	(revision 15690)
@@ -0,0 +1,524 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Windows.Forms;
+namespace HeuristicLab.DataImporter.DataProcessor {
+  partial class DataProcessorView {
+    /// <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.menuStrip1 = new System.Windows.Forms.MenuStrip();
+      this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
+      this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+      this.importToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
+      this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.undoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.redoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.databaseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.addTablesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.addTablesWithSqlStringToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+      this.lblConnectionStatus = new System.Windows.Forms.ToolStripStatusLabel();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.listCommands = new System.Windows.Forms.ListView();
+      this.toolStrip = new System.Windows.Forms.ToolStrip();
+      this.newToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.openToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.saveToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
+      this.recordMacroToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.openCommandChainToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.saveCommandChainToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator();
+      this.undoToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.redoToolStripButton = new System.Windows.Forms.ToolStripButton();
+      this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
+      this.chbReorder = new HeuristicLab.DataImporter.DataProcessor.ToolStripCheckBox();
+      this.toolStripContainer1 = new System.Windows.Forms.ToolStripContainer();
+      this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+      this.menuStrip1.SuspendLayout();
+      this.statusStrip1.SuspendLayout();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.toolStrip.SuspendLayout();
+      this.toolStripContainer1.ContentPanel.SuspendLayout();
+      this.toolStripContainer1.TopToolStripPanel.SuspendLayout();
+      this.toolStripContainer1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // menuStrip1
+      // 
+      this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.fileToolStripMenuItem,
+            this.editToolStripMenuItem,
+            this.databaseToolStripMenuItem});
+      this.menuStrip1.Location = new System.Drawing.Point(0, 0);
+      this.menuStrip1.Name = "menuStrip1";
+      this.menuStrip1.Size = new System.Drawing.Size(1102, 24);
+      this.menuStrip1.TabIndex = 0;
+      this.menuStrip1.Text = "menuStrip1";
+      // 
+      // fileToolStripMenuItem
+      // 
+      this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.newToolStripMenuItem,
+            this.openToolStripMenuItem,
+            this.toolStripSeparator3,
+            this.saveToolStripMenuItem,
+            this.saveAsToolStripMenuItem,
+            this.toolStripSeparator2,
+            this.importToolStripMenuItem,
+            this.exportToolStripMenuItem,
+            this.toolStripSeparator6,
+            this.exitToolStripMenuItem});
+      this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+      this.fileToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I)));
+      this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
+      this.fileToolStripMenuItem.Text = "File";
+      // 
+      // newToolStripMenuItem
+      // 
+      this.newToolStripMenuItem.Name = "newToolStripMenuItem";
+      this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N)));
+      this.newToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+      this.newToolStripMenuItem.Text = "New";
+      this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click);
+      // 
+      // openToolStripMenuItem
+      // 
+      this.openToolStripMenuItem.Name = "openToolStripMenuItem";
+      this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
+      this.openToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+      this.openToolStripMenuItem.Text = "Open";
+      this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
+      // 
+      // toolStripSeparator3
+      // 
+      this.toolStripSeparator3.Name = "toolStripSeparator3";
+      this.toolStripSeparator3.Size = new System.Drawing.Size(149, 6);
+      // 
+      // saveToolStripMenuItem
+      // 
+      this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
+      this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
+      this.saveToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+      this.saveToolStripMenuItem.Text = "Save";
+      this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click);
+      // 
+      // saveAsToolStripMenuItem
+      // 
+      this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
+      this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+      this.saveAsToolStripMenuItem.Text = "Save As";
+      this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click);
+      // 
+      // toolStripSeparator2
+      // 
+      this.toolStripSeparator2.Name = "toolStripSeparator2";
+      this.toolStripSeparator2.Size = new System.Drawing.Size(149, 6);
+      // 
+      // importToolStripMenuItem
+      // 
+      this.importToolStripMenuItem.Name = "importToolStripMenuItem";
+      this.importToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I)));
+      this.importToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+      this.importToolStripMenuItem.Text = "Import";
+      this.importToolStripMenuItem.Click += new System.EventHandler(this.importToolStripMenuItem_Click);
+      // 
+      // exportToolStripMenuItem
+      // 
+      this.exportToolStripMenuItem.Name = "exportToolStripMenuItem";
+      this.exportToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E)));
+      this.exportToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+      this.exportToolStripMenuItem.Text = "Export";
+      this.exportToolStripMenuItem.Click += new System.EventHandler(this.exportToolStripMenuItem_Click);
+      // 
+      // toolStripSeparator6
+      // 
+      this.toolStripSeparator6.Name = "toolStripSeparator6";
+      this.toolStripSeparator6.Size = new System.Drawing.Size(149, 6);
+      // 
+      // exitToolStripMenuItem
+      // 
+      this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+      this.exitToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+      this.exitToolStripMenuItem.Text = "Exit";
+      this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
+      // 
+      // editToolStripMenuItem
+      // 
+      this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.undoToolStripMenuItem,
+            this.redoToolStripMenuItem});
+      this.editToolStripMenuItem.Name = "editToolStripMenuItem";
+      this.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20);
+      this.editToolStripMenuItem.Text = "Edit";
+      // 
+      // undoToolStripMenuItem
+      // 
+      this.undoToolStripMenuItem.Image = global::HeuristicLab.DataImporter.DataProcessor.Properties.Resources.Edit_UndoHS;
+      this.undoToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+      this.undoToolStripMenuItem.Name = "undoToolStripMenuItem";
+      this.undoToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z)));
+      this.undoToolStripMenuItem.Size = new System.Drawing.Size(144, 22);
+      this.undoToolStripMenuItem.Text = "Undo";
+      this.undoToolStripMenuItem.Click += new System.EventHandler(this.undoToolStripMenuItem_Click);
+      // 
+      // redoToolStripMenuItem
+      // 
+      this.redoToolStripMenuItem.Image = global::HeuristicLab.DataImporter.DataProcessor.Properties.Resources.Edit_RedoHS;
+      this.redoToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+      this.redoToolStripMenuItem.Name = "redoToolStripMenuItem";
+      this.redoToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y)));
+      this.redoToolStripMenuItem.Size = new System.Drawing.Size(144, 22);
+      this.redoToolStripMenuItem.Text = "Redo";
+      this.redoToolStripMenuItem.Click += new System.EventHandler(this.redoToolStripMenuItem_Click);
+      // 
+      // databaseToolStripMenuItem
+      // 
+      this.databaseToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.addTablesToolStripMenuItem,
+            this.addTablesWithSqlStringToolStripMenuItem});
+      this.databaseToolStripMenuItem.Name = "databaseToolStripMenuItem";
+      this.databaseToolStripMenuItem.Size = new System.Drawing.Size(67, 20);
+      this.databaseToolStripMenuItem.Text = "Database";
+      // 
+      // addTablesToolStripMenuItem
+      // 
+      this.addTablesToolStripMenuItem.Name = "addTablesToolStripMenuItem";
+      this.addTablesToolStripMenuItem.Size = new System.Drawing.Size(241, 22);
+      this.addTablesToolStripMenuItem.Text = "Add Tables";
+      this.addTablesToolStripMenuItem.Click += new System.EventHandler(this.addTablesToolStripMenuItem_Click);
+      // 
+      // addTablesWithSqlStringToolStripMenuItem
+      // 
+      this.addTablesWithSqlStringToolStripMenuItem.Name = "addTablesWithSqlStringToolStripMenuItem";
+      this.addTablesWithSqlStringToolStripMenuItem.Size = new System.Drawing.Size(241, 22);
+      this.addTablesWithSqlStringToolStripMenuItem.Text = "Add Tables with SQL command";
+      this.addTablesWithSqlStringToolStripMenuItem.Click += new System.EventHandler(this.addTablesWithSqlStringToolStripMenuItem_Click);
+      // 
+      // statusStrip1
+      // 
+      this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.lblConnectionStatus});
+      this.statusStrip1.Location = new System.Drawing.Point(0, 551);
+      this.statusStrip1.Name = "statusStrip1";
+      this.statusStrip1.Size = new System.Drawing.Size(1102, 22);
+      this.statusStrip1.TabIndex = 1;
+      this.statusStrip1.Text = "statusStrip1";
+      // 
+      // lblConnectionStatus
+      // 
+      this.lblConnectionStatus.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128)))));
+      this.lblConnectionStatus.Name = "lblConnectionStatus";
+      this.lblConnectionStatus.Size = new System.Drawing.Size(153, 17);
+      this.lblConnectionStatus.Text = "Not connected to database!";
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.listCommands);
+      this.splitContainer1.Size = new System.Drawing.Size(1102, 502);
+      this.splitContainer1.SplitterDistance = 165;
+      this.splitContainer1.TabIndex = 0;
+      // 
+      // listCommands
+      // 
+      this.listCommands.Activation = System.Windows.Forms.ItemActivation.TwoClick;
+      this.listCommands.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.listCommands.Location = new System.Drawing.Point(0, 0);
+      this.listCommands.MultiSelect = false;
+      this.listCommands.Name = "listCommands";
+      this.listCommands.Size = new System.Drawing.Size(165, 502);
+      this.listCommands.TabIndex = 0;
+      this.listCommands.TileSize = new System.Drawing.Size(100, 50);
+      this.listCommands.UseCompatibleStateImageBehavior = false;
+      this.listCommands.View = System.Windows.Forms.View.SmallIcon;
+      this.listCommands.MouseClick += new System.Windows.Forms.MouseEventHandler(this.listCommands_MouseDoubleClick);
+      // 
+      // toolStrip
+      // 
+      this.toolStrip.Dock = System.Windows.Forms.DockStyle.None;
+      this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.newToolStripButton,
+            this.openToolStripButton,
+            this.saveToolStripButton,
+            this.toolStripSeparator5,
+            this.recordMacroToolStripButton,
+            this.openCommandChainToolStripButton,
+            this.saveCommandChainToolStripButton,
+            this.toolStripSeparator,
+            this.undoToolStripButton,
+            this.redoToolStripButton,
+            this.toolStripSeparator4,
+            this.chbReorder});
+      this.toolStrip.Location = new System.Drawing.Point(0, 0);
+      this.toolStrip.Name = "toolStrip";
+      this.toolStrip.Size = new System.Drawing.Size(1102, 25);
+      this.toolStrip.Stretch = true;
+      this.toolStrip.TabIndex = 4;
+      this.toolStrip.Text = "toolStrip1";
+      // 
+      // newToolStripButton
+      // 
+      this.newToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.newToolStripButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.NewDocument;// ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image")));
+      this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.newToolStripButton.Name = "newToolStripButton";
+      this.newToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.newToolStripButton.Text = "&New";
+      this.newToolStripButton.Click += new System.EventHandler(this.newToolStripButton_Click);
+      // 
+      // openToolStripButton
+      // 
+      this.openToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.openToolStripButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Open; // ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image")));
+      this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.openToolStripButton.Name = "openToolStripButton";
+      this.openToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.openToolStripButton.Text = "&Open";
+      this.openToolStripButton.Click += new System.EventHandler(this.openToolStripButton_Click);
+      // 
+      // saveToolStripButton
+      // 
+      this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.saveToolStripButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Save; // ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image")));
+      this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+      this.saveToolStripButton.Name = "saveToolStripButton";
+      this.saveToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.saveToolStripButton.Text = "&Save";
+      this.saveToolStripButton.Click += new System.EventHandler(this.saveToolStripButton_Click);
+      // 
+      // toolStripSeparator5
+      // 
+      this.toolStripSeparator5.Name = "toolStripSeparator5";
+      this.toolStripSeparator5.Size = new System.Drawing.Size(6, 25);
+      // 
+      // recordMacroToolStripButton
+      // 
+      this.recordMacroToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.recordMacroToolStripButton.Image = global::HeuristicLab.DataImporter.DataProcessor.Properties.Resources.RecordHS;
+      this.recordMacroToolStripButton.ImageTransparentColor = System.Drawing.Color.Black;
+      this.recordMacroToolStripButton.Name = "recordMacroToolStripButton";
+      this.recordMacroToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.recordMacroToolStripButton.Text = "Start Macro recording";
+      this.recordMacroToolStripButton.Click += new System.EventHandler(this.recordMacroToolStripButton_Click);
+      // 
+      // openCommandChainToolStripButton
+      // 
+      this.openCommandChainToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.openCommandChainToolStripButton.Image = global::HeuristicLab.DataImporter.DataProcessor.Properties.Resources.OpenSelectedItemHS;
+      this.openCommandChainToolStripButton.ImageTransparentColor = System.Drawing.Color.Black;
+      this.openCommandChainToolStripButton.Name = "openCommandChainToolStripButton";
+      this.openCommandChainToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.openCommandChainToolStripButton.Text = "Open CommandChain";
+      this.openCommandChainToolStripButton.Click += new System.EventHandler(this.openCommandChainToolStripButton_Click);
+      // 
+      // saveCommandChainToolStripButton
+      // 
+      this.saveCommandChainToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.saveCommandChainToolStripButton.Enabled = false;
+      this.saveCommandChainToolStripButton.Image = global::HeuristicLab.DataImporter.DataProcessor.Properties.Resources.SaveAllHS;
+      this.saveCommandChainToolStripButton.ImageTransparentColor = System.Drawing.Color.Black;
+      this.saveCommandChainToolStripButton.Name = "saveCommandChainToolStripButton";
+      this.saveCommandChainToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.saveCommandChainToolStripButton.Text = "Save CommandChain";
+      this.saveCommandChainToolStripButton.Click += new System.EventHandler(this.saveCommandChaingToolStripButton_Click);
+      // 
+      // toolStripSeparator
+      // 
+      this.toolStripSeparator.Name = "toolStripSeparator";
+      this.toolStripSeparator.Size = new System.Drawing.Size(6, 25);
+      // 
+      // undoToolStripButton
+      // 
+      this.undoToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.undoToolStripButton.Enabled = false;
+      this.undoToolStripButton.Image = global::HeuristicLab.DataImporter.DataProcessor.Properties.Resources.Edit_UndoHS;
+      this.undoToolStripButton.ImageTransparentColor = System.Drawing.Color.Black;
+      this.undoToolStripButton.Name = "undoToolStripButton";
+      this.undoToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.undoToolStripButton.Text = "Undo";
+      this.undoToolStripButton.Click += new System.EventHandler(this.undoToolStripButton_Click);
+      // 
+      // redoToolStripButton
+      // 
+      this.redoToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+      this.redoToolStripButton.Enabled = false;
+      this.redoToolStripButton.Image = global::HeuristicLab.DataImporter.DataProcessor.Properties.Resources.Edit_RedoHS;
+      this.redoToolStripButton.ImageTransparentColor = System.Drawing.Color.Black;
+      this.redoToolStripButton.Name = "redoToolStripButton";
+      this.redoToolStripButton.Size = new System.Drawing.Size(23, 22);
+      this.redoToolStripButton.Text = "Redo";
+      this.redoToolStripButton.Click += new System.EventHandler(this.redoToolStripButton_Click);
+      // 
+      // toolStripSeparator4
+      // 
+      this.toolStripSeparator4.Name = "toolStripSeparator4";
+      this.toolStripSeparator4.Size = new System.Drawing.Size(6, 25);
+      // 
+      // chbReorder
+      // 
+      this.chbReorder.BackColor = System.Drawing.Color.Transparent;
+      // 
+      // chbReorder
+      // 
+      this.chbReorder.CheckBoxControl.AccessibleName = "chbReorder";
+      this.chbReorder.CheckBoxControl.BackColor = System.Drawing.Color.Transparent;
+      this.chbReorder.CheckBoxControl.Location = new System.Drawing.Point(211, 1);
+      this.chbReorder.CheckBoxControl.Name = "chbReorder";
+      this.chbReorder.CheckBoxControl.Size = new System.Drawing.Size(118, 22);
+      this.chbReorder.CheckBoxControl.TabIndex = 1;
+      this.chbReorder.CheckBoxControl.Text = "Reorder Columns";
+      this.chbReorder.CheckBoxControl.UseVisualStyleBackColor = false;
+      this.chbReorder.Name = "chbReorder";
+      this.chbReorder.Size = new System.Drawing.Size(118, 22);
+      this.chbReorder.Text = "Reorder Columns";
+      this.chbReorder.Click += new System.EventHandler(this.chbReorderColumns_CheckedChanged);
+      // 
+      // toolStripContainer1
+      // 
+      // 
+      // toolStripContainer1.ContentPanel
+      // 
+      this.toolStripContainer1.ContentPanel.Controls.Add(this.splitContainer1);
+      this.toolStripContainer1.ContentPanel.Size = new System.Drawing.Size(1102, 502);
+      this.toolStripContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.toolStripContainer1.Location = new System.Drawing.Point(0, 24);
+      this.toolStripContainer1.Name = "toolStripContainer1";
+      this.toolStripContainer1.Size = new System.Drawing.Size(1102, 527);
+      this.toolStripContainer1.TabIndex = 0;
+      this.toolStripContainer1.Text = "toolStripContainer1";
+      // 
+      // toolStripContainer1.TopToolStripPanel
+      // 
+      this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.toolStrip);
+      // 
+      // toolStripSeparator1
+      // 
+      this.toolStripSeparator1.Name = "toolStripSeparator1";
+      this.toolStripSeparator1.Size = new System.Drawing.Size(6, 6);
+      // 
+      // DataProcessorView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(1102, 573);
+      this.Controls.Add(this.toolStripContainer1);
+      this.Controls.Add(this.statusStrip1);
+      this.Controls.Add(this.menuStrip1);
+      this.Icon = HeuristicLab.Common.Resources.HeuristicLab.Icon;
+      this.MainMenuStrip = this.menuStrip1;
+      this.Name = "DataProcessorView";
+      this.Text = "DataImporter";
+      this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DataProcessorView_FormClosing);
+      this.menuStrip1.ResumeLayout(false);
+      this.menuStrip1.PerformLayout();
+      this.statusStrip1.ResumeLayout(false);
+      this.statusStrip1.PerformLayout();
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.ResumeLayout(false);
+      this.toolStrip.ResumeLayout(false);
+      this.toolStrip.PerformLayout();
+      this.toolStripContainer1.ContentPanel.ResumeLayout(false);
+      this.toolStripContainer1.TopToolStripPanel.ResumeLayout(false);
+      this.toolStripContainer1.TopToolStripPanel.PerformLayout();
+      this.toolStripContainer1.ResumeLayout(false);
+      this.toolStripContainer1.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.MenuStrip menuStrip1;
+    private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem exportToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem databaseToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem addTablesToolStripMenuItem;
+    private System.Windows.Forms.StatusStrip statusStrip1;
+    private System.Windows.Forms.ToolStripStatusLabel lblConnectionStatus;
+    private System.Windows.Forms.ToolStrip toolStrip;
+    private System.Windows.Forms.ToolStripContainer toolStripContainer1;
+    private System.Windows.Forms.ToolStripButton newToolStripButton;
+    private System.Windows.Forms.ToolStripButton openToolStripButton;
+    private System.Windows.Forms.ToolStripButton saveToolStripButton;
+    private System.Windows.Forms.ToolStripSeparator toolStripSeparator;
+    private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+    private System.Windows.Forms.ToolStripButton undoToolStripButton;
+    private System.Windows.Forms.ToolStripButton redoToolStripButton;
+    private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem undoToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem redoToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
+    private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+    private System.Windows.Forms.ToolStripMenuItem importToolStripMenuItem;
+    private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.ListView listCommands;
+    private ToolStripSeparator toolStripSeparator4;
+    private HeuristicLab.DataImporter.DataProcessor.ToolStripCheckBox chbReorder;
+    private ToolStripButton saveCommandChainToolStripButton;
+    private ToolStripSeparator toolStripSeparator5;
+    private ToolStripButton openCommandChainToolStripButton;
+    private ToolStripMenuItem addTablesWithSqlStringToolStripMenuItem;
+    private ToolStripButton recordMacroToolStripButton;
+    private ToolStripSeparator toolStripSeparator6;
+    private ToolStripMenuItem exitToolStripMenuItem;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DataProcessorView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DataProcessorView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DataProcessorView.cs	(revision 15690)
@@ -0,0 +1,656 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.ComponentModel;
+using System.Drawing;
+using System.IO.Compression;
+using System.Linq;
+using System.Windows.Forms;
+using System.Xml;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+using HeuristicLab.DataImporter.Data.View;
+using HeuristicLab.DataImporter.DataProcessor.Command;
+using HeuristicLab.DataImporter.DbExplorer.Interfaces;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  public partial class DataProcessorView : Form {
+    private DataSetView dataSetView;
+    private BackgroundWorker backgroundWorker;
+    private string lastSavedFile;
+    private ICommand lastSavedCommand;
+    private ProgressDialog progressDlg;
+
+    private DataProcessorView() {
+      InitializeComponent();
+      this.HScroll = false;
+      this.HorizontalScroll.Visible = false;
+      backgroundWorker = new BackgroundWorker();
+      backgroundWorker.WorkerReportsProgress = true;
+      backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
+      backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
+      backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
+    }
+
+    public DataProcessorView(DataProcessor dataProcessor)
+      : this() {
+      this.dataProcessor = dataProcessor;
+      this.dataProcessor.CommandChain.Changed += this.CommandChainChanged;
+      this.dataSetView = new DataSetView(this.dataProcessor.DataSet, this.dataProcessor.CommandChain);
+      this.dataSetView.StateChanged += new EventHandler(DataSetStateChanged);
+      this.dataSetView.Dock = DockStyle.Fill;
+      this.dataSetView.ColumnGroupMaxWidth = this.splitContainer1.Panel2.Width;
+      this.splitContainer1.Panel2.Controls.Add(this.dataSetView);
+      this.splitContainer1.Panel2.Resize += new EventHandler(Panel2_Resize);
+      FillItemList();
+
+      IDbExplorer[] explorers = ApplicationManager.Manager.GetInstances<IDbExplorer>().ToArray();
+      ToolStripItem item;
+      foreach (IDbExplorer exp in explorers) {
+        item = new ToolStripMenuItem();
+        item.Text = exp.MenuItemDescription;
+        item.Tag = exp;
+        item.Click += new EventHandler(setGenericDBConnectionToolStripMenuItem_Click);
+        databaseToolStripMenuItem.DropDownItems.Add(item);
+      }
+    }
+
+    private DataProcessor dataProcessor;
+    public DataProcessor DataProcessor {
+      get { return this.dataProcessor; }
+    }
+
+    private bool UndoEnabled {
+      get { return this.undoToolStripButton.Enabled; }
+      set { this.undoToolStripButton.Enabled = value; this.undoToolStripMenuItem.Enabled = value; }
+    }
+    private bool RedoEnabled {
+      get { return this.redoToolStripButton.Enabled; }
+      set { this.redoToolStripButton.Enabled = value; this.redoToolStripMenuItem.Enabled = value; }
+    }
+
+    private bool SaveCommandChainEnabled {
+      get { return this.saveCommandChainToolStripButton.Enabled; }
+      set { this.saveCommandChainToolStripButton.Enabled = value; }
+    }
+
+    #region CommandList
+
+    private void listCommands_MouseDoubleClick(object sender, MouseEventArgs e) {
+      ListViewItem item = listCommands.HitTest(e.Location).Item;
+      if (item != null) {
+        ICommandGenerator generator = (ICommandGenerator)listCommands.FocusedItem;
+        if (generator.Enabled(dataSetView.State)) {
+          ICommand cmd = ((ICommandGenerator)generator).GenerateCommand(dataProcessor.DataSet);
+          if (cmd != null) {
+            try {
+              dataProcessor.CommandChain.Add(cmd);
+            }
+            catch (CommandExecutionException cee) {
+              MessageBox.Show(cee.Message, cee.Command.Description);
+            }
+          }
+        }
+      }
+      item.Selected = false;
+    }
+
+    private void FillItemList() {
+      //sort after ViewableCommandInfoAttribute
+      IEnumerable<Type> commands = ApplicationManager.Manager.GetTypes(typeof(ICommand)).Select(t => new {
+        Command = t,
+        Attribute = (ViewableCommandInfoAttribute)Attribute.GetCustomAttribute(t, typeof(ViewableCommandInfoAttribute))
+      })
+         .Where(t => t.Attribute != null && !t.Command.IsAbstract)
+        .OrderBy(t => t.Attribute, new AttributeComparer())
+        .Select(t => t.Command);
+      ListViewItem item = null;
+      bool addGroup;
+      foreach (Type t in commands) {
+        item = (ListViewItem)Activator.CreateInstance(typeof(CommandListViewItem<>).MakeGenericType(t));
+        addGroup = true;
+        foreach (ListViewGroup grp in listCommands.Groups)
+          if (grp.Name == item.Group.Name) {
+            item.Group = grp;
+            addGroup = false;
+            break;
+          }
+        if (addGroup) {
+          listCommands.Groups.Add(item.Group);
+        }
+        listCommands.Items.Add(item);
+      }
+      UpdateListViewItems();
+    }
+
+    public void DataSetStateChanged(object sender, EventArgs e) {
+      UpdateListViewItems();
+    }
+
+    private void UpdateListViewItems() {
+      foreach (ICommandGenerator generator in listCommands.Items) {
+        if (generator.Enabled(dataSetView.State))
+          ((ListViewItem)generator).ForeColor = Color.Black;
+        else
+          ((ListViewItem)generator).ForeColor = Color.LightGray;
+      }
+    }
+    #endregion
+
+    private void CommandChainChanged(object sender, EventArgs e) {
+      #region undo & redo updates
+      this.UndoEnabled = !this.dataProcessor.CommandChain.FirstCommandReached;
+      this.RedoEnabled = !this.dataProcessor.CommandChain.LastCommandReached;
+      this.SaveCommandChainEnabled = !this.dataProcessor.CommandChain.FirstCommandReached;
+      this.undoToolStripButton.ToolTipText = this.dataProcessor.CommandChain.PreviousCommandDescription;
+      this.redoToolStripButton.ToolTipText = this.dataProcessor.CommandChain.NextCommandDescription;
+
+      //needed to update tooltip if it is currently being shown - taken from 
+      //http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=167320
+      System.Reflection.FieldInfo f = this.toolStrip.GetType().GetField("currentlyActiveTooltipItem", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
+      if (object.ReferenceEquals(f.GetValue(this.toolStrip), this.undoToolStripButton)) {
+        // Need to set currentlyActiveTooltipItem to null, so the call to UpdateToolTip actually does the update
+        f.SetValue(this.toolStrip, null);
+        System.Reflection.MethodInfo m = this.toolStrip.GetType().GetMethod("UpdateToolTip", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+        m.Invoke(this.toolStrip, new object[] { this.undoToolStripButton });
+      }
+      f = this.toolStrip.GetType().GetField("currentlyActiveTooltipItem", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
+      if (object.ReferenceEquals(f.GetValue(this.toolStrip), this.redoToolStripButton)) {
+        // Need to set currentlyActiveTooltipItem to null, so the call to UpdateToolTip actually does the update
+        f.SetValue(this.toolStrip, null);
+        System.Reflection.MethodInfo m = this.toolStrip.GetType().GetMethod("UpdateToolTip", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+        m.Invoke(this.toolStrip, new object[] { this.redoToolStripButton });
+      }
+      #endregion
+
+      #region macro recording
+      Bitmap image;
+      string toolTipText;
+      if (dataProcessor.CommandChain.IsMacroRecording) {
+        image = Properties.Resources.StopHS;
+        toolTipText = "Stop Macro recording";
+      } else {
+        image = Properties.Resources.RecordHS;
+        toolTipText = "Start Macro recording";
+      }
+
+      recordMacroToolStripButton.Image = image;
+      recordMacroToolStripButton.ToolTipText = toolTipText;
+      f = this.toolStrip.GetType().GetField("currentlyActiveTooltipItem", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
+      if (object.ReferenceEquals(f.GetValue(this.toolStrip), this.recordMacroToolStripButton)) {
+        // Need to set currentlyActiveTooltipItem to null, so the call to UpdateToolTip actually does the update
+        f.SetValue(this.toolStrip, null);
+        System.Reflection.MethodInfo m = this.toolStrip.GetType().GetMethod("UpdateToolTip", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+        m.Invoke(this.toolStrip, new object[] { this.recordMacroToolStripButton });
+      }
+      #endregion
+
+      if (!string.IsNullOrEmpty(lastSavedFile)) {
+        if (lastSavedCommand != this.dataProcessor.CommandChain.LastExecutedCommand && !lastSavedFile.Contains('*'))
+          this.Text = "Data Importer - " + lastSavedFile + "*";
+        else
+          this.Text = "Data Importer - " + lastSavedFile;
+      }
+    }
+
+    private void chbReorderColumns_CheckedChanged(object sender, EventArgs e) {
+      this.dataSetView.AllowReorderColumns = chbReorder.CheckBoxControl.Checked;
+
+      if (chbReorder.CheckBoxControl.Checked) {
+        foreach (ListViewItem item in listCommands.Items)
+          item.ForeColor = Color.LightGray;
+        listCommands.Enabled = false;
+      } else {
+        Dictionary<string, int[]> dictionary = new Dictionary<string, int[]>();
+        int[] displayIndices;
+        for (int i = this.dataSetView.Controls.Count - 1; i >= 0; i--) {
+          displayIndices = ((ColumnGroupView)this.dataSetView.Controls[i]).DisplayIndexes;
+          //check if displayIndices are ordered, otherwise the array is added to the list
+          for (int j = 0; j < displayIndices.Length; j++) {
+            if (j != 0 && ((displayIndices[j] - displayIndices[j - 1]) != 1)) {
+              ColumnGroup columnGroup = this.dataSetView.DataSet.ColumnGroups.ElementAt(this.dataSetView.Controls.Count - 1 - i);
+              dictionary[columnGroup.Name] = displayIndices;
+              break;
+            }
+          }
+        }
+        if (dictionary.Count != 0)
+          this.dataProcessor.CommandChain.Add(new ReorderColumnsCommand(this.dataProcessor.DataSet, dictionary));
+
+        listCommands.Enabled = true;
+        UpdateListViewItems();
+      }
+    }
+
+    private void UpdateDataSetView() {
+      this.dataSetView.Dispose();
+      this.dataSetView = new DataSetView(this.dataProcessor.DataSet, this.dataProcessor.CommandChain);
+      this.dataSetView.StateChanged += new EventHandler(DataSetStateChanged);
+      UpdateListViewItems();
+
+      this.dataSetView.Dock = DockStyle.Fill;
+      this.splitContainer1.Panel2.Controls.Clear();
+      this.splitContainer1.Panel2.Controls.Add(this.dataSetView);
+      this.dataSetView.ColumnGroupMaxWidth = this.splitContainer1.Panel2.Width;
+      this.dataProcessor.CommandChain.Changed += this.CommandChainChanged;
+      GC.Collect();
+    }
+
+    private void Panel2_Resize(object sender, EventArgs e) {
+      this.dataSetView.ColumnGroupMaxWidth = this.splitContainer1.Panel2.Width;
+    }
+
+
+    #region BackgroundWorker
+    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      CommandChain temp = (CommandChain)e.Argument;
+      int i = 0;
+      int max = temp.CommandsCount;
+      foreach (DataSetCommandBase cmd in temp) {
+        //update description
+        backgroundWorker.ReportProgress(i * 100 / max, cmd.Description);
+        cmd.DataSet = dataProcessor.DataSet;
+        if (cmd is DatabaseCommandBase)
+          ((DatabaseCommandBase)cmd).DbExplorer = this.dataProcessor.DatabaseExplorer;
+        this.dataProcessor.CommandChain.Add(cmd, false);
+        i++;
+      }
+    }
+
+    private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      progressDlg.ProgressBar.Value = 100;
+      progressDlg.Refresh();
+      this.Enabled = true;
+      UpdateDataSetView();
+      progressDlg.Close();
+      if (e.Error != null) {
+        string message = e.Error.Message;
+        if (e.Error is CommandExecutionException)
+          message += Environment.NewLine + "Command: " +
+            ((CommandExecutionException)e.Error).Command.GetType().ToString();
+        MessageBox.Show(message, "Error occured during loading of command chain");
+      }
+      this.dataProcessor.CommandChain.FireChanged();
+    }
+
+    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
+      progressDlg.Label.Text = (string)e.UserState;
+      progressDlg.ProgressBar.Value = e.ProgressPercentage;
+      progressDlg.Refresh();
+    }
+    #endregion
+
+    #region GUI actions
+    private void NewFile() {
+      if (!CheckUnsavedChanges())
+        return;
+      this.DataProcessor.Reset();
+      this.lastSavedFile = "";
+      this.Text = "Data Importer";
+      UpdateDataSetView();
+    }
+
+    private void Open() {
+      if (!CheckUnsavedChanges())
+        return;
+      OpenFileDialog dlg = new OpenFileDialog();
+      dlg.Filter = "DataImporter file (*.dhl)|*.dhl|All files (*.*)|*.*";
+      dlg.RestoreDirectory = true;
+      if (dlg.ShowDialog() == DialogResult.OK) {
+        try {
+          DataProcessor dp = (DataProcessor)XmlParser.Deserialize(dlg.FileName);
+          dp.DatabaseExplorer = this.dataProcessor.DatabaseExplorer;
+          this.lastSavedFile = dlg.FileName;
+          this.Text = "Data Importer - " + lastSavedFile;
+          this.dataProcessor.Reset();
+          this.dataProcessor = dp;
+        }
+        catch (XmlException e) {
+          MessageBox.Show(e.Message, "Error occured during file open.");
+        }
+        finally {
+          this.lastSavedCommand = null;
+          UpdateDataSetView();
+          this.dataProcessor.CommandChain.FireChanged();
+        }
+      }
+    }
+
+    private bool CheckUnsavedChanges() {
+      if (this.lastSavedCommand != this.dataProcessor.CommandChain.LastExecutedCommand) {
+        DialogResult result = new SaveDialog().ShowDialog(this);
+        if (result == DialogResult.Yes)
+          return this.Save();
+        else if (result == DialogResult.Cancel)
+          return false;
+      }
+      return true;
+    }
+
+    private bool Save() {
+      if (string.IsNullOrEmpty(this.lastSavedFile))
+        return this.SaveAs();
+
+      this.Save(dataProcessor, this.lastSavedFile);
+      return true;
+    }
+
+    private void Save(object serialize, string filename) {
+      try {
+        this.Cursor = Cursors.WaitCursor;
+        XmlGenerator.Serialize(serialize, filename, CompressionLevel.Optimal);
+        this.Cursor = Cursors.Default;
+        this.Text = "Data Importer - " + lastSavedFile;
+        this.lastSavedCommand = this.dataProcessor.CommandChain.LastExecutedCommand;
+      }
+      finally {
+        this.Cursor = Cursors.Default;
+      }
+    }
+
+    private bool SaveAs() {
+      SaveFileDialog saveFileDialog = new SaveFileDialog();
+      saveFileDialog.AddExtension = true;
+      saveFileDialog.RestoreDirectory = true;
+      saveFileDialog.Filter = "Regression Problem file (*.hl)|*.hl|Classification Problem file (*.hl)|*.hl|DataImporter file (*.dhl)|*.dhl|All files (*.*)|*.*";
+      saveFileDialog.DefaultExt = "dhl";
+      saveFileDialog.FilterIndex = 3;
+
+      if (saveFileDialog.ShowDialog() == DialogResult.OK) {
+        this.lastSavedFile = saveFileDialog.FileName;
+        if (saveFileDialog.FilterIndex <= 2) {
+          Dataset dataset = ConvertDataset(dataProcessor.DataSet);
+          DataAnalysisProblemData problemData = null;
+          if (saveFileDialog.FilterIndex == 1) {
+            problemData = new RegressionProblemData(dataset, dataset.DoubleVariables, dataset.DoubleVariables.First());
+          } else if (saveFileDialog.FilterIndex == 2) {
+            problemData = new ClassificationProblemData(dataset, dataset.DoubleVariables, dataset.DoubleVariables.First());
+          } else {
+            throw new ArgumentException("File extension doesn't exist");
+          }
+          Save(problemData, lastSavedFile);
+        } else {
+          Save(dataProcessor, lastSavedFile);
+        }
+        return true;
+      }
+      return false;
+    }
+
+    private Dataset ConvertDataset(DataSet dataSet) {
+      ColumnGroup cg;
+      if (dataSet.ActiveColumnGroups.Any()) {
+        cg = dataSet.ActiveColumnGroups.First();
+      } else if (dataSet.ColumnGroups.Any()) {
+        cg = dataSet.ColumnGroups.First();
+      } else {
+        throw new ArgumentException("There exists no ColumnGroup which could be saved!");
+      }
+      List<IList> values = new List<IList>();
+      foreach (var column in cg.Columns) {
+        if (column.DataType == typeof(double?)) {
+          values.Add(column.ValuesEnumerable.Cast<double?>().Select(x => x ?? double.NaN).ToList());
+        } else if (column.DataType == typeof(string)) {
+          values.Add(column.ValuesEnumerable.Cast<string>().Select(x => x ?? string.Empty).ToList());
+        } else if (column.DataType == typeof(DateTime?)) {
+          values.Add(column.ValuesEnumerable.Cast<DateTime?>().Select(x => x ?? default(DateTime)).ToList());
+        } else {
+          throw new ArgumentException("The variable values must be of type List<double>, List<string> or List<DateTime>");
+        }
+      }
+      IEnumerable<string> variableNames = cg.Columns.Select(x => x.Name);
+      return new Dataset(variableNames, values);
+    }
+
+    private void RecordMacro() {
+      if (dataProcessor.CommandChain.IsMacroRecording)
+        this.SaveCommandChain();
+      this.dataProcessor.CommandChain.ToggleMacroRecording();
+    }
+
+    private void OpenCommandChain() {
+      OpenFileDialog dlg = new OpenFileDialog();
+      dlg.Filter = "DataImporter Command file (*.dhlcmd)|*.dhlcmd|All files (*.*)|*.*";
+      dlg.RestoreDirectory = true;
+      if (dlg.ShowDialog() == DialogResult.OK) {
+        this.dataSetView.Dispose();
+        this.Cursor = Cursors.WaitCursor;
+        this.Enabled = false;
+        try {
+          CommandChain temp = (CommandChain)XmlParser.Deserialize(dlg.FileName);
+          progressDlg = new ProgressDialog();
+          progressDlg.DesktopLocation = new Point(this.Location.X + this.Width / 2 - progressDlg.Width / 2, this.Location.Y + this.Height / 2 - progressDlg.Height / 2);
+          backgroundWorker.RunWorkerAsync(temp);
+          progressDlg.ShowDialog();
+          this.Refresh();
+        }
+        finally {
+          this.Enabled = true;
+          this.Cursor = Cursors.Default;
+        }
+      }
+    }
+
+    private void SaveCommandChain() {
+      SaveFileDialog saveFileDialog = new SaveFileDialog();
+      saveFileDialog.AddExtension = true;
+      saveFileDialog.RestoreDirectory = true;
+      saveFileDialog.DefaultExt = "dhlcmd";
+      saveFileDialog.Filter = "DataImporter Command file (*.dhlcmd)|*.dhlcmd|All files (*.*)|*.*";
+
+      if (saveFileDialog.ShowDialog() == DialogResult.OK) {
+        try {
+          this.Cursor = Cursors.WaitCursor;
+          XmlGenerator.Serialize(this.dataProcessor.CommandChain, saveFileDialog.FileName, CompressionLevel.Optimal);
+        }
+        finally {
+          this.Cursor = Cursors.Default;
+        }
+      }
+    }
+
+    private void Export() {
+      ExportDialog exportDlg = new ExportDialog(this.dataProcessor.DataSet);
+      exportDlg.StartPosition = FormStartPosition.CenterParent;
+      exportDlg.ShowDialog(this);
+    }
+
+    private void Import() {
+      ImportDialog importDlg = new ImportDialog(this.dataProcessor.DataSet, this.dataProcessor.CommandChain);
+      importDlg.StartPosition = FormStartPosition.CenterParent;
+      importDlg.ShowDialog(this);
+    }
+
+    private void Undo() {
+      this.dataProcessor.CommandChain.Undo();
+      this.Focus();
+    }
+
+    private void Redo() {
+      this.dataProcessor.CommandChain.Redo();
+      this.Focus();
+    }
+
+    private void AddTables() {
+      if (dataProcessor.DatabaseExplorer == null || !dataProcessor.DatabaseExplorer.IsConnected) {
+        MessageBox.Show("Not connected to database!");
+        return;
+      }
+      DbTablesView tablesForm = new DbTablesView();
+      tablesForm.DbExplorer = dataProcessor.DatabaseExplorer;
+      tablesForm.SetTables(dataProcessor.DatabaseExplorer.AllTables);
+      tablesForm.StartPosition = FormStartPosition.CenterParent;
+      if (tablesForm.ShowDialog(this) == DialogResult.OK) {
+        progressDlg = new ProgressDialog();
+        progressDlg.Label.Text = "Loading data from database";
+        progressDlg.Show(this);
+        progressDlg.DesktopLocation = new Point(this.Location.X + this.Width / 2 - progressDlg.Width / 2, this.Location.Y + this.Height / 2 - progressDlg.Height / 2);
+        this.Refresh();
+        this.dataProcessor.CommandChain.Add(new LoadColumnGroupsFromDBCommand(this.dataProcessor.DataSet, this.dataProcessor.DatabaseExplorer,
+          tablesForm.SelectedTables));
+        progressDlg.Close();
+      }
+    }
+
+    private void DatabaseExplorer_NewRowLoaded(object sender, ProgressChangedEventArgs e) {
+      progressDlg.ProgressBar.Value = e.ProgressPercentage;
+      progressDlg.Label.Text = (string)e.UserState;
+      progressDlg.Refresh();
+    }
+
+    private void AddTablesWithSQLCommand() {
+      CommandViewDialog dlg = new CommandViewDialog();
+      dlg.StartPosition = FormStartPosition.CenterParent;
+      SqlCommandView cmdView = new SqlCommandView();
+      dlg.Panel.Controls.Add(cmdView);
+      dlg.Panel.Size = cmdView.Size;
+      dlg.ShowDialog(this);
+      if (dlg.DialogResult == DialogResult.OK) {
+        this.dataProcessor.CommandChain.Add(new LoadColumnGroupWithSqlStringFromDBCommand(this.dataProcessor.DataSet, this.dataProcessor.DatabaseExplorer, cmdView.SqlCommand));
+      }
+    }
+
+    private void SetDbConnection() {
+      dataProcessor.DatabaseExplorer.ShowDbConnectionWizard();
+      if (dataProcessor.DatabaseExplorer.IsConnected) {
+        this.lblConnectionStatus.Text = "Successfully connected to database!";
+        this.lblConnectionStatus.BackColor = Color.LightGreen;
+      } else {
+        this.lblConnectionStatus.Text = "Not connected to database!";
+        this.lblConnectionStatus.BackColor = Color.FromArgb(255, 128, 128); //light red
+      }
+    }
+    #endregion
+
+    #region GUI ClickEvents - menuitems, toolbarbuttons
+
+    private void DataProcessorView_FormClosing(object sender, FormClosingEventArgs e) {
+      if (!CheckUnsavedChanges())
+        e.Cancel = true;
+    }
+
+    #region MenuItems
+    private void newToolStripMenuItem_Click(object sender, EventArgs e) {
+      this.NewFile();
+    }
+
+    private void openToolStripMenuItem_Click(object sender, EventArgs e) {
+      this.Open();
+    }
+
+    private void saveToolStripMenuItem_Click(object sender, EventArgs e) {
+      this.Save();
+    }
+
+    private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) {
+      this.SaveAs();
+    }
+
+    private void importToolStripMenuItem_Click(object sender, EventArgs e) {
+      this.Import();
+    }
+
+    private void exportToolStripMenuItem_Click(object sender, EventArgs e) {
+      this.Export();
+    }
+
+    private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
+      this.Close();
+    }
+
+    private void undoToolStripMenuItem_Click(object sender, EventArgs e) {
+      this.Undo();
+    }
+
+    private void redoToolStripMenuItem_Click(object sender, EventArgs e) {
+      this.Redo();
+    }
+
+    private void addTablesToolStripMenuItem_Click(object sender, EventArgs e) {
+      this.AddTables();
+    }
+
+    private void addTablesWithSqlStringToolStripMenuItem_Click(object sender, EventArgs e) {
+      this.AddTablesWithSQLCommand();
+    }
+
+    private void setGenericDBConnectionToolStripMenuItem_Click(object sender, EventArgs e) {
+      this.dataProcessor.DatabaseExplorer = (IDbExplorer)((ToolStripMenuItem)sender).Tag;
+      this.dataProcessor.DatabaseExplorer.NewRowLoaded += new ProgressChangedEventHandler(DatabaseExplorer_NewRowLoaded);
+      this.SetDbConnection();
+    }
+    #endregion
+
+    #region ToolbarButtons
+    private void newToolStripButton_Click(object sender, EventArgs e) {
+      this.NewFile();
+    }
+
+    private void openToolStripButton_Click(object sender, EventArgs e) {
+      this.Open();
+    }
+
+    private void saveToolStripButton_Click(object sender, EventArgs e) {
+      this.Save();
+    }
+
+    private void recordMacroToolStripButton_Click(object sender, EventArgs e) {
+      this.RecordMacro();
+    }
+
+    private void openCommandChainToolStripButton_Click(object sender, EventArgs e) {
+      this.OpenCommandChain();
+    }
+
+    private void saveCommandChaingToolStripButton_Click(object sender, EventArgs e) {
+      this.SaveCommandChain();
+    }
+
+    private void undoToolStripButton_Click(object sender, EventArgs e) {
+      this.Undo();
+    }
+
+    private void redoToolStripButton_Click(object sender, EventArgs e) {
+      this.Redo();
+    }
+    #endregion
+    #endregion
+
+    private class AttributeComparer : IComparer<ViewableCommandInfoAttribute> {
+      public int Compare(ViewableCommandInfoAttribute x, ViewableCommandInfoAttribute y) {
+        int cmpResult = x.GroupName.CompareTo(y.GroupName);
+        if (cmpResult != 0)
+          return cmpResult;
+        cmpResult = x.Position.CompareTo(y.Position);
+        if (cmpResult != 0)
+          return cmpResult;
+        return x.Name.CompareTo(y.Name);
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DbTablesView.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DbTablesView.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DbTablesView.Designer.cs	(revision 15690)
@@ -0,0 +1,333 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  partial class DbTablesView {
+    /// <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.components = new System.ComponentModel.Container();
+      this.listTables = new System.Windows.Forms.ListBox();
+      this.listTablesContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.selectAllColumnsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.deselectAllColumnsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.gridColumns = new System.Windows.Forms.DataGridView();
+      this.ColumnName = new System.Windows.Forms.DataGridViewTextBoxColumn();
+      this.SqlDataType = new System.Windows.Forms.DataGridViewTextBoxColumn();
+      this.IsSelected = new System.Windows.Forms.DataGridViewCheckBoxColumn();
+      this.FilterColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn();
+      this.MinValue = new System.Windows.Forms.DataGridViewTextBoxColumn();
+      this.MaxValue = new System.Windows.Forms.DataGridViewTextBoxColumn();
+      this.LikeValue = new System.Windows.Forms.DataGridViewTextBoxColumn();
+      this.dbColumnBindingSource = new System.Windows.Forms.BindingSource(this.components);
+      this.btnOk = new System.Windows.Forms.Button();
+      this.btnCancel = new System.Windows.Forms.Button();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.lblAffectedRows = new System.Windows.Forms.Label();
+      this.lblRows = new System.Windows.Forms.Label();
+      this.btnClearSelection = new System.Windows.Forms.Button();
+      this.listTablesContextMenu.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.gridColumns)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.dbColumnBindingSource)).BeginInit();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.splitContainer2.Panel1.SuspendLayout();
+      this.splitContainer2.Panel2.SuspendLayout();
+      this.splitContainer2.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // listTables
+      // 
+      this.listTables.ContextMenuStrip = this.listTablesContextMenu;
+      this.listTables.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.listTables.FormattingEnabled = true;
+      this.listTables.Location = new System.Drawing.Point(0, 0);
+      this.listTables.Name = "listTables";
+      this.listTables.Size = new System.Drawing.Size(210, 420);
+      this.listTables.TabIndex = 0;
+      this.listTables.SelectedIndexChanged += new System.EventHandler(this.listTables_SelectedIndexChanged);
+      this.listTables.MouseDown += new System.Windows.Forms.MouseEventHandler(this.listTables_MouseDown);
+      // 
+      // listTablesContextMenu
+      // 
+      this.listTablesContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.selectAllColumnsToolStripMenuItem,
+            this.deselectAllColumnsToolStripMenuItem});
+      this.listTablesContextMenu.Name = "listTablesContextMenu";
+      this.listTablesContextMenu.Size = new System.Drawing.Size(184, 48);
+      // 
+      // selectAllColumnsToolStripMenuItem
+      // 
+      this.selectAllColumnsToolStripMenuItem.Name = "selectAllColumnsToolStripMenuItem";
+      this.selectAllColumnsToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
+      this.selectAllColumnsToolStripMenuItem.Text = "Select All Columns";
+      this.selectAllColumnsToolStripMenuItem.Click += new System.EventHandler(this.selectAllColumnsToolStripMenuItem_Click);
+      // 
+      // deselectAllColumnsToolStripMenuItem
+      // 
+      this.deselectAllColumnsToolStripMenuItem.Name = "deselectAllColumnsToolStripMenuItem";
+      this.deselectAllColumnsToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
+      this.deselectAllColumnsToolStripMenuItem.Text = "Deselect All Columns";
+      this.deselectAllColumnsToolStripMenuItem.Click += new System.EventHandler(this.deselectAllColumnsToolStripMenuItem_Click);
+      // 
+      // gridColumns
+      // 
+      this.gridColumns.AllowUserToAddRows = false;
+      this.gridColumns.AllowUserToDeleteRows = false;
+      this.gridColumns.AllowUserToResizeRows = false;
+      this.gridColumns.AutoGenerateColumns = false;
+      this.gridColumns.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.gridColumns.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            this.ColumnName,
+            this.SqlDataType,
+            this.IsSelected,
+            this.FilterColumn,
+            this.MinValue,
+            this.MaxValue,
+            this.LikeValue});
+      this.gridColumns.DataSource = this.dbColumnBindingSource;
+      this.gridColumns.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.gridColumns.Location = new System.Drawing.Point(0, 0);
+      this.gridColumns.MultiSelect = false;
+      this.gridColumns.Name = "gridColumns";
+      this.gridColumns.RowHeadersVisible = false;
+      this.gridColumns.Size = new System.Drawing.Size(766, 376);
+      this.gridColumns.TabIndex = 1;
+      this.gridColumns.CellPainting += new System.Windows.Forms.DataGridViewCellPaintingEventHandler(this.gridColumns_CellPainting);
+      // 
+      // ColumnName
+      // 
+      this.ColumnName.DataPropertyName = "ColumnName";
+      this.ColumnName.HeaderText = "ColumnName";
+      this.ColumnName.Name = "ColumnName";
+      this.ColumnName.ReadOnly = true;
+      // 
+      // SqlDataType
+      // 
+      this.SqlDataType.DataPropertyName = "SqlDataType";
+      this.SqlDataType.HeaderText = "SqlDataType";
+      this.SqlDataType.Name = "SqlDataType";
+      this.SqlDataType.ReadOnly = true;
+      // 
+      // IsSelected
+      // 
+      this.IsSelected.DataPropertyName = "Selected";
+      this.IsSelected.HeaderText = "Selected";
+      this.IsSelected.Name = "IsSelected";
+      // 
+      // FilterColumn
+      // 
+      this.FilterColumn.DataPropertyName = "FilterColumn";
+      this.FilterColumn.HeaderText = "FilterColumn";
+      this.FilterColumn.Name = "FilterColumn";
+      // 
+      // MinValue
+      // 
+      this.MinValue.DataPropertyName = "MinValue";
+      this.MinValue.HeaderText = "MinValue";
+      this.MinValue.Name = "MinValue";
+      // 
+      // MaxValue
+      // 
+      this.MaxValue.DataPropertyName = "MaxValue";
+      this.MaxValue.HeaderText = "MaxValue";
+      this.MaxValue.Name = "MaxValue";
+      // 
+      // LikeValue
+      // 
+      this.LikeValue.DataPropertyName = "LikeValue";
+      this.LikeValue.HeaderText = "LikeValue";
+      this.LikeValue.Name = "LikeValue";
+      // 
+      // dbColumnBindingSource
+      // 
+      this.dbColumnBindingSource.DataSource = typeof(HeuristicLab.DataImporter.DbExplorer.Interfaces.DbColumn);
+      // 
+      // btnOk
+      // 
+      this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.btnOk.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.btnOk.Location = new System.Drawing.Point(598, 11);
+      this.btnOk.Name = "btnOk";
+      this.btnOk.Size = new System.Drawing.Size(75, 23);
+      this.btnOk.TabIndex = 2;
+      this.btnOk.Text = "OK";
+      this.btnOk.UseVisualStyleBackColor = true;
+      // 
+      // btnCancel
+      // 
+      this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.btnCancel.Location = new System.Drawing.Point(679, 11);
+      this.btnCancel.Name = "btnCancel";
+      this.btnCancel.Size = new System.Drawing.Size(75, 23);
+      this.btnCancel.TabIndex = 3;
+      this.btnCancel.Text = "Cancel";
+      this.btnCancel.UseVisualStyleBackColor = true;
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.listTables);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.splitContainer2);
+      this.splitContainer1.Size = new System.Drawing.Size(980, 422);
+      this.splitContainer1.SplitterDistance = 210;
+      this.splitContainer1.TabIndex = 4;
+      this.splitContainer1.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.splitContainer1_SplitterMoved);
+      // 
+      // splitContainer2
+      // 
+      this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+      this.splitContainer2.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer2.Name = "splitContainer2";
+      this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer2.Panel1
+      // 
+      this.splitContainer2.Panel1.Controls.Add(this.gridColumns);
+      // 
+      // splitContainer2.Panel2
+      // 
+      this.splitContainer2.Panel2.Controls.Add(this.lblAffectedRows);
+      this.splitContainer2.Panel2.Controls.Add(this.lblRows);
+      this.splitContainer2.Panel2.Controls.Add(this.btnClearSelection);
+      this.splitContainer2.Panel2.Controls.Add(this.btnOk);
+      this.splitContainer2.Panel2.Controls.Add(this.btnCancel);
+      this.splitContainer2.Size = new System.Drawing.Size(766, 422);
+      this.splitContainer2.SplitterDistance = 376;
+      this.splitContainer2.TabIndex = 4;
+      // 
+      // lblAffectedRows
+      // 
+      this.lblAffectedRows.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.lblAffectedRows.AutoSize = true;
+      this.lblAffectedRows.Location = new System.Drawing.Point(130, 16);
+      this.lblAffectedRows.Name = "lblAffectedRows";
+      this.lblAffectedRows.Size = new System.Drawing.Size(111, 13);
+      this.lblAffectedRows.TabIndex = 6;
+      this.lblAffectedRows.Text = "Total selected rows: 0";
+      // 
+      // lblRows
+      // 
+      this.lblRows.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.lblRows.AutoSize = true;
+      this.lblRows.Location = new System.Drawing.Point(20, 16);
+      this.lblRows.Name = "lblRows";
+      this.lblRows.Size = new System.Drawing.Size(46, 13);
+      this.lblRows.TabIndex = 5;
+      this.lblRows.Text = "Rows: 0";
+      // 
+      // btnClearSelection
+      // 
+      this.btnClearSelection.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.btnClearSelection.Location = new System.Drawing.Point(423, 11);
+      this.btnClearSelection.Name = "btnClearSelection";
+      this.btnClearSelection.Size = new System.Drawing.Size(121, 23);
+      this.btnClearSelection.TabIndex = 4;
+      this.btnClearSelection.Text = "Clear Selection";
+      this.btnClearSelection.UseVisualStyleBackColor = true;
+      this.btnClearSelection.Click += new System.EventHandler(this.btnClearSelection_Click);
+      // 
+      // DbTablesView
+      // 
+      this.AcceptButton = this.btnOk;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.btnCancel;
+      this.ClientSize = new System.Drawing.Size(980, 422);
+      this.ControlBox = false;
+      this.Controls.Add(this.splitContainer1);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "DbTablesView";
+      this.ShowInTaskbar = false;
+      this.Text = "DataTablesForm";
+      this.TopMost = true;
+      this.Shown += new System.EventHandler(this.DataTablesForm_Shown);
+      this.listTablesContextMenu.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.gridColumns)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.dbColumnBindingSource)).EndInit();
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.ResumeLayout(false);
+      this.splitContainer2.Panel1.ResumeLayout(false);
+      this.splitContainer2.Panel2.ResumeLayout(false);
+      this.splitContainer2.Panel2.PerformLayout();
+      this.splitContainer2.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ListBox listTables;
+    private System.Windows.Forms.DataGridView gridColumns;
+    private System.Windows.Forms.Button btnOk;
+    private System.Windows.Forms.Button btnCancel;
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.SplitContainer splitContainer2;
+    private System.Windows.Forms.Button btnClearSelection;
+    private System.Windows.Forms.ContextMenuStrip listTablesContextMenu;
+    private System.Windows.Forms.ToolStripMenuItem selectAllColumnsToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem deselectAllColumnsToolStripMenuItem;
+    private System.Windows.Forms.BindingSource dbColumnBindingSource;
+    private System.Windows.Forms.Label lblRows;
+    private System.Windows.Forms.Label lblAffectedRows;
+    private System.Windows.Forms.DataGridViewTextBoxColumn ColumnName;
+    private System.Windows.Forms.DataGridViewTextBoxColumn SqlDataType;
+    private System.Windows.Forms.DataGridViewCheckBoxColumn IsSelected;
+    private System.Windows.Forms.DataGridViewCheckBoxColumn FilterColumn;
+    private System.Windows.Forms.DataGridViewTextBoxColumn MinValue;
+    private System.Windows.Forms.DataGridViewTextBoxColumn MaxValue;
+    private System.Windows.Forms.DataGridViewTextBoxColumn LikeValue;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DbTablesView.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DbTablesView.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/DbTablesView.cs	(revision 15690)
@@ -0,0 +1,310 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.DbExplorer.Interfaces;
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  public partial class DbTablesView : Form {
+    private enum GridColumnsIndex {
+      Selected = 2,
+      Filtered = 3,
+      MinValue = 4,
+      MaxValue = 5,
+      LikeValue = 6
+    }
+
+    protected IEnumerable<DbTable> Tables {
+      get {
+        return (IEnumerable<DbTable>)this.listTables.DataSource;
+      }
+    }
+
+    public IEnumerable<DbTable> SelectedTables {
+      get {
+        return Tables.Where(x => x.IsSelected);
+      }
+    }
+
+    private IDbExplorer dbExplorer;
+    public IDbExplorer DbExplorer {
+      get { return this.dbExplorer; }
+      set { this.dbExplorer = value; }
+    }
+
+    private DataGridViewCellStyle inactiveStyle;
+
+    public DbTablesView() {
+      InitializeComponent();
+      inactiveStyle = new DataGridViewCellStyle();
+      inactiveStyle.BackColor = Color.DarkGray;
+      this.listTables.DrawMode = DrawMode.OwnerDrawFixed;
+      this.listTables.DrawItem += new DrawItemEventHandler(this.listTables_DrawItem);
+      this.gridColumns.CellContentClick += new DataGridViewCellEventHandler(gridColumns_CellContentClick);
+      this.gridColumns.CellContentDoubleClick += new DataGridViewCellEventHandler(gridColumns_CellContentClick);
+      this.gridColumns.CellEndEdit += new DataGridViewCellEventHandler(gridColumns_CellEndEdit);
+      this.gridColumns.CellValidating += new DataGridViewCellValidatingEventHandler(gridColumns_CellValidating);
+
+    }
+
+    public void SetTables(IEnumerable<DbTable> tables) {
+      this.listTables.DataSource = tables;
+    }
+
+
+    private void btnClearSelection_Click(object sender, EventArgs e) {
+      foreach (DbTable table in this.Tables) {
+        if (table.IsSelected)
+          table.ClearSelection();
+      }
+      listTables.Invalidate();
+      gridColumns.Invalidate();
+    }
+
+    private void selectAllColumnsToolStripMenuItem_Click(object sender, EventArgs e) {
+      DbTable table = (DbTable)listTables.SelectedItem;
+      gridColumns.ClearSelection();
+      table.SelectAllColumns();
+      //needed for correct update of GUI
+      gridColumns.DataSource = null;
+      gridColumns.DataSource = table.Columns;
+      for (int i = 0; i < gridColumns.RowCount; i++) {
+        if (dbExplorer.IsFilterableDataType(table.Columns.ElementAt(i).SqlDataType)) {
+          ChangeAppearanceOfRow(i);
+        }
+      }
+      dbExplorer.FillAffectedRowsForTable(table);
+      this.lblAffectedRows.Text = "Affected rows: " + table.AffectedRows;
+      listTables.Refresh();
+      gridColumns.Refresh();
+    }
+
+    private void deselectAllColumnsToolStripMenuItem_Click(object sender, EventArgs e) {
+      DbTable table = (DbTable)listTables.SelectedItem;
+      gridColumns.ClearSelection();
+      table.ClearSelection();
+      //needed for correct update of GUI
+      gridColumns.DataSource = null;
+      gridColumns.DataSource = table.Columns;
+      for (int i = 0; i < gridColumns.RowCount; i++)
+        ChangeAppearanceOfRow(i);
+
+      dbExplorer.FillAffectedRowsForTable(table);
+      this.lblAffectedRows.Text = "Affected rows: " + table.AffectedRows;
+      listTables.Refresh();
+      gridColumns.Refresh();
+    }
+
+    private void DataTablesForm_Shown(object sender, EventArgs e) {
+      //needed because otherwise the table is not painted correctly
+      UpdateGridColumns();
+    }
+
+    private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e) {
+      this.listTables.Invalidate();
+    }
+
+    #region ListView events
+    private void listTables_MouseDown(object sender, MouseEventArgs e) {
+      if (e.Button == MouseButtons.Right) {
+        listTables.SelectedIndex = listTables.IndexFromPoint(e.Location);
+      }
+    }
+
+    private void listTables_DrawItem(object sender, DrawItemEventArgs e) {
+      e.DrawBackground();
+      Brush brush = Brushes.Black;
+      DbTable actTable = (DbTable)listTables.Items[e.Index];
+      if (actTable.IsSelected)
+        brush = Brushes.Red;
+      if (((e.State & DrawItemState.Focus) == DrawItemState.Focus) ||
+           ((e.State & DrawItemState.Selected) == DrawItemState.Selected))
+        brush = Brushes.White;
+
+      e.Graphics.DrawString(actTable.ToString(), e.Font, brush, e.Bounds, StringFormat.GenericDefault);
+      e.DrawFocusRectangle();
+    }
+
+    private void listTables_SelectedIndexChanged(object sender, EventArgs e) {
+      UpdateGridColumns();
+    }
+    #endregion
+
+    #region DataGridView events
+    private void gridColumns_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) {
+      if (e.RowIndex > -1) {
+        if (e.ColumnIndex > 2 && this.gridColumns[e.ColumnIndex, e.RowIndex].ReadOnly) {
+          e.PaintBackground(e.CellBounds, false);
+          if (e.ColumnIndex == 3) {
+            Rectangle r = e.CellBounds;
+            r.Width = 13;
+            r.Height = 13;
+            r.X += e.CellBounds.Width / 2 - 7;
+            r.Y += e.CellBounds.Height / 2 - 7;
+            ControlPaint.DrawCheckBox(e.Graphics, r, ButtonState.Inactive);
+          }
+          e.Handled = true;
+        }
+      }
+    }
+
+    private void gridColumns_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
+      if (e.ColumnIndex < 4 || !gridColumns.IsCurrentCellDirty)
+        return;
+      DbTable table = ((DbTable)this.listTables.SelectedItem);
+      if (e.RowIndex >= table.Columns.Count())
+        return;
+
+      DbColumn col = table.Columns.ElementAt(e.RowIndex);
+      double doubleVal;
+      DateTime dateVal;
+      bool cancel = false;
+      if (dbExplorer.IsNumericDataType(col.SqlDataType)) {
+        if (!Double.TryParse(e.FormattedValue.ToString(), out doubleVal))
+          cancel = true;
+      } else if (dbExplorer.IsDateDataType(col.SqlDataType)) {
+        if (!DateTime.TryParse(e.FormattedValue.ToString(), out dateVal))
+          cancel = true;
+      }
+
+      if (cancel) {
+        e.Cancel = true;
+        MessageBox.Show("Please enter a " + col.SqlDataType + " value!");
+      }
+    }
+
+    private void gridColumns_CellEndEdit(object cender, DataGridViewCellEventArgs e) {
+      if (e.ColumnIndex < 4)
+        return;
+
+      DbTable table = ((DbTable)this.listTables.SelectedItem);
+      if (e.RowIndex >= table.Columns.Count())
+        return;
+
+      DbColumn col = table.Columns.ElementAt(e.RowIndex);
+      if (e.ColumnIndex == 4)
+        col.MinValue = gridColumns.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
+      else if (e.ColumnIndex == 5)
+        col.MaxValue = gridColumns.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
+      else if (e.ColumnIndex == 6)
+        col.LikeValue = gridColumns.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == null ? "" :
+          gridColumns.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
+      dbExplorer.FillAffectedRowsForTable(table);
+      lblAffectedRows.Text = "Affected rows: " + table.AffectedRows;
+    }
+
+    private void gridColumns_CellContentClick(object sender, DataGridViewCellEventArgs e) {
+      if (e.ColumnIndex == 2 || e.ColumnIndex == 3) {
+        gridColumns.EndEdit();
+        gridColumns.ClearSelection();
+        DbTable table = (DbTable)this.listTables.SelectedItem;
+        DbColumn col = table.Columns.ElementAt(e.RowIndex);
+
+        if (e.ColumnIndex == 3 || col.FilterColumn) {
+          this.Cursor = Cursors.WaitCursor;
+          if ((col.MinValue == null || col.MaxValue == null) &&
+            dbExplorer.IsFilterableDataType(col.SqlDataType) && !dbExplorer.IsStringDataType(col.SqlDataType))
+            dbExplorer.FillMinMaxValuesForTable(table);
+          dbExplorer.FillAffectedRowsForTable(table);
+          this.Cursor = Cursors.Default;
+        }
+
+        ChangeAppearanceOfRow(e.RowIndex);
+        this.listTables.Invalidate();
+        this.gridColumns.Invalidate();
+        lblAffectedRows.Text = "Affected rows: " + table.AffectedRows;
+      }
+    }
+
+    private void ChangeAppearanceOfRow(int rowIndex) {
+      DbTable table = (DbTable)this.listTables.SelectedItem;
+      DbColumn col = table.Columns.ElementAt(rowIndex);
+
+      if (!col.Selected) {
+        col.FilterColumn = false;
+        foreach (int i in Enum.GetValues(typeof(GridColumnsIndex)))
+          ChangeAppearanceOfCell(i, rowIndex, i == (int)GridColumnsIndex.Selected);
+      } else {
+        if (dbExplorer.IsFilterableDataType(col.SqlDataType)) {
+          ChangeAppearanceOfCell((int)GridColumnsIndex.Filtered, rowIndex, true);
+          if (col.FilterColumn) {
+            if (dbExplorer.IsStringDataType(col.SqlDataType)) {
+              ChangeAppearanceOfCell((int)GridColumnsIndex.MinValue, rowIndex, false);
+              ChangeAppearanceOfCell((int)GridColumnsIndex.MaxValue, rowIndex, false);
+              ChangeAppearanceOfCell((int)GridColumnsIndex.LikeValue, rowIndex, true);
+            } else {
+              ChangeAppearanceOfCell((int)GridColumnsIndex.MinValue, rowIndex, true);
+              ChangeAppearanceOfCell((int)GridColumnsIndex.MaxValue, rowIndex, true);
+              ChangeAppearanceOfCell((int)GridColumnsIndex.LikeValue, rowIndex, false);
+            }
+          } else {
+            ChangeAppearanceOfCell((int)GridColumnsIndex.MinValue, rowIndex, false);
+            ChangeAppearanceOfCell((int)GridColumnsIndex.MaxValue, rowIndex, false);
+            ChangeAppearanceOfCell((int)GridColumnsIndex.LikeValue, rowIndex, false);
+          }
+        }
+      }
+    }
+
+    private void ChangeAppearanceOfCell(int columnIndex, int rowIndex, bool active) {
+      if (active) {
+        gridColumns[columnIndex, rowIndex].ReadOnly = false;
+        gridColumns[columnIndex, rowIndex].Style = null;
+      } else {
+        gridColumns[columnIndex, rowIndex].ReadOnly = true;
+        gridColumns[columnIndex, rowIndex].Style = this.inactiveStyle;
+      }
+    }
+
+    private void UpdateGridColumns() {
+      DbTable actTable = (DbTable)this.listTables.SelectedItem;
+      if (actTable != null) {
+        gridColumns.EndEdit();
+        gridColumns.DataSource = actTable.Columns;
+        this.Cursor = Cursors.WaitCursor;
+
+        try {
+          dbExplorer.FillMinMaxValuesForTable(actTable);
+          dbExplorer.FillAffectedRowsForTable(actTable);
+
+          this.lblRows.Text = "Total rows: " + actTable.TotalRows;
+          this.lblAffectedRows.Text = "Affected rows: " + actTable.AffectedRows;
+
+          for (int i = 0; i < actTable.Columns.Count(); i++)
+            ChangeAppearanceOfRow(i);
+
+          this.gridColumns.Invalidate();
+        }
+        finally {
+          this.Cursor = Cursors.Default;
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ExportDialog.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ExportDialog.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ExportDialog.Designer.cs	(revision 15690)
@@ -0,0 +1,137 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  partial class ExportDialog {
+    /// <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.btnOK = new System.Windows.Forms.Button();
+      this.btnCancel = new System.Windows.Forms.Button();
+      this.exporterListBox = new System.Windows.Forms.ListBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.settingsPanel = new System.Windows.Forms.Panel();
+      this.SuspendLayout();
+      // 
+      // btnOK
+      // 
+      this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.btnOK.Location = new System.Drawing.Point(259, 203);
+      this.btnOK.Name = "btnOK";
+      this.btnOK.Size = new System.Drawing.Size(75, 23);
+      this.btnOK.TabIndex = 0;
+      this.btnOK.Text = "Ok";
+      this.btnOK.UseVisualStyleBackColor = true;
+      this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+      // 
+      // btnCancel
+      // 
+      this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.btnCancel.Location = new System.Drawing.Point(340, 203);
+      this.btnCancel.Name = "btnCancel";
+      this.btnCancel.Size = new System.Drawing.Size(75, 23);
+      this.btnCancel.TabIndex = 1;
+      this.btnCancel.Text = "Cancel";
+      this.btnCancel.UseVisualStyleBackColor = true;
+      // 
+      // exporterListBox
+      // 
+      this.exporterListBox.DisplayMember = "Description";
+      this.exporterListBox.FormattingEnabled = true;
+      this.exporterListBox.Location = new System.Drawing.Point(15, 28);
+      this.exporterListBox.Name = "exporterListBox";
+      this.exporterListBox.Size = new System.Drawing.Size(400, 82);
+      this.exporterListBox.TabIndex = 2;
+      this.exporterListBox.SelectedIndexChanged += new System.EventHandler(this.exporterListBox_SelectedIndexChanged);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(12, 12);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(103, 13);
+      this.label1.TabIndex = 3;
+      this.label1.Text = "Choose Export-Task";
+      // 
+      // settingsPanel
+      // 
+      this.settingsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)));
+      this.settingsPanel.Location = new System.Drawing.Point(15, 116);
+      this.settingsPanel.Name = "settingsPanel";
+      this.settingsPanel.Size = new System.Drawing.Size(400, 80);
+      this.settingsPanel.TabIndex = 4;
+      // 
+      // ExportDialog
+      // 
+      this.AcceptButton = this.btnOK;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.btnCancel;
+      this.ClientSize = new System.Drawing.Size(427, 233);
+      this.ControlBox = false;
+      this.Controls.Add(this.settingsPanel);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.exporterListBox);
+      this.Controls.Add(this.btnCancel);
+      this.Controls.Add(this.btnOK);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ExportDialog";
+      this.ShowInTaskbar = false;
+      this.Text = "ExportDialog";
+      this.TopMost = true;
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button btnOK;
+    private System.Windows.Forms.Button btnCancel;
+    private System.Windows.Forms.ListBox exporterListBox;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Panel settingsPanel;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ExportDialog.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ExportDialog.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ExportDialog.cs	(revision 15690)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  public partial class ExportDialog : Form {
+    private Data.Model.DataSet dataSet;
+    public ExportDialog(Data.Model.DataSet dataSet) {
+      InitializeComponent();
+      this.dataSet = dataSet;
+      IExporter[] exporters = ApplicationManager.Manager.GetInstances<IExporter>().ToArray();      
+      this.exporterListBox.DataSource = exporters;
+    }
+
+    private void btnOK_Click(object sender, EventArgs e) {
+      this.Cursor = Cursors.WaitCursor;
+      try {
+        ((IExporter)exporterListBox.SelectedItem).Export(this.dataSet);
+      }
+      finally {
+        this.Cursor = Cursors.Default;
+      }
+    }
+
+    private void exporterListBox_SelectedIndexChanged(object sender, EventArgs e) {
+      this.settingsPanel.Controls.Clear();
+      UserControl ctrl = ((IExporter)exporterListBox.SelectedItem).SettingsControl ;
+      this.Height = 180 + ctrl.Height;
+      this.settingsPanel.Controls.Add(ctrl);
+      
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/HeuristicLab.DataImporter.DataProcessor.csproj
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/HeuristicLab.DataImporter.DataProcessor.csproj	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/HeuristicLab.DataImporter.DataProcessor.csproj	(revision 15690)
@@ -0,0 +1,291 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{D7EE47DB-4D07-4BAC-9E9F-3F0393AEF605}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.DataImporter.DataProcessor</RootNamespace>
+    <AssemblyName>HeuristicLab.DataImporter.DataProcessor-1.0</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <Win32Resource>
+    </Win32Resource>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.IO.Compression" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Command\DataBaseCommandBase.cs" />
+    <Compile Include="Command\LoadColumnGroupsFromDBCommand.cs" />
+    <Compile Include="Command\LoadColumnGroupWithSqlStringFromDBCommand.cs" />
+    <Compile Include="Command\ReorderColumnsCommand.cs" />
+    <Compile Include="Command\SqlCommandView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Command\SqlCommandView.Designer.cs">
+      <DependentUpon>SqlCommandView.cs</DependentUpon>
+    </Compile>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="SaveDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="SaveDialog.Designer.cs">
+      <DependentUpon>SaveDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ProgressDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ProgressDialog.Designer.cs">
+      <DependentUpon>ProgressDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IImporter.cs" />
+    <Compile Include="ImportDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ImportDialog.Designer.cs">
+      <DependentUpon>ImportDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DataProcessor.cs" />
+    <Compile Include="DbTablesView.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DbTablesView.Designer.cs">
+      <DependentUpon>DbTablesView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ExportDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ExportDialog.Designer.cs">
+      <DependentUpon>ExportDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HeuristicLabDataImporterDataProcessorApplication.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="IExporter.cs" />
+    <Compile Include="DataProcessorView.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DataProcessorView.Designer.cs">
+      <DependentUpon>DataProcessorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="ToolStripCheckBox.cs">
+      <SubType>Component</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.Data\HeuristicLab.DataImporter.Data.csproj">
+      <Project>{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}</Project>
+      <Name>HeuristicLab.DataImporter.Data</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.DbExplorer.Interfaces\HeuristicLab.DataImporter.DbExplorer.Interfaces.csproj">
+      <Project>{815384EE-2B32-4C25-AE06-4FC7F417FE28}</Project>
+      <Name>HeuristicLab.DataImporter.DbExplorer.Interfaces</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\DataSources\HeuristicLab.DataImporter.DbExplorer.Interfaces.DbColumn.datasource" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SaveDialog.resx">
+      <DependentUpon>SaveDialog.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\Edit_UndoHS.bmp" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\Edit_RedoHS.bmp" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\Edit_redoHL.bmp" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <None Include="Resources\Edit_UndoHL.bmp" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\SaveAllHS.bmp" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\OpenSelectedItemHS.BMP" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\RecordHS.bmp" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\StopHS.bmp" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary_Actions_Warning.png" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/HeuristicLabDataImporterDataProcessorApplication.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/HeuristicLabDataImporterDataProcessorApplication.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/HeuristicLabDataImporterDataProcessorApplication.cs	(revision 15690)
@@ -0,0 +1,39 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  [Application("DataImporter", "Generic data import, export and manipulation toolkit.")]
+  public class HeuristicLabDataImporterDataProcessorApplication : ApplicationBase {
+    public override void Run(ICommandLineArgument[] args) {
+      DataProcessor processor = new DataProcessor();
+      Form mainForm = new DataProcessorView(processor);
+      Application.EnableVisualStyles();
+      Application.Run(mainForm);
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/IExporter.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/IExporter.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/IExporter.cs	(revision 15690)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.Model;
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  public interface IExporter {
+    string Description { get; }
+    UserControl SettingsControl { get; }
+    void Export(DataSet dataSet);    
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/IImporter.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/IImporter.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/IImporter.cs	(revision 15690)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data.Model;
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  public interface IImporter {
+    string Description { get; }
+    UserControl SettingsControl { get; }
+    ICommand CreateImportCommand(DataSet dataSet);    
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ImportDialog.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ImportDialog.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ImportDialog.Designer.cs	(revision 15690)
@@ -0,0 +1,137 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  partial class ImportDialog {
+    /// <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.btnOK = new System.Windows.Forms.Button();
+      this.btnCancel = new System.Windows.Forms.Button();
+      this.importerListBox = new System.Windows.Forms.ListBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.settingsPanel = new System.Windows.Forms.Panel();
+      this.SuspendLayout();
+      // 
+      // btnOK
+      // 
+      this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.btnOK.Location = new System.Drawing.Point(259, 203);
+      this.btnOK.Name = "btnOK";
+      this.btnOK.Size = new System.Drawing.Size(75, 23);
+      this.btnOK.TabIndex = 0;
+      this.btnOK.Text = "Ok";
+      this.btnOK.UseVisualStyleBackColor = true;
+      this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+      // 
+      // btnCancel
+      // 
+      this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.btnCancel.Location = new System.Drawing.Point(340, 203);
+      this.btnCancel.Name = "btnCancel";
+      this.btnCancel.Size = new System.Drawing.Size(75, 23);
+      this.btnCancel.TabIndex = 1;
+      this.btnCancel.Text = "Cancel";
+      this.btnCancel.UseVisualStyleBackColor = true;
+      // 
+      // importerListBox
+      // 
+      this.importerListBox.DisplayMember = "Description";
+      this.importerListBox.FormattingEnabled = true;
+      this.importerListBox.Location = new System.Drawing.Point(15, 28);
+      this.importerListBox.Name = "importerListBox";
+      this.importerListBox.Size = new System.Drawing.Size(400, 82);
+      this.importerListBox.TabIndex = 2;
+      this.importerListBox.SelectedIndexChanged += new System.EventHandler(this.importerListBox_SelectedIndexChanged);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(12, 12);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(102, 13);
+      this.label1.TabIndex = 3;
+      this.label1.Text = "Choose Import-Task";
+      // 
+      // settingsPanel
+      // 
+      this.settingsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)));
+      this.settingsPanel.Location = new System.Drawing.Point(15, 116);
+      this.settingsPanel.Name = "settingsPanel";
+      this.settingsPanel.Size = new System.Drawing.Size(400, 80);
+      this.settingsPanel.TabIndex = 4;
+      // 
+      // ImportDialog
+      // 
+      this.AcceptButton = this.btnOK;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.btnCancel;
+      this.ClientSize = new System.Drawing.Size(427, 233);
+      this.ControlBox = false;
+      this.Controls.Add(this.settingsPanel);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.importerListBox);
+      this.Controls.Add(this.btnCancel);
+      this.Controls.Add(this.btnOK);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ImportDialog";
+      this.ShowInTaskbar = false;
+      this.Text = "Import Dialog";
+      this.TopMost = true;
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button btnOK;
+    private System.Windows.Forms.Button btnCancel;
+    private System.Windows.Forms.ListBox importerListBox;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Panel settingsPanel;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ImportDialog.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ImportDialog.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ImportDialog.cs	(revision 15690)
@@ -0,0 +1,69 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.CommandBase;
+using HeuristicLab.DataImporter.Data;
+using HeuristicLab.DataImporter.DataProcessor;
+using HeuristicLab.PluginInfrastructure;
+
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  public partial class ImportDialog : Form {
+    private CommandChain commandChain;
+    private Data.Model.DataSet dataSet;
+    public ImportDialog(Data.Model.DataSet dataSet, CommandChain commandChain) {
+      InitializeComponent();
+      this.dataSet = dataSet;
+      this.commandChain = commandChain;
+      IImporter[] importers = ApplicationManager.Manager.GetInstances<IImporter>().ToArray();
+      this.importerListBox.DataSource = importers;
+    }
+
+    private void btnOK_Click(object sender, EventArgs e) {
+      this.Cursor = Cursors.WaitCursor;
+      try {
+        ICommand cmd = ((IImporter)importerListBox.SelectedItem).CreateImportCommand(this.dataSet);
+        this.commandChain.Add(cmd);
+      }
+      catch (CommandExecutionException cee) {
+        MessageBox.Show(cee.Message, cee.Command.Description);
+      }
+      finally {
+        this.Cursor = Cursors.Default;
+      }
+    }
+
+    private void importerListBox_SelectedIndexChanged(object sender, EventArgs e) {
+      this.settingsPanel.Controls.Clear();
+      UserControl ctrl = ((IImporter)importerListBox.SelectedItem).SettingsControl;
+      this.Height = 180 + ctrl.Height;
+      this.settingsPanel.Controls.Add(ctrl);
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Plugin.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Plugin.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Plugin.cs.frame	(revision 15690)
@@ -0,0 +1,39 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  [Plugin("HeuristicLab.DataImporter.DataProcessor","1.0.0.$WCREV$")]
+  [PluginFile("HeuristicLab.DataImporter.Command-1.0.dll", PluginFileType.Assembly)]
+  [PluginFile("HeuristicLab.DataImporter.Data-1.0.dll", PluginFileType.Assembly)]
+  [PluginFile("HeuristicLab.DataImporter.DataProcessor-1.0.dll", PluginFileType.Assembly)]
+  [PluginFile("HeuristicLab.DataImporter.DbExplorer.Interfaces-1.0.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.7")]
+  [PluginDependency("HeuristicLab.Common.Resources","3.3")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis","3.4")]
+  [PluginDependency("HeuristicLab.Persistence","3.3")]
+  public class HeuristicLabDataImporterDataProcessorPlugin : PluginBase {
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ProgressDialog.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ProgressDialog.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ProgressDialog.Designer.cs	(revision 15690)
@@ -0,0 +1,105 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  partial class ProgressDialog {
+    /// <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.progressBar = new System.Windows.Forms.ProgressBar();
+      this.label = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // progressBar
+      // 
+      this.ProgressBar.ForeColor = System.Drawing.Color.LightGreen;
+      this.ProgressBar.Location = new System.Drawing.Point(12, 25);
+      this.ProgressBar.Name = "progressBar";
+      this.ProgressBar.Size = new System.Drawing.Size(281, 23);
+      this.ProgressBar.Step = 1;
+      this.ProgressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+      this.ProgressBar.TabIndex = 0;
+      // 
+      // Label
+      // 
+      this.Label.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.Label.AutoSize = true;
+      this.Label.Location = new System.Drawing.Point(12, 7);
+      this.Label.Name = "Label";
+      this.Label.Size = new System.Drawing.Size(83, 13);
+      this.Label.TabIndex = 1;
+      this.Label.Text = "Command Label";
+      // 
+      // OpenCommandChainProgressDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(305, 59);
+      this.ControlBox = false;
+      this.Controls.Add(this.Label);
+      this.Controls.Add(this.ProgressBar);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "OpenCommandChainProgressDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Loading";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ProgressBar progressBar;
+    public System.Windows.Forms.ProgressBar ProgressBar {
+      get { return this.progressBar; }
+    }
+
+    private System.Windows.Forms.Label label;
+    public System.Windows.Forms.Label Label {
+      get { return this.label; }
+    }
+
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ProgressDialog.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ProgressDialog.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ProgressDialog.cs	(revision 15690)
@@ -0,0 +1,37 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  public partial class ProgressDialog : Form {
+    public ProgressDialog() {
+      InitializeComponent();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Properties/AssemblyInfo.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Properties/AssemblyInfo.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Properties/AssemblyInfo.cs.frame	(revision 15690)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.DataImporter.DataProcessor")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(C) 2008-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7d0840b8-3382-4b99-ab4e-5d1eb91fbec1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.$WCREV$")]
+[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Properties/DataSources/HeuristicLab.DataImporter.DbExplorer.Interfaces.DbColumn.datasource
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Properties/DataSources/HeuristicLab.DataImporter.DbExplorer.Interfaces.DbColumn.datasource	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Properties/DataSources/HeuristicLab.DataImporter.DbExplorer.Interfaces.DbColumn.datasource	(revision 15690)
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="DbColumn" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>HeuristicLab.DataImporter.DbExplorer.Interfaces.DbColumn, HeuristicLab.DataImporter.DbExplorer.Interfaces-1.0, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec</TypeInfo>
+</GenericObjectDataSource>
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Properties/Resources.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Properties/Resources.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Properties/Resources.Designer.cs	(revision 15690)
@@ -0,0 +1,153 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.34014
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.DataImporter.DataProcessor.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.DataImporter.DataProcessor.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Edit_redoHL {
+            get {
+                object obj = ResourceManager.GetObject("Edit_redoHL", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Edit_RedoHS {
+            get {
+                object obj = ResourceManager.GetObject("Edit_RedoHS", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Edit_UndoHL {
+            get {
+                object obj = ResourceManager.GetObject("Edit_UndoHL", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Edit_UndoHS {
+            get {
+                object obj = ResourceManager.GetObject("Edit_UndoHS", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap OpenSelectedItemHS {
+            get {
+                object obj = ResourceManager.GetObject("OpenSelectedItemHS", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap RecordHS {
+            get {
+                object obj = ResourceManager.GetObject("RecordHS", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap SaveAllHS {
+            get {
+                object obj = ResourceManager.GetObject("SaveAllHS", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap StopHS {
+            get {
+                object obj = ResourceManager.GetObject("StopHS", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap VS2008ImageLibrary_Actions_Warning {
+            get {
+                object obj = ResourceManager.GetObject("VS2008ImageLibrary_Actions_Warning", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Properties/Resources.resx
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Properties/Resources.resx	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/Properties/Resources.resx	(revision 15690)
@@ -0,0 +1,148 @@
+﻿<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="Edit_redoHL" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Edit_redoHL.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="OpenSelectedItemHS" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\OpenSelectedItemHS.BMP;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Edit_UndoHS" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Edit_UndoHS.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="StopHS" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\StopHS.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Edit_UndoHL" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Edit_UndoHL.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Edit_RedoHS" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Edit_RedoHS.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="SaveAllHS" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\SaveAllHS.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="RecordHS" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\RecordHS.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="VS2008ImageLibrary_Actions_Warning" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\VS2008ImageLibrary_Actions_Warning.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/SaveDialog.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/SaveDialog.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/SaveDialog.Designer.cs	(revision 15690)
@@ -0,0 +1,104 @@
+﻿namespace HeuristicLab.DataImporter.DataProcessor {
+  partial class SaveDialog {
+    /// <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.label1 = new System.Windows.Forms.Label();
+      this.btnSave = new System.Windows.Forms.Button();
+      this.btnCancel = new System.Windows.Forms.Button();
+      this.btnNoSave = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.Image = global::HeuristicLab.DataImporter.DataProcessor.Properties.Resources.VS2008ImageLibrary_Actions_Warning;
+      this.label1.ImageAlign = System.Drawing.ContentAlignment.TopLeft;
+      this.label1.Location = new System.Drawing.Point(6, 11);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(237, 19);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "         Do you want to save the made changes?";
+      // 
+      // btnSave
+      // 
+      this.btnSave.DialogResult = System.Windows.Forms.DialogResult.Yes;
+      this.btnSave.Location = new System.Drawing.Point(6, 39);
+      this.btnSave.Name = "btnSave";
+      this.btnSave.Size = new System.Drawing.Size(75, 23);
+      this.btnSave.TabIndex = 1;
+      this.btnSave.Text = "&Save";
+      this.btnSave.UseVisualStyleBackColor = true;
+      this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
+      // 
+      // btnCancel
+      // 
+      this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.btnCancel.Location = new System.Drawing.Point(168, 39);
+      this.btnCancel.Name = "btnCancel";
+      this.btnCancel.Size = new System.Drawing.Size(75, 23);
+      this.btnCancel.TabIndex = 3;
+      this.btnCancel.Text = "Cancel";
+      this.btnCancel.UseVisualStyleBackColor = true;
+      this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+      // 
+      // btnNoSave
+      // 
+      this.btnNoSave.DialogResult = System.Windows.Forms.DialogResult.No;
+      this.btnNoSave.Location = new System.Drawing.Point(87, 39);
+      this.btnNoSave.Name = "btnNoSave";
+      this.btnNoSave.Size = new System.Drawing.Size(75, 23);
+      this.btnNoSave.TabIndex = 2;
+      this.btnNoSave.Text = "&Don\'t Save";
+      this.btnNoSave.UseVisualStyleBackColor = true;
+      this.btnNoSave.Click += new System.EventHandler(this.btnNoSave_Click);
+      // 
+      // SaveDialog
+      // 
+      this.AcceptButton = this.btnSave;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.btnCancel;
+      this.ClientSize = new System.Drawing.Size(250, 69);
+      this.Controls.Add(this.btnNoSave);
+      this.Controls.Add(this.btnCancel);
+      this.Controls.Add(this.btnSave);
+      this.Controls.Add(this.label1);
+      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "SaveDialog";
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "DataImporter";
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Button btnSave;
+    private System.Windows.Forms.Button btnCancel;
+    private System.Windows.Forms.Button btnNoSave;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/SaveDialog.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/SaveDialog.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/SaveDialog.cs	(revision 15690)
@@ -0,0 +1,22 @@
+﻿using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  public partial class SaveDialog : Form {
+    public SaveDialog() {
+      InitializeComponent();
+    }
+
+    private void btnSave_Click(object sender, EventArgs e) {
+      this.Close();
+    }
+
+    private void btnNoSave_Click(object sender, EventArgs e) {
+      this.Close();
+    }
+
+    private void btnCancel_Click(object sender, EventArgs e) {
+      this.Close();
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/SaveDialog.resx
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/SaveDialog.resx	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/SaveDialog.resx	(revision 15690)
@@ -0,0 +1,120 @@
+﻿<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ToolStripCheckBox.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ToolStripCheckBox.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DataProcessor/ToolStripCheckBox.cs	(revision 15690)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using System.Windows.Forms;
+using System.Windows.Forms.Design;
+using System.ComponentModel;
+
+namespace HeuristicLab.DataImporter.DataProcessor {
+  [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip)]
+  public class ToolStripCheckBox : ToolStripControlHost {
+    public ToolStripCheckBox() : base(new CheckBox()) { }
+
+    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
+    public CheckBox CheckBoxControl {
+      get {
+        return Control as CheckBox;
+      }
+    }
+  }
+
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbColumn.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbColumn.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbColumn.cs	(revision 15690)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.DbExplorer.Interfaces {
+  [StorableClass]
+  public class DbColumn {
+    [StorableConstructor]
+    protected DbColumn(bool deserializing) : base() { }
+
+    public DbColumn(string columnName, string sqlDataType) {
+      this.columnName = columnName;
+      this.sqlDataType = sqlDataType;
+    }
+
+    [Storable]
+    private string columnName;
+    public string ColumnName {
+      get { return this.columnName; }
+      set { this.columnName = value; }
+    }
+
+    [Storable]
+    private string sqlDataType;
+    public string SqlDataType {
+      get { return this.sqlDataType; }
+      set { this.sqlDataType = value; }
+    }
+
+    [Storable]
+    private string minValue;
+    public string MinValue {
+      get { return this.minValue; }
+      set { this.minValue = value; }
+    }
+
+    [Storable]
+    private string maxValue;
+    public string MaxValue {
+      get { return this.maxValue; }
+      set { this.maxValue = value; }
+    }
+
+    [Storable]
+    private string likeValue;
+    public string LikeValue {
+      get { return this.likeValue; }
+      set { this.likeValue = value; }
+    }
+
+    [Storable]
+    private bool filter;
+    public bool FilterColumn {
+      get { return this.filter; }
+      set { this.filter = value; }
+    }
+
+    [Storable]
+    private bool selected;
+    public bool Selected {
+      get { return selected; }
+      set { selected = value; }
+    }
+
+    public override string ToString() {
+      return this.columnName + "<" + this.sqlDataType + ">";
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbConnectionBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbConnectionBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbConnectionBase.cs	(revision 15690)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using System.Data.Common;
+
+namespace HeuristicLab.DataImporter.DbExplorer.Interfaces {
+  public abstract class DbConnectionBase {
+    private string databaseName;
+    public string DatabaseName {
+      get { return this.databaseName; }
+      set { this.databaseName = value; }
+    }
+
+    private string userName;
+    public string UserName {
+      get { return this.userName; }
+      set { this.userName = value; }
+    }
+
+    private string password;
+    public string Password {
+      get { return this.password; }
+      set { this.password = value; }
+    }
+    
+    protected DbConnectionBase(string databaseName, string userName, string password) {
+      this.databaseName = databaseName;
+      this.userName = userName;
+      this.password = password;
+    }
+
+    public abstract DbConnection CreateConnection();
+    public abstract bool TestConnection();
+
+    private string errorMessage;
+    public string ErrorMessage {
+      get { return this.errorMessage; }
+      protected set { this.errorMessage = value; }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbExplorerBase.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbExplorerBase.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbExplorerBase.cs	(revision 15690)
@@ -0,0 +1,257 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using System.Data.Common;
+using System.Globalization;
+using System.Windows.Forms;
+using System.ComponentModel;
+using HeuristicLab.DataImporter.Data.Model;
+
+namespace HeuristicLab.DataImporter.DbExplorer.Interfaces {
+  public abstract class DbExplorerBase : IDbExplorer {
+
+    private DbConnectionBase connection;
+    protected DbConnectionBase Connection {
+      get { return this.connection; }
+      set { this.connection = value; }
+    }
+    public bool IsConnected {
+      get {
+        if (connection != null)
+          return connection.TestConnection();
+        return false;
+      }
+    }
+
+    protected virtual string EscapeSqlString(string s) {
+      return s;
+    }
+
+    public abstract string MenuItemDescription { get; }
+    public abstract bool IsDateDataType(string type);
+    public abstract bool IsNumericDataType(string type);
+    public abstract bool IsStringDataType(string type);
+    public abstract bool IsFilterableDataType(string type);
+    protected abstract string ConvertDate(DateTime date);
+    protected abstract string ConvertDouble(double value);
+    protected abstract IDbConnectionWizard DbConnectionWizard { get; }
+
+    private ProgressChangedEventHandler newRowLoaded;
+    public ProgressChangedEventHandler NewRowLoaded {
+      get { return newRowLoaded; }
+      set { newRowLoaded = value; }
+    }
+
+    private DbTable actTable;
+    private void FireNewRowLoaded(int actRow) {
+      if (newRowLoaded != null && actTable != null && actTable.AffectedRows != 0)
+        newRowLoaded(this, new ProgressChangedEventArgs(actRow * 100 / actTable.AffectedRows
+          , "Loading " + actRow + " / " + actTable.AffectedRows + " rows of table " + actTable.TableName));
+    }
+
+    public void ShowDbConnectionWizard() {
+      if (DbConnectionWizard.ShowDialog() == DialogResult.OK) {
+        if (!DbConnectionWizard.Connection.TestConnection()) {
+          this.connection = null;
+          HandleConnectionError();
+        } else
+          connection = DbConnectionWizard.Connection;
+      }
+    }
+
+    private void HandleConnectionError() {
+      DialogResult result = MessageBox.Show(DbConnectionWizard.Connection.ErrorMessage,
+        "Connect to database failed", MessageBoxButtons.RetryCancel);
+      if (result == DialogResult.Retry)
+        ShowDbConnectionWizard();
+    }
+    public abstract IEnumerable<DbTable> AllTables { get; }
+
+    public virtual void FillMinMaxValuesForTable(DbTable table) {
+      using (DbConnection conn = connection.CreateConnection()) {
+        conn.Open();
+        List<DbColumn> filterColumns = new List<DbColumn>();
+        using (DbCommand cmd = conn.CreateCommand()) {
+          string cmdText = @"select ";
+          foreach (DbColumn col in table.Columns)
+            if (this.IsFilterableDataType(col.SqlDataType) && !this.IsStringDataType(col.SqlDataType)) {
+              cmdText += @"min(" + EscapeSqlString(col.ColumnName) + "), max(" + EscapeSqlString(col.ColumnName) + "), ";
+              filterColumns.Add(col);
+            }
+          cmdText += "count(*) from " + EscapeSqlString(table.OwnerName) + "." + EscapeSqlString(table.TableName);
+          cmd.CommandText = cmdText;
+
+          using (DbDataReader reader = cmd.ExecuteReader()) {
+            reader.Read();
+            for (int i = 0; i < reader.FieldCount - 1; i++) {
+              if (i % 2 == 0)
+                filterColumns[i / 2].MinValue = reader.GetValue(i).ToString();
+              else
+                filterColumns[i / 2].MaxValue = reader.GetValue(i).ToString();
+            }
+            table.TotalRows = reader.GetInt32(reader.FieldCount - 1);
+            reader.Close();
+          }//end using reader
+          // cmd.Dispose();
+        }//end using command
+        conn.Close();
+      }//end using connection
+      table.UpdateInformationLoaded();
+    }
+
+    public void FillAffectedRowsForTable(DbTable table) {
+      string cmdText = @"select count(*) from " + EscapeSqlString(table.OwnerName) + "." + EscapeSqlString(table.TableName) + " where ";
+      bool executeSql = false;
+      foreach (DbColumn col in table.SelectedColumns) {
+        if (col.FilterColumn) {
+          executeSql = true;
+          if (IsNumericDataType(col.SqlDataType)) {
+            string min = this.ConvertDouble(double.Parse(col.MinValue));
+            string max = this.ConvertDouble(double.Parse(col.MaxValue));
+            cmdText += EscapeSqlString(col.ColumnName) + ">=" + min + " and " + EscapeSqlString(col.ColumnName) + "<=" + max + " and ";
+          } else if (IsDateDataType(col.SqlDataType)) {
+            string x = this.ConvertDate(DateTime.Parse(col.MinValue));
+            string y = this.ConvertDate(DateTime.Parse(col.MaxValue));
+            cmdText += EscapeSqlString(col.ColumnName) + ">=" + x + " and " + EscapeSqlString(col.ColumnName) + "<=" + y + " and ";
+          } else if (IsStringDataType(col.SqlDataType))
+            cmdText += EscapeSqlString(col.ColumnName) + " like '%" + EscapeSqlString(col.LikeValue) + "%' and ";
+        }
+      }
+      if (!executeSql) {
+        if (table.IsSelected)
+          table.AffectedRows = table.TotalRows;
+        else
+          table.AffectedRows = 0;
+      } else {
+        cmdText = cmdText.Remove(cmdText.Length - 5);
+        using (DbConnection conn = Connection.CreateConnection()) {
+          conn.Open();
+          using (DbCommand cmd = conn.CreateCommand()) {
+            cmd.CommandText = cmdText;
+            table.AffectedRows = Convert.ToInt32(cmd.ExecuteScalar());
+          }//end using cmd
+          conn.Close();
+        }//end using connection
+      }
+    }
+
+    public ColumnGroup CreateColumnGroup(DbTable table) {
+      //select clause
+      string sqlString = "select ";
+      foreach (DbColumn col in table.SelectedColumns) {
+        sqlString += EscapeSqlString(table.TableName) + "." + EscapeSqlString(col.ColumnName) + ", ";
+      }
+      sqlString = sqlString.Remove(sqlString.Length - 2);
+      sqlString += " from " + EscapeSqlString(table.OwnerName) + "." + EscapeSqlString(table.TableName);
+
+      //where clause
+      bool addedWhereclause = false;
+      foreach (DbColumn col in table.SelectedColumns) {
+        if (col.FilterColumn) {
+          if (!addedWhereclause) {
+            sqlString += " where ";
+            addedWhereclause = true;
+          }
+          if (IsNumericDataType(col.SqlDataType))
+            sqlString += EscapeSqlString(col.ColumnName) + ">=" + col.MinValue + " and " + EscapeSqlString(col.ColumnName) + "<=" + col.MaxValue + " and ";
+          else if (IsDateDataType(col.SqlDataType)) {
+            string x = this.ConvertDate(DateTime.Parse(col.MinValue));
+            string y = this.ConvertDate(DateTime.Parse(col.MaxValue));
+            sqlString += EscapeSqlString(col.ColumnName) + ">=" + x + " and " + EscapeSqlString(col.ColumnName) + "<=" + y + " and ";
+          } else if (IsStringDataType(col.SqlDataType))
+            sqlString += EscapeSqlString(col.ColumnName) + " like '%" + EscapeSqlString(col.LikeValue) + "%' and ";
+        }
+      }
+      if (addedWhereclause)
+        sqlString = sqlString.Remove(sqlString.Length - 5);
+
+      this.actTable = table;
+      ColumnGroup columnGroup = CreateColumnGroup(sqlString);
+      columnGroup.Name = table.TableName;
+      this.actTable = null;
+      return columnGroup;
+    }
+
+    public ColumnGroup CreateColumnGroup(string sqlString) {
+      ColumnGroup columnGroup = new ColumnGroup();
+      bool initColumns = true;
+      string dbDataType;
+      int actRow = 0;
+
+      using (DbConnection conn = connection.CreateConnection()) {
+        conn.Open();
+        using (DbCommand cmd = conn.CreateCommand()) {
+          cmd.CommandText = sqlString;
+          using (DbDataReader reader = cmd.ExecuteReader()) {
+            while (reader.Read()) {
+              //create & initialize columns
+              if (initColumns) {
+                for (int i = 0; i < reader.FieldCount; i++) {
+                  dbDataType = reader.GetDataTypeName(i);
+                  if (IsDateDataType(dbDataType))
+                    columnGroup.AddColumn(new DateTimeColumn(reader.GetName(i)));
+                  else if (IsNumericDataType(dbDataType))
+                    columnGroup.AddColumn(new DoubleColumn(reader.GetName(i)));
+                  else
+                    columnGroup.AddColumn(new StringColumn(reader.GetName(i)));
+                }
+                initColumns = false;
+              }
+              //fill columns with values
+              for (int i = 0; i < reader.FieldCount; i++) {
+                if (reader.IsDBNull(i)) {
+                  columnGroup.Columns.ElementAt(i).AddValue(null);
+                } else if (columnGroup.Columns.ElementAt(i).DataType == typeof(double?)) {
+                  try { columnGroup.Columns.ElementAt(i).AddValue(Convert.ToDouble(reader.GetValue(i))); }
+                  catch (DbException) { columnGroup.Columns.ElementAt(i).AddValue(null); }
+                } else if (columnGroup.Columns.ElementAt(i).DataType == typeof(DateTime?)) {
+                  try { columnGroup.Columns.ElementAt(i).AddValue(reader.GetDateTime(i)); }
+                  catch (DbException) { columnGroup.Columns.ElementAt(i).AddValue(null); }
+                } else {
+                  try { columnGroup.Columns.ElementAt(i).AddValue(reader.GetValue(i).ToString()); }
+                  catch (DbException) { columnGroup.Columns.ElementAt(i).AddValue(null); }
+                }
+              }
+              actRow++;
+              if (actRow % 1000 == 0)
+                FireNewRowLoaded(actRow);
+            }
+            if (initColumns) {
+              for (int i = 0; i < reader.FieldCount; i++) {
+                if (reader.GetName(i).ToUpper().Contains("ZEIT"))
+                  columnGroup.AddColumn(new DateTimeColumn(reader.GetName(i)));
+                else
+                  columnGroup.AddColumn(new DoubleColumn(reader.GetName(i)));
+              }
+            }
+            reader.Close();
+          }  //end using reader
+        } //end using command
+      } // using connection
+
+      return columnGroup;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbTable.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbTable.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbTable.cs	(revision 15690)
@@ -0,0 +1,127 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataImporter.DbExplorer.Interfaces {
+  [StorableClass]
+  public class DbTable {
+    [StorableConstructor]
+    protected DbTable(bool deserializing)
+      : base() {
+      this.informationLoaded = new DateTime(1990, 1, 1);
+    }
+
+    public DbTable(string ownerName, string tableName)
+      : base() {
+      this.informationLoaded = new DateTime(1990, 1, 1);
+      this.columns = new List<DbColumn>();
+      this.ownerName = ownerName;
+      this.tableName = tableName;
+    }
+
+    [Storable]
+    private string ownerName;
+    public string OwnerName {
+      get { return this.ownerName; }
+      set { this.ownerName = value; }
+    }
+
+    [Storable]
+    private string tableName;
+    public string TableName {
+      get { return this.tableName; }
+      set { this.tableName = value; }
+    }
+
+    [Storable]
+    private List<DbColumn> columns;
+    public IEnumerable<DbColumn> Columns {
+      get { return this.columns; }
+    }
+
+    public bool IsSelected {
+      get { return columns.Any(col => col.Selected); }
+    }
+
+    private int affectedRows;
+    public int AffectedRows {
+      get { return this.affectedRows; }
+      set { this.affectedRows = value; }
+    }
+
+    private int totalRows;
+    public int TotalRows {
+      get { return this.totalRows; }
+      set { this.totalRows = value; }
+    }
+
+    private DateTime informationLoaded;
+    public DateTime InformationLoaded {
+      get { return this.informationLoaded; }
+    }
+
+    public void AddColumn(DbColumn column) {
+      this.columns.Add(column);
+    }
+
+    public void ClearSelection() {
+      foreach (DbColumn col in columns) {
+        col.Selected = false;
+        col.FilterColumn = false;
+        col.LikeValue = "";
+      }
+    }
+
+    public void SelectAllColumns() {
+      foreach (DbColumn col in this.columns)
+        col.Selected = true;
+    }
+
+    public int SelectedColumnsCount {
+      get { return this.columns.Count(col => col.Selected); }
+    }
+
+    public IEnumerable<DbColumn> SelectedColumns {
+      get { return this.columns.Where(col => col.Selected); }
+    }
+
+    public IEnumerable<DbColumn> FilterColumns {
+      get { return this.columns.Where(col => col.FilterColumn); }
+    }
+
+    public void UpdateInformationLoaded() {
+      this.informationLoaded = DateTime.Now;
+    }
+
+    public bool ReloadOfInformationNeeded {
+      get { return DateTime.Now.Subtract(this.InformationLoaded).Minutes > 5; }
+    }
+
+    public override string ToString() {
+      string s = this.tableName + "   " + SelectedColumnsCount + "/" + this.columns.Count;
+      return s;
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbTableComparer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbTableComparer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/DbTableComparer.cs	(revision 15690)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+
+namespace HeuristicLab.DataImporter.DbExplorer.Interfaces {
+  public class DbTableComparator : IComparer<DbTable> {
+
+    #region IComparer<DbTable> Members
+
+    public int Compare(DbTable x, DbTable y) {
+      return x.TableName.CompareTo(y.TableName);
+    }
+
+    #endregion
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/HeuristicLab.DataImporter.DbExplorer.Interfaces.csproj
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/HeuristicLab.DataImporter.DbExplorer.Interfaces.csproj	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/HeuristicLab.DataImporter.DbExplorer.Interfaces.csproj	(revision 15690)
@@ -0,0 +1,176 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{815384EE-2B32-4C25-AE06-4FC7F417FE28}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.DataImporter.DbExplorer.Interfaces</RootNamespace>
+    <AssemblyName>HeuristicLab.DataImporter.DbExplorer.Interfaces-1.0</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DbColumn.cs" />
+    <Compile Include="DbConnectionBase.cs" />
+    <Compile Include="DbExplorerBase.cs" />
+    <Compile Include="DbTable.cs" />
+    <Compile Include="DbTableComparer.cs" />
+    <Compile Include="IDbConnectionWizard.cs" />
+    <Compile Include="IDbExplorer.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.Data\HeuristicLab.DataImporter.Data.csproj">
+      <Project>{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}</Project>
+      <Name>HeuristicLab.DataImporter.Data</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/IDbConnectionWizard.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/IDbConnectionWizard.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/IDbConnectionWizard.cs	(revision 15690)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataImporter.DbExplorer.Interfaces {
+  public interface IDbConnectionWizard {
+    DialogResult ShowDialog();
+    DbConnectionBase Connection { get; }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/IDbExplorer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/IDbExplorer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/IDbExplorer.cs	(revision 15690)
@@ -0,0 +1,51 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using System.ComponentModel;
+using System.Windows.Forms;
+using HeuristicLab.DataImporter.Data.Model;
+
+
+namespace HeuristicLab.DataImporter.DbExplorer.Interfaces {
+  public interface IDbExplorer {
+    bool IsConnected { get; }
+    bool IsDateDataType(string type);
+    bool IsNumericDataType(string type);
+    bool IsStringDataType(string type);
+    bool IsFilterableDataType(string type);
+
+    string MenuItemDescription { get; }
+    void ShowDbConnectionWizard();
+
+    ProgressChangedEventHandler NewRowLoaded { get; set; }
+
+    IEnumerable<DbTable> AllTables { get; } 
+    ColumnGroup CreateColumnGroup(DbTable table);
+    ColumnGroup CreateColumnGroup(string sqlString);
+    void FillMinMaxValuesForTable(DbTable table);
+    void FillAffectedRowsForTable(DbTable table);
+    
+  } 
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/Properties/AssemblyInfo.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/Properties/AssemblyInfo.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Interfaces/Properties/AssemblyInfo.cs.frame	(revision 15690)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.DataImporter.DbExplorer.Interfaces")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(C) 2008-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7d0840b8-3382-4b99-ab4e-5d1eb91fbec1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.$WCREV$")]
+[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/HeuristicLab.DataImporter.DbExplorer.MsSqlServer.csproj
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/HeuristicLab.DataImporter.DbExplorer.MsSqlServer.csproj	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/HeuristicLab.DataImporter.DbExplorer.MsSqlServer.csproj	(revision 15690)
@@ -0,0 +1,179 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B6D02DED-277B-4091-9C06-F092D2F8116F}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.DataImporter.DbExplorer.MsSqlServer</RootNamespace>
+    <AssemblyName>HeuristicLab.DataImporter.DbExplorer.MsSqlServer-1.0</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="SqlServerConnectionWizard.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="SqlServerConnectionWizard.Designer.cs">
+      <DependentUpon>SqlServerConnectionWizard.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SqlServerConnection.cs" />
+    <Compile Include="SqlServerExplorer.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.Data\HeuristicLab.DataImporter.Data.csproj">
+      <Project>{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}</Project>
+      <Name>HeuristicLab.DataImporter.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.DbExplorer.Interfaces\HeuristicLab.DataImporter.DbExplorer.Interfaces.csproj">
+      <Project>{815384EE-2B32-4C25-AE06-4FC7F417FE28}</Project>
+      <Name>HeuristicLab.DataImporter.DbExplorer.Interfaces</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/Plugin.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/Plugin.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/Plugin.cs.frame	(revision 15690)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.DataImporter.DbExplorer.MsSqlServer {
+  [Plugin("HeuristicLab.DataImporter.DbExplorer.MsSqlServer","1.0.0.$WCREV$")]
+  [PluginFile("HeuristicLab.DataImporter.DbExplorer.MsSqlServer-1.0.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.DataImporter.DataProcessor","1.0")]
+  public class HeuristicLabDataImporterDbExplorerMsSqlServerPlugin : PluginBase {
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/Properties/AssemblyInfo.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/Properties/AssemblyInfo.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/Properties/AssemblyInfo.cs.frame	(revision 15690)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.DataImporter.DbExplorer.MsSqlServer")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7d0840b8-3382-4b99-ab4e-5d1eb91fbec1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.$WCREV$")]
+[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/SqlServerConnection.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/SqlServerConnection.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/SqlServerConnection.cs	(revision 15690)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Data.Common;
+using System.Data.SqlClient;
+using HeuristicLab.DataImporter.DbExplorer.Interfaces;
+
+namespace HeuristicLab.DataImporter.DbExplorer.MsSqlServer {
+  public class SqlServerConnection : DbConnectionBase {
+    private string constring;
+
+    public SqlServerConnection(string serverName, string databaseName, string userName, string password, bool useWindowsAuthentication)
+      : base(databaseName, userName, password) {
+      this.serverName = serverName;
+      this.useWindowsAuthentication = useWindowsAuthentication;
+
+      this.constring = "Server=" + serverName + "; Initial Catalog=" + databaseName;
+      if (useWindowsAuthentication)
+        this.constring += @"; Integrated Security=true";
+      else
+        this.constring += "; User ID=" + userName + "; Password=" + password;
+    }
+
+    private string serverName;
+    public string ServerName {
+      get { return this.serverName; }
+      set { this.serverName = value; }
+    }
+
+    private bool useWindowsAuthentication;
+    public bool UseWindowsAuthentication {
+      get { return this.useWindowsAuthentication; }
+      set { this.useWindowsAuthentication = value; }
+    }
+
+    public override DbConnection CreateConnection() {
+      return new SqlConnection(constring);
+    }
+
+    public override bool TestConnection() {
+      System.Data.Common.DbConnection con = null;
+      try {
+        con = this.CreateConnection();
+        con.Open();
+        this.ErrorMessage = "";
+        return true;
+      }
+      catch (SqlException e) {
+        this.ErrorMessage = e.Message;
+        this.CreateConnection().Close();
+        return false;
+      }
+      finally {
+        if (con != null)
+          con.Close();
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/SqlServerConnectionWizard.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/SqlServerConnectionWizard.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/SqlServerConnectionWizard.Designer.cs	(revision 15690)
@@ -0,0 +1,202 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.DbExplorer.MsSqlServer {
+  partial class SqlServerConnectionWizard {
+    /// <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.label2 = new System.Windows.Forms.Label();
+      this.label3 = new System.Windows.Forms.Label();
+      this.txtUsername = new System.Windows.Forms.TextBox();
+      this.txtPassword = new System.Windows.Forms.TextBox();
+      this.btnOk = new System.Windows.Forms.Button();
+      this.btnCancel = new System.Windows.Forms.Button();
+      this.txtDatabaseName = new System.Windows.Forms.TextBox();
+      this.label4 = new System.Windows.Forms.Label();
+      this.label1 = new System.Windows.Forms.Label();
+      this.txtServerName = new System.Windows.Forms.TextBox();
+      this.chbWindowsAuthentication = new System.Windows.Forms.CheckBox();
+      this.SuspendLayout();
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(12, 127);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(55, 13);
+      this.label2.TabIndex = 3;
+      this.label2.Text = "Username";
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(12, 153);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(53, 13);
+      this.label3.TabIndex = 4;
+      this.label3.Text = "Password";
+      // 
+      // txtUsername
+      // 
+      this.txtUsername.Location = new System.Drawing.Point(113, 124);
+      this.txtUsername.Name = "txtUsername";
+      this.txtUsername.Size = new System.Drawing.Size(169, 20);
+      this.txtUsername.TabIndex = 3;
+      // 
+      // txtPassword
+      // 
+      this.txtPassword.Location = new System.Drawing.Point(113, 150);
+      this.txtPassword.Name = "txtPassword";
+      this.txtPassword.Size = new System.Drawing.Size(169, 20);
+      this.txtPassword.TabIndex = 4;
+      this.txtPassword.UseSystemPasswordChar = true;
+      // 
+      // btnOk
+      // 
+      this.btnOk.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.btnOk.Location = new System.Drawing.Point(113, 189);
+      this.btnOk.Name = "btnOk";
+      this.btnOk.Size = new System.Drawing.Size(75, 23);
+      this.btnOk.TabIndex = 5;
+      this.btnOk.Text = "OK";
+      this.btnOk.UseVisualStyleBackColor = true;
+      this.btnOk.Click += new System.EventHandler(this.btnOK_Click);
+      // 
+      // btnCancel
+      // 
+      this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.btnCancel.Location = new System.Drawing.Point(207, 189);
+      this.btnCancel.Name = "btnCancel";
+      this.btnCancel.Size = new System.Drawing.Size(75, 23);
+      this.btnCancel.TabIndex = 6;
+      this.btnCancel.Text = "Cancel";
+      this.btnCancel.UseVisualStyleBackColor = true;
+      // 
+      // txtDatabaseName
+      // 
+      this.txtDatabaseName.Location = new System.Drawing.Point(113, 56);
+      this.txtDatabaseName.Name = "txtDatabaseName";
+      this.txtDatabaseName.Size = new System.Drawing.Size(169, 20);
+      this.txtDatabaseName.TabIndex = 1;
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(12, 59);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(84, 13);
+      this.label4.TabIndex = 9;
+      this.label4.Text = "Database Name";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(12, 32);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(69, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "Server Name";
+      // 
+      // txtServerName
+      // 
+      this.txtServerName.Location = new System.Drawing.Point(113, 29);
+      this.txtServerName.Name = "txtServerName";
+      this.txtServerName.Size = new System.Drawing.Size(169, 20);
+      this.txtServerName.TabIndex = 0;
+      // 
+      // chbAdvancedSettings
+      // 
+      this.chbWindowsAuthentication.AutoSize = true;
+      this.chbWindowsAuthentication.Location = new System.Drawing.Point(113, 100);
+      this.chbWindowsAuthentication.Name = "chbAdvancedSettings";
+      this.chbWindowsAuthentication.Size = new System.Drawing.Size(141, 17);
+      this.chbWindowsAuthentication.TabIndex = 2;
+      this.chbWindowsAuthentication.Text = "Windows Authentication";
+      this.chbWindowsAuthentication.UseVisualStyleBackColor = true;
+      this.chbWindowsAuthentication.CheckedChanged += new System.EventHandler(this.chbWindowsAuthentication_CheckedChanged);
+      // 
+      // SqlServerConnectionWizard
+      // 
+      this.AcceptButton = this.btnOk;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(323, 229);
+      this.ControlBox = false;
+      this.Controls.Add(this.txtDatabaseName);
+      this.Controls.Add(this.label4);
+      this.Controls.Add(this.btnCancel);
+      this.Controls.Add(this.btnOk);
+      this.Controls.Add(this.txtPassword);
+      this.Controls.Add(this.txtUsername);
+      this.Controls.Add(this.label3);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.chbWindowsAuthentication);
+      this.Controls.Add(this.txtServerName);
+      this.Controls.Add(this.label1);
+      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "SqlServerConnectionWizard";
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Microsoft SQLServer Connection Wizard";
+      this.TopMost = true;
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.TextBox txtUsername;
+    private System.Windows.Forms.TextBox txtPassword;
+    private System.Windows.Forms.Button btnOk;
+    private System.Windows.Forms.Button btnCancel;
+    private System.Windows.Forms.TextBox txtDatabaseName;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TextBox txtServerName;
+    private System.Windows.Forms.CheckBox chbWindowsAuthentication;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/SqlServerConnectionWizard.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/SqlServerConnectionWizard.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/SqlServerConnectionWizard.cs	(revision 15690)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Windows.Forms;
+using HeuristicLab.DataImporter.DbExplorer.Interfaces;
+
+namespace HeuristicLab.DataImporter.DbExplorer.MsSqlServer {
+  public partial class SqlServerConnectionWizard : Form, IDbConnectionWizard {
+
+    private SqlServerConnection connection;
+    public DbConnectionBase Connection {
+      get { return connection; }
+    }
+    public SqlServerConnectionWizard() {
+      InitializeComponent();
+      chbWindowsAuthentication.Checked = true;
+    }
+
+    private void chbWindowsAuthentication_CheckedChanged(object sender, EventArgs e) {
+      if (chbWindowsAuthentication.Checked) {
+        txtUsername.Enabled = false;
+        txtPassword.Enabled = false;
+      } else {
+        txtUsername.Enabled = true;
+        txtPassword.Enabled = true;
+      }
+    }
+
+    private void btnOK_Click(object sender, EventArgs e) {
+      connection = new SqlServerConnection(txtServerName.Text, txtDatabaseName.Text, txtUsername.Text, txtPassword.Text, chbWindowsAuthentication.Checked);
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/SqlServerExplorer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/SqlServerExplorer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.MsSqlServer/SqlServerExplorer.cs	(revision 15690)
@@ -0,0 +1,129 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Data.Common;
+using System.Globalization;
+using HeuristicLab.DataImporter.DbExplorer.Interfaces;
+
+namespace HeuristicLab.DataImporter.DbExplorer.MsSqlServer {
+  public class SqlServerExplorer : DbExplorerBase {
+
+    protected override string EscapeSqlString(string s) {
+      return "[" + s + "]";
+    }
+
+    private enum NumericDataType { Numeric, Decimal, Tinyint, Smallint, Int, bigint, Float, Real }
+    public override bool IsNumericDataType(string type) {
+      try {
+        Enum.Parse(typeof(NumericDataType), type, true);
+        return true;
+      }
+      catch (ArgumentException) { }
+      return false;
+    }
+
+    private enum DateDataType { DateTime, SmallDateTime }
+    public override bool IsDateDataType(string type) {
+      try {
+        Enum.Parse(typeof(DateDataType), type, true);
+        return true;
+      }
+      catch (ArgumentException) { }
+      return false;
+    }
+
+    private enum StringDataType { Char, NChar, Varchar, NVarchar }
+    public override bool IsStringDataType(string type) {
+      try {
+        Enum.Parse(typeof(StringDataType), type, true);
+        return true;
+      }
+      catch (ArgumentException) { }
+      return false;
+    }
+
+    public override bool IsFilterableDataType(string type) {
+      return IsNumericDataType(type) || IsDateDataType(type) || IsStringDataType(type);
+    }
+
+    protected override string ConvertDate(DateTime date) {
+      string ret = "'" + date.ToString(CultureInfo.InvariantCulture) + "'";
+      return ret;
+    }
+
+    protected override string ConvertDouble(double value) {
+      return value.ToString(CultureInfo.InvariantCulture);
+    }
+
+    public override string MenuItemDescription {
+      get { return "Connect to Microsoft SqlServer"; }
+    }
+
+    private SqlServerConnectionWizard wizard;
+    protected override IDbConnectionWizard DbConnectionWizard {
+      get {
+        if (wizard == null)
+          wizard = new SqlServerConnectionWizard();
+        return wizard;
+      }
+    }
+
+    public override IEnumerable<DbTable> AllTables {
+      get {
+        if (Connection == null)
+          throw new InvalidOperationException("Connection to database not correctly set!");
+        List<DbTable> allTables = new List<DbTable>();
+        using (DbConnection conn = Connection.CreateConnection()) {
+          conn.Open();
+          using (DbCommand cmd = conn.CreateCommand()) {
+            cmd.CommandText = @"select table_schema,table_name from INFORMATION_SCHEMA.tables";
+            using (DbDataReader reader = cmd.ExecuteReader()) {
+              while (reader.Read()) {
+                allTables.Add(new DbTable(reader.GetString(0), reader.GetString(1)));
+              }
+              reader.Close();
+            }//end using reader
+            cmd.Dispose();
+          }//end using command
+
+          //fill columns for table
+          foreach (DbTable table in allTables) {
+            using (DbCommand cmd = conn.CreateCommand()) {
+              cmd.CommandText = @"select column_name,data_type from INFORMATION_SCHEMA.columns where table_name = '" + table.TableName + "'";
+              using (DbDataReader reader = cmd.ExecuteReader()) {
+                while (reader.Read()) {
+                  table.AddColumn(new DbColumn(reader.GetString(0), reader.GetString(1)));
+                }
+                reader.Close();
+              }//end using reader
+            }//end using command
+
+          }//end foreach table
+          conn.Close();
+        }//end using connection
+        allTables.Sort(new DbTableComparator());
+        return allTables;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/HeuristicLab.DataImporter.DbExplorer.Oracle.csproj
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/HeuristicLab.DataImporter.DbExplorer.Oracle.csproj	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/HeuristicLab.DataImporter.DbExplorer.Oracle.csproj	(revision 15690)
@@ -0,0 +1,180 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E04988E2-1C46-416F-8585-8874DF19DA11}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.DataImporter.DbExplorer.Oracle</RootNamespace>
+    <AssemblyName>HeuristicLab.DataImporter.DbExplorer.Oracle-1.0</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.OracleClient" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="OracleConnectionWizard.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="OracleConnectionWizard.Designer.cs">
+      <DependentUpon>OracleConnectionWizard.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OracleConnection.cs" />
+    <Compile Include="OracleExplorer.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.Data\HeuristicLab.DataImporter.Data.csproj">
+      <Project>{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}</Project>
+      <Name>HeuristicLab.DataImporter.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.DbExplorer.Interfaces\HeuristicLab.DataImporter.DbExplorer.Interfaces.csproj">
+      <Project>{815384EE-2B32-4C25-AE06-4FC7F417FE28}</Project>
+      <Name>HeuristicLab.DataImporter.DbExplorer.Interfaces</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/OracleConnection.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/OracleConnection.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/OracleConnection.cs	(revision 15690)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Data.OracleClient;
+using HeuristicLab.DataImporter.DbExplorer.Interfaces;
+
+namespace HeuristicLab.DataImporter.DbExplorer.Oracle {
+  public class OracleConnection : DbConnectionBase {
+    private string constring;
+
+    public OracleConnection(string databaseName, string userName, string password)
+      : base(databaseName, userName, password) {
+      this.constring = "Server=" + databaseName;
+      this.constring += "; User ID=" + userName + "; Password=" + password;
+    }
+
+    public OracleConnection(string host, string port, string serviceName, string userName, string password)
+      : base(host, userName, password) {
+      this.constring = String.Format("Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={0}) (PORT={1}))(CONNECT_DATA=(SERVICE_NAME={2})))" +
+        ";User Id={3};Password={4};", host, port, serviceName, userName, password);
+    }
+
+    public override System.Data.Common.DbConnection CreateConnection() {
+      return new System.Data.OracleClient.OracleConnection(constring);
+    }
+
+    public override bool TestConnection() {
+      System.Data.Common.DbConnection con = null;
+      try {
+        con = this.CreateConnection();
+        con.Open();
+        this.ErrorMessage = "";
+        return true;
+      }
+      catch (OracleException e) {
+        this.ErrorMessage = e.Message;
+        this.CreateConnection().Close();
+        return false;
+      }
+      finally {
+        if (con != null)
+          con.Close();
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/OracleConnectionWizard.Designer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/OracleConnectionWizard.Designer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/OracleConnectionWizard.Designer.cs	(revision 15690)
@@ -0,0 +1,249 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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
+
+namespace HeuristicLab.DataImporter.DbExplorer.Oracle {
+  partial class OracleConnectionWizard {
+    /// <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.label2 = new System.Windows.Forms.Label();
+      this.label3 = new System.Windows.Forms.Label();
+      this.txtUsername = new System.Windows.Forms.TextBox();
+      this.txtPassword = new System.Windows.Forms.TextBox();
+      this.btnOk = new System.Windows.Forms.Button();
+      this.btnCancel = new System.Windows.Forms.Button();
+      this.txtDatabaseName = new System.Windows.Forms.TextBox();
+      this.label4 = new System.Windows.Forms.Label();
+      this.txtHost = new System.Windows.Forms.TextBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.label5 = new System.Windows.Forms.Label();
+      this.label6 = new System.Windows.Forms.Label();
+      this.txtPort = new System.Windows.Forms.TextBox();
+      this.txtServiceName = new System.Windows.Forms.TextBox();
+      this.chbAdvancedSettings = new System.Windows.Forms.CheckBox();
+      this.SuspendLayout();
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(14, 41);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(55, 13);
+      this.label2.TabIndex = 3;
+      this.label2.Text = "Username";
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(14, 67);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(53, 13);
+      this.label3.TabIndex = 4;
+      this.label3.Text = "Password";
+      // 
+      // txtUsername
+      // 
+      this.txtUsername.Location = new System.Drawing.Point(113, 38);
+      this.txtUsername.Name = "txtUsername";
+      this.txtUsername.Size = new System.Drawing.Size(169, 20);
+      this.txtUsername.TabIndex = 1;
+      // 
+      // txtPassword
+      // 
+      this.txtPassword.Location = new System.Drawing.Point(113, 64);
+      this.txtPassword.Name = "txtPassword";
+      this.txtPassword.Size = new System.Drawing.Size(169, 20);
+      this.txtPassword.TabIndex = 2;
+      this.txtPassword.UseSystemPasswordChar = true;
+      // 
+      // btnOk
+      // 
+      this.btnOk.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.btnOk.Location = new System.Drawing.Point(113, 206);
+      this.btnOk.Name = "btnOk";
+      this.btnOk.Size = new System.Drawing.Size(75, 23);
+      this.btnOk.TabIndex = 7;
+      this.btnOk.Text = "OK";
+      this.btnOk.UseVisualStyleBackColor = true;
+      this.btnOk.Click += new System.EventHandler(this.btnOK_Click);
+      // 
+      // btnCancel
+      // 
+      this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.btnCancel.Location = new System.Drawing.Point(207, 206);
+      this.btnCancel.Name = "btnCancel";
+      this.btnCancel.Size = new System.Drawing.Size(75, 23);
+      this.btnCancel.TabIndex = 8;
+      this.btnCancel.Text = "Cancel";
+      this.btnCancel.UseVisualStyleBackColor = true;
+      // 
+      // txtDatabaseName
+      // 
+      this.txtDatabaseName.Location = new System.Drawing.Point(113, 12);
+      this.txtDatabaseName.Name = "txtDatabaseName";
+      this.txtDatabaseName.Size = new System.Drawing.Size(169, 20);
+      this.txtDatabaseName.TabIndex = 0;
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(14, 15);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(84, 13);
+      this.label4.TabIndex = 5;
+      this.label4.Text = "Database Name";
+      // 
+      // txtHost
+      // 
+      this.txtHost.Enabled = false;
+      this.txtHost.Location = new System.Drawing.Point(113, 117);
+      this.txtHost.Name = "txtHost";
+      this.txtHost.Size = new System.Drawing.Size(169, 20);
+      this.txtHost.TabIndex = 4;
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(14, 120);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(29, 13);
+      this.label1.TabIndex = 11;
+      this.label1.Text = "Host";
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(14, 172);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(74, 13);
+      this.label5.TabIndex = 12;
+      this.label5.Text = "Service Name";
+      // 
+      // label6
+      // 
+      this.label6.AutoSize = true;
+      this.label6.Location = new System.Drawing.Point(14, 146);
+      this.label6.Name = "label6";
+      this.label6.Size = new System.Drawing.Size(26, 13);
+      this.label6.TabIndex = 13;
+      this.label6.Text = "Port";
+      // 
+      // txtPort
+      // 
+      this.txtPort.Enabled = false;
+      this.txtPort.Location = new System.Drawing.Point(113, 143);
+      this.txtPort.Name = "txtPort";
+      this.txtPort.Size = new System.Drawing.Size(169, 20);
+      this.txtPort.TabIndex = 5;
+      // 
+      // txtServiceName
+      // 
+      this.txtServiceName.Enabled = false;
+      this.txtServiceName.Location = new System.Drawing.Point(113, 169);
+      this.txtServiceName.Name = "txtServiceName";
+      this.txtServiceName.Size = new System.Drawing.Size(169, 20);
+      this.txtServiceName.TabIndex = 6;
+      // 
+      // chbAdvancedSettings
+      // 
+      this.chbAdvancedSettings.AutoSize = true;
+      this.chbAdvancedSettings.Location = new System.Drawing.Point(113, 99);
+      this.chbAdvancedSettings.Name = "chbAdvancedSettings";
+      this.chbAdvancedSettings.Size = new System.Drawing.Size(116, 17);
+      this.chbAdvancedSettings.TabIndex = 3;
+      this.chbAdvancedSettings.Text = "Advanced Settings";
+      this.chbAdvancedSettings.UseVisualStyleBackColor = true;
+      this.chbAdvancedSettings.CheckedChanged += new System.EventHandler(this.chbWindowsAuthentication_CheckedChanged);
+      // 
+      // OracleConnectionWizard
+      // 
+      this.AcceptButton = this.btnOk;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(319, 244);
+      this.ControlBox = false;
+      this.Controls.Add(this.chbAdvancedSettings);
+      this.Controls.Add(this.txtServiceName);
+      this.Controls.Add(this.txtPort);
+      this.Controls.Add(this.label6);
+      this.Controls.Add(this.label5);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.txtHost);
+      this.Controls.Add(this.txtDatabaseName);
+      this.Controls.Add(this.label4);
+      this.Controls.Add(this.btnCancel);
+      this.Controls.Add(this.btnOk);
+      this.Controls.Add(this.txtPassword);
+      this.Controls.Add(this.txtUsername);
+      this.Controls.Add(this.label3);
+      this.Controls.Add(this.label2);
+      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "OracleConnectionWizard";
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Oracle Connection Wizard";
+      this.TopMost = true;
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.TextBox txtUsername;
+    private System.Windows.Forms.TextBox txtPassword;
+    private System.Windows.Forms.Button btnOk;
+    private System.Windows.Forms.Button btnCancel;
+    private System.Windows.Forms.TextBox txtDatabaseName;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.TextBox txtHost;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label5;
+    private System.Windows.Forms.Label label6;
+    private System.Windows.Forms.TextBox txtPort;
+    private System.Windows.Forms.TextBox txtServiceName;
+    private System.Windows.Forms.CheckBox chbAdvancedSettings;
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/OracleConnectionWizard.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/OracleConnectionWizard.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/OracleConnectionWizard.cs	(revision 15690)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Windows.Forms;
+using HeuristicLab.DataImporter.DbExplorer.Interfaces;
+
+namespace HeuristicLab.DataImporter.DbExplorer.Oracle {
+  public partial class OracleConnectionWizard : Form, IDbConnectionWizard {
+
+    private OracleConnection connection;
+    public DbConnectionBase Connection {
+      get { return connection; }
+    }
+
+    public OracleConnectionWizard() {
+      InitializeComponent();
+    }
+
+    private void btnOK_Click(object sender, EventArgs e) {
+      if (chbAdvancedSettings.Checked)
+        connection = new OracleConnection(txtHost.Text, txtPort.Text, txtServiceName.Text, txtUsername.Text, txtPassword.Text);
+      else
+        connection = new OracleConnection(txtDatabaseName.Text, txtUsername.Text, txtPassword.Text);
+    }
+
+    private void chbWindowsAuthentication_CheckedChanged(object sender, EventArgs e) {
+      if (chbAdvancedSettings.Checked) {
+        txtHost.Enabled = true;
+        txtPort.Enabled = true;
+        txtServiceName.Enabled = true;
+      } else {
+        txtHost.Enabled = false;
+        txtPort.Enabled = false;
+        txtServiceName.Enabled = false;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/OracleExplorer.cs
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/OracleExplorer.cs	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/OracleExplorer.cs	(revision 15690)
@@ -0,0 +1,116 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Data.Common;
+using System.Globalization;
+using HeuristicLab.DataImporter.DbExplorer.Interfaces;
+
+namespace HeuristicLab.DataImporter.DbExplorer.Oracle {
+  public class OracleExplorer : DbExplorerBase {
+
+    private enum NumericDataType { Number, Binary_Float, Binary_Double, Smallint, Int, bigint, Float, Real }
+    public override bool IsNumericDataType(string type) {
+      NumericDataType numericDataType;
+      return Enum.TryParse<NumericDataType>(type, true, out numericDataType);
+    }
+
+    private enum DateDataType { Date, TimeStamp } //caution TimeStamp With Time Zone, With Local Time Zone also available
+    public override bool IsDateDataType(string type) {
+      DateDataType dateDataType;
+      return Enum.TryParse<DateDataType>(type, true, out dateDataType);
+    }
+
+    private enum StringDataType { Char, NChar, Varchar, Varchar2, NVarchar2 }
+    public override bool IsStringDataType(string type) {
+      StringDataType stringDataType;
+      return Enum.TryParse<StringDataType>(type, true, out stringDataType);
+    }
+
+    public override bool IsFilterableDataType(string type) {
+      return IsNumericDataType(type) || IsDateDataType(type) || IsStringDataType(type);
+    }
+
+    public override string MenuItemDescription {
+      get { return "Connect to Oracle"; }
+    }
+
+    private OracleConnectionWizard wizard;
+    protected override IDbConnectionWizard DbConnectionWizard {
+      get {
+        if (wizard == null)
+          wizard = new OracleConnectionWizard();
+        return wizard;
+      }
+    }
+
+    public override IEnumerable<DbTable> AllTables {
+      get {
+        if (Connection == null) {
+          throw new InvalidOperationException("Connection to database not correctly set!");
+        }
+        List<DbTable> allTables = new List<DbTable>();
+        using (DbConnection conn = Connection.CreateConnection()) {
+          conn.Open();
+          using (DbCommand cmd = conn.CreateCommand()) {
+            cmd.CommandText = @"select owner,table_name from all_tables where lower(owner) not like '%sys%' union " +
+                              @"select owner,view_name from all_views where lower(owner) not like '%sys%' order by owner,table_name";
+            using (DbDataReader reader = cmd.ExecuteReader()) {
+              while (reader.Read()) {
+                allTables.Add(new DbTable(reader.GetString(0), reader.GetString(1)));
+              }
+              reader.Close();
+            }//end using reader
+          }//end using command
+
+          //fill columns for table
+          foreach (DbTable table in allTables) {
+            using (DbCommand cmd = conn.CreateCommand()) {
+              cmd.CommandText = @"select column_name,data_type from all_tab_columns where table_name = '" + table.TableName + "' and owner = '" + table.OwnerName + "'";
+              using (DbDataReader reader = cmd.ExecuteReader()) {
+                while (reader.Read()) {
+                  table.AddColumn(new DbColumn(reader.GetString(0), reader.GetString(1)));
+                }
+                reader.Close();
+              }//end using reader
+            }//end using command
+          }//end foreach table
+          conn.Close();
+        }//end using connection
+        allTables.Sort(new DbTableComparator());
+
+        return allTables;
+      }
+    }
+
+    protected override string ConvertDate(DateTime date) {
+      string ret = date.ToString(CultureInfo.InvariantCulture);
+      ret = "to_date('" + ret + "','MM/DD/YYYY HH24:MI:SS')";
+      return ret;
+    }
+
+    protected override string ConvertDouble(double value) {
+      return value.ToString(CultureInfo.InvariantCulture);
+    }
+
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/Plugin.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/Plugin.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/Plugin.cs.frame	(revision 15690)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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 System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.DataImporter.DbExplorer.Oracle {
+  [Plugin("HeuristicLab.DataImporter.DbExplorer.Oracle","1.0.0.$WCREV$")]
+  [PluginFile("HeuristicLab.DataImporter.DbExplorer.Oracle-1.0.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.DataImporter.DataProcessor","1.0")]
+  public class HeuristicLabDataImporterDbExplorerOraclePlugin : PluginBase {
+  }
+}
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/Properties/AssemblyInfo.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/Properties/AssemblyInfo.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.DbExplorer.Oracle/Properties/AssemblyInfo.cs.frame	(revision 15690)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.DataImporter.DbExplorer.Oracle")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7d0840b8-3382-4b99-ab4e-5d1eb91fbec1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.$WCREV$")]
+[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.sln
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.sln	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.sln	(revision 15690)
@@ -0,0 +1,80 @@
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1CAC4582-02A8-4D48-A255-2FB50DB86772}"
+	ProjectSection(SolutionItems) = preProject
+		PreBuildEvent.cmd = PreBuildEvent.cmd
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DataImporter.DataProcessor", "HeuristicLab.DataImporter.DataProcessor\HeuristicLab.DataImporter.DataProcessor.csproj", "{D7EE47DB-4D07-4BAC-9E9F-3F0393AEF605}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DataImporter.Backend.Csv", "HeuristicLab.DataImporter.Backend.Csv\HeuristicLab.DataImporter.Backend.Csv.csproj", "{F83B3E02-FCAA-46CA-8712-C41B960D19C3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DataImporter", "HeuristicLab.DataImporter\HeuristicLab.DataImporter.csproj", "{C384CD15-EAB7-4CE3-9FBB-FE41F7F47E4F}"
+	ProjectSection(ProjectDependencies) = postProject
+		{62625144-AC9E-4970-A79C-882B72A1601C} = {62625144-AC9E-4970-A79C-882B72A1601C}
+		{67E69744-D0D3-48C3-8F9D-51EE1A64E3F6} = {67E69744-D0D3-48C3-8F9D-51EE1A64E3F6}
+		{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE} = {4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}
+		{E04988E2-1C46-416F-8585-8874DF19DA11} = {E04988E2-1C46-416F-8585-8874DF19DA11}
+		{B6D02DED-277B-4091-9C06-F092D2F8116F} = {B6D02DED-277B-4091-9C06-F092D2F8116F}
+		{815384EE-2B32-4C25-AE06-4FC7F417FE28} = {815384EE-2B32-4C25-AE06-4FC7F417FE28}
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DataImporter.Data", "HeuristicLab.DataImporter.Data\HeuristicLab.DataImporter.Data.csproj", "{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DataImporter.Backend.Hl2ImporterFormat", "HeuristicLab.DataImporter.Backend.Hl2ImporterFormat\HeuristicLab.DataImporter.Backend.Hl2ImporterFormat.csproj", "{67E69744-D0D3-48C3-8F9D-51EE1A64E3F6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DataImporter.Command", "HeuristicLab.DataImporter.Command\HeuristicLab.DataImporter.Command.csproj", "{62625144-AC9E-4970-A79C-882B72A1601C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DataImporter.DbExplorer.Interfaces", "HeuristicLab.DataImporter.DbExplorer.Interfaces\HeuristicLab.DataImporter.DbExplorer.Interfaces.csproj", "{815384EE-2B32-4C25-AE06-4FC7F417FE28}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DataImporter.DbExplorer.MsSqlServer", "HeuristicLab.DataImporter.DbExplorer.MsSqlServer\HeuristicLab.DataImporter.DbExplorer.MsSqlServer.csproj", "{B6D02DED-277B-4091-9C06-F092D2F8116F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DataImporter.DbExplorer.Oracle", "HeuristicLab.DataImporter.DbExplorer.Oracle\HeuristicLab.DataImporter.DbExplorer.Oracle.csproj", "{E04988E2-1C46-416F-8585-8874DF19DA11}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{D7EE47DB-4D07-4BAC-9E9F-3F0393AEF605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D7EE47DB-4D07-4BAC-9E9F-3F0393AEF605}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D7EE47DB-4D07-4BAC-9E9F-3F0393AEF605}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D7EE47DB-4D07-4BAC-9E9F-3F0393AEF605}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F83B3E02-FCAA-46CA-8712-C41B960D19C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F83B3E02-FCAA-46CA-8712-C41B960D19C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F83B3E02-FCAA-46CA-8712-C41B960D19C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F83B3E02-FCAA-46CA-8712-C41B960D19C3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C384CD15-EAB7-4CE3-9FBB-FE41F7F47E4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C384CD15-EAB7-4CE3-9FBB-FE41F7F47E4F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C384CD15-EAB7-4CE3-9FBB-FE41F7F47E4F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C384CD15-EAB7-4CE3-9FBB-FE41F7F47E4F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{67E69744-D0D3-48C3-8F9D-51EE1A64E3F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{67E69744-D0D3-48C3-8F9D-51EE1A64E3F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{67E69744-D0D3-48C3-8F9D-51EE1A64E3F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{67E69744-D0D3-48C3-8F9D-51EE1A64E3F6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{62625144-AC9E-4970-A79C-882B72A1601C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{62625144-AC9E-4970-A79C-882B72A1601C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{62625144-AC9E-4970-A79C-882B72A1601C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{62625144-AC9E-4970-A79C-882B72A1601C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{815384EE-2B32-4C25-AE06-4FC7F417FE28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{815384EE-2B32-4C25-AE06-4FC7F417FE28}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{815384EE-2B32-4C25-AE06-4FC7F417FE28}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{815384EE-2B32-4C25-AE06-4FC7F417FE28}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B6D02DED-277B-4091-9C06-F092D2F8116F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B6D02DED-277B-4091-9C06-F092D2F8116F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B6D02DED-277B-4091-9C06-F092D2F8116F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B6D02DED-277B-4091-9C06-F092D2F8116F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E04988E2-1C46-416F-8585-8874DF19DA11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E04988E2-1C46-416F-8585-8874DF19DA11}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E04988E2-1C46-416F-8585-8874DF19DA11}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E04988E2-1C46-416F-8585-8874DF19DA11}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter/HeuristicLab.DataImporter.csproj
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter/HeuristicLab.DataImporter.csproj	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter/HeuristicLab.DataImporter.csproj	(revision 15690)
@@ -0,0 +1,187 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C384CD15-EAB7-4CE3-9FBB-FE41F7F47E4F}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.DataImporter</RootNamespace>
+    <AssemblyName>HeuristicLab.DataImporter-1.0</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\trunk\bin</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.Backend.Csv\HeuristicLab.DataImporter.Backend.Csv.csproj">
+      <Project>{F83B3E02-FCAA-46CA-8712-C41B960D19C3}</Project>
+      <Name>HeuristicLab.DataImporter.Backend.Csv</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.Backend.Hl2ImporterFormat\HeuristicLab.DataImporter.Backend.Hl2ImporterFormat.csproj">
+      <Project>{67E69744-D0D3-48C3-8F9D-51EE1A64E3F6}</Project>
+      <Name>HeuristicLab.DataImporter.Backend.Hl2ImporterFormat</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.Command\HeuristicLab.DataImporter.Command.csproj">
+      <Project>{62625144-AC9E-4970-A79C-882B72A1601C}</Project>
+      <Name>HeuristicLab.DataImporter.Command</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.DataProcessor\HeuristicLab.DataImporter.DataProcessor.csproj">
+      <Project>{D7EE47DB-4D07-4BAC-9E9F-3F0393AEF605}</Project>
+      <Name>HeuristicLab.DataImporter.DataProcessor</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.DataImporter.Data\HeuristicLab.DataImporter.Data.csproj">
+      <Project>{4A0EE09A-6D8A-458A-8FB0-3D18F88F7FEE}</Project>
+      <Name>HeuristicLab.DataImporter.Data</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PostBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+set Platform=$(PlatformName)
+</PostBuildEvent>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter/Properties/AssemblyInfo.cs.frame
===================================================================
--- addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter/Properties/AssemblyInfo.cs.frame	(revision 15690)
+++ addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter/Properties/AssemblyInfo.cs.frame	(revision 15690)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.DataImporter")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(C) 2008-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7d0840b8-3382-4b99-ab4e-5d1eb91fbec1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.$WCREV$")]
+[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
Index: addons/HeuristicLab.DataImporter/PreBuildEvent.cmd
===================================================================
--- addons/HeuristicLab.DataImporter/PreBuildEvent.cmd	(revision 15690)
+++ addons/HeuristicLab.DataImporter/PreBuildEvent.cmd	(revision 15690)
@@ -0,0 +1,2 @@
+IF EXIST "%ProjectDir%\Properties\AssemblyInfo.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Properties\AssemblyInfo.cs.frame" "%ProjectDir%\Properties\AssemblyInfo.cs"
+IF EXIST "%ProjectDir%\Plugin.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Plugin.cs.frame" "%ProjectDir%\Plugin.cs"
