Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Encoding.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Encoding.cs	(revision 13437)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Encoding.cs	(revision 13469)
@@ -53,5 +53,5 @@
         foreach (var op in value) encodingOperators.Add(op);
 
-        ISolutionCreator<TSolution> newSolutionCreator = (ISolutionCreator<TSolution>)encodingOperators.FirstOrDefault(o => o.GetType() == solutionCreator.GetType()) ??
+        ISolutionCreator<TSolution> newSolutionCreator = (ISolutionCreator<TSolution>)encodingOperators.FirstOrDefault(o => o.GetType() == SolutionCreator.GetType()) ??
                                encodingOperators.OfType<ISolutionCreator<TSolution>>().First();
         SolutionCreator = newSolutionCreator;
@@ -60,34 +60,47 @@
     }
 
-    ISolutionCreator IEncoding.SolutionCreator {
-      get { return solutionCreator; }
+    public IValueParameter SolutionCreatorParameter {
+      get { return (IValueParameter)Parameters[Name + ".SolutionCreator"]; }
     }
 
-    [Storable]
-    private ISolutionCreator<TSolution> solutionCreator;
+    ISolutionCreator IEncoding.SolutionCreator {
+      get { return SolutionCreator; }
+    }
     public ISolutionCreator<TSolution> SolutionCreator {
-      get {
-        return solutionCreator;
-      }
+      get { return (ISolutionCreator<TSolution>)SolutionCreatorParameter.Value; }
       set {
         if (value == null) throw new ArgumentNullException("SolutionCreator must not be null.");
-        if (solutionCreator == value) return;
-        encodingOperators.Remove(solutionCreator);
+        encodingOperators.Remove(SolutionCreator);
         encodingOperators.Add(value);
-        solutionCreator = value;
+        SolutionCreatorParameter.Value = value;
         OnSolutionCreatorChanged();
       }
     }
 
+
     [StorableConstructor]
     protected Encoding(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
     protected Encoding(Encoding<TSolution> original, Cloner cloner)
       : base(original, cloner) {
       encodingOperators = cloner.Clone(original.encodingOperators);
-      solutionCreator = cloner.Clone(original.solutionCreator);
+
+      RegisterEventHandlers();
     }
+
     protected Encoding(string name)
       : base(name) {
+      Parameters.Add(new ValueParameter<ISolutionCreator<TSolution>>(name + ".SolutionCreator", "The operator to create a solution."));
       Parameters.Add(new FixedValueParameter<ReadOnlyItemSet<IOperator>>(name + ".Operators", "The operators that the encoding specifies.", encodingOperators.AsReadOnly()));
+
+      RegisterEventHandlers();
+    }
+
+    private void RegisterEventHandlers() {
+      SolutionCreatorParameter.ValueChanged += (o, e) => OnSolutionCreatorChanged();
     }
 
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncoding.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncoding.cs	(revision 13437)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncoding.cs	(revision 13469)
@@ -26,5 +26,7 @@
 namespace HeuristicLab.Optimization {
   public interface IEncoding : IParameterizedNamedItem {
+    IValueParameter SolutionCreatorParameter { get; }
     ISolutionCreator SolutionCreator { get; }
+
     IEnumerable<IOperator> Operators { get; set; }
 
@@ -32,11 +34,11 @@
     void ConfigureOperators(IEnumerable<IItem> operators);
 
+    event EventHandler OperatorsChanged;
     event EventHandler SolutionCreatorChanged;
-    event EventHandler OperatorsChanged;
   }
 
   public interface IEncoding<TSolution> : IEncoding
     where TSolution : class, ISolution {
-    new ISolutionCreator<TSolution> SolutionCreator { get; set; }
+    //new ISolutionCreator<TSolution> SolutionCreator { get; }
   }
 }
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Problem.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Problem.cs	(revision 13437)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Problem.cs	(revision 13469)
@@ -30,18 +30,18 @@
 namespace HeuristicLab.Optimization {
   [StorableClass]
-  public abstract class Problem<TEncoding, TSolution, TEvaluator> : HeuristicOptimizationProblem<TEvaluator, ISolutionCreator<TSolution>>, IProblemDefinition<TEncoding, TSolution>, IStorableContent
+  public abstract class Problem<TEncoding, TSolution, TEvaluator> : Problem,
+    IHeuristicOptimizationProblem, IProblemDefinition<TEncoding, TSolution>, IStorableContent
     where TEncoding : class, IEncoding<TSolution>
     where TSolution : class, ISolution
     where TEvaluator : class, IEvaluator {
 
-    public string Filename { get; set; } // TODO: Really okay here?
+    public string Filename { get; set; } // TODO: Really okay here? should be in Problem (non-generic)
 
+    //TODO remove parametr for encoding?
     protected IValueParameter<TEncoding> EncodingParameter {
       get { return (IValueParameter<TEncoding>)Parameters["Encoding"]; }
     }
-
     //mkommend necessary for reuse of operators if the encoding changes
     private TEncoding oldEncoding;
-
     public TEncoding Encoding {
       get { return EncodingParameter.Value; }
@@ -51,4 +51,34 @@
       }
     }
+
+    ISolutionCreator IHeuristicOptimizationProblem.SolutionCreator {
+      get { return Encoding.SolutionCreator; }
+    }
+    IParameter IHeuristicOptimizationProblem.SolutionCreatorParameter {
+      get { return Encoding.SolutionCreatorParameter; }
+    }
+    event EventHandler IHeuristicOptimizationProblem.SolutionCreatorChanged {
+      add { Encoding.SolutionCreatorChanged += value; }
+      remove { Encoding.SolutionCreatorChanged -= value; }
+    }
+
+    //TODO is a parameter for the evaluator really necessary, only single-objective or multi-objective evulators calling the func are possible
+    public ValueParameter<TEvaluator> EvaluatorParameter {
+      get { return (ValueParameter<TEvaluator>)Parameters["Evaluator"]; }
+    }
+    public TEvaluator Evaluator {
+      get { return EvaluatorParameter.Value; }
+      protected set { EvaluatorParameter.Value = value; }
+    }
+    IEvaluator IHeuristicOptimizationProblem.Evaluator { get { return Evaluator; } }
+    IParameter IHeuristicOptimizationProblem.EvaluatorParameter { get { return EvaluatorParameter; } }
+
+    public event EventHandler EvaluatorChanged;
+    protected virtual void OnEvaluatorChanged() {
+      EventHandler handler = EvaluatorChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+
 
     protected override IEnumerable<IItem> GetOperators() {
@@ -66,7 +96,8 @@
       : base() {
       Parameters.Add(new ValueParameter<TEncoding>("Encoding", "Describes the configuration of the encoding, what the variables are called, what type they are and their bounds if any."));
+      Parameters.Add(new ValueParameter<TEvaluator>("Evaluator", "The operator used to evaluate a solution."));
+
       if (Encoding != null) {
         oldEncoding = Encoding;
-        SolutionCreator = Encoding.SolutionCreator;
         Parameterize();
       }
@@ -76,6 +107,7 @@
       if (encoding == null) throw new ArgumentNullException("encoding");
       Parameters.Add(new ValueParameter<TEncoding>("Encoding", "Describes the configuration of the encoding, what the variables are called, what type they are and their bounds if any.", encoding));
+      Parameters.Add(new ValueParameter<TEvaluator>("Evaluator", "The operator used to evaluate a solution."));
+
       oldEncoding = Encoding;
-      SolutionCreator = Encoding.SolutionCreator;
       Parameterize();
 
@@ -99,4 +131,5 @@
     private void RegisterEvents() {
       EncodingParameter.ValueChanged += (o, e) => OnEncodingChanged();
+      EvaluatorParameter.ValueChanged += (o, e) => OnEvaluatorChanged();
       //var multiEncoding = Encoding as MultiEncoding;
       //if (multiEncoding != null) multiEncoding.EncodingsChanged += MultiEncodingOnEncodingsChanged;
@@ -122,19 +155,17 @@
         op.EncodingParameter.ActualName = EncodingParameter.Name;
 
-      SolutionCreator = Encoding.SolutionCreator;
-
       //var multiEncoding = Encoding as MultiEncoding;
       //if (multiEncoding != null) multiEncoding.EncodingsChanged += MultiEncodingOnEncodingsChanged;
     }
 
-    protected override void OnSolutionCreatorChanged() {
-      base.OnSolutionCreatorChanged();
-      Encoding.SolutionCreator = SolutionCreator;
-    }
+    //protected override void OnSolutionCreatorChanged() {
+    //  base.OnSolutionCreatorChanged();
+    //  Encoding.SolutionCreator = SolutionCreator;
+    //}
 
     private static void AdaptEncodingOperators(IEncoding oldEncoding, IEncoding newEncoding) {
       if (oldEncoding.GetType() != newEncoding.GetType()) return;
 
-      if (oldEncoding.GetType() == typeof(CombinedEncoding)) {
+      if (oldEncoding is CombinedEncoding) {
         var oldMultiEncoding = (CombinedEncoding)oldEncoding;
         var newMultiEncoding = (CombinedEncoding)newEncoding;
