Index: trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.Designer.cs	(revision 7900)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.Designer.cs	(revision 7908)
@@ -53,14 +53,41 @@
       this.repetitionsNumericUpDown = new System.Windows.Forms.NumericUpDown();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.instancesLabel = new System.Windows.Forms.Label();
       this.instancesListView = new System.Windows.Forms.ListView();
       this.columnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
       this.experimentCreationBackgroundWorker = new System.ComponentModel.BackgroundWorker();
-      this.experimentCreationProgressBar = new System.Windows.Forms.ProgressBar();
-      this.progressLabel = new System.Windows.Forms.Label();
+      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.choicesLabel = new System.Windows.Forms.Label();
+      this.choicesListView = new System.Windows.Forms.ListView();
+      this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.stepSizeTextBox = new System.Windows.Forms.TextBox();
+      this.maximumTextBox = new System.Windows.Forms.TextBox();
+      this.minimumTextBox = new System.Windows.Forms.TextBox();
+      this.stepSizeLabel = new System.Windows.Forms.Label();
+      this.maximumLabel = new System.Windows.Forms.Label();
+      this.minimumLabel = new System.Windows.Forms.Label();
+      this.instancesTabPage = new System.Windows.Forms.TabPage();
+      this.label1 = new System.Windows.Forms.Label();
+      this.experimentsToCreateDescriptionLabel = new System.Windows.Forms.Label();
+      this.experimentsLabel = new System.Windows.Forms.Label();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.experimentCreationProgressBar = new System.Windows.Forms.ProgressBar();
       ((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();
       this.SuspendLayout();
       // 
@@ -70,8 +97,8 @@
       this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
       this.okButton.Enabled = false;
-      this.okButton.Location = new System.Drawing.Point(113, 259);
+      this.okButton.Location = new System.Drawing.Point(187, 359);
       this.okButton.Name = "okButton";
       this.okButton.Size = new System.Drawing.Size(75, 23);
-      this.okButton.TabIndex = 4;
+      this.okButton.TabIndex = 7;
       this.okButton.Text = "&OK";
       this.okButton.UseVisualStyleBackColor = true;
@@ -82,8 +109,8 @@
       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(194, 259);
+      this.cancelButton.Location = new System.Drawing.Point(268, 359);
       this.cancelButton.Name = "cancelButton";
       this.cancelButton.Size = new System.Drawing.Size(75, 23);
-      this.cancelButton.TabIndex = 5;
+      this.cancelButton.TabIndex = 8;
       this.cancelButton.Text = "&Cancel";
       this.cancelButton.UseVisualStyleBackColor = true;
@@ -136,5 +163,5 @@
             0});
       this.repetitionsNumericUpDown.Name = "repetitionsNumericUpDown";
-      this.repetitionsNumericUpDown.Size = new System.Drawing.Size(156, 20);
+      this.repetitionsNumericUpDown.Size = new System.Drawing.Size(230, 20);
       this.repetitionsNumericUpDown.TabIndex = 3;
       this.repetitionsNumericUpDown.ThousandsSeparator = true;
@@ -147,13 +174,4 @@
       this.repetitionsNumericUpDown.Validated += new System.EventHandler(this.repetitionsNumericUpDown_Validated);
       // 
-      // instancesLabel
-      // 
-      this.instancesLabel.AutoSize = true;
-      this.instancesLabel.Location = new System.Drawing.Point(12, 54);
-      this.instancesLabel.Name = "instancesLabel";
-      this.instancesLabel.Size = new System.Drawing.Size(56, 13);
-      this.instancesLabel.TabIndex = 2;
-      this.instancesLabel.Text = "&Instances:";
-      // 
       // instancesListView
       // 
@@ -165,8 +183,8 @@
             this.columnHeader});
       this.instancesListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
-      this.instancesListView.Location = new System.Drawing.Point(113, 77);
+      this.instancesListView.Location = new System.Drawing.Point(6, 35);
       this.instancesListView.Name = "instancesListView";
-      this.instancesListView.Size = new System.Drawing.Size(156, 176);
-      this.instancesListView.TabIndex = 6;
+      this.instancesListView.Size = new System.Drawing.Size(308, 225);
+      this.instancesListView.TabIndex = 3;
       this.instancesListView.UseCompatibleStateImageBehavior = false;
       this.instancesListView.View = System.Windows.Forms.View.Details;
@@ -182,37 +200,37 @@
       this.experimentCreationBackgroundWorker.WorkerSupportsCancellation = true;
       this.experimentCreationBackgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.experimentCreationBackgroundWorker_DoWork);
-      this.experimentCreationBackgroundWorker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker_ProgressChanged);
+      this.experimentCreationBackgroundWorker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.experimentCreationBackgroundWorker_ProgressChanged);
       this.experimentCreationBackgroundWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.experimentCreationBackgroundWorker_RunWorkerCompleted);
       // 
