Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.Designer.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.Designer.cs	(revision 13713)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.Designer.cs	(revision 13718)
@@ -49,8 +49,9 @@
       System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
       System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
+      System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();
       System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
       System.Windows.Forms.DataVisualization.Charting.Legend legend2 = new System.Windows.Forms.DataVisualization.Charting.Legend();
-      System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();
       System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series();
+      System.Windows.Forms.DataVisualization.Charting.Series series4 = new System.Windows.Forms.DataVisualization.Charting.Series();
       this.evaluationsLimitabel = new System.Windows.Forms.Label();
       this.maxEvaluationsTextBox = new System.Windows.Forms.TextBox();
@@ -64,21 +65,28 @@
       this.similarityComboBox = new System.Windows.Forms.ComboBox();
       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();
+      this.solutionsLengthScaleTabPage = new System.Windows.Forms.TabPage();
+      this.solutionsLengthScaleViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.solutionsDiversityTabPage = new System.Windows.Forms.TabPage();
       this.solutionsDiversityViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.solutionsFdcTabPage = new System.Windows.Forms.TabPage();
+      this.fdcBetweenBestCheckBox = new System.Windows.Forms.CheckBox();
       this.solutionsFdcViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
-      this.solutionsLengthScaleTabPage = new System.Windows.Forms.TabPage();
-      this.solutionsLengthScaleViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       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.seedingStrategyPanel = new System.Windows.Forms.Panel();
+      this.solverTabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
+      this.resultsTabPage = new System.Windows.Forms.TabPage();
+      this.solverResultsView = new HeuristicLab.Optimization.Views.ResultCollectionView();
+      this.solutionSeedingTabPage = new System.Windows.Forms.TabPage();
+      this.parametersTabPage = new System.Windows.Forms.TabPage();
       this.solverParametersView = new HeuristicLab.Core.Views.ParameterCollectionView();
-      this.solverResultsView = new HeuristicLab.Optimization.Views.ResultCollectionView();
+      this.operatorGraphTabPage = new System.Windows.Forms.TabPage();
+      this.operatorGraphViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.algorithmCloneButton = new System.Windows.Forms.Button();
       this.algorithmStartButton = new System.Windows.Forms.Button();
+      this.label1 = new System.Windows.Forms.Label();
       this.algorithmSuggestionLabel = new System.Windows.Forms.Label();
       this.suggestedInstancesComboBox = new System.Windows.Forms.ComboBox();
@@ -99,22 +107,19 @@
       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.solutionsTabPage.SuspendLayout();
       this.solutionsTabControl.SuspendLayout();
-      this.solutionsSeedingTabPage.SuspendLayout();
       this.solutionsQualityTabPage.SuspendLayout();
+      this.solutionsLengthScaleTabPage.SuspendLayout();
       this.solutionsDiversityTabPage.SuspendLayout();
       this.solutionsFdcTabPage.SuspendLayout();
-      this.solutionsLengthScaleTabPage.SuspendLayout();
       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.solverTabControl.SuspendLayout();
+      this.resultsTabPage.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      this.operatorGraphTabPage.SuspendLayout();
       this.runsTabPage.SuspendLayout();
       this.okbTabPage.SuspendLayout();
@@ -126,19 +131,8 @@
       this.SuspendLayout();
       // 
-      // nameTextBox
-      // 
-      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
-      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
-      this.nameTextBox.Location = new System.Drawing.Point(75, 0);
-      this.nameTextBox.Size = new System.Drawing.Size(592, 20);
-      // 
-      // infoLabel
-      // 
-      this.infoLabel.Location = new System.Drawing.Point(673, 3);
-      // 
       // evaluationsLimitabel
       // 
       this.evaluationsLimitabel.AutoSize = true;
-      this.evaluationsLimitabel.Location = new System.Drawing.Point(3, 29);
+      this.evaluationsLimitabel.Location = new System.Drawing.Point(5, 9);
       this.evaluationsLimitabel.Name = "evaluationsLimitabel";
       this.evaluationsLimitabel.Size = new System.Drawing.Size(66, 13);
@@ -150,7 +144,7 @@
       this.maxEvaluationsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
-      this.maxEvaluationsTextBox.Location = new System.Drawing.Point(75, 26);
+      this.maxEvaluationsTextBox.Location = new System.Drawing.Point(110, 6);
       this.maxEvaluationsTextBox.Name = "maxEvaluationsTextBox";
-      this.maxEvaluationsTextBox.Size = new System.Drawing.Size(592, 20);
+      this.maxEvaluationsTextBox.Size = new System.Drawing.Size(564, 20);
       this.maxEvaluationsTextBox.TabIndex = 6;
       this.maxEvaluationsTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.MaxEvaluationsTextBoxOnValidating);
@@ -168,8 +162,8 @@
       this.tabControl.Controls.Add(this.okbTabPage);
       this.tabControl.Controls.Add(this.problemInstancesTabPage);
-      this.tabControl.Location = new System.Drawing.Point(0, 81);
+      this.tabControl.Location = new System.Drawing.Point(0, 32);
       this.tabControl.Name = "tabControl";
       this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(689, 454);
+      this.tabControl.Size = new System.Drawing.Size(689, 503);
       this.tabControl.TabIndex = 17;
       // 
@@ -181,5 +175,5 @@
       this.problemTabPage.Name = "problemTabPage";
       this.problemTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.problemTabPage.Size = new System.Drawing.Size(681, 428);
+      this.problemTabPage.Size = new System.Drawing.Size(681, 477);
       this.problemTabPage.TabIndex = 1;
       this.problemTabPage.Text = "Problem";
@@ -195,5 +189,5 @@
       this.problemViewHost.Name = "problemViewHost";
       this.problemViewHost.ReadOnly = false;
-      this.problemViewHost.Size = new System.Drawing.Size(675, 422);
+      this.problemViewHost.Size = new System.Drawing.Size(675, 471);
       this.problemViewHost.TabIndex = 2;
       this.problemViewHost.ViewsLabelVisible = false;
@@ -210,5 +204,5 @@
       this.solutionsTabPage.Name = "solutionsTabPage";
       this.solutionsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.solutionsTabPage.Size = new System.Drawing.Size(681, 428);
+      this.solutionsTabPage.Size = new System.Drawing.Size(681, 477);
       this.solutionsTabPage.TabIndex = 7;
       this.solutionsTabPage.Text = "Solutions";
@@ -261,26 +255,14 @@
             | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
-      this.solutionsTabControl.Controls.Add(this.solutionsSeedingTabPage);
       this.solutionsTabControl.Controls.Add(this.solutionsQualityTabPage);
+      this.solutionsTabControl.Controls.Add(this.solutionsLengthScaleTabPage);
       this.solutionsTabControl.Controls.Add(this.solutionsDiversityTabPage);
       this.solutionsTabControl.Controls.Add(this.solutionsFdcTabPage);
-      this.solutionsTabControl.Controls.Add(this.solutionsLengthScaleTabPage);
       this.solutionsTabControl.Controls.Add(this.solutionsNetworkTabPage);
       this.solutionsTabControl.Location = new System.Drawing.Point(3, 33);
       this.solutionsTabControl.Name = "solutionsTabControl";
       this.solutionsTabControl.SelectedIndex = 0;
-      this.solutionsTabControl.Size = new System.Drawing.Size(675, 392);
+      this.solutionsTabControl.Size = new System.Drawing.Size(675, 441);
       this.solutionsTabControl.TabIndex = 0;
-      // 
-      // 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
@@ -290,5 +272,5 @@
       this.solutionsQualityTabPage.Name = "solutionsQualityTabPage";
       this.solutionsQualityTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.solutionsQualityTabPage.Size = new System.Drawing.Size(667, 366);
+      this.solutionsQualityTabPage.Size = new System.Drawing.Size(667, 415);
       this.solutionsQualityTabPage.TabIndex = 1;
       this.solutionsQualityTabPage.Text = "Quality Analysis";
@@ -304,8 +286,33 @@
       this.solutionsQualityViewHost.Name = "solutionsQualityViewHost";
       this.solutionsQualityViewHost.ReadOnly = false;
-      this.solutionsQualityViewHost.Size = new System.Drawing.Size(661, 360);
+      this.solutionsQualityViewHost.Size = new System.Drawing.Size(661, 409);
       this.solutionsQualityViewHost.TabIndex = 0;
       this.solutionsQualityViewHost.ViewsLabelVisible = true;
       this.solutionsQualityViewHost.ViewType = null;
+      // 
+      // solutionsLengthScaleTabPage
+      // 
+      this.solutionsLengthScaleTabPage.Controls.Add(this.solutionsLengthScaleViewHost);
+      this.solutionsLengthScaleTabPage.Location = new System.Drawing.Point(4, 22);
+      this.solutionsLengthScaleTabPage.Name = "solutionsLengthScaleTabPage";
+      this.solutionsLengthScaleTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.solutionsLengthScaleTabPage.Size = new System.Drawing.Size(667, 415);
+      this.solutionsLengthScaleTabPage.TabIndex = 3;
+      this.solutionsLengthScaleTabPage.Text = "Length-Scale Analysis";
+      this.solutionsLengthScaleTabPage.UseVisualStyleBackColor = true;
+      // 
+      // solutionsLengthScaleViewHost
+      // 
+      this.solutionsLengthScaleViewHost.Caption = "View";
+      this.solutionsLengthScaleViewHost.Content = null;
+      this.solutionsLengthScaleViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.solutionsLengthScaleViewHost.Enabled = false;
+      this.solutionsLengthScaleViewHost.Location = new System.Drawing.Point(3, 3);
+      this.solutionsLengthScaleViewHost.Name = "solutionsLengthScaleViewHost";
+      this.solutionsLengthScaleViewHost.ReadOnly = false;
+      this.solutionsLengthScaleViewHost.Size = new System.Drawing.Size(661, 409);
+      this.solutionsLengthScaleViewHost.TabIndex = 0;
+      this.solutionsLengthScaleViewHost.ViewsLabelVisible = true;
+      this.solutionsLengthScaleViewHost.ViewType = null;
       // 
       // solutionsDiversityTabPage
