Index: /trunk/sources/HeuristicLab.ES/3.2/ES.cs
===================================================================
--- /trunk/sources/HeuristicLab.ES/3.2/ES.cs	(revision 2051)
+++ /trunk/sources/HeuristicLab.ES/3.2/ES.cs	(revision 2052)
@@ -30,4 +30,5 @@
 using HeuristicLab.Selection;
 using HeuristicLab.RealVector;
+using HeuristicLab.Evolutionary;
 
 namespace HeuristicLab.ES {
@@ -36,4 +37,5 @@
   /// </summary>
   public class ES : ItemBase, IEditable {
+
     #region Create Operators
     /// <summary>
@@ -64,7 +66,9 @@
       // place holder for ProblemInjector
       EmptyOperator eo1 = new EmptyOperator();
-      eo1.Name = "ProblemInjector";
+      eo1.Name = "Empty Problem"; // was ProblemInjector
       op.OperatorGraph.AddOperator(eo1);
       co1.AddSubOperator(eo1);
+      co1.AddVariableInfo(new VariableInfo("ProblemInjector", "", typeof(IOperator), VariableKind.In));
+      co1.GetVariableInfo("ProblemInjector").ActualName = "Empty Problem";
 
       CombinedOperator co2 = CreatePopulationInitialization();
@@ -75,13 +79,17 @@
       // place holder for SolutionGenerator
       EmptyOperator eo2 = new EmptyOperator();
-      eo2.Name = "SolutionGenerator";
+      eo2.Name = "Empty Solution"; // was SolutionGenerator
       op.OperatorGraph.AddOperator(eo2);
       co2.AddSubOperator(eo2);
+      co2.AddVariableInfo(new VariableInfo("SolutionGenerator", "", typeof(IOperator), VariableKind.In));
+      co2.GetVariableInfo("SolutionGenerator").ActualName = "Empty Solution";
 
       // place holder for Evaluator
       EmptyOperator eo3 = new EmptyOperator();
-      eo3.Name = "Evaluator";
+      eo3.Name = "Empty Evaluation"; // was Evaluator
       op.OperatorGraph.AddOperator(eo3);
       co2.AddSubOperator(eo3);
+      co2.AddVariableInfo(new VariableInfo("Evaluator", "", typeof(IOperator), VariableKind.In));
+      co2.GetVariableInfo("Evaluator").ActualName = "Empty Evaluation";
 
       CombinedOperator co3 = CreateESMain();
@@ -92,16 +100,22 @@
       // place holder for Mutator
       EmptyOperator eo4 = new EmptyOperator();
-      eo4.Name = "Mutator";
+      eo4.Name = "No Mutation"; // was Mutator
       op.OperatorGraph.AddOperator(eo4);
       co3.AddSubOperator(eo4);
+      co3.AddVariableInfo(new VariableInfo("Mutator", "", typeof(IOperator), VariableKind.In));
+      co3.GetVariableInfo("Mutator").ActualName = "No Mutation";
 
       // place holder for Evaluator
       co3.AddSubOperator(eo3);
+      co3.AddVariableInfo(new VariableInfo("Evaluator", "", typeof(IOperator), VariableKind.In));
+      co3.GetVariableInfo("Evaluator").ActualName = "Empty Evaluation";
 
       // place holder for Recombinator
       EmptyOperator eo5 = new EmptyOperator();
-      eo5.Name = "Recombinator";
+      eo5.Name = "No Recombination"; // was Recombinator
       op.OperatorGraph.AddOperator(eo5);
       co3.AddSubOperator(eo5);
+      co3.AddVariableInfo(new VariableInfo("Recombinator", "", typeof(IOperator), VariableKind.In));
+      co3.GetVariableInfo("Recombinator").ActualName = "No Recombination";
 
       return op;
@@ -289,17 +303,50 @@
       op.OperatorGraph.InitialOperator = sp1;
 
+      GreaterThanComparator gtc = new GreaterThanComparator();
+      gtc.GetVariableInfo("LeftSide").ActualName = "ESrho";
+      gtc.GetVariableInfo("RightSide").Local = true;
+      gtc.AddVariable(new Variable("RightSide", new IntData(1)));
+      gtc.GetVariableInfo("Result").ActualName = "UseRecombination";
+      op.OperatorGraph.AddOperator(gtc);
+      sp1.AddSubOperator(gtc);
+
+      ConditionalBranch cb = new ConditionalBranch();
+      cb.Name = "Use recombination?";
+      cb.GetVariableInfo("Condition").ActualName = "UseRecombination";
+      op.OperatorGraph.AddOperator(cb);
+      sp1.AddSubOperator(cb);
+
+      SequentialProcessor sp2 = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp2);
+      cb.AddSubOperator(sp2);
+
+      ChildrenInitializer ci = new ChildrenInitializer();
+      ci.GetVariableInfo("ParentsPerChild").Local = false;
+      ci.RemoveVariable("ParentsPerChild");
+      ci.GetVariableInfo("ParentsPerChild").ActualName = "ESrho";
+      op.OperatorGraph.AddOperator(ci);
+      sp2.AddSubOperator(ci);
+
+      UniformSequentialSubScopesProcessor ussp0 = new UniformSequentialSubScopesProcessor();
+      op.OperatorGraph.AddOperator(ussp0);
+      sp2.AddSubOperator(ussp0);
+
+      SequentialProcessor sp3 = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp3);
+      ussp0.AddSubOperator(sp3);
+
       OperatorExtractor oe1 = new OperatorExtractor();
       oe1.Name = "Recombinator";
       oe1.GetVariableInfo("Operator").ActualName = "Recombinator";
       op.OperatorGraph.AddOperator(oe1);
-      sp1.AddSubOperator(oe1);
+      sp3.AddSubOperator(oe1);
 
       UniformSequentialSubScopesProcessor ussp = new UniformSequentialSubScopesProcessor();
       op.OperatorGraph.AddOperator(ussp);
-      sp1.AddSubOperator(ussp);
-
-      SequentialProcessor sp2 = new SequentialProcessor();
-      op.OperatorGraph.AddOperator(sp2);
-      ussp.AddSubOperator(sp2);
+      cb.AddSubOperator(ussp);
+
+      SequentialProcessor sp4 = new SequentialProcessor();
+      op.OperatorGraph.AddOperator(sp4);
+      ussp.AddSubOperator(sp4);
 
       OperatorExtractor oe2 = new OperatorExtractor();
@@ -307,5 +354,5 @@
       oe2.GetVariableInfo("Operator").ActualName = "Mutator";
       op.OperatorGraph.AddOperator(oe2);
-      sp2.AddSubOperator(oe2);
+      sp4.AddSubOperator(oe2);
 
       OperatorExtractor oe3 = new OperatorExtractor();
