Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.Designer.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.Designer.cs	(revision 13668)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.Designer.cs	(revision 13713)
@@ -27,4 +27,15 @@
     private System.ComponentModel.IContainer components = null;
 
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
     #region Component Designer generated code
 
@@ -47,22 +58,11 @@
       this.problemTabPage = new System.Windows.Forms.TabPage();
       this.problemViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
-      this.algorithmTabPage = new System.Windows.Forms.TabPage();
-      this.algorithmCloneButton = new System.Windows.Forms.Button();
-      this.algorithmStartButton = new System.Windows.Forms.Button();
-      this.algorithmViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
-      this.algorithmSuggestionLabel = new System.Windows.Forms.Label();
-      this.suggestedInstancesComboBox = new System.Windows.Forms.ComboBox();
-      this.runsTabPage = new System.Windows.Forms.TabPage();
-      this.runsView = new HeuristicLab.Optimization.Views.RunCollectionView();
       this.solutionsTabPage = new System.Windows.Forms.TabPage();
-      this.qualityNameLabel = new System.Windows.Forms.Label();
+      this.solutionNameLabel = new System.Windows.Forms.Label();
       this.solutionDiversitySimilarityLabel = new System.Windows.Forms.Label();
-      this.solutionNameLabel = new System.Windows.Forms.Label();
+      this.solutionNameComboBox = new System.Windows.Forms.ComboBox();
       this.similarityComboBox = new System.Windows.Forms.ComboBox();
-      this.qualityNameComboBox = new System.Windows.Forms.ComboBox();
-      this.solutionNameComboBox = new System.Windows.Forms.ComboBox();
-      this.solutionsTabControl = new System.Windows.Forms.TabControl();
-      this.solutionsListTabPage = new System.Windows.Forms.TabPage();
-      this.solutionsViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.solutionsTabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
+      this.solutionsSeedingTabPage = new System.Windows.Forms.TabPage();
       this.solutionsQualityTabPage = new System.Windows.Forms.TabPage();
       this.solutionsQualityViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
@@ -75,10 +75,20 @@
       this.solutionsNetworkTabPage = new System.Windows.Forms.TabPage();
       this.solutionsNetworkChart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
+      this.solversTabPage = new System.Windows.Forms.TabPage();
+      this.solversSplitContainer = new System.Windows.Forms.SplitContainer();
+      this.solverParametersView = new HeuristicLab.Core.Views.ParameterCollectionView();
+      this.solverResultsView = new HeuristicLab.Optimization.Views.ResultCollectionView();
+      this.algorithmCloneButton = new System.Windows.Forms.Button();
+      this.algorithmStartButton = new System.Windows.Forms.Button();
+      this.algorithmSuggestionLabel = new System.Windows.Forms.Label();
+      this.suggestedInstancesComboBox = new System.Windows.Forms.ComboBox();
+      this.runsTabPage = new System.Windows.Forms.TabPage();
+      this.runsView = new HeuristicLab.Optimization.Views.RunCollectionView();
       this.okbTabPage = new System.Windows.Forms.TabPage();
       this.kbViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.problemInstancesTabPage = new System.Windows.Forms.TabPage();
-      this.label1 = new System.Windows.Forms.Label();
+      this.projectionLabel = new System.Windows.Forms.Label();
       this.projectionComboBox = new System.Windows.Forms.ComboBox();
-      this.problemInstancesTabControl = new System.Windows.Forms.TabControl();
+      this.problemInstancesTabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
       this.instancesTabPage = new System.Windows.Forms.TabPage();
       this.problemInstancesView = new HeuristicLab.MainForm.WindowsForms.ViewHost();
@@ -89,12 +99,11 @@
       this.okbDownloadButton = new System.Windows.Forms.Button();
       this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.solutionsSeedingTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
       this.problemTabPage.SuspendLayout();
-      this.algorithmTabPage.SuspendLayout();
-      this.runsTabPage.SuspendLayout();
       this.solutionsTabPage.SuspendLayout();
       this.solutionsTabControl.SuspendLayout();
-      this.solutionsListTabPage.SuspendLayout();
+      this.solutionsSeedingTabPage.SuspendLayout();
       this.solutionsQualityTabPage.SuspendLayout();
       this.solutionsDiversityTabPage.SuspendLayout();
@@ -103,4 +112,10 @@
       this.solutionsNetworkTabPage.SuspendLayout();
       ((System.ComponentModel.ISupportInitialize)(this.solutionsNetworkChart)).BeginInit();
+      this.solversTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.solversSplitContainer)).BeginInit();
+      this.solversSplitContainer.Panel1.SuspendLayout();
+      this.solversSplitContainer.Panel2.SuspendLayout();
+      this.solversSplitContainer.SuspendLayout();
+      this.runsTabPage.SuspendLayout();
       this.okbTabPage.SuspendLayout();
       this.problemInstancesTabPage.SuspendLayout();
@@ -148,7 +163,7 @@
             | System.Windows.Forms.AnchorStyles.Right)));
       this.tabControl.Controls.Add(this.problemTabPage);
-      this.tabControl.Controls.Add(this.algorithmTabPage);
+      this.tabControl.Controls.Add(this.solutionsTabPage);
+      this.tabControl.Controls.Add(this.solversTabPage);
       this.tabControl.Controls.Add(this.runsTabPage);
-      this.tabControl.Controls.Add(this.solutionsTabPage);
       this.tabControl.Controls.Add(this.okbTabPage);
       this.tabControl.Controls.Add(this.problemInstancesTabPage);
@@ -185,108 +200,10 @@
       this.problemViewHost.ViewType = null;
       // 
