Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/CreateExperimentDialog.Designer.cs
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/CreateExperimentDialog.Designer.cs	(revision 9361)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/CreateExperimentDialog.Designer.cs	(revision 9361)
@@ -0,0 +1,534 @@
+﻿#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
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views {
+  partial class CreateExperimentDialog {
+    /// <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();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CreateExperimentDialog));
+      this.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.createBatchRunCheckBox = new System.Windows.Forms.CheckBox();
+      this.createBatchRunLabel = new System.Windows.Forms.Label();
+      this.repetitionsLabel = new System.Windows.Forms.Label();
+      this.repetitionsNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.experimentCreationBackgroundWorker = new System.ComponentModel.BackgroundWorker();
+      this.instanceDiscoveryProgressBar = new System.Windows.Forms.ProgressBar();
+      this.instanceDiscoveryProgressLabel = new System.Windows.Forms.Label();
+      this.selectAllCheckBox = new System.Windows.Forms.CheckBox();
+      this.selectNoneCheckBox = new System.Windows.Forms.CheckBox();
+      this.instanceDiscoveryBackgroundWorker = new System.ComponentModel.BackgroundWorker();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.parametersTabPage = new System.Windows.Forms.TabPage();
+      this.parametersSplitContainer = new System.Windows.Forms.SplitContainer();
+      this.parametersListView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.generateButton = new System.Windows.Forms.Button();
+      this.stringConvertibleArrayView = new HeuristicLab.Data.Views.StringConvertibleArrayView();
+      this.detailsTypeLabel = new System.Windows.Forms.Label();
+      this.choicesListView = new System.Windows.Forms.ListView();
+      this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.instancesTabPage = new System.Windows.Forms.TabPage();
+      this.label1 = new System.Windows.Forms.Label();
+      this.instancesTreeView = new System.Windows.Forms.TreeView();
+      this.experimentsToCreateDescriptionLabel = new System.Windows.Forms.Label();
+      this.variationsLabel = new System.Windows.Forms.Label();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.warningProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.experimentCreationProgressBar = new System.Windows.Forms.ProgressBar();
+      this.combinationsTextBox = new System.Windows.Forms.TextBox();
+      this.label2 = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.repetitionsNumericUpDown)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.parametersSplitContainer)).BeginInit();
+      this.parametersSplitContainer.Panel1.SuspendLayout();
+      this.parametersSplitContainer.Panel2.SuspendLayout();
+      this.parametersSplitContainer.SuspendLayout();
+      this.instancesTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.warningProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // 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(474, 377);
+      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(555, 377);
+      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;
+      // 
+      // 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);
+      // 
+      // 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:";
+      // 
+      // repetitionsLabel
+      // 
+      this.repetitionsLabel.AutoSize = true;
+      this.repetitionsLabel.Location = new System.Drawing.Point(12, 31);
+      this.repetitionsLabel.Name = "repetitionsLabel";
+      this.repetitionsLabel.Size = new System.Drawing.Size(63, 13);
+      this.repetitionsLabel.TabIndex = 2;
+      this.repetitionsLabel.Text = "&Repetitions:";
+      // 
+      // 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(517, 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);
+      // 
+      // experimentCreationBackgroundWorker
+      // 
+      this.experimentCreationBackgroundWorker.WorkerReportsProgress = true;
+      this.experimentCreationBackgroundWorker.WorkerSupportsCancellation = true;
+      this.experimentCreationBackgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.experimentCreationBackgroundWorker_DoWork);
+      this.experimentCreationBackgroundWorker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.experimentCreationBackgroundWorker_ProgressChanged);
+      this.experimentCreationBackgroundWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.experimentCreationBackgroundWorker_RunWorkerCompleted);
+      // 
+      // instanceDiscoveryProgressBar
+      // 
+      this.instanceDiscoveryProgressBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.instanceDiscoveryProgressBar.Location = new System.Drawing.Point(6, 141);
+      this.instanceDiscoveryProgressBar.Name = "instanceDiscoveryProgressBar";
+      this.instanceDiscoveryProgressBar.Size = new System.Drawing.Size(367, 23);
+      this.instanceDiscoveryProgressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+      this.instanceDiscoveryProgressBar.TabIndex = 4;
+      this.instanceDiscoveryProgressBar.Visible = false;
+      // 
+      // instanceDiscoveryProgressLabel
+      // 
+      this.instanceDiscoveryProgressLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.instanceDiscoveryProgressLabel.BackColor = System.Drawing.SystemColors.Control;
+      this.instanceDiscoveryProgressLabel.Location = new System.Drawing.Point(6, 167);
+      this.instanceDiscoveryProgressLabel.Name = "instanceDiscoveryProgressLabel";
+      this.instanceDiscoveryProgressLabel.Size = new System.Drawing.Size(367, 23);
+      this.instanceDiscoveryProgressLabel.TabIndex = 5;
+      this.instanceDiscoveryProgressLabel.Text = "label1";
+      this.instanceDiscoveryProgressLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+      this.instanceDiscoveryProgressLabel.Visible = false;
+      // 
+      // selectAllCheckBox
+      // 
+      this.selectAllCheckBox.AutoSize = true;
+      this.selectAllCheckBox.Location = new System.Drawing.Point(52, 12);
+      this.selectAllCheckBox.Name = "selectAllCheckBox";
+      this.selectAllCheckBox.Size = new System.Drawing.Size(36, 17);
+      this.selectAllCheckBox.TabIndex = 1;
+      this.selectAllCheckBox.Text = "all";
+      this.selectAllCheckBox.UseVisualStyleBackColor = true;
+      this.selectAllCheckBox.CheckedChanged += new System.EventHandler(this.selectAllCheckBox_CheckedChanged);
+      // 
+      // selectNoneCheckBox
+      // 
+      this.selectNoneCheckBox.AutoSize = true;
+      this.selectNoneCheckBox.Location = new System.Drawing.Point(94, 12);
+      this.selectNoneCheckBox.Name = "selectNoneCheckBox";
+      this.selectNoneCheckBox.Size = new System.Drawing.Size(50, 17);
+      this.selectNoneCheckBox.TabIndex = 2;
+      this.selectNoneCheckBox.Text = "none";
+      this.selectNoneCheckBox.UseVisualStyleBackColor = true;
+      this.selectNoneCheckBox.CheckedChanged += new System.EventHandler(this.selectNoneCheckBox_CheckedChanged);
+      // 
+      // instanceDiscoveryBackgroundWorker
+      // 
+      this.instanceDiscoveryBackgroundWorker.WorkerReportsProgress = true;
+      this.instanceDiscoveryBackgroundWorker.WorkerSupportsCancellation = true;
+      this.instanceDiscoveryBackgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.instanceDiscoveryBackgroundWorker_DoWork);
+      this.instanceDiscoveryBackgroundWorker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.instanceDiscoveryBackgroundWorker_ProgressChanged);
+      this.instanceDiscoveryBackgroundWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.instanceDiscoveryBackgroundWorker_RunWorkerCompleted);
+      // 
+      // tabControl
+      // 
+      this.tabControl.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.tabControl.Controls.Add(this.parametersTabPage);
+      this.tabControl.Controls.Add(this.instancesTabPage);
+      this.tabControl.Location = new System.Drawing.Point(15, 54);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(615, 317);
+      this.tabControl.TabIndex = 4;
+      // 
+      // parametersTabPage
+      // 
+      this.parametersTabPage.Controls.Add(this.parametersSplitContainer);
+      this.parametersTabPage.Location = new System.Drawing.Point(4, 22);
+      this.parametersTabPage.Name = "parametersTabPage";
+      this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.parametersTabPage.Size = new System.Drawing.Size(607, 291);
+      this.parametersTabPage.TabIndex = 1;
+      this.parametersTabPage.Text = "Parameter Variations";
+      this.parametersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // parametersSplitContainer
+      // 
+      this.parametersSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.parametersSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.parametersSplitContainer.Location = new System.Drawing.Point(3, 3);
+      this.parametersSplitContainer.Name = "parametersSplitContainer";
+      // 
+      // parametersSplitContainer.Panel1
+      // 
+      this.parametersSplitContainer.Panel1.Controls.Add(this.parametersListView);
+      // 
+      // parametersSplitContainer.Panel2
+      // 
+      this.parametersSplitContainer.Panel2.Controls.Add(this.generateButton);
+      this.parametersSplitContainer.Panel2.Controls.Add(this.stringConvertibleArrayView);
+      this.parametersSplitContainer.Panel2.Controls.Add(this.detailsTypeLabel);
+      this.parametersSplitContainer.Panel2.Controls.Add(this.choicesListView);
+      this.parametersSplitContainer.Size = new System.Drawing.Size(601, 285);
+      this.parametersSplitContainer.SplitterDistance = 155;
+      this.parametersSplitContainer.TabIndex = 1;
+      // 
+      // parametersListView
+      // 
+      this.parametersListView.CheckBoxes = true;
+      this.parametersListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.parametersListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.parametersListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.parametersListView.Location = new System.Drawing.Point(0, 0);
+      this.parametersListView.MultiSelect = false;
+      this.parametersListView.Name = "parametersListView";
+      this.parametersListView.Size = new System.Drawing.Size(155, 285);
+      this.parametersListView.TabIndex = 0;
+      this.parametersListView.UseCompatibleStateImageBehavior = false;
+      this.parametersListView.View = System.Windows.Forms.View.Details;
+      this.parametersListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.parametersListView_ItemChecked);
+      this.parametersListView.SelectedIndexChanged += new System.EventHandler(this.parametersListView_SelectedIndexChanged);
+      // 
+      // columnHeader1
+      // 
+      this.columnHeader1.Width = 150;
+      // 
+      // generateButton
+      // 
+      this.generateButton.Location = new System.Drawing.Point(16, 10);
+      this.generateButton.Name = "generateButton";
+      this.generateButton.Size = new System.Drawing.Size(75, 23);
+      this.generateButton.TabIndex = 8;
+      this.generateButton.Text = "Generate...";
+      this.generateButton.UseVisualStyleBackColor = true;
+      this.generateButton.Click += new System.EventHandler(this.generateButton_Click);
+      // 
+      // stringConvertibleArrayView
+      // 
+      this.stringConvertibleArrayView.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.stringConvertibleArrayView.Caption = "StringConvertibleArray View";
+      this.stringConvertibleArrayView.Content = null;
+      this.stringConvertibleArrayView.Location = new System.Drawing.Point(16, 39);
+      this.stringConvertibleArrayView.Name = "stringConvertibleArrayView";
+      this.stringConvertibleArrayView.ReadOnly = false;
+      this.stringConvertibleArrayView.Size = new System.Drawing.Size(411, 233);
+      this.stringConvertibleArrayView.TabIndex = 7;
+      // 
+      // detailsTypeLabel
+      // 
+      this.detailsTypeLabel.AutoSize = true;
+      this.detailsTypeLabel.Location = new System.Drawing.Point(13, 15);
+      this.detailsTypeLabel.Name = "detailsTypeLabel";
+      this.detailsTypeLabel.Size = new System.Drawing.Size(48, 13);
+      this.detailsTypeLabel.TabIndex = 0;
+      this.detailsTypeLabel.Text = "Choices:";
+      // 
+      // choicesListView
+      // 
+      this.choicesListView.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.choicesListView.CheckBoxes = true;
+      this.choicesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader2});
+      this.choicesListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.choicesListView.Location = new System.Drawing.Point(16, 34);
+      this.choicesListView.Name = "choicesListView";
+      this.choicesListView.Size = new System.Drawing.Size(411, 238);
+      this.choicesListView.TabIndex = 6;
+      this.choicesListView.UseCompatibleStateImageBehavior = false;
+      this.choicesListView.View = System.Windows.Forms.View.Details;
+      this.choicesListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.choiceListView_ItemChecked);
+      // 
+      // columnHeader2
+      // 
+      this.columnHeader2.Width = 150;
+      // 
+      // instancesTabPage
+      // 
+      this.instancesTabPage.Controls.Add(this.label1);
+      this.instancesTabPage.Controls.Add(this.instanceDiscoveryProgressBar);
+      this.instancesTabPage.Controls.Add(this.selectNoneCheckBox);
+      this.instancesTabPage.Controls.Add(this.instanceDiscoveryProgressLabel);
+      this.instancesTabPage.Controls.Add(this.selectAllCheckBox);
+      this.instancesTabPage.Controls.Add(this.instancesTreeView);
+      this.instancesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.instancesTabPage.Name = "instancesTabPage";
+      this.instancesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.instancesTabPage.Size = new System.Drawing.Size(379, 291);
+      this.instancesTabPage.TabIndex = 0;
+      this.instancesTabPage.Text = "Problem Instances";
+      this.instancesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(6, 13);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(40, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "Select:";
+      // 
+      // instancesTreeView
+      // 
+      this.instancesTreeView.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.instancesTreeView.CheckBoxes = true;
+      this.instancesTreeView.Location = new System.Drawing.Point(6, 35);
+      this.instancesTreeView.Name = "instancesTreeView";
+      this.instancesTreeView.Size = new System.Drawing.Size(367, 250);
+      this.instancesTreeView.TabIndex = 6;
+      this.instancesTreeView.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.instancesTreeView_AfterCheck);
+      // 
+      // experimentsToCreateDescriptionLabel
+      // 
+      this.experimentsToCreateDescriptionLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.experimentsToCreateDescriptionLabel.AutoSize = true;
+      this.experimentsToCreateDescriptionLabel.Location = new System.Drawing.Point(12, 382);
+      this.experimentsToCreateDescriptionLabel.Name = "experimentsToCreateDescriptionLabel";
+      this.experimentsToCreateDescriptionLabel.Size = new System.Drawing.Size(56, 13);
+      this.experimentsToCreateDescriptionLabel.TabIndex = 5;
+      this.experimentsToCreateDescriptionLabel.Text = "Variations:";
+      // 
+      // variationsLabel
+      // 
+      this.variationsLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.variationsLabel.AutoSize = true;
+      this.variationsLabel.Location = new System.Drawing.Point(74, 382);
+      this.variationsLabel.Name = "variationsLabel";
+      this.variationsLabel.Size = new System.Drawing.Size(13, 13);
+      this.variationsLabel.TabIndex = 6;
+      this.variationsLabel.Text = "1";
+      this.variationsLabel.TextChanged += new System.EventHandler(this.experimentsLabel_TextChanged);
+      // 
+      // 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;
+      this.warningProvider.Icon = ((System.Drawing.Icon)(resources.GetObject("warningProvider.Icon")));
+      // 
+      // experimentCreationProgressBar
+      // 
+      this.experimentCreationProgressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.experimentCreationProgressBar.Location = new System.Drawing.Point(371, 377);
+      this.experimentCreationProgressBar.Name = "experimentCreationProgressBar";
+      this.experimentCreationProgressBar.Size = new System.Drawing.Size(178, 23);
+      this.experimentCreationProgressBar.TabIndex = 9;
+      this.experimentCreationProgressBar.Visible = false;
+      // 
+      // combinationsTextBox
+      // 
+      this.combinationsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.combinationsTextBox.Location = new System.Drawing.Point(265, 379);
+      this.combinationsTextBox.Name = "combinationsTextBox";
+      this.combinationsTextBox.Size = new System.Drawing.Size(100, 20);
+      this.combinationsTextBox.TabIndex = 10;
+      this.combinationsTextBox.Text = "10";
+      // 
+      // label2
+      // 
+      this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(173, 382);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(86, 13);
+      this.label2.TabIndex = 11;
+      this.label2.Text = "Var. to generate:";
+      // 
+      // CreateExperimentDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(642, 412);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.combinationsTextBox);
+      this.Controls.Add(this.experimentCreationProgressBar);
+      this.Controls.Add(this.variationsLabel);
+      this.Controls.Add(this.experimentsToCreateDescriptionLabel);
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.repetitionsNumericUpDown);
+      this.Controls.Add(this.repetitionsLabel);
+      this.Controls.Add(this.createBatchRunLabel);
+      this.Controls.Add(this.createBatchRunCheckBox);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "CreateExperimentDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Create Experiment";
+      this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.CreateExperimentDialog_FormClosing);
+      this.Load += new System.EventHandler(this.CreateExperimentDialog_Load);
+      ((System.ComponentModel.ISupportInitialize)(this.repetitionsNumericUpDown)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.parametersSplitContainer.Panel1.ResumeLayout(false);
+      this.parametersSplitContainer.Panel2.ResumeLayout(false);
+      this.parametersSplitContainer.Panel2.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.parametersSplitContainer)).EndInit();
+      this.parametersSplitContainer.ResumeLayout(false);
+      this.instancesTabPage.ResumeLayout(false);
+      this.instancesTabPage.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.warningProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.CheckBox createBatchRunCheckBox;
+    private System.Windows.Forms.Label createBatchRunLabel;
+    private System.Windows.Forms.Label repetitionsLabel;
+    private System.Windows.Forms.NumericUpDown repetitionsNumericUpDown;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.ComponentModel.BackgroundWorker experimentCreationBackgroundWorker;
+    private System.Windows.Forms.ProgressBar instanceDiscoveryProgressBar;
+    private System.Windows.Forms.Label instanceDiscoveryProgressLabel;
+    private System.Windows.Forms.CheckBox selectAllCheckBox;
+    private System.Windows.Forms.CheckBox selectNoneCheckBox;
+    private System.ComponentModel.BackgroundWorker instanceDiscoveryBackgroundWorker;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage parametersTabPage;
+    private System.Windows.Forms.TabPage instancesTabPage;
+    private System.Windows.Forms.SplitContainer parametersSplitContainer;
+    private System.Windows.Forms.ListView parametersListView;
+    private System.Windows.Forms.ColumnHeader columnHeader1;
+    private System.Windows.Forms.Label experimentsToCreateDescriptionLabel;
+    private System.Windows.Forms.Label variationsLabel;
+    private System.Windows.Forms.Label detailsTypeLabel;
+    private System.Windows.Forms.ListView choicesListView;
+    private System.Windows.Forms.ColumnHeader columnHeader2;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+    private System.Windows.Forms.ErrorProvider warningProvider;
+    private System.Windows.Forms.TreeView instancesTreeView;
+    private Data.Views.StringConvertibleArrayView stringConvertibleArrayView;
+    private System.Windows.Forms.ProgressBar experimentCreationProgressBar;
+    private System.Windows.Forms.Button generateButton;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox combinationsTextBox;
+
+  }
+}
Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/CreateExperimentDialog.cs
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/CreateExperimentDialog.cs	(revision 9361)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/CreateExperimentDialog.cs	(revision 9361)
@@ -0,0 +1,971 @@
+﻿#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.ComponentModel;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.Instances;
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views {
+  public partial class CreateExperimentDialog : Form {
+    private enum DialogMode { Normal = 1, DiscoveringInstances = 2, CreatingExperiment = 3, PreparingExperiment = 4 };
+
+    private IOptimizer optimizer;
+    public IOptimizer Optimizer {
+      get { return optimizer; }
+      set {
+        optimizer = value;
+        Experiment = null;
+        okButton.Enabled = optimizer != null;
+        SetTabControlVisibility();
+        FillInstanceTreeViewAsync();
+        FillParametersListView();
+      }
+    }
+
+    public Experiment Experiment { get; private set; }
+
+    private bool createBatchRun;
+    private int repetitions;
+    private Dictionary<IProblemInstanceProvider, HashSet<IDataDescriptor>> instances;
+    private Dictionary<IValueParameter, IntArray> intParameters;
+    private Dictionary<IValueParameter, DoubleArray> doubleParameters;
+    private HashSet<IValueParameter> boolParameters;
+    private Dictionary<IValueParameter, HashSet<IItem>> multipleChoiceParameters;
+    private IItem optionalNullChoice = new BoolValue(); // any item will do
+
+    private StringBuilder failedInstances;
+    private EventWaitHandle backgroundWorkerWaitHandle = new ManualResetEvent(false);
+    private bool suppressTreeViewEventHandling, suppressCheckAllNoneEventHandling;
+
+    public CreateExperimentDialog() : this(null) { }
+    public CreateExperimentDialog(IOptimizer optimizer) {
+      InitializeComponent();
+      instanceDiscoveryProgressLabel.BackColor = instancesTabPage.BackColor;
+      createBatchRun = createBatchRunCheckBox.Checked;
+      repetitions = (int)repetitionsNumericUpDown.Value;
+      // do not set the Optimizer property here, because we want to delay instance discovery to the time when the form loads
+      this.optimizer = optimizer;
+      Experiment = null;
+      okButton.Enabled = optimizer != null;
+
+      instances = new Dictionary<IProblemInstanceProvider, HashSet<IDataDescriptor>>();
+      intParameters = new Dictionary<IValueParameter, IntArray>();
+      doubleParameters = new Dictionary<IValueParameter, DoubleArray>();
+      boolParameters = new HashSet<IValueParameter>();
+      multipleChoiceParameters = new Dictionary<IValueParameter, HashSet<IItem>>();
+    }
+
+    #region Event handlers
+    private void CreateExperimentDialog_Load(object sender, EventArgs e) {
+      SetTabControlVisibility();
+      FillInstanceTreeViewAsync();
+      FillParametersListView();
+    }
+
+    private void CreateExperimentDialog_FormClosing(object sender, FormClosingEventArgs e) {
+      if (experimentCreationBackgroundWorker.IsBusy) {
+        if (DialogResult != System.Windows.Forms.DialogResult.OK) {
+          if (experimentCreationBackgroundWorker.IsBusy) experimentCreationBackgroundWorker.CancelAsync();
+          if (instanceDiscoveryBackgroundWorker.IsBusy) instanceDiscoveryBackgroundWorker.CancelAsync();
+        }
+        e.Cancel = true;
+      }
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      SetMode(DialogMode.CreatingExperiment);
+      experimentCreationBackgroundWorker.RunWorkerAsync();
+      backgroundWorkerWaitHandle.WaitOne(); // make sure the background worker has started before exiting
+    }
+
+    #region Parameters variation
+    private void parametersListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      var parameter = (IValueParameter)e.Item.Tag;
+      var isConstrainedValueParameter = typeof(OptionalConstrainedValueParameter<>).Equals(parameter.GetType().GetGenericTypeDefinition())
+        || typeof(ConstrainedValueParameter<>).Equals(parameter.GetType().GetGenericTypeDefinition());
+
+      if (!isConstrainedValueParameter && parameter.Value == null) {
+        if (e.Item.Checked) e.Item.Checked = false;
+        return;
+      }
+
+      if (isConstrainedValueParameter) {
+        if (e.Item.Checked) multipleChoiceParameters.Add(parameter, new HashSet<IItem>());
+        else multipleChoiceParameters.Remove(parameter);
+      }
+
+      var intValue = parameter.Value as ValueTypeValue<int>;
+      if (intValue != null) {
+        if (e.Item.Checked) {
+          IntArray initialValues;
+          if (intValue.Value == int.MinValue)
+            initialValues = new IntArray(new int[] { -100, -50, 5 });
+          else if (intValue.Value == int.MaxValue)
+            initialValues = new IntArray(new int[] { 5, 50, 100 });
+          else if (intValue.Value == 0)
+            initialValues = new IntArray(new int[] { 0, 1, 2 });
+          else if (Math.Abs(intValue.Value) < 10)
+            initialValues = new IntArray(new int[] { intValue.Value - 1, intValue.Value, intValue.Value + 1 });
+          else initialValues = new IntArray(new int[] { intValue.Value / 2, intValue.Value, intValue.Value * 2 });
+          intParameters.Add(parameter, initialValues);
+          intParameters[parameter].Reset += new EventHandler(ValuesArray_Reset);
+        } else intParameters.Remove(parameter);
+      }
+
+      var doubleValue = parameter.Value as ValueTypeValue<double>;
+      if (doubleValue != null) {
+        if (e.Item.Checked) {
+          DoubleArray initialValues;
+          if (doubleValue.Value == double.MinValue)
+            initialValues = new DoubleArray(new double[] { -1, -0.5, 0 });
+          else if (doubleValue.Value == double.MaxValue)
+            initialValues = new DoubleArray(new double[] { 0, 0.5, 1 });
+          else if (doubleValue.Value == 0.0)
+            initialValues = new DoubleArray(new double[] { 0, 0.1, 0.2 });
+          else if (Math.Abs(doubleValue.Value) <= 1.0) {
+            if (doubleValue.Value > 0.9 || (doubleValue.Value < 0.0 && doubleValue.Value > -0.1))
+              initialValues = new DoubleArray(new double[] { doubleValue.Value - 0.2, doubleValue.Value - 0.1, doubleValue.Value });
+            else if (doubleValue.Value < -0.9 || (doubleValue.Value > 0 && doubleValue.Value < 0.1))
+              initialValues = new DoubleArray(new double[] { doubleValue.Value, doubleValue.Value + 0.1, doubleValue.Value + 0.2 });
+            else initialValues = new DoubleArray(new double[] { doubleValue.Value - 0.1, doubleValue.Value, doubleValue.Value + 0.1 });
+          } else initialValues = new DoubleArray(new double[] { doubleValue.Value / 2.0, doubleValue.Value, doubleValue.Value * 2.0 });
+          doubleParameters.Add(parameter, initialValues);
+          doubleParameters[parameter].Reset += new EventHandler(ValuesArray_Reset);
+        } else doubleParameters.Remove(parameter);
+      }
+
+      var boolValue = parameter.Value as ValueTypeValue<bool>;
+      if (boolValue != null) {
+        if (e.Item.Checked) boolParameters.Add(parameter);
+        else boolParameters.Remove(parameter);
+      }
+
+      UpdateVariationsLabel();
+      if (e.Item.Selected) UpdateDetailsView(parameter);
+      else e.Item.Selected = true;
+    }
+
+    private void parametersListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (parametersListView.SelectedItems.Count == 0) {
+        ClearDetailsView();
+      } else {
+        var parameter = parametersListView.SelectedItems[0].Tag as IValueParameter;
+        UpdateDetailsView(parameter);
+      }
+    }
+
+    private void UpdateDetailsView(IValueParameter parameter) {
+      ClearDetailsView();
+
+      var isOptionalConstrainedValueParameter = typeof(OptionalConstrainedValueParameter<>).IsAssignableFrom(parameter.GetType().GetGenericTypeDefinition());
+      var isConstrainedValueParameter =
+        isOptionalConstrainedValueParameter
+        || typeof(ConstrainedValueParameter<>).Equals(parameter.GetType().GetGenericTypeDefinition());
+
+      if (isConstrainedValueParameter) {
+        detailsTypeLabel.Text = "Choices:";
+        choicesListView.Tag = parameter;
+
+        if (isOptionalConstrainedValueParameter) {
+          choicesListView.Items.Add(new ListViewItem("-") {
+            Tag = optionalNullChoice,
+            Checked = multipleChoiceParameters.ContainsKey(parameter)
+            && multipleChoiceParameters[parameter].Contains(optionalNullChoice)
+          });
+        }
+        dynamic constrainedValuedParameter = parameter;
+        dynamic validValues = constrainedValuedParameter.ValidValues;
+        foreach (var choice in validValues) {
+          choicesListView.Items.Add(new ListViewItem(choice.ToString()) {
+            Tag = choice,
+            Checked = multipleChoiceParameters.ContainsKey(parameter)
+            && multipleChoiceParameters[parameter].Contains(choice)
+          });
+        }
+        choicesListView.Enabled = multipleChoiceParameters.ContainsKey(parameter);
+        detailsTypeLabel.Visible = true;
+        choicesListView.Visible = true;
+        return;
+      }
+
+      if (parameter.Value is ValueTypeValue<bool>) {
+        detailsTypeLabel.Text = "Boolean parameter: True / False";
+        detailsTypeLabel.Visible = true;
+      }
+
+      var intValue = parameter.Value as ValueTypeValue<int>;
+      if (intValue != null) {
+        if (intParameters.ContainsKey(parameter))
+          stringConvertibleArrayView.Content = intParameters[parameter];
+        stringConvertibleArrayView.Visible = true;
+        stringConvertibleArrayView.ReadOnly = !intParameters.ContainsKey(parameter);
+        generateButton.Tag = parameter;
+        generateButton.Enabled = intParameters.ContainsKey(parameter);
+        generateButton.Visible = true;
+        return;
+      }
+
+      var doubleValue = parameter.Value as ValueTypeValue<double>;
+      if (doubleValue != null) {
+        if (doubleParameters.ContainsKey(parameter))
+          stringConvertibleArrayView.Content = doubleParameters[parameter];
+        stringConvertibleArrayView.Visible = true;
+        stringConvertibleArrayView.ReadOnly = !doubleParameters.ContainsKey(parameter);
+        generateButton.Tag = parameter;
+        generateButton.Enabled = doubleParameters.ContainsKey(parameter);
+        generateButton.Visible = true;
+        return;
+      }
+    }
+
+    #region Detail controls
+    private void choiceListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      var parameter = (IValueParameter)choicesListView.Tag;
+      if (multipleChoiceParameters.ContainsKey(parameter)) {
+        if (e.Item.Checked) {
+          multipleChoiceParameters[parameter].Add((IItem)e.Item.Tag);
+        } else multipleChoiceParameters[parameter].Remove((IItem)e.Item.Tag);
+
+        UpdateVariationsLabel();
+      }
+    }
+
+    private void generateButton_Click(object sender, EventArgs e) {
+      var parameter = (IValueParameter)generateButton.Tag;
+      bool integerOnly = intParameters.ContainsKey(parameter);
+      double min = 0, max = 1, step = 1;
+      #region Try to calculate some meaningful values
+      if (integerOnly) {
+        int len = intParameters[parameter].Length;
+        if (len > 0) {
+          min = intParameters[parameter].Min();
+          max = intParameters[parameter].Max();
+          step = len >= 2 ? Math.Abs((intParameters[parameter][len - 1] - intParameters[parameter][len - 2])) : 1;
+        }
+      } else {
+        int len = doubleParameters[parameter].Length;
+        if (len > 0) {
+          min = doubleParameters[parameter].Min();
+          max = doubleParameters[parameter].Max();
+          step = len >= 2 ? Math.Abs((doubleParameters[parameter][len - 1] - doubleParameters[parameter][len - 2])) : 1;
+        }
+      }
+      #endregion
+      using (var dialog = new DefineArithmeticProgressionDialog(integerOnly, min, max, step)) {
+        if (dialog.ShowDialog(this) == DialogResult.OK) {
+          var values = dialog.Values;
+          if (integerOnly) {
+            intParameters[parameter].Reset -= new EventHandler(ValuesArray_Reset);
+            intParameters[parameter] = new IntArray(values.Select(x => (int)x).ToArray());
+            intParameters[parameter].Reset += new EventHandler(ValuesArray_Reset);
+            stringConvertibleArrayView.Content = intParameters[parameter];
+          } else {
+            doubleParameters[parameter].Reset -= new EventHandler(ValuesArray_Reset);
+            doubleParameters[parameter] = new DoubleArray(values.ToArray());
+            doubleParameters[parameter].Reset += new EventHandler(ValuesArray_Reset);
+            stringConvertibleArrayView.Content = doubleParameters[parameter];
+          }
+          UpdateVariationsLabel();
+        }
+      }
+    }
+
+    private void ValuesArray_Reset(object sender, EventArgs e) {
+      UpdateVariationsLabel();
+    }
+    #endregion
+    #endregion
+
+    #region Instances
+    private void instancesTreeView_AfterCheck(object sender, TreeViewEventArgs e) {
+      if (!suppressTreeViewEventHandling) {
+        if (e.Node.Nodes.Count > 0) { // provider node was (un)checked
+          SyncProviderNode(e.Node);
+        } else { // descriptor node was (un)checked
+          SyncInstanceNode(e.Node);
+        }
+
+        suppressCheckAllNoneEventHandling = true;
+        try {
+          var treeViewNodes = instancesTreeView.Nodes.OfType<TreeNode>().SelectMany(x => x.Nodes.OfType<TreeNode>());
+          selectAllCheckBox.Checked = treeViewNodes.Count() == instances.SelectMany(x => x.Value).Count();
+          selectNoneCheckBox.Checked = !treeViewNodes.Any(x => x.Checked);
+        }
+        finally { suppressCheckAllNoneEventHandling = false; }
+        UpdateVariationsLabel();
+      }
+    }
+
+    private void SyncProviderNode(TreeNode node) {
+      suppressTreeViewEventHandling = true;
+      try {
+        foreach (TreeNode n in node.Nodes) {
+          if (n.Checked != node.Checked) {
+            n.Checked = node.Checked;
+            SyncInstanceNode(n, false);
+          }
+        }
+      }
+      finally { suppressTreeViewEventHandling = false; }
+    }
+
+    private void SyncInstanceNode(TreeNode node, bool providerCheck = true) {
+      var provider = (IProblemInstanceProvider)node.Parent.Tag;
+      var descriptor = (IDataDescriptor)node.Tag;
+      if (node.Checked) {
+        if (!instances.ContainsKey(provider))
+          instances.Add(provider, new HashSet<IDataDescriptor>());
+        instances[provider].Add(descriptor);
+      } else {
+        if (instances.ContainsKey(provider)) {
+          instances[provider].Remove(descriptor);
+          if (instances[provider].Count == 0)
+            instances.Remove(provider);
+        }
+      }
+      if (providerCheck) {
+        bool allChecked = node.Parent.Nodes.OfType<TreeNode>().All(x => x.Checked);
+        suppressTreeViewEventHandling = true;
+        try {
+          node.Parent.Checked = allChecked;
+        }
+        finally { suppressTreeViewEventHandling = false; }
+      }
+    }
+
+    private void selectAllCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (!suppressCheckAllNoneEventHandling) {
+        if (selectAllCheckBox.Checked) {
+          suppressCheckAllNoneEventHandling = true;
+          try { selectNoneCheckBox.Checked = false; }
+          finally { suppressCheckAllNoneEventHandling = false; }
+          try {
+            suppressTreeViewEventHandling = true;
+            foreach (TreeNode node in instancesTreeView.Nodes) {
+              if (!node.Checked) {
+                node.Checked = true;
+                SyncProviderNode(node);
+              }
+            }
+          }
+          finally { suppressTreeViewEventHandling = false; }
+        }
+        UpdateVariationsLabel();
+      }
+    }
+
+    private void selectNoneCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (!suppressCheckAllNoneEventHandling) {
+        if (selectNoneCheckBox.Checked) {
+          suppressCheckAllNoneEventHandling = true;
+          try { selectAllCheckBox.Checked = false; }
+          finally { suppressCheckAllNoneEventHandling = false; }
+          try {
+            suppressTreeViewEventHandling = true;
+            foreach (TreeNode node in instancesTreeView.Nodes) {
+              if (node.Checked) {
+                node.Checked = false;
+                SyncProviderNode(node);
+              }
+            }
+          }
+          finally { suppressTreeViewEventHandling = false; }
+        }
+        UpdateVariationsLabel();
+      }
+    }
+    #endregion
+
+    private void createBatchRunCheckBox_CheckedChanged(object sender, EventArgs e) {
+      repetitionsNumericUpDown.Enabled = createBatchRunCheckBox.Checked;
+      createBatchRun = createBatchRunCheckBox.Checked;
+    }
+
+    private void repetitionsNumericUpDown_Validated(object sender, EventArgs e) {
+      if (repetitionsNumericUpDown.Text == string.Empty)
+        repetitionsNumericUpDown.Text = repetitionsNumericUpDown.Value.ToString();
+      repetitions = (int)repetitionsNumericUpDown.Value;
+    }
+
+    private void experimentsLabel_TextChanged(object sender, EventArgs e) {
+      long number;
+      if (long.TryParse(variationsLabel.Text, NumberStyles.AllowThousands, CultureInfo.CurrentCulture.NumberFormat, out number)) {
+        if (number > 1000) warningProvider.SetError(variationsLabel, "Consider reducing the number of variations!");
+        else warningProvider.SetError(variationsLabel, null);
+      }
+    }
+    #endregion
+
+    #region Helpers
+    private void SetTabControlVisibility() {
+      bool isAlgorithm = optimizer != null && optimizer is IAlgorithm;
+      bool instancesAvailable = isAlgorithm
+        && ((IAlgorithm)optimizer).Problem != null
+        && ProblemInstanceManager.GetProviders(((IAlgorithm)optimizer).Problem).Any();
+      if (instancesAvailable && tabControl.TabCount == 1)
+        tabControl.TabPages.Add(instancesTabPage);
+      else if (!instancesAvailable && tabControl.TabCount == 2)
+        tabControl.TabPages.Remove(instancesTabPage);
+      tabControl.Visible = isAlgorithm;
+      if (isAlgorithm) {
+        variationsLabel.Visible = true;
+        experimentsToCreateDescriptionLabel.Visible = true;
+        Height = 450;
+      } else {
+        variationsLabel.Visible = false;
+        experimentsToCreateDescriptionLabel.Visible = false;
+        Height = 130;
+      }
+    }
+
+    private void FillParametersListView() {
+      parametersListView.Items.Clear();
+      intParameters.Clear();
+      doubleParameters.Clear();
+      boolParameters.Clear();
+      multipleChoiceParameters.Clear();
+
+      if (Optimizer is IAlgorithm) {
+        var parameters = ((IAlgorithm)optimizer).Parameters;
+        foreach (var param in parameters) {
+          var valueParam = param as IValueParameter;
+          if (valueParam != null && (valueParam.Value is ValueTypeValue<bool>
+              || valueParam.Value is ValueTypeValue<int>
+              || valueParam.Value is ValueTypeValue<double>)
+            || typeof(OptionalConstrainedValueParameter<>).IsAssignableFrom(param.GetType().GetGenericTypeDefinition())
+            || typeof(ConstrainedValueParameter<>).IsAssignableFrom(param.GetType().GetGenericTypeDefinition()))
+            parametersListView.Items.Add(new ListViewItem(param.Name) { Tag = param });
+        }
+      }
+    }
+
+    private void FillInstanceTreeViewAsync() {
+      instances.Clear();
+      instancesTreeView.Nodes.Clear();
+
+      if (Optimizer is IAlgorithm && ((IAlgorithm)Optimizer).Problem != null) {
+        SetMode(DialogMode.DiscoveringInstances);
+        instanceDiscoveryBackgroundWorker.RunWorkerAsync();
+      }
+    }
+
+    private void AddOptimizer(IOptimizer optimizer, Experiment experiment) {
+      if (createBatchRun) {
+        var batchRun = new BatchRun(repetitions.ToString() + "x " + optimizer.Name) {
+          Repetitions = repetitions,
+          Optimizer = optimizer
+        };
+        experiment.Optimizers.Add(batchRun);
+      } else {
+        experiment.Optimizers.Add(optimizer);
+      }
+    }
+
+    private int GetNumberOfVariations() {
+      int instancesCount = 1;
+      if (instances.Values.Any())
+        instancesCount = Math.Max(instances.Values.SelectMany(x => x).Count(), 1);
+
+      int intParameterVariations = 1;
+      foreach (var intParam in intParameters.Values) {
+        intParameterVariations *= Math.Max(intParam.Length, 1);
+      }
+      int doubleParameterVariations = 1;
+      foreach (var doubleParam in doubleParameters.Values) {
+        doubleParameterVariations *= Math.Max(doubleParam.Length, 1);
+      }
+      int boolParameterVariations = 1;
+      foreach (var boolParam in boolParameters) {
+        boolParameterVariations *= 2;
+      }
+      int choiceParameterVariations = 1;
+      foreach (var choiceParam in multipleChoiceParameters.Values) {
+        choiceParameterVariations *= Math.Max(choiceParam.Count, 1);
+      }
+
+      return (instancesCount * intParameterVariations * doubleParameterVariations * boolParameterVariations * choiceParameterVariations);
+    }
+
+    private void SetMode(DialogMode mode) {
+      if (InvokeRequired) Invoke((Action<DialogMode>)SetMode, mode);
+      else {
+        createBatchRunCheckBox.Enabled = mode == DialogMode.Normal;
+        repetitionsNumericUpDown.Enabled = mode == DialogMode.Normal;
+        parametersSplitContainer.Enabled = mode == DialogMode.Normal || mode == DialogMode.DiscoveringInstances;
+        selectAllCheckBox.Enabled = mode == DialogMode.Normal;
+        selectNoneCheckBox.Enabled = mode == DialogMode.Normal;
+        instancesTreeView.Enabled = mode == DialogMode.Normal;
+        instancesTreeView.Visible = mode == DialogMode.Normal || mode == DialogMode.CreatingExperiment || mode == DialogMode.PreparingExperiment;
+        okButton.Enabled = mode == DialogMode.Normal;
+        okButton.Visible = mode != DialogMode.CreatingExperiment && mode != DialogMode.PreparingExperiment;
+        cancelButton.Enabled = mode != DialogMode.PreparingExperiment;
+        instanceDiscoveryProgressLabel.Visible = mode == DialogMode.DiscoveringInstances;
+        instanceDiscoveryProgressBar.Visible = mode == DialogMode.DiscoveringInstances;
+        experimentCreationProgressBar.Visible = mode == DialogMode.CreatingExperiment || mode == DialogMode.PreparingExperiment;
+      }
+    }
+
+    private void ClearDetailsView() {
+      stringConvertibleArrayView.Visible = false;
+      stringConvertibleArrayView.Content = null;
+      stringConvertibleArrayView.ReadOnly = true;
+      generateButton.Visible = false;
+      detailsTypeLabel.Visible = false;
+      choicesListView.Items.Clear();
+      choicesListView.Enabled = false;
+      choicesListView.Visible = false;
+    }
+
+    private void UpdateVariationsLabel() {
+      variationsLabel.Text = GetNumberOfVariations().ToString("#,#", CultureInfo.CurrentCulture);
+    }
+
+    #region Retrieve parameter combinations
+    private IEnumerable<Dictionary<IValueParameter, int>> GetIntParameterConfigurations() {
+      var configuration = new Dictionary<IValueParameter, int>();
+      var enumerators = new Dictionary<IValueParameter, IEnumerator<int>>();
+      bool finished;
+      do {
+        foreach (var p in intParameters) {
+          if (!enumerators.ContainsKey(p.Key)) {
+            enumerators[p.Key] = p.Value.GetEnumerator();
+            enumerators[p.Key].MoveNext();
+          }
+          configuration[p.Key] = enumerators[p.Key].Current;
+        }
+        yield return configuration;
+
+        finished = true;
+        foreach (var p in intParameters) {
+          if (!enumerators[p.Key].MoveNext()) {
+            enumerators[p.Key] = p.Value.GetEnumerator();
+            enumerators[p.Key].MoveNext();
+          } else {
+            finished = false;
+            break;
+          }
+        }
+      } while (!finished);
+    }
+
+    private IEnumerable<Dictionary<IValueParameter, double>> GetDoubleParameterConfigurations() {
+      var configuration = new Dictionary<IValueParameter, double>();
+      var enumerators = new Dictionary<IValueParameter, IEnumerator<double>>();
+      bool finished;
+      do {
+        foreach (var p in doubleParameters) {
+          if (!enumerators.ContainsKey(p.Key)) {
+            enumerators[p.Key] = p.Value.GetEnumerator();
+            enumerators[p.Key].MoveNext();
+          }
+          configuration[p.Key] = enumerators[p.Key].Current;
+        }
+        yield return configuration;
+
+        finished = true;
+        foreach (var p in doubleParameters) {
+          if (!enumerators[p.Key].MoveNext()) {
+            enumerators[p.Key] = p.Value.GetEnumerator();
+            enumerators[p.Key].MoveNext();
+          } else {
+            finished = false;
+            break;
+          }
+        }
+      } while (!finished);
+    }
+
+    private IEnumerable<Dictionary<IValueParameter, bool>> GetBoolParameterConfigurations() {
+      var configuration = new Dictionary<IValueParameter, bool>();
+      bool finished;
+      do {
+        finished = true;
+        foreach (var p in boolParameters) {
+          if (!configuration.ContainsKey(p)) configuration.Add(p, false);
+          else {
+            if (configuration[p]) {
+              configuration[p] = false;
+            } else {
+              configuration[p] = true;
+              finished = false;
+              break;
+            }
+          }
+        }
+        yield return configuration;
+      } while (!finished);
+    }
+
+    private IEnumerable<Dictionary<IValueParameter, IItem>> GetMultipleChoiceConfigurations() {
+      var configuration = new Dictionary<IValueParameter, IItem>();
+      var enumerators = new Dictionary<IValueParameter, IEnumerator<IItem>>();
+      bool finished;
+      do {
+        foreach (var p in multipleChoiceParameters.Keys.ToArray()) {
+          if (!enumerators.ContainsKey(p)) {
+            enumerators.Add(p, multipleChoiceParameters[p].GetEnumerator());
+            if (!enumerators[p].MoveNext()) {
+              multipleChoiceParameters.Remove(p);
+              continue;
+            }
+          }
+          configuration[p] = enumerators[p].Current;
+        }
+
+        finished = true;
+        foreach (var p in multipleChoiceParameters.Keys) {
+          if (!enumerators[p].MoveNext()) {
+            enumerators[p] = multipleChoiceParameters[p].GetEnumerator();
+            enumerators[p].MoveNext();
+          } else {
+            finished = false;
+            break;
+          }
+        }
+        yield return configuration;
+      } while (!finished);
+    }
+    #endregion
+    #endregion
+
+    #region Background workers
+    #region Instance discovery
+    private void instanceDiscoveryBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      instanceDiscoveryBackgroundWorker.ReportProgress(0, "Finding instance providers...");
+      var instanceProviders = ProblemInstanceManager.GetProviders(((IAlgorithm)Optimizer).Problem).ToArray();
+      var nodes = new List<TreeNode>(instanceProviders.Length);
+      for (int i = 0; i < instanceProviders.Length; i++) {
+        var provider = instanceProviders[i];
+        var providerNode = new TreeNode(provider.Name) { Tag = provider };
+        var descriptors = ProblemInstanceManager.GetDataDescriptors(provider);
+        foreach (var desc in descriptors) {
+          #region Check cancellation request
+          if (instanceDiscoveryBackgroundWorker.CancellationPending) {
+            e.Cancel = true;
+            e.Result = nodes.ToArray();
+            return;
+          }
+          #endregion
+          var node = new TreeNode(desc.Name) { Tag = desc };
+          providerNode.Nodes.Add(node);
+          if (providerNode.Nodes.Count == 1)
+            nodes.Add(providerNode);
+        }
+        double progress = nodes.Count > 0 ? i / (double)nodes.Count : 0.0;
+        instanceDiscoveryBackgroundWorker.ReportProgress((int)(100 * progress), provider.Name);
+      }
+      e.Result = nodes.ToArray();
+      instanceDiscoveryBackgroundWorker.ReportProgress(100, string.Empty);
+    }
+
+    private void instanceDiscoveryBackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
+      if (instanceDiscoveryProgressBar.Value != e.ProgressPercentage)
+        instanceDiscoveryProgressBar.Value = e.ProgressPercentage;
+      instanceDiscoveryProgressLabel.Text = (string)e.UserState;
+    }
+
+    private void instanceDiscoveryBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      try {
+        if (((TreeNode[])e.Result).Length > 0) {
+          instancesTreeView.Nodes.AddRange((TreeNode[])e.Result);
+          foreach (TreeNode node in instancesTreeView.Nodes)
+            node.Collapse();
+        }
+        selectNoneCheckBox.Checked = true;
+      }
+      catch { }
+      try {
+        SetMode(DialogMode.Normal);
+        if (e.Error != null) MessageBox.Show(e.Error.Message, "Error occurred", MessageBoxButtons.OK, MessageBoxIcon.Error);
+      }
+      catch { }
+    }
+    #endregion
+
+    #region Experiment creation
+    private void experimentCreationBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      backgroundWorkerWaitHandle.Set(); // notify the ok button that we're busy now
+      failedInstances = new StringBuilder();
+      var localExperiment = new Experiment();
+
+      int counter = 0, totalVariations = GetNumberOfVariations();
+      int totalInstances = instances.Values.SelectMany(x => x).Count();
+      if (totalInstances == 0) {
+        try {
+          AddParameterVariations(Optimizer, localExperiment, ref counter, totalVariations);
+        }
+        catch (OperationCanceledException) {
+          e.Cancel = true;
+          return;
+        }
+        experimentCreationBackgroundWorker.ReportProgress(100, string.Empty);
+      } else {
+        foreach (var provider in instances.Keys) {
+          foreach (var descriptor in instances[provider]) {
+            var algorithm = (IAlgorithm)Optimizer.Clone();
+            bool failed = false;
+            try {
+              ProblemInstanceManager.LoadData(provider, descriptor, (IProblemInstanceConsumer)algorithm.Problem);
+            }
+            catch (Exception ex) {
+              failedInstances.AppendLine(descriptor.Name + ": " + ex.Message);
+              failed = true;
+            }
+            if (!failed) {
+              try {
+                if (totalInstances > 1 && totalVariations / totalInstances > 1) {
+                  var experiment = new Experiment(descriptor.Name);
+                  AddParameterVariations(algorithm, experiment, ref counter, totalVariations);
+                  localExperiment.Optimizers.Add(experiment);
+                } else {
+                  AddParameterVariations(algorithm, localExperiment, ref counter, totalVariations);
+                }
+              }
+              catch (OperationCanceledException) {
+                e.Cancel = true;
+                return;
+              }
+            } else experimentCreationBackgroundWorker.ReportProgress((int)Math.Round((100.0 * counter) / totalVariations), "Loading failed (" + descriptor.Name + ")");
+          }
+        }
+      }
+      // this step can take some time
+      SetMode(DialogMode.PreparingExperiment);
+      experimentCreationBackgroundWorker.ReportProgress(-1);
+      localExperiment.Prepare(true);
+      experimentCreationBackgroundWorker.ReportProgress(100);
+      Experiment = localExperiment;
+    }
+
+    private void AddParameterVariations(IOptimizer optimizer, Experiment localExperiment, ref int counter, int totalVariations) {
+      int combinations = int.Parse(combinationsTextBox.Text);
+      var variations = CalculateRandomParameterVariations(optimizer, combinations);
+
+      foreach (var v in variations) {
+        if (experimentCreationBackgroundWorker.CancellationPending)
+          throw new OperationCanceledException();
+        AddOptimizer(v, localExperiment);
+        counter++;
+        experimentCreationBackgroundWorker.ReportProgress((int)Math.Round((100.0 * counter) / combinations), string.Empty);
+      }
+    }
+
+    private IEnumerable<IOptimizer> CalculateParameterVariations(IOptimizer optimizer) {
+      if (!boolParameters.Any() && !intParameters.Any() && !doubleParameters.Any() && !multipleChoiceParameters.Any()) {
+        var o = (IOptimizer)optimizer.Clone();
+        o.Runs.Clear();
+        yield return o;
+        yield break;
+      }
+      bool finished;
+      var mcEnumerator = GetMultipleChoiceConfigurations().GetEnumerator();
+      var boolEnumerator = GetBoolParameterConfigurations().GetEnumerator();
+      var intEnumerator = GetIntParameterConfigurations().GetEnumerator();
+      var doubleEnumerator = GetDoubleParameterConfigurations().GetEnumerator();
+      mcEnumerator.MoveNext(); boolEnumerator.MoveNext(); intEnumerator.MoveNext(); doubleEnumerator.MoveNext();
+      do {
+        var variant = (IAlgorithm)optimizer.Clone();
+        variant.Runs.Clear();
+        variant.Name += " {";
+        finished = true;
+        if (doubleParameters.Any()) {
+          foreach (var d in doubleEnumerator.Current) {
+            var value = (ValueTypeValue<double>)((IValueParameter)variant.Parameters[d.Key.Name]).Value;
+            value.Value = d.Value;
+            variant.Name += d.Key.Name + "=" + d.Value.ToString() + ", ";
+          }
+          if (finished) {
+            if (doubleEnumerator.MoveNext()) {
+              finished = false;
+            } else {
+              doubleEnumerator = GetDoubleParameterConfigurations().GetEnumerator();
+              doubleEnumerator.MoveNext();
+            }
+          }
+        }
+        if (intParameters.Any()) {
+          foreach (var i in intEnumerator.Current) {
+            var value = (ValueTypeValue<int>)((IValueParameter)variant.Parameters[i.Key.Name]).Value;
+            value.Value = i.Value;
+            variant.Name += i.Key.Name + "=" + i.Value.ToString() + ", ";
+          }
+          if (finished) {
+            if (intEnumerator.MoveNext()) {
+              finished = false;
+            } else {
+              intEnumerator = GetIntParameterConfigurations().GetEnumerator();
+              intEnumerator.MoveNext();
+            }
+          }
+        }
+        if (boolParameters.Any()) {
+          foreach (var b in boolEnumerator.Current) {
+            var value = (ValueTypeValue<bool>)((IValueParameter)variant.Parameters[b.Key.Name]).Value;
+            value.Value = b.Value;
+            variant.Name += b.Key.Name + "=" + b.Value.ToString() + ", ";
+          }
+          if (finished) {
+            if (boolEnumerator.MoveNext()) {
+              finished = false;
+            } else {
+              boolEnumerator = GetBoolParameterConfigurations().GetEnumerator();
+              boolEnumerator.MoveNext();
+            }
+          }
+        }
+        if (multipleChoiceParameters.Any()) {
+          foreach (var m in mcEnumerator.Current) {
+            dynamic variantParam = variant.Parameters[m.Key.Name];
+            if (m.Value == optionalNullChoice) {
+              variantParam.Value = null;
+              variant.Name += m.Key.Name + "=null, ";
+              continue;
+            }
+            var variantEnumerator = ((IEnumerable<object>)variantParam.ValidValues).GetEnumerator();
+            var originalEnumerator = ((IEnumerable<object>)((dynamic)m.Key).ValidValues).GetEnumerator();
+            while (variantEnumerator.MoveNext() && originalEnumerator.MoveNext()) {
+              if (m.Value == (IItem)originalEnumerator.Current) {
+                variantParam.Value = (dynamic)variantEnumerator.Current;
+                if (m.Value is INamedItem)
+                  variant.Name += m.Key.Name + "=" + ((INamedItem)m.Value).Name + ", ";
+                else variant.Name += m.Key.Name + "=" + m.Value.ToString() + ", ";
+                break;
+              }
+            }
+          }
+          if (finished) {
+            if (mcEnumerator.MoveNext()) {
+              finished = false;
+            } else {
+              mcEnumerator = GetMultipleChoiceConfigurations().GetEnumerator();
+              mcEnumerator.MoveNext();
+            }
+          }
+        }
+        variant.Name = variant.Name.Substring(0, variant.Name.Length - 2) + "}";
+        yield return variant;
+      } while (!finished);
+    }
+
+
+    private IEnumerable<IOptimizer> CalculateRandomParameterVariations(IOptimizer optimizer, int combinations) {
+      Random rand = new Random();
+      int finished = 0;
+      if (!boolParameters.Any() && !intParameters.Any() && !doubleParameters.Any() && !multipleChoiceParameters.Any()) {
+        var o = (IOptimizer)optimizer.Clone();
+        o.Runs.Clear();
+        yield return o;
+        yield break;
+      }
+
+      do {
+        var variant = (IAlgorithm)optimizer.Clone();
+        variant.Runs.Clear();
+        variant.Name += " {";
+
+        if (doubleParameters.Any()) {
+          foreach (var d in doubleParameters) {
+            var value = (ValueTypeValue<double>)((IValueParameter)variant.Parameters[d.Key.Name]).Value;
+            value.Value = d.Value[rand.Next(d.Value.Length)];
+            variant.Name += d.Key.Name + "=" + value.Value.ToString() + ", ";
+          }
+        }
+        if (intParameters.Any()) {
+          foreach (var i in intParameters) {
+            var value = (ValueTypeValue<int>)((IValueParameter)variant.Parameters[i.Key.Name]).Value;
+            value.Value = i.Value[rand.Next(i.Value.Length)];
+            variant.Name += i.Key.Name + "=" + value.Value.ToString() + ", ";
+          }
+        }
+        if (boolParameters.Any()) {
+          foreach (var b in boolParameters) {
+            var value = (ValueTypeValue<bool>)((IValueParameter)variant.Parameters[b.Name]).Value;
+            if (rand.Next(0, 1) == 0) {
+              value.Value = false;
+            } else {
+              value.Value = true;
+            }
+            variant.Name += b.Name + "=" + b.Value.ToString() + ", ";
+          }
+        }
+        if (multipleChoiceParameters.Any()) {
+          foreach (var m in multipleChoiceParameters) {
+            dynamic variantParam = variant.Parameters[m.Key.Name];
+            //TODO
+            /*if (m.Value == optionalNullChoice) {
+              variantParam.Value = null;
+              variant.Name += m.Key.Name + "=null, ";
+              continue;                          
+            } */
+            dynamic chosenParam = m.Value.ElementAt(rand.Next(m.Value.Count));
+            dynamic validChosenParam = null;
+            foreach (dynamic vp in variantParam.ValidValues) {
+              if (vp.Name == chosenParam.Name) {
+                validChosenParam = vp;
+                break;
+              }
+            }
+            variantParam.Value = validChosenParam;
+            variant.Name += m.Key.Name + "=" + chosenParam.ToString() + ", ";
+          }
+        }
+        variant.Name = variant.Name.Substring(0, variant.Name.Length - 2) + "}";
+        yield return variant;
+        finished++;
+      } while (finished < combinations);
+    }
+
+    private void experimentCreationBackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
+      if (e.ProgressPercentage >= 0 && e.ProgressPercentage <= 100) {
+        experimentCreationProgressBar.Style = ProgressBarStyle.Continuous;
+        experimentCreationProgressBar.Value = e.ProgressPercentage;
+      } else {
+        experimentCreationProgressBar.Style = ProgressBarStyle.Marquee;
+      }
+    }
+
+    private void experimentCreationBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      try {
+        SetMode(DialogMode.Normal);
+        if (e.Error != null) MessageBox.Show(e.Error.Message, "Error occurred", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        if (failedInstances.Length > 0) MessageBox.Show("Some instances could not be loaded: " + Environment.NewLine + failedInstances.ToString(), "Some instances failed to load", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        if (!e.Cancelled && e.Error == null) {
+          DialogResult = System.Windows.Forms.DialogResult.OK;
+          Close();
+        }
+      }
+      catch { }
+    }
+    #endregion
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/CreateExperimentDialog.resx
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/CreateExperimentDialog.resx	(revision 9361)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/CreateExperimentDialog.resx	(revision 9361)
@@ -0,0 +1,188 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>394, 17</value>
+  </metadata>
+  <metadata name="experimentCreationBackgroundWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>484, 17</value>
+  </metadata>
+  <metadata name="instanceDiscoveryBackgroundWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>271, 17</value>
+  </metadata>
+  <metadata name="warningProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 56</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="warningProvider.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAMAEBAQAAAAAAAoAQAANgAAABAQAAABAAgAaAUAAF4BAAAQEAAAAQAgAGgEAADGBgAAKAAAABAA
+        AAAgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAgACAAAAAgACAAICA
+        AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wARERERERERERMAAAAAAAARP7+/v7+/
+        vwE7+/twe/v7AT+/v3B/v78BE/v7+/v78HETv7+wv7+wERE7+zA7+wcRET+/AA+/ARERE/sAC/BxERET
+        vwAPsBERERE78PsHERERET+/vwERERERE/vwcRERERETv7AREREREREzMREREf//AACAAwAAAAEAAAAB
+        AAAAAQAAgAEAAIADAADAAwAAwAcAAOAHAADgDwAA8A8AAPAfAAD4HwAA+D8AAPx/AAAoAAAAEAAAACAA
+        AAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICA
+        gADA3MAA8MqmAKo/KgD/PyoAAF8qAFVfKgCqXyoA/18qAAB/KgBVfyoAqn8qAP9/KgAAnyoAVZ8qAKqf
+        KgD/nyoAAL8qAFW/KgCqvyoA/78qAADfKgBV3yoAqt8qAP/fKgAA/yoAVf8qAKr/KgD//yoAAABVAFUA
+        VQCqAFUA/wBVAAAfVQBVH1UAqh9VAP8fVQAAP1UAVT9VAKo/VQD/P1UAAF9VAFVfVQCqX1UA/19VAAB/
+        VQBVf1UAqn9VAP9/VQAAn1UAVZ9VAKqfVQD/n1UAAL9VAFW/VQCqv1UA/79VAADfVQBV31UAqt9VAP/f
+        VQAA/1UAVf9VAKr/VQD//1UAAAB/AFUAfwCqAH8A/wB/AAAffwBVH38Aqh9/AP8ffwAAP38AVT9/AKo/
+        fwD/P38AAF9/AFVffwCqX38A/19/AAB/fwBVf38Aqn9/AP9/fwAAn38AVZ9/AKqffwD/n38AAL9/AFW/
+        fwCqv38A/79/AADffwBV338Aqt9/AP/ffwAA/38AVf9/AKr/fwD//38AAACqAFUAqgCqAKoA/wCqAAAf
+        qgBVH6oAqh+qAP8fqgAAP6oAVT+qAKo/qgD/P6oAAF+qAFVfqgCqX6oA/1+qAAB/qgBVf6oAqn+qAP9/
+        qgAAn6oAVZ+qAKqfqgD/n6oAAL+qAFW/qgCqv6oA/7+qAADfqgBV36oAqt+qAP/fqgAA/6oAVf+qAKr/
+        qgD//6oAAADUAFUA1ACqANQA/wDUAAAf1ABVH9QAqh/UAP8f1AAAP9QAVT/UAKo/1AD/P9QAAF/UAFVf
+        1ACqX9QA/1/UAAB/1ABVf9QAqn/UAP9/1AAAn9QAVZ/UAKqf1AD/n9QAAL/UAFW/1ACqv9QA/7/UAADf
+        1ABV39QAqt/UAP/f1AAA/9QAVf/UAKr/1AD//9QAVQD/AKoA/wAAH/8AVR//AKof/wD/H/8AAD//AFU/
+        /wCqP/8A/z//AABf/wBVX/8Aql//AP9f/wAAf/8AVX//AKp//wD/f/8AAJ//AFWf/wCqn/8A/5//AAC/
+        /wBVv/8Aqr//AP+//wAA3/8AVd//AKrf/wD/3/8AVf//AKr//wD/zMwA/8z/AP//MwD//2YA//+ZAP//
+        zAAAfwAAVX8AAKp/AAD/fwAAAJ8AAFWfAACqnwAA/58AAAC/AABVvwAAqr8AAP+/AAAA3wAAVd8AAKrf
+        AAD/3wAAVf8AAKr/AAAAACoAVQAqAKoAKgD/ACoAAB8qAFUfKgCqHyoA/x8qAAA/KgBVPyoA8Pv/AKSg
+        oACAgIAAAAD/AAD/AAAA//8A/wAAAAAAAAD//wAA////AP2pfHx4A3x8A3wDeAN8fH39gKioqKiofFWl
+        qKioqKh8/anO+87OzvQEVc7Oys6off3QztLOzs6ALIDOys7OfIH9/anS0vvOzs7Ozs7PrAP9/f3Qz9LS
+        +6wtrM7OznyB/f39/anS0vuo8azO+84D/f39/f3Qz9LShe2p+/uAff39/f39/anT0gMEA/vOA/39/f39
+        /f3Qz9Ix7S37gH39/f39/f39/a3SgfFZ+wP9/f39/f39/f3Qz9Ks+4R9/f39/f39/f39/ajS0vt8/f39
+        /f39/f39/f3QztKoA/39/f39/f39/f39/anLqf39/f39/f39/f39/f39/f39/f39/f2AAAAAgAAAAIAA
+        AACAAAAAwAEAAMABAADgAwAA4AMAAPAHAADwBwAA+A8AAPgPAAD8HwAA/B8AAP4/AAD//wAAKAAAABAA
+        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOEpAoFm7+bBHqX/AR1kv0EdZL9BHWR/QR1
+        kv0EeZX9A3mV/QN3k/0DdZH9BHWR/QR1kv0EdZL9A3iU/Qt3k+AEf5szB5S19wu84v8Gw+j/Arvk/wK4
+        4v8Bwuf/Aoun/0Zkev82rM//Abzj/wG03P8Btd//Arri/wG+6P8LiaryAm+LIASkzcob3Pf/GvP//wba
+        //8D2v//AOb3/wE1Ov9eAAD/YWRz/wDo//8Azfr/Ac73/xHk/P8CweX/FmR60gAAAAAAueJXGc7q+Tn/
+        /v8c8v//B+D//wPs/v8ElqP/B01P/wehsv8A5v//AM76/wza9f8V7f3/A4ak/RBnfq0AAAAAAM70Dwq+
+        4MBK8/f/Rv///xjz//8F6f//AvP//wnO5v8A7f//ANz//wLU+f8Z7/r/Cc/l/wVyjfcMa4MQAAAAAAAA
+        AAAAxOlZNtXp+W7///9A////D/3//wrQ1f8sSWD/Btnn/wDm//8N4vn/FPD8/wKMqP4MaYKuAAAAAAAA
+        AAAAAAAAANL0DhO+38Zz9vr/bv///yb///8VwsT/Xh8s/xHU3f8A8P//FfD6/wbX7P8Eco36IlVpKAAA
+        AAAAAAAAAAAAAAAAAAAAt95kTNrs/43///9F////HrK6/4EPIP8ixNH/BPz//xf3/f8Cl7L8C2qDyAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAKvWDhm83s+C+v7/af///zGGi/9gAAL/J4ua/w////8L6fX/BXOO+hle
+        cz4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAstpqTd/y/33///88Y2H/TQAA/ztKVP8S////Aqy//wdu
+        idkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMHgGhfF5NRw/f//TqKg/ysfIf8wi47/Dv///wN4
+        k/kWYHZYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwuFyPt7v/VX//v8d4OL/Hf79/gW4
+        xfsEco3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALncDw7A39dB/P7/Sf///xn/
+        //8FeJL5BWyIZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArtZtJOLw/1H2
+        +P8MxNT9BXCL6yhQYAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKrUGzTH
+        4vk5zeb/BqK6yQlshl0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8AAB8fAAAA3iAAHx9gACoqMAB
+        qHzAAaio4AOofOADzvvwB8708AfOzvgPqH34D87S/A/OgPwfzsr//3yB
+</value>
+  </data>
+</root>
Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/CreateExperimentMenuItem.cs
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/CreateExperimentMenuItem.cs	(revision 9361)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/CreateExperimentMenuItem.cs	(revision 9361)
@@ -0,0 +1,61 @@
+﻿#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.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimizer;
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views {
+  internal class CreateExperimentMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
+    public override string Name {
+      get { return "Create &Random Experiment"; }
+    }
+    public override IEnumerable<string> Structure {
+      get { return new string[] { "&Edit" }; }
+    }
+    public override int Position {
+      get { return 2300; }
+    }
+    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 IOptimizer) && !activeView.Locked;
+    }
+
+    public override void Execute() {
+      IContentView activeView = MainFormManager.MainForm.ActiveView as IContentView;
+      if ((activeView != null) && (activeView.Content != null) && (activeView.Content is IOptimizer) && !activeView.Locked) {
+        using (CreateExperimentDialog dialog = new CreateExperimentDialog((IOptimizer)activeView.Content)) {
+          if (dialog.ShowDialog() == DialogResult.OK) MainFormManager.MainForm.ShowContent(dialog.Experiment);
+        }
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views-3.3.csproj
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views-3.3.csproj	(revision 9360)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers.Views-3.3.csproj	(revision 9361)
@@ -105,5 +105,15 @@
       <Private>False</Private>
     </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
@@ -119,4 +129,11 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="CreateExperimentDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="CreateExperimentDialog.Designer.cs">
+      <DependentUpon>CreateExperimentDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CreateExperimentMenuItem.cs" />
     <Compile Include="KruskalWallis.cs" />
     <Compile Include="ParameterInfluenceView.cs">
@@ -148,4 +165,9 @@
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="CreateExperimentDialog.resx">
+      <DependentUpon>CreateExperimentDialog.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