-      // experimentCreationProgressBar
-      // 
-      this.experimentCreationProgressBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
-      this.experimentCreationProgressBar.Location = new System.Drawing.Point(128, 142);
-      this.experimentCreationProgressBar.Name = "experimentCreationProgressBar";
-      this.experimentCreationProgressBar.Size = new System.Drawing.Size(128, 23);
-      this.experimentCreationProgressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
-      this.experimentCreationProgressBar.TabIndex = 7;
-      this.experimentCreationProgressBar.Visible = false;
-      // 
-      // progressLabel
-      // 
-      this.progressLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
-      this.progressLabel.BackColor = System.Drawing.SystemColors.Control;
-      this.progressLabel.Location = new System.Drawing.Point(128, 168);
-      this.progressLabel.Name = "progressLabel";
-      this.progressLabel.Size = new System.Drawing.Size(128, 23);
-      this.progressLabel.TabIndex = 8;
-      this.progressLabel.Text = "label1";
-      this.progressLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
-      this.progressLabel.Visible = false;
+      // 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, 132);
+      this.instanceDiscoveryProgressBar.Name = "instanceDiscoveryProgressBar";
+      this.instanceDiscoveryProgressBar.Size = new System.Drawing.Size(308, 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, 158);
+      this.instanceDiscoveryProgressLabel.Name = "instanceDiscoveryProgressLabel";
+      this.instanceDiscoveryProgressLabel.Size = new System.Drawing.Size(308, 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(113, 54);
+      this.selectAllCheckBox.Location = new System.Drawing.Point(52, 12);
       this.selectAllCheckBox.Name = "selectAllCheckBox";
-      this.selectAllCheckBox.Size = new System.Drawing.Size(67, 17);
-      this.selectAllCheckBox.TabIndex = 9;
-      this.selectAllCheckBox.Text = "select all";
+      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);
@@ -221,9 +239,9 @@
       // 
       this.selectNoneCheckBox.AutoSize = true;
-      this.selectNoneCheckBox.Location = new System.Drawing.Point(186, 54);
+      this.selectNoneCheckBox.Location = new System.Drawing.Point(94, 12);
       this.selectNoneCheckBox.Name = "selectNoneCheckBox";
-      this.selectNoneCheckBox.Size = new System.Drawing.Size(81, 17);
-      this.selectNoneCheckBox.TabIndex = 9;
-      this.selectNoneCheckBox.Text = "select none";
+      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);
@@ -234,6 +252,222 @@
       this.instanceDiscoveryBackgroundWorker.WorkerSupportsCancellation = true;
       this.instanceDiscoveryBackgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.instanceDiscoveryBackgroundWorker_DoWork);