@@ -313,10 +360,19 @@
       oe3.GetVariableInfo("Operator").ActualName = "Evaluator";
       op.OperatorGraph.AddOperator(oe3);
-      sp2.AddSubOperator(oe3);
+      sp4.AddSubOperator(oe3);
 
       Counter c = new Counter();
       c.GetVariableInfo("Value").ActualName = "EvaluatedSolutions";
       op.OperatorGraph.AddOperator(c);
-      sp2.AddSubOperator(c);
+      sp4.AddSubOperator(c);
+
+      sp3.AddSubOperator(oe2);
+      sp3.AddSubOperator(oe3);
+      sp3.AddSubOperator(c);
+
+      SubScopesRemover ssr = new SubScopesRemover();
+      ssr.GetVariableInfo("SubScopeIndex").Local = true;
+      op.OperatorGraph.AddOperator(ssr);
+      sp3.AddSubOperator(ssr);
 
       Sorter s = new Sorter();
@@ -542,5 +598,5 @@
       get { return myVariableInjection.SubOperators[0]; }
       set {
-        value.Name = "ProblemInjector";
+        myVariableInjection.GetVariableInfo("ProblemInjector").ActualName = value.Name;
         myES.OperatorGraph.RemoveOperator(ProblemInjector.Guid);
         myES.OperatorGraph.AddOperator(value);
@@ -555,5 +611,5 @@
       get { return myPopulationInitialization.SubOperators[0]; }
       set {
-        value.Name = "SolutionGenerator";
+        myPopulationInitialization.GetVariableInfo("SolutionGenerator").ActualName = value.Name;
         myES.OperatorGraph.RemoveOperator(SolutionGenerator.Guid);
         myES.OperatorGraph.AddOperator(value);
@@ -567,5 +623,6 @@
       get { return myPopulationInitialization.SubOperators[1]; }
       set {
-        value.Name = "Evaluator";
+        myPopulationInitialization.GetVariableInfo("Evaluator").ActualName = value.Name;
+        myESMain.GetVariableInfo("Evaluator").ActualName = value.Name;
         myES.OperatorGraph.RemoveOperator(Evaluator.Guid);
         myES.OperatorGraph.AddOperator(value);
@@ -580,5 +637,5 @@
       get { return myESMain.SubOperators[0]; }
       set {
-        value.Name = "Mutator";
+        myESMain.GetVariableInfo("Mutator").ActualName = value.Name;
         myES.OperatorGraph.RemoveOperator(Mutator.Guid);
         myES.OperatorGraph.AddOperator(value);
@@ -592,5 +649,5 @@
       get { return myESMain.SubOperators[2]; }
       set {
-        value.Name = "Recombinator";
+        myESMain.GetVariableInfo("Recombinator").ActualName = value.Name;
         myES.OperatorGraph.RemoveOperator(Recombinator.Guid);
         myES.OperatorGraph.AddOperator(value);
Index: /trunk/sources/HeuristicLab.ES/3.2/ESEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.ES/3.2/ESEditor.Designer.cs	(revision 2051)
+++ /trunk/sources/HeuristicLab.ES/3.2/ESEditor.Designer.cs	(revision 2052)
@@ -65,22 +65,12 @@
       this.commaRadioButton = new System.Windows.Forms.RadioButton();
       this.plusRadioButton = new System.Windows.Forms.RadioButton();
-      this.setRecombinationButton = new System.Windows.Forms.Button();
-      this.viewRecombinationButton = new System.Windows.Forms.Button();
-      this.recombinationTextBox = new System.Windows.Forms.TextBox();
+      this.customizeRecombinationButton = new System.Windows.Forms.Button();
       this.recombinationLabel = new System.Windows.Forms.Label();
       this.rhoTextBox = new System.Windows.Forms.TextBox();
       this.rhoLabel = new System.Windows.Forms.Label();
-      this.setEvaluationButton = new System.Windows.Forms.Button();
-      this.setMutationButton = new System.Windows.Forms.Button();
-      this.setSolutionGenerationButton = new System.Windows.Forms.Button();
-      this.viewEvaluationButton = new System.Windows.Forms.Button();
-      this.viewMutationButton = new System.Windows.Forms.Button();
-      this.viewSolutionGenerationButton = new System.Windows.Forms.Button();
-      this.viewProblemInitializationButton = new System.Windows.Forms.Button();
-      this.setProblemInitializationButton = new System.Windows.Forms.Button();
-      this.evaluationTextBox = new System.Windows.Forms.TextBox();
-      this.mutationTextBox = new System.Windows.Forms.TextBox();
-      this.solutionGenerationTextBox = new System.Windows.Forms.TextBox();
-      this.problemInitializationTextBox = new System.Windows.Forms.TextBox();
+      this.customizeEvaluationButton = new System.Windows.Forms.Button();
+      this.customizeMutationButton = new System.Windows.Forms.Button();
+      this.customizeSolutionGenerationButton = new System.Windows.Forms.Button();
+      this.customizeProblemInitializationButton = new System.Windows.Forms.Button();
       this.setRandomSeedRandomlyCheckBox = new System.Windows.Forms.CheckBox();
       this.problemDimensionTextBox = new System.Windows.Forms.TextBox();
@@ -113,4 +103,11 @@
       this.cloneEngineButton = new System.Windows.Forms.Button();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.openOperatorLibraryButton = new System.Windows.Forms.Button();
+      this.openOperatorLibraryFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.problemInitializationComboBox = new System.Windows.Forms.ComboBox();
+      this.solutionGenerationComboBox = new System.Windows.Forms.ComboBox();
+      this.mutationComboBox = new System.Windows.Forms.ComboBox();
+      this.evaluationComboBox = new System.Windows.Forms.ComboBox();
+      this.recombinationComboBox = new System.Windows.Forms.ComboBox();
       this.tabControl.SuspendLayout();
       this.parametersTabPage.SuspendLayout();
@@ -146,4 +143,11 @@
       // parametersTabPage
       // 
+      this.parametersTabPage.AutoScroll = true;
+      this.parametersTabPage.Controls.Add(this.recombinationComboBox);
+      this.parametersTabPage.Controls.Add(this.evaluationComboBox);
+      this.parametersTabPage.Controls.Add(this.mutationComboBox);
+      this.parametersTabPage.Controls.Add(this.solutionGenerationComboBox);
+      this.parametersTabPage.Controls.Add(this.problemInitializationComboBox);
+      this.parametersTabPage.Controls.Add(this.openOperatorLibraryButton);
       this.parametersTabPage.Controls.Add(this.leftBracketLabelRight);
       this.parametersTabPage.Controls.Add(this.semicolonLabel);
@@ -152,22 +156,12 @@
       this.parametersTabPage.Controls.Add(this.successRuleGroupBox);
       this.parametersTabPage.Controls.Add(this.parentSelectionGroupBox);
-      this.parametersTabPage.Controls.Add(this.setRecombinationButton);
-      this.parametersTabPage.Controls.Add(this.viewRecombinationButton);
-      this.parametersTabPage.Controls.Add(this.recombinationTextBox);
+      this.parametersTabPage.Controls.Add(this.customizeRecombinationButton);
       this.parametersTabPage.Controls.Add(this.recombinationLabel);
       this.parametersTabPage.Controls.Add(this.rhoTextBox);
       this.parametersTabPage.Controls.Add(this.rhoLabel);
-      this.parametersTabPage.Controls.Add(this.setEvaluationButton);
-      this.parametersTabPage.Controls.Add(this.setMutationButton);
-      this.parametersTabPage.Controls.Add(this.setSolutionGenerationButton);
-      this.parametersTabPage.Controls.Add(this.viewEvaluationButton);
-      this.parametersTabPage.Controls.Add(this.viewMutationButton);
-      this.parametersTabPage.Controls.Add(this.viewSolutionGenerationButton);
-      this.parametersTabPage.Controls.Add(this.viewProblemInitializationButton);
-      this.parametersTabPage.Controls.Add(this.setProblemInitializationButton);
-      this.parametersTabPage.Controls.Add(this.evaluationTextBox);
-      this.parametersTabPage.Controls.Add(this.mutationTextBox);
-      this.parametersTabPage.Controls.Add(this.solutionGenerationTextBox);
-      this.parametersTabPage.Controls.Add(this.problemInitializationTextBox);
+      this.parametersTabPage.Controls.Add(this.customizeEvaluationButton);
+      this.parametersTabPage.Controls.Add(this.customizeMutationButton);
+      this.parametersTabPage.Controls.Add(this.customizeSolutionGenerationButton);
+      this.parametersTabPage.Controls.Add(this.customizeProblemInitializationButton);
       this.parametersTabPage.Controls.Add(this.setRandomSeedRandomlyCheckBox);
       this.parametersTabPage.Controls.Add(this.problemDimensionTextBox);
@@ -353,34 +347,14 @@
       this.plusRadioButton.CheckedChanged += new System.EventHandler(this.plusRadioButton_CheckedChanged);
       // 
-      // setRecombinationButton
-      // 
-      this.setRecombinationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.setRecombinationButton.Location = new System.Drawing.Point(419, 458);
-      this.setRecombinationButton.Name = "setRecombinationButton";
-      this.setRecombinationButton.Size = new System.Drawing.Size(43, 20);
-      this.setRecombinationButton.TabIndex = 47;
-      this.setRecombinationButton.Text = "Set...";
-      this.setRecombinationButton.UseVisualStyleBackColor = true;
-      this.setRecombinationButton.Click += new System.EventHandler(this.setRecombinationButton_Click);
-      // 
-      // viewRecombinationButton
-      // 
-      this.viewRecombinationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.viewRecombinationButton.Location = new System.Drawing.Point(360, 458);
-      this.viewRecombinationButton.Name = "viewRecombinationButton";
-      this.viewRecombinationButton.Size = new System.Drawing.Size(53, 20);
-      this.viewRecombinationButton.TabIndex = 46;
-      this.viewRecombinationButton.Text = "View...";
-      this.viewRecombinationButton.UseVisualStyleBackColor = true;
-      this.viewRecombinationButton.Click += new System.EventHandler(this.viewRecombinationButton_Click);
-      // 
-      // recombinationTextBox
-      // 
-      this.recombinationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.recombinationTextBox.Location = new System.Drawing.Point(168, 458);
-      this.recombinationTextBox.Name = "recombinationTextBox";
-      this.recombinationTextBox.ReadOnly = true;
-      this.recombinationTextBox.Size = new System.Drawing.Size(186, 20);
-      this.recombinationTextBox.TabIndex = 45;
+      // customizeRecombinationButton
+      // 
+      this.customizeRecombinationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.customizeRecombinationButton.Location = new System.Drawing.Point(360, 461);
+      this.customizeRecombinationButton.Name = "customizeRecombinationButton";
+      this.customizeRecombinationButton.Size = new System.Drawing.Size(74, 21);
+      this.customizeRecombinationButton.TabIndex = 46;
+      this.customizeRecombinationButton.Text = "Customize...";
+      this.customizeRecombinationButton.UseVisualStyleBackColor = true;
+      this.customizeRecombinationButton.Click += new System.EventHandler(this.viewRecombinationButton_Click);
       // 
       // recombinationLabel
@@ -388,5 +362,5 @@
       this.recombinationLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.recombinationLabel.AutoSize = true;
-      this.recombinationLabel.Location = new System.Drawing.Point(6, 461);
+      this.recombinationLabel.Location = new System.Drawing.Point(6, 462);
       this.recombinationLabel.Name = "recombinationLabel";
       this.recombinationLabel.Size = new System.Drawing.Size(81, 13);
@@ -413,127 +387,47 @@
       this.rhoLabel.Text = "Rho (ρ):";
       // 
-      // setEvaluationButton
-      // 
-      this.setEvaluationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.setEvaluationButton.Location = new System.Drawing.Point(419, 432);
-      this.setEvaluationButton.Name = "setEvaluationButton";
-      this.setEvaluationButton.Size = new System.Drawing.Size(43, 20);
-      this.setEvaluationButton.TabIndex = 43;
-      this.setEvaluationButton.Text = "Set...";
-      this.setEvaluationButton.UseVisualStyleBackColor = true;
-      this.setEvaluationButton.Click += new System.EventHandler(this.setEvaluationButton_Click);
-      // 
-      // setMutationButton
-      // 
-      this.setMutationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.setMutationButton.Location = new System.Drawing.Point(419, 406);
-      this.setMutationButton.Name = "setMutationButton";
-      this.setMutationButton.Size = new System.Drawing.Size(43, 20);
-      this.setMutationButton.TabIndex = 39;
-      this.setMutationButton.Text = "Set...";
-      this.setMutationButton.UseVisualStyleBackColor = true;
-      this.setMutationButton.Click += new System.EventHandler(this.setMutationButton_Click);
-      // 
-      // setSolutionGenerationButton
-      // 
-      this.setSolutionGenerationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.setSolutionGenerationButton.Location = new System.Drawing.Point(419, 380);
-      this.setSolutionGenerationButton.Name = "setSolutionGenerationButton";
-      this.setSolutionGenerationButton.Size = new System.Drawing.Size(43, 20);
-      this.setSolutionGenerationButton.TabIndex = 35;
-      this.setSolutionGenerationButton.Text = "Set...";
-      this.setSolutionGenerationButton.UseVisualStyleBackColor = true;
-      this.setSolutionGenerationButton.Click += new System.EventHandler(this.setSolutionGenerationButton_Click);
-      // 
-      // viewEvaluationButton
-      // 
-      this.viewEvaluationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.viewEvaluationButton.Location = new System.Drawing.Point(360, 432);
-      this.viewEvaluationButton.Name = "viewEvaluationButton";
-      this.viewEvaluationButton.Size = new System.Drawing.Size(53, 20);
-      this.viewEvaluationButton.TabIndex = 42;
-      this.viewEvaluationButton.Text = "View...";
-      this.viewEvaluationButton.UseVisualStyleBackColor = true;
-      this.viewEvaluationButton.Click += new System.EventHandler(this.viewEvaluationButton_Click);
-      // 
-      // viewMutationButton
-      // 
-      this.viewMutationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.viewMutationButton.Location = new System.Drawing.Point(360, 406);
-      this.viewMutationButton.Name = "viewMutationButton";
-      this.viewMutationButton.Size = new System.Drawing.Size(53, 20);
-      this.viewMutationButton.TabIndex = 38;
-      this.viewMutationButton.Text = "View...";
-      this.viewMutationButton.UseVisualStyleBackColor = true;
-      this.viewMutationButton.Click += new System.EventHandler(this.viewMutationButton_Click);
-      // 
-      // viewSolutionGenerationButton
-      // 
-      this.viewSolutionGenerationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.viewSolutionGenerationButton.Location = new System.Drawing.Point(360, 380);
-      this.viewSolutionGenerationButton.Name = "viewSolutionGenerationButton";
-      this.viewSolutionGenerationButton.Size = new System.Drawing.Size(53, 20);
-      this.viewSolutionGenerationButton.TabIndex = 34;
-      this.viewSolutionGenerationButton.Text = "View...";
-      this.viewSolutionGenerationButton.UseVisualStyleBackColor = true;
-      this.viewSolutionGenerationButton.Click += new System.EventHandler(this.viewSolutionGenerationButton_Click);
-      // 
-      // viewProblemInitializationButton
-      // 
-      this.viewProblemInitializationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.viewProblemInitializationButton.Location = new System.Drawing.Point(360, 354);
-      this.viewProblemInitializationButton.Name = "viewProblemInitializationButton";
-      this.viewProblemInitializationButton.Size = new System.Drawing.Size(53, 20);
-      this.viewProblemInitializationButton.TabIndex = 30;
-      this.viewProblemInitializationButton.Text = "View...";
-      this.viewProblemInitializationButton.UseVisualStyleBackColor = true;
-      this.viewProblemInitializationButton.Click += new System.EventHandler(this.viewProblemInitializationButton_Click);
-      // 
-      // setProblemInitializationButton
-      // 
-      this.setProblemInitializationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.setProblemInitializationButton.Location = new System.Drawing.Point(419, 354);
-      this.setProblemInitializationButton.Name = "setProblemInitializationButton";
-      this.setProblemInitializationButton.Size = new System.Drawing.Size(43, 20);
-      this.setProblemInitializationButton.TabIndex = 31;
-      this.setProblemInitializationButton.Text = "Set...";
-      this.setProblemInitializationButton.UseVisualStyleBackColor = true;
-      this.setProblemInitializationButton.Click += new System.EventHandler(this.setProblemInitializationButton_Click);
-      // 
-      // evaluationTextBox
-      // 
-      this.evaluationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.evaluationTextBox.Location = new System.Drawing.Point(168, 432);
-      this.evaluationTextBox.Name = "evaluationTextBox";
-      this.evaluationTextBox.ReadOnly = true;
-      this.evaluationTextBox.Size = new System.Drawing.Size(186, 20);
-      this.evaluationTextBox.TabIndex = 41;
-      // 
-      // mutationTextBox
-      // 
-      this.mutationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.mutationTextBox.Location = new System.Drawing.Point(168, 406);
-      this.mutationTextBox.Name = "mutationTextBox";
-      this.mutationTextBox.ReadOnly = true;
-      this.mutationTextBox.Size = new System.Drawing.Size(186, 20);
-      this.mutationTextBox.TabIndex = 37;
-      // 
-      // solutionGenerationTextBox
-      // 
-      this.solutionGenerationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.solutionGenerationTextBox.Location = new System.Drawing.Point(168, 380);
-      this.solutionGenerationTextBox.Name = "solutionGenerationTextBox";
-      this.solutionGenerationTextBox.ReadOnly = true;
-      this.solutionGenerationTextBox.Size = new System.Drawing.Size(186, 20);
-      this.solutionGenerationTextBox.TabIndex = 33;
-      // 
-      // problemInitializationTextBox
-      // 
-      this.problemInitializationTextBox.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.problemInitializationTextBox.Location = new System.Drawing.Point(168, 354);
-      this.problemInitializationTextBox.Name = "problemInitializationTextBox";
-      this.problemInitializationTextBox.ReadOnly = true;
-      this.problemInitializationTextBox.Size = new System.Drawing.Size(186, 20);
-      this.problemInitializationTextBox.TabIndex = 29;
+      // customizeEvaluationButton
+      // 
+      this.customizeEvaluationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.customizeEvaluationButton.Location = new System.Drawing.Point(360, 407);
+      this.customizeEvaluationButton.Name = "customizeEvaluationButton";
+      this.customizeEvaluationButton.Size = new System.Drawing.Size(74, 22);
+      this.customizeEvaluationButton.TabIndex = 42;
+      this.customizeEvaluationButton.Text = "Customize...";
+      this.customizeEvaluationButton.UseVisualStyleBackColor = true;
+      this.customizeEvaluationButton.Click += new System.EventHandler(this.viewEvaluationButton_Click);
+      // 
+      // customizeMutationButton
+      // 
+      this.customizeMutationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.customizeMutationButton.Location = new System.Drawing.Point(360, 434);
+      this.customizeMutationButton.Name = "customizeMutationButton";
+      this.customizeMutationButton.Size = new System.Drawing.Size(74, 21);
+      this.customizeMutationButton.TabIndex = 38;
+      this.customizeMutationButton.Text = "Customize...";
+      this.customizeMutationButton.UseVisualStyleBackColor = true;
+      this.customizeMutationButton.Click += new System.EventHandler(this.viewMutationButton_Click);
+      // 
+      // customizeSolutionGenerationButton
+      // 
+      this.customizeSolutionGenerationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.customizeSolutionGenerationButton.Location = new System.Drawing.Point(360, 380);
+      this.customizeSolutionGenerationButton.Name = "customizeSolutionGenerationButton";
+      this.customizeSolutionGenerationButton.Size = new System.Drawing.Size(74, 21);
+      this.customizeSolutionGenerationButton.TabIndex = 34;
+      this.customizeSolutionGenerationButton.Text = "Customize...";
+      this.customizeSolutionGenerationButton.UseVisualStyleBackColor = true;
+      this.customizeSolutionGenerationButton.Click += new System.EventHandler(this.viewSolutionGenerationButton_Click);
+      // 
+      // customizeProblemInitializationButton
+      // 
+      this.customizeProblemInitializationButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.customizeProblemInitializationButton.Location = new System.Drawing.Point(360, 353);
+      this.customizeProblemInitializationButton.Name = "customizeProblemInitializationButton";
+      this.customizeProblemInitializationButton.Size = new System.Drawing.Size(74, 21);
+      this.customizeProblemInitializationButton.TabIndex = 30;
+      this.customizeProblemInitializationButton.Text = "Customize...";
+      this.customizeProblemInitializationButton.UseVisualStyleBackColor = true;
+      this.customizeProblemInitializationButton.Click += new System.EventHandler(this.viewProblemInitializationButton_Click);
       // 
       // setRandomSeedRandomlyCheckBox
@@ -569,5 +463,5 @@
       this.evaluationLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.evaluationLabel.AutoSize = true;
-      this.evaluationLabel.Location = new System.Drawing.Point(6, 435);
+      this.evaluationLabel.Location = new System.Drawing.Point(6, 410);
       this.evaluationLabel.Name = "evaluationLabel";
       this.evaluationLabel.Size = new System.Drawing.Size(60, 13);
@@ -579,5 +473,5 @@
       this.mutationLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.mutationLabel.AutoSize = true;
-      this.mutationLabel.Location = new System.Drawing.Point(6, 409);
+      this.mutationLabel.Location = new System.Drawing.Point(6, 437);
       this.mutationLabel.Name = "mutationLabel";
       this.mutationLabel.Size = new System.Drawing.Size(51, 13);
@@ -830,4 +724,86 @@
       this.toolTip.InitialDelay = 200;
       this.toolTip.ReshowDelay = 40;
+      // 
+      // openOperatorLibraryButton
+      // 
+      this.openOperatorLibraryButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.openOperatorLibraryButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+      this.openOperatorLibraryButton.Image = global::HeuristicLab.ES.Properties.Resources.OpenProblem;
+      this.openOperatorLibraryButton.Location = new System.Drawing.Point(464, 6);
+      this.openOperatorLibraryButton.Name = "openOperatorLibraryButton";
+      this.openOperatorLibraryButton.Size = new System.Drawing.Size(23, 23);
+      this.openOperatorLibraryButton.TabIndex = 48;
+      this.openOperatorLibraryButton.UseVisualStyleBackColor = true;
+      this.openOperatorLibraryButton.Click += new System.EventHandler(this.openOperatorLibraryButton_Click);
+      // 
+      // openOperatorLibraryFileDialog
+      // 
+      this.openOperatorLibraryFileDialog.FileName = "OperatorLibrary";
+      this.openOperatorLibraryFileDialog.Filter = "HL files|*.hl|All files|*.*";
+      // 
+      // problemInitializationComboBox
+      // 
+      this.problemInitializationComboBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.problemInitializationComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.problemInitializationComboBox.FormattingEnabled = true;
+      this.problemInitializationComboBox.Items.AddRange(new object[] {
+            "Set..."});
+      this.problemInitializationComboBox.Location = new System.Drawing.Point(168, 353);
+      this.problemInitializationComboBox.Name = "problemInitializationComboBox";
+      this.problemInitializationComboBox.Size = new System.Drawing.Size(186, 21);
+      this.problemInitializationComboBox.TabIndex = 49;
+      this.problemInitializationComboBox.SelectedIndexChanged += new System.EventHandler(this.problemInitializationComboBox_SelectedIndexChanged);
+      // 
+      // solutionGenerationComboBox
+      // 
+      this.solutionGenerationComboBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.solutionGenerationComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.solutionGenerationComboBox.FormattingEnabled = true;
+      this.solutionGenerationComboBox.Items.AddRange(new object[] {
+            "Set..."});
+      this.solutionGenerationComboBox.Location = new System.Drawing.Point(168, 380);
+      this.solutionGenerationComboBox.Name = "solutionGenerationComboBox";
+      this.solutionGenerationComboBox.Size = new System.Drawing.Size(186, 21);
+      this.solutionGenerationComboBox.TabIndex = 50;
+      this.solutionGenerationComboBox.SelectedIndexChanged += new System.EventHandler(this.solutionGenerationComboBox_SelectedIndexChanged);
+      // 
+      // mutationComboBox
+      // 
+      this.mutationComboBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.mutationComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.mutationComboBox.FormattingEnabled = true;
+      this.mutationComboBox.Items.AddRange(new object[] {
+            "Set..."});
+      this.mutationComboBox.Location = new System.Drawing.Point(168, 434);
+      this.mutationComboBox.Name = "mutationComboBox";
+      this.mutationComboBox.Size = new System.Drawing.Size(186, 21);
+      this.mutationComboBox.TabIndex = 51;
+      this.mutationComboBox.SelectedIndexChanged += new System.EventHandler(this.mutationComboBox_SelectedIndexChanged);
+      // 
+      // evaluationComboBox
+      // 
+      this.evaluationComboBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.evaluationComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.evaluationComboBox.FormattingEnabled = true;
+      this.evaluationComboBox.Items.AddRange(new object[] {
+            "Set..."});
+      this.evaluationComboBox.Location = new System.Drawing.Point(168, 407);
+      this.evaluationComboBox.Name = "evaluationComboBox";
+      this.evaluationComboBox.Size = new System.Drawing.Size(186, 21);
+      this.evaluationComboBox.TabIndex = 52;
+      this.evaluationComboBox.SelectedIndexChanged += new System.EventHandler(this.evaluationComboBox_SelectedIndexChanged);
+      // 
+      // recombinationComboBox
+      // 
+      this.recombinationComboBox.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.recombinationComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.recombinationComboBox.FormattingEnabled = true;
+      this.recombinationComboBox.Items.AddRange(new object[] {
+            "Set..."});
+      this.recombinationComboBox.Location = new System.Drawing.Point(168, 461);
+      this.recombinationComboBox.Name = "recombinationComboBox";
+      this.recombinationComboBox.Size = new System.Drawing.Size(186, 21);
+      this.recombinationComboBox.TabIndex = 53;
+      this.recombinationComboBox.SelectedIndexChanged += new System.EventHandler(this.recombinationComboBox_SelectedIndexChanged);
       // 
       // ESEditor
@@ -879,22 +855,12 @@
     private System.Windows.Forms.Label solutionGenerationLabel;
     private System.Windows.Forms.Button cloneEngineButton;
-    private System.Windows.Forms.TextBox mutationTextBox;
-    private System.Windows.Forms.TextBox solutionGenerationTextBox;
-    private System.Windows.Forms.TextBox problemInitializationTextBox;
-    private System.Windows.Forms.TextBox evaluationTextBox;
-    private System.Windows.Forms.Button setProblemInitializationButton;
-    private System.Windows.Forms.Button setEvaluationButton;
-    private System.Windows.Forms.Button setMutationButton;
-    private System.Windows.Forms.Button setSolutionGenerationButton;
     private HeuristicLab.Core.ScopeView scopeView;
-    private System.Windows.Forms.Button viewEvaluationButton;
-    private System.Windows.Forms.Button viewMutationButton;
-    private System.Windows.Forms.Button viewSolutionGenerationButton;
-    private System.Windows.Forms.Button viewProblemInitializationButton;
+    private System.Windows.Forms.Button customizeEvaluationButton;
+    private System.Windows.Forms.Button customizeMutationButton;
+    private System.Windows.Forms.Button customizeSolutionGenerationButton;
+    private System.Windows.Forms.Button customizeProblemInitializationButton;
     private System.Windows.Forms.TextBox generalLearningRateTextBox;
     private System.Windows.Forms.Label generalLearningRateLabel;
-    private System.Windows.Forms.Button setRecombinationButton;
-    private System.Windows.Forms.Button viewRecombinationButton;
-    private System.Windows.Forms.TextBox recombinationTextBox;
+    private System.Windows.Forms.Button customizeRecombinationButton;
     private System.Windows.Forms.Label recombinationLabel;
     private System.Windows.Forms.TextBox rhoTextBox;
@@ -921,4 +887,11 @@
     private System.Windows.Forms.TextBox shakingFactorsUpperBoundTextBox;
     private System.Windows.Forms.Label problemDimensionVariableNameLabel;
+    private System.Windows.Forms.Button openOperatorLibraryButton;
+    private System.Windows.Forms.OpenFileDialog openOperatorLibraryFileDialog;
+    private System.Windows.Forms.ComboBox problemInitializationComboBox;
+    private System.Windows.Forms.ComboBox recombinationComboBox;
+    private System.Windows.Forms.ComboBox evaluationComboBox;
+    private System.Windows.Forms.ComboBox mutationComboBox;
+    private System.Windows.Forms.ComboBox solutionGenerationComboBox;
   }
 }
Index: /trunk/sources/HeuristicLab.ES/3.2/ESEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.ES/3.2/ESEditor.cs	(revision 2051)
+++ /trunk/sources/HeuristicLab.ES/3.2/ESEditor.cs	(revision 2052)
@@ -36,4 +36,15 @@
   public partial class ESEditor : EditorBase {
     private ChooseOperatorDialog chooseOperatorDialog;
+    private OperatorLibrary operatorLibrary;
+    private List<IOperator> problemInitializers;
+    private int selectedProblemInitializer;
+    private List<IOperator> solutionGenerators;
+    private int selectedSolutionGenerator;
+    private List<IOperator> mutators;
+    private int selectedMutator;
+    private List<IOperator> evaluators;
+    private int selectedEvaluator;
+    private List<IOperator> recombinators;
+    private int selectedRecombinator;
 
     /// <summary>
@@ -52,4 +63,14 @@
     public ESEditor() {
       InitializeComponent();
+      problemInitializers = new List<IOperator>();
+      selectedProblemInitializer = -1;
+      solutionGenerators = new List<IOperator>();
+      selectedSolutionGenerator = -1;
+      mutators = new List<IOperator>();
+      selectedMutator = -1;
+      evaluators = new List<IOperator>();
+      selectedEvaluator = -1;
+      recombinators = new List<IOperator>();
+      selectedRecombinator = -1;
     }
     /// <summary>
@@ -60,4 +81,26 @@
       : this() {
       ES = es;
+    }
+
+    private int AddOperator(ComboBox comboBox, IOperator iOperator, List<IOperator> list) {
+      for (int i = 0; i < comboBox.Items.Count - 1; i++) {
+        if ((comboBox.Items[i] as string).CompareTo(iOperator.Name) > 0) {
+          comboBox.Items.Insert(i, iOperator.Name);
+          list.Insert(i, iOperator);
+          return i;
+        }
+      }
+      int index = comboBox.Items.Count - 1;
+      comboBox.Items.Insert(index, iOperator.Name);
+      list.Add(iOperator);
+      return index;
+    }
+    private int SetOperator(ComboBox comboBox, IOperator iOperator, List<IOperator> list) {
+      int index;
+      if ((index = list.FindIndex(op => op.Name.Equals(iOperator.Name))) >= 0) {
+        comboBox.Items.RemoveAt(index);
+        list.RemoveAt(index);
+        return AddOperator(comboBox, iOperator, list);
+      } else return -1;
     }
 
@@ -106,9 +149,30 @@
       } else {
         tabControl.Enabled = true;
-        problemInitializationTextBox.Text = ES.ProblemInjector.GetType().Name;
-        solutionGenerationTextBox.Text = ES.SolutionGenerator.GetType().Name;
-        mutationTextBox.Text = ES.Mutator.GetType().Name;
-        evaluationTextBox.Text = ES.Evaluator.GetType().Name;
-        recombinationTextBox.Text = ES.Recombinator.GetType().Name;
+        int index;
+        if (!((index = problemInitializers.FindIndex(op => op.Name.Equals(ES.ProblemInjector.Name))) >= 0)) {
+          index = AddOperator(problemInitializationComboBox, ES.ProblemInjector, problemInitializers);
+          if (index <= selectedProblemInitializer) selectedProblemInitializer++;
+        }
+        problemInitializationComboBox.SelectedIndex = index;
+        if (!((index = solutionGenerators.FindIndex(op => op.Name.Equals(ES.SolutionGenerator.Name))) >= 0)) {
+          index = AddOperator(solutionGenerationComboBox, ES.SolutionGenerator, solutionGenerators);
+          if (index <= selectedSolutionGenerator) selectedSolutionGenerator++;
+        }
+        solutionGenerationComboBox.SelectedIndex = index;
+        if (!((index = evaluators.FindIndex(op => op.Name.Equals(ES.Evaluator.Name))) >= 0)) {
+          index = AddOperator(evaluationComboBox, ES.Evaluator, evaluators);
+          if (index <= selectedEvaluator) selectedEvaluator++;
+        }
+        evaluationComboBox.SelectedIndex = index;
+        if (!((index = mutators.FindIndex(op => op.Name.Equals(ES.Mutator.Name))) >= 0)) {
+          index = AddOperator(mutationComboBox, ES.Mutator, mutators);
+          if (index <= selectedMutator) selectedMutator++;
+        }
+        mutationComboBox.SelectedIndex = index;
+        if (!((index = recombinators.FindIndex(op => op.Name.Equals(ES.Recombinator.Name))) >= 0)) {
+          index = AddOperator(recombinationComboBox, ES.Recombinator, recombinators);
+          if (index <= selectedRecombinator) selectedRecombinator++;
+        }
+        recombinationComboBox.SelectedIndex = index;
         plusRadioButton.Checked = ES.PlusNotation;
         commaRadioButton.Checked = !ES.PlusNotation;
@@ -157,37 +221,5 @@
     }
     private void setProblemInitializationButton_Click(object sender, EventArgs e) {
-      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
-      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
-        ES.ProblemInjector = chooseOperatorDialog.Operator;
-        problemInitializationTextBox.Text = ES.ProblemInjector.GetType().Name;
-      }
-    }
-    private void setSolutionGenerationButton_Click(object sender, EventArgs e) {
-      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
-      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
-        ES.SolutionGenerator= chooseOperatorDialog.Operator;
-        solutionGenerationTextBox.Text = ES.SolutionGenerator.GetType().Name;
-      }
-    }
-    private void setMutationButton_Click(object sender, EventArgs e) {
-      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
-      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
-        ES.Mutator = chooseOperatorDialog.Operator;
-        mutationTextBox.Text = ES.Mutator.GetType().Name;
-      }
-    }
-    private void setEvaluationButton_Click(object sender, EventArgs e) {
-      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
-      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
-        ES.Evaluator = chooseOperatorDialog.Operator;
-        evaluationTextBox.Text = ES.Evaluator.GetType().Name;
-      }
-    }
-    private void setRecombinationButton_Click(object sender, EventArgs e) {
-      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
-      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
-        ES.Recombinator = chooseOperatorDialog.Operator;
-        recombinationTextBox.Text = ES.Recombinator.GetType().Name;
-      }
+      
     }
     private void executeButton_Click(object sender, EventArgs e) {
@@ -254,4 +286,191 @@
       }
     }