-      // algorithmTabPage
-      // 
-      this.algorithmTabPage.Controls.Add(this.algorithmCloneButton);
-      this.algorithmTabPage.Controls.Add(this.algorithmStartButton);
-      this.algorithmTabPage.Controls.Add(this.algorithmViewHost);
-      this.algorithmTabPage.Controls.Add(this.algorithmSuggestionLabel);
-      this.algorithmTabPage.Controls.Add(this.suggestedInstancesComboBox);
-      this.algorithmTabPage.Location = new System.Drawing.Point(4, 22);
-      this.algorithmTabPage.Name = "algorithmTabPage";
-      this.algorithmTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.algorithmTabPage.Size = new System.Drawing.Size(681, 428);
-      this.algorithmTabPage.TabIndex = 4;
-      this.algorithmTabPage.Text = "Algorithm";
-      this.algorithmTabPage.UseVisualStyleBackColor = true;
-      // 
-      // algorithmCloneButton
-      // 
-      this.algorithmCloneButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.algorithmCloneButton.Location = new System.Drawing.Point(649, 5);
-      this.algorithmCloneButton.Name = "algorithmCloneButton";
-      this.algorithmCloneButton.Size = new System.Drawing.Size(26, 23);
-      this.algorithmCloneButton.TabIndex = 3;
-      this.algorithmCloneButton.Text = "Clone";
-      this.algorithmCloneButton.UseVisualStyleBackColor = true;
-      this.algorithmCloneButton.Click += new System.EventHandler(this.AlgorithmCloneButtonOnClick);
-      // 
-      // algorithmStartButton
-      // 
-      this.algorithmStartButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.algorithmStartButton.Location = new System.Drawing.Point(617, 5);
-      this.algorithmStartButton.Name = "algorithmStartButton";
-      this.algorithmStartButton.Size = new System.Drawing.Size(26, 23);
-      this.algorithmStartButton.TabIndex = 3;
-      this.algorithmStartButton.Text = "Start";
-      this.algorithmStartButton.UseVisualStyleBackColor = true;
-      this.algorithmStartButton.Click += new System.EventHandler(this.AlgorithmStartButtonOnClick);
-      // 
-      // algorithmViewHost
-      // 
-      this.algorithmViewHost.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.algorithmViewHost.Caption = "View";
-      this.algorithmViewHost.Content = null;
-      this.algorithmViewHost.Enabled = false;
-      this.algorithmViewHost.Location = new System.Drawing.Point(6, 36);
-      this.algorithmViewHost.Name = "algorithmViewHost";
-      this.algorithmViewHost.ReadOnly = false;
-      this.algorithmViewHost.Size = new System.Drawing.Size(669, 386);
-      this.algorithmViewHost.TabIndex = 2;
-      this.algorithmViewHost.ViewsLabelVisible = true;
-      this.algorithmViewHost.ViewType = null;
-      // 
-      // algorithmSuggestionLabel
-      // 
-      this.algorithmSuggestionLabel.AutoSize = true;
-      this.algorithmSuggestionLabel.Location = new System.Drawing.Point(6, 9);
-      this.algorithmSuggestionLabel.Name = "algorithmSuggestionLabel";
-      this.algorithmSuggestionLabel.Size = new System.Drawing.Size(156, 13);
-      this.algorithmSuggestionLabel.TabIndex = 1;
-      this.algorithmSuggestionLabel.Text = "Suggested Algorithm Instances:";
-      // 
-      // suggestedInstancesComboBox
-      // 
-      this.suggestedInstancesComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.suggestedInstancesComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.suggestedInstancesComboBox.FormattingEnabled = true;
-      this.suggestedInstancesComboBox.Location = new System.Drawing.Point(178, 6);
-      this.suggestedInstancesComboBox.Name = "suggestedInstancesComboBox";
-      this.suggestedInstancesComboBox.Size = new System.Drawing.Size(433, 21);
-      this.suggestedInstancesComboBox.TabIndex = 0;
-      this.suggestedInstancesComboBox.SelectedIndexChanged += new System.EventHandler(this.SuggestedInstancesComboBoxOnSelectedIndexChanged);
-      // 
-      // runsTabPage
-      // 
-      this.runsTabPage.Controls.Add(this.runsView);
-      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
-      this.runsTabPage.Name = "runsTabPage";
-      this.runsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.runsTabPage.Size = new System.Drawing.Size(681, 428);
-      this.runsTabPage.TabIndex = 3;
-      this.runsTabPage.Text = "Runs";
-      this.runsTabPage.UseVisualStyleBackColor = true;
-      // 
-      // runsView
-      // 
-      this.runsView.Caption = "RunCollection View";
-      this.runsView.Content = null;
-      this.runsView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.runsView.Location = new System.Drawing.Point(3, 3);
-      this.runsView.Name = "runsView";
-      this.runsView.ReadOnly = false;
-      this.runsView.Size = new System.Drawing.Size(675, 422);
-      this.runsView.TabIndex = 1;
-      // 
       // solutionsTabPage
       // 
-      this.solutionsTabPage.Controls.Add(this.qualityNameLabel);
+      this.solutionsTabPage.Controls.Add(this.solutionNameLabel);
       this.solutionsTabPage.Controls.Add(this.solutionDiversitySimilarityLabel);
-      this.solutionsTabPage.Controls.Add(this.solutionNameLabel);
+      this.solutionsTabPage.Controls.Add(this.solutionNameComboBox);
       this.solutionsTabPage.Controls.Add(this.similarityComboBox);
-      this.solutionsTabPage.Controls.Add(this.qualityNameComboBox);
-      this.solutionsTabPage.Controls.Add(this.solutionNameComboBox);
       this.solutionsTabPage.Controls.Add(this.solutionsTabControl);
       this.solutionsTabPage.Location = new System.Drawing.Point(4, 22);
@@ -298,17 +215,17 @@
       this.solutionsTabPage.UseVisualStyleBackColor = true;
       // 
-      // qualityNameLabel
-      // 
-      this.qualityNameLabel.AutoSize = true;
-      this.qualityNameLabel.Location = new System.Drawing.Point(227, 9);
-      this.qualityNameLabel.Name = "qualityNameLabel";
-      this.qualityNameLabel.Size = new System.Drawing.Size(42, 13);
-      this.qualityNameLabel.TabIndex = 2;
-      this.qualityNameLabel.Text = "Quality:";
+      // solutionNameLabel
+      // 
+      this.solutionNameLabel.AutoSize = true;
+      this.solutionNameLabel.Location = new System.Drawing.Point(235, 9);
+      this.solutionNameLabel.Name = "solutionNameLabel";
+      this.solutionNameLabel.Size = new System.Drawing.Size(48, 13);
+      this.solutionNameLabel.TabIndex = 2;
+      this.solutionNameLabel.Text = "Solution:";
       // 
       // solutionDiversitySimilarityLabel
       // 
       this.solutionDiversitySimilarityLabel.AutoSize = true;
-      this.solutionDiversitySimilarityLabel.Location = new System.Drawing.Point(449, 9);
+      this.solutionDiversitySimilarityLabel.Location = new System.Drawing.Point(5, 9);
       this.solutionDiversitySimilarityLabel.Name = "solutionDiversitySimilarityLabel";
       this.solutionDiversitySimilarityLabel.Size = new System.Drawing.Size(50, 13);
@@ -316,12 +233,14 @@
       this.solutionDiversitySimilarityLabel.Text = "Similarity:";
       // 
-      // solutionNameLabel
-      // 
-      this.solutionNameLabel.AutoSize = true;
-      this.solutionNameLabel.Location = new System.Drawing.Point(6, 9);
-      this.solutionNameLabel.Name = "solutionNameLabel";
-      this.solutionNameLabel.Size = new System.Drawing.Size(48, 13);
-      this.solutionNameLabel.TabIndex = 2;
-      this.solutionNameLabel.Text = "Solution:";
+      // solutionNameComboBox
+      // 
+      this.solutionNameComboBox.DisplayMember = "ItemName";
+      this.solutionNameComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.solutionNameComboBox.FormattingEnabled = true;
+      this.solutionNameComboBox.Location = new System.Drawing.Point(291, 6);
+      this.solutionNameComboBox.Name = "solutionNameComboBox";
+      this.solutionNameComboBox.Size = new System.Drawing.Size(150, 21);
+      this.solutionNameComboBox.TabIndex = 1;
+      this.solutionNameComboBox.SelectedIndexChanged += new System.EventHandler(this.SimilarityComboBoxOnSelectedIndexChanged);
       // 
       // similarityComboBox
@@ -330,36 +249,17 @@
       this.similarityComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.similarityComboBox.FormattingEnabled = true;
-      this.similarityComboBox.Location = new System.Drawing.Point(505, 6);
+      this.similarityComboBox.Location = new System.Drawing.Point(61, 6);
       this.similarityComboBox.Name = "similarityComboBox";
       this.similarityComboBox.Size = new System.Drawing.Size(150, 21);
       this.similarityComboBox.TabIndex = 1;