-      this.instanceDiscoveryBackgroundWorker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker_ProgressChanged);
+      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(328, 299);
+      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(320, 273);
+      this.parametersTabPage.TabIndex = 1;
+      this.parametersTabPage.Text = "Parameters Variation";
+      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.choicesLabel);
+      this.parametersSplitContainer.Panel2.Controls.Add(this.choicesListView);
+      this.parametersSplitContainer.Panel2.Controls.Add(this.stepSizeTextBox);
+      this.parametersSplitContainer.Panel2.Controls.Add(this.maximumTextBox);
+      this.parametersSplitContainer.Panel2.Controls.Add(this.minimumTextBox);
+      this.parametersSplitContainer.Panel2.Controls.Add(this.stepSizeLabel);
+      this.parametersSplitContainer.Panel2.Controls.Add(this.maximumLabel);
+      this.parametersSplitContainer.Panel2.Controls.Add(this.minimumLabel);
+      this.parametersSplitContainer.Size = new System.Drawing.Size(314, 267);
+      this.parametersSplitContainer.SplitterDistance = 124;
+      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(124, 267);
+      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;
+      // 
+      // choicesLabel
+      // 
+      this.choicesLabel.AutoSize = true;
+      this.choicesLabel.Location = new System.Drawing.Point(13, 15);
+      this.choicesLabel.Name = "choicesLabel";
+      this.choicesLabel.Size = new System.Drawing.Size(48, 13);
+      this.choicesLabel.TabIndex = 0;
+      this.choicesLabel.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(155, 220);
+      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;
+      // 
+      // stepSizeTextBox
+      // 
+      this.stepSizeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.stepSizeTextBox.Location = new System.Drawing.Point(73, 64);
+      this.stepSizeTextBox.Name = "stepSizeTextBox";
+      this.stepSizeTextBox.Size = new System.Drawing.Size(83, 20);
+      this.stepSizeTextBox.TabIndex = 5;
+      this.stepSizeTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.detailsTextBox_Validating);
+      // 
+      // maximumTextBox
+      // 
+      this.maximumTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.maximumTextBox.Location = new System.Drawing.Point(73, 38);
+      this.maximumTextBox.Name = "maximumTextBox";
+      this.maximumTextBox.Size = new System.Drawing.Size(83, 20);
+      this.maximumTextBox.TabIndex = 3;
+      this.maximumTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.detailsTextBox_Validating);
+      // 
+      // minimumTextBox
+      // 
+      this.minimumTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.minimumTextBox.Location = new System.Drawing.Point(73, 12);
+      this.minimumTextBox.Name = "minimumTextBox";
+      this.minimumTextBox.Size = new System.Drawing.Size(83, 20);
+      this.minimumTextBox.TabIndex = 1;
+      this.minimumTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.detailsTextBox_Validating);
+      // 
+      // stepSizeLabel
+      // 
+      this.stepSizeLabel.AutoSize = true;
+      this.stepSizeLabel.Location = new System.Drawing.Point(13, 67);
+      this.stepSizeLabel.Name = "stepSizeLabel";
+      this.stepSizeLabel.Size = new System.Drawing.Size(53, 13);
+      this.stepSizeLabel.TabIndex = 4;
+      this.stepSizeLabel.Text = "Step size:";
+      // 
+      // maximumLabel
+      // 
+      this.maximumLabel.AutoSize = true;
+      this.maximumLabel.Location = new System.Drawing.Point(13, 41);
+      this.maximumLabel.Name = "maximumLabel";
+      this.maximumLabel.Size = new System.Drawing.Size(54, 13);
+      this.maximumLabel.TabIndex = 2;
+      this.maximumLabel.Text = "Maximum:";
+      // 
+      // minimumLabel
+      // 
+      this.minimumLabel.AutoSize = true;
+      this.minimumLabel.Location = new System.Drawing.Point(13, 15);
+      this.minimumLabel.Name = "minimumLabel";
+      this.minimumLabel.Size = new System.Drawing.Size(51, 13);
+      this.minimumLabel.TabIndex = 0;
+      this.minimumLabel.Text = "Minimum:";
+      // 
+      // 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.instancesListView);
+      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(320, 273);
+      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:";
+      // 
+      // 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, 364);
+      this.experimentsToCreateDescriptionLabel.Name = "experimentsToCreateDescriptionLabel";
+      this.experimentsToCreateDescriptionLabel.Size = new System.Drawing.Size(112, 13);
+      this.experimentsToCreateDescriptionLabel.TabIndex = 5;
+      this.experimentsToCreateDescriptionLabel.Text = "Experiments to create:";
+      // 
+      // experimentsLabel
+      // 
+      this.experimentsLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.experimentsLabel.AutoSize = true;
+      this.experimentsLabel.Location = new System.Drawing.Point(130, 364);
+      this.experimentsLabel.Name = "experimentsLabel";
+      this.experimentsLabel.Size = new System.Drawing.Size(13, 13);
+      this.experimentsLabel.TabIndex = 6;
+      this.experimentsLabel.Text = "1";
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.ContainerControl = this;
+      // 
+      // 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(187, 359);
+      this.experimentCreationProgressBar.Name = "experimentCreationProgressBar";
+      this.experimentCreationProgressBar.Size = new System.Drawing.Size(75, 23);
+      this.experimentCreationProgressBar.TabIndex = 9;
+      this.experimentCreationProgressBar.Visible = false;
       // 
       // CreateExperimentDialog
@@ -243,12 +477,10 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.CancelButton = this.cancelButton;
-      this.ClientSize = new System.Drawing.Size(281, 294);
-      this.Controls.Add(this.progressLabel);
+      this.ClientSize = new System.Drawing.Size(355, 394);
       this.Controls.Add(this.experimentCreationProgressBar);
-      this.Controls.Add(this.selectNoneCheckBox);
-      this.Controls.Add(this.selectAllCheckBox);
-      this.Controls.Add(this.instancesListView);
+      this.Controls.Add(this.experimentsLabel);
+      this.Controls.Add(this.experimentsToCreateDescriptionLabel);
+      this.Controls.Add(this.tabControl);
       this.Controls.Add(this.repetitionsNumericUpDown);
-      this.Controls.Add(this.instancesLabel);
       this.Controls.Add(this.repetitionsLabel);
       this.Controls.Add(this.createBatchRunLabel);
@@ -267,4 +499,14 @@
       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();
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -281,13 +523,32 @@
     private System.Windows.Forms.NumericUpDown repetitionsNumericUpDown;
     private System.Windows.Forms.ToolTip toolTip;
-    private System.Windows.Forms.Label instancesLabel;
     private System.Windows.Forms.ListView instancesListView;
     private System.Windows.Forms.ColumnHeader columnHeader;
     private System.ComponentModel.BackgroundWorker experimentCreationBackgroundWorker;
-    private System.Windows.Forms.ProgressBar experimentCreationProgressBar;
-    private System.Windows.Forms.Label progressLabel;
+    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 experimentsLabel;
+    private System.Windows.Forms.Label choicesLabel;
+    private System.Windows.Forms.ListView choicesListView;
+    private System.Windows.Forms.ColumnHeader columnHeader2;
+    private System.Windows.Forms.TextBox stepSizeTextBox;
+    private System.Windows.Forms.TextBox maximumTextBox;
+    private System.Windows.Forms.TextBox minimumTextBox;
+    private System.Windows.Forms.Label stepSizeLabel;
+    private System.Windows.Forms.Label maximumLabel;
+    private System.Windows.Forms.Label minimumLabel;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+    private System.Windows.Forms.ProgressBar experimentCreationProgressBar;
 
   }
