Index: branches/CEDMA-Refactoring-Ticket419/HeuristicLab.GP.StructureIdentification/AlgorithmBase.cs
===================================================================
--- branches/CEDMA-Refactoring-Ticket419/HeuristicLab.GP.StructureIdentification/AlgorithmBase.cs	(revision 1236)
+++ branches/CEDMA-Refactoring-Ticket419/HeuristicLab.GP.StructureIdentification/AlgorithmBase.cs	(revision 1238)
@@ -244,27 +244,35 @@
       BestAverageWorstQualityCalculator qualityCalculator = new BestAverageWorstQualityCalculator();
       BestAverageWorstQualityCalculator validationQualityCalculator = new BestAverageWorstQualityCalculator();
-      validationQualityCalculator.Name = "ValidationQualityCalculator";
+      validationQualityCalculator.Name = "BestAverageWorstValidationQualityCalculator";
       validationQualityCalculator.GetVariableInfo("Quality").ActualName = "ValidationQuality";
       validationQualityCalculator.GetVariableInfo("BestQuality").ActualName = "BestValidationQuality";
       validationQualityCalculator.GetVariableInfo("AverageQuality").ActualName = "AverageValidationQuality";
       validationQualityCalculator.GetVariableInfo("WorstQuality").ActualName = "WorstValidationQuality";
-      DataCollector collector = new DataCollector();
-      ItemList<StringData> names = collector.GetVariable("VariableNames").GetValue<ItemList<StringData>>();
-      names.Add(new StringData("BestQuality"));
-      names.Add(new StringData("AverageQuality"));
-      names.Add(new StringData("WorstQuality"));
-      names.Add(new StringData("BestValidationQuality"));
-      names.Add(new StringData("AverageValidationQuality"));
-      names.Add(new StringData("WorstValidationQuality"));
-      LinechartInjector lineChartInjector = new LinechartInjector();
-      lineChartInjector.GetVariableInfo("Linechart").ActualName = "Quality Linechart";
-      lineChartInjector.GetVariable("NumberOfLines").GetValue<IntData>().Data = 6;
-      QualityLogger qualityLogger = new QualityLogger();
-      QualityLogger validationQualityLogger = new QualityLogger();
-      validationQualityLogger.Name = "ValidationQualityLogger";
-      validationQualityLogger.GetVariableInfo("Quality").ActualName = "ValidationQuality";
-      validationQualityLogger.GetVariableInfo("QualityLog").ActualName = "ValidationQualityLog";
+      IOperator loggingOperator = CreateLoggingOperator();
       Counter counter = new Counter();
       counter.GetVariableInfo("Value").ActualName = "Generations";
+      IOperator loopCondition = CreateLoopCondition(seq);
+
+      seq.AddSubOperator(childCreater);
+      seq.AddSubOperator(replacement);
+      seq.AddSubOperator(solutionStorer);
+      seq.AddSubOperator(qualityCalculator);
+      seq.AddSubOperator(validationQualityCalculator);
+      seq.AddSubOperator(loggingOperator);
+      seq.AddSubOperator(counter);
+      seq.AddSubOperator(loopCondition);
+
+      main.OperatorGraph.AddOperator(seq);
+      main.OperatorGraph.InitialOperator = seq;
+      return main;
+    }
+
+    internal virtual IOperator CreateLoggingOperator() {
+      return new EmptyOperator();
+    }
+
+    internal virtual IOperator CreateLoopCondition(IOperator loop) {
+      SequentialProcessor seq = new SequentialProcessor();
+      seq.Name = "Loop Condition";
       LessThanComparator comparator = new LessThanComparator();
       comparator.GetVariableInfo("LeftSide").ActualName = "Generations";
@@ -274,21 +282,9 @@
       cond.GetVariableInfo("Condition").ActualName = "GenerationsCondition";
 
-      seq.AddSubOperator(childCreater);
-      seq.AddSubOperator(replacement);
-      seq.AddSubOperator(solutionStorer);
-      seq.AddSubOperator(qualityCalculator);
-      seq.AddSubOperator(validationQualityCalculator);
-      seq.AddSubOperator(collector);
-      seq.AddSubOperator(lineChartInjector);
-      seq.AddSubOperator(qualityLogger);
-      seq.AddSubOperator(validationQualityLogger);
-      seq.AddSubOperator(counter);
       seq.AddSubOperator(comparator);
       seq.AddSubOperator(cond);
-      cond.AddSubOperator(seq);
-
-      main.OperatorGraph.AddOperator(seq);
-      main.OperatorGraph.InitialOperator = seq;
-      return main;
+
+      cond.AddSubOperator(loop);
+      return seq;
     }
 
Index: branches/CEDMA-Refactoring-Ticket419/HeuristicLab.GP.StructureIdentification/OffspringSelectionGP.cs
===================================================================
--- branches/CEDMA-Refactoring-Ticket419/HeuristicLab.GP.StructureIdentification/OffspringSelectionGP.cs	(revision 1236)
+++ branches/CEDMA-Refactoring-Ticket419/HeuristicLab.GP.StructureIdentification/OffspringSelectionGP.cs	(revision 1238)
@@ -179,4 +179,63 @@
     }
 