-      this.similarityComboBox.SelectedIndexChanged += new System.EventHandler(this.similarityComboBox_SelectedIndexChanged);
-      // 
-      // qualityNameComboBox
-      // 
-      this.qualityNameComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.qualityNameComboBox.FormattingEnabled = true;
-      this.qualityNameComboBox.Location = new System.Drawing.Point(281, 6);
-      this.qualityNameComboBox.Name = "qualityNameComboBox";
-      this.qualityNameComboBox.Size = new System.Drawing.Size(150, 21);
-      this.qualityNameComboBox.TabIndex = 1;
-      this.qualityNameComboBox.SelectedIndexChanged += new System.EventHandler(this.qualityNameComboBox_SelectedIndexChanged);
-      // 
-      // solutionNameComboBox
-      // 
-      this.solutionNameComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.solutionNameComboBox.FormattingEnabled = true;
-      this.solutionNameComboBox.Location = new System.Drawing.Point(60, 6);
-      this.solutionNameComboBox.Name = "solutionNameComboBox";
-      this.solutionNameComboBox.Size = new System.Drawing.Size(150, 21);
-      this.solutionNameComboBox.TabIndex = 1;
-      this.solutionNameComboBox.SelectedIndexChanged += new System.EventHandler(this.solutionNameComboBox_SelectedIndexChanged);
+      this.similarityComboBox.SelectedIndexChanged += new System.EventHandler(this.SimilarityComboBoxOnSelectedIndexChanged);
       // 
       // solutionsTabControl
       // 
+      this.solutionsTabControl.AllowDrop = true;
       this.solutionsTabControl.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.solutionsTabControl.Controls.Add(this.solutionsListTabPage);
+      this.solutionsTabControl.Controls.Add(this.solutionsSeedingTabPage);
       this.solutionsTabControl.Controls.Add(this.solutionsQualityTabPage);
       this.solutionsTabControl.Controls.Add(this.solutionsDiversityTabPage);
@@ -373,28 +273,14 @@
       this.solutionsTabControl.TabIndex = 0;
       // 
-      // solutionsListTabPage
-      // 
-      this.solutionsListTabPage.Controls.Add(this.solutionsViewHost);
-      this.solutionsListTabPage.Location = new System.Drawing.Point(4, 22);
-      this.solutionsListTabPage.Name = "solutionsListTabPage";
-      this.solutionsListTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.solutionsListTabPage.Size = new System.Drawing.Size(667, 366);
-      this.solutionsListTabPage.TabIndex = 0;
-      this.solutionsListTabPage.Text = "List";
-      this.solutionsListTabPage.UseVisualStyleBackColor = true;
-      // 
-      // solutionsViewHost
-      // 
-      this.solutionsViewHost.Caption = "View";
-      this.solutionsViewHost.Content = null;
-      this.solutionsViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.solutionsViewHost.Enabled = false;
-      this.solutionsViewHost.Location = new System.Drawing.Point(3, 3);
-      this.solutionsViewHost.Name = "solutionsViewHost";
-      this.solutionsViewHost.ReadOnly = false;
-      this.solutionsViewHost.Size = new System.Drawing.Size(661, 360);
-      this.solutionsViewHost.TabIndex = 0;
-      this.solutionsViewHost.ViewsLabelVisible = true;
-      this.solutionsViewHost.ViewType = null;
+      // solutionsSeedingTabPage
+      // 
+      this.solutionsSeedingTabPage.Controls.Add(this.solutionsSeedingTableLayoutPanel);
+      this.solutionsSeedingTabPage.Location = new System.Drawing.Point(4, 22);
+      this.solutionsSeedingTabPage.Name = "solutionsSeedingTabPage";
+      this.solutionsSeedingTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.solutionsSeedingTabPage.Size = new System.Drawing.Size(667, 366);
+      this.solutionsSeedingTabPage.TabIndex = 6;
+      this.solutionsSeedingTabPage.Text = "Seeding";
+      this.solutionsSeedingTabPage.UseVisualStyleBackColor = true;
       // 
       // solutionsQualityTabPage
@@ -511,8 +397,10 @@
       // solutionsNetworkChart
       // 
+      chartArea1.AxisX.IsStartedFromZero = false;
       chartArea1.AxisX.LabelStyle.Enabled = false;
       chartArea1.AxisX.LineWidth = 0;
       chartArea1.AxisX.MajorGrid.Enabled = false;
       chartArea1.AxisX.MajorTickMark.Enabled = false;
+      chartArea1.AxisY.IsStartedFromZero = false;
       chartArea1.AxisY.LabelStyle.Enabled = false;
       chartArea1.AxisY.LineWidth = 0;
@@ -540,4 +428,129 @@
       this.solutionsNetworkChart.Text = "enhancedChart1";
       // 
+      // solversTabPage
+      // 
+      this.solversTabPage.Controls.Add(this.solversSplitContainer);
+      this.solversTabPage.Controls.Add(this.algorithmCloneButton);
+      this.solversTabPage.Controls.Add(this.algorithmStartButton);
+      this.solversTabPage.Controls.Add(this.algorithmSuggestionLabel);
+      this.solversTabPage.Controls.Add(this.suggestedInstancesComboBox);
+      this.solversTabPage.Location = new System.Drawing.Point(4, 22);
+      this.solversTabPage.Name = "solversTabPage";
+      this.solversTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.solversTabPage.Size = new System.Drawing.Size(681, 428);
+      this.solversTabPage.TabIndex = 4;
+      this.solversTabPage.Text = "Solvers";
+      this.solversTabPage.UseVisualStyleBackColor = true;
+      // 
+      // solversSplitContainer
+      // 
+      this.solversSplitContainer.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.solversSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.solversSplitContainer.Location = new System.Drawing.Point(3, 33);
+      this.solversSplitContainer.Name = "solversSplitContainer";
+      // 
+      // solversSplitContainer.Panel1
+      // 
+      this.solversSplitContainer.Panel1.Controls.Add(this.solverParametersView);
+      // 
+      // solversSplitContainer.Panel2
+      // 
+      this.solversSplitContainer.Panel2.Controls.Add(this.solverResultsView);
+      this.solversSplitContainer.Size = new System.Drawing.Size(675, 392);
+      this.solversSplitContainer.SplitterDistance = 300;
+      this.solversSplitContainer.TabIndex = 4;
+      // 
+      // solverParametersView
+      // 
+      this.solverParametersView.AllowEditingOfHiddenParameters = true;
+      this.solverParametersView.Caption = "ParameterCollection View";
+      this.solverParametersView.Content = null;
+      this.solverParametersView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.solverParametersView.Location = new System.Drawing.Point(0, 0);
+      this.solverParametersView.Name = "solverParametersView";
+      this.solverParametersView.ReadOnly = true;
+      this.solverParametersView.ShowDetails = false;
+      this.solverParametersView.Size = new System.Drawing.Size(300, 392);
+      this.solverParametersView.TabIndex = 0;
+      // 
+      // solverResultsView
+      // 
+      this.solverResultsView.Caption = "ResultCollection View";
+      this.solverResultsView.Content = null;
+      this.solverResultsView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.solverResultsView.Location = new System.Drawing.Point(0, 0);
+      this.solverResultsView.Name = "solverResultsView";
+      this.solverResultsView.ReadOnly = true;
+      this.solverResultsView.ShowDetails = true;
+      this.solverResultsView.Size = new System.Drawing.Size(371, 392);
+      this.solverResultsView.TabIndex = 0;
+      // 
+      // algorithmCloneButton
+      // 
+      this.algorithmCloneButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.algorithmCloneButton.Location = new System.Drawing.Point(649, 5);
+      this.algorithmCloneButton.Name = "algorithmCloneButton";
+      this.algorithmCloneButton.Size = new System.Drawing.Size(26, 23);
+      this.algorithmCloneButton.TabIndex = 3;
+      this.algorithmCloneButton.Text = "Clone";
+      this.algorithmCloneButton.UseVisualStyleBackColor = true;
+      this.algorithmCloneButton.Click += new System.EventHandler(this.AlgorithmCloneButtonOnClick);
+      // 
+      // algorithmStartButton
+      // 
+      this.algorithmStartButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.algorithmStartButton.Location = new System.Drawing.Point(617, 5);
+      this.algorithmStartButton.Name = "algorithmStartButton";
+      this.algorithmStartButton.Size = new System.Drawing.Size(26, 23);
+      this.algorithmStartButton.TabIndex = 3;
+      this.algorithmStartButton.Text = "Start";
+      this.algorithmStartButton.UseVisualStyleBackColor = true;
+      this.algorithmStartButton.Click += new System.EventHandler(this.AlgorithmStartButtonOnClick);
+      // 
+      // algorithmSuggestionLabel
+      // 
+      this.algorithmSuggestionLabel.AutoSize = true;
+      this.algorithmSuggestionLabel.Location = new System.Drawing.Point(6, 9);
+      this.algorithmSuggestionLabel.Name = "algorithmSuggestionLabel";
+      this.algorithmSuggestionLabel.Size = new System.Drawing.Size(99, 13);
+      this.algorithmSuggestionLabel.TabIndex = 1;
+      this.algorithmSuggestionLabel.Text = "Suggested Solvers:";
+      // 
+      // suggestedInstancesComboBox
+      // 
+      this.suggestedInstancesComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.suggestedInstancesComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.suggestedInstancesComboBox.FormattingEnabled = true;
+      this.suggestedInstancesComboBox.Location = new System.Drawing.Point(111, 6);
+      this.suggestedInstancesComboBox.Name = "suggestedInstancesComboBox";
+      this.suggestedInstancesComboBox.Size = new System.Drawing.Size(500, 21);
+      this.suggestedInstancesComboBox.TabIndex = 0;
+      this.suggestedInstancesComboBox.SelectedIndexChanged += new System.EventHandler(this.SuggestedInstancesComboBoxOnSelectedIndexChanged);
+      // 
+      // runsTabPage
+      // 
+      this.runsTabPage.Controls.Add(this.runsView);
+      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.runsTabPage.Name = "runsTabPage";
+      this.runsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.runsTabPage.Size = new System.Drawing.Size(681, 428);
+      this.runsTabPage.TabIndex = 3;
+      this.runsTabPage.Text = "Runs";
+      this.runsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // runsView
+      // 
+      this.runsView.Caption = "RunCollection View";
+      this.runsView.Content = null;
+      this.runsView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.runsView.Location = new System.Drawing.Point(3, 3);
+      this.runsView.Name = "runsView";
+      this.runsView.ReadOnly = false;
+      this.runsView.Size = new System.Drawing.Size(675, 422);
+      this.runsView.TabIndex = 1;
+      // 
       // okbTabPage
       // 