@@ -315,5 +322,5 @@
       this.solutionsDiversityTabPage.Name = "solutionsDiversityTabPage";
       this.solutionsDiversityTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.solutionsDiversityTabPage.Size = new System.Drawing.Size(667, 366);
+      this.solutionsDiversityTabPage.Size = new System.Drawing.Size(667, 415);
       this.solutionsDiversityTabPage.TabIndex = 2;
       this.solutionsDiversityTabPage.Text = "Diversity Analysis";
@@ -329,5 +336,5 @@
       this.solutionsDiversityViewHost.Name = "solutionsDiversityViewHost";
       this.solutionsDiversityViewHost.ReadOnly = false;
-      this.solutionsDiversityViewHost.Size = new System.Drawing.Size(661, 360);
+      this.solutionsDiversityViewHost.Size = new System.Drawing.Size(661, 409);
       this.solutionsDiversityViewHost.TabIndex = 1;
       this.solutionsDiversityViewHost.ViewsLabelVisible = true;
@@ -336,51 +343,40 @@
       // solutionsFdcTabPage
       // 
+      this.solutionsFdcTabPage.Controls.Add(this.fdcBetweenBestCheckBox);
       this.solutionsFdcTabPage.Controls.Add(this.solutionsFdcViewHost);
       this.solutionsFdcTabPage.Location = new System.Drawing.Point(4, 22);
       this.solutionsFdcTabPage.Name = "solutionsFdcTabPage";
       this.solutionsFdcTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.solutionsFdcTabPage.Size = new System.Drawing.Size(667, 366);
+      this.solutionsFdcTabPage.Size = new System.Drawing.Size(667, 415);
       this.solutionsFdcTabPage.TabIndex = 5;
       this.solutionsFdcTabPage.Text = "Fitness-Distance Analysis";
       this.solutionsFdcTabPage.UseVisualStyleBackColor = true;
       // 
+      // fdcBetweenBestCheckBox
+      // 
+      this.fdcBetweenBestCheckBox.AutoSize = true;
+      this.fdcBetweenBestCheckBox.Location = new System.Drawing.Point(6, 6);
+      this.fdcBetweenBestCheckBox.Name = "fdcBetweenBestCheckBox";
+      this.fdcBetweenBestCheckBox.Size = new System.Drawing.Size(233, 17);
+      this.fdcBetweenBestCheckBox.TabIndex = 2;
+      this.fdcBetweenBestCheckBox.Text = "Calculate FDC between best solution(s) only";
+      this.fdcBetweenBestCheckBox.UseVisualStyleBackColor = true;
+      this.fdcBetweenBestCheckBox.CheckedChanged += new System.EventHandler(this.FdcBetweenBestCheckBoxOnCheckedChanged);
+      // 
       // solutionsFdcViewHost
       // 
+      this.solutionsFdcViewHost.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.solutionsFdcViewHost.Caption = "View";
       this.solutionsFdcViewHost.Content = null;
-      this.solutionsFdcViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
       this.solutionsFdcViewHost.Enabled = false;
-      this.solutionsFdcViewHost.Location = new System.Drawing.Point(3, 3);
+      this.solutionsFdcViewHost.Location = new System.Drawing.Point(3, 29);
       this.solutionsFdcViewHost.Name = "solutionsFdcViewHost";
       this.solutionsFdcViewHost.ReadOnly = false;
-      this.solutionsFdcViewHost.Size = new System.Drawing.Size(661, 360);
+      this.solutionsFdcViewHost.Size = new System.Drawing.Size(661, 386);
       this.solutionsFdcViewHost.TabIndex = 0;
       this.solutionsFdcViewHost.ViewsLabelVisible = true;
       this.solutionsFdcViewHost.ViewType = null;
-      // 
-      // solutionsLengthScaleTabPage
-      // 
-      this.solutionsLengthScaleTabPage.Controls.Add(this.solutionsLengthScaleViewHost);
-      this.solutionsLengthScaleTabPage.Location = new System.Drawing.Point(4, 22);
-      this.solutionsLengthScaleTabPage.Name = "solutionsLengthScaleTabPage";
-      this.solutionsLengthScaleTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.solutionsLengthScaleTabPage.Size = new System.Drawing.Size(667, 366);
-      this.solutionsLengthScaleTabPage.TabIndex = 3;
-      this.solutionsLengthScaleTabPage.Text = "Length-Scale Analysis";
-      this.solutionsLengthScaleTabPage.UseVisualStyleBackColor = true;
-      // 
-      // solutionsLengthScaleViewHost
-      // 
-      this.solutionsLengthScaleViewHost.Caption = "View";
-      this.solutionsLengthScaleViewHost.Content = null;
-      this.solutionsLengthScaleViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.solutionsLengthScaleViewHost.Enabled = false;
-      this.solutionsLengthScaleViewHost.Location = new System.Drawing.Point(3, 3);
-      this.solutionsLengthScaleViewHost.Name = "solutionsLengthScaleViewHost";
-      this.solutionsLengthScaleViewHost.ReadOnly = false;
-      this.solutionsLengthScaleViewHost.Size = new System.Drawing.Size(661, 360);
-      this.solutionsLengthScaleViewHost.TabIndex = 0;
-      this.solutionsLengthScaleViewHost.ViewsLabelVisible = true;
-      this.solutionsLengthScaleViewHost.ViewType = null;
       // 
       // solutionsNetworkTabPage
@@ -390,5 +386,5 @@
       this.solutionsNetworkTabPage.Name = "solutionsNetworkTabPage";
       this.solutionsNetworkTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.solutionsNetworkTabPage.Size = new System.Drawing.Size(667, 366);
+      this.solutionsNetworkTabPage.Size = new System.Drawing.Size(667, 415);
       this.solutionsNetworkTabPage.TabIndex = 4;
       this.solutionsNetworkTabPage.Text = "Network Analysis";
@@ -423,43 +419,106 @@
       series1.Name = "SolutionSeries";
       series1.YValuesPerPoint = 2;
+      series2.ChartArea = "SolutionsNetworkChartArea";
+      series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Bubble;
+      series2.IsValueShownAsLabel = true;
+      series2.Label = "#LABEL";
+      series2.Legend = "Legend1";
+      series2.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Cross;
+      series2.Name = "SeedingSolutionSeries";
+      series2.YValuesPerPoint = 2;
       this.solutionsNetworkChart.Series.Add(series1);
-      this.solutionsNetworkChart.Size = new System.Drawing.Size(661, 360);
+      this.solutionsNetworkChart.Series.Add(series2);
+      this.solutionsNetworkChart.Size = new System.Drawing.Size(661, 409);
       this.solutionsNetworkChart.TabIndex = 0;
       this.solutionsNetworkChart.Text = "enhancedChart1";
+      this.solutionsNetworkChart.MouseClick += new System.Windows.Forms.MouseEventHandler(this.SolutionsNetworkChartOnMouseClick);
       // 
       // solversTabPage
       // 
-      this.solversTabPage.Controls.Add(this.solversSplitContainer);
+      this.solversTabPage.Controls.Add(this.seedingStrategyPanel);
+      this.solversTabPage.Controls.Add(this.solverTabControl);
       this.solversTabPage.Controls.Add(this.algorithmCloneButton);
       this.solversTabPage.Controls.Add(this.algorithmStartButton);
+      this.solversTabPage.Controls.Add(this.label1);
+      this.solversTabPage.Controls.Add(this.evaluationsLimitabel);
       this.solversTabPage.Controls.Add(this.algorithmSuggestionLabel);
+      this.solversTabPage.Controls.Add(this.maxEvaluationsTextBox);
       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.Size = new System.Drawing.Size(681, 477);
       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) 