Index: trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs	(revision 7900)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs	(revision 7908)
@@ -23,13 +23,19 @@
 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.Optimization;
+using HeuristicLab.Parameters;
 using HeuristicLab.Problems.Instances;
 
 namespace HeuristicLab.Optimizer {
   public partial class CreateExperimentDialog : Form {
+    private enum DialogMode { Normal = 1, DiscoveringInstances = 2, CreatingExperiment = 3 };
+
     private IOptimizer optimizer;
     public IOptimizer Optimizer {
@@ -37,17 +43,23 @@
       set {
         optimizer = value;
-        experiment = null;
+        Experiment = null;
         okButton.Enabled = optimizer != null;
-        SetInstanceListViewVisibility();
-      }
-    }
-
-    private Experiment experiment;
-    public Experiment Experiment {
-      get { return experiment; }
-    }
+        SetTabControlVisibility();
+        FillInstanceListViewAsync();
+        FillParametersListView();
+      }
+    }
+
+    public Experiment Experiment { get; private set; }
 
     private bool createBatchRun;
     private int repetitions;
+    private Dictionary<IProblemInstanceProvider, HashSet<IDataDescriptor>> instances;
+    private Dictionary<IValueParameter, Tuple<int, int, int>> intParameters;
+    private Dictionary<IValueParameter, Tuple<double, double, double>> doubleParameters;
+    private HashSet<IValueParameter> boolParameters;
+    private Dictionary<IValueParameter, HashSet<INamedItem>> multipleChoiceParameters;
+
+    private StringBuilder failedInstances;
     private EventWaitHandle backgroundWorkerWaitHandle = new ManualResetEvent(false);
     private bool suppressListViewEventHandling;
@@ -60,11 +72,19 @@
       // do not set the Optimizer property here, because we want to delay instance discovery to the time when the form loads
       this.optimizer = optimizer;
-      this.experiment = null;
+      Experiment = null;
       okButton.Enabled = optimizer != null;
+
+      instances = new Dictionary<IProblemInstanceProvider, HashSet<IDataDescriptor>>();
+      intParameters = new Dictionary<IValueParameter, Tuple<int, int, int>>();
+      doubleParameters = new Dictionary<IValueParameter, Tuple<double, double, double>>();
+      boolParameters = new HashSet<IValueParameter>();
+      multipleChoiceParameters = new Dictionary<IValueParameter, HashSet<INamedItem>>();
     }
 
     #region Event handlers
     private void CreateExperimentDialog_Load(object sender, EventArgs e) {
-      SetInstanceListViewVisibility();
+      SetTabControlVisibility();
+      FillInstanceListViewAsync();
+      FillParametersListView();
     }
 