@@ -567,5 +580,5 @@
       // problemInstancesTabPage
       // 
-      this.problemInstancesTabPage.Controls.Add(this.label1);
+      this.problemInstancesTabPage.Controls.Add(this.projectionLabel);
       this.problemInstancesTabPage.Controls.Add(this.projectionComboBox);
       this.problemInstancesTabPage.Controls.Add(this.problemInstancesTabControl);
@@ -579,12 +592,12 @@
       this.problemInstancesTabPage.UseVisualStyleBackColor = true;
       // 
-      // label1
-      // 
-      this.label1.AutoSize = true;
-      this.label1.Location = new System.Drawing.Point(35, 11);
-      this.label1.Name = "label1";
-      this.label1.Size = new System.Drawing.Size(57, 13);
-      this.label1.TabIndex = 6;
-      this.label1.Text = "Projection:";
+      // projectionLabel
+      // 
+      this.projectionLabel.AutoSize = true;
+      this.projectionLabel.Location = new System.Drawing.Point(35, 11);
+      this.projectionLabel.Name = "projectionLabel";
+      this.projectionLabel.Size = new System.Drawing.Size(57, 13);
+      this.projectionLabel.TabIndex = 6;
+      this.projectionLabel.Text = "Projection:";
       // 
       // projectionComboBox
@@ -600,4 +613,5 @@
       // problemInstancesTabControl
       // 
+      this.problemInstancesTabControl.AllowDrop = true;
       this.problemInstancesTabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
             | System.Windows.Forms.AnchorStyles.Left) 
@@ -719,4 +733,17 @@
       this.openFileDialog.Title = "Open Optimizer";
       // 
+      // solutionsSeedingTableLayoutPanel
+      // 
+      this.solutionsSeedingTableLayoutPanel.ColumnCount = 1;
+      this.solutionsSeedingTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+      this.solutionsSeedingTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.solutionsSeedingTableLayoutPanel.Location = new System.Drawing.Point(3, 3);
+      this.solutionsSeedingTableLayoutPanel.Name = "solutionsSeedingTableLayoutPanel";
+      this.solutionsSeedingTableLayoutPanel.RowCount = 2;
+      this.solutionsSeedingTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
+      this.solutionsSeedingTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.solutionsSeedingTableLayoutPanel.Size = new System.Drawing.Size(661, 360);
+      this.solutionsSeedingTableLayoutPanel.TabIndex = 0;
+      // 
       // ExpertSystemView
       // 
@@ -740,11 +767,8 @@
       this.tabControl.ResumeLayout(false);
       this.problemTabPage.ResumeLayout(false);
-      this.algorithmTabPage.ResumeLayout(false);
-      this.algorithmTabPage.PerformLayout();
-      this.runsTabPage.ResumeLayout(false);
       this.solutionsTabPage.ResumeLayout(false);
       this.solutionsTabPage.PerformLayout();
       this.solutionsTabControl.ResumeLayout(false);
-      this.solutionsListTabPage.ResumeLayout(false);
+      this.solutionsSeedingTabPage.ResumeLayout(false);
       this.solutionsQualityTabPage.ResumeLayout(false);
       this.solutionsDiversityTabPage.ResumeLayout(false);
@@ -753,4 +777,11 @@
       this.solutionsNetworkTabPage.ResumeLayout(false);
       ((System.ComponentModel.ISupportInitialize)(this.solutionsNetworkChart)).EndInit();
+      this.solversTabPage.ResumeLayout(false);
+      this.solversTabPage.PerformLayout();
+      this.solversSplitContainer.Panel1.ResumeLayout(false);
+      this.solversSplitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.solversSplitContainer)).EndInit();
+      this.solversSplitContainer.ResumeLayout(false);
+      this.runsTabPage.ResumeLayout(false);
       this.okbTabPage.ResumeLayout(false);
       this.problemInstancesTabPage.ResumeLayout(false);
@@ -775,6 +806,5 @@
     private System.Windows.Forms.TabPage problemTabPage;
     private MainForm.WindowsForms.ViewHost problemViewHost;
-    private System.Windows.Forms.TabPage algorithmTabPage;
-    private MainForm.WindowsForms.ViewHost algorithmViewHost;
+    private System.Windows.Forms.TabPage solversTabPage;
     private System.Windows.Forms.Label algorithmSuggestionLabel;
     private System.Windows.Forms.ComboBox suggestedInstancesComboBox;
@@ -786,22 +816,16 @@
     private MainForm.WindowsForms.ViewHost kbViewHost;
     private System.Windows.Forms.Button algorithmStartButton;
-    private System.Windows.Forms.TabControl problemInstancesTabControl;
+    private HeuristicLab.MainForm.WindowsForms.DragOverTabControl problemInstancesTabControl;
     private System.Windows.Forms.TabPage instancesTabPage;
     private MainForm.WindowsForms.ViewHost problemInstancesView;
     private System.Windows.Forms.TabPage mapTabPage;
     private Visualization.ChartControlsExtensions.EnhancedChart instanceMapChart;
-    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label projectionLabel;
     private System.Windows.Forms.ComboBox projectionComboBox;
     private System.Windows.Forms.TabPage solutionsTabPage;