+      // seedingStrategyPanel
+      // 
+      this.seedingStrategyPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.seedingStrategyPanel.Location = new System.Drawing.Point(110, 32);
+      this.seedingStrategyPanel.Name = "seedingStrategyPanel";
+      this.seedingStrategyPanel.Size = new System.Drawing.Size(564, 21);
+      this.seedingStrategyPanel.TabIndex = 5;
+      // 
+      // solverTabControl
+      // 
+      this.solverTabControl.AllowDrop = true;
+      this.solverTabControl.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;
+      this.solverTabControl.Controls.Add(this.resultsTabPage);
+      this.solverTabControl.Controls.Add(this.solutionSeedingTabPage);
+      this.solverTabControl.Controls.Add(this.parametersTabPage);
+      this.solverTabControl.Controls.Add(this.operatorGraphTabPage);
+      this.solverTabControl.Location = new System.Drawing.Point(2, 87);
+      this.solverTabControl.Name = "solverTabControl";
+      this.solverTabControl.SelectedIndex = 0;
+      this.solverTabControl.Size = new System.Drawing.Size(676, 387);
+      this.solverTabControl.TabIndex = 4;
+      // 
+      // resultsTabPage
+      // 
+      this.resultsTabPage.Controls.Add(this.solverResultsView);
+      this.resultsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.resultsTabPage.Name = "resultsTabPage";
+      this.resultsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.resultsTabPage.Size = new System.Drawing.Size(668, 361);
+      this.resultsTabPage.TabIndex = 2;
+      this.resultsTabPage.Text = "Results";
+      this.resultsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // 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(3, 3);
+      this.solverResultsView.Name = "solverResultsView";
+      this.solverResultsView.ReadOnly = true;
+      this.solverResultsView.ShowDetails = true;
+      this.solverResultsView.Size = new System.Drawing.Size(662, 355);
+      this.solverResultsView.TabIndex = 1;
+      // 
+      // solutionSeedingTabPage
+      // 
+      this.solutionSeedingTabPage.Location = new System.Drawing.Point(4, 22);
+      this.solutionSeedingTabPage.Name = "solutionSeedingTabPage";
+      this.solutionSeedingTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.solutionSeedingTabPage.Size = new System.Drawing.Size(668, 361);
+      this.solutionSeedingTabPage.TabIndex = 1;
+      this.solutionSeedingTabPage.Text = "Seeding Pool";
+      this.solutionSeedingTabPage.UseVisualStyleBackColor = true;
+      // 
+      // parametersTabPage
+      // 
+      this.parametersTabPage.Controls.Add(this.solverParametersView);
+      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(668, 361);
+      this.parametersTabPage.TabIndex = 0;
+      this.parametersTabPage.Text = "Parameters";
+      this.parametersTabPage.UseVisualStyleBackColor = true;
       // 
       // solverParametersView
@@ -469,27 +528,40 @@
       this.solverParametersView.Content = null;
       this.solverParametersView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.solverParametersView.Location = new System.Drawing.Point(0, 0);
+      this.solverParametersView.Location = new System.Drawing.Point(3, 3);
       this.solverParametersView.Name = "solverParametersView";
       this.solverParametersView.ReadOnly = true;
-      this.solverParametersView.ShowDetails = false;
-      this.solverParametersView.Size = new System.Drawing.Size(300, 392);
+      this.solverParametersView.ShowDetails = true;
+      this.solverParametersView.Size = new System.Drawing.Size(662, 355);
       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;
+      // operatorGraphTabPage
+      // 
+      this.operatorGraphTabPage.Controls.Add(this.operatorGraphViewHost);
+      this.operatorGraphTabPage.Location = new System.Drawing.Point(4, 22);
+      this.operatorGraphTabPage.Name = "operatorGraphTabPage";
+      this.operatorGraphTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.operatorGraphTabPage.Size = new System.Drawing.Size(668, 361);
+      this.operatorGraphTabPage.TabIndex = 3;
+      this.operatorGraphTabPage.Text = "Operator Graph";
+      this.operatorGraphTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorGraphViewHost
+      // 
+      this.operatorGraphViewHost.Caption = "View";
+      this.operatorGraphViewHost.Content = null;
+      this.operatorGraphViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorGraphViewHost.Enabled = false;
+      this.operatorGraphViewHost.Location = new System.Drawing.Point(3, 3);
+      this.operatorGraphViewHost.Name = "operatorGraphViewHost";
+      this.operatorGraphViewHost.ReadOnly = true;
+      this.operatorGraphViewHost.Size = new System.Drawing.Size(662, 355);
+      this.operatorGraphViewHost.TabIndex = 0;
+      this.operatorGraphViewHost.ViewsLabelVisible = true;
+      this.operatorGraphViewHost.ViewType = null;
       // 
       // 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.Location = new System.Drawing.Point(648, 58);
       this.algorithmCloneButton.Name = "algorithmCloneButton";
       this.algorithmCloneButton.Size = new System.Drawing.Size(26, 23);
@@ -502,5 +574,5 @@
       // 
       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.Location = new System.Drawing.Point(616, 58);
       this.algorithmStartButton.Name = "algorithmStartButton";
       this.algorithmStartButton.Size = new System.Drawing.Size(26, 23);
@@ -510,8 +582,17 @@
       this.algorithmStartButton.Click += new System.EventHandler(this.AlgorithmStartButtonOnClick);
       // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(5, 36);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(91, 13);
+      this.label1.TabIndex = 1;
+      this.label1.Text = "Seeding Strategy:";
+      // 
       // algorithmSuggestionLabel
       // 
       this.algorithmSuggestionLabel.AutoSize = true;
-      this.algorithmSuggestionLabel.Location = new System.Drawing.Point(6, 9);
+      this.algorithmSuggestionLabel.Location = new System.Drawing.Point(5, 62);
       this.algorithmSuggestionLabel.Name = "algorithmSuggestionLabel";
       this.algorithmSuggestionLabel.Size = new System.Drawing.Size(99, 13);
@@ -525,5 +606,5 @@
       this.suggestedInstancesComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.suggestedInstancesComboBox.FormattingEnabled = true;
-      this.suggestedInstancesComboBox.Location = new System.Drawing.Point(111, 6);
+      this.suggestedInstancesComboBox.Location = new System.Drawing.Point(110, 59);
       this.suggestedInstancesComboBox.Name = "suggestedInstancesComboBox";
       this.suggestedInstancesComboBox.Size = new System.Drawing.Size(500, 21);
@@ -537,5 +618,5 @@
       this.runsTabPage.Name = "runsTabPage";
       this.runsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.runsTabPage.Size = new System.Drawing.Size(681, 428);
+      this.runsTabPage.Size = new System.Drawing.Size(681, 477);
       this.runsTabPage.TabIndex = 3;
       this.runsTabPage.Text = "Runs";
@@ -550,5 +631,5 @@
       this.runsView.Name = "runsView";
       this.runsView.ReadOnly = false;
-      this.runsView.Size = new System.Drawing.Size(675, 422);
+      this.runsView.Size = new System.Drawing.Size(675, 471);
       this.runsView.TabIndex = 1;
       // 
@@ -559,5 +640,5 @@
       this.okbTabPage.Name = "okbTabPage";
       this.okbTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.okbTabPage.Size = new System.Drawing.Size(681, 428);
+      this.okbTabPage.Size = new System.Drawing.Size(681, 477);
       this.okbTabPage.TabIndex = 5;
       this.okbTabPage.Text = "Knowledge Base";
@@ -573,5 +654,5 @@
       this.kbViewHost.Name = "kbViewHost";
       this.kbViewHost.ReadOnly = true;
-      this.kbViewHost.Size = new System.Drawing.Size(675, 422);
+      this.kbViewHost.Size = new System.Drawing.Size(675, 471);
       this.kbViewHost.TabIndex = 3;
       this.kbViewHost.ViewsLabelVisible = true;
@@ -587,5 +668,5 @@
       this.problemInstancesTabPage.Name = "problemInstancesTabPage";
       this.problemInstancesTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.problemInstancesTabPage.Size = new System.Drawing.Size(681, 428);
+      this.problemInstancesTabPage.Size = new System.Drawing.Size(681, 477);
       this.problemInstancesTabPage.TabIndex = 6;
       this.problemInstancesTabPage.Text = "Problem Instances";
@@ -622,5 +703,5 @@
       this.problemInstancesTabControl.Name = "problemInstancesTabControl";
       this.problemInstancesTabControl.SelectedIndex = 0;
-      this.problemInstancesTabControl.Size = new System.Drawing.Size(675, 390);
+      this.problemInstancesTabControl.Size = new System.Drawing.Size(675, 439);
       this.problemInstancesTabControl.TabIndex = 4;
       // 
@@ -631,5 +712,5 @@
       this.instancesTabPage.Name = "instancesTabPage";
       this.instancesTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.instancesTabPage.Size = new System.Drawing.Size(667, 364);
+      this.instancesTabPage.Size = new System.Drawing.Size(667, 413);
       this.instancesTabPage.TabIndex = 0;
       this.instancesTabPage.Text = "Instances";
@@ -645,5 +726,5 @@
       this.problemInstancesView.Name = "problemInstancesView";
       this.problemInstancesView.ReadOnly = false;
-      this.problemInstancesView.Size = new System.Drawing.Size(661, 358);
+      this.problemInstancesView.Size = new System.Drawing.Size(661, 407);
       this.problemInstancesView.TabIndex = 0;
       this.problemInstancesView.ViewsLabelVisible = true;
@@ -656,5 +737,5 @@
       this.mapTabPage.Name = "mapTabPage";
       this.mapTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.mapTabPage.Size = new System.Drawing.Size(667, 364);
+      this.mapTabPage.Size = new System.Drawing.Size(667, 413);
       this.mapTabPage.TabIndex = 1;
       this.mapTabPage.Text = "Map";
@@ -676,19 +757,19 @@
       this.instanceMapChart.Location = new System.Drawing.Point(3, 3);
       this.instanceMapChart.Name = "instanceMapChart";
-      series2.ChartArea = "Default";
-      series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
-      series2.Legend = "Legend";
-      series2.MarkerSize = 10;
-      series2.Name = "InstancesSeries";
       series3.ChartArea = "Default";
       series3.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
       series3.Legend = "Legend";
-      series3.MarkerColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))));
-      series3.MarkerSize = 15;
-      series3.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Cross;
-      series3.Name = "CurrentInstanceSeries";
-      this.instanceMapChart.Series.Add(series2);
+      series3.MarkerSize = 10;
+      series3.Name = "InstancesSeries";
+      series4.ChartArea = "Default";
+      series4.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
+      series4.Legend = "Legend";
+      series4.MarkerColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))));
+      series4.MarkerSize = 15;
+      series4.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Cross;
+      series4.Name = "CurrentInstanceSeries";
       this.instanceMapChart.Series.Add(series3);