@@ -80,9 +100,167 @@
 
     private void okButton_Click(object sender, EventArgs e) {
-      SetMode(locked: true);
-      experimentCreationBackgroundWorker.RunWorkerAsync(GetSelectedInstances());
+      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<INamedItem>());
+        } else multipleChoiceParameters.Remove(parameter);
+      }
+
+      var intValue = parameter.Value as ValueTypeValue<int>;
+      if (intValue != null) {
+        if (e.Item.Checked) {
+          int minimum = intValue.Value;
+          int maximum = intValue.Value;
+          int step = 1;
+          intParameters.Add(parameter, new Tuple<int, int, int>(minimum, maximum, step));
+        } else intParameters.Remove(parameter);
+      }
+
+      var doubleValue = parameter.Value as ValueTypeValue<double>;
+      if (doubleValue != null) {
+        if (e.Item.Checked) {
+          double minimum = doubleValue.Value;
+          double maximum = doubleValue.Value;
+          double step = 1;
+          doubleParameters.Add(parameter, new Tuple<double, double, double>(minimum, maximum, step));
+        } 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);
+      }
+
+      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 isConstrainedValueParameter =
+        typeof(OptionalConstrainedValueParameter<>).IsAssignableFrom(parameter.GetType().GetGenericTypeDefinition())
+        || typeof(ConstrainedValueParameter<>).Equals(parameter.GetType().GetGenericTypeDefinition());
+
+      if (isConstrainedValueParameter) {
+        choicesLabel.Visible = true;
+        choicesListView.Enabled = true;
+        choicesListView.Visible = true;
+        choicesListView.Tag = parameter;
+
+        if (!multipleChoiceParameters.ContainsKey(parameter)) return;
+        dynamic constrainedValuedParameter = parameter;
+        dynamic validValues = constrainedValuedParameter.ValidValues;
+        foreach (var choice in validValues) {
+          choicesListView.Items.Add(new ListViewItem(choice.ToString()) {
+            Tag = choice,
+            Checked = multipleChoiceParameters[parameter].Contains((INamedItem)choice)
+          });
+        }
+        return;
+      }
+
+      minimumLabel.Visible = true; minimumTextBox.Visible = true;
+      maximumLabel.Visible = true; maximumTextBox.Visible = true;
+      stepSizeLabel.Visible = true; stepSizeTextBox.Visible = true;
+
+      var intValue = parameter.Value as ValueTypeValue<int>;
+      if (intValue != null) {
+        if (!intParameters.ContainsKey(parameter)) return;
+        string min = intParameters[parameter].Item1.ToString();
+        string max = intParameters[parameter].Item2.ToString();
+        string step = intParameters[parameter].Item3.ToString();
+        UpdateMinMaxStepSize(parameter, min, max, step);
+        return;
+      }
+
+      var doubleValue = parameter.Value as ValueTypeValue<double>;
+      if (doubleValue != null) {
+        if (!doubleParameters.ContainsKey(parameter)) return;
+        string min = doubleParameters[parameter].Item1.ToString();
+        string max = doubleParameters[parameter].Item2.ToString();
+        string step = doubleParameters[parameter].Item3.ToString();
+        UpdateMinMaxStepSize(parameter, min, max, step);
+        return;
+      }
+    }
+
+    #region Detail controls
+    private void choiceListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      var parameter = (IValueParameter)choicesListView.Tag;
+      if (e.Item.Checked) {
+        multipleChoiceParameters[parameter].Add((INamedItem)e.Item.Tag);
+      } else multipleChoiceParameters[parameter].Remove((INamedItem)e.Item.Tag);
+
+      experimentsLabel.Text = GetNumberOfVariations().ToString();
+    }
+
+    private void detailsTextBox_Validating(object sender, CancelEventArgs e) {
+      var parameter = (IValueParameter)((TextBox)sender).Tag;
+      errorProvider.Clear();
+
+      var intValue = parameter.Value as ValueTypeValue<int>;
+      if (intValue != null) {
+        int value;
+        if (!int.TryParse(((TextBox)sender).Text, out value)) {
+          errorProvider.SetError(((TextBox)sender), "Please enter a valid integer number.");
+          e.Cancel = true;
+        } else {
+          var before = intParameters[parameter];
+          var after = default(Tuple<int, int, int>);
+          if (sender == minimumTextBox) after = new Tuple<int, int, int>(value, before.Item2, before.Item3);
+          else if (sender == maximumTextBox) after = new Tuple<int, int, int>(before.Item1, value, before.Item3);
+          else if (sender == stepSizeTextBox) after = new Tuple<int, int, int>(before.Item1, before.Item2, value);
+          intParameters[parameter] = after;
+        }
+      }
+
+      var doubleValue = parameter.Value as ValueTypeValue<double>;
+      if (doubleValue != null) {
+        double value;
+        if (!double.TryParse(((TextBox)sender).Text, NumberStyles.Float, CultureInfo.CurrentCulture.NumberFormat, out value)) {
+          errorProvider.SetError(((TextBox)sender), "Please enter a valid number.");
+          e.Cancel = true;
+        } else {
+          var before = doubleParameters[parameter];
+          var after = default(Tuple<double, double, double>);
+          if (sender == minimumTextBox) after = new Tuple<double, double, double>(value, before.Item2, before.Item3);
+          else if (sender == maximumTextBox) after = new Tuple<double, double, double>(before.Item1, value, before.Item3);
+          else if (sender == stepSizeTextBox) after = new Tuple<double, double, double>(before.Item1, before.Item2, value);
+          doubleParameters[parameter] = after;
+        }
+      }
+
+      experimentsLabel.Text = GetNumberOfVariations().ToString();
+    }
+    #endregion
+    #endregion
+
+    #region Instances
     private void instancesListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
       if (!suppressListViewEventHandling) {
@@ -90,4 +268,18 @@
         selectNoneCheckBox.Checked = instancesListView.CheckedItems.Count == 0;
       }
+      var provider = (IProblemInstanceProvider)e.Item.Group.Tag;
+      var descriptor = (IDataDescriptor)e.Item.Tag;
+      if (e.Item.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);
+        }
+      }
+      experimentsLabel.Text = GetNumberOfVariations().ToString();
     }
 
@@ -117,4 +309,5 @@
       }
     }