-    private System.Windows.Forms.TabControl solutionsTabControl;
-    private System.Windows.Forms.TabPage solutionsListTabPage;
+    private HeuristicLab.MainForm.WindowsForms.DragOverTabControl solutionsTabControl;
     private System.Windows.Forms.TabPage solutionsQualityTabPage;
     private System.Windows.Forms.TabPage solutionsDiversityTabPage;
-    private System.Windows.Forms.Label qualityNameLabel;
-    private System.Windows.Forms.Label solutionNameLabel;
-    private System.Windows.Forms.ComboBox qualityNameComboBox;
-    private System.Windows.Forms.ComboBox solutionNameComboBox;
     private MainForm.WindowsForms.ViewHost solutionsQualityViewHost;
-    private MainForm.WindowsForms.ViewHost solutionsViewHost;
     private MainForm.WindowsForms.ViewHost solutionsDiversityViewHost;
     private System.Windows.Forms.Label solutionDiversitySimilarityLabel;
@@ -814,4 +838,11 @@
     private Visualization.ChartControlsExtensions.EnhancedChart solutionsNetworkChart;
     private System.Windows.Forms.Button algorithmCloneButton;
+    private System.Windows.Forms.SplitContainer solversSplitContainer;
+    private Core.Views.ParameterCollectionView solverParametersView;
+    private Optimization.Views.ResultCollectionView solverResultsView;
+    private System.Windows.Forms.Label solutionNameLabel;
+    private System.Windows.Forms.ComboBox solutionNameComboBox;
+    private System.Windows.Forms.TabPage solutionsSeedingTabPage;
+    private System.Windows.Forms.TableLayoutPanel solutionsSeedingTableLayoutPanel;
   }
 }
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.cs	(revision 13668)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.cs	(revision 13713)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -22,8 +22,11 @@
 using HeuristicLab.Analysis;
 using HeuristicLab.Analysis.QualityAnalysis;
+using HeuristicLab.Clients.OKB.RunCreation;
 using HeuristicLab.Common;
 using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
 using HeuristicLab.Core.Views;
 using HeuristicLab.Data;
+using HeuristicLab.Data.Views;
 using HeuristicLab.MainForm;
 using HeuristicLab.Optimization;
@@ -37,4 +40,5 @@
 using System.Windows.Forms;
 using System.Windows.Forms.DataVisualization.Charting;
+using DoubleValue = HeuristicLab.Data.DoubleValue;
 
 namespace HeuristicLab.OptimizationExpertSystem {
@@ -42,5 +46,6 @@
   [Content(typeof(ExpertSystem), IsDefaultView = true)]
   public partial class ExpertSystemView : NamedItemView {
-    protected TypeSelectorDialog problemTypeSelectorDialog;
+    private EnumValueView<SeedingStrategyTypes> seedingStrategyView;
+    private CheckedItemListView<IScope> seedingSolutionsView;
     protected virtual bool SuppressEvents { get; set; }
     private bool okbDownloadInProgress;
@@ -61,14 +66,17 @@
       refreshMapButton.Text = string.Empty;
       refreshMapButton.Image = VSImageLibrary.Refresh;
-    }
-
-    protected override void Dispose(bool disposing) {
-      if (disposing) {
-        if (problemTypeSelectorDialog != null) problemTypeSelectorDialog.Dispose();
-        if (components != null) components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
+      seedingStrategyView = new EnumValueView<SeedingStrategyTypes>() {
+        Dock = DockStyle.Fill
+      };
+      seedingSolutionsView = new CheckedItemListView<IScope>() {
+        Dock = DockStyle.Fill
+      };
+      solutionsSeedingTableLayoutPanel.SuspendLayout();
+      solutionsSeedingTableLayoutPanel.Controls.Add(seedingStrategyView, 0, 0);
+      solutionsSeedingTableLayoutPanel.Controls.Add(seedingSolutionsView, 0, 1);
+      solutionsSeedingTableLayoutPanel.ResumeLayout(true);
+    }
+
+    #region Event Registration
     protected override void DeregisterContentEvents() {
       Content.PropertyChanged -= ContentOnPropertyChanged;
@@ -78,11 +86,8 @@
       Content.SuggestedInstances.ItemsRemoved -= SuggestedInstancesOnChanged;
       Content.SuggestedInstances.ItemsReplaced -= SuggestedInstancesOnChanged;
-      Content.SolutionPool.ItemsAdded -= SolutionPoolOnChanged;
-      Content.SolutionPool.ItemsRemoved -= SolutionPoolOnChanged;
-      Content.SolutionPool.ItemsReplaced -= SolutionPoolOnChanged;
-      Content.SolutionPool.CollectionReset -= SolutionPoolOnChanged;
-      if (Content.Problem != null) Content.Problem.ProblemChanged -= ContentOnProblemChanged;
+      DeregisterProblemEvents(Content.Problem);
       base.DeregisterContentEvents();
     }
+
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
@@ -93,10 +98,25 @@
       Content.SuggestedInstances.ItemsRemoved += SuggestedInstancesOnChanged;
       Content.SuggestedInstances.ItemsReplaced += SuggestedInstancesOnChanged;
-      Content.SolutionPool.ItemsAdded += SolutionPoolOnChanged;
-      Content.SolutionPool.ItemsRemoved += SolutionPoolOnChanged;
-      Content.SolutionPool.ItemsReplaced += SolutionPoolOnChanged;
-      Content.SolutionPool.CollectionReset += SolutionPoolOnChanged;
-      if (Content.Problem != null) Content.Problem.ProblemChanged += ContentOnProblemChanged;
-    }
+      RegisterProblemEvents(Content.Problem);
+    }
+
+    private void DeregisterProblemEvents(OKBProblem problem) {
+      if (problem == null) return;
+      problem.Solutions.ItemsAdded -= SolutionsOnChanged;
+      problem.Solutions.ItemsRemoved -= SolutionsOnChanged;
+      problem.Solutions.ItemsReplaced -= SolutionsOnChanged;
+      problem.Solutions.CollectionReset -= SolutionsOnChanged;
+      problem.ProblemChanged -= ContentOnProblemChanged;
+    }
+
+    private void RegisterProblemEvents(OKBProblem problem) {
+      if (problem == null) return;
+      problem.Solutions.ItemsAdded += SolutionsOnChanged;
+      problem.Solutions.ItemsRemoved += SolutionsOnChanged;
+      problem.Solutions.ItemsReplaced += SolutionsOnChanged;
+      problem.Solutions.CollectionReset += SolutionsOnChanged;
+      problem.ProblemChanged += ContentOnProblemChanged;
+    }
+    #endregion
 
     protected override void OnContentChanged() {
@@ -107,25 +127,27 @@
         if (Content == null) {
           maxEvaluationsTextBox.Text = String.Empty;
-
           problemViewHost.Content = null;
-          algorithmViewHost.Content = null;
+          solverParametersView.Content = null;
+          solverResultsView.Content = null;
           runsView.Content = null;
-          solutionsViewHost.Content = null;
           kbViewHost.Content = null;
           problemInstancesView.Content = null;
+          seedingStrategyView.Content = null;
+          seedingSolutionsView.Content = null;
         } else {
           maxEvaluationsTextBox.Text = Content.MaximumEvaluations.ToString();
           problemViewHost.Content = Content.Problem;
           runsView.Content = Content.Runs;
-          solutionsViewHost.Content = Content.SolutionPool;
           kbViewHost.ViewType = typeof(RunCollectionRLDView);
           kbViewHost.Content = Content.KnowledgeBase;
           problemInstancesView.Content = Content.ProblemInstances;
-          algorithmViewHost.Content = Content.CurrentResult;
+          solverResultsView.Content = Content.CurrentResult;
+          seedingStrategyView.Content = Content.SeedingStrategy;
+          seedingSolutionsView.Content = Content.SolutionSeedingPool;
         }
       } finally { SuppressEvents = false; }
       UpdateSuggestedInstancesCombobox();