-      this.instanceMapChart.Size = new System.Drawing.Size(661, 358);
+      this.instanceMapChart.Series.Add(series4);
+      this.instanceMapChart.Size = new System.Drawing.Size(661, 407);
       this.instanceMapChart.TabIndex = 0;
       // 
@@ -708,7 +789,7 @@
             | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
-      this.progressPanel.Location = new System.Drawing.Point(0, 81);
+      this.progressPanel.Location = new System.Drawing.Point(0, 32);
       this.progressPanel.Name = "progressPanel";
-      this.progressPanel.Size = new System.Drawing.Size(692, 454);
+      this.progressPanel.Size = new System.Drawing.Size(692, 503);
       this.progressPanel.TabIndex = 2;
       this.progressPanel.Visible = false;
@@ -718,7 +799,7 @@
       this.okbDownloadButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
-      this.okbDownloadButton.Location = new System.Drawing.Point(6, 52);
+      this.okbDownloadButton.Location = new System.Drawing.Point(3, 3);
       this.okbDownloadButton.Name = "okbDownloadButton";
-      this.okbDownloadButton.Size = new System.Drawing.Size(661, 23);
+      this.okbDownloadButton.Size = new System.Drawing.Size(686, 23);
       this.okbDownloadButton.TabIndex = 1;
       this.okbDownloadButton.Text = "Download from OKB";
@@ -733,17 +814,4 @@
       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
       // 
@@ -751,18 +819,7 @@
       this.Controls.Add(this.okbDownloadButton);
       this.Controls.Add(this.tabControl);
-      this.Controls.Add(this.evaluationsLimitabel);
-      this.Controls.Add(this.maxEvaluationsTextBox);
       this.Controls.Add(this.progressPanel);
       this.Name = "ExpertSystemView";
       this.Size = new System.Drawing.Size(692, 535);
-      this.Controls.SetChildIndex(this.progressPanel, 0);
-      this.Controls.SetChildIndex(this.maxEvaluationsTextBox, 0);
-      this.Controls.SetChildIndex(this.evaluationsLimitabel, 0);
-      this.Controls.SetChildIndex(this.tabControl, 0);
-      this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.okbDownloadButton, 0);
-      this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.infoLabel, 0);
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       this.tabControl.ResumeLayout(false);
       this.problemTabPage.ResumeLayout(false);
@@ -770,17 +827,17 @@
       this.solutionsTabPage.PerformLayout();
       this.solutionsTabControl.ResumeLayout(false);
-      this.solutionsSeedingTabPage.ResumeLayout(false);
       this.solutionsQualityTabPage.ResumeLayout(false);
+      this.solutionsLengthScaleTabPage.ResumeLayout(false);
       this.solutionsDiversityTabPage.ResumeLayout(false);
       this.solutionsFdcTabPage.ResumeLayout(false);
-      this.solutionsLengthScaleTabPage.ResumeLayout(false);
+      this.solutionsFdcTabPage.PerformLayout();
       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.solverTabControl.ResumeLayout(false);
+      this.resultsTabPage.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.operatorGraphTabPage.ResumeLayout(false);
       this.runsTabPage.ResumeLayout(false);
       this.okbTabPage.ResumeLayout(false);
@@ -792,5 +849,4 @@
       ((System.ComponentModel.ISupportInitialize)(this.instanceMapChart)).EndInit();
       this.ResumeLayout(false);
-      this.PerformLayout();
 
     }
@@ -838,11 +894,17 @@
     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;
+    private MainForm.WindowsForms.DragOverTabControl solverTabControl;
+    private System.Windows.Forms.TabPage resultsTabPage;
+    private Optimization.Views.ResultCollectionView solverResultsView;
+    private System.Windows.Forms.TabPage solutionSeedingTabPage;
+    private System.Windows.Forms.TabPage parametersTabPage;
+    private Core.Views.ParameterCollectionView solverParametersView;
+    private System.Windows.Forms.Panel seedingStrategyPanel;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TabPage operatorGraphTabPage;
+    private MainForm.WindowsForms.ViewHost operatorGraphViewHost;
+    private System.Windows.Forms.CheckBox fdcBetweenBestCheckBox;
   }
 }
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.cs	(revision 13713)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.cs	(revision 13718)
@@ -40,10 +40,9 @@
 using System.Windows.Forms;
 using System.Windows.Forms.DataVisualization.Charting;
-using DoubleValue = HeuristicLab.Data.DoubleValue;
 
 namespace HeuristicLab.OptimizationExpertSystem {
-  [View("Expert-system Optimizer View")]
+  [View("Knowledge Center (all-in-one view)")]
   [Content(typeof(ExpertSystem), IsDefaultView = true)]
-  public partial class ExpertSystemView : NamedItemView {
+  public partial class ExpertSystemView : ItemView {
     private EnumValueView<SeedingStrategyTypes> seedingStrategyView;
     private CheckedItemListView<IScope> seedingSolutionsView;
@@ -72,8 +71,6 @@
         Dock = DockStyle.Fill
       };
-      solutionsSeedingTableLayoutPanel.SuspendLayout();
-      solutionsSeedingTableLayoutPanel.Controls.Add(seedingStrategyView, 0, 0);
-      solutionsSeedingTableLayoutPanel.Controls.Add(seedingSolutionsView, 0, 1);
-      solutionsSeedingTableLayoutPanel.ResumeLayout(true);
+      seedingStrategyPanel.Controls.Add(seedingStrategyView);
+      solutionSeedingTabPage.Controls.Add(seedingSolutionsView);
     }
 
@@ -86,4 +83,9 @@
       Content.SuggestedInstances.ItemsRemoved -= SuggestedInstancesOnChanged;
       Content.SuggestedInstances.ItemsReplaced -= SuggestedInstancesOnChanged;
+      Content.SolutionSeedingPool.CollectionReset -= SeedingPoolOnChanged;
+      Content.SolutionSeedingPool.ItemsAdded -= SeedingPoolOnChanged;
+      Content.SolutionSeedingPool.ItemsRemoved -= SeedingPoolOnChanged;
+      Content.SolutionSeedingPool.ItemsReplaced -= SeedingPoolOnChanged;
+      Content.SolutionSeedingPool.CheckedItemsChanged -= SeedingPoolOnChanged;
       DeregisterProblemEvents(Content.Problem);
       base.DeregisterContentEvents();
@@ -98,4 +100,9 @@
       Content.SuggestedInstances.ItemsRemoved += SuggestedInstancesOnChanged;
       Content.SuggestedInstances.ItemsReplaced += SuggestedInstancesOnChanged;
+      Content.SolutionSeedingPool.CollectionReset += SeedingPoolOnChanged;
+      Content.SolutionSeedingPool.ItemsAdded += SeedingPoolOnChanged;
+      Content.SolutionSeedingPool.ItemsRemoved += SeedingPoolOnChanged;
+      Content.SolutionSeedingPool.ItemsReplaced += SeedingPoolOnChanged;
+      Content.SolutionSeedingPool.CheckedItemsChanged += SeedingPoolOnChanged;
       RegisterProblemEvents(Content.Problem);
     }
@@ -201,4 +208,8 @@
     }
 
+    private void SeedingPoolOnChanged(object sender, EventArgs e) {
+      UpdateSolutionVisualization();
+    }
+
     private void SolutionsOnChanged(object sender, EventArgs e) {
       UpdateNamesComboboxes();
@@ -217,9 +228,9 @@
       if (!int.TryParse(maxEvaluationsTextBox.Text, out value)) {
         e.Cancel = !maxEvaluationsTextBox.ReadOnly && maxEvaluationsTextBox.Enabled;
-        errorProvider.SetError(maxEvaluationsTextBox, "Please enter a valid integer number.");
+        //errorProvider.SetError(maxEvaluationsTextBox, "Please enter a valid integer number.");
       } else {
         Content.MaximumEvaluations = value;
         e.Cancel = false;
-        errorProvider.SetError(maxEvaluationsTextBox, null);
+        //errorProvider.SetError(maxEvaluationsTextBox, null);
       }
     }
@@ -299,6 +310,13 @@
       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;
+        var alg = Content.SuggestedInstances[suggestedInstancesComboBox.SelectedIndex];
+        solverParametersView.Content = alg.Parameters;
+        var engineAlg = alg as EngineAlgorithm;
+        if (engineAlg != null) operatorGraphViewHost.Content = engineAlg.OperatorGraph;
+        else operatorGraphViewHost.Content = new Data.StringValue("Algorithm is not modeled as an operator graph.");
+      } else {
+        solverParametersView.Content = null;
+        operatorGraphViewHost.Content = null;
+      }
       SetEnabledStateOfControls();
     }
@@ -312,7 +330,22 @@
       }
       UpdateSolutionDiversityAnalysis(calculator);
-      UpdateSolutionFdcAnalysis(calculator);
+      UpdateSolutionFdcAnalysis(calculator, fdcBetweenBestCheckBox.Checked);
       UpdateSolutionLengthScaleAnalysis(calculator);
       UpdateSolutionNetworkAnalysis(calculator);