+    #endregion
 
     private void createBatchRunCheckBox_CheckedChanged(object sender, EventArgs e) {
@@ -131,23 +324,56 @@
 
     #region Helpers
-    private void SetInstanceListViewVisibility() {
-      bool instancesAvailable = optimizer != null
-        && optimizer is IAlgorithm
+    private void SetTabControlVisibility() {
+      bool isAlgorithm = optimizer != null && optimizer is IAlgorithm;
+      bool instancesAvailable = isAlgorithm
         && ((IAlgorithm)optimizer).Problem != null
         && ProblemInstanceManager.GetProviders(((IAlgorithm)optimizer).Problem).Any();
-      selectAllCheckBox.Visible = instancesAvailable;
-      selectNoneCheckBox.Visible = instancesAvailable;
-      instancesLabel.Visible = instancesAvailable;
-      instancesListView.Visible = instancesAvailable;
-      if (instancesAvailable) {
-        Height = 330;
-        FillInstanceListViewAsync();
-      } else Height = 130;
+      if (instancesAvailable && tabControl.TabCount == 1)
+        tabControl.TabPages.Add(instancesTabPage);
+      else if (!instancesAvailable && tabControl.TabCount == 2)
+        tabControl.TabPages.Remove(instancesTabPage);
+      tabControl.Visible = isAlgorithm;
+      if (isAlgorithm) {
+        experimentsLabel.Visible = true;
+        experimentsToCreateDescriptionLabel.Visible = true;
+        Height = 430;
+      } else {
+        experimentsLabel.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 FillInstanceListViewAsync() {
-      SetMode(locked: true);
-      var instanceProviders = ProblemInstanceManager.GetProviders(((IAlgorithm)Optimizer).Problem);
-      instanceDiscoveryBackgroundWorker.RunWorkerAsync(instanceProviders);
+      instances.Clear();
+      instancesListView.Items.Clear();
+      instancesListView.Groups.Clear();
+
+      if (Optimizer is IAlgorithm) {
+        SetMode(DialogMode.DiscoveringInstances);
+        var instanceProviders = ProblemInstanceManager.GetProviders(((IAlgorithm)Optimizer).Problem);
+        instanceDiscoveryBackgroundWorker.RunWorkerAsync(instanceProviders);
+      }
     }
 
@@ -163,39 +389,192 @@
     }
 
-    private void SetMode(bool locked) {
-      createBatchRunCheckBox.Enabled = !locked;
-      repetitionsNumericUpDown.Enabled = !locked;
-      selectAllCheckBox.Enabled = !locked;
-      selectNoneCheckBox.Enabled = !locked;
-      instancesListView.Enabled = !locked;
-      instancesListView.Visible = !locked;
-      okButton.Enabled = !locked;
-      okButton.Visible = !locked;
-      progressLabel.Visible = locked;
-      experimentCreationProgressBar.Visible = locked;
-    }
-
-    private Dictionary<IProblemInstanceProvider, List<IDataDescriptor>> GetSelectedInstances() {
-      var selectedInstances = new Dictionary<IProblemInstanceProvider, List<IDataDescriptor>>();
-      foreach (var checkedItem in instancesListView.CheckedItems.OfType<ListViewItem>()) {
-        if (!selectedInstances.ContainsKey((IProblemInstanceProvider)checkedItem.Group.Tag))
-          selectedInstances.Add((IProblemInstanceProvider)checkedItem.Group.Tag, new List<IDataDescriptor>());
-        selectedInstances[(IProblemInstanceProvider)checkedItem.Group.Tag].Add((IDataDescriptor)checkedItem.Tag);
-      }
-      return selectedInstances;
-    }
+    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) {
+        if (intParam.Item3 == 0) continue;
+        intParameterVariations *= (intParam.Item2 - intParam.Item1) / intParam.Item3 + 1;
+      }
+      int doubleParameterVariations = 1;
+      foreach (var doubleParam in doubleParameters.Values) {
+        if (doubleParam.Item3 == 0) continue;
+        doubleParameterVariations *= (int)Math.Floor((doubleParam.Item2 - doubleParam.Item1) / doubleParam.Item3) + 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) {
+      createBatchRunCheckBox.Enabled = mode == DialogMode.Normal;
+      repetitionsNumericUpDown.Enabled = mode == DialogMode.Normal;
+      selectAllCheckBox.Enabled = mode == DialogMode.Normal;
+      selectNoneCheckBox.Enabled = mode == DialogMode.Normal;
+      instancesListView.Enabled = mode == DialogMode.Normal;
+      instancesListView.Visible = mode == DialogMode.Normal || mode == DialogMode.CreatingExperiment;
+      okButton.Enabled = mode == DialogMode.Normal;
+      okButton.Visible = mode == DialogMode.Normal;
+      instanceDiscoveryProgressLabel.Visible = mode == DialogMode.DiscoveringInstances;
+      instanceDiscoveryProgressBar.Visible = mode == DialogMode.DiscoveringInstances;
+      experimentCreationProgressBar.Visible = mode == DialogMode.CreatingExperiment;
+    }
+
+    private void ClearDetailsView() {
+      minimumLabel.Visible = false;
+      minimumTextBox.Text = string.Empty;
+      minimumTextBox.Enabled = false;
+      minimumTextBox.Visible = false;
+      maximumLabel.Visible = false;
+      maximumTextBox.Text = string.Empty;
+      maximumTextBox.Enabled = false;
+      maximumTextBox.Visible = false;
+      stepSizeLabel.Visible = false;
+      stepSizeTextBox.Text = string.Empty;
+      stepSizeTextBox.Enabled = false;
+      stepSizeTextBox.Visible = false;
+      choicesLabel.Visible = false;
+      choicesListView.Items.Clear();
+      choicesListView.Enabled = false;
+      choicesListView.Visible = false;
+    }
+
+    private void UpdateMinMaxStepSize(IValueParameter parameter, string min, string max, string step) {
+      minimumLabel.Visible = true;
+      minimumTextBox.Text = min;
+      minimumTextBox.Enabled = true;
+      minimumTextBox.Visible = true;
+      minimumTextBox.Tag = parameter;
+      maximumLabel.Visible = true;
+      maximumTextBox.Text = max;
+      maximumTextBox.Enabled = true;
+      maximumTextBox.Visible = true;
+      maximumTextBox.Tag = parameter;
+      stepSizeLabel.Visible = true;
+      stepSizeTextBox.Text = step;
+      stepSizeTextBox.Enabled = true;
+      stepSizeTextBox.Visible = true;
+      stepSizeTextBox.Tag = parameter;
+    }
+
+    #region Retrieve parameter combinations
+    private IEnumerable<Dictionary<IValueParameter, int>> GetIntParameterConfigurations() {
+      var configuration = new Dictionary<IValueParameter, int>();
+      var indices = new Dictionary<IValueParameter, int>();
+      bool finished;
+      do {
+        foreach (var p in intParameters) {
+          if (!indices.ContainsKey(p.Key)) indices.Add(p.Key, 0);
+          var value = p.Value.Item1 + p.Value.Item3 * indices[p.Key];
+          configuration[p.Key] = value;
+        }
+        yield return configuration;
+
+        finished = true;
+        foreach (var p in intParameters.Keys) {
+          var newValue = intParameters[p].Item1 + intParameters[p].Item3 * (indices[p] + 1);
+          if (newValue > intParameters[p].Item2 || intParameters[p].Item3 == 0)
+            indices[p] = 0;
+          else {
+            indices[p]++;
+            finished = false;
+            break;
+          }
+        }
+      } while (!finished);
+    }
+
+    private IEnumerable<Dictionary<IValueParameter, double>> GetDoubleParameterConfigurations() {
+      var configuration = new Dictionary<IValueParameter, double>();
+      var indices = new Dictionary<IValueParameter, int>();
+      bool finished;
+      do {
+        foreach (var p in doubleParameters) {
+          if (!indices.ContainsKey(p.Key)) indices.Add(p.Key, 0);
+          var value = p.Value.Item1 + p.Value.Item3 * indices[p.Key];
+          configuration[p.Key] = value;
+        }
+        yield return configuration;
+
+        finished = true;
+        foreach (var p in doubleParameters.Keys) {
+          var newValue = doubleParameters[p].Item1 + doubleParameters[p].Item3 * (indices[p] + 1);
+          if (newValue > doubleParameters[p].Item2 || doubleParameters[p].Item3 == 0)
+            indices[p] = 0;
+          else {
+            indices[p]++;
+            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, INamedItem>> GetMultipleChoiceConfigurations() {
+      var configuration = new Dictionary<IValueParameter, INamedItem>();
+      var enumerators = new Dictionary<IValueParameter, IEnumerator<INamedItem>>();
+      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();
+          } else {
+            finished = false;
+            break;
+          }
+        }
+        yield return configuration;
+      } while (!finished);
+    }
+    #endregion
     #endregion
 
     #region Background workers
-    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
-      experimentCreationProgressBar.Value = e.ProgressPercentage;
-      progressLabel.Text = (string)e.UserState;
-    }
-
+    #region Instance discovery
     private void instanceDiscoveryBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
-      double progress = 0;
-      instanceDiscoveryBackgroundWorker.ReportProgress((int)progress, string.Empty);
       var instanceProviders = ((IEnumerable<IProblemInstanceProvider>)e.Argument).ToArray();
-      ListViewGroup[] groups = new ListViewGroup[instanceProviders.Length];
+      var groups = new ListViewGroup[instanceProviders.Length];
       for (int i = 0; i < instanceProviders.Length; i++) {
         var provider = instanceProviders[i];
@@ -206,5 +585,5 @@
         var group = groups[i];
         var provider = group.Tag as IProblemInstanceProvider;
-        progress = (100.0 * i) / groups.Length;
+        double progress = (100.0 * i) / groups.Length;
         instanceDiscoveryBackgroundWorker.ReportProgress((int)progress, provider.Name);
         var descriptors = ProblemInstanceManager.GetDataDescriptors(provider).ToArray();
@@ -225,4 +604,9 @@
     }
 
+    private void instanceDiscoveryBackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
+      instanceDiscoveryProgressBar.Value = e.ProgressPercentage;
+      instanceDiscoveryProgressLabel.Text = (string)e.UserState;
+    }
+
     private void instanceDiscoveryBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
       try {
@@ -233,26 +617,29 @@
         }
         instancesListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
-        selectAllCheckBox.Checked = true;
+        selectNoneCheckBox.Checked = true;
       } catch { }
       try {
-        SetMode(locked: false);
+        SetMode(DialogMode.Normal);
         if (e.Error != null) MessageBox.Show(e.Error.Message, "Error occurred", MessageBoxButtons.OK, MessageBoxIcon.Error);
       } catch { }
     }