+      UpdateSimilarityCalculators();
       UpdateNamesComboboxes();
-      UpdateSimilarityCalculators();
     }
 
@@ -137,5 +159,4 @@
       algorithmStartButton.Enabled = Content != null && !ReadOnly && !Locked && suggestedInstancesComboBox.SelectedIndex >= 0;
       algorithmCloneButton.Enabled = Content != null && !ReadOnly && !Locked && suggestedInstancesComboBox.SelectedIndex >= 0;
-      algorithmViewHost.Enabled = Content != null && !ReadOnly && !Locked;
       runsView.Enabled = Content != null;
       kbViewHost.Enabled = Content != null && !okbDownloadInProgress;
@@ -143,56 +164,4 @@
       refreshMapButton.Enabled = Content != null;
       okbDownloadButton.Enabled = Content != null && Content.Problem != null && Content.Problem.ProblemId >= 0 && !ReadOnly && !Locked && !okbDownloadInProgress;
-    }
-
-    private void UpdateSuggestedInstancesCombobox() {
-      var prevSelection = (IAlgorithm)suggestedInstancesComboBox.SelectedItem;
-      var prevNewIndex = -1;
-      suggestedInstancesComboBox.Items.Clear();
-      if (Content == null) return;
-
-      for (var i = 0; i < Content.SuggestedInstances.Count; i++) {
-        suggestedInstancesComboBox.Items.Add(Content.SuggestedInstances[i]);
-        if (prevSelection == null || Content.SuggestedInstances[i].Name == prevSelection.Name)
-          prevNewIndex = prevSelection == null ? 0 : i;
-      }
-      if (prevNewIndex >= 0) {
-        suggestedInstancesComboBox.SelectedIndex = prevNewIndex;
-      }
-    }
-
-    private void UpdateNamesComboboxes() {
-      var selectedSolutionName = solutionNameComboBox.SelectedIndex >= 0 ? (string)solutionNameComboBox.SelectedItem : string.Empty;
-      var selectedQualityName = qualityNameComboBox.SelectedIndex >= 0 ? (string)qualityNameComboBox.SelectedItem : string.Empty;
-
-      solutionNameComboBox.Items.Clear();
-      qualityNameComboBox.Items.Clear();
-      if (Content == null) return;
-      var qualityNames = new HashSet<string>(Content.SolutionPool.SelectMany(x => x.Variables).Where(x => x.Value is DoubleValue).Select(x => x.Name));
-      var solutionNames = Content.SolutionPool.SelectMany(x => x.Variables).Where(x => !qualityNames.Contains(x.Name));
-
-      foreach (var sn in solutionNames.GroupBy(x => x.Name).OrderBy(x => x.Key)) {
-        solutionNameComboBox.Items.Add(sn.Key);
-        // either it was previously selected, or the variable value is defined in the HeuristicLab.Encodings sub-namespace
-        if (sn.Key == selectedSolutionName || (string.IsNullOrEmpty(selectedSolutionName) && sn.All(x => x.Value != null && x.Value.GetType().FullName.StartsWith("HeuristicLab.Encodings."))))
-          solutionNameComboBox.SelectedItem = sn.Key;
-      }
-      foreach (var qn in qualityNames.OrderBy(x => x)) {
-        qualityNameComboBox.Items.Add(qn);
-        if (qn == selectedQualityName || string.IsNullOrEmpty(selectedQualityName)) qualityNameComboBox.SelectedItem = qn;
-      }
-    }
-
-    private void UpdateSimilarityCalculators() {
-      var selected = (ISolutionSimilarityCalculator)(similarityComboBox.SelectedIndex >= 0 ? similarityComboBox.SelectedItem : null);
-      similarityComboBox.Items.Clear();
-      
-      if (Content == null || Content.Problem == null) return;
-
-      foreach (var calc in Content.Problem.Operators.OfType<ISolutionSimilarityCalculator>()) {
-        similarityComboBox.Items.Add(calc);
-        if (selected != null && calc.ItemName == selected.ItemName) similarityComboBox.SelectedItem = calc;
-      }
-      if (selected == null && similarityComboBox.Items.Count > 0)
-        similarityComboBox.SelectedIndex = 0;
     }
 
@@ -216,9 +185,11 @@
           case "MaximumEvaluations": maxEvaluationsTextBox.Text = Content.MaximumEvaluations.ToString(); break;
           case "Problem":
+            DeregisterProblemEvents(problemViewHost.Content as OKBProblem);
             problemViewHost.Content = Content.Problem;
-            Content.Problem.ProblemChanged += ContentOnProblemChanged;
+            RegisterProblemEvents(Content.Problem);
+            UpdateNamesComboboxes();
             break;
           case "ProblemInstances": problemInstancesView.Content = Content.ProblemInstances; break;
-          case "CurrentResult": algorithmViewHost.Content = Content.CurrentResult; break;
+          case "CurrentResult": solverResultsView.Content = Content.CurrentResult; break;
         }
       } finally { SuppressEvents = false; }
@@ -230,17 +201,7 @@
     }
 
-    private void SolutionPoolOnChanged(object sender, EventArgs e) {
+    private void SolutionsOnChanged(object sender, EventArgs e) {
       UpdateNamesComboboxes();
-      if (qualityNameComboBox.SelectedIndex >= 0) {
-        var qualityName = (string)qualityNameComboBox.SelectedItem;
-        UpdateSolutionQualityAnalysis(qualityName);
-      }
-      if (similarityComboBox.SelectedIndex >= 0) {
-        var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem;
-        UpdateSolutionDiversityAnalysis(calculator);
-        UpdateSolutionFdcAnalysis(calculator);
-        UpdateSolutionLengthScaleAnalysis(calculator);
-        UpdateSolutionNetworkAnalysis(calculator);
-      } else solutionsDiversityViewHost.Content = null;
+      UpdateSolutionVisualization();
     }
     #endregion
@@ -263,21 +224,8 @@
       }
     }
-    #endregion
-    #endregion
 
     private void RefreshMapButtonOnClick(object sender, EventArgs e) {
       Content.UpdateInstanceProjection();
       UpdateProjectionComboBox();
-    }
-
-    private void UpdateProjectionComboBox() {
-      projectionComboBox.Items.Clear();
-      var projStrings = Content.ProblemInstances
-        .SelectMany(x => x.Results.Where(y => Regex.IsMatch(y.Key, "^Projection[.].*[.][XY]$")))
-        .Select(x => Regex.Match(x.Key, "Projection[.](?<g>.*)[.][XY]").Groups["g"].Value)
-        .Distinct();
-      foreach (var str in projStrings) {
-        projectionComboBox.Items.Add(str);
-      }
     }
 
@@ -295,5 +243,6 @@
     }
 