+
+    private void openOperatorLibraryButton_Click(object sender, EventArgs e) {
+      if (openOperatorLibraryFileDialog.ShowDialog() == DialogResult.OK) {
+
+        operatorLibrary = (PersistenceManager.Load(openOperatorLibraryFileDialog.FileName) as OperatorLibrary);
+        if (operatorLibrary == null) {
+          MessageBox.Show("The selected file is not an operator library");
+          return;
+        }
+        foreach (IOperatorGroup topLevelGroup in operatorLibrary.Group.SubGroups) {
+          if (topLevelGroup.Name.Equals("Problem")) {
+            foreach (IOperatorGroup group in topLevelGroup.SubGroups) {
+              if (group.Name.Equals("Initialization")) {
+                foreach (IOperator op in group.Operators) {
+                  int index = SetOperator(problemInitializationComboBox, (IOperator)op.Clone(), problemInitializers);
+                  if (index < 0) {
+                    index = AddOperator(problemInitializationComboBox, (IOperator)op.Clone(), problemInitializers);
+                    if (index <= selectedProblemInitializer) selectedProblemInitializer++;
+                  }
+                }
+              } else if (group.Name.Equals("Solution generation")) {
+                foreach (IOperator op in group.Operators) {
+                  int index = SetOperator(solutionGenerationComboBox, (IOperator)op.Clone(), solutionGenerators);
+                  if (index < 0) {
+                    index = AddOperator(solutionGenerationComboBox, (IOperator)op.Clone(), solutionGenerators);
+                    if (index <= selectedSolutionGenerator) selectedSolutionGenerator++;
+                  }
+                }
+              } else if (group.Name.Equals("Evaluation")) {
+                foreach (IOperator op in group.Operators) {
+                  int index = SetOperator(evaluationComboBox, (IOperator)op.Clone(), evaluators);
+                  if (index < 0) {
+                    index = AddOperator(evaluationComboBox, (IOperator)op.Clone(), evaluators);
+                    if (index <= selectedEvaluator) selectedEvaluator++;
+                  }
+                }
+              }
+            }
+          } else if (topLevelGroup.Name.Equals("ES")) {
+            foreach (IOperatorGroup group in topLevelGroup.SubGroups) {
+              if (group.Name.Equals("Mutation")) {
+                foreach (IOperator op in group.Operators) {
+                  int index = SetOperator(mutationComboBox, (IOperator)op.Clone(), mutators);
+                  if (index < 0) {
+                    index = AddOperator(mutationComboBox, (IOperator)op.Clone(), mutators);
+                    if (index <= selectedMutator) selectedMutator++;
+                  }
+                }
+              } else if (group.Name.Equals("Recombination")) {
+                foreach (IOperator op in group.Operators) {
+                  int index = SetOperator(recombinationComboBox, (IOperator)op.Clone(), recombinators);
+                  if (index < 0) {
+                    index = AddOperator(recombinationComboBox, (IOperator)op.Clone(), recombinators);
+                    if (index <= selectedRecombinator) selectedRecombinator++;
+                  }
+                }
+              }
+            }
+          }
+        }
+        problemInitializationComboBox.SelectedIndexChanged -= new EventHandler(problemInitializationComboBox_SelectedIndexChanged);
+        problemInitializationComboBox.SelectedIndex = selectedProblemInitializer;
+        problemInitializationComboBox.SelectedIndexChanged += new EventHandler(problemInitializationComboBox_SelectedIndexChanged);
+        solutionGenerationComboBox.SelectedIndexChanged -= new EventHandler(solutionGenerationComboBox_SelectedIndexChanged);
+        solutionGenerationComboBox.SelectedIndex = selectedSolutionGenerator;
+        solutionGenerationComboBox.SelectedIndexChanged += new EventHandler(solutionGenerationComboBox_SelectedIndexChanged);
+        evaluationComboBox.SelectedIndexChanged -= new EventHandler(evaluationComboBox_SelectedIndexChanged);
+        evaluationComboBox.SelectedIndex = selectedEvaluator;
+        evaluationComboBox.SelectedIndexChanged += new EventHandler(evaluationComboBox_SelectedIndexChanged);
+        mutationComboBox.SelectedIndexChanged -= new EventHandler(mutationComboBox_SelectedIndexChanged);
+        mutationComboBox.SelectedIndex = selectedMutator;
+        mutationComboBox.SelectedIndexChanged += new EventHandler(mutationComboBox_SelectedIndexChanged);
+        recombinationComboBox.SelectedIndexChanged -= new EventHandler(recombinationComboBox_SelectedIndexChanged);
+        recombinationComboBox.SelectedIndex = selectedRecombinator;
+        recombinationComboBox.SelectedIndexChanged += new EventHandler(recombinationComboBox_SelectedIndexChanged);
+      }
+    }
+
+    private void problemInitializationComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      int index = problemInitializationComboBox.SelectedIndex;
+      if (index != selectedProblemInitializer) {
+        if (index == problemInitializationComboBox.Items.Count - 1) {
+          if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+          if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+            selectedProblemInitializer = -1;
+            index = SetOperator(problemInitializationComboBox, chooseOperatorDialog.Operator, problemInitializers);
+            if (index < 0) index = AddOperator(problemInitializationComboBox, chooseOperatorDialog.Operator, problemInitializers);
+          } else {
+            problemInitializationComboBox.SelectedIndex = selectedProblemInitializer;
+            return;
+          }
+        }
+        if (index >= 0) {
+          ES.ProblemInjector = problemInitializers[index];
+          selectedProblemInitializer = index;
+          problemInitializationComboBox.SelectedIndex = index;
+        }
+      }
+    }
+
+    private void solutionGenerationComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      int index = solutionGenerationComboBox.SelectedIndex;
+      if (index != selectedSolutionGenerator) {
+        if (index == solutionGenerationComboBox.Items.Count - 1) {
+          if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+          if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+            selectedSolutionGenerator = -1;
+            index = SetOperator(solutionGenerationComboBox, chooseOperatorDialog.Operator, solutionGenerators);
+            if (index < 0) AddOperator(solutionGenerationComboBox, chooseOperatorDialog.Operator, solutionGenerators);
+          } else {
+            solutionGenerationComboBox.SelectedIndex = selectedSolutionGenerator;
+            return;
+          }
+        }
+        if (index >= 0) {
+          ES.SolutionGenerator = solutionGenerators[index];
+          selectedSolutionGenerator = index;
+          solutionGenerationComboBox.SelectedIndex = selectedSolutionGenerator;
+        }
+      }
+    }
+
+    private void evaluationComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      int index = evaluationComboBox.SelectedIndex;
+      if (index != selectedEvaluator) {
+        if (index == evaluationComboBox.Items.Count - 1) {
+          if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+          if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+            selectedEvaluator = -1;
+            index = SetOperator(evaluationComboBox, chooseOperatorDialog.Operator, evaluators);
+            if (index < 0) index = AddOperator(evaluationComboBox, chooseOperatorDialog.Operator, evaluators);
+          } else {
+            evaluationComboBox.SelectedIndex = selectedEvaluator;
+            return;
+          }
+        }
+        if (index >= 0) {
+          ES.Evaluator = evaluators[index];
+          selectedEvaluator = index;
+          evaluationComboBox.SelectedIndex = index;
+        }
+      }
+    }
+
+    private void mutationComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      int index = mutationComboBox.SelectedIndex;
+      if (index != selectedMutator) {
+        if (index == mutationComboBox.Items.Count - 1) {
+          if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+          if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+            selectedMutator = -1;
+            index = SetOperator(mutationComboBox, chooseOperatorDialog.Operator, mutators);
+            if (index < 0) index = AddOperator(mutationComboBox, chooseOperatorDialog.Operator, mutators);
+          } else {
+            mutationComboBox.SelectedIndex = selectedMutator;
+            return;
+          }
+        }
+        if (index >= 0) {
+          ES.Mutator = mutators[index];
+          selectedMutator = index;
+          mutationComboBox.SelectedIndex = index;
+        }
+      }
+    }
+
+    private void recombinationComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      int index = recombinationComboBox.SelectedIndex;
+      if (index != selectedRecombinator) {
+        if (index == recombinationComboBox.Items.Count - 1) {
+          if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+          if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+            selectedRecombinator = -1;
+            index = SetOperator(recombinationComboBox, chooseOperatorDialog.Operator, recombinators);
+            if (index < 0) index = AddOperator(recombinationComboBox, chooseOperatorDialog.Operator, recombinators);
+          } else {
+            recombinationComboBox.SelectedIndex = selectedRecombinator;
+            return;
+          }
+        }
+        if (index >= 0) {
+          ES.Recombinator = recombinators[index];
+          selectedRecombinator = index;
+          recombinationComboBox.SelectedIndex = index;
+        }
+      }
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.ES/3.2/ESEditor.resx
===================================================================
--- /trunk/sources/HeuristicLab.ES/3.2/ESEditor.resx	(revision 2051)
+++ /trunk/sources/HeuristicLab.ES/3.2/ESEditor.resx	(revision 2052)
@@ -131,4 +131,7 @@
 Use the colon ; to separate two numbers.</value>
   </data>