+    }
+
+    private void FdcBetweenBestCheckBoxOnCheckedChanged(object sender, EventArgs e) {
+      if (InvokeRequired) { Invoke((Action<object, EventArgs>)FdcBetweenBestCheckBoxOnCheckedChanged, sender, e); return; }
+      UpdateSolutionFdcAnalysis((ISolutionSimilarityCalculator)similarityComboBox.SelectedItem, fdcBetweenBestCheckBox.Checked);
+    }
+
+    private void SolutionsNetworkChartOnMouseClick(object sender, MouseEventArgs e) {
+      var result = solutionsNetworkChart.HitTest(e.X, e.Y);
+      if (result.ChartElementType == ChartElementType.DataPoint) {
+        var point = (DataPoint)result.Object;
+        var solutionScope = point.Tag as IScope;
+        if (solutionScope == null || !Content.SolutionSeedingPool.Contains(solutionScope)) return;
+        Content.SolutionSeedingPool.SetItemCheckedState(solutionScope, !Content.SolutionSeedingPool.ItemChecked(solutionScope));
+      }
     }
     #endregion
@@ -386,5 +419,5 @@
         var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem;
         UpdateSolutionDiversityAnalysis(calculator);
-        UpdateSolutionFdcAnalysis(calculator);
+        UpdateSolutionFdcAnalysis(calculator, fdcBetweenBestCheckBox.Checked);
         UpdateSolutionLengthScaleAnalysis(calculator);
         UpdateSolutionNetworkAnalysis(calculator);
@@ -403,5 +436,5 @@
         solutionsQualityViewHost.Content = dt;
       }
-      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));
+      QualityDistributionAnalyzer.UpdateTable(dt, GetSolutionScopes().Select(x => GetQuality(x, qualityName) ?? double.NaN).Where(x => !double.IsNaN(x)));
     }
 
@@ -409,8 +442,9 @@
       try {
         solutionsDiversityViewHost.Content = null;
-        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 solutionScopes = GetSolutionScopes();
+        var similarities = new double[solutionScopes.Count, solutionScopes.Count];
+        for (var i = 0; i < solutionScopes.Count; i++) {
+          for (var j = 0; j < solutionScopes.Count; j++)
+            similarities[i, j] = calculator.CalculateSolutionSimilarity(solutionScopes[i], solutionScopes[j]);
         }
         var hm = new HeatMap(similarities, "Solution Similarities", 0.0, 1.0);
@@ -419,14 +453,28 @@
     }
 
-    private void UpdateSolutionFdcAnalysis(ISolutionSimilarityCalculator calculator) {
+    private void UpdateSolutionFdcAnalysis(ISolutionSimilarityCalculator calculator, bool distanceToBest) {
       try {
         solutionsFdcViewHost.Content = null;
+        var solutionScopes = GetSolutionScopes();
         var points = new List<Point2D<double>>();
-        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)((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)));
+        if (distanceToBest) {
+          var maximization = ((IValueParameter<Data.BoolValue>)Content.Problem.MaximizationParameter).Value.Value;
+          var bestSolutions = (maximization ? solutionScopes.MaxItems(x => GetQuality(x, calculator.QualityVariableName) ?? double.NegativeInfinity)
+                                            : solutionScopes.MinItems(x => GetQuality(x, calculator.QualityVariableName) ?? double.PositiveInfinity)).ToList();
+          foreach (var solScope in solutionScopes.Except(bestSolutions)) {
+            var maxSimilarity = bestSolutions.Max(x => calculator.CalculateSolutionSimilarity(solScope, x));
+            var qDiff = (GetQuality(solScope, calculator.QualityVariableName) ?? double.NaN)
+                      - (GetQuality(bestSolutions[0], calculator.QualityVariableName) ?? double.NaN);
+            points.Add(new Point2D<double>(Math.Abs(qDiff), 1.0 - maxSimilarity));
+          }
+        } else {
+          for (int i = 0; i < solutionScopes.Count; i++) {
+            for (int j = 0; j < solutionScopes.Count; j++) {
+              if (i == j) continue;
+              var qDiff = (GetQuality(solutionScopes[i], calculator.QualityVariableName) ?? double.NaN)
+                          - (GetQuality(solutionScopes[j], calculator.QualityVariableName) ?? double.NaN);
+              if (double.IsNaN(qDiff)) continue;
+              points.Add(new Point2D<double>(Math.Abs(qDiff), 1.0 - calculator.CalculateSolutionSimilarity(solutionScopes[i], solutionScopes[j])));
+            }
           }
         }
@@ -434,7 +482,10 @@
         splot.VisualProperties.XAxisTitle = "Absolute Fitness Difference";
         splot.VisualProperties.XAxisMinimumFixedValue = 0.0;
+        splot.VisualProperties.XAxisMinimumAuto = false;
         splot.VisualProperties.YAxisTitle = "Solution Distance";
         splot.VisualProperties.YAxisMinimumFixedValue = 0.0;
+        splot.VisualProperties.YAxisMinimumAuto = false;
         splot.VisualProperties.YAxisMaximumFixedValue = 1.0;
+        splot.VisualProperties.YAxisMaximumAuto = false;
         var row = new ScatterPlotDataRow("Fdc", "", points);
         row.VisualProperties.PointSize = 7;
@@ -452,18 +503,20 @@
           solutionsLengthScaleViewHost.Content = dt;
         }
-
         QualityDistributionAnalyzer.UpdateTable(dt, CalculateLengthScale(calculator));
-      } catch { }
+      } catch {
+        solutionsLengthScaleViewHost.Content = null;
+      }
     }
 
     private IEnumerable<double> CalculateLengthScale(ISolutionSimilarityCalculator calculator) {
-      for (int i = 0; i < Content.Problem.Solutions.Count; i++) {
-        for (int j = 0; j < Content.Problem.Solutions.Count; j++) {
+      var solutionScopes = GetSolutionScopes();
+      for (var i = 0; i < solutionScopes.Count; i++) {
+        for (var j = 0; j < solutionScopes.Count; j++) {
           if (i == j) continue;
-          var sim = calculator.CalculateSolutionSimilarity((IScope)Content.Problem.Solutions[i].Solution, (IScope)Content.Problem.Solutions[j].Solution);
+          var sim = calculator.CalculateSolutionSimilarity(solutionScopes[i], solutionScopes[j]);
           if (sim.IsAlmost(0)) continue;
-          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;
+          var qDiff = (GetQuality(solutionScopes[i], calculator.QualityVariableName) ?? double.NaN)
+                    - (GetQuality(solutionScopes[j], calculator.QualityVariableName) ?? double.NaN);
+          if (!double.IsNaN(qDiff)) yield return Math.Abs(qDiff) / sim;
         }
       }
@@ -471,28 +524,51 @@
 
     private void UpdateSolutionNetworkAnalysis(ISolutionSimilarityCalculator calculator) {
+      var series = solutionsNetworkChart.Series["SolutionSeries"];
+      var seedingSeries = solutionsNetworkChart.Series["SeedingSolutionSeries"];
       try {
-        var series = solutionsNetworkChart.Series["SolutionSeries"];
         series.Points.Clear();
-        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++) {
+        seedingSeries.Points.Clear();
+        var solutionScopes = GetSolutionScopes();
+        var dissimilarities = new DoubleMatrix(solutionScopes.Count, solutionScopes.Count);
+        for (var i = 0; i < solutionScopes.Count; i++) {
+          for (var j = 0; j < solutionScopes.Count; j++) {
             if (i == j) continue;
-            dissimilarities[i, j] = 1.0 - calculator.CalculateSolutionSimilarity((IScope)Content.Problem.Solutions[i].Solution, (IScope)Content.Problem.Solutions[j].Solution);
+            dissimilarities[i, j] = 1.0 - calculator.CalculateSolutionSimilarity(solutionScopes[i], solutionScopes[j]);
           }
         }
         var coords = MultidimensionalScaling.KruskalShepard(dissimilarities);
         for (var i = 0; i < coords.Rows; i++) {
-          var quality = ((DoubleValue)((IScope)Content.Problem.Solutions[i].Solution).Variables[calculator.QualityVariableName].Value).Value;
-          series.Points.Add(new DataPoint() {
+          var quality = GetQuality(solutionScopes[i], calculator.QualityVariableName) ?? double.NaN;
+          var dataPoint = new DataPoint() {
             Name = (i + 1).ToString(),
             XValue = coords[i, 0],
-            YValues = new[] { coords[i, 1], quality },
-            Label = i + ": " + quality
-          });
-        }
-      } catch { }
-    }
-    #endregion
-    #endregion
+            YValues = new[] {coords[i, 1], quality},
+            Label = i + ": " + quality,
+            Tag = solutionScopes[i]
+          };
+          if (Content.SolutionSeedingPool.Contains(solutionScopes[i]) && Content.SolutionSeedingPool.ItemChecked(solutionScopes[i]))
+            seedingSeries.Points.Add(dataPoint);
+          else series.Points.Add(dataPoint);
+        }
+      } catch {
+        // problems in calculating the similarity
+        series.Points.Clear();
+        seedingSeries.Points.Clear();
+      }
+    }
+    #endregion
+    #endregion
+
+    private List<IScope> GetSolutionScopes() {
+      return Content.Problem.Solutions.Select(x => x.Solution).OfType<IScope>().ToList();
+    } 
+
+    private double? GetQuality(IScope scope, string qualityName) {
+      IVariable v;
+      if (!scope.Variables.TryGetValue(qualityName, out v)) return null;
+      var dval = v.Value as Data.DoubleValue;
+      if (dval == null) return null;
+      return dval.Value;
+    }
   }
 }
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.resx
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.resx	(revision 13713)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.resx	(revision 13718)
@@ -118,10 +118,4 @@
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>140, 17</value>
-  </metadata>
   <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>230, 17</value>
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/HeuristicLab.OptimizationExpertSystem-3.3.csproj
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/HeuristicLab.OptimizationExpertSystem-3.3.csproj	(revision 13713)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/HeuristicLab.OptimizationExpertSystem-3.3.csproj	(revision 13718)
@@ -83,4 +83,9 @@
       <Private>False</Private>
     </Reference>