-    private void OkbDownloadProgressOnStateChanged(object sender, EventArgs eventArgs) {
+    private void OkbDownloadProgressOnStateChanged(object sender, EventArgs e) {
+      if (InvokeRequired) { Invoke((Action<object, EventArgs>)OkbDownloadProgressOnStateChanged, sender, e); return; }
       var progress = (IProgress)sender;
       okbDownloadInProgress = progress.ProgressState == ProgressState.Started;
@@ -316,4 +265,5 @@
 
     private void ProjectionComboBoxOnSelectedIndexChanged(object sender, EventArgs e) {
+      if (InvokeRequired) { Invoke((Action<object, EventArgs>)ProjectionComboBoxOnSelectedIndexChanged, sender, e); return; }
       if (projectionComboBox.SelectedIndex < 0) return;
       var projection = (string)projectionComboBox.SelectedItem;
@@ -346,11 +296,112 @@
     }
 
+    private void SuggestedInstancesComboBoxOnSelectedIndexChanged(object sender, EventArgs e) {
+      if (InvokeRequired) { Invoke((Action<object, EventArgs>)SuggestedInstancesComboBoxOnSelectedIndexChanged, sender, e); return; }
+      if (suggestedInstancesComboBox.SelectedIndex >= 0) {
+        solverParametersView.Content = Content.SuggestedInstances[suggestedInstancesComboBox.SelectedIndex].Parameters;
+      } else solverParametersView.Content = null;
+      SetEnabledStateOfControls();
+    }
+
+    private void SimilarityComboBoxOnSelectedIndexChanged(object sender, EventArgs e) {
+      if (InvokeRequired) { Invoke((Action<object, EventArgs>)SimilarityComboBoxOnSelectedIndexChanged, sender, e); return; }
+      var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem;
+      if (calculator != null) {
+        calculator.SolutionVariableName = (string)solutionNameComboBox.SelectedItem;
+        calculator.QualityVariableName = Content.Problem.Problem.Evaluator.QualityParameter.ActualName;
+      }
+      UpdateSolutionDiversityAnalysis(calculator);
+      UpdateSolutionFdcAnalysis(calculator);
+      UpdateSolutionLengthScaleAnalysis(calculator);
+      UpdateSolutionNetworkAnalysis(calculator);
+    }
+    #endregion
+    #endregion
+
+    #region Control Configuration
+    private void UpdateSuggestedInstancesCombobox() {
+      var prevSelection = (IAlgorithm)suggestedInstancesComboBox.SelectedItem;
+      var prevNewIndex = -1;
+      suggestedInstancesComboBox.Items.Clear();
+      if (Content == null) return;
+
+      for (var i = 0; i < Content.SuggestedInstances.Count; i++) {
+        suggestedInstancesComboBox.Items.Add(Content.SuggestedInstances[i]);
+        if (prevSelection == null || Content.SuggestedInstances[i].Name == prevSelection.Name)
+          prevNewIndex = prevSelection == null ? 0 : i;
+      }
+      if (prevNewIndex >= 0) {
+        suggestedInstancesComboBox.SelectedIndex = prevNewIndex;
+      }
+    }
+
+    private void UpdateSimilarityCalculators() {
+      var selected = (ISolutionSimilarityCalculator)(similarityComboBox.SelectedIndex >= 0 ? similarityComboBox.SelectedItem : null);
+      similarityComboBox.Items.Clear();
+
+      if (Content == null || Content.Problem == null) return;
+
+      foreach (var calc in Content.Problem.Operators.OfType<ISolutionSimilarityCalculator>()) {
+        similarityComboBox.Items.Add(calc);
+        if (selected != null && calc.ItemName == selected.ItemName) similarityComboBox.SelectedItem = calc;
+      }
+      if (selected == null && similarityComboBox.Items.Count > 0)
+        similarityComboBox.SelectedIndex = 0;
+    }
+
+    private void UpdateNamesComboboxes() {
+      var selectedSolutionName = solutionNameComboBox.SelectedIndex >= 0 ? (string)solutionNameComboBox.SelectedItem : string.Empty;
+
+      solutionNameComboBox.Items.Clear();
+      if (Content == null) return;
+      var solutionNames = Content.Problem.Solutions.Select(x => x.Solution).OfType<IScope>().SelectMany(x => x.Variables);
+
+      foreach (var sn in solutionNames.GroupBy(x => x.Name).OrderBy(x => x.Key)) {
+        solutionNameComboBox.Items.Add(sn.Key);
+        // either it was previously selected, or the variable value is defined in the HeuristicLab.Encodings sub-namespace
+        if (sn.Key == selectedSolutionName || (string.IsNullOrEmpty(selectedSolutionName) && sn.All(x => x.Value != null && x.Value.GetType().FullName.StartsWith("HeuristicLab.Encodings."))))
+          solutionNameComboBox.SelectedItem = sn.Key;
+      }
+    }
+    
+    private void UpdateProjectionComboBox() {
+      projectionComboBox.Items.Clear();
+      var projStrings = Content.ProblemInstances
+        .SelectMany(x => x.Results.Where(y => Regex.IsMatch(y.Key, "^Projection[.].*[.][XY]$")))
+        .Select(x => Regex.Match(x.Key, "Projection[.](?<g>.*)[.][XY]").Groups["g"].Value)
+        .Distinct();
+      foreach (var str in projStrings) {
+        projectionComboBox.Items.Add(str);
+      }
+    }
+    #endregion
+
+    #region Visualization
+    #region Solution Visualization
+    public void UpdateSolutionVisualization() {
+      if (InvokeRequired) { Invoke((Action)UpdateSolutionVisualization); return;  }
+      var qualityName = Content.Problem.Problem.Evaluator.QualityParameter.ActualName;
+      UpdateSolutionQualityAnalysis(qualityName);
+      if (similarityComboBox.SelectedIndex >= 0) {
+        var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem;
+        UpdateSolutionDiversityAnalysis(calculator);
+        UpdateSolutionFdcAnalysis(calculator);
+        UpdateSolutionLengthScaleAnalysis(calculator);
+        UpdateSolutionNetworkAnalysis(calculator);
+      } else {
+        solutionsDiversityViewHost.Content = null;
+        solutionsFdcViewHost.Content = null;
+        solutionsLengthScaleViewHost.Content = null;
+        solutionsNetworkChart.Series.First().Points.Clear();
+      }
+    }
     private void UpdateSolutionQualityAnalysis(string qualityName) {
       var dt = solutionsQualityViewHost.Content as DataTable;
       if (dt == null) {
         dt = QualityDistributionAnalyzer.PrepareTable(qualityName);
+        dt.VisualProperties.Title = "Quality Distribution";
         solutionsQualityViewHost.Content = dt;
       }
-      QualityDistributionAnalyzer.UpdateTable(dt, Content.SolutionPool.Where(x => x.Variables.ContainsKey(qualityName)).Select(x => x.Variables[qualityName].Value).OfType<DoubleValue>().Select(x => x.Value));
+      QualityDistributionAnalyzer.UpdateTable(dt, Content.Problem.Solutions.Select(x => x.Solution).OfType<IScope>().Where(x => x.Variables.ContainsKey(qualityName)).Select(x => x.Variables[qualityName].Value).OfType<DoubleValue>().Select(x => x.Value));
     }
 
@@ -358,9 +409,8 @@
       try {
         solutionsDiversityViewHost.Content = null;
-        if (Content.SolutionPool == null) return;
-        var similarities = new double[Content.SolutionPool.Count, Content.SolutionPool.Count];
-        for (int i = 0; i < Content.SolutionPool.Count; i++) {
-          for (int j = 0; j < Content.SolutionPool.Count; j++)
-            similarities[i, j] = calculator.CalculateSolutionSimilarity(Content.SolutionPool[i], Content.SolutionPool[j]);
+        var similarities = new double[Content.Problem.Solutions.Count, Content.Problem.Solutions.Count];
+        for (int i = 0; i < Content.Problem.Solutions.Count; i++) {
+          for (int j = 0; j < Content.Problem.Solutions.Count; j++)
+            similarities[i, j] = calculator.CalculateSolutionSimilarity((IScope)Content.Problem.Solutions[i].Solution, (IScope)Content.Problem.Solutions[j].Solution);
         }
         var hm = new HeatMap(similarities, "Solution Similarities", 0.0, 1.0);
@@ -372,14 +422,19 @@
       try {
         solutionsFdcViewHost.Content = null;
-        if (Content.SolutionPool == null) return;
         var points = new List<Point2D<double>>();
-        for (int i = 0; i < Content.SolutionPool.Count; i++) {
-          for (int j = 0; j < Content.SolutionPool.Count; j++) {
+        for (int i = 0; i < Content.Problem.Solutions.Count; i++) {
+          for (int j = 0; j < Content.Problem.Solutions.Count; j++) {
             if (i == j) continue;
-            var qDiff = Math.Abs(((DoubleValue)Content.SolutionPool[i].Variables[calculator.QualityVariableName].Value).Value - ((DoubleValue)Content.SolutionPool[j].Variables[calculator.QualityVariableName].Value).Value);
-            points.Add(new Point2D<double>(qDiff, 1.0 - calculator.CalculateSolutionSimilarity(Content.SolutionPool[i], Content.SolutionPool[j])));
+            var qDiff = Math.Abs(((DoubleValue)((IScope)Content.Problem.Solutions[i].Solution).Variables[calculator.QualityVariableName].Value).Value
+              - ((DoubleValue)((IScope)Content.Problem.Solutions[j].Solution).Variables[calculator.QualityVariableName].Value).Value);
+            points.Add(new Point2D<double>(qDiff, 1.0 - calculator.CalculateSolutionSimilarity((IScope)Content.Problem.Solutions[i].Solution, (IScope)Content.Problem.Solutions[j].Solution)));
           }
         }
         var splot = new ScatterPlot("Fitness-Distance", "");
+        splot.VisualProperties.XAxisTitle = "Absolute Fitness Difference";
+        splot.VisualProperties.XAxisMinimumFixedValue = 0.0;
+        splot.VisualProperties.YAxisTitle = "Solution Distance";
+        splot.VisualProperties.YAxisMinimumFixedValue = 0.0;
+        splot.VisualProperties.YAxisMaximumFixedValue = 1.0;
         var row = new ScatterPlotDataRow("Fdc", "", points);
         row.VisualProperties.PointSize = 7;
@@ -392,5 +447,4 @@
       try {
         solutionsLengthScaleViewHost.Content = null;
-        if (Content.SolutionPool == null) return;
         var dt = solutionsLengthScaleViewHost.Content as DataTable;
         if (dt == null) {
@@ -404,10 +458,11 @@
 
     private IEnumerable<double> CalculateLengthScale(ISolutionSimilarityCalculator calculator) {
-      for (int i = 0; i < Content.SolutionPool.Count; i++) {
-        for (int j = 0; j < Content.SolutionPool.Count; j++) {
+      for (int i = 0; i < Content.Problem.Solutions.Count; i++) {
+        for (int j = 0; j < Content.Problem.Solutions.Count; j++) {
           if (i == j) continue;
-          var sim = calculator.CalculateSolutionSimilarity(Content.SolutionPool[i], Content.SolutionPool[j]);
+          var sim = calculator.CalculateSolutionSimilarity((IScope)Content.Problem.Solutions[i].Solution, (IScope)Content.Problem.Solutions[j].Solution);
           if (sim.IsAlmost(0)) continue;
-          var qDiff = Math.Abs(((DoubleValue)Content.SolutionPool[i].Variables[calculator.QualityVariableName].Value).Value - ((DoubleValue)Content.SolutionPool[j].Variables[calculator.QualityVariableName].Value).Value);
+          var qDiff = Math.Abs(((DoubleValue)((IScope)Content.Problem.Solutions[i].Solution).Variables[calculator.QualityVariableName].Value).Value
+            - ((DoubleValue)((IScope)Content.Problem.Solutions[j].Solution).Variables[calculator.QualityVariableName].Value).Value);
           yield return qDiff / sim;
         }
@@ -419,16 +474,16 @@
         var series = solutionsNetworkChart.Series["SolutionSeries"];
         series.Points.Clear();
-        var dissimilarities = new DoubleMatrix(Content.SolutionPool.Count, Content.SolutionPool.Count);
-        for (int i = 0; i < Content.SolutionPool.Count; i++) {
-          for (int j = 0; j < Content.SolutionPool.Count; j++) {
+        var dissimilarities = new DoubleMatrix(Content.Problem.Solutions.Count, Content.Problem.Solutions.Count);
+        for (int i = 0; i < Content.Problem.Solutions.Count; i++) {
+          for (int j = 0; j < Content.Problem.Solutions.Count; j++) {
             if (i == j) continue;
-            dissimilarities[i, j] = 1.0 - calculator.CalculateSolutionSimilarity(Content.SolutionPool[i], Content.SolutionPool[j]);
+            dissimilarities[i, j] = 1.0 - calculator.CalculateSolutionSimilarity((IScope)Content.Problem.Solutions[i].Solution, (IScope)Content.Problem.Solutions[j].Solution);
           }
         }
         var coords = MultidimensionalScaling.KruskalShepard(dissimilarities);
         for (var i = 0; i < coords.Rows; i++) {
-          var quality = ((DoubleValue)Content.SolutionPool[i].Variables[calculator.QualityVariableName].Value).Value;
+          var quality = ((DoubleValue)((IScope)Content.Problem.Solutions[i].Solution).Variables[calculator.QualityVariableName].Value).Value;
           series.Points.Add(new DataPoint() {
-            Name = i.ToString(),
+            Name = (i + 1).ToString(),
             XValue = coords[i, 0],
             YValues = new[] { coords[i, 1], quality },
@@ -438,43 +493,6 @@
       } catch { }
     }
-
-    private void SuggestedInstancesComboBoxOnSelectedIndexChanged(object sender, EventArgs e) {
-      SetEnabledStateOfControls();
-    }
-
-    private void qualityNameComboBox_SelectedIndexChanged(object sender, EventArgs e) {
-      if (qualityNameComboBox.SelectedIndex < 0) return;
-      solutionsQualityViewHost.Content = null;
-      solutionsDiversityViewHost.Content = null;
-      var qualityName = (string)qualityNameComboBox.SelectedItem;
-      UpdateSolutionQualityAnalysis(qualityName);
-      var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem;
-      if (calculator != null) calculator.QualityVariableName = qualityName;
-      UpdateSolutionDiversityAnalysis(calculator);
-      UpdateSolutionFdcAnalysis(calculator);
-      UpdateSolutionLengthScaleAnalysis(calculator);
-      UpdateSolutionNetworkAnalysis(calculator);
-    }
-
-    private void solutionNameComboBox_SelectedIndexChanged(object sender, EventArgs e) {
-      var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem;
-      if (calculator != null) calculator.SolutionVariableName = (string)solutionNameComboBox.SelectedItem;
-      UpdateSolutionDiversityAnalysis(calculator);
-      UpdateSolutionFdcAnalysis(calculator);
-      UpdateSolutionLengthScaleAnalysis(calculator);
-      UpdateSolutionNetworkAnalysis(calculator);
-    }
-
-    private void similarityComboBox_SelectedIndexChanged(object sender, EventArgs e) {
-      var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem;
-      if (calculator != null) {
-        calculator.SolutionVariableName = (string)solutionNameComboBox.SelectedItem;
-        calculator.QualityVariableName = (string)qualityNameComboBox.SelectedItem;
-      }
-      UpdateSolutionDiversityAnalysis(calculator);
-      UpdateSolutionFdcAnalysis(calculator);
-      UpdateSolutionLengthScaleAnalysis(calculator);
-      UpdateSolutionNetworkAnalysis(calculator);
-    }
+    #endregion
+    #endregion
   }
 }