+  <metadata name="openOperatorLibraryFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>97, 3</value>
+  </metadata>
   <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>26</value>
Index: /trunk/sources/HeuristicLab.ES/3.2/HeuristicLab.ES-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.ES/3.2/HeuristicLab.ES-3.2.csproj	(revision 2051)
+++ /trunk/sources/HeuristicLab.ES/3.2/HeuristicLab.ES-3.2.csproj	(revision 2052)
@@ -95,4 +95,9 @@
     </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
     <Compile Include="SelfAdaptiveMutationStrengthAdjuster.cs" />
     <Compile Include="VariableStrengthRepeatingManipulator.cs" />
@@ -106,4 +111,8 @@
       <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
       <Name>HeuristicLab.Data-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Evolutionary\3.2\HeuristicLab.Evolutionary-3.2.csproj">
+      <Project>{F5614C53-153C-4A37-A608-121E1C087F07}</Project>
+      <Name>HeuristicLab.Evolutionary-3.2</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Logging\3.2\HeuristicLab.Logging-3.2.csproj">
@@ -145,4 +154,11 @@
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\OpenProblem.gif" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Index: /trunk/sources/HeuristicLab.ES/3.2/Properties/Resources.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.ES/3.2/Properties/Resources.Designer.cs	(revision 2052)
+++ /trunk/sources/HeuristicLab.ES/3.2/Properties/Resources.Designer.cs	(revision 2052)
@@ -0,0 +1,70 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.4016
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.ES.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.ES.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        internal static System.Drawing.Bitmap OpenProblem {
+            get {
+                object obj = ResourceManager.GetObject("OpenProblem", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Index: /trunk/sources/HeuristicLab.ES/3.2/Properties/Resources.resx
===================================================================
--- /trunk/sources/HeuristicLab.ES/3.2/Properties/Resources.resx	(revision 2052)
+++ /trunk/sources/HeuristicLab.ES/3.2/Properties/Resources.resx	(revision 2052)
@@ -0,0 +1,124 @@
+﻿<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="OpenProblem" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\OpenProblem.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
