Index: /branches/ParameterConfigurationEncoding/Build.cmd
===================================================================
--- /branches/ParameterConfigurationEncoding/Build.cmd	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/Build.cmd	(revision 8517)
@@ -0,0 +1,104 @@
+@ECHO OFF
+
+SET CLEANBEFOREBUILD=
+
+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 :clean
+
+:prompt_platform
+SET /P PLATFORM=Which platform to build [Any CPU]: 
+IF "%PLATFORM%"=="" SET PLATFORM=Any CPU
+
+:clean
+IF "%~4"=="" GOTO :prompt_clean
+
+SET CLEANBEFOREBUILD=%~4
+GOTO :main
+
+:prompt_clean
+SET /P CLEANBEFOREBUILD=Would you like to clean before building [n]: 
+IF "%CLEANBEFOREBUILD%"=="" SET CLEANBEFOREBUILD=n
+
+: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%" NEQ "n" (
+  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: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ConstrainedItemListView.Designer.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ConstrainedItemListView.Designer.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ConstrainedItemListView.Designer.cs	(revision 8517)
@@ -0,0 +1,33 @@
+﻿namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  partial class ConstrainedItemListView<T> {
+    /// <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.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Text = "ConstrainedItemListView";
+    }
+
+    #endregion
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ConstrainedItemListView.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ConstrainedItemListView.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ConstrainedItemListView.cs	(revision 8517)
@@ -0,0 +1,40 @@
+﻿using System;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  [View("Constrained Item List View")]
+  [Content(typeof(ConstrainedItemList<>), IsDefaultView = true)]
+  public sealed partial class ConstrainedItemListView<T> : ItemListView<T> where T : class, IItem {
+    public new ConstrainedItemList<T> Content {
+      get { return (ConstrainedItemList<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ConstrainedItemListView() {
+      InitializeComponent();
+    }
+
+    protected override T CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Item";
+        typeSelectorDialog.TypeSelector.Caption = "Available Items";
+        typeSelectorDialog.TypeSelector.Configure(Content.Type, false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ConstrainedTypeValueView.Designer.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ConstrainedTypeValueView.Designer.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ConstrainedTypeValueView.Designer.cs	(revision 8517)
@@ -0,0 +1,58 @@
+﻿namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  partial class ConstrainedTypeValueView {
+    /// <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.typeComboBox = new System.Windows.Forms.ComboBox();
+      this.SuspendLayout();
+      // 
+      // typeComboBox
+      // 
+      this.typeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.typeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.typeComboBox.FormattingEnabled = true;
+      this.typeComboBox.Location = new System.Drawing.Point(3, 3);
+      this.typeComboBox.Name = "typeComboBox";
+      this.typeComboBox.Size = new System.Drawing.Size(440, 21);
+      this.typeComboBox.Sorted = true;
+      this.typeComboBox.TabIndex = 0;
+      this.typeComboBox.SelectedIndexChanged += new System.EventHandler(this.typeComboBox_SelectedIndexChanged);
+      // 
+      // ConstrainedTypeValueView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.typeComboBox);
+      this.Name = "ConstrainedTypeValueView";
+      this.Size = new System.Drawing.Size(446, 286);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ComboBox typeComboBox;
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ConstrainedTypeValueView.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ConstrainedTypeValueView.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ConstrainedTypeValueView.cs	(revision 8517)
@@ -0,0 +1,61 @@
+﻿using System;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  [View("ConstrainedTypeValueView")]
+  [Content(typeof(ConstrainedTypeValue), IsDefaultView = false)]
+  [Content(typeof(ConstrainedTypeValue<>), IsDefaultView = true)]
+  public sealed partial class ConstrainedTypeValueView : ItemView {
+    public new ConstrainedTypeValue Content {
+      get { return (ConstrainedTypeValue)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ConstrainedTypeValueView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ValueChanged -= new EventHandler(Content_ValueChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ValueChanged += new EventHandler(Content_ValueChanged);
+    }
+
+    #region Event Handlers (Content)
+    void Content_ValueChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_ValueChanged), sender, e);
+      } else {
+        this.typeComboBox.SelectedItem = Content.Value;
+      }
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        typeComboBox.Items.Clear();
+      } else {
+        typeComboBox.Items.AddRange(Content.ValidTypes.ToArray());
+        Content_ValueChanged(this, EventArgs.Empty);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+
+    #region Event Handlers (child controls)
+    private void typeComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      Content.Value = (Type)typeComboBox.SelectedItem;
+    }
+    #endregion
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/CreateExperimentDialogV2.Designer.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/CreateExperimentDialogV2.Designer.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/CreateExperimentDialogV2.Designer.cs	(revision 8517)
@@ -0,0 +1,254 @@
+﻿namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  partial class CreateExperimentDialogV2 {
+    /// <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.createBatchRunLabel = new System.Windows.Forms.Label();
+      this.createBatchRunCheckBox = new System.Windows.Forms.CheckBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.repetitionsNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.repetitionsLabel = new System.Windows.Forms.Label();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.warningProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.engineComboBox = new System.Windows.Forms.ComboBox();
+      this.engineLabel = new System.Windows.Forms.Label();
+      this.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.calculateCombinationsButton = new System.Windows.Forms.Button();
+      this.combinationsLabel = new System.Windows.Forms.Label();
+      this.combinationsTextBox = new System.Windows.Forms.TextBox();
+      this.parameterConfigurationTreeView = new HeuristicLab.Encodings.ParameterConfigurationEncoding.Views.ParameterConfigurationTreeView();
+      ((System.ComponentModel.ISupportInitialize)(this.repetitionsNumericUpDown)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.warningProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // createBatchRunLabel
+      // 
+      this.createBatchRunLabel.AutoSize = true;
+      this.createBatchRunLabel.Location = new System.Drawing.Point(12, 9);
+      this.createBatchRunLabel.Name = "createBatchRunLabel";
+      this.createBatchRunLabel.Size = new System.Drawing.Size(95, 13);
+      this.createBatchRunLabel.TabIndex = 0;
+      this.createBatchRunLabel.Text = "&Create Batch Run:";
+      // 
+      // createBatchRunCheckBox
+      // 
+      this.createBatchRunCheckBox.AutoSize = true;
+      this.createBatchRunCheckBox.Checked = true;
+      this.createBatchRunCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.createBatchRunCheckBox.Location = new System.Drawing.Point(113, 8);
+      this.createBatchRunCheckBox.Name = "createBatchRunCheckBox";
+      this.createBatchRunCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.createBatchRunCheckBox.TabIndex = 1;
+      this.toolTip.SetToolTip(this.createBatchRunCheckBox, "Check to create a batch run for executing an optimizer multiple times.");
+      this.createBatchRunCheckBox.UseVisualStyleBackColor = true;
+      this.createBatchRunCheckBox.CheckedChanged += new System.EventHandler(this.createBatchRunCheckBox_CheckedChanged);
+      // 
+      // repetitionsNumericUpDown
+      // 
+      this.repetitionsNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.repetitionsNumericUpDown.Location = new System.Drawing.Point(113, 28);
+      this.repetitionsNumericUpDown.Maximum = new decimal(new int[] {
+            1000000,
+            0,
+            0,
+            0});
+      this.repetitionsNumericUpDown.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.repetitionsNumericUpDown.Name = "repetitionsNumericUpDown";
+      this.repetitionsNumericUpDown.Size = new System.Drawing.Size(859, 20);
+      this.repetitionsNumericUpDown.TabIndex = 3;
+      this.repetitionsNumericUpDown.ThousandsSeparator = true;
+      this.toolTip.SetToolTip(this.repetitionsNumericUpDown, "Number of repetitions executed by the batch run.");
+      this.repetitionsNumericUpDown.Value = new decimal(new int[] {
+            10,
+            0,
+            0,
+            0});
+      this.repetitionsNumericUpDown.Validated += new System.EventHandler(this.repetitionsNumericUpDown_Validated);
+      // 
+      // repetitionsLabel
+      // 
+      this.repetitionsLabel.AutoSize = true;
+      this.repetitionsLabel.Location = new System.Drawing.Point(12, 30);
+      this.repetitionsLabel.Name = "repetitionsLabel";
+      this.repetitionsLabel.Size = new System.Drawing.Size(63, 13);
+      this.repetitionsLabel.TabIndex = 2;
+      this.repetitionsLabel.Text = "&Repetitions:";
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
+      this.errorProvider.ContainerControl = this;
+      // 
+      // warningProvider
+      // 
+      this.warningProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
+      this.warningProvider.ContainerControl = this;
+      // 
+      // engineComboBox
+      // 
+      this.engineComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.engineComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.engineComboBox.FormattingEnabled = true;
+      this.engineComboBox.Location = new System.Drawing.Point(113, 54);
+      this.engineComboBox.Name = "engineComboBox";
+      this.engineComboBox.Size = new System.Drawing.Size(859, 21);
+      this.engineComboBox.TabIndex = 4;
+      this.engineComboBox.SelectedIndexChanged += new System.EventHandler(this.engineComboBox_SelectedIndexChanged);
+      // 
+      // engineLabel
+      // 
+      this.engineLabel.AutoSize = true;
+      this.engineLabel.Location = new System.Drawing.Point(12, 57);
+      this.engineLabel.Name = "engineLabel";
+      this.engineLabel.Size = new System.Drawing.Size(43, 13);
+      this.engineLabel.TabIndex = 5;
+      this.engineLabel.Text = "&Engine:";
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Location = new System.Drawing.Point(816, 557);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 7;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(897, 557);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 8;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // calculateCombinationsButton
+      // 
+      this.calculateCombinationsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.calculateCombinationsButton.Location = new System.Drawing.Point(12, 557);
+      this.calculateCombinationsButton.Name = "calculateCombinationsButton";
+      this.calculateCombinationsButton.Size = new System.Drawing.Size(148, 23);
+      this.calculateCombinationsButton.TabIndex = 9;
+      this.calculateCombinationsButton.Text = "Calculate Combinations";
+      this.calculateCombinationsButton.UseVisualStyleBackColor = true;
+      this.calculateCombinationsButton.Click += new System.EventHandler(this.calculateCombinationsButton_Click);
+      // 
+      // combinationsLabel
+      // 
+      this.combinationsLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.combinationsLabel.AutoSize = true;
+      this.combinationsLabel.Location = new System.Drawing.Point(166, 562);
+      this.combinationsLabel.Name = "combinationsLabel";
+      this.combinationsLabel.Size = new System.Drawing.Size(73, 13);
+      this.combinationsLabel.TabIndex = 10;
+      this.combinationsLabel.Text = "Combinations:";
+      // 
+      // combinationsTextBox
+      // 
+      this.combinationsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.combinationsTextBox.Location = new System.Drawing.Point(245, 559);
+      this.combinationsTextBox.Name = "combinationsTextBox";
+      this.combinationsTextBox.ReadOnly = true;
+      this.combinationsTextBox.Size = new System.Drawing.Size(565, 20);
+      this.combinationsTextBox.TabIndex = 11;
+      // 
+      // parameterConfigurationTreeView
+      // 
+      this.parameterConfigurationTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.parameterConfigurationTreeView.Caption = "ParameterConfiguration View";
+      this.parameterConfigurationTreeView.Content = null;
+      this.parameterConfigurationTreeView.Location = new System.Drawing.Point(12, 81);
+      this.parameterConfigurationTreeView.Name = "parameterConfigurationTreeView";
+      this.parameterConfigurationTreeView.ReadOnly = false;
+      this.parameterConfigurationTreeView.Size = new System.Drawing.Size(960, 470);
+      this.parameterConfigurationTreeView.TabIndex = 6;
+      // 
+      // CreateExperimentDialogV2
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.ClientSize = new System.Drawing.Size(984, 592);
+      this.Controls.Add(this.combinationsTextBox);
+      this.Controls.Add(this.combinationsLabel);
+      this.Controls.Add(this.calculateCombinationsButton);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.Controls.Add(this.parameterConfigurationTreeView);
+      this.Controls.Add(this.engineLabel);
+      this.Controls.Add(this.engineComboBox);
+      this.Controls.Add(this.repetitionsNumericUpDown);
+      this.Controls.Add(this.repetitionsLabel);
+      this.Controls.Add(this.createBatchRunCheckBox);
+      this.Controls.Add(this.createBatchRunLabel);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "CreateExperimentDialogV2";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Create Experiment [v2]";
+      this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.CreateExperimentDialogV2_FormClosing);
+      this.Load += new System.EventHandler(this.CreateExperimentDialogV2_Load);
+      ((System.ComponentModel.ISupportInitialize)(this.repetitionsNumericUpDown)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.warningProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label createBatchRunLabel;
+    private System.Windows.Forms.CheckBox createBatchRunCheckBox;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Label repetitionsLabel;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Label engineLabel;
+    private System.Windows.Forms.ComboBox engineComboBox;
+    private System.Windows.Forms.NumericUpDown repetitionsNumericUpDown;
+    private System.Windows.Forms.ErrorProvider warningProvider;
+    private ParameterConfigurationTreeView parameterConfigurationTreeView;
+    private System.Windows.Forms.TextBox combinationsTextBox;
+    private System.Windows.Forms.Label combinationsLabel;
+    private System.Windows.Forms.Button calculateCombinationsButton;
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/CreateExperimentDialogV2.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/CreateExperimentDialogV2.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/CreateExperimentDialogV2.cs	(revision 8517)
@@ -0,0 +1,159 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  public partial class CreateExperimentDialogV2 : Form {
+    private readonly Progress progress;
+    private readonly IAlgorithm algorithm;
+    private ParameterConfigurationTree parameterConfigurationTree;
+    private bool createBatchRun;
+    private int repetitions;
+    private IEngine engine;
+    private Task generation;
+    private CancellationTokenSource cts;
+
+    public Experiment Experiment { get; private set; }
+
+    public CreateExperimentDialogV2() : this(null, null) { }
+    public CreateExperimentDialogV2(IAlgorithm algorithm, IEnumerable<IEngine> engines) {
+      InitializeComponent();
+      if (algorithm != null && engines != null) {
+        this.algorithm = (IAlgorithm)algorithm.Clone();
+        foreach (var engine in engines) engineComboBox.Items.Add(engine);
+        if (engineComboBox.SelectedItem == null) {
+          engineComboBox.SelectedIndex = 0;
+          engine = (IEngine)engineComboBox.SelectedItem;
+        }
+      }
+      createBatchRun = createBatchRunCheckBox.Checked;
+      repetitions = (int)repetitionsNumericUpDown.Value;
+      progress = new Progress {
+        CanBeCanceled = true,
+        ProgressState = ProgressState.Finished
+      };
+      progress.CancelRequested += (sender, args) => cts.Cancel();
+      progress.ProgressValueChanged += (sender, args) => progress.Status = string.Format("Generating experiment. Please be patient. ({0} %)", (int)(progress.ProgressValue * 100));
+      cts = new CancellationTokenSource();
+    }
+
+    private void SetEnabledStateOfControls(bool state) {
+      createBatchRunCheckBox.Enabled = state;
+      repetitionsNumericUpDown.Enabled = state;
+      engineComboBox.Enabled = state;
+      okButton.Enabled = state;
+      cancelButton.Enabled = state;
+    }
+
+    private void StartProgressView() {
+      if (InvokeRequired) {
+        Invoke(new Action(StartProgressView));
+      } else {
+        SetEnabledStateOfControls(false);
+        progress.ProgressValue = 0;
+        progress.ProgressState = ProgressState.Started;
+      }
+    }
+
+    private void FinishProgressView() {
+      if (InvokeRequired) {
+        Invoke(new Action(FinishProgressView));
+      } else {
+        progress.Finish();
+        SetEnabledStateOfControls(true);
+      }
+    }
+
+    private void ReportError(Exception e) {
+      if (InvokeRequired) {
+        Invoke(new Action<Exception>(ReportError), e);
+      } else {
+        ErrorHandling.ShowErrorDialog(this, "An error occurred generating the experiment.", e);
+      }
+    }
+
+    private void CreateExperimentDialogV2_Load(object sender, System.EventArgs e) {
+      if (algorithm.Problem != null) {
+        parameterConfigurationTreeView.Content = parameterConfigurationTree = new ParameterConfigurationTree(algorithm, algorithm.Problem);
+        parameterConfigurationTree.ExperimentGenerationProgressChanged += (o, args) => progress.ProgressValue = parameterConfigurationTree.ExperimentGenerationProgress;
+        new ProgressView(parameterConfigurationTreeView, progress) { CancelTimeoutMs = 10000 };
+      }
+    }
+
+    private void CreateExperimentDialogV2_FormClosing(object sender, FormClosingEventArgs e) {
+      if (generation != null) e.Cancel = true;
+    }
+
+    private void createBatchRunCheckBox_CheckedChanged(object sender, System.EventArgs e) {
+      repetitionsNumericUpDown.Enabled = createBatchRun = createBatchRunCheckBox.Checked;
+    }
+
+    private void repetitionsNumericUpDown_Validated(object sender, System.EventArgs e) {
+      if (repetitionsNumericUpDown.Text == string.Empty)
+        repetitionsNumericUpDown.Text = repetitionsNumericUpDown.Value.ToString();
+      repetitions = (int)repetitionsNumericUpDown.Value;
+    }
+
+    private void engineComboBox_SelectedIndexChanged(object sender, System.EventArgs e) {
+      engine = (IEngine)engineComboBox.SelectedItem;
+    }
+
+    private void calculateCombinationsButton_Click(object sender, EventArgs e) {
+      combinationsTextBox.Text = parameterConfigurationTree.GetCombinationCount(0).ToString();
+    }
+
+    private void okButton_Click(object sender, System.EventArgs e) {
+      generation = Task.Factory.StartNew(() => {
+        StartProgressView();
+        var engineAlgorithm = algorithm as EngineAlgorithm;
+        if (engineAlgorithm != null) engineAlgorithm.Engine = engine;
+        try {
+          Experiment = createBatchRun ? parameterConfigurationTree.GenerateExperiment(engineAlgorithm, true, repetitions, cts.Token)
+                                      : parameterConfigurationTree.GenerateExperiment(engineAlgorithm, false, 0, cts.Token);
+        }
+        finally { FinishProgressView(); }
+      }, cts.Token);
+      generation.ContinueWith(t => {
+        generation = null;
+        this.DialogResult = DialogResult.OK;
+        this.Close();
+      }, TaskContinuationOptions.OnlyOnRanToCompletion);
+      generation.ContinueWith(t => {
+        generation = null;
+        if (t.IsCanceled) cts = new CancellationTokenSource();
+        if (t.IsFaulted) {
+          ReportError(t.Exception.Flatten());
+          t.Exception.Flatten().Handle(ex => true);
+        }
+      }, TaskContinuationOptions.NotOnRanToCompletion);
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views-3.3.csproj
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views-3.3.csproj	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views-3.3.csproj	(revision 8517)
@@ -0,0 +1,149 @@
+﻿<?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>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{FDE4DD6C-EE0E-4830-8151-CE450448A4CC}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Encodings.ParameterConfigurationEncoding.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Encodings.ParameterConfigurationEncoding.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <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, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Data.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Optimizer-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Parameters.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="CreateExperimentDialogV2.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="CreateExperimentDialogV2.Designer.cs">
+      <DependentUpon>CreateExperimentDialogV2.cs</DependentUpon>
+    </Compile>
+    <Compile Include="MenuItems\CreateExperimentMenuItemV2.cs" />
+    <Compile Include="MessageItem.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ObjectSelectorDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ObjectSelectorDialog.designer.cs">
+      <DependentUpon>ObjectSelectorDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OptimizableView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OptimizableView.designer.cs">
+      <DependentUpon>OptimizableView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ParameterConfigurationTreeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ParameterConfigurationTreeView.designer.cs">
+      <DependentUpon>ParameterConfigurationTreeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="ValueConfigurationViews\RangeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ValueConfigurationViews\RangeView.designer.cs">
+      <DependentUpon>RangeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ValueConfigurationViews\ValueView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ValueConfigurationViews\ValueView.designer.cs">
+      <DependentUpon>ValueView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.ParameterConfigurationEncoding\3.3\HeuristicLab.Encodings.ParameterConfigurationEncoding-3.3.csproj">
+      <Project>{7520D3F4-7526-4BB7-B71E-F41F5D5559F9}</Project>
+      <Name>HeuristicLab.Encodings.ParameterConfigurationEncoding-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- 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>
+  -->
+</Project>
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ItemDictionaryView.Designer.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ItemDictionaryView.Designer.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ItemDictionaryView.Designer.cs	(revision 8517)
@@ -0,0 +1,224 @@
+﻿using System.Windows.Forms;
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  partial class ItemDictionaryView<K, T> {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.itemsListView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.sortDescendingButton = new System.Windows.Forms.Button();
+      this.sortAscendingButton = new System.Windows.Forms.Button();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.addButton = new System.Windows.Forms.Button();
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.itemsGroupBox = new System.Windows.Forms.GroupBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.showDetailsCheckBox = new System.Windows.Forms.CheckBox();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
+      this.itemsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.showDetailsCheckBox);
+      this.splitContainer.Panel1.Controls.Add(this.itemsListView);
+      this.splitContainer.Panel1.Controls.Add(this.sortDescendingButton);
+      this.splitContainer.Panel1.Controls.Add(this.sortAscendingButton);
+      this.splitContainer.Panel1.Controls.Add(this.removeButton);
+      this.splitContainer.Panel1.Controls.Add(this.addButton);
+      this.splitContainer.Panel1MinSize = 100;
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(526, 364);
+      this.splitContainer.SplitterDistance = 250;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // itemsListView
+      // 
+      this.itemsListView.AllowDrop = true;
+      this.itemsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.itemsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.itemsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.itemsListView.HideSelection = false;
+      this.itemsListView.Location = new System.Drawing.Point(3, 33);
+      this.itemsListView.Name = "itemsListView";
+      this.itemsListView.ShowItemToolTips = true;
+      this.itemsListView.Size = new System.Drawing.Size(244, 327);
+      this.itemsListView.SmallImageList = this.imageList;
+      this.itemsListView.TabIndex = 5;
+      this.itemsListView.UseCompatibleStateImageBehavior = false;
+      this.itemsListView.View = System.Windows.Forms.View.Details;
+      this.itemsListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.itemsListView_ItemDrag);
+      this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
+      this.itemsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragDrop);
+      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
+      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
+      this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
+      this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyDown);
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // sortDescendingButton
+      // 
+      this.sortDescendingButton.Enabled = false;
+      this.sortDescendingButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.SortUp;
+      this.sortDescendingButton.Location = new System.Drawing.Point(33, 3);
+      this.sortDescendingButton.Name = "sortDescendingButton";
+      this.sortDescendingButton.Size = new System.Drawing.Size(24, 24);
+      this.sortDescendingButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.sortDescendingButton, "Sort Descending");
+      this.sortDescendingButton.UseVisualStyleBackColor = true;
+      this.sortDescendingButton.Click += new System.EventHandler(this.sortDescendingButton_Click);
+      // 
+      // sortAscendingButton
+      // 
+      this.sortAscendingButton.Enabled = false;
+      this.sortAscendingButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Sort;
+      this.sortAscendingButton.Location = new System.Drawing.Point(63, 3);
+      this.sortAscendingButton.Name = "sortAscendingButton";
+      this.sortAscendingButton.Size = new System.Drawing.Size(24, 24);
+      this.sortAscendingButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.sortAscendingButton, "Sort Ascending");
+      this.sortAscendingButton.UseVisualStyleBackColor = true;
+      this.sortAscendingButton.Click += new System.EventHandler(this.sortAscendingButton_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.removeButton.Location = new System.Drawing.Point(93, 3);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(24, 24);
+      this.removeButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.removeButton, "Remove");
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // addButton
+      // 
+      this.addButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Add;
+      this.addButton.Location = new System.Drawing.Point(3, 3);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(24, 24);
+      this.addButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.addButton, "Add");
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.detailsGroupBox.Controls.Add(this.viewHost);
+      this.detailsGroupBox.Location = new System.Drawing.Point(3, 27);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(266, 335);
+      this.detailsGroupBox.TabIndex = 0;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
+      // 
+      // viewHost
+      // 
+      this.viewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.viewHost.Caption = "View";
+      this.viewHost.Content = null;
+      this.viewHost.Location = new System.Drawing.Point(6, 19);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(254, 310);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewType = null;
+      // 
+      // itemsGroupBox
+      // 
+      this.itemsGroupBox.Controls.Add(this.splitContainer);
+      this.itemsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.itemsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.itemsGroupBox.Name = "itemsGroupBox";
+      this.itemsGroupBox.Size = new System.Drawing.Size(532, 383);
+      this.itemsGroupBox.TabIndex = 0;
+      this.itemsGroupBox.TabStop = false;
+      this.itemsGroupBox.Text = "Items";
+      // 
+      // showDetailsCheckBox
+      // 
+      this.showDetailsCheckBox.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showDetailsCheckBox.Checked = true;
+      this.showDetailsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.showDetailsCheckBox.Image = HeuristicLab.Common.Resources.VSImageLibrary.Properties;
+      this.showDetailsCheckBox.Location = new System.Drawing.Point(123, 3);
+      this.showDetailsCheckBox.Name = "showDetailsCheckBox";
+      this.showDetailsCheckBox.Size = new System.Drawing.Size(24, 24);
+      this.showDetailsCheckBox.TabIndex = 4;
+      this.toolTip.SetToolTip(this.showDetailsCheckBox, "Show/Hide Details");
+      this.showDetailsCheckBox.UseVisualStyleBackColor = true;
+      this.showDetailsCheckBox.CheckedChanged += new System.EventHandler(this.showDetailsCheckBox_CheckedChanged);
+      // 
+      // ItemCollectionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.itemsGroupBox);
+      this.Name = "ItemCollectionView";
+      this.Size = new System.Drawing.Size(532, 383);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.itemsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.SplitContainer splitContainer;
+    protected System.Windows.Forms.ColumnHeader columnHeader1;
+    protected GroupBox itemsGroupBox;
+    protected ListView itemsListView;
+    protected GroupBox detailsGroupBox;
+    protected Button addButton;
+    protected Button removeButton;
+    protected ToolTip toolTip;
+    protected ImageList imageList;
+    protected HeuristicLab.MainForm.WindowsForms.ViewHost viewHost;
+    protected Button sortAscendingButton;
+    protected Button sortDescendingButton;
+    protected CheckBox showDetailsCheckBox;
+
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ItemDictionaryView.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ItemDictionaryView.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ItemDictionaryView.cs	(revision 8517)
@@ -0,0 +1,355 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+
+  [View("ItemDictionaryView")]
+  [Content(typeof(ItemDictionary<,>), IsDefaultView = false)]
+  public partial class ItemDictionaryView<K, T> : ItemView
+    where K : class, IItem
+    where T : class, IItem {
+    protected Dictionary<KeyValuePair<K, T>, List<ListViewItem>> itemListViewItemMapping;
+    protected TypeSelectorDialog typeSelectorDialog;
+
+    public new ItemDictionary<K, T> Content {
+      get { return (ItemDictionary<K, T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ListView ItemsListView {
+      get { return itemsListView; }
+    }
+
+    public ItemDictionaryView() {
+      InitializeComponent();
+      itemListViewItemMapping = new Dictionary<KeyValuePair<K, T>, List<ListViewItem>>();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ItemsAdded -= new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_ItemsAdded);
+      Content.ItemsRemoved -= new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_ItemsRemoved);
+      Content.CollectionReset -= new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_CollectionReset);
+      foreach (KeyValuePair<K, T> item in itemListViewItemMapping.Keys) {
+        DeregisterItemEvents(item);
+      }
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsAdded += new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_ItemsAdded);
+      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_ItemsRemoved);
+      Content.CollectionReset += new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_CollectionReset);
+    }
+    protected virtual void DeregisterItemEvents(KeyValuePair<K, T> item) {
+      item.Value.ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
+      item.Key.ToStringChanged -= new EventHandler(Item_ToStringChanged);
+    }
+    protected virtual void RegisterItemEvents(KeyValuePair<K, T> item) {
+      item.Value.ItemImageChanged += new EventHandler(Item_ItemImageChanged);
+      item.Key.ToStringChanged += new EventHandler(Item_ToStringChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      itemsListView.Items.Clear();
+      itemListViewItemMapping.Clear();
+      RebuildImageList();
+      viewHost.Content = null;
+      if (Content != null) {
+        Caption += " (" + Content.GetType().Name + ")";
+        foreach (KeyValuePair<K, T> item in Content)
+          AddListViewItem(CreateListViewItem(item));
+        AdjustListViewColumnSizes();
+        SortItemsListView(SortOrder.Ascending);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content == null) {
+        addButton.Enabled = false;
+        sortAscendingButton.Enabled = false;
+        sortDescendingButton.Enabled = false;
+        removeButton.Enabled = false;
+        itemsListView.Enabled = false;
+        detailsGroupBox.Enabled = false;
+      } else {
+        addButton.Enabled = !ReadOnly;
+        sortAscendingButton.Enabled = itemsListView.Items.Count > 1;
+        sortDescendingButton.Enabled = itemsListView.Items.Count > 1;
+        removeButton.Enabled = !ReadOnly && itemsListView.SelectedItems.Count > 0;
+        itemsListView.Enabled = true;
+        detailsGroupBox.Enabled = itemsListView.SelectedItems.Count == 1;
+      }
+    }
+
+    protected virtual T CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Item";
+        typeSelectorDialog.TypeSelector.Caption = "Available Items";
+        typeSelectorDialog.TypeSelector.Configure(typeof(T), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+    protected virtual ListViewItem CreateListViewItem(KeyValuePair<K, T> item) {
+      ListViewItem listViewItem = new ListViewItem();
+      listViewItem.Text = item.Key.ToString();
+      listViewItem.ToolTipText = item.Key.ItemName + ": " + item.Key.ItemDescription;
+      itemsListView.SmallImageList.Images.Add(item.Value.ItemImage);
+      listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+      listViewItem.Tag = item;
+      return listViewItem;
+    }
+    protected virtual void AddListViewItem(ListViewItem listViewItem) {
+      KeyValuePair<K, T> item = (KeyValuePair<K, T>)listViewItem.Tag;
+      itemsListView.Items.Add(listViewItem);
+      if (!itemListViewItemMapping.ContainsKey(item)) {
+        RegisterItemEvents(item);
+        itemListViewItemMapping.Add(item, new List<ListViewItem>());
+      }
+      itemListViewItemMapping[item].Add(listViewItem);
+      sortAscendingButton.Enabled = itemsListView.Items.Count > 1;
+      sortDescendingButton.Enabled = itemsListView.Items.Count > 1;
+    }
+    protected virtual void RemoveListViewItem(ListViewItem listViewItem) {
+      KeyValuePair<K, T> item = (KeyValuePair<K, T>)listViewItem.Tag;
+      itemListViewItemMapping[item].Remove(listViewItem);
+      if (itemListViewItemMapping[item].Count == 0) {
+        itemListViewItemMapping.Remove(item);
+        DeregisterItemEvents(item);
+      }
+      listViewItem.Remove();
+      sortAscendingButton.Enabled = itemsListView.Items.Count > 1;
+      sortDescendingButton.Enabled = itemsListView.Items.Count > 1;
+    }
+    protected virtual void UpdateListViewItemImage(ListViewItem listViewItem) {
+      KeyValuePair<K, T> item = (KeyValuePair<K, T>)listViewItem.Tag;
+      int i = listViewItem.ImageIndex;
+      listViewItem.ImageList.Images[i] = item.Value.ItemImage;
+      listViewItem.ImageIndex = -1;
+      listViewItem.ImageIndex = i;
+    }
+    protected virtual void UpdateListViewItemText(ListViewItem listViewItem) {
+      KeyValuePair<K, T> item = (KeyValuePair<K, T>)listViewItem.Tag;
+      listViewItem.Text = item.Key.ToString();
+      listViewItem.ToolTipText = item.Value.ItemName + ": " + item.Value.ItemDescription;
+    }
+    protected virtual IEnumerable<ListViewItem> GetListViewItemsForItem(KeyValuePair<K, T> item) {
+      List<ListViewItem> listViewItems = null;
+      itemListViewItemMapping.TryGetValue(item, out listViewItems);
+      return listViewItems == null ? Enumerable.Empty<ListViewItem>() : listViewItems;
+    }
+
+    #region ListView Events
+    protected virtual void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      removeButton.Enabled = (Content != null) && !ReadOnly && itemsListView.SelectedItems.Count > 0;
+      AdjustListViewColumnSizes();
+      if (showDetailsCheckBox.Checked) {
+        if (itemsListView.SelectedItems.Count == 1) {
+          KeyValuePair<K, T> item = (KeyValuePair<K, T>)itemsListView.SelectedItems[0].Tag;
+          detailsGroupBox.Enabled = true;
+          viewHost.Content = item.Value;
+        } else {
+          viewHost.Content = null;
+          detailsGroupBox.Enabled = false;
+        }
+      }
+    }
+    protected virtual void itemsListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if ((itemsListView.SelectedItems.Count > 0) && !ReadOnly) {
+          foreach (ListViewItem item in itemsListView.SelectedItems)
+            Content.Remove(((KeyValuePair<K, T>)item.Tag).Key);
+        }
+      }
+    }
+    protected virtual void itemsListView_DoubleClick(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        KeyValuePair<K, T> item = (KeyValuePair<K, T>)itemsListView.SelectedItems[0].Tag;
+        IContentView view = MainFormManager.MainForm.ShowContent(item.Value);
+        if (view != null) {
+          view.ReadOnly = ReadOnly;
+          view.Locked = Locked;
+        }
+      }
+    }
+    protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      if (!Locked) {
+        ListViewItem listViewItem = (ListViewItem)e.Item;
+        KeyValuePair<K, T> item = (KeyValuePair<K, T>)listViewItem.Tag;
+        DataObject data = new DataObject();
+        data.SetData("Type", item.GetType());
+        data.SetData("Value", item);
+        if (ReadOnly) {
+          DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
+        } else {
+          DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
+          if ((result & DragDropEffects.Move) == DragDropEffects.Move)
+            Content.Remove(item.Key);
+        }
+      }
+    }
+    protected virtual void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      Type type = e.Data.GetData("Type") as Type;
+      if (!ReadOnly && (type != null) && (typeof(T).IsAssignableFrom(type))) {
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
+        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
+        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void itemsListView_DragDrop(object sender, DragEventArgs e) {
+      //if (e.Effect != DragDropEffects.None) {
+      //  K item = e.Data.GetData("Value") as K;
+      //  if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) item = (T)item.Clone();
+      //  Content.Add(item);
+      //}
+      throw new NotImplementedException();
+    }
+    #endregion
+
+    #region Button Events
+    protected virtual void addButton_Click(object sender, EventArgs e) {
+      //T item = CreateItem();
+      //if (item != null)
+      //  Content.Add(item);
+      throw new NotImplementedException();
+    }
+    protected virtual void sortAscendingButton_Click(object sender, EventArgs e) {
+      SortItemsListView(SortOrder.Ascending);
+    }
+    protected virtual void sortDescendingButton_Click(object sender, EventArgs e) {
+      SortItemsListView(SortOrder.Descending);
+    }
+    protected virtual void removeButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in itemsListView.SelectedItems)
+          Content.Remove(((KeyValuePair<K, T>)item.Tag).Key);
+        itemsListView.SelectedItems.Clear();
+      }
+    }
+    #endregion
+
+    #region CheckBox Events
+    protected virtual void showDetailsCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (showDetailsCheckBox.Checked) {
+        splitContainer.Panel2Collapsed = false;
+        detailsGroupBox.Enabled = itemsListView.SelectedItems.Count == 1;
+        viewHost.Content = itemsListView.SelectedItems.Count == 1 ? ((KeyValuePair<K, T>)itemsListView.SelectedItems[0].Tag).Value : null;
+      } else {
+        splitContainer.Panel2Collapsed = true;
+        viewHost.Content = null;
+      }
+    }
+    #endregion
+
+    #region Content Events
+    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<KeyValuePair<K, T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_ItemsAdded), sender, e);
+      else {
+        foreach (KeyValuePair<K, T> item in e.Items)
+          AddListViewItem(CreateListViewItem(item));
+        AdjustListViewColumnSizes();
+      }
+
+    }
+    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<KeyValuePair<K, T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_ItemsRemoved), sender, e);
+      else {
+        foreach (KeyValuePair<K, T> item in e.Items) {
+          //remove only the first matching ListViewItem, because the IItem could be contained multiple times in the ItemCollection
+          ListViewItem listviewItem = GetListViewItemsForItem(item).FirstOrDefault();
+          if (listviewItem != null) RemoveListViewItem(listviewItem);
+        }
+        RebuildImageList();
+      }
+    }
+    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<KeyValuePair<K, T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_CollectionReset), sender, e);
+      else {
+        foreach (KeyValuePair<K, T> item in e.OldItems) {
+          //remove only the first matching ListViewItem, because the IItem could be contained multiple times in the ItemCollection
+          ListViewItem listviewItem = GetListViewItemsForItem(item).FirstOrDefault();
+          if (listviewItem != null) RemoveListViewItem(listviewItem);
+        }
+        RebuildImageList();
+        foreach (KeyValuePair<K, T> item in e.Items)
+          AddListViewItem(CreateListViewItem(item));
+      }
+    }
+    #endregion
+
+    #region Item Events
+    protected virtual void Item_ItemImageChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
+      else {
+        KeyValuePair<K, T> item = (KeyValuePair<K, T>)sender;
+        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
+          UpdateListViewItemImage(listViewItem);
+      }
+    }
+    protected virtual void Item_ToStringChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ToStringChanged), sender, e);
+      else {
+        KeyValuePair<K, T> item = (KeyValuePair<K, T>)sender;
+        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
+          UpdateListViewItemText(listViewItem);
+      }
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual void SortItemsListView(SortOrder sortOrder) {
+      itemsListView.Sorting = SortOrder.None;
+      itemsListView.Sorting = sortOrder;
+      itemsListView.Sorting = SortOrder.None;
+    }
+    protected virtual void AdjustListViewColumnSizes() {
+      if (itemsListView.Items.Count > 0) {
+        for (int i = 0; i < itemsListView.Columns.Count; i++)
+          itemsListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+      }
+    }
+    protected virtual void RebuildImageList() {
+      itemsListView.SmallImageList.Images.Clear();
+      foreach (ListViewItem listViewItem in itemsListView.Items) {
+        KeyValuePair<K, T> item = (KeyValuePair<K, T>)listViewItem.Tag;
+        itemsListView.SmallImageList.Images.Add(item.Value.ItemImage);
+        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/MenuItems/CreateExperimentMenuItemV2.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/MenuItems/CreateExperimentMenuItemV2.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/MenuItems/CreateExperimentMenuItemV2.cs	(revision 8517)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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;
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Core;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimizer;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  public class CreateExperimentMenuItemV2 : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
+    public override string Name {
+      get { return "Create Experiment (v2)"; }
+    }
+    public override IEnumerable<string> Structure {
+      get { return new string[] { "&Edit" }; }
+    }
+    public override int Position {
+      get { return 2400; }
+    }
+    public override string ToolTipText {
+      get { return "Create an experiment for the shown optimizer"; }
+    }
+
+    protected override void OnToolStripItemSet(EventArgs e) {
+      ToolStripItem.Enabled = false;
+    }
+    protected override void OnActiveViewChanged(object sender, EventArgs e) {
+      IContentView activeView = MainFormManager.MainForm.ActiveView as IContentView;
+      ToolStripItem.Enabled = (activeView != null) && (activeView.Content != null) && (activeView.Content is IAlgorithm) && !activeView.Locked;
+    }
+
+    public override void Execute() {
+      IContentView activeView = MainFormManager.MainForm.ActiveView as IContentView;
+      if ((activeView != null) && (activeView.Content != null) && (activeView.Content is IAlgorithm) && !activeView.Locked) {
+        using (CreateExperimentDialogV2 dialog = new CreateExperimentDialogV2((IAlgorithm)activeView.Content, ApplicationManager.Manager.GetInstances<IEngine>())) {
+          if (dialog.ShowDialog() == DialogResult.OK) MainFormManager.MainForm.ShowContent(dialog.Experiment);
+        }
+      }
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/MessageItem.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/MessageItem.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/MessageItem.cs	(revision 8517)
@@ -0,0 +1,30 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  /// <summary>
+  /// used to display messages in a viewhost
+  /// </summary>
+  public class MessageItem : NamedItem {
+    public override bool CanChangeDescription { get { return !initialized; } }
+    public override bool CanChangeName { get { return !initialized; } }
+    private bool initialized = false;
+
+    public MessageItem() {
+      this.Name = "MessageItem";
+    }
+    public MessageItem(string message)
+      : this() {
+      this.Name = message;
+      this.Description = "This item represents a message to the user.";
+      this.initialized = true;
+    }
+    protected MessageItem(MessageItem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MessageItem();
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ObjectSelectorDialog.Designer.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ObjectSelectorDialog.Designer.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ObjectSelectorDialog.Designer.cs	(revision 8517)
@@ -0,0 +1,120 @@
+﻿namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  partial class ObjectSelectorDialog<T> {
+    /// <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.itemsListView = new System.Windows.Forms.ListView();
+      this.nameColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.descriptionColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.typeColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.okButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // itemsListView
+      // 
+      this.itemsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.itemsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameColumnHeader,
+            this.descriptionColumnHeader,
+            this.typeColumnHeader});
+      this.itemsListView.FullRowSelect = true;
+      this.itemsListView.HideSelection = false;
+      this.itemsListView.Location = new System.Drawing.Point(12, 12);
+      this.itemsListView.MultiSelect = false;
+      this.itemsListView.Name = "itemsListView";
+      this.itemsListView.Size = new System.Drawing.Size(653, 360);
+      this.itemsListView.TabIndex = 2;
+      this.itemsListView.UseCompatibleStateImageBehavior = false;
+      this.itemsListView.View = System.Windows.Forms.View.Details;
+      this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
+      this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
+      // 
+      // nameColumnHeader
+      // 
+      this.nameColumnHeader.Text = "Name";
+      this.nameColumnHeader.Width = 91;
+      // 
+      // descriptionColumnHeader
+      // 
+      this.descriptionColumnHeader.Text = "Description";
+      this.descriptionColumnHeader.Width = 187;
+      // 
+      // typeColumnHeader
+      // 
+      this.typeColumnHeader.Text = "Type";
+      this.typeColumnHeader.Width = 240;
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(590, 378);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 5;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Enabled = false;
+      this.okButton.Location = new System.Drawing.Point(509, 378);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 4;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // ObjectSelectorDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(677, 413);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.Controls.Add(this.itemsListView);
+      this.Name = "ObjectSelectorDialog";
+      this.Text = "ObjectSelectorDialog";
+      this.Load += new System.EventHandler(this.ObjectSelectorDialog_Load);
+      this.Shown += new System.EventHandler(this.ObjectSelectorDialog_Shown);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ListView itemsListView;
+    private System.Windows.Forms.ColumnHeader nameColumnHeader;
+    private System.Windows.Forms.ColumnHeader descriptionColumnHeader;
+    private System.Windows.Forms.ColumnHeader typeColumnHeader;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.Button okButton;
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ObjectSelectorDialog.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ObjectSelectorDialog.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ObjectSelectorDialog.cs	(revision 8517)
@@ -0,0 +1,81 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  public partial class ObjectSelectorDialog<T> : Form where T : IItem {
+    private bool initialized;
+    private List<IItem> items;
+    private IEnumerable<IGrouping<string, T>> selectableItems;
+
+    private T item;
+    public T Item {
+      get { return item; }
+    }
+
+    public ObjectSelectorDialog(IEnumerable<IGrouping<string, T>> selectableItems) {
+      this.initialized = false;
+      this.items = new List<IItem>();
+      this.item = default(T);
+      this.selectableItems = selectableItems;
+      InitializeComponent();
+    }
+
+    private void ObjectSelectorDialog_Load(object sender, EventArgs e) {
+      if (!initialized) {
+        itemsListView.SmallImageList = new ImageList();
+
+        foreach (IGrouping<string, T> item in selectableItems) {
+          ListViewGroup group = new ListViewGroup(item.Key);
+          itemsListView.Groups.Add(group);
+          foreach (T i in item) {
+            items.Add(i);
+            string[] columns;
+            if (i is INamedItem) {
+              INamedItem ni = i as INamedItem;
+              columns = new string[] { ni.Name, ni.Description, ni.GetType().Name };
+            } else {
+              columns = new string[] { i.ItemName, i.ItemDescription, i.GetType().Name };
+            }
+            ListViewItem value = new ListViewItem(columns, group);
+            itemsListView.SmallImageList.Images.Add(i.ItemImage);
+            value.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+            value.Tag = i;
+            itemsListView.Items.Add(value);
+          }
+        }
+        for (int i = 0; i < itemsListView.Columns.Count; i++)
+          itemsListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+        initialized = true;
+      }
+    }
+
+    private void ObjectSelectorDialog_Shown(object sender, EventArgs e) {
+      item = default(T);
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        item = (T)itemsListView.SelectedItems[0].Tag;
+        DialogResult = DialogResult.OK;
+        Close();
+      }
+    }
+
+    private void itemsListView_DoubleClick(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        item = (T)itemsListView.SelectedItems[0].Tag;
+        DialogResult = DialogResult.OK;
+        Close();
+      }
+    }
+
+    private void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      okButton.Enabled = itemsListView.SelectedItems.Count == 1;
+    }
+
+
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/OptimizableView.Designer.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/OptimizableView.Designer.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/OptimizableView.Designer.cs	(revision 8517)
@@ -0,0 +1,75 @@
+﻿namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  partial class OptimizableView {
+    /// <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.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.optimizeCheckBox = new System.Windows.Forms.CheckBox();
+      this.SuspendLayout();
+      // 
+      // viewHost
+      // 
+      this.viewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.viewHost.Caption = "View";
+      this.viewHost.Content = null;
+      this.viewHost.Enabled = false;
+      this.viewHost.Location = new System.Drawing.Point(0, 21);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(513, 345);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewsLabelVisible = false;
+      this.viewHost.ViewType = null;
+      // 
+      // optimizeCheckBox
+      // 
+      this.optimizeCheckBox.AutoSize = true;
+      this.optimizeCheckBox.Location = new System.Drawing.Point(3, 3);
+      this.optimizeCheckBox.Name = "optimizeCheckBox";
+      this.optimizeCheckBox.Size = new System.Drawing.Size(66, 17);
+      this.optimizeCheckBox.TabIndex = 1;
+      this.optimizeCheckBox.Text = "Optimize";
+      this.optimizeCheckBox.UseVisualStyleBackColor = true;
+      this.optimizeCheckBox.CheckedChanged += new System.EventHandler(this.optimizeCheckBox_CheckedChanged);
+      // 
+      // OptimizableView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.optimizeCheckBox);
+      this.Controls.Add(this.viewHost);
+      this.Name = "OptimizableView";
+      this.Size = new System.Drawing.Size(513, 366);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private MainForm.WindowsForms.ViewHost viewHost;
+    private System.Windows.Forms.CheckBox optimizeCheckBox;
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/OptimizableView.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/OptimizableView.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/OptimizableView.cs	(revision 8517)
@@ -0,0 +1,121 @@
+﻿using System;
+using System.Linq;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  [View("IOptimizable View")]
+  [Content(typeof(IOptimizable), IsDefaultView = false)]
+  [Content(typeof(ParameterConfiguration), IsDefaultView = true)]
+  [Content(typeof(ValueConfiguration), IsDefaultView = true)]
+  public sealed partial class OptimizableView : ItemView {
+    public new IOptimizable Content {
+      get { return (IOptimizable)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public OptimizableView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.OptimizeChanged -= new EventHandler(Content_OptimizeChanged);
+      Content.IsOptimizableChanged -= new EventHandler(Content_IsOptimizabeChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.IsOptimizableChanged += new EventHandler(Content_IsOptimizabeChanged);
+      Content.OptimizeChanged += new EventHandler(Content_OptimizeChanged);
+    }
+
+    #region Event Handlers (Content)
+    void Content_OptimizeChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_OptimizeChanged), sender, e);
+      } else {
+        this.optimizeCheckBox.Checked = Content.Optimize;
+        if (Content.Optimize) {
+          this.viewHost.ViewType = null;
+
+          var pc = Content as IParameterConfiguration;
+          var vc = Content as IValueConfiguration;
+
+          if (pc != null) {
+            if (pc is SingleValuedParameterConfiguration) {
+              this.viewHost.Content = ((ParameterizedValueConfiguration)pc.ValueConfigurations.Single()).ParameterConfigurations;
+            } else {
+              this.viewHost.Content = pc.ValueConfigurations;
+            }
+          } else if (vc != null) {
+            var rvc = Content as RangeValueConfiguration;
+            if (rvc != null) {
+              if (Content.ActualValue.ValueDataType == typeof(IntValue) ||
+                Content.ActualValue.ValueDataType == typeof(DoubleValue) ||
+                Content.ActualValue.ValueDataType == typeof(PercentValue)) {
+                this.viewHost.ViewsLabelVisible = true;
+                this.viewHost.Content = rvc.RangeConstraint;
+              } else if (Content.ActualValue.ValueDataType == typeof(BoolValue)) {
+                this.viewHost.Content = null; // no configuration required
+              }
+            }
+
+            var pvc = Content as ParameterizedValueConfiguration;
+            if (pvc != null) {
+              this.viewHost.ViewsLabelVisible = false;
+              this.viewHost.Content = pvc.ParameterConfigurations;
+            }
+
+            //var symbolicVc = Content as SymbolicExpressionGrammarValueConfiguration;
+            //if (symbolicVc != null) {
+            //  this.viewHost.ViewsLabelVisible = false;
+            //  this.viewHost.Content = symbolicVc.ParameterConfigurations;
+            //}
+          } else {
+            throw new NotSupportedException("Only IParameterConfiguration and IValueConfiguration types are allowed.");
+          }
+        } else {
+          this.viewHost.ViewsLabelVisible = false;
+          if (Content.ValuesReadOnly) {
+            this.viewHost.Content = new MessageItem("Cannot modify value directly. Please modify the value in the list of problems.");
+          } else {
+            this.viewHost.Content = Content.ActualValue;
+          }
+        }
+      }
+      SetEnabledStateOfControls();
+    }
+    void Content_IsOptimizabeChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_IsOptimizabeChanged), sender, e);
+      } else {
+        SetEnabledStateOfControls();
+      }
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        Content_OptimizeChanged(this, EventArgs.Empty);
+      } else {
+        this.viewHost.Content = null;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content != null) {
+        this.optimizeCheckBox.Enabled = !this.ReadOnly && Content.IsOptimizable;
+      }
+    }
+
+    #region Event Handlers (child controls)
+    private void optimizeCheckBox_CheckedChanged(object sender, EventArgs e) {
+      Content.Optimize = optimizeCheckBox.Checked;
+    }
+    #endregion
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ParameterConfigurationTreeView.Designer.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ParameterConfigurationTreeView.Designer.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ParameterConfigurationTreeView.Designer.cs	(revision 8517)
@@ -0,0 +1,60 @@
+﻿using HeuristicLab.Core.Views;
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  partial class ParameterConfigurationTreeView {
+    /// <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.listView = new ItemCollectionView<IParameterConfiguration>();
+      this.SuspendLayout();
+
+      //
+      // listView
+      //
+      this.listView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.listView.Caption = "ParameterConfigurationList View";
+      this.listView.Content = null;
+      this.listView.Location = new System.Drawing.Point(0, 0);
+      this.listView.Name = "listView";
+      this.listView.ReadOnly = false;
+      this.listView.Size = new System.Drawing.Size(556, 473);
+      this.listView.TabIndex = 1;
+      // 
+      // ParameterConfigurationTreeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(listView);
+      this.Name = "ParameterConfigurationTreeView";
+      this.Size = new System.Drawing.Size(556, 473);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private ItemCollectionView<IParameterConfiguration> listView;
+
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ParameterConfigurationTreeView.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ParameterConfigurationTreeView.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ParameterConfigurationTreeView.cs	(revision 8517)
@@ -0,0 +1,40 @@
+﻿using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  /// <summary>
+  /// The visual representation of a <see cref="ParameterConfiguration"/>.
+  /// </summary>
+  [View("ParameterConfiguration View")]
+  [Content(typeof(ParameterConfigurationTree), true)]
+  public partial class ParameterConfigurationTreeView : ItemView {
+    /// <summary>
+    /// Gets or sets the variable to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public new ParameterConfigurationTree Content {
+      get { return (ParameterConfigurationTree)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ParameterConfigurationTreeView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        listView.Content = Content.ParameterConfigurations;
+      } else {
+        listView.Content = null;
+      }
+      SetEnabledStateOfControls();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/Plugin.cs.frame
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/Plugin.cs.frame	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/Plugin.cs.frame	(revision 8517)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Encodings.ParameterConfigurationEncoding.Views plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Encodings.ParameterConfigurationEncoding.Views", "3.3.7.$WCREV$")]
+  [PluginFile("HeuristicLab.Encodings.ParameterConfigurationEncoding.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Data.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.ParameterConfigurationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Optimizer", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters.Views", "3.3")]
+  public class HeuristicLabEncodingsParameterConfigurationEncodingViewsPlugin : PluginBase {
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 8517)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.InteropServices;
+
+// 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.Encodings.ParameterConfigurationEncoding.Views")]
+[assembly: AssemblyDescription("Views for HeuristicLab parameter configuration encoding and related operators")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-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("7ebb2ee7-1a81-48de-a2ed-0f259e38e11e")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.7.$WCREV$")]
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/RangeView.Designer.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/RangeView.Designer.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/RangeView.Designer.cs	(revision 8517)
@@ -0,0 +1,126 @@
+﻿namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  partial class RangeView {
+    /// <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.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.lowerValueView = new HeuristicLab.Data.Views.StringConvertibleValueView();
+      this.upperValueView = new HeuristicLab.Data.Views.StringConvertibleValueView();
+      this.label3 = new System.Windows.Forms.Label();
+      this.stepSizeValueView = new HeuristicLab.Data.Views.StringConvertibleValueView();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 3);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(36, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "Lower";
+      // 
+      // 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(36, 13);
+      this.label2.TabIndex = 1;
+      this.label2.Text = "Upper";
+      // 
+      // lowerValueView
+      // 
+      this.lowerValueView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.lowerValueView.Caption = "StringConvertibleValue View";
+      this.lowerValueView.Content = null;
+      this.lowerValueView.LabelVisible = true;
+      this.lowerValueView.Location = new System.Drawing.Point(38, 0);
+      this.lowerValueView.Name = "lowerValueView";
+      this.lowerValueView.ReadOnly = false;
+      this.lowerValueView.Size = new System.Drawing.Size(396, 23);
+      this.lowerValueView.TabIndex = 2;
+      // 
+      // upperValueView
+      // 
+      this.upperValueView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.upperValueView.Caption = "StringConvertibleValue View";
+      this.upperValueView.Content = null;
+      this.upperValueView.LabelVisible = true;
+      this.upperValueView.Location = new System.Drawing.Point(38, 29);
+      this.upperValueView.Name = "upperValueView";
+      this.upperValueView.ReadOnly = false;
+      this.upperValueView.Size = new System.Drawing.Size(396, 23);
+      this.upperValueView.TabIndex = 3;
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(3, 61);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(29, 13);
+      this.label3.TabIndex = 4;
+      this.label3.Text = "Step";
+      // 
+      // stepSizeValueView
+      // 
+      this.stepSizeValueView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.stepSizeValueView.Caption = "StringConvertibleValue View";
+      this.stepSizeValueView.Content = null;
+      this.stepSizeValueView.LabelVisible = true;
+      this.stepSizeValueView.Location = new System.Drawing.Point(38, 58);
+      this.stepSizeValueView.Name = "stepSizeValueView";
+      this.stepSizeValueView.ReadOnly = false;
+      this.stepSizeValueView.Size = new System.Drawing.Size(396, 23);
+      this.stepSizeValueView.TabIndex = 5;
+      // 
+      // RangeView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.label3);
+      this.Controls.Add(this.stepSizeValueView);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.upperValueView);
+      this.Controls.Add(this.lowerValueView);
+      this.Name = "RangeView";
+      this.Size = new System.Drawing.Size(434, 85);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+    private Data.Views.StringConvertibleValueView lowerValueView;
+    private Data.Views.StringConvertibleValueView upperValueView;
+    private System.Windows.Forms.Label label3;
+    private Data.Views.StringConvertibleValueView stepSizeValueView;
+
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/RangeView.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/RangeView.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/RangeView.cs	(revision 8517)
@@ -0,0 +1,50 @@
+﻿using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  /// <summary>
+  /// The visual representation of a <see cref="IRange"/>.
+  /// </summary>
+  [View("Range View")]
+  [Content(typeof(IRange<>), false)]
+  public partial class RangeView : ItemView {
+    /// <summary>
+    /// Gets or sets the variable to represent visually.
+    /// </summary>
+    public new IRange Content {
+      get { return (IRange)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public RangeView() {
+      InitializeComponent();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        lowerValueView.Content = (IStringConvertibleValue)Content.LowerBound;
+        upperValueView.Content = (IStringConvertibleValue)Content.UpperBound;
+        stepSizeValueView.Content = (IStringConvertibleValue)Content.StepSize;
+      } else {
+        lowerValueView.Content = null;
+        upperValueView.Content = null;
+        stepSizeValueView.Content = null;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.Designer.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.Designer.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.Designer.cs	(revision 8517)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  partial class ValueConfigurationCheckedItemCollectionView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.cs	(revision 8517)
@@ -0,0 +1,66 @@
+﻿using System;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  [View("ValueConfigurationList View")]
+  [Content(typeof(ICheckedValueConfigurationList), IsDefaultView = true)]
+  public sealed partial class ValueConfigurationCheckedItemCollectionView : CheckedItemListView<IValueConfiguration> {
+    public new ICheckedValueConfigurationList Content {
+      get { return (ICheckedValueConfigurationList)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ValueConfigurationCheckedItemCollectionView() {
+      InitializeComponent();
+      this.viewHost.ViewsLabelVisible = false;
+    }
+
+    #region Event Handlers (Content)
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        SetEnabledStateOfControls();
+      } else {
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content != null) this.removeButton.Enabled = Content.Count > Content.MinItemCount;
+    }
+
+    #region Event Handlers (child controls)
+    protected override void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      base.itemsListView_SelectedIndexChanged(sender, e);
+      this.removeButton.Enabled = removeButton.Enabled && (Content.Count > Content.MinItemCount);
+    }
+    #endregion
+
+    protected override IValueConfiguration CreateItem() {
+      var objectSelectorDialog = new ObjectSelectorDialog<IItem>(Content.ValidValues.GroupBy(x => ApplicationManager.Manager.GetDeclaringPlugin(x.GetType()).Name));
+      if (objectSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          IItem value = (IItem)objectSelectorDialog.Item.Clone();
+          if (value is NullValue) {
+            return new NullValueConfiguration();
+          } else if (value is IParameterizedItem) {
+            return new ParameterizedValueConfiguration(value, value.GetType(), true);
+          } else {
+            return new RangeValueConfiguration(value, value.GetType());
+          }
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/ValueView.Designer.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/ValueView.Designer.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/ValueView.Designer.cs	(revision 8517)
@@ -0,0 +1,106 @@
+﻿namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  partial class ValueView {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ValueView));
+      this.valueGroupBox = new System.Windows.Forms.GroupBox();
+      this.valueViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.clearValueButton = new System.Windows.Forms.Button();
+      this.setValueButton = new System.Windows.Forms.Button();
+      this.valueGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // valueGroupBox
+      // 
+      this.valueGroupBox.AllowDrop = true;
+      this.valueGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.valueGroupBox.Controls.Add(this.valueViewHost);
+      this.valueGroupBox.Controls.Add(this.clearValueButton);
+      this.valueGroupBox.Controls.Add(this.setValueButton);
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.valueGroupBox.Name = "valueGroupBox";
+      this.valueGroupBox.Size = new System.Drawing.Size(482, 274);
+      this.valueGroupBox.TabIndex = 7;
+      this.valueGroupBox.TabStop = false;
+      this.valueGroupBox.Text = "Value";
+      // 
+      // valueViewHost
+      // 
+      this.valueViewHost.AllowDrop = true;
+      this.valueViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.valueViewHost.Caption = "View";
+      this.valueViewHost.Content = null;
+      this.valueViewHost.Enabled = false;
+      this.valueViewHost.Location = new System.Drawing.Point(6, 49);
+      this.valueViewHost.Name = "valueViewHost";
+      this.valueViewHost.ReadOnly = false;
+      this.valueViewHost.Size = new System.Drawing.Size(470, 219);
+      this.valueViewHost.TabIndex = 3;
+      this.valueViewHost.ViewsLabelVisible = false;
+      this.valueViewHost.ViewType = null;
+      // 
+      // clearValueButton
+      // 
+      this.clearValueButton.Enabled = false;
+      this.clearValueButton.Image = ((System.Drawing.Image)(resources.GetObject("clearValueButton.Image")));
+      this.clearValueButton.Location = new System.Drawing.Point(36, 19);
+      this.clearValueButton.Name = "clearValueButton";
+      this.clearValueButton.Size = new System.Drawing.Size(24, 24);
+      this.clearValueButton.TabIndex = 1;
+      this.clearValueButton.UseVisualStyleBackColor = true;
+      this.clearValueButton.Click += new System.EventHandler(this.clearValueButton_Click);
+      // 
+      // setValueButton
+      // 
+      this.setValueButton.Image = ((System.Drawing.Image)(resources.GetObject("setValueButton.Image")));
+      this.setValueButton.Location = new System.Drawing.Point(6, 19);
+      this.setValueButton.Name = "setValueButton";
+      this.setValueButton.Size = new System.Drawing.Size(24, 24);
+      this.setValueButton.TabIndex = 0;
+      this.setValueButton.UseVisualStyleBackColor = true;
+      this.setValueButton.Click += new System.EventHandler(this.setValueButton_Click);
+      // 
+      // ValueView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.valueGroupBox);
+      this.Name = "ValueView";
+      this.Size = new System.Drawing.Size(482, 274);
+      this.valueGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox valueGroupBox;
+    protected MainForm.WindowsForms.ViewHost valueViewHost;
+    protected System.Windows.Forms.Button clearValueButton;
+    protected System.Windows.Forms.Button setValueButton;
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/ValueView.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/ValueView.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding.Views/3.3/ValueConfigurationViews/ValueView.cs	(revision 8517)
@@ -0,0 +1,62 @@
+﻿using System;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding.Views {
+  [View("Value View")]
+  [Content(typeof(ConstrainedValue), true)]
+  public partial class ValueView : ItemView {
+
+    public new ConstrainedValue Content {
+      get { return (ConstrainedValue)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ValueView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        valueViewHost.Content = Content.Value;
+      } else {
+        valueViewHost.Content = null;
+      }
+      SetEnabledStateOfControls();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content != null) {
+        clearValueButton.Enabled = Content.Value != null && Content.IsNullable; // IsNullable ist in diesem fall nicht richtig gesetzt
+        setValueButton.Enabled = Content.ValueDataType != null;
+      }
+    }
+
+    private void setValueButton_Click(object sender, EventArgs e) {
+      var withoutNullValue = Content.ValidValues.Where(x => x != null && !(x is NullValue));
+      var objectSelectorDialog = new ObjectSelectorDialog<IItem>(withoutNullValue.GroupBy(x => ApplicationManager.Manager.GetDeclaringPlugin(x.GetType()).Name));
+      if (objectSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          Content.Value = objectSelectorDialog.Item;
+          valueViewHost.Content = Content.Value;
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      SetEnabledStateOfControls();
+    }
+
+    private void clearValueButton_Click(object sender, EventArgs e) {
+      Content.Value = null;
+      valueViewHost.Content = null;
+      SetEnabledStateOfControls();
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/AlgorithmProblemItem.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/AlgorithmProblemItem.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/AlgorithmProblemItem.cs	(revision 8517)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class AlgorithmProblemItem : ParameterizedNamedItem {
+    #region Parameter Properties
+    public IValueParameter<IAlgorithm> AlgorithmParameter {
+      get { return (ValueParameter<IAlgorithm>)Parameters["Algorithm"]; }
+    }
+    public IValueParameter<IProblem> ProblemParameter {
+      get { return (ValueParameter<IProblem>)Parameters["Problem"]; }
+    }
+    #endregion
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected AlgorithmProblemItem(bool deserializing) : base(deserializing) { }
+    public AlgorithmProblemItem() {
+      this.Parameters.Add(new ValueParameter<IAlgorithm>("Algorithm"));
+      this.Parameters.Add(new ValueParameter<IProblem>("Problem"));
+    }
+    protected AlgorithmProblemItem(AlgorithmProblemItem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlgorithmProblemItem(this, cloner);
+    }
+    #endregion
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ConstrainedItemList.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ConstrainedItemList.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ConstrainedItemList.cs	(revision 8517)
@@ -0,0 +1,34 @@
+﻿using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class ConstrainedItemList<T> : ItemList<T> where T : class, IItem {
+    [Storable]
+    private Type type;
+    public Type Type {
+      get { return type; }
+      set {
+        if (type != value) {
+          type = value;
+          this.RemoveAll(x => x.GetType() != type);
+        }
+      }
+    }
+
+    public ConstrainedItemList() {
+      Type = typeof(T);
+    }
+    [StorableConstructor]
+    protected ConstrainedItemList(bool deserializing) : base(deserializing) { }
+    protected ConstrainedItemList(ConstrainedItemList<T> original, Cloner cloner)
+      : base(original, cloner) {
+      this.Type = original.Type;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedItemList<T>(this, cloner);
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ConstrainedTypeValue.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ConstrainedTypeValue.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ConstrainedTypeValue.cs	(revision 8517)
@@ -0,0 +1,76 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [Item("ConstrainedTypeValue", "Represents a type with constraints.")]
+  [StorableClass]
+  public class ConstrainedTypeValue : TypeValue {
+
+    private IEnumerable<Type> validTypes;
+    public IEnumerable<Type> ValidTypes {
+      get { return validTypes; }
+      set { validTypes = value; }
+    }
+
+    public override Type Value {
+      set {
+        if (!ValidTypes.Contains(value)) throw new NotSupportedException("Value cannot be set. Type is not enlisted in ValidTypes");
+        base.Value = value;
+      }
+    }
+
+    public ConstrainedTypeValue()
+      : base() {
+      this.readOnly = false;
+    }
+    public ConstrainedTypeValue(Type value)
+      : this() {
+      this.Value = value;
+    }
+
+    [StorableConstructor]
+    protected ConstrainedTypeValue(bool deserializing) : base(deserializing) { }
+    protected ConstrainedTypeValue(ConstrainedTypeValue original, Cloner cloner)
+      : base(original, cloner) {
+      if (original.validTypes != null)
+        this.validTypes = new List<Type>(original.validTypes);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedTypeValue(this, cloner);
+    }
+  }
+
+  [Item("ConstrainedTypeValue<>", "Represents a type with constraints.")]
+  [StorableClass]
+  public class ConstrainedTypeValue<T> : ConstrainedTypeValue where T : class, IItem {
+
+    public ConstrainedTypeValue()
+      : base() {
+      this.ValidTypes = ApplicationManager.Manager.GetTypes(typeof(T), true).ToList();
+      this.Value = ValidTypes.First();
+    }
+    public ConstrainedTypeValue(Type value)
+      : base() {
+      this.ValidTypes = ApplicationManager.Manager.GetTypes(typeof(T), true).ToList();
+      this.Value = value;
+    }
+
+    [StorableConstructor]
+    protected ConstrainedTypeValue(bool deserializing)
+      : base(deserializing) {
+      if (deserializing) {
+        this.ValidTypes = ApplicationManager.Manager.GetTypes(typeof(T), true).ToList();
+      }
+    }
+
+    protected ConstrainedTypeValue(ConstrainedTypeValue original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedTypeValue<T>(this, cloner);
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/HeuristicLab.Encodings.ParameterConfigurationEncoding-3.3.csproj
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/HeuristicLab.Encodings.ParameterConfigurationEncoding-3.3.csproj	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/HeuristicLab.Encodings.ParameterConfigurationEncoding-3.3.csproj	(revision 8517)
@@ -0,0 +1,141 @@
+﻿<?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>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{7520D3F4-7526-4BB7-B71E-F41F5D5559F9}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Encodings.ParameterConfigurationEncoding</RootNamespace>
+    <AssemblyName>HeuristicLab.Encodings.ParameterConfigurationEncoding-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic-3.4">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AlgorithmProblemItem.cs" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="ConstrainedItemList.cs" />
+    <Compile Include="ConstrainedTypeValue.cs" />
+    <Compile Include="Interfaces\ICheckedValueConfigurationCollection.cs" />
+    <Compile Include="Interfaces\IOptimizable.cs" />
+    <Compile Include="Interfaces\IParameterConfiguration.cs" />
+    <Compile Include="Interfaces\IRange.cs" />
+    <Compile Include="Interfaces\IValueConfiguration.cs" />
+    <Compile Include="NullValue.cs" />
+    <Compile Include="ParameterCombinationsEnumerator.cs" />
+    <Compile Include="ParameterConfigurations\ParameterConfiguration.cs" />
+    <Compile Include="ParameterConfigurations\SingleValuedParameterConfiguration.cs" />
+    <Compile Include="ParameterConfigurationTree.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="RangeConstraints\ConstrainedValue.cs" />
+    <Compile Include="RangeConstraints\DoubleValueRange.cs" />
+    <Compile Include="RangeConstraints\IntValueRange.cs" />
+    <Compile Include="RangeConstraints\PercentValueRange.cs" />
+    <Compile Include="RangeConstraints\Range.cs" />
+    <Compile Include="SymbolicExpressionGrammar\SymbolicExpressionGrammarValueConfiguration.cs" />
+    <Compile Include="SymbolicExpressionGrammar\SymbolValueConfiguration.cs" />
+    <Compile Include="TypeValue.cs" />
+    <Compile Include="ValueConfigurations\CheckedValueConfigurationCollection.cs" />
+    <Compile Include="ValueConfigurations\NullValueConfiguration.cs" />
+    <Compile Include="ValueConfigurations\ParameterizedValueConfiguration.cs" />
+    <Compile Include="ValueConfigurations\RangeValueConfiguration.cs" />
+    <Compile Include="ValueConfigurations\ValueConfiguration.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- 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>
+  -->
+</Project>
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/ICheckedValueConfigurationCollection.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/ICheckedValueConfigurationCollection.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/ICheckedValueConfigurationCollection.cs	(revision 8517)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  public interface ICheckedValueConfigurationList : ICheckedItemList<IValueConfiguration> {
+    int MinItemCount { get; }
+    IItemSet<IItem> ValidValues { get; }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IOptimizable.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IOptimizable.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IOptimizable.cs	(revision 8517)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Core;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  public interface IOptimizable : IItem {
+    bool IsOptimizable { get; }
+    bool Optimize { get; set; }
+    ConstrainedValue ActualValue { get; set; }
+
+    void Randomize(IRandom random);
+    string ParameterInfoString { get; }
+    void CollectOptimizedParameterNames(List<string> parameterNames, string prefix);
+    double CalculateSimilarity(IOptimizable optimizable);
+
+    /// <summary>
+    /// Recursively gets all optimizables which have Optimize=true
+    /// </summary>
+    List<IOptimizable> GetAllOptimizables();
+
+    event EventHandler IsOptimizableChanged;
+    event EventHandler OptimizeChanged;
+
+    /// <summary>
+    /// indicates if the actualvalues are modifiable
+    /// </summary>
+    bool ValuesReadOnly { get; set; }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IParameterConfiguration.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IParameterConfiguration.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IParameterConfiguration.cs	(revision 8517)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Core;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  public interface IParameterConfiguration : IOptimizable, INamedItem {
+    string ParameterName { get; set; }
+    Type ParameterDataType { get; }
+    ICheckedValueConfigurationList ValueConfigurations { get; }
+    Type[] ValidTypes { get; }
+    int ActualValueConfigurationIndex { get; set; }
+
+    void Parameterize(IValueParameter parameter);
+    void UpdateActualValueIndexToItem(IValueConfiguration vc);
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IRange.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IRange.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IRange.cs	(revision 8517)
@@ -0,0 +1,51 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  public interface IRange : IItem, IStringConvertibleValue {
+    object LowerBound { get; set; }
+    object UpperBound { get; set; }
+    object StepSize { get; set; }
+
+    event EventHandler LowerBoundChanged;
+    event EventHandler UpperBoundChanged;
+    event EventHandler StepSizeChanged;
+
+    IItem GetRandomValue(IRandom random);
+
+    IEnumerable<IItem> GetCombinations();
+
+    double CalculateSimilarity(IItem a, IItem b);
+  }
+
+  public interface IRange<T> : IRange, IItem where T : class {
+    new T LowerBound { get; set; }
+    new T UpperBound { get; set; }
+    new T StepSize { get; set; }
+    new T GetRandomValue(IRandom random);
+    new IEnumerable<T> GetCombinations();
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IValueConfiguration.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IValueConfiguration.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IValueConfiguration.cs	(revision 8517)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Encodings.ParameterConfigurationEncoding {
+  public interface IValueConfiguration : IOptimizable {
+    int Number { get; set; } // if larger than 0 it will be visible in the name. this can be used when multiple ValueConfiguration with the same name exist in a list
+    string NumberedName { get; }
+
+    event EventHandler ValueChanged;
+
+    //void Parameterize(IParameterizedItem item);
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/NullValue.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/NullValue.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/NullValue.cs	(revision 8517)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class NullValue : ValueTypeValue<int> {
+
+    public NullValue() { }
+    [StorableConstructor]
+    protected NullValue(bool deserializing) : base(deserializing) { }
+    protected NullValue(NullValue original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NullValue(this, cloner);
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterCombinationsEnumerator.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterCombinationsEnumerator.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterCombinationsEnumerator.cs	(revision 8517)
@@ -0,0 +1,182 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Core;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  public class ParameterCombinationsEnumerator : IEnumerator<IOptimizable> {
+    private IOptimizable node;
+    private List<IEnumerator> enumerators;
+    private EnumeratorCollectionEnumerator<IItem> valueEnumerator;
+    private bool initialized = false;
+
+    public ParameterCombinationsEnumerator(IOptimizable node) {
+      this.node = node;
+      this.enumerators = new List<IEnumerator>();
+    }
+
+    public IOptimizable Current {
+      get { return node; }
+    }
+    object IEnumerator.Current {
+      get {
+        if (!initialized)
+          throw new InvalidOperationException("Enumeration not started. Call MoveNext!");
+        return Current;
+      }
+    }
+
+    public void Dispose() { }
+
+    public bool MoveNext() {
+      if (!initialized) {
+        foreach (var enu in enumerators) {
+          enu.Reset();
+          if (!enu.MoveNext())
+            return false;
+        }
+        initialized = true;
+      } else {
+        int i = 0;
+        bool ok = false;
+        while (!ok && i < enumerators.Count) {
+          if (enumerators[i].MoveNext()) {
+            ok = true;
+          } else {
+            i++;
+          }
+        }
+
+        if (ok) {
+          for (int k = i - 1; k >= 0; k--) {
+            enumerators[k].Reset();
+            enumerators[k].MoveNext();
+          }
+        } else {
+          return false;
+        }
+      }
+
+      var pc = node as IParameterConfiguration;
+      if (pc != null && valueEnumerator != null) {
+        pc.ActualValue = ((IValueConfiguration)valueEnumerator.Current).ActualValue;
+        pc.UpdateActualValueIndexToItem((IValueConfiguration)valueEnumerator.Current);
+      }
+      var vc = node as IValueConfiguration;
+      if (vc != null && valueEnumerator != null) {
+        vc.ActualValue.Value = (IItem)valueEnumerator.Current;
+      }
+      return true;
+    }
+
+    public void Reset() {
+      enumerators.Clear();
+      valueEnumerator = null;
+      initialized = false;
+
+      var pc = node as IParameterConfiguration;
+      if (pc != null) {
+        valueEnumerator = new EnumeratorCollectionEnumerator<IItem>();
+
+        foreach (var valueConfiguration in pc.ValueConfigurations.CheckedItems) {
+          if (valueConfiguration.Value.Optimize) {
+            var enumerator = new ParameterCombinationsEnumerator(valueConfiguration.Value);
+            enumerator.Reset();
+            valueEnumerator.AddEnumerator(enumerator);
+          } else {
+            valueEnumerator.AddEnumerator(new List<IItem> { valueConfiguration.Value }.GetEnumerator());
+          }
+        }
+        valueEnumerator.Reset();
+        enumerators.Add(valueEnumerator);
+      }
+
+      var rangeVc = node as RangeValueConfiguration;
+      if (rangeVc != null) {
+        valueEnumerator = new EnumeratorCollectionEnumerator<IItem>();
+        valueEnumerator.AddEnumerator(rangeVc.RangeConstraint.GetCombinations().GetEnumerator());
+        valueEnumerator.Reset();
+        enumerators.Add(valueEnumerator);
+      }
+
+      var parameterizedVc = node as ParameterizedValueConfiguration;
+      if (parameterizedVc != null) {
+        foreach (var parameterConfiguration in parameterizedVc.ParameterConfigurations) {
+          if (parameterConfiguration.Optimize) {
+            var enumerator = new ParameterCombinationsEnumerator(parameterConfiguration);
+            enumerator.Reset();
+            enumerators.Add(enumerator);
+          }
+        }
+        enumerators.Reverse(); // this makes the list of combinations better readable
+      }
+    }
+  }
+
+  /// <summary>
+  /// Enumerator which can enumerate all elements of a list of enumerators
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  public class EnumeratorCollectionEnumerator<T> : IEnumerator<T> {
+    private List<IEnumerator<T>> enumerators = new List<IEnumerator<T>>();
+    private IEnumerator<IEnumerator<T>> currentEnumerator;
+
+    public EnumeratorCollectionEnumerator() { }
+
+    public void AddEnumerator(IEnumerator<T> enumerator) {
+      enumerators.Add(enumerator);
+    }
+
+    public void Dispose() { }
+
+    public T Current {
+      get { return currentEnumerator.Current.Current; }
+    }
+
+    object IEnumerator.Current {
+      get { return this.Current; }
+    }
+
+    public bool MoveNext() {
+      bool ok = currentEnumerator.Current.MoveNext();
+      if (!ok) {
+        ok = currentEnumerator.MoveNext();
+        if (!ok)
+          return false;
+        else
+          return this.MoveNext();
+      }
+      return true;
+    }
+
+    public void Reset() {
+      foreach (var enu in enumerators) {
+        enu.Reset();
+      }
+      currentEnumerator = enumerators.GetEnumerator();
+      currentEnumerator.Reset();
+      currentEnumerator.MoveNext();
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurationTree.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurationTree.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurationTree.cs	(revision 8517)
@@ -0,0 +1,400 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Linq;
+using System.Text;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  // todo: storable, name, descr, ...
+  [StorableClass]
+  public class ParameterConfigurationTree : ParameterizedValueConfiguration, IEnumerable {
+
+    [Storable]
+    private DoubleValue quality;
+    public DoubleValue Quality {
+      get { return quality; }
+      set {
+        if (quality != value) {
+          quality = value;
+          OnQualityChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private DoubleArray normalizedQualityAverages;
+    public DoubleArray NormalizedQualityAverages {
+      get { return normalizedQualityAverages; }
+      set {
+        if (normalizedQualityAverages != value) {
+          normalizedQualityAverages = value;
+        }
+      }
+    }
+
+    [Storable]
+    private DoubleArray normalizedQualityDeviations;
+    public DoubleArray NormalizedQualityDeviations {
+      get { return normalizedQualityDeviations; }
+      set {
+        if (normalizedQualityDeviations != value) {
+          normalizedQualityDeviations = value;
+        }
+      }
+    }
+
+    [Storable]
+    private DoubleArray normalizedEvaluatedSolutions;
+    public DoubleArray NormalizedEvaluatedSolutions {
+      get { return normalizedEvaluatedSolutions; }
+      set {
+        if (normalizedEvaluatedSolutions != value) {
+          normalizedEvaluatedSolutions = value;
+        }
+      }
+    }
+
+    [Storable]
+    private DoubleArray bestQualities;
+    public DoubleArray BestQualities {
+      get { return bestQualities; }
+      set {
+        if (bestQualities != value) {
+          bestQualities = value;
+        }
+      }
+    }
+
+    [Storable]
+    private DoubleArray averageQualities;
+    public DoubleArray AverageQualities {
+      get { return averageQualities; }
+      set { averageQualities = value; }
+    }
+
+    [Storable]
+    private DoubleArray worstQualities;
+    public DoubleArray WorstQualities {
+      get { return worstQualities; }
+      set { worstQualities = value; }
+    }
+
+    [Storable]
+    private DoubleArray qualityVariances;
+    public DoubleArray QualityVariances {
+      get { return qualityVariances; }
+      set { qualityVariances = value; }
+    }
+
+    [Storable]
+    private DoubleArray qualityStandardDeviations;
+    public DoubleArray QualityStandardDeviations {
+      get { return qualityStandardDeviations; }
+      set { qualityStandardDeviations = value; }
+    }
+
+    [Storable]
+    private ItemList<TimeSpanValue> averageExecutionTimes;
+    public ItemList<TimeSpanValue> AverageExecutionTimes {
+      get { return averageExecutionTimes; }
+      set { averageExecutionTimes = value; }
+    }
+
+    [Storable]
+    private DoubleArray averageEvaluatedSolutions;
+    public DoubleArray AverageEvaluatedSolutions {
+      get { return averageEvaluatedSolutions; }
+      set { averageEvaluatedSolutions = value; }
+    }
+
+    [Storable]
+    private IntValue repetitions;
+    public IntValue Repetitions {
+      get { return repetitions; }
+      set { repetitions = value; }
+    }
+
+    [Storable]
+    protected RunCollection runs;
+    public RunCollection Runs {
+      get { return runs; }
+      set { runs = value; }
+    }
+
+    [Storable]
+    protected IDictionary<string, IItem> parameters;
+    public IDictionary<string, IItem> Parameters {
+      get { return parameters; }
+      set { parameters = value; }
+    }
+
+    [Storable]
+    private double experimentGenerationProgress;
+    public double ExperimentGenerationProgress {
+      get { return experimentGenerationProgress; }
+      private set {
+        if (experimentGenerationProgress != value) {
+          experimentGenerationProgress = value;
+          OnExperimentGenerationProgressChanged();
+        }
+      }
+    }
+
+    public ParameterizedValueConfiguration AlgorithmConfiguration {
+      get {
+        return this.ParameterConfigurations.ElementAt(0).ValueConfigurations.First() as ParameterizedValueConfiguration;
+      }
+    }
+
+    public ParameterizedValueConfiguration ProblemConfiguration {
+      get {
+        return this.ParameterConfigurations.ElementAt(1).ValueConfigurations.First() as ParameterizedValueConfiguration;
+      }
+    }
+
+    #region constructors and cloning
+    public ParameterConfigurationTree(IAlgorithm algorithm, IProblem problem)
+      : base(null, algorithm.GetType(), false) {
+      this.Optimize = false;
+      this.IsOptimizable = false;
+      this.parameters = new Dictionary<string, IItem>();
+      this.Name = algorithm.ItemName;
+
+      var algproblemitem = new AlgorithmProblemItem();
+      algproblemitem.AlgorithmParameter.Value = algorithm;
+      algproblemitem.ProblemParameter.Value = problem;
+      this.discoverValidValues = false;
+
+      this.parameterConfigurations.Add(new SingleValuedParameterConfiguration("Algorithm", algproblemitem.AlgorithmParameter));
+      this.parameterConfigurations.Add(new SingleValuedParameterConfiguration("Problem", algproblemitem.ProblemParameter));
+
+      // problems can be modified in the list of problem instances, so the parameters which are not Optimize=true, 
+      // must not be modifiable in the parameter configuration tree. otherwise the parameter values would be ambiguous
+      ProblemConfiguration.ValuesReadOnly = true;
+    }
+    public ParameterConfigurationTree() { }
+    [StorableConstructor]
+    protected ParameterConfigurationTree(bool deserializing) : base(deserializing) { }
+    protected ParameterConfigurationTree(ParameterConfigurationTree original, Cloner cloner)
+      : base(original, cloner) {
+      this.quality = cloner.Clone(original.quality);
+      this.normalizedQualityAverages = cloner.Clone(original.normalizedQualityAverages);
+      this.normalizedQualityDeviations = cloner.Clone(original.normalizedQualityDeviations);
+      this.normalizedEvaluatedSolutions = cloner.Clone(original.normalizedEvaluatedSolutions);
+      this.bestQualities = cloner.Clone(original.BestQualities);
+      this.averageQualities = cloner.Clone(original.averageQualities);
+      this.worstQualities = cloner.Clone(original.worstQualities);
+      this.qualityStandardDeviations = cloner.Clone(original.qualityStandardDeviations);
+      this.qualityVariances = cloner.Clone(original.qualityVariances);
+      this.averageExecutionTimes = cloner.Clone(original.averageExecutionTimes);
+      this.averageEvaluatedSolutions = cloner.Clone(original.averageEvaluatedSolutions);
+      this.repetitions = cloner.Clone(original.repetitions);
+      this.runs = cloner.Clone(original.runs);
+      this.parameters = new Dictionary<string, IItem>();
+      if (original.parameters != null) {
+        foreach (var p in original.parameters) {
+          this.parameters.Add(p.Key, cloner.Clone(p.Value));
+        }
+      }
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterConfigurationTree(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (ProblemConfiguration != null) ProblemConfiguration.ValuesReadOnly = true;
+    }
+    #endregion
+
+    public virtual void CollectResultValues(IDictionary<string, IItem> values) {
+      values.Add("RunsAverageExecutionTimes", AverageExecutionTimes);
+      values.Add("RunsAverageEvaluatedSolutions", AverageEvaluatedSolutions);
+      values.Add("Repetitions", Repetitions);
+      values.Add("RunsBestQualities", BestQualities);
+      values.Add("RunsAverageQualities", AverageQualities);
+      values.Add("RunsWorstQualities", WorstQualities);
+      values.Add("RunsQualityVariances", QualityVariances);
+      values.Add("RunsQualityStandardDeviations", QualityStandardDeviations);
+      values.Add("QualitiesNormalized", NormalizedQualityAverages);
+      values.Add("AverageQualityNormalized", Quality);
+      values.Add("Runs", Runs);
+    }
+
+    public virtual void CollectParameterValues(IDictionary<string, IItem> values) {
+      foreach (var p in parameters) {
+        values.Add(p);
+      }
+    }
+
+    #region Events
+    public event EventHandler QualityChanged;
+    private void OnQualityChanged() {
+      var handler = QualityChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    private void Quality_ValueChanged(object sender, EventArgs e) {
+      OnQualityChanged();
+    }
+
+    public event EventHandler ExperimentGenerationProgressChanged;
+    private void OnExperimentGenerationProgressChanged() {
+      var handler = ExperimentGenerationProgressChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    public override void Parameterize(IParameterizedItem item) {
+      this.parameters.Clear();
+      var algorithm = item as IAlgorithm;
+      var problem = algorithm.Problem;
+
+      ProblemConfiguration.Parameterize(problem);
+      AlgorithmConfiguration.Parameterize(algorithm);
+
+      algorithm.CollectParameterValues(this.Parameters);
+    }
+
+    public Experiment GenerateExperiment(IAlgorithm algorithm, bool createBatchRuns, int repetitions, CancellationToken ct) {
+      Experiment experiment = new Experiment();
+      ExperimentGenerationProgress = 0;
+      foreach (ParameterizedValueConfiguration combination in this) {
+        ct.ThrowIfCancellationRequested();
+        IAlgorithm clonedAlg = (IAlgorithm)algorithm.Clone();
+        clonedAlg.Name = combination.ParameterInfoString;
+        combination.Parameterize(clonedAlg);
+        clonedAlg.StoreAlgorithmInEachRun = false;
+        if (createBatchRuns) {
+          BatchRun batchRun = new BatchRun(string.Format("BatchRun: {0}", combination.ParameterInfoString));
+          batchRun.Optimizer = clonedAlg;
+          batchRun.Repetitions = repetitions;
+          experiment.Optimizers.Add(batchRun);
+        } else {
+          experiment.Optimizers.Add(clonedAlg);
+        }
+        ExperimentGenerationProgress = (double)experiment.Optimizers.Count / this.GetCombinationCount(0);
+      }
+      return experiment;
+    }
+
+    public Experiment GenerateExperiment(IAlgorithm algorithm) {
+      return GenerateExperiment(algorithm, false, 0, CancellationToken.None);
+    }
+
+    public Experiment GenerateExperiment(IAlgorithm algorithm, bool createBatchRuns, int repetitions) {
+      return GenerateExperiment(algorithm, createBatchRuns, repetitions, CancellationToken.None);
+    }
+
+    public IEnumerator GetEnumerator() {
+      IEnumerator enumerator = new ParameterCombinationsEnumerator(this);
+      enumerator.Reset();
+      return enumerator;
+    }
+
+    /// <summary>
+    /// returns the number of possible parameter combinations
+    /// </summary>
+    /// <param name="max">algorithm stops counting when max is reached. zero for infinite counting</param>
+    /// <returns></returns>
+    public long GetCombinationCount(long max) {
+      long cnt = 0;
+      foreach (var c in this) {
+        cnt++;
+        if (max > 0 && cnt >= max) {
+          return cnt;
+        }
+      }
+      return cnt;
+    }
+
+    public IOptimizable GetRandomOptimizable(IRandom random) {
+      List<IOptimizable> allOptimizables = GetAllOptimizables();
+      return allOptimizables[random.Next(allOptimizables.Count)];
+    }
+
+    public override string ToString() {
+      return this.Name;
+    }
+
+    public IRun ToRun(bool clearParameters) {
+      return ToRun(this.ParameterInfoString, clearParameters);
+    }
+
+    public IRun ToRun(string name, bool clearParameters) {
+      IRun run = new Run();
+      run.Name = name;
+      this.CollectResultValues(run.Results);
+      this.CollectParameterValues(run.Parameters);
+      if (clearParameters) ClearParameters(run, this.GetOptimizedParameterNames());
+      return run;
+    }
+
+    public override string ParameterInfoString {
+      get {
+        string algorithmInfo = this.AlgorithmConfiguration.ParameterInfoString;
+        string problemInfo = this.ProblemConfiguration.ParameterInfoString;
+        var sb = new StringBuilder();
+        if (!string.IsNullOrEmpty(algorithmInfo)) {
+          sb.Append("Algorithm (");
+          sb.Append(algorithmInfo);
+          sb.Append(")");
+        }
+        if (!string.IsNullOrEmpty(problemInfo)) {
+          if (sb.Length > 0)
+            sb.Append(", ");
+          sb.Append("Problem( ");
+          sb.Append(problemInfo);
+          sb.Append(")");
+        }
+        return sb.ToString();
+      }
+    }
+
+    public override void CollectOptimizedParameterNames(List<string> parameterNames, string prefix) {
+      AlgorithmConfiguration.CollectOptimizedParameterNames(parameterNames, string.Empty);
+      ProblemConfiguration.CollectOptimizedParameterNames(parameterNames, string.Empty);
+    }
+
+    #region Helpers
+    /// <summary>
+    /// Removes those parameters from the run which are not declared in parametersToKeep
+    /// </summary>
+    private void ClearParameters(IRun run, IEnumerable<string> parametersToKeep) {
+      var parametersToRemove = new List<string>();
+      foreach (var parameter in run.Parameters) {
+        if (!parametersToKeep.Contains(parameter.Key))
+          parametersToRemove.Add(parameter.Key);
+      }
+      foreach (var parameter in parametersToRemove)
+        run.Parameters.Remove(parameter);
+    }
+    #endregion
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurations/ParameterConfiguration.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurations/ParameterConfiguration.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurations/ParameterConfiguration.cs	(revision 8517)
@@ -0,0 +1,648 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Drawing;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class ParameterConfiguration : Item, IParameterConfiguration, IStorableContent {
+    public bool IsOptimizable {
+      get { return true; }
+    }
+
+    public string Filename { get; set; }
+
+    [Storable]
+    protected bool optimize;
+    public virtual bool Optimize {
+      get { return optimize; }
+      set {
+        if (optimize != value) {
+          optimize = value;
+          if (optimize) {
+            PopulateValueConfigurations();
+          } else {
+            ClearValueConfigurations();
+          }
+          OnOptimizeChanged();
+          OnToStringChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected Image itemImage;
+    public override Image ItemImage {
+      get { return itemImage ?? base.ItemImage; }
+    }
+
+    [Storable]
+    protected string parameterName;
+    public string ParameterName {
+      get { return parameterName; }
+      set {
+        if (parameterName != value) {
+          parameterName = value;
+          OnToStringChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected Type parameterDataType;
+    public Type ParameterDataType {
+      get { return this.parameterDataType; }
+    }
+
+    protected Type[] validTypes;
+    public Type[] ValidTypes {
+      get { return validTypes; }
+      protected set {
+        if (this.validTypes != value) {
+          this.validTypes = value;
+        }
+      }
+    }
+
+    [Storable]
+    protected Type valueDataType;
+    public Type ValueDataType {
+      get { return valueDataType; }
+      protected set { this.valueDataType = value; }
+    }
+
+    [Storable]
+    protected ICheckedValueConfigurationList valueConfigurations;
+    public ICheckedValueConfigurationList ValueConfigurations {
+      get { return this.valueConfigurations; }
+      protected set {
+        if (this.valueConfigurations != value) {
+          if (this.valueConfigurations != null) DeregisterValueConfigurationEvents();
+          this.valueConfigurations = value;
+          KeepActualValueConfigurationIndexConsistent();
+          if (this.valueConfigurations != null) RegisterValueConfigurationEvents();
+        }
+      }
+    }
+
+    [Storable]
+    private int actualValueConfigurationIndex = 0;
+    public int ActualValueConfigurationIndex {
+      get { return actualValueConfigurationIndex; }
+      set { actualValueConfigurationIndex = value; }
+    }
+
+    [Storable]
+    protected ConstrainedValue actualValue;
+    public ConstrainedValue ActualValue {
+      get { return actualValue; }
+      set {
+        if (actualValue != value) {
+          DeregisterActualValueEvents();
+          actualValue = value;
+          RegisterActualValueEvents();
+        }
+      }
+    }
+
+    [Storable]
+    protected bool isNullable;
+    public bool IsNullable {
+      get { return isNullable; }
+      protected set {
+        if (this.isNullable != value) {
+          this.isNullable = value;
+        }
+      }
+    }
+
+    [Storable]
+    protected bool discoverValidValues;
+    public bool DiscoverValidValues {
+      get { return discoverValidValues; }
+      set { discoverValidValues = value; }
+    }
+
+    protected IItemSet<IItem> validValues;
+
+    [Storable]
+    private bool autoPopulateValueConfigurations = true;
+    public bool AutoPopulateValueConfigurations {
+      get { return autoPopulateValueConfigurations; }
+      set { autoPopulateValueConfigurations = value; }
+    }
+
+    [Storable]
+    protected bool valuesReadOnly = false;
+    public virtual bool ValuesReadOnly {
+      get { return valuesReadOnly; }
+      set {
+        if (value != this.valuesReadOnly) {
+          this.valuesReadOnly = value;
+          foreach (var vc in this.valueConfigurations) {
+            vc.ValuesReadOnly = value;
+          }
+        }
+      }
+    }
+
+    #region Constructors and Cloning
+    public ParameterConfiguration(string parameterName, IValueParameter valueParameter, bool discoverValidValues) {
+      this.AutoPopulateValueConfigurations = true;
+      this.ParameterName = parameterName;
+      this.parameterDataType = valueParameter.GetType();
+      this.valueDataType = valueParameter.DataType;
+      this.discoverValidValues = discoverValidValues;
+      this.validValues = discoverValidValues ? GetValidValues(valueParameter) : new ItemSet<IItem> { valueParameter.Value };
+      this.validTypes = GetValidTypes(valueParameter).ToArray();
+      this.IsNullable = valueParameter.ItemName.StartsWith("Optional");
+      this.itemImage = valueParameter.ItemImage;
+      if (IsNullable) {
+        validTypes = new List<Type>(validTypes) { typeof(NullValue) }.ToArray();
+      }
+      this.ValueConfigurations = new CheckedValueConfigurationList(this.validValues ?? CreateValidValues());
+      this.ActualValue = new ConstrainedValue(
+        valueParameter.Value != null ? valueParameter.Value : null, // don't clone here; otherwise settings of a non-optimized ValueParameter will not be synchronized with the ConstrainedValue
+        valueParameter.DataType,
+        this.validValues != null ? new ItemSet<IItem>(this.validValues) : CreateValidValues(),
+        this.IsNullable);
+      if (Optimize) {
+        PopulateValueConfigurations();
+      }
+    }
+    public ParameterConfiguration(string parameterName, Type type, IItem actualValue, IEnumerable<IValueConfiguration> valueConfigurations) {
+      this.AutoPopulateValueConfigurations = false;
+      this.ParameterName = parameterName;
+      this.parameterDataType = type;
+      this.valueDataType = type;
+      this.discoverValidValues = false;
+      this.validValues = null; // maybe use values from valueConfigurations
+      this.validTypes = new Type[] { type };
+      this.IsNullable = false;
+      this.itemImage = valueConfigurations.Count() > 0 ? valueConfigurations.FirstOrDefault().ItemImage : null;
+      this.ValueConfigurations = new CheckedValueConfigurationList(valueConfigurations);
+      this.ActualValue = new ConstrainedValue(actualValue, type, CreateValidValues(), this.IsNullable);
+    }
+    public ParameterConfiguration(string parameterName, Type type, IItem actualValue) {
+      this.AutoPopulateValueConfigurations = true;
+      this.ParameterName = parameterName;
+      this.parameterDataType = type;
+      this.valueDataType = type;
+      this.discoverValidValues = false;
+      this.validValues = null;
+      this.validTypes = new Type[] { type };
+      this.IsNullable = false;
+      this.itemImage = actualValue.ItemImage;
+      this.ValueConfigurations = new CheckedValueConfigurationList();
+      this.ActualValue = new ConstrainedValue(actualValue, type, CreateValidValues(), this.IsNullable);
+      if (Optimize) {
+        PopulateValueConfigurations();
+      }
+    }
+    protected ParameterConfiguration() { }
+    [StorableConstructor]
+    protected ParameterConfiguration(bool deserializing) { }
+
+    protected ParameterConfiguration(ParameterConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      this.parameterName = original.ParameterName;
+      this.parameterDataType = original.parameterDataType;
+      this.valueDataType = original.ValueDataType;
+      this.validValues = cloner.Clone(original.validValues);
+      this.validTypes = original.validTypes.ToArray();
+      this.valueConfigurations = cloner.Clone(original.ValueConfigurations);
+      if (this.valueConfigurations != null) RegisterValueConfigurationEvents();
+      this.actualValue = cloner.Clone(original.actualValue);
+      if (this.actualValue != null) RegisterActualValueEvents();
+      this.optimize = original.optimize;
+      this.actualValueConfigurationIndex = original.actualValueConfigurationIndex;
+      this.isNullable = original.isNullable;
+      this.itemImage = original.itemImage;
+      this.discoverValidValues = original.discoverValidValues;
+      this.AutoPopulateValueConfigurations = original.AutoPopulateValueConfigurations;
+      this.valuesReadOnly = original.valuesReadOnly;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterConfiguration(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    protected virtual void AfterDeserialization() {
+      this.validTypes = GetValidTypes(parameterDataType).ToArray();
+
+      if (IsNullable) {
+        validTypes = new List<Type>(validTypes) { typeof(NullValue) }.ToArray();
+      }
+      this.validValues = CreateValidValues();
+
+      if (this.valueConfigurations != null) RegisterValueConfigurationEvents();
+      if (this.actualValue != null) RegisterActualValueEvents();
+    }
+    #endregion
+
+    private void RegisterValueConfigurationEvents() {
+      this.ValueConfigurations.CheckedItemsChanged += new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(ValueConfigurations_CheckedItemsChanged);
+      this.ValueConfigurations.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(ValueConfigurations_ItemsAdded);
+      this.ValueConfigurations.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(ValueConfigurations_ItemsRemoved);
+    }
+
+    private void DeregisterValueConfigurationEvents() {
+      this.ValueConfigurations.CheckedItemsChanged -= new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(ValueConfigurations_CheckedItemsChanged);
+      this.ValueConfigurations.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(ValueConfigurations_ItemsAdded);
+      this.ValueConfigurations.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(ValueConfigurations_ItemsRemoved);
+    }
+
+    private void RegisterActualValueEvents() {
+      if (this.ActualValue != null) this.ActualValue.ToStringChanged += new EventHandler(ActualValue_ToStringChanged);
+    }
+    private void DeregisterActualValueEvents() {
+      if (this.ActualValue != null) this.ActualValue.ToStringChanged -= new EventHandler(ActualValue_ToStringChanged);
+    }
+
+    protected virtual void PopulateValueConfigurations() {
+      if (!this.AutoPopulateValueConfigurations)
+        return;
+
+      foreach (Type t in this.validTypes) {
+        if (t == typeof(NullValue)) {
+          this.ValueConfigurations.Add(new NullValueConfiguration());
+        } else {
+          IItem val;
+          if (ActualValue.Value != null && ActualValue.Value.GetType() == t) {
+            val = (IItem)ActualValue.Value.Clone(); // use existing value for that type (if available)
+          } else {
+            val = CreateItem(t);
+          }
+          if (val != null) { // val can be null when ValidValues does not contain the type (this can happen when discoverValidValues=false)
+            IValueConfiguration valueConfiguration;
+            if (val is IParameterizedItem) {
+              valueConfiguration = new ParameterizedValueConfiguration(val, val.GetType(), true);
+            } else {
+              if (val is ISymbolicExpressionGrammar) {
+                valueConfiguration = new SymbolicExpressionGrammarValueConfiguration((ISymbolicExpressionGrammar)val);
+              } else {
+                valueConfiguration = new RangeValueConfiguration(val, val.GetType());
+              }
+            }
+            this.ValueConfigurations.Add(valueConfiguration, true);
+          }
+        }
+      }
+    }
+
+    protected virtual void ClearValueConfigurations() {
+      if (!this.AutoPopulateValueConfigurations)
+        return;
+
+      this.ValueConfigurations.Clear();
+    }
+
+    private static IEnumerable<Type> GetValidTypes(IValueParameter parameter) {
+      // in case of IOperator return empty list, otherwise hundreds of types would be returned. this mostly occurs for Successor which will never be optimized
+      if (parameter.DataType == typeof(IOperator))
+        return new List<Type>();
+
+      // return only one type for ValueTypeValues<> (Int, Double, Percent, Bool). Otherwise 2 types would be returned for DoubleValue (PercentValue which is derived)
+      if (IsSubclassOfRawGeneric(typeof(ValueTypeValue<>), parameter.DataType))
+        return new List<Type> { parameter.DataType };
+
+      if (IsSubclassOfRawGeneric(typeof(OptionalConstrainedValueParameter<>), parameter.GetType())) {
+        // use existing validvalues if known
+        var parameterValidValues = (IEnumerable)parameter.GetType().GetProperty("ValidValues").GetValue(parameter, new object[] { });
+        return parameterValidValues.Cast<object>().Select(x => x.GetType());
+      } else {
+        // otherwise use all assignable types
+        return ApplicationManager.Manager.GetTypes(parameter.DataType, true);
+      }
+    }
+
+    private static IEnumerable<Type> GetValidTypes(Type parameter) {
+      // in case of IOperator return empty list, otherwise hundreds of types would be returned. this mostly occurs for Successor which will never be optimized
+      if (parameter == typeof(IOperator))
+        return new List<Type>();
+
+      // return only one type for ValueTypeValues<> (Int, Double, Percent, Bool). Otherwise 2 types would be returned for DoubleValue (PercentValue which is derived)
+      if (IsSubclassOfRawGeneric(typeof(ValueTypeValue<>), parameter))
+        return new List<Type> { parameter };
+
+      //TODO: not sure if this if makes sense; maybe only leave else branch here
+      if (IsSubclassOfRawGeneric(typeof(OptionalConstrainedValueParameter<>), parameter.GetType())) {
+        // use existing validvalues if known
+        var parameterValidValues = (IEnumerable)parameter.GetType().GetProperty("ValidValues").GetValue(parameter, new object[] { });
+        return parameterValidValues.Cast<object>().Select(x => x.GetType());
+      } else {
+        // otherwise use all assignable types
+        return ApplicationManager.Manager.GetTypes(parameter, true);
+      }
+    }
+
+    private IItemSet<IItem> GetValidValues(IValueParameter parameter) {
+      if (IsSubclassOfRawGeneric(typeof(OptionalConstrainedValueParameter<>), parameter.GetType())) {
+        var x = (IEnumerable)parameter.GetType().GetProperty("ValidValues").GetValue(parameter, new object[] { });
+        return new ItemSet<IItem>(x.Cast<IItem>().Select(y => (IItem)y.Clone())); // cloning actually saves memory, because references to event-subscribers are removed
+      } else {
+        return null;
+      }
+    }
+
+    public IItem CreateItem(Type type) {
+      // no valid values; just instantiate
+      try {
+        if (validValues == null)
+          return (IItem)Activator.CreateInstance(type);
+      }
+      catch (MissingMemberException) {
+        return null; // can happen, when ApplicationManager.Manager.GetTypes(type, OnlyInstantiable=true) returns objects which have no default constructor
+      }
+
+      if (type == typeof(NullValue))
+        return new NullValue();
+
+      // copy value from ValidValues; this ensures that previously set ActualNames for a type are kept
+      IItem value = this.validValues.Where(v => v.GetType() == type).SingleOrDefault();
+      if (value != null)
+        return value;
+
+      return null;
+    }
+
+    private IItemSet<IItem> CreateValidValues() {
+      var validValues = new ItemSet<IItem>();
+      foreach (Type t in this.validTypes) {
+        try {
+          var val = CreateItem(t);
+          if (val != null) validValues.Add(val);
+        }
+        catch (MissingMethodException) { /* Constructor is missing, don't use those types */ }
+      }
+      return validValues;
+    }
+
+    public static bool IsSubclassOfRawGeneric(Type generic, Type toCheck) {
+      while (toCheck != typeof(object)) {
+        var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck;
+        if (generic == cur) {
+          return true;
+        }
+        toCheck = toCheck.BaseType; // baseType is null when toCheck is an Interface
+        if (toCheck == null)
+          return false;
+      }
+      return false;
+    }
+
+    private void ValueConfigurations_CheckedItemsChanged(object sender, Collections.CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
+      OnToStringChanged();
+      KeepActualValueConfigurationIndexConsistent();
+    }
+
+    private void ValueConfigurations_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
+      OnToStringChanged();
+      KeepActualValueConfigurationIndexConsistent();
+    }
+    private void ValueConfigurations_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
+      OnToStringChanged();
+      KeepActualValueConfigurationIndexConsistent();
+    }
+
+    #region INamedItem Properties
+    public virtual string Name {
+      get { return ParameterName; }
+      set { throw new NotSupportedException(); }
+    }
+    public virtual string Description {
+      get { return base.ItemDescription; }
+      set { throw new NotSupportedException(); }
+    }
+    public virtual bool CanChangeDescription {
+      get { return false; }
+    }
+    public virtual bool CanChangeName {
+      get { return false; }
+    }
+    public override string ItemDescription {
+      get { return base.ItemDescription; }
+    }
+    public override string ItemName {
+      get { return base.ItemName; }
+    }
+    #endregion
+
+    #region Events
+    protected virtual void ActualValue_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    #endregion
+
+    #region Event Handler
+    public virtual event EventHandler NameChanged;
+    protected virtual void OnNameChanged(object sender, EventArgs e) {
+      var handler = NameChanged;
+      if (handler != null) handler(sender, e);
+    }
+
+    public virtual event EventHandler<CancelEventArgs<string>> NameChanging;
+    protected virtual void OnNameChanging(object sender, CancelEventArgs<string> e) {
+      var handler = NameChanging;
+      if (handler != null) handler(sender, e);
+    }
+
+    public virtual event EventHandler DescriptionChanged;
+    protected virtual void OnDescriptionChanged(object sender, EventArgs e) {
+      var handler = DescriptionChanged;
+      if (handler != null) handler(sender, e);
+    }
+
+    public virtual event EventHandler IsOptimizableChanged;
+    private void OnIsOptimizableChanged() {
+      var handler = IsOptimizableChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public virtual event EventHandler OptimizeChanged;
+    protected virtual void OnOptimizeChanged() {
+      var handler = OptimizeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    public override string ToString() {
+      if (Optimize) {
+        return string.Format("{0}: (Optimize: {1})", ParameterName, ValueConfigurations.CheckedItems.Count());
+      } else {
+        return string.Format("{0}: {1}", ParameterName, ActualValue.Value);
+      }
+    }
+
+    public virtual string ParameterInfoString {
+      get {
+        StringBuilder sb = new StringBuilder();
+        if (this.Optimize) {
+          var vc = this.ValueConfigurations[actualValueConfigurationIndex];
+          if (vc.ActualValue == null || vc.ActualValue.Value == null) {
+            sb.Append(string.Format("{0}: null", parameterName));
+          } else if (IsSubclassOfRawGeneric(typeof(ValueTypeValue<>), vc.ActualValue.Value.GetType())) {
+            // for int, double, bool use the value directly
+            sb.Append(string.Format("{0}: {1}", parameterName, this.ActualValue.Value.ToString()));
+          } else {
+            // for other types use NumberedName (this also uses the Number-Property for otherwise ambiguous ValueConfigurations)
+            sb.Append(string.Format("{0}: {1}", parameterName, vc.NumberedName));
+          }
+
+          if (this.ValueConfigurations[actualValueConfigurationIndex] is ParameterizedValueConfiguration) {
+            string subParams = this.ValueConfigurations[actualValueConfigurationIndex].ParameterInfoString;
+            if (!string.IsNullOrEmpty(subParams)) {
+              sb.Append(" (");
+              sb.Append(subParams);
+              sb.Append(")");
+            }
+          }
+        }
+        return sb.ToString();
+      }
+    }
+
+    public static IParameterConfiguration Create(IParameterizedNamedItem parent, IParameter parameter, bool discoverValidValues) {
+      if (parameter is IValueParameter) {
+        IValueParameter valueParameter = parameter as IValueParameter;
+        return new ParameterConfiguration(parameter.Name, valueParameter, discoverValidValues);
+      }
+      return null;
+    }
+
+    public void Parameterize(IValueParameter parameter) {
+      if (!Optimize && ValuesReadOnly)
+        return;
+
+      if (Optimize) {
+        if (this.ActualValue.Value is IParameterizedItem) {
+          ((ParameterizedValueConfiguration)this.ValueConfigurations[actualValueConfigurationIndex]).Parameterize((IParameterizedItem)this.ActualValue.Value);
+        }
+        if (this.ActualValue.Value is ISymbolicExpressionGrammar) {
+          ((SymbolicExpressionGrammarValueConfiguration)this.ValueConfigurations[actualValueConfigurationIndex]).Parameterize((ISymbolicExpressionGrammar)this.ActualValue.Value);
+        }
+      }
+      var clonedValue = this.ActualValue.Value != null ? (IItem)this.ActualValue.Value.Clone() : null;
+      if (clonedValue != null) AdaptValidValues(parameter, clonedValue);
+      parameter.Value = clonedValue;
+    }
+
+    /// <summary>
+    /// Adds value to the ValidValues of the parameter if they don't contain the value
+    /// </summary>
+    private void AdaptValidValues(IValueParameter parameter, IItem value) {
+      // this requires some tricky reflection, because the type is unknown at runtime so parameter.ValidValues cannot be casted to Collection<?>
+      if (IsSubclassOfRawGeneric(typeof(OptionalConstrainedValueParameter<>), parameter.GetType())) {
+        var validValues = parameter.GetType().GetProperty("ValidValues").GetValue(parameter, new object[] { });
+        Type validValuesType = validValues.GetType();
+
+        var containsMethod = validValuesType.GetMethod("Contains");
+        if (!(bool)containsMethod.Invoke(validValues, new object[] { value })) {
+          var addMethod = validValuesType.GetMethod("Add");
+          addMethod.Invoke(validValues, new object[] { value });
+        }
+      }
+    }
+
+    public void Randomize(IRandom random) {
+      if (Optimize) {
+        foreach (var vc in this.ValueConfigurations) {
+          if (this.ValueConfigurations.ItemChecked(vc)) {
+            if (vc.Optimize) vc.Randomize(random);
+          }
+        }
+        do {
+          actualValueConfigurationIndex = random.Next(ValueConfigurations.Count());
+        } while (!this.ValueConfigurations.ItemChecked(this.ValueConfigurations[actualValueConfigurationIndex]));
+        this.ActualValue = this.ValueConfigurations[actualValueConfigurationIndex].ActualValue;
+      }
+    }
+
+    public void UpdateActualValueIndexToItem(IValueConfiguration vc) {
+      for (int i = 0; i < this.ValueConfigurations.Count(); i++) {
+        if (this.ValueConfigurations.ElementAt(i) == vc) {
+          this.actualValueConfigurationIndex = i;
+          return;
+        }
+      }
+    }
+
+    public List<IOptimizable> GetAllOptimizables() {
+      var list = new List<IOptimizable>();
+      foreach (var vc in ValueConfigurations) {
+        if (vc.Optimize) {
+          list.Add(vc);
+          list.AddRange(vc.GetAllOptimizables());
+        }
+      }
+      return list;
+    }
+
+    public void CollectOptimizedParameterNames(List<string> parameterNames, string prefix) {
+      foreach (var vc in ValueConfigurations) {
+        if (vc.Optimize) {
+          vc.CollectOptimizedParameterNames(parameterNames, prefix);
+        }
+      }
+    }
+
+    public double CalculateSimilarity(IOptimizable optimizable) {
+      var other = (IParameterConfiguration)optimizable;
+      if (this.ActualValueConfigurationIndex == other.ActualValueConfigurationIndex) {
+        return this.ValueConfigurations[this.ActualValueConfigurationIndex].CalculateSimilarity(other.ValueConfigurations[other.ActualValueConfigurationIndex]);
+      } else {
+        return 0.0;
+      }
+    }
+
+    /// <summary>
+    /// Ensures that the ActualValueConfigurationIndex has a valid value
+    /// Only indices of items which are checked are allowed
+    /// </summary>
+    private void KeepActualValueConfigurationIndexConsistent() {
+      if (this.valueConfigurations != null && this.valueConfigurations.CheckedItems.Count() > 0) {
+        if (this.valueConfigurations.Count <= this.actualValueConfigurationIndex &&
+           this.valueConfigurations.CheckedItems.Count(x => x.Index == this.actualValueConfigurationIndex) == 1) {
+          // everything is ok; do nothing
+        } else {
+          // current index is invalid, set new one
+          this.ActualValueConfigurationIndex = this.valueConfigurations.CheckedItems.First().Index;
+        }
+      } else {
+        // no checked valueConfiguration is available; cannot be used
+        this.ActualValueConfigurationIndex = -1;
+      }
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurations/SingleValuedParameterConfiguration.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurations/SingleValuedParameterConfiguration.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurations/SingleValuedParameterConfiguration.cs	(revision 8517)
@@ -0,0 +1,103 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class SingleValuedParameterConfiguration : ParameterConfiguration {
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected SingleValuedParameterConfiguration(bool deserializing) : base(deserializing) { }
+    public SingleValuedParameterConfiguration(string parameterName, IValueParameter valueParameter)
+      : base(parameterName, valueParameter, false) {
+      this.Optimize = true;
+      base.PopulateValueConfigurations();
+      this.ValueConfigurations.Single().Optimize = true;
+    }
+    public SingleValuedParameterConfiguration(string parameterName, IValueConfiguration valueConfiguration)
+      : base() {
+      this.ParameterName = parameterName;
+      this.parameterDataType = valueConfiguration.ActualValue.ValueDataType;
+      this.valueDataType = valueConfiguration.ActualValue.ValueDataType;
+      this.discoverValidValues = false;
+      this.validValues = new ItemSet<IItem> { valueConfiguration.ActualValue.Value };
+      this.validTypes = new Type[] { valueConfiguration.ActualValue.ValueDataType };
+      this.isNullable = false;
+      this.itemImage = valueConfiguration.ItemImage;
+      this.ValueConfigurations = new CheckedValueConfigurationList { valueConfiguration };
+      this.ValueConfigurations.Single().Optimize = true;
+      valueConfiguration.ToStringChanged += new EventHandler(valueConfiguration_ToStringChanged);
+      this.ActualValue = new ConstrainedValue(
+        valueConfiguration.ActualValue.Value,
+        valueConfiguration.ActualValue.ValueDataType,
+        this.validValues,
+        this.IsNullable);
+    }
+    protected SingleValuedParameterConfiguration(SingleValuedParameterConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleValuedParameterConfiguration(this, cloner);
+    }
+    #endregion
+
+    protected override void PopulateValueConfigurations() {
+      // don't change valueconfigurations, since it only contains the one element specified in constructor
+    }
+
+    protected override void ClearValueConfigurations() {
+      // do nothing
+    }
+
+    public override string ToString() {
+      if (this.valueConfigurations.Single() is SymbolValueConfiguration) {
+        var syVc = (SymbolValueConfiguration)this.valueConfigurations.Single();
+        if (this.Optimize) {
+          return syVc.ToString() + " (Optimize)";
+        } else {
+          return ActualValue.ToString();
+        }
+      } else {
+        return base.ToString();
+      }
+    }
+
+    protected virtual void valueConfiguration_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
+    public override string ParameterInfoString {
+      get {
+        if (this.Optimize) {
+          return string.Format("{0} ({1})", this.Name, this.ValueConfigurations.Single().ParameterInfoString);
+        } else {
+          return string.Empty;
+        }
+      }
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Plugin.cs.frame
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Plugin.cs.frame	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Plugin.cs.frame	(revision 8517)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Encodings.ParameterConfigurationEncoding plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Encodings.ParameterConfigurationEncoding", "3.3.7.$WCREV$")]
+  [PluginFile("HeuristicLab.Encodings.ParameterConfigurationEncoding-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.4")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis.Symbolic", "3.4")]
+  public class HeuristicLabEncodingsParameterConfigurationEncodingPlugin : PluginBase {
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Properties/AssemblyInfo.cs.frame	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Properties/AssemblyInfo.cs.frame	(revision 8517)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.InteropServices;
+
+// 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.Encodings.ParameterConfigurationEncoding")]
+[assembly: AssemblyDescription("HeuristicLab parameter configuration encoding and related operators")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-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("e1faa955-b106-4882-9c66-09f39d01f84b")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.7.$WCREV$")]
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/ConstrainedValue.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/ConstrainedValue.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/ConstrainedValue.cs	(revision 8517)
@@ -0,0 +1,129 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class ConstrainedValue : Item {
+    [Storable]
+    protected Type valueDataType;
+    public Type ValueDataType {
+      get { return this.valueDataType; }
+      protected set { this.valueDataType = value; }
+    }
+
+    [Storable]
+    protected IItem value;
+    public IItem Value {
+      get { return value; }
+      set {
+        if (this.value != value) {
+          if (this.value != null) DeregisterEvents();
+          this.value = value;
+          if (this.value != null) RegisterEvents();
+          OnToStringChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected IItemSet<IItem> validValues;
+    public IItemSet<IItem> ValidValues {
+      get { return validValues; }
+      protected set {
+        if (this.validValues != value) {
+          this.validValues = value;
+        }
+      }
+    }
+
+    [Storable]
+    protected bool isNullable;
+    public bool IsNullable {
+      get { return isNullable; }
+      protected set {
+        if (this.isNullable != value) {
+          this.isNullable = value;
+        }
+      }
+    }
+
+    private void RegisterEvents() {
+      this.value.ToStringChanged += new EventHandler(value_ToStringChanged);
+      if (this.value is Symbol) {
+        ((Symbol)this.value).Changed += new EventHandler(ConstrainedValue_Changed);
+      }
+    }
+
+    private void DeregisterEvents() {
+      this.value.ToStringChanged -= new EventHandler(value_ToStringChanged);
+      if (this.value is Symbol) {
+        ((Symbol)this.value).Changed -= new EventHandler(ConstrainedValue_Changed);
+      }
+    }
+
+    #region constructors and cloning
+    public ConstrainedValue() { }
+    [StorableConstructor]
+    protected ConstrainedValue(bool deserializing) : base(deserializing) { }
+    public ConstrainedValue(IItem value, Type valueDataType, IItemSet<IItem> validValues, bool isNullable) {
+      this.Value = value;
+      this.ValueDataType = valueDataType;
+      this.ValidValues = validValues;
+      this.isNullable = isNullable;
+    }
+    protected ConstrainedValue(ConstrainedValue original, Cloner cloner)
+      : base(original, cloner) {
+      this.valueDataType = original.valueDataType;
+      this.Value = cloner.Clone(original.value);
+      if (original.ValidValues != null) this.ValidValues = cloner.Clone(original.ValidValues);
+      this.isNullable = original.isNullable;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedValue(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (this.value != null) RegisterEvents();
+    }
+    #endregion
+
+    private void value_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
+    private void ConstrainedValue_Changed(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
+    public override string ToString() {
+      if (this.value is Symbol) {
+        return string.Format("{0}: {1}", this.value, ((Symbol)this.value).InitialFrequency);
+      }
+      return value != null ? value.ToString() : base.ToString();
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/DoubleValueRange.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/DoubleValueRange.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/DoubleValueRange.cs	(revision 8517)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class DoubleValueRange : Range<DoubleValue> {
+
+    public override DoubleValue LowerBound {
+      get {
+        return base.LowerBound;
+      }
+      set {
+        base.LowerBound = value;
+      }
+    }
+
+    public DoubleValueRange(DoubleValue lowerBound, DoubleValue upperBound, DoubleValue stepSize) : base(lowerBound, upperBound, stepSize) { }
+    [StorableConstructor]
+    protected DoubleValueRange(bool deserializing) : base(deserializing) { }
+    protected DoubleValueRange(DoubleValueRange original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DoubleValueRange(this, cloner);
+    }
+
+    protected override DoubleValue GetRandomSample(IRandom random) {
+      double val;
+      do {
+        val = Math.Round((random.NextDouble() * (UpperBound.Value - LowerBound.Value) + LowerBound.Value) / StepSize.Value, 0) * StepSize.Value;
+      } while (!IsInRange(val));
+      return new DoubleValue(val);
+    }
+
+    public double ApplyStepSize(double value) {
+      return (Math.Round(value / this.StepSize.Value, 0)) * this.StepSize.Value;
+    }
+
+    public bool IsInRange(double value) {
+      return value <= this.UpperBound.Value && value >= this.LowerBound.Value;
+    }
+
+    public override IEnumerable<DoubleValue> GetCombinations() {
+      var solutions = new List<DoubleValue>();
+      double value = LowerBound.Value;
+
+      while (value <= UpperBound.Value) {
+        solutions.Add(new DoubleValue(value));
+        value += StepSize.Value;
+        value = ApplyStepSize(value);
+      }
+      return solutions;
+    }
+
+    protected override double CalculateSimilarityValue(DoubleValue a, DoubleValue b) {
+      double range = UpperBound.Value - LowerBound.Value;
+      double diff = Math.Abs(a.Value - b.Value);
+      return Math.Max(0, (range - (diff * 2)) / range);
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/IntValueRange.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/IntValueRange.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/IntValueRange.cs	(revision 8517)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class IntValueRange : Range<IntValue> {
+
+    public IntValueRange(IntValue lowerBound, IntValue upperBound, IntValue stepSize) : base(lowerBound, upperBound, stepSize) { }
+    [StorableConstructor]
+    protected IntValueRange(bool deserializing) : base(deserializing) { }
+    protected IntValueRange(IntValueRange original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntValueRange(this, cloner);
+    }
+
+    protected override IntValue GetRandomSample(IRandom random) {
+      int val;
+      do {
+        val = random.Next(LowerBound.Value / StepSize.Value, UpperBound.Value / StepSize.Value + 1) * StepSize.Value;
+      } while (!IsInRange(val));
+      return new IntValue(val);
+    }
+
+    public int ApplyStepSize(int value) {
+      return ((int)Math.Round(value / (double)this.StepSize.Value, 0)) * this.StepSize.Value;
+    }
+
+    public bool IsInRange(int value) {
+      return value <= this.UpperBound.Value && value >= this.LowerBound.Value;
+    }
+
+    public override IEnumerable<IntValue> GetCombinations() {
+      var solutions = new List<IntValue>();
+      int value = this.LowerBound.Value;
+
+      while (value <= this.UpperBound.Value) {
+        solutions.Add(new IntValue(value));
+        value += this.StepSize.Value;
+      }
+      return solutions;
+    }
+
+    protected override double CalculateSimilarityValue(IntValue a, IntValue b) {
+      double range = UpperBound.Value - LowerBound.Value;
+      double diff = Math.Abs(a.Value - b.Value);
+      return Math.Max(0, (range - (diff * 2)) / range);
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/PercentValueRange.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/PercentValueRange.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/PercentValueRange.cs	(revision 8517)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class PercentValueRange : Range<PercentValue> {
+
+    public PercentValueRange(PercentValue lowerBound, PercentValue upperBound, PercentValue stepSize) : base(lowerBound, upperBound, stepSize) { }
+    [StorableConstructor]
+    protected PercentValueRange(bool deserializing) : base(deserializing) { }
+    protected PercentValueRange(PercentValueRange original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PercentValueRange(this, cloner);
+    }
+
+    protected override PercentValue GetRandomSample(IRandom random) {
+      double val;
+      do {
+        val = Math.Round((random.NextDouble() * (UpperBound.Value - LowerBound.Value) + LowerBound.Value) / StepSize.Value, 0) * StepSize.Value;
+      } while (!IsInRange(val));
+      return new PercentValue(val);
+    }
+
+    public DoubleValueRange AsDoubleValueRange() {
+      return new DoubleValueRange(LowerBound, UpperBound, StepSize);
+    }
+
+    public double ApplyStepSize(double value) {
+      return ((int)Math.Round(value / this.StepSize.Value, 0)) * this.StepSize.Value;
+    }
+
+    public bool IsInRange(double value) {
+      return value <= this.UpperBound.Value && value >= this.LowerBound.Value;
+    }
+
+    public override IEnumerable<PercentValue> GetCombinations() {
+      var solutions = new List<PercentValue>();
+      double value = LowerBound.Value;
+
+      while (value <= UpperBound.Value) {
+        solutions.Add(new PercentValue(value));
+        value += StepSize.Value;
+        value = ApplyStepSize(value);
+      }
+      return solutions;
+    }
+
+    protected override double CalculateSimilarityValue(PercentValue a, PercentValue b) {
+      double range = UpperBound.Value - LowerBound.Value;
+      double diff = Math.Abs(a.Value - b.Value);
+      return Math.Max(0, (range - (diff * 2)) / range);
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/Range.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/Range.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/Range.cs	(revision 8517)
@@ -0,0 +1,247 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public abstract class Range<T> : Item, IRange<T> where T : class, IItem, IStringConvertibleValue, IDeepCloneable {
+    [Storable]
+    private T lowerBound;
+    public virtual T LowerBound {
+      get { return lowerBound; }
+      set {
+        if (lowerBound != value) {
+          if (lowerBound != null) {
+            lowerBound.ValueChanged -= new EventHandler(lowerBound_ToStringChanged);
+          }
+          lowerBound = value;
+          if (lowerBound != null) {
+            lowerBound.ValueChanged += new EventHandler(lowerBound_ToStringChanged);
+          }
+          OnLowerBoundChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private T upperBound;
+    public virtual T UpperBound {
+      get { return upperBound; }
+      set {
+        if (upperBound != value) {
+          if (upperBound != null) {
+            upperBound.ValueChanged -= new EventHandler(upperBound_ToStringChanged);
+          }
+          upperBound = value;
+          if (upperBound != null) {
+            upperBound.ValueChanged += new EventHandler(upperBound_ToStringChanged);
+          }
+          OnUpperBoundChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private T stepSize;
+    public virtual T StepSize {
+      get { return stepSize; }
+      set {
+        if (stepSize != value) {
+          if (stepSize != null) {
+            stepSize.ValueChanged -= new EventHandler(stepSize_ToStringChanged);
+          }
+          stepSize = value;
+          if (stepSize != null) {
+            stepSize.ValueChanged += new EventHandler(stepSize_ToStringChanged);
+          }
+          OnStepSizeChanged();
+        }
+      }
+    }
+
+    #region IRange Members
+    object IRange.LowerBound {
+      get { return lowerBound; }
+      set { lowerBound = (T)value; }
+    }
+    object IRange.UpperBound {
+      get { return upperBound; }
+      set { upperBound = (T)value; }
+    }
+    object IRange.StepSize {
+      get { return stepSize; }
+      set { stepSize = (T)value; }
+    }
+    #endregion
+
+    #region Constructors and Cloning
+    public Range(T lowerBound, T upperBound, T stepSize) {
+      this.LowerBound = lowerBound;
+      this.UpperBound = upperBound;
+      this.StepSize = stepSize;
+    }
+
+    [StorableConstructor]
+    protected Range(bool deserializing) : base(deserializing) { }
+    protected Range(Range<T> original, Cloner cloner)
+      : base(original, cloner) {
+      this.LowerBound = cloner.Clone(original.LowerBound);
+      this.UpperBound = cloner.Clone(original.UpperBound);
+      this.StepSize = cloner.Clone(original.StepSize);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (lowerBound != null) {
+        lowerBound.ValueChanged += new EventHandler(lowerBound_ToStringChanged);
+      }
+      if (upperBound != null) {
+        upperBound.ValueChanged += new EventHandler(upperBound_ToStringChanged);
+      }
+      if (stepSize != null) {
+        stepSize.ValueChanged += new EventHandler(stepSize_ToStringChanged);
+      }
+    }
+    #endregion
+
+    #region Events
+    private void lowerBound_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    private void upperBound_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    private void stepSize_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    #endregion
+
+    #region Eventhandler
+    public event EventHandler LowerBoundChanged;
+    private void OnLowerBoundChanged() {
+      var handler = LowerBoundChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler UpperBoundChanged;
+    private void OnUpperBoundChanged() {
+      var handler = UpperBoundChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler StepSizeChanged;
+    private void OnStepSizeChanged() {
+      var handler = StepSizeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler ValueChanged;
+    private void OnValueChanged() {
+      var handler = ValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    public override string ToString() {
+      return string.Format("{0},{1}:{2}", LowerBound.ToString(), UpperBound.ToString(), StepSize.ToString());
+    }
+
+    #region IStringConvertibleValue Members
+
+    public string GetValue() {
+      return this.ToString();
+    }
+    public bool ReadOnly {
+      get { return false; }
+    }
+    public bool SetValue(string value) {
+      var parts1 = value.Split(':');
+      if (parts1.Length != 2) return false;
+      var parts2 = parts1[0].Split(',');
+      if (parts2.Length != 2) return false;
+
+      return
+        lowerBound.SetValue(parts2[0]) &&
+        upperBound.SetValue(parts2[1]) &&
+        stepSize.SetValue(parts1[1]);
+    }
+    public bool Validate(string value, out string errorMessage) {
+      // TODO: check that upper is larger than lower and that stepsize < upper-lower
+      T lower = (T)lowerBound.Clone();
+      T upper = (T)upperBound.Clone();
+      T step = (T)stepSize.Clone();
+
+      var parts1 = value.Split(':');
+      if (parts1.Length != 2) {
+        errorMessage = "Could not parse range."; return false;
+      }
+      var parts2 = parts1[0].Split(',');
+      if (parts2.Length != 2) {
+        errorMessage = "Could not parse range."; return false;
+      }
+
+      if (lowerBound.SetValue(parts2[0]) &&
+          upperBound.SetValue(parts2[1]) &&
+          stepSize.SetValue(parts1[1])) {
+        errorMessage = string.Empty; return true;
+      } else {
+        errorMessage = "Could not parse range."; return false;
+      }
+    }
+
+    #endregion
+
+    public T GetRandomValue(IRandom random) {
+      // by a chance return the extreme values of this range to intensify search in those regions
+      if (random.NextDouble() < 0.1) {
+        if (random.NextDouble() < 0.5) {
+          return (T)LowerBound.Clone();
+        } else {
+          return (T)UpperBound.Clone();
+        }
+      }
+
+      // otherwise sample a random value from the range
+      return GetRandomSample(random);
+    }
+
+    protected abstract T GetRandomSample(IRandom random);
+
+    IItem IRange.GetRandomValue(IRandom random) {
+      return GetRandomValue(random);
+    }
+
+    public abstract IEnumerable<T> GetCombinations();
+    IEnumerable<IItem> IRange.GetCombinations() {
+      return GetCombinations().Cast<IItem>().ToArray();
+    }
+
+    public virtual double CalculateSimilarity(IItem a, IItem b) {
+      return CalculateSimilarityValue((T)a, (T)b);
+    }
+
+    protected abstract double CalculateSimilarityValue(T a, T b);
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/SymbolicExpressionGrammar/SymbolValueConfiguration.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/SymbolicExpressionGrammar/SymbolValueConfiguration.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/SymbolicExpressionGrammar/SymbolValueConfiguration.cs	(revision 8517)
@@ -0,0 +1,152 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class SymbolValueConfiguration : ParameterizedValueConfiguration {
+    [Storable]
+    private IOptimizable parentOptimizable;
+    public IOptimizable ParentOptimizable {
+      get { return parentOptimizable; }
+      set { this.parentOptimizable = value; }
+    }
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected SymbolValueConfiguration(bool deserializing) : base(deserializing) { }
+    public SymbolValueConfiguration(Symbol symbol)
+      : base() {
+      this.IsOptimizable = true;
+      this.Optimize = false;
+      this.Name = symbol.Name;
+      this.ActualValue = new ConstrainedValue(symbol, symbol.GetType(), new ItemSet<IItem> { symbol }, false);
+    }
+    protected SymbolValueConfiguration(SymbolValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterInitialFrequencyEvents();
+      this.parentOptimizable = cloner.Clone(original.parentOptimizable);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolValueConfiguration(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterInitialFrequencyEvents();
+    }
+    #endregion
+
+    protected override void PopulateParameterConfigurations(IItem item, bool discoverValidValues) {
+      this.ClearParameterConfigurations();
+      var symbol = (Symbol)item;
+
+      var initialFrequencyValueConfigurations = new List<IValueConfiguration>();
+      initialFrequencyValueConfigurations.Add(new RangeValueConfiguration(new DoubleValue(0), typeof(DoubleValue)));
+      initialFrequencyValueConfigurations.Add(new RangeValueConfiguration(new DoubleValue(1), typeof(DoubleValue)));
+      var initialFrequencyParameterConfiguration = new ParameterConfiguration("InitialFrequency", typeof(Symbol), new DoubleValue(symbol.InitialFrequency), initialFrequencyValueConfigurations);
+      this.parameterConfigurations.Add(initialFrequencyParameterConfiguration);
+      RegisterInitialFrequencyEvents();
+
+      var constant = symbol as Constant;
+      if (constant != null) {
+        var minValueParameterConfiguration = new ParameterConfiguration("MinValue", typeof(DoubleValue), new DoubleValue(constant.MinValue));
+        var maxValueParameterConfiguration = new ParameterConfiguration("MaxValue", typeof(DoubleValue), new DoubleValue(constant.MaxValue));
+        var manipulatorMuParameterConfiguration = new ParameterConfiguration("ManipulatorMu", typeof(DoubleValue), new DoubleValue(constant.ManipulatorMu));
+        var manipulatorSigmaParameterConfiguration = new ParameterConfiguration("ManipulatorSigma", typeof(DoubleValue), new DoubleValue(constant.ManipulatorSigma));
+        var multiplicativeManipulatorSigmaParameterConfiguration = new ParameterConfiguration("MultiplicativeManipulatorSigma", typeof(DoubleValue), new DoubleValue(constant.MultiplicativeManipulatorSigma));
+
+        this.parameterConfigurations.Add(minValueParameterConfiguration);
+        this.parameterConfigurations.Add(maxValueParameterConfiguration);
+        this.parameterConfigurations.Add(manipulatorMuParameterConfiguration);
+        this.parameterConfigurations.Add(manipulatorSigmaParameterConfiguration);
+        this.parameterConfigurations.Add(multiplicativeManipulatorSigmaParameterConfiguration);
+      }
+
+      var variable = symbol as HeuristicLab.Problems.DataAnalysis.Symbolic.Variable;
+      if (variable != null) {
+        var weightMuParameterConfiguration = new ParameterConfiguration("WeightMu", typeof(DoubleValue), new DoubleValue(variable.WeightMu));
+        var weightSigmaParameterConfiguration = new ParameterConfiguration("WeightSigma", typeof(DoubleValue), new DoubleValue(variable.WeightSigma));
+        var weightManipulatorMuParameterConfiguration = new ParameterConfiguration("WeightManipulatorMu", typeof(DoubleValue), new DoubleValue(variable.WeightManipulatorMu));
+        var weightManipulatorSigmaParameterConfiguration = new ParameterConfiguration("WeightManipulatorSigma", typeof(DoubleValue), new DoubleValue(variable.WeightManipulatorSigma));
+        var multiplicativeWeightManipulatorSigmaParameterConfiguration = new ParameterConfiguration("MultiplicativeWeightManipulatorSigma", typeof(DoubleValue), new DoubleValue(variable.MultiplicativeWeightManipulatorSigma));
+
+        this.parameterConfigurations.Add(weightMuParameterConfiguration);
+        this.parameterConfigurations.Add(weightSigmaParameterConfiguration);
+        this.parameterConfigurations.Add(weightManipulatorMuParameterConfiguration);
+        this.parameterConfigurations.Add(weightManipulatorSigmaParameterConfiguration);
+        this.parameterConfigurations.Add(multiplicativeWeightManipulatorSigmaParameterConfiguration);
+      }
+    }
+
+    public virtual void Parameterize(Symbol symbol) {
+      var actualValueSymbol = this.ActualValue.Value as Symbol;
+      symbol.InitialFrequency = parentOptimizable.Optimize ? GetDoubleValue("InitialFrequency") : actualValueSymbol.InitialFrequency;
+
+      var constant = symbol as Constant;
+      if (constant != null) {
+        var actualValueConstant = this.ActualValue.Value as Constant;
+        constant.MinValue = parentOptimizable.Optimize ? GetDoubleValue("MinValue") : actualValueConstant.MinValue;
+        constant.MaxValue = parentOptimizable.Optimize ? GetDoubleValue("MaxValue") : actualValueConstant.MaxValue;
+        constant.ManipulatorMu = parentOptimizable.Optimize ? GetDoubleValue("ManipulatorMu") : actualValueConstant.ManipulatorMu;
+        constant.ManipulatorSigma = parentOptimizable.Optimize ? GetDoubleValue("ManipulatorSigma") : actualValueConstant.ManipulatorSigma;
+        constant.MultiplicativeManipulatorSigma = parentOptimizable.Optimize ? GetDoubleValue("MultiplicativeManipulatorSigma") : actualValueConstant.MultiplicativeManipulatorSigma;
+      }
+
+      var variable = symbol as HeuristicLab.Problems.DataAnalysis.Symbolic.Variable;
+      if (variable != null) {
+        var actualValueVariable = this.ActualValue.Value as HeuristicLab.Problems.DataAnalysis.Symbolic.Variable;
+        variable.WeightMu = parentOptimizable.Optimize ? GetDoubleValue("WeightMu") : actualValueVariable.WeightMu;
+        variable.WeightSigma = parentOptimizable.Optimize ? GetDoubleValue("WeightSigma") : actualValueVariable.WeightSigma;
+        variable.WeightManipulatorMu = parentOptimizable.Optimize ? GetDoubleValue("WeightManipulatorMu") : actualValueVariable.WeightManipulatorMu;
+        variable.WeightManipulatorSigma = parentOptimizable.Optimize ? GetDoubleValue("WeightManipulatorSigma") : actualValueVariable.WeightManipulatorSigma;
+        variable.MultiplicativeWeightManipulatorSigma = parentOptimizable.Optimize ? GetDoubleValue("MultiplicativeWeightManipulatorSigma") : actualValueVariable.MultiplicativeWeightManipulatorSigma;
+      }
+    }
+
+    private double GetDoubleValue(string name) {
+      return ((DoubleValue)ParameterConfigurations.Single(x => x.Name == name).ActualValue.Value).Value;
+    }
+
+    private void RegisterInitialFrequencyEvents() {
+      this.parameterConfigurations.Single(x => x.Name == "InitialFrequency").ToStringChanged += new EventHandler(initialFrequencyParameterConfiguration_ToStringChanged);
+    }
+    private void DeregisterInitialFrequencyEvents() {
+      this.parameterConfigurations.Single(x => x.Name == "InitialFrequency").ToStringChanged -= new EventHandler(initialFrequencyParameterConfiguration_ToStringChanged);
+    }
+
+    protected virtual void initialFrequencyParameterConfiguration_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
+    public override string ToString() {
+      return string.Format("{0}: {1}", this.Name, parameterConfigurations.Single(pc => pc.Name == "InitialFrequency").ActualValue.Value);
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/SymbolicExpressionGrammar/SymbolicExpressionGrammarValueConfiguration.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/SymbolicExpressionGrammar/SymbolicExpressionGrammarValueConfiguration.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/SymbolicExpressionGrammar/SymbolicExpressionGrammarValueConfiguration.cs	(revision 8517)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class SymbolicExpressionGrammarValueConfiguration : ParameterizedValueConfiguration {
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected SymbolicExpressionGrammarValueConfiguration(bool deserializing) : base(deserializing) { }
+    public SymbolicExpressionGrammarValueConfiguration() : base() { }
+    public SymbolicExpressionGrammarValueConfiguration(ISymbolicExpressionGrammar grammar) {
+      this.IsOptimizable = true;
+      this.ActualValue = new ConstrainedValue(grammar, grammar.GetType(), new ItemSet<IItem> { grammar }, false);
+    }
+    protected SymbolicExpressionGrammarValueConfiguration(SymbolicExpressionGrammarValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicExpressionGrammarValueConfiguration(this, cloner);
+    }
+    #endregion
+
+    protected override void PopulateParameterConfigurations(IItem item, bool discoverValidValues) {
+      var grammar = (ISymbolicExpressionGrammar)item;
+      foreach (Symbol symbol in grammar.Symbols) {
+        var svc = new SymbolValueConfiguration(symbol);
+        var pc = new SingleValuedParameterConfiguration(symbol.Name, svc);
+        svc.ParentOptimizable = pc;
+        SetOptimizeIfOnlyOneValueConfiguration(pc);
+        this.parameterConfigurations.Add(pc);
+      }
+    }
+
+    public virtual void Parameterize(ISymbolicExpressionGrammar grammar) {
+      foreach (Symbol symbol in grammar.Symbols) {
+        var symbolValueConfiguration = (SymbolValueConfiguration)this.parameterConfigurations.Single(pc => pc.Name == symbol.Name).ValueConfigurations.First();
+        symbolValueConfiguration.Parameterize(symbol);
+      }
+    }
+
+    /// <summary>
+    /// If only 1 parameter exists (usually this is InitialFrequency), then set it to Optimize=true,
+    /// because this is what the user usually wants to do. avoids additional click.
+    /// </summary>
+    private static void SetOptimizeIfOnlyOneValueConfiguration(SingleValuedParameterConfiguration pc) {
+      var vc = pc.ValueConfigurations[0] as ParameterizedValueConfiguration;
+      if (vc != null) {
+        if (vc.ParameterConfigurations.Count == 1) {
+          vc.ParameterConfigurations.Single().Optimize = true;
+        }
+      }
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/TypeValue.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/TypeValue.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/TypeValue.cs	(revision 8517)
@@ -0,0 +1,72 @@
+﻿using System;
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [Item("TypeValue", "Represents a type.")]
+  [StorableClass]
+  public class TypeValue : Item {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Field; }
+    }
+
+    [Storable]
+    protected Type value;
+    public virtual Type Value {
+      get { return value; }
+      set {
+        if (ReadOnly) throw new NotSupportedException("Value cannot be set. TypeValue is read-only.");
+        if (!value.Equals(this.value)) {
+          this.value = value;
+          OnValueChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected bool readOnly;
+    public virtual bool ReadOnly {
+      get { return readOnly; }
+    }
+
+    public TypeValue()
+      : base() {
+      this.readOnly = false;
+    }
+    public TypeValue(Type value)
+      : base() {
+      this.Value = value;
+      this.readOnly = false;
+    }
+    [StorableConstructor]
+    protected TypeValue(bool deserializing) : base(deserializing) { }
+    protected TypeValue(TypeValue original, Cloner cloner)
+      : base(original, cloner) {
+      this.value = original.value;
+      this.readOnly = original.readOnly;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TypeValue(this, cloner);
+    }
+
+    public virtual TypeValue AsReadOnly() {
+      TypeValue readOnlyValueTypeValue = (TypeValue)this.Clone();
+      readOnlyValueTypeValue.readOnly = true;
+      return readOnlyValueTypeValue;
+    }
+
+    public override string ToString() {
+      if (value == null) return "No Type information";
+      return value.Name;
+    }
+
+    public event EventHandler ValueChanged;
+    protected virtual void OnValueChanged() {
+      if (ValueChanged != null)
+        ValueChanged(this, EventArgs.Empty);
+      OnToStringChanged();
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/CheckedValueConfigurationCollection.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/CheckedValueConfigurationCollection.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/CheckedValueConfigurationCollection.cs	(revision 8517)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  // todo: check that at least 1 elements needs to be selected
+  // todo: control creatable item types
+  [StorableClass]
+  public class CheckedValueConfigurationList : CheckedItemList<IValueConfiguration>, ICheckedValueConfigurationList {
+    [Storable]
+    private int minItemCount = 1;
+    public int MinItemCount {
+      get { return minItemCount; }
+    }
+
+    [Storable]
+    protected IItemSet<IItem> validValues;
+    public IItemSet<IItem> ValidValues {
+      get { return validValues; }
+    }
+
+    public CheckedValueConfigurationList(IItemSet<IItem> validValues) {
+      this.validValues = validValues;
+      RegisterEvents();
+    }
+    public CheckedValueConfigurationList(IEnumerable<IValueConfiguration> collection)
+      : base(collection) {
+      validValues = null;
+      // event wiring not needed
+    }
+    public CheckedValueConfigurationList() {
+      RegisterEvents();
+    }
+    [StorableConstructor]
+    protected CheckedValueConfigurationList(bool deserializing)
+      : base(deserializing) {
+      RegisterEvents();
+    }
+    protected CheckedValueConfigurationList(CheckedValueConfigurationList original, Cloner cloner)
+      : base(original, cloner) {
+      this.minItemCount = original.MinItemCount;
+      this.validValues = cloner.Clone(original.validValues);
+      RegisterEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CheckedValueConfigurationList(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    private void RegisterEvents() {
+      this.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(CheckedValueConfigurationList_ItemsAdded);
+      this.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(CheckedValueConfigurationList_ItemsRemoved);
+    }
+
+    private void DeregisterEvents() {
+      this.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(CheckedValueConfigurationList_ItemsRemoved);
+      this.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(CheckedValueConfigurationList_ItemsAdded);
+    }
+
+    private void CheckedValueConfigurationList_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
+      foreach (var item in e.Items) {
+        var matchingItems = this.Where(x => x != item.Value && x.ActualValue.ValueDataType == item.Value.ActualValue.ValueDataType);
+        if (matchingItems.Count() > 0) {
+          int maxNumber = matchingItems.Select(x => x.Number).Max();
+          item.Value.Number = maxNumber + 1;
+        }
+      }
+    }
+
+    private void CheckedValueConfigurationList_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
+      // auch collectionreset gehört berücksichtigt
+      // funktioniert so nicht ganz, weil die view das hinzufügen nicht mitkriegt
+      //if (this.Count < minItemCount) {
+      //  foreach (var item in e.Items) {
+      //    if (this.Count >= minItemCount)
+      //      break;
+      //    this.Add(item);
+      //  }
+      //}
+    }
+
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/NullValueConfiguration.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/NullValueConfiguration.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/NullValueConfiguration.cs	(revision 8517)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class NullValueConfiguration : ValueConfiguration {
+
+    public NullValueConfiguration() {
+      this.ActualValue = new ConstrainedValue(null, null, null, true);
+      this.IsOptimizable = false;
+    }
+    [StorableConstructor]
+    protected NullValueConfiguration(bool deserializing) : base(deserializing) { }
+    protected NullValueConfiguration(NullValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NullValueConfiguration(this, cloner);
+    }
+
+    public override string ToString() {
+      return "null";
+    }
+
+    public override void Randomize(IRandom random) { }
+
+    public override double CalculateSimilarity(IOptimizable optimizable) {
+      return 1.0;
+    }
+
+    public override string ParameterInfoString {
+      get { return "null"; }
+    }
+
+    public override void CollectOptimizedParameterNames(List<string> parameterNames, string prefix) { }
+
+    public override List<IOptimizable> GetAllOptimizables() {
+      return new List<IOptimizable>();
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/ParameterizedValueConfiguration.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/ParameterizedValueConfiguration.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/ParameterizedValueConfiguration.cs	(revision 8517)
@@ -0,0 +1,196 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class ParameterizedValueConfiguration : ValueConfiguration {
+    [Storable]
+    protected IItemCollection<IParameterConfiguration> parameterConfigurations = new ItemCollection<IParameterConfiguration>();
+    public virtual IItemCollection<IParameterConfiguration> ParameterConfigurations {
+      get { return new ReadOnlyItemCollection<IParameterConfiguration>(this.parameterConfigurations); }
+      protected set { this.parameterConfigurations = value; }
+    }
+
+    public override bool Optimize {
+      get { return base.Optimize; }
+      set {
+        if (this.optimize != value) {
+          base.Optimize = value;
+          if (optimize) {
+            ClearParameterConfigurations();
+            PopulateParameterConfigurations(this.actualValue.Value, this.discoverValidValues);
+          } else {
+            ClearParameterConfigurations();
+          }
+        }
+      }
+    }
+
+    public override ConstrainedValue ActualValue {
+      get { return base.ActualValue; }
+      set {
+        ClearParameterConfigurations();
+        base.ActualValue = value;
+        if (this.Optimize && this.actualValue.Value != null) PopulateParameterConfigurations(this.actualValue.Value, this.discoverValidValues);
+      }
+    }
+
+    [Storable]
+    protected bool discoverValidValues;
+    public bool DiscoverValidValues {
+      get { return discoverValidValues; }
+      set { discoverValidValues = value; }
+    }
+
+    public override bool ValuesReadOnly {
+      set {
+        if (value != this.valuesReadOnly) {
+          this.valuesReadOnly = value;
+          foreach (var pc in this.parameterConfigurations) {
+            pc.ValuesReadOnly = value;
+          }
+        }
+      }
+    }
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected ParameterizedValueConfiguration(bool deserializing) : base(deserializing) { }
+    public ParameterizedValueConfiguration() {
+      this.ParameterConfigurations = new ItemList<IParameterConfiguration>();
+    }
+    public ParameterizedValueConfiguration(IItem value, Type valueDataType, bool discoverValidValues)
+      : base(value, valueDataType) {
+      this.discoverValidValues = discoverValidValues;
+    }
+    protected ParameterizedValueConfiguration(ParameterizedValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      this.discoverValidValues = original.discoverValidValues;
+      this.ParameterConfigurations = cloner.Clone(original.parameterConfigurations);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterizedValueConfiguration(this, cloner);
+    }
+    #endregion
+
+    protected virtual void PopulateParameterConfigurations(IItem item, bool discoverValidValues) {
+      var parameterizedItem = item as IParameterizedItem;
+      if (parameterizedItem != null) {
+        foreach (var childParameter in parameterizedItem.Parameters) {
+          IValueParameter valueParameter = childParameter as IValueParameter;
+          if (valueParameter != null) {
+            var pc = new ParameterConfiguration(valueParameter.Name, valueParameter, discoverValidValues);
+            this.parameterConfigurations.Add(pc);
+          }
+        }
+      }
+    }
+
+    protected virtual void ClearParameterConfigurations() {
+      parameterConfigurations.Clear();
+    }
+
+    public override string ParameterInfoString {
+      get {
+        StringBuilder sb = new StringBuilder();
+        if ((this.Optimize) && this.ParameterConfigurations.Count > 0) {
+          var parameterInfos = new List<string>();
+          foreach (var pc in this.ParameterConfigurations) {
+            if (pc.Optimize) parameterInfos.Add(pc.ParameterInfoString);
+          }
+          sb.Append(string.Join(", ", parameterInfos.ToArray()));
+        }
+        return sb.ToString();
+      }
+    }
+
+    public override string ToString() {
+      if (ActualValue != null && ActualValue.Value != null) {
+        if (Optimize) {
+          return string.Format("{0} (Optimize)", NumberedName);
+        } else {
+          return string.Format("{0}", NumberedName);
+        }
+      } else {
+        return base.ToString();
+      }
+    }
+
+    public override List<IOptimizable> GetAllOptimizables() {
+      var list = new List<IOptimizable>();
+      foreach (var pc in ParameterConfigurations) {
+        if (pc.Optimize) {
+          if (pc.ValueConfigurations.CheckedItems.Count() > 1) list.Add(pc); // only add if there are more than 1 choices. otherwise it makes no sense to optimize which VC is selected
+          list.AddRange(pc.GetAllOptimizables());
+        }
+      }
+      return list;
+    }
+
+    public override void CollectOptimizedParameterNames(List<string> parameterNames, string prefix) {
+      foreach (var pc in ParameterConfigurations) {
+        if (pc.Optimize) {
+          parameterNames.Add(prefix + pc.ParameterName);
+          pc.CollectOptimizedParameterNames(parameterNames, prefix + pc.ParameterName + ".");
+        }
+      }
+    }
+
+    public virtual IEnumerable<string> GetOptimizedParameterNames() {
+      var list = new List<string>();
+      this.CollectOptimizedParameterNames(list, string.Empty);
+      return list;
+    }
+
+    public virtual void Parameterize(IParameterizedItem item) {
+      foreach (IParameterConfiguration pc in this.ParameterConfigurations) {
+        pc.Parameterize((IValueParameter)item.Parameters[pc.ParameterName]);
+      }
+    }
+
+    public override void Randomize(IRandom random) {
+      foreach (IParameterConfiguration pc in this.ParameterConfigurations) {
+        pc.Randomize(random);
+      }
+    }
+
+    public override double CalculateSimilarity(IOptimizable optimizable) {
+      var other = (ParameterizedValueConfiguration)optimizable;
+      double sum = 0;
+      int count = 0;
+      for (int i = 0; i < ParameterConfigurations.Count; i++) {
+        if (this.ParameterConfigurations.ElementAt(i).Optimize) {
+          sum += this.ParameterConfigurations.ElementAt(i).CalculateSimilarity(other.ParameterConfigurations.ElementAt(i));
+          count++;
+        }
+      }
+      return count == 0 ? 1.0 : sum / (double)count;
+    }
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/RangeValueConfiguration.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/RangeValueConfiguration.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/RangeValueConfiguration.cs	(revision 8517)
@@ -0,0 +1,123 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  [StorableClass]
+  public class RangeValueConfiguration : ValueConfiguration {
+    [Storable]
+    protected IRange rangeConstraint;
+    public IRange RangeConstraint {
+      get { return rangeConstraint; }
+      private set {
+        if (rangeConstraint != value) {
+          DeregisterRangeConstraintEvents();
+          rangeConstraint = value;
+          RegisterRangeConstraintEvents();
+        }
+      }
+    }
+
+    #region Constructor and Cloning
+    [StorableConstructor]
+    protected RangeValueConfiguration(bool deserializing) : base(deserializing) { }
+    public RangeValueConfiguration() {
+
+    }
+    protected RangeValueConfiguration(RangeValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      this.rangeConstraint = cloner.Clone(original.RangeConstraint);
+      RegisterRangeConstraintEvents();
+    }
+    public RangeValueConfiguration(IItem value, Type valueDataType)
+      : base(value, valueDataType) {
+      if (actualValue.ValueDataType == typeof(IntValue)) {
+        RangeConstraint = new IntValueRange(new IntValue(0), (IntValue)value.Clone(), new IntValue(1));
+      } else if (actualValue.ValueDataType == typeof(DoubleValue)) {
+        RangeConstraint = new DoubleValueRange(new DoubleValue(0), (DoubleValue)value.Clone(), new DoubleValue(0.01));
+      } else if (actualValue.ValueDataType == typeof(PercentValue)) {
+        RangeConstraint = new PercentValueRange(new PercentValue(0), new PercentValue(1), new PercentValue(0.01));
+      } else if (actualValue.ValueDataType == typeof(BoolValue)) {
+        this.IsOptimizable = false; // there is nothing to configure for bools
+      } else {
+        RangeConstraint = null;
+      }
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RangeValueConfiguration(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterRangeConstraintEvents();
+    }
+    #endregion
+
+    private void RegisterRangeConstraintEvents() {
+      if (this.RangeConstraint != null) this.RangeConstraint.ToStringChanged += new EventHandler(RangeConstraint_ToStringChanged);
+    }
+    private void DeregisterRangeConstraintEvents() {
+      if (this.RangeConstraint != null) this.RangeConstraint.ToStringChanged -= new EventHandler(RangeConstraint_ToStringChanged);
+    }
+
+    public override string ToString() {
+      if (ActualValue != null && ActualValue.Value != null) {
+        if (Optimize) {
+          return string.Format("{0} (Optimize: {1})", NumberedName, RangeConstraint);
+        } else {
+          return string.Format("{0}: {1}", NumberedName, ActualValue.Value);
+        }
+      } else {
+        return base.ToString();
+      }
+    }
+
+    public override void Randomize(IRandom random) {
+      this.actualValue.Value = rangeConstraint.GetRandomValue(random);
+    }
+
+    public override double CalculateSimilarity(IOptimizable optimizable) {
+      var other = (IValueConfiguration)optimizable;
+      return this.RangeConstraint.CalculateSimilarity(this.ActualValue.Value, other.ActualValue.Value);
+    }
+
+    public override string ParameterInfoString {
+      get { return string.Empty; }
+    }
+
+    public override void CollectOptimizedParameterNames(List<string> parameterNames, string prefix) { }
+
+    public override List<IOptimizable> GetAllOptimizables() {
+      return new List<IOptimizable>();
+    }
+
+    #region Events
+    private void RangeConstraint_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    #endregion
+  }
+}
Index: /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/ValueConfiguration.cs
===================================================================
--- /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/ValueConfiguration.cs	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/ValueConfiguration.cs	(revision 8517)
@@ -0,0 +1,190 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
+  // TODO: ItemName/Descr, storability
+  [StorableClass]
+  public abstract class ValueConfiguration : NamedItem, IValueConfiguration {
+    public override bool CanChangeName {
+      get { return true; }
+    }
+
+    public override bool CanChangeDescription {
+      get { return true; }
+    }
+
+    [Storable]
+    protected bool isOptimizable;
+    public virtual bool IsOptimizable {
+      get { return isOptimizable; }
+      set {
+        if (this.isOptimizable != value) {
+          this.isOptimizable = value;
+          OnIsOptimizableChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected bool optimize;
+    public virtual bool Optimize {
+      get { return optimize; }
+      set {
+        if (optimize != value) {
+          if (value == true && !this.IsOptimizable)
+            throw new NotSupportedException("This value is not optimizable.");
+
+          optimize = value;
+          OnOptimizeChanged();
+          OnToStringChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected ConstrainedValue actualValue;
+    public virtual ConstrainedValue ActualValue {
+      get { return actualValue; }
+      set {
+        if (this.actualValue != value) {
+          DeregisterActualValueEvents();
+          this.actualValue = value;
+          OnValueChanged();
+          OnToStringChanged();
+          RegisterActualValueEvents();
+        }
+      }
+    }
+
+    [Storable]
+    protected int number = 0;
+    public int Number {
+      get { return number; }
+      set {
+        if (value != number) {
+          number = value;
+          OnToStringChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected bool valuesReadOnly = false;
+    public virtual bool ValuesReadOnly {
+      get { return valuesReadOnly; }
+      set {
+        if (value != this.valuesReadOnly) {
+          this.valuesReadOnly = value;
+        }
+      }
+    }
+
+    #region Constructors and Cloning
+    public ValueConfiguration(IItem value, Type valueDataType) {
+      this.ActualValue = new ConstrainedValue(value, valueDataType, new ItemSet<IItem> { value }, false);
+      this.IsOptimizable = true;
+    }
+
+    public ValueConfiguration() { }
+    [StorableConstructor]
+    protected ValueConfiguration(bool deserializing) { }
+    protected ValueConfiguration(ValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      this.actualValue = cloner.Clone(original.ActualValue);
+      this.isOptimizable = original.isOptimizable;
+      this.optimize = original.optimize;
+      this.number = original.number;
+      this.valuesReadOnly = original.valuesReadOnly;
+      RegisterActualValueEvents();
+    }
+    #endregion
+
+    private void RegisterActualValueEvents() {
+      if (this.actualValue != null) this.actualValue.ToStringChanged += new EventHandler(actualValue_ToStringChanged);
+    }
+    private void DeregisterActualValueEvents() {
+      if (this.actualValue != null) this.actualValue.ToStringChanged -= new EventHandler(actualValue_ToStringChanged);
+    }
+
+    #region Events
+    private void actualValue_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    #endregion
+
+    #region IItem Members
+    public override string ItemDescription {
+      get { return (actualValue != null && actualValue.Value != null) ? actualValue.Value.ItemDescription : base.ItemDescription; }
+    }
+
+    public override Image ItemImage {
+      get { return (actualValue != null && actualValue.Value != null) ? actualValue.Value.ItemImage : base.ItemImage; }
+    }
+
+    public override string ItemName {
+      get { return (actualValue != null && actualValue.Value != null) ? actualValue.Value.ItemDescription : base.ItemName; }
+    }
+    #endregion
+
+    #region Event Handlers
+    public virtual event EventHandler ValueChanged;
+    protected virtual void OnValueChanged() {
+      var handler = ValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public virtual event EventHandler IsOptimizableChanged;
+    private void OnIsOptimizableChanged() {
+      var handler = IsOptimizableChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public virtual event EventHandler OptimizeChanged;
+    protected virtual void OnOptimizeChanged() {
+      var handler = OptimizeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    public string NumberedName {
+      get {
+        if (this.number == 0) {
+          return (ActualValue != null && ActualValue.Value != null) ? ActualValue.Value.ItemName : base.ToString();
+        } else {
+          return string.Format("{0} {1}", ActualValue.Value.ItemName, number);
+        }
+      }
+    }
+
+    public abstract void Randomize(IRandom random);
+    public abstract double CalculateSimilarity(IOptimizable optimizable);
+    public abstract string ParameterInfoString { get; }
+    public abstract void CollectOptimizedParameterNames(List<string> parameterNames, string prefix);
+    public abstract List<IOptimizable> GetAllOptimizables();
+  }
+}
Index: /branches/ParameterConfigurationEncoding/ParameterConfigurationEncoding.sln
===================================================================
--- /branches/ParameterConfigurationEncoding/ParameterConfigurationEncoding.sln	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/ParameterConfigurationEncoding.sln	(revision 8517)
@@ -0,0 +1,26 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Encodings.ParameterConfigurationEncoding-3.3", "HeuristicLab.Encodings.ParameterConfigurationEncoding\3.3\HeuristicLab.Encodings.ParameterConfigurationEncoding-3.3.csproj", "{7520D3F4-7526-4BB7-B71E-F41F5D5559F9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Encodings.ParameterConfigurationEncoding.Views-3.3", "HeuristicLab.Encodings.ParameterConfigurationEncoding.Views\3.3\HeuristicLab.Encodings.ParameterConfigurationEncoding.Views-3.3.csproj", "{FDE4DD6C-EE0E-4830-8151-CE450448A4CC}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{7520D3F4-7526-4BB7-B71E-F41F5D5559F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7520D3F4-7526-4BB7-B71E-F41F5D5559F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7520D3F4-7526-4BB7-B71E-F41F5D5559F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7520D3F4-7526-4BB7-B71E-F41F5D5559F9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{FDE4DD6C-EE0E-4830-8151-CE450448A4CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FDE4DD6C-EE0E-4830-8151-CE450448A4CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FDE4DD6C-EE0E-4830-8151-CE450448A4CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FDE4DD6C-EE0E-4830-8151-CE450448A4CC}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: /branches/ParameterConfigurationEncoding/PreBuildEvent.cmd
===================================================================
--- /branches/ParameterConfigurationEncoding/PreBuildEvent.cmd	(revision 8517)
+++ /branches/ParameterConfigurationEncoding/PreBuildEvent.cmd	(revision 8517)
@@ -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"