+    internal override IOperator CreateLoopCondition(IOperator loop) {
+      SequentialProcessor seq = new SequentialProcessor();
+      seq.Name = "Loop Condition";
+      LessThanComparator generationsComparator = new LessThanComparator();
+      generationsComparator.GetVariableInfo("LeftSide").ActualName = "Generations";
+      generationsComparator.GetVariableInfo("RightSide").ActualName = "MaxGenerations";
+      generationsComparator.GetVariableInfo("Result").ActualName = "GenerationsCondition";
+
+      LessThanComparator selPresComparator = new LessThanComparator();
+      selPresComparator.GetVariableInfo("LeftSide").ActualName = "SelectionPressure";
+      selPresComparator.GetVariableInfo("RightSide").ActualName = "SelectionPressureLimit";
+      selPresComparator.GetVariableInfo("Result").ActualName = "SelectionPressureCondition";
+      
+      ConditionalBranch generationsCond = new ConditionalBranch();
+      generationsCond.GetVariableInfo("Condition").ActualName = "GenerationsCondition";
+
+      ConditionalBranch selPresCond = new ConditionalBranch();
+      selPresCond.GetVariableInfo("Condition").ActualName = "SelectionPressureCondition";
+
+      seq.AddSubOperator(generationsComparator);
+      seq.AddSubOperator(selPresComparator);
+      seq.AddSubOperator(generationsCond);
+      generationsCond.AddSubOperator(selPresCond);
+      selPresCond.AddSubOperator(loop);
+
+      return seq;
+    }
+
+    internal override IOperator CreateLoggingOperator() {
+      CombinedOperator loggingOperator = new CombinedOperator();
+      loggingOperator.Name = "Logging";
+      SequentialProcessor seq = new SequentialProcessor();
+
+      DataCollector collector = new DataCollector();
+      ItemList<StringData> names = collector.GetVariable("VariableNames").GetValue<ItemList<StringData>>();
+      names.Add(new StringData("BestQuality"));
+      names.Add(new StringData("AverageQuality"));
+      names.Add(new StringData("WorstQuality"));
+      names.Add(new StringData("BestValidationQuality"));
+      names.Add(new StringData("AverageValidationQuality"));
+      names.Add(new StringData("WorstValidationQuality"));
+      names.Add(new StringData("EvaluatedSolutions"));
+      names.Add(new StringData("SelectionPressure"));
+      QualityLogger qualityLogger = new QualityLogger();
+      QualityLogger validationQualityLogger = new QualityLogger();
+      validationQualityLogger.Name = "ValidationQualityLogger";
+      validationQualityLogger.GetVariableInfo("Quality").ActualName = "ValidationQuality";
+      validationQualityLogger.GetVariableInfo("QualityLog").ActualName = "ValidationQualityLog";
+
+      seq.AddSubOperator(collector);
+      seq.AddSubOperator(qualityLogger);
+      seq.AddSubOperator(validationQualityLogger);
+
+      loggingOperator.OperatorGraph.AddOperator(seq);
+      loggingOperator.OperatorGraph.InitialOperator = seq;
+      return loggingOperator;
+    }
+
+
     public override IEditor CreateEditor() {
       return new OffspringSelectionGpEditor(this);
Index: branches/CEDMA-Refactoring-Ticket419/HeuristicLab.GP.StructureIdentification/StandardGP.cs
===================================================================
--- branches/CEDMA-Refactoring-Ticket419/HeuristicLab.GP.StructureIdentification/StandardGP.cs	(revision 1236)
+++ branches/CEDMA-Refactoring-Ticket419/HeuristicLab.GP.StructureIdentification/StandardGP.cs	(revision 1238)
@@ -194,4 +194,36 @@
     }
 
+    internal override IOperator CreateLoggingOperator() {
+      CombinedOperator loggingOperator = new CombinedOperator();
+      loggingOperator.Name = "Logging";
+      SequentialProcessor seq = new SequentialProcessor();
+
+      DataCollector collector = new DataCollector();
+      ItemList<StringData> names = collector.GetVariable("VariableNames").GetValue<ItemList<StringData>>();
+      names.Add(new StringData("BestQuality"));
+      names.Add(new StringData("AverageQuality"));
+      names.Add(new StringData("WorstQuality"));
+      names.Add(new StringData("BestValidationQuality"));
+      names.Add(new StringData("AverageValidationQuality"));
+      names.Add(new StringData("WorstValidationQuality"));
+      LinechartInjector lineChartInjector = new LinechartInjector();
+      lineChartInjector.GetVariableInfo("Linechart").ActualName = "Quality Linechart";
+      lineChartInjector.GetVariable("NumberOfLines").GetValue<IntData>().Data = 6;
+      QualityLogger qualityLogger = new QualityLogger();
+      QualityLogger validationQualityLogger = new QualityLogger();
+      validationQualityLogger.Name = "ValidationQualityLogger";
+      validationQualityLogger.GetVariableInfo("Quality").ActualName = "ValidationQuality";
+      validationQualityLogger.GetVariableInfo("QualityLog").ActualName = "ValidationQualityLog";
+
+      seq.AddSubOperator(collector);
+      seq.AddSubOperator(lineChartInjector);
+      seq.AddSubOperator(qualityLogger);
+      seq.AddSubOperator(validationQualityLogger);
+
+      loggingOperator.OperatorGraph.AddOperator(seq);
+      loggingOperator.OperatorGraph.InitialOperator = seq;
+      return loggingOperator;
+    }
+
     public virtual IEditor CreateEditor() {
       return new StandardGpEditor(this);