+    <Reference Include="HeuristicLab.Clients.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Clients.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Clients.OKB-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
@@ -146,4 +151,9 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Scripting-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Scripting-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
@@ -173,4 +183,16 @@
     </Compile>
     <Compile Include="Interfaces\IOptimizationExpertSystemUi.cs" />
+    <Compile Include="Menu\0_Config\40_AdministerOkbMenuItem.cs" />
+    <Compile Include="Menu\0_Config\30_DownloadFromOkbMenuItem.cs" />
+    <Compile Include="Menu\0_Config\10_SetCredentialsMenuItem.cs" />
+    <Compile Include="Menu\200_Solving\210_SolverMenuItem.cs" />
+    <Compile Include="Menu\300_Learning\310_AlgorithmInstancesMenuItem.cs" />
+    <Compile Include="Menu\900_Tools\910_NewCSharpScriptMenuItem.cs" />
+    <Compile Include="Menu\900_Tools\930_SaveCSharpScriptMenuItem.cs" />
+    <Compile Include="Menu\900_Tools\920_OpenCSharpScriptMenuItem.cs" />
+    <Compile Include="Menu\MenuItemBase.cs" />
+    <Compile Include="Menu\0_Config\20_SetProblemMenuItem.cs" />
+    <Compile Include="Menu\100_Understanding\120_SolutionsMenuItem.cs" />
+    <Compile Include="Menu\100_Understanding\110_ProblemInstanceMenuItem.cs" />
     <Compile Include="OptimizationExpertSystem.cs">
       <SubType>Form</SubType>
@@ -180,4 +202,16 @@
     </Compile>
     <Compile Include="Plugin.cs" />
+    <Compile Include="UnderstandingProblemInstanceView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="UnderstandingProblemInstanceView.Designer.cs">
+      <DependentUpon>UnderstandingProblemInstanceView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\ExpertSystemViewBase.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\ExpertSystemViewBase.Designer.cs">
+      <DependentUpon>ExpertSystemViewBase.cs</DependentUpon>
+    </Compile>
     <None Include="Properties\AssemblyInfo.cs.frame" />
     <Compile Include="Properties\AssemblyInfo.cs" />
@@ -220,4 +254,10 @@
     <EmbeddedResource Include="OptimizationExpertSystem.resx">
       <DependentUpon>OptimizationExpertSystem.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="UnderstandingProblemInstanceView.resx">
+      <DependentUpon>UnderstandingProblemInstanceView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Views\ExpertSystemViewBase.resx">
+      <DependentUpon>ExpertSystemViewBase.cs</DependentUpon>
     </EmbeddedResource>
   </ItemGroup>
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/HeuristicLab.OptimizationExpertSystem-3.3.csproj.user
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/HeuristicLab.OptimizationExpertSystem-3.3.csproj.user	(revision 13713)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/HeuristicLab.OptimizationExpertSystem-3.3.csproj.user	(revision 13718)
@@ -4,5 +4,5 @@
     <StartAction>Program</StartAction>
     <StartProgram>C:\Users\P40311\Work\HL3\trunk\sources\bin\HeuristicLab 3.3.exe</StartProgram>