-
-    private StringBuilder failedInstances;
+    #endregion
+
+    #region Experiment creation
     private void experimentCreationBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
-      backgroundWorkerWaitHandle.Set();
-      experimentCreationBackgroundWorker.ReportProgress(0, string.Empty);
+      backgroundWorkerWaitHandle.Set(); // notify the ok button that we're busy now
       failedInstances = new StringBuilder();
-      var items = (Dictionary<IProblemInstanceProvider, List<IDataDescriptor>>)e.Argument;
       var localExperiment = new Experiment();
-      if (items.Count == 0) {
-        AddOptimizer((IOptimizer)Optimizer.Clone(), localExperiment);
+
+      if (instances.Count == 0) {
+        var variations = experimentCreationBackgroundWorker_CalculateParameterVariations(optimizer);
+        foreach (var v in variations)
+          AddOptimizer(v, localExperiment);
         experimentCreationBackgroundWorker.ReportProgress(100, string.Empty);
+
       } else {
-        int counter = 0, total = items.SelectMany(x => x.Value).Count();
-        foreach (var provider in items.Keys) {
-          foreach (var descriptor in items[provider]) {
+        int counter = 0, totalInstances = instances.SelectMany(x => x.Value).Count(), totalVariations = GetNumberOfVariations();
+        foreach (var provider in instances.Keys) {
+          foreach (var descriptor in instances[provider]) {
             #region Check cancellation request
             if (experimentCreationBackgroundWorker.CancellationPending) {
@@ -271,22 +658,115 @@
             }
             if (!failed) {
-              AddOptimizer(algorithm, localExperiment);
-              counter++;
-              experimentCreationBackgroundWorker.ReportProgress((int)Math.Round(100.0 * counter / total), descriptor.Name);
-            } else experimentCreationBackgroundWorker.ReportProgress((int)Math.Round(100.0 * counter / total), "Loading failed (" + descriptor.Name + ")");
+              var variations = experimentCreationBackgroundWorker_CalculateParameterVariations(algorithm);
+              foreach (var v in variations) {
+                AddOptimizer(v, localExperiment);
+                counter++;
+              }
+              experimentCreationBackgroundWorker.ReportProgress((int)Math.Round(100.0 * counter / (totalInstances * totalVariations)), descriptor.Name);
+            } else experimentCreationBackgroundWorker.ReportProgress((int)Math.Round(100.0 * counter / (totalInstances * totalVariations)), "Loading failed (" + descriptor.Name + ")");
           }
         }
       }
       if (localExperiment != null) localExperiment.Prepare(true);
-      e.Result = localExperiment;
+      Experiment = localExperiment;
+    }
+
+    private IEnumerable<IOptimizer> experimentCreationBackgroundWorker_CalculateParameterVariations(IOptimizer optimizer) {
+      if (!boolParameters.Any() && !intParameters.Any() && !doubleParameters.Any() && !multipleChoiceParameters.Any()) {
+        yield return (IOptimizer)optimizer.Clone();
+        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.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];
+            var variantEnumerator = ((IEnumerable<object>)variantParam.ValidValues).GetEnumerator();
+            var originalEnumerator = ((IEnumerable<object>)((dynamic)m.Key).ValidValues).GetEnumerator();
+            while (variantEnumerator.MoveNext() && originalEnumerator.MoveNext()) {
+              if (m.Value == (INamedItem)originalEnumerator.Current) {
+                variantParam.Value = (dynamic)variantEnumerator.Current;
+                variant.Name += m.Key.Name + "=" + m.Value.Name + ", ";
+                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 void experimentCreationBackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
+      experimentCreationProgressBar.Value = e.ProgressPercentage;
     }
 
     private void experimentCreationBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
       try {
-        SetMode(locked: false);
+        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) {
-          experiment = (Experiment)e.Result;
           DialogResult = System.Windows.Forms.DialogResult.OK;
           Close();
@@ -295,4 +775,5 @@
     }
     #endregion
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj	(revision 7900)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj	(revision 7908)
@@ -236,4 +236,8 @@
       <Private>False</Private>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.3\HeuristicLab.MainForm.WindowsForms-3.3.csproj">
       <Project>{AB687BBE-1BFE-476B-906D-44237135431D}</Project>
@@ -250,4 +254,8 @@
       <Name>HeuristicLab.Optimization-3.3</Name>
       <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
Index: trunk/sources/HeuristicLab.Optimizer/3.3/Plugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/Plugin.cs.frame	(revision 7900)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/Plugin.cs.frame	(revision 7908)
@@ -33,7 +33,9 @@
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
   [PluginDependency("HeuristicLab.MainForm", "3.3")]
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
   [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
