Index: trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/MakespanEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/MakespanEvaluator.cs	(revision 8882)
+++ trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/MakespanEvaluator.cs	(revision 8887)
@@ -30,15 +30,17 @@
   [Item("Makespan Evaluator", "Represents an evaluator using the maximum makespan of a schedule.")]
   [StorableClass]
-  public class MakespanEvaluator : SchedulingEvaluator {
+  public class MakespanEvaluator : ScheduleEvaluator {
+
     [StorableConstructor]
     protected MakespanEvaluator(bool deserializing) : base(deserializing) { }
-    protected MakespanEvaluator(MakespanEvaluator original, Cloner cloner)
-      : base(original, cloner) {
+    protected MakespanEvaluator(MakespanEvaluator original, Cloner cloner) : base(original, cloner) {}
+    public MakespanEvaluator()
+      : base() {
+      QualityParameter.ActualName = "Makespan";
     }
+
     public override IDeepCloneable Clone(Cloner cloner) {
       return new MakespanEvaluator(this, cloner);
     }
-
-    public MakespanEvaluator() : base() { }
 
     public static double GetMakespan(Schedule schedule) {
@@ -46,10 +48,6 @@
     }
 
-    protected override DoubleValue Evaluate(Schedule schedule) {
-      return new DoubleValue(GetMakespan(schedule));
-    }
-
-    public override IOperation Apply() {
-      return base.Apply();
+    protected override double Evaluate(Schedule schedule) {
+      return GetMakespan(schedule);
     }
   }
Index: trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/MeanTardinessEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/MeanTardinessEvaluator.cs	(revision 8882)
+++ trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/MeanTardinessEvaluator.cs	(revision 8887)
@@ -32,5 +32,5 @@
   [Item("Mean tardiness Evaluator", "Represents an evaluator using the mean tardiness of a schedule.")]
   [StorableClass]
-  public class MeanTardinessEvaluator : SchedulingEvaluator, IJSSPOperator {
+  public class MeanTardinessEvaluator : ScheduleEvaluator, IJSSPOperator {
 
     [StorableConstructor]
@@ -50,4 +50,5 @@
       : base() {
       Parameters.Add(new LookupParameter<ItemList<Job>>("JobData", "Jobdata defining the precedence relationships and the duration of the tasks in this JSSP-Instance."));
+      QualityParameter.ActualName = "MeanTardiness";
     }
 
@@ -58,6 +59,6 @@
     }
 
-    protected override DoubleValue Evaluate(Schedule schedule) {
-      return new DoubleValue(GetMeanTardiness(schedule, JobDataParameter.ActualValue));
+    protected override double Evaluate(Schedule schedule) {
+      return GetMeanTardiness(schedule, JobDataParameter.ActualValue);
     }
   }
Index: trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/ScheduleEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/ScheduleEvaluator.cs	(revision 8887)
+++ trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/ScheduleEvaluator.cs	(revision 8887)
@@ -0,0 +1,58 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Scheduling {
+  [Item("Schedule Evaluator", "Represents a base class for schedule evaluators.")]
+  [StorableClass]
+  public abstract class ScheduleEvaluator : SingleSuccessorOperator, IScheduleEvaluator {
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<Schedule> ScheduleParameter {
+      get { return (ILookupParameter<Schedule>)Parameters["Schedule"]; }
+    }
+
+    [StorableConstructor]
+    protected ScheduleEvaluator(bool deserializing) : base(deserializing) { }
+    protected ScheduleEvaluator(ScheduleEvaluator original, Cloner cloner) : base(original, cloner) { }
+    protected ScheduleEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality value aka fitness value of the solution."));
+      Parameters.Add(new LookupParameter<Schedule>("Schedule", "The decoded scheduling solution represented as generalized schedule."));
+    }
+
+    protected abstract double Evaluate(Schedule schedule);
+
+    public override IOperation Apply() {
+      QualityParameter.ActualValue = new DoubleValue(Evaluate(ScheduleParameter.ActualValue));
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/SchedulingEvaluationAlgorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/SchedulingEvaluationAlgorithm.cs	(revision 8882)
+++ 	(revision )
@@ -1,79 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 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;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.ScheduleEncoding;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.Scheduling {
-  [Item("Scheduling Evaluation Algorithm", "Represents a composition of a decoder and an evaluator for scheduling problems.")]
-  [StorableClass]
-  public class SchedulingEvaluationAlgorithm : AlgorithmOperator, IScheduleEvaluationAlgorithm {
-    [StorableConstructor]
-    protected SchedulingEvaluationAlgorithm(bool deserializing) : base(deserializing) { }
-    protected SchedulingEvaluationAlgorithm(SchedulingEvaluationAlgorithm original, Cloner cloner)
-      : base(original, cloner) {
-      this.evaluator = cloner.Clone(original.evaluator);
-    }
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new SchedulingEvaluationAlgorithm(this, cloner);
-    }
-
-    [Storable]
-    private Placeholder evaluator;
-
-    public ILookupParameter<DoubleValue> QualityParameter {
-      get {
-        if (Parameters.ContainsKey("Quality"))
-          return (ILookupParameter<DoubleValue>)Parameters["Quality"];
-        else
-          return null;
-      }
-    }
-
-    public void InitializeOperatorGraph<T>() where T : Item, IScheduleEncoding {
-      OperatorGraph.Operators.Clear();
-      OperatorGraph.InitialOperator = evaluator;
-    }
-
-    public void InitializeOperatorGraph<T>(ScheduleDecoder<T> decoder) where T : Item, IScheduleEncoding {
-      OperatorGraph.Operators.Clear();
-      OperatorGraph.InitialOperator = decoder;
-      decoder.Successor = evaluator;
-    }
-
-    public SchedulingEvaluationAlgorithm()
-      : base() {
-      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality value aka fitness value of the solution."));
-      evaluator = new Placeholder();
-      evaluator.OperatorParameter.ActualName = "SolutionEvaluator";
-    }
-
-    public override IOperation Apply() {
-      return base.Apply();
-    }
-
-  }
-}
Index: trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/SchedulingEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/SchedulingEvaluator.cs	(revision 8882)
+++ trunk/sources/HeuristicLab.Problems.Scheduling/3.3/Evaluators/SchedulingEvaluator.cs	(revision 8887)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -28,43 +29,50 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
+namespace HeuristicLab.Problems.Scheduling {
+  [Item("SchedulingEvaluator", "First applies the decoder operator to obtain a schedule from an encoding and then applies the evaluator to obtain a quality.")]
+  [StorableClass]
+  public class SchedulingEvaluator : SingleSuccessorOperator, ISchedulingEvaluator {
 
-namespace HeuristicLab.Problems.Scheduling {
-  [Item("Scheduling Evaluator", "Represents a evaluator class for standard scheduling problems.")]
-  [StorableClass]
-  public abstract class SchedulingEvaluator : SingleSuccessorOperator, IScheduleEvaluator {
+    public IValueLookupParameter<IScheduleDecoder> ScheduleDecoderParameter {
+      get { return (IValueLookupParameter<IScheduleDecoder>) Parameters["ScheduleDecoder"]; }
+    }
+    ILookupParameter<IScheduleDecoder> ISchedulingEvaluator.ScheduleDecoderParameter {
+      get { return ScheduleDecoderParameter; }
+    }
+    public IValueLookupParameter<IScheduleEvaluator> ScheduleEvaluatorParameter {
+      get { return (IValueLookupParameter<IScheduleEvaluator>) Parameters["ScheduleEvaluator"]; }
+    }
+    ILookupParameter<IScheduleEvaluator> ISchedulingEvaluator.ScheduleEvaluatorParameter {
+      get { return ScheduleEvaluatorParameter; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
     [StorableConstructor]
     protected SchedulingEvaluator(bool deserializing) : base(deserializing) { }
-    protected SchedulingEvaluator(SchedulingEvaluator original, Cloner cloner)
-      : base(original, cloner) {
+    protected SchedulingEvaluator(SchedulingEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public SchedulingEvaluator()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IScheduleDecoder>("ScheduleDecoder", "The decoding operator that is used to calculate a schedule from the used representation."));
+      Parameters.Add(new ValueLookupParameter<IScheduleEvaluator>("ScheduleEvaluator", "The actual schedule evaluation operator."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality value aka fitness value of the solution."));
+      QualityParameter.Hidden = true;
     }
 
-    public ILookupParameter<IRandom> RandomParameter {
-      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
-    }
-    public ILookupParameter<DoubleValue> QualityParameter {
-      get {
-        if (Parameters.ContainsKey("Quality"))
-          return (ILookupParameter<DoubleValue>)Parameters["Quality"];
-        else
-          return null;
-      }
-    }
-    public ILookupParameter<Schedule> ScheduleParameter {
-      get { return (ILookupParameter<Schedule>)Parameters["Schedule"]; }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SchedulingEvaluator(this, cloner);
     }
 
-    public SchedulingEvaluator()
-      : base() {
-      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality value aka fitness value of the solution."));
-      Parameters.Add(new LookupParameter<Schedule>("Schedule", "The decoded scheduling solution represented as generalized schedule."));
-      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator."));
-    }
+    public override IOperation Apply() {
+      var decoder = ScheduleDecoderParameter.ActualValue;
+      var evaluator = ScheduleEvaluatorParameter.ActualValue;
+      if (evaluator == null) throw new InvalidOperationException("A ScheduleEvaluator could not be found.");
 
-    protected abstract DoubleValue Evaluate(Schedule schedule);
-
-    public override IOperation Apply() {
-      Schedule schedule = ScheduleParameter.ActualValue;
-      QualityParameter.ActualValue = Evaluate(schedule);
-      return base.Apply();
+      var operations = new OperationCollection(base.Apply());
+      operations.Insert(0, ExecutionContext.CreateChildOperation(evaluator));
+      if (decoder != null) // decode before evaluating
+        operations.Insert(0, ExecutionContext.CreateChildOperation(decoder));
+      return operations;
     }
   }