-    <StartArguments>/start:"Optimizer" /hideStarter</StartArguments>
+    <StartArguments>/start:"Optimization Knowledge Center" /hideStarter</StartArguments>
   </PropertyGroup>
 </Project>
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/0_Config/10_SetCredentialsMenuItem.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/0_Config/10_SetCredentialsMenuItem.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/0_Config/10_SetCredentialsMenuItem.cs	(revision 13718)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Clients.Common;
+using System.Collections.Generic;
+
+namespace HeuristicLab.OptimizationExpertSystem.Menu {
+  internal class SetCredentialsMenuItem : MenuItemBase {
+    public override string Name {
+      get { return "Set Username / Password..."; }
+    }
+    public override IEnumerable<string> Structure {
+      get { return new[] { "Config" }; }
+    }
+    public override int Position {
+      get { return 10; }
+    }
+    public override string ToolTipText {
+      get { return "Set username and password for accessing HeuristicLab services"; }
+    }
+
+    public override void Execute() {
+      using (var dialog = new PasswordDialog()) {
+        dialog.ShowDialog(MainForm);
+      }
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/0_Config/20_SetProblemMenuItem.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/0_Config/20_SetProblemMenuItem.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/0_Config/20_SetProblemMenuItem.cs	(revision 13718)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+
+namespace HeuristicLab.OptimizationExpertSystem.Menu {
+  internal class SetProblemMenuItem : MenuItemBase {
+    public override void Execute() {
+      MainForm.ShowContent(MainForm.ExpertSystem.Problem, true);
+    }
+
+    public override IEnumerable<string> Structure {
+      get { return new[] { "Config" }; }
+    }
+
+    public override string Name {
+      get { return "Problem Instance"; }
+    }
+
+    public override string ToolTipText {
+      get { return "Select the problem instance that you want to solve."; }
+    }
+
+    public override int Position {
+      get { return 20; }
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/0_Config/30_DownloadFromOkbMenuItem.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/0_Config/30_DownloadFromOkbMenuItem.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/0_Config/30_DownloadFromOkbMenuItem.cs	(revision 13718)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+
+namespace HeuristicLab.OptimizationExpertSystem.Menu {
+  internal class DownloadFromOKBMenuItem : MenuItemBase {
+    public override void Execute() {
+      MainForm.ExpertSystem.UpdateKnowledgeBaseAsync();
+    }
+
+    public override IEnumerable<string> Structure {
+      get { return new[] { "Config" }; }
+    }
+
+    public override string Name {
+      get { return "Download from OKB"; }
+    }
+
+    public override int Position {
+      get { return 30; }
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/0_Config/40_AdministerOkbMenuItem.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/0_Config/40_AdministerOkbMenuItem.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/0_Config/40_AdministerOkbMenuItem.cs	(revision 13718)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Clients.OKB;
+using HeuristicLab.Clients.OKB.Administration;
+using HeuristicLab.MainForm;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace HeuristicLab.OptimizationExpertSystem.Menu {
+  internal class AdministerOKBMenuItem : MenuItemBase {
+    public override string Name {
+      get { return "Administer OKB"; }
+    }
+    public override IEnumerable<string> Structure {
+      get { return new[] { "Config" }; }
+    }
+    public override int Position {
+      get { return 40; }
+    }
+
+    public override void Execute() {
+      if (OKBRoles.CheckAdminUserPermissions()) {
+        MainFormManager.MainForm.ShowContent(AdministrationClient.Instance);
+      } else {
+        MessageBox.Show("You don't have the permissions for administrating the OKB.", "Security check failed", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+      }
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/100_Understanding/110_ProblemInstanceMenuItem.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/100_Understanding/110_ProblemInstanceMenuItem.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/100_Understanding/110_ProblemInstanceMenuItem.cs	(revision 13718)
@@ -0,0 +1,45 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.OptimizationExpertSystem.Menu {
+  internal class ProblemInstanceMenuItem : MenuItemBase {
+    public override void Execute() {
+      var view = MainForm.Views.OfType<UnderstandingProblemInstanceView>().FirstOrDefault();
+      if (view != null) view.Show();
+      else MainForm.ShowContent(MainForm.ExpertSystem, typeof(UnderstandingProblemInstanceView));
+    }
+
+    public override IEnumerable<string> Structure {
+      get { return new[] { "Understanding" }; }
+    }
+
+    public override string Name {
+      get { return "Problem Instance"; }
+    }
+
+    public override int Position {
+      get { return 110; }
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/100_Understanding/120_SolutionsMenuItem.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/100_Understanding/120_SolutionsMenuItem.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/100_Understanding/120_SolutionsMenuItem.cs	(revision 13718)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.OptimizationExpertSystem.Menu {
+  internal class SolutionSimilarityMenuItem : MenuItemBase {
+    public override void Execute() {
+      throw new NotImplementedException();
+    }
+
+    public override IEnumerable<string> Structure {
+      get { return new[] { "Understanding" }; }
+    }
+
+    public override string Name {
+      get { return "Solutions"; }
+    }
+
+    public override int Position {
+      get { return 120; }
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/200_Solving/210_SolverMenuItem.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/200_Solving/210_SolverMenuItem.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/200_Solving/210_SolverMenuItem.cs	(revision 13718)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.OptimizationExpertSystem.Menu {
+  internal class SolverMenuItem : MenuItemBase {
+    public override void Execute() {
+      throw new NotImplementedException();
+    }
+
+    public override IEnumerable<string> Structure {
+      get { return new[] { "Solving" }; }
+    }
+
+    public override string Name {
+      get { return "Solver"; }
+    }
+
+    public override int Position {
+      get { return 210; }
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/300_Learning/310_AlgorithmInstancesMenuItem.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/300_Learning/310_AlgorithmInstancesMenuItem.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/300_Learning/310_AlgorithmInstancesMenuItem.cs	(revision 13718)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.OptimizationExpertSystem.Menu {
+  internal class AlgorithmInstancesMenuItem : MenuItemBase {
+    public override void Execute() {
+      throw new NotImplementedException();
+    }
+
+    public override IEnumerable<string> Structure {
+      get { return new[] { "Learning" }; }
+    }
+
+    public override string Name {
+      get { return "Algorithm Instances"; }
+    }
+
+    public override int Position {
+      get { return 310; }
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/900_Tools/910_NewCSharpScriptMenuItem.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/900_Tools/910_NewCSharpScriptMenuItem.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/900_Tools/910_NewCSharpScriptMenuItem.cs	(revision 13718)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Scripting;
+using System.Collections.Generic;
+
+namespace HeuristicLab.OptimizationExpertSystem.Menu {
+  internal class NewCSharpScriptMenuItem : MenuItemBase {
+    #region CodeTemplate
+    private static readonly string CodeTemplate = @"
+// use 'vars' to access variables in the script's variable store (e.g. vars.x = 5)
+// use 'vars[string]' to access variables via runtime strings (e.g. vars[""x""] = 5)
+// use 'vars.Contains(string)' to check if a variable exists
+// use 'vars.Clear()' to remove all variables
+// use 'foreach (KeyValuePair<string, object> v in vars) { ... }' to iterate over all variables
+// use 'variables' to work with IEnumerable<T> extension methods on the script's variable store
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+
+using QueryClient = HeuristicLab.Clients.OKB.Query.QueryClient;
+using RunCreationClient = HeuristicLab.Clients.OKB.RunCreation.RunCreationClient;
+using AdministrationClient = HeuristicLab.Clients.OKB.Administration.AdministrationClient;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Collections;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.OptimizationExpertSystem;
+using HeuristicLab.OptimizationExpertSystem.Common;
+using HeuristicLab.Random;
+
+public class MyScript : HeuristicLab.Scripting.CSharpScriptBase {
+  public ExpertSystem Instance { get { return ((OptimizationExpertSystem)HeuristicLab.MainForm.MainFormManager.MainForm).ExpertSystem; } }
+
+  public override void Main() {
+    // type your code here
+  }
+
+  // implement further classes and methods
+
+}";
+    #endregion
+
+    public override void Execute() {
+      MainForm.ShowContent(new CSharpScript(CodeTemplate));
+    }
+
+    public override IEnumerable<string> Structure {
+      get { return new[] { "Tools", "C# Script" }; }
+    }
+
+    public override string Name {
+      get { return "New"; }
+    }
+
+    public override int Position {
+      get { return 910; }
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/900_Tools/920_OpenCSharpScriptMenuItem.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/900_Tools/920_OpenCSharpScriptMenuItem.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/900_Tools/920_OpenCSharpScriptMenuItem.cs	(revision 13718)
@@ -0,0 +1,51 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Scripting;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace HeuristicLab.OptimizationExpertSystem.Menu {
+  internal class OpenCSharpScriptMenuItem : MenuItemBase {
+    public override void Execute() {
+      using (var dialog = new OpenFileDialog()) {
+        dialog.Filter = "HL Files|*.hl|All Files|*.*";
+        if (dialog.ShowDialog(MainForm) != DialogResult.OK) return;
+        var script = ContentManager.Load(dialog.FileName) as CSharpScript;
+        if (script != null) MainForm.ShowContent(script);
+        else MessageBox.Show("HL Files is not a C# script.", "Wrong File", MessageBoxButtons.OK, MessageBoxIcon.Error);
+      }
+    }
+
+    public override IEnumerable<string> Structure {
+      get { return new[] { "Tools", "C# Script" }; }
+    }
+
+    public override string Name {
+      get { return "Open"; }
+    }
+
+    public override int Position {
+      get { return 920; }
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/900_Tools/930_SaveCSharpScriptMenuItem.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/900_Tools/930_SaveCSharpScriptMenuItem.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/900_Tools/930_SaveCSharpScriptMenuItem.cs	(revision 13718)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.MainForm;
+using HeuristicLab.Scripting;
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace HeuristicLab.OptimizationExpertSystem.Menu {
+  internal class SaveCSharpScriptMenuItem : MenuItemBase {
+    protected override void OnActiveViewChanged(object sender, EventArgs e) {
+      base.OnActiveViewChanged(sender, e);
+      var contentView = MainForm.ActiveView as IContentView;
+      ToolStripItem.Enabled = (contentView != null && contentView.Content is CSharpScript);
+    }
+
+    public override void Execute() {
+      using (var dialog = new SaveFileDialog()) {
+        dialog.Filter = "HL Files|*.hl";
+        if (dialog.ShowDialog(MainForm) != DialogResult.OK) return;
+        ContentManager.Save((CSharpScript)((IContentView)MainForm.ActiveView).Content, dialog.FileName, true);
+      }
+    }
+
+    public override IEnumerable<string> Structure {
+      get { return new[] { "Tools", "C# Script" }; }
+    }
+
+    public override string Name {
+      get { return "Save"; }
+    }
+
+    public override int Position {
+      get { return 930; }
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/MenuItemBase.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/MenuItemBase.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Menu/MenuItemBase.cs	(revision 13718)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.OptimizationExpertSystem.Menu {
+  internal abstract class MenuItemBase : MenuItem, IOptimizationExpertSystemUi {
+    public OptimizationExpertSystem MainForm {
+      get { return (OptimizationExpertSystem)HeuristicLab.MainForm.MainFormManager.MainForm; }
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/OptimizationExpertSystem.Designer.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/OptimizationExpertSystem.Designer.cs	(revision 13713)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/OptimizationExpertSystem.Designer.cs	(revision 13718)
@@ -32,6 +32,6 @@
       this.ClientSize = new System.Drawing.Size(624, 412);
       this.Name = "OptimizationExpertSystem";
-      this.Text = "Optimization Expert System (OES)";
-      this.Title = "Optimization Expert System (OES)";
+      this.Text = "Optimization Knowledge Center (OKC)";
+      this.Title = "Optimization Knowledge Center (OKC)";
       this.Load += new System.EventHandler(this.OptimizationExpertSystem_Load);
       this.ResumeLayout(false);
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Plugin.cs.frame
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Plugin.cs.frame	(revision 13713)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Plugin.cs.frame	(revision 13718)
@@ -43,6 +43,6 @@
   }
 
-  [Application("Optimization Expert System", "HeuristicLab Optimization Expert System 3.3.13.$WCREV$")]
-  internal class HeuristicLabOptimizationExpertSystemApplication : ApplicationBase {
+  [Application("Optimization Knowledge Center", "HeuristicLab Optimization Knowledge Center 3.3.13.$WCREV$")]
+  internal class HeuristicLabOptimizationKnowledgeCenterApplication : ApplicationBase {
     public override void Run(ICommandLineArgument[] args) {
       HeuristicLab.MainForm.WindowsForms.MainForm mainForm = new OptimizationExpertSystem(typeof(IOptimizationExpertSystemUi));
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/UnderstandingProblemInstanceView.Designer.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/UnderstandingProblemInstanceView.Designer.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/UnderstandingProblemInstanceView.Designer.cs	(revision 13718)
@@ -0,0 +1,197 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.OptimizationExpertSystem {
+  partial class UnderstandingProblemInstanceView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+      System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
+      System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
+      System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();
+      this.projectionLabel = new System.Windows.Forms.Label();
+      this.projectionComboBox = new System.Windows.Forms.ComboBox();
+      this.problemInstancesTabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
+      this.mapTabPage = new System.Windows.Forms.TabPage();
+      this.instanceMapChart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
+      this.instancesTabPage = new System.Windows.Forms.TabPage();
+      this.problemInstancesView = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.problemInstancesTabControl.SuspendLayout();
+      this.mapTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.instanceMapChart)).BeginInit();
+      this.instancesTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // projectionLabel
+      // 
+      this.projectionLabel.AutoSize = true;
+      this.projectionLabel.Location = new System.Drawing.Point(6, 9);
+      this.projectionLabel.Name = "projectionLabel";
+      this.projectionLabel.Size = new System.Drawing.Size(57, 13);
+      this.projectionLabel.TabIndex = 10;
+      this.projectionLabel.Text = "Projection:";
+      // 
+      // projectionComboBox
+      // 
+      this.projectionComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.projectionComboBox.FormattingEnabled = true;
+      this.projectionComboBox.Location = new System.Drawing.Point(69, 6);
+      this.projectionComboBox.Name = "projectionComboBox";
+      this.projectionComboBox.Size = new System.Drawing.Size(158, 21);
+      this.projectionComboBox.TabIndex = 9;
+      this.projectionComboBox.SelectedIndexChanged += new System.EventHandler(this.ProjectionComboBoxOnSelectedIndexChanged);
+      // 
+      // 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) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.problemInstancesTabControl.Controls.Add(this.mapTabPage);
+      this.problemInstancesTabControl.Controls.Add(this.instancesTabPage);
+      this.problemInstancesTabControl.Location = new System.Drawing.Point(0, 0);
+      this.problemInstancesTabControl.Name = "problemInstancesTabControl";
+      this.problemInstancesTabControl.SelectedIndex = 0;
+      this.problemInstancesTabControl.Size = new System.Drawing.Size(1000, 760);
+      this.problemInstancesTabControl.TabIndex = 8;
+      // 
+      // mapTabPage
+      // 
+      this.mapTabPage.Controls.Add(this.projectionLabel);
+      this.mapTabPage.Controls.Add(this.instanceMapChart);
+      this.mapTabPage.Controls.Add(this.projectionComboBox);
+      this.mapTabPage.Location = new System.Drawing.Point(4, 22);
+      this.mapTabPage.Name = "mapTabPage";
+      this.mapTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.mapTabPage.Size = new System.Drawing.Size(992, 734);
+      this.mapTabPage.TabIndex = 1;
+      this.mapTabPage.Text = "Map";
+      this.mapTabPage.UseVisualStyleBackColor = true;
+      // 
+      // instanceMapChart
+      // 
+      this.instanceMapChart.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)));
+      chartArea1.AxisX.MajorGrid.LineColor = System.Drawing.Color.LightGray;
+      chartArea1.AxisX.MajorGrid.LineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Dash;
+      chartArea1.AxisY.MajorGrid.LineColor = System.Drawing.Color.LightGray;
+      chartArea1.AxisY.MajorGrid.LineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Dash;
+      chartArea1.Name = "Default";
+      this.instanceMapChart.ChartAreas.Add(chartArea1);
+      legend1.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top;
+      legend1.Enabled = false;
+      legend1.Name = "Legend";
+      this.instanceMapChart.Legends.Add(legend1);
+      this.instanceMapChart.Location = new System.Drawing.Point(3, 33);
+      this.instanceMapChart.Name = "instanceMapChart";
+      series1.ChartArea = "Default";
+      series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
+      series1.Legend = "Legend";
+      series1.MarkerSize = 10;
+      series1.Name = "InstancesSeries";
+      series2.ChartArea = "Default";
+      series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
+      series2.Legend = "Legend";
+      series2.MarkerColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))));
+      series2.MarkerSize = 15;
+      series2.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Cross;
+      series2.Name = "CurrentInstanceSeries";
+      this.instanceMapChart.Series.Add(series1);
+      this.instanceMapChart.Series.Add(series2);
+      this.instanceMapChart.Size = new System.Drawing.Size(986, 698);
+      this.instanceMapChart.TabIndex = 0;
+      // 
+      // instancesTabPage
+      // 
+      this.instancesTabPage.Controls.Add(this.problemInstancesView);
+      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(1044, 757);
+      this.instancesTabPage.TabIndex = 0;
+      this.instancesTabPage.Text = "Instances";
+      this.instancesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // problemInstancesView
+      // 
+      this.problemInstancesView.Caption = "View";
+      this.problemInstancesView.Content = null;
+      this.problemInstancesView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.problemInstancesView.Enabled = false;
+      this.problemInstancesView.Location = new System.Drawing.Point(3, 3);
+      this.problemInstancesView.Name = "problemInstancesView";
+      this.problemInstancesView.ReadOnly = false;
+      this.problemInstancesView.Size = new System.Drawing.Size(1038, 751);
+      this.problemInstancesView.TabIndex = 0;
+      this.problemInstancesView.ViewsLabelVisible = true;
+      this.problemInstancesView.ViewType = null;
+      // 
+      // UnderstandingProblemInstanceView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.problemInstancesTabControl);
+      this.Name = "UnderstandingProblemInstanceView";
+      this.Size = new System.Drawing.Size(1000, 760);
+      this.Controls.SetChildIndex(this.problemInstancesTabControl, 0);
+      this.problemInstancesTabControl.ResumeLayout(false);
+      this.mapTabPage.ResumeLayout(false);
+      this.mapTabPage.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.instanceMapChart)).EndInit();
+      this.instancesTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label projectionLabel;
+    private System.Windows.Forms.ComboBox projectionComboBox;
+    private MainForm.WindowsForms.DragOverTabControl problemInstancesTabControl;
+    private System.Windows.Forms.TabPage mapTabPage;
+    private Visualization.ChartControlsExtensions.EnhancedChart instanceMapChart;
+    private System.Windows.Forms.TabPage instancesTabPage;
+    private MainForm.WindowsForms.ViewHost problemInstancesView;
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/UnderstandingProblemInstanceView.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/UnderstandingProblemInstanceView.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/UnderstandingProblemInstanceView.cs	(revision 13718)
@@ -0,0 +1,133 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Clients.OKB.RunCreation;
+using HeuristicLab.MainForm;
+using HeuristicLab.OptimizationExpertSystem.Common;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Windows.Forms.DataVisualization.Charting;
+
+namespace HeuristicLab.OptimizationExpertSystem {
+  [View("Understanding Problem Instance")]
+  [Content(typeof(ExpertSystem), IsDefaultView = false)]
+  public partial class UnderstandingProblemInstanceView : ExpertSystemViewBase {
+    public UnderstandingProblemInstanceView() {
+      InitializeComponent();
+    }
+
+    #region Register Content Events
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      RegisterProblemEvents(Content.Problem);
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      DeregisterProblemEvents(Content.Problem);
+    }
+
+    private void DeregisterProblemEvents(OKBProblem problem) {
+      if (problem == null) return;
+      problem.ProblemChanged -= ContentOnProblemChanged;
+    }
+
+    private void RegisterProblemEvents(OKBProblem problem) {
+      if (problem == null) return;
+      problem.ProblemChanged += ContentOnProblemChanged;
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        problemInstancesView.Content = null;
+        instanceMapChart.Series["InstancesSeries"].Points.Clear();
+        instanceMapChart.Series["CurrentInstanceSeries"].Points.Clear();
+      } else {
+        problemInstancesView.Content = Content.ProblemInstances;
+        Content.UpdateInstanceProjection();
+        UpdateProjectionComboBox();
+      }
+    }
+
+    private void ContentOnProblemChanged(object sender, EventArgs eventArgs) {
+      SetEnabledStateOfControls();
+    }
+
+    protected override void OnDownloadEnded() {
+      base.OnDownloadEnded();
+      UpdateProjectionComboBox();
+    }
+
+    public IEnumerable<string> GetProjections() {
+      return 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();
+    }
+
+    public void ProjectProblemInstances(Series instancesSeries, Series currentInstanceSeries, string projection) {
+      instancesSeries.Points.Clear();
+      currentInstanceSeries.Points.Clear();
+
+      foreach (var run in Content.ProblemInstances) {
+        var xKey = "Projection." + projection + ".X";
+        var yKey = "Projection." + projection + ".Y";
+        if (!run.Results.ContainsKey(xKey) || !run.Results.ContainsKey(yKey)
+            || !(run.Results[xKey] is Data.DoubleValue) || !(run.Results[yKey] is Data.DoubleValue)) continue;
+        var x = ((Data.DoubleValue)run.Results[xKey]).Value;
+        var y = ((Data.DoubleValue)run.Results[yKey]).Value;
+        var dataPoint = new DataPoint(x, y) {
+          Label = run.Name
+        };
+        instancesSeries.Points.Add(dataPoint);
+      }
+
+      var curPoint = Content.ProjectCurrentInstance(projection);
+      if (curPoint != null) {
+        var dp = new DataPoint(curPoint.Item1, curPoint.Item2) {
+          Label = Content.Problem.Problem.Name
+        };
+        currentInstanceSeries.Points.Add(dp);
+      }
+    }
+
+    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;
+      var instancesSeries = instanceMapChart.Series["InstancesSeries"];
+      var currentInstanceSeries = instanceMapChart.Series["CurrentInstanceSeries"];
+
+      ProjectProblemInstances(instancesSeries, currentInstanceSeries, projection);
+    }
+
+    private void UpdateProjectionComboBox() {
+      projectionComboBox.Items.Clear();
+      foreach (var str in GetProjections()) {
+        projectionComboBox.Items.Add(str);
+      }
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/UnderstandingProblemInstanceView.resx
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/UnderstandingProblemInstanceView.resx	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/UnderstandingProblemInstanceView.resx	(revision 13718)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/ExpertSystemViewBase.Designer.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/ExpertSystemViewBase.Designer.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/ExpertSystemViewBase.Designer.cs	(revision 13718)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.OptimizationExpertSystem {
+  partial class ExpertSystemViewBase {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.SuspendLayout();
+      // 
+      // ExpertSystemViewBase
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "ExpertSystemViewBase";
+      this.Size = new System.Drawing.Size(700, 380);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/ExpertSystemViewBase.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/ExpertSystemViewBase.cs	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/ExpertSystemViewBase.cs	(revision 13718)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.OptimizationExpertSystem.Common;
+using System;
+
+namespace HeuristicLab.OptimizationExpertSystem {
+  [View("Expert-System View")]
+  public partial class ExpertSystemViewBase : ItemView {
+    public OptimizationExpertSystem MainForm {
+      get { return (OptimizationExpertSystem)HeuristicLab.MainForm.MainFormManager.MainForm; }
+    }
+
+    public new ExpertSystem Content {
+      get { return (ExpertSystem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    protected ExpertSystemViewBase() {
+      InitializeComponent();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.DownloadStarted += ContentOnDownloadStarted;
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.DownloadStarted -= ContentOnDownloadStarted;
+    }
+
+    protected virtual void OnDownloadStarted() { }
+    protected virtual void OnDownloadEnded() { }
+
+    private void ContentOnDownloadStarted(object sender, EventArgs<IProgress> e) {
+      if (InvokeRequired) { Invoke((Action<object, EventArgs<IProgress>>)ContentOnDownloadStarted, sender, e); return; }
+      MainForm.AddOperationProgressToView(this, e.Value);
+      e.Value.ProgressStateChanged += ProgressOnStateChanged;
+      OnDownloadStarted();
+    }
+
+    private void ProgressOnStateChanged(object sender, EventArgs e) {
+      if (InvokeRequired) { Invoke((Action<object, EventArgs>)ProgressOnStateChanged, sender, e); return; }
+      var progress = (IProgress)sender;
+      if (progress == null || progress.ProgressState == ProgressState.Started) return;
+      OnDownloadEnded();
+    }
+  }
+}
Index: branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/ExpertSystemViewBase.resx
===================================================================
--- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/ExpertSystemViewBase.resx	(revision 13718)
+++ branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/ExpertSystemViewBase.resx	(revision 13718)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
