Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj	(revision 11739)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj	(revision 11740)
@@ -148,4 +148,6 @@
     <Compile Include="Interfaces\IEncodingOperator.cs" />
     <Compile Include="New\ProgrammableProblem.cs" />
+    <Compile Include="New\MultiObjectiveProgrammableProblem.cs" />
+    <Compile Include="New\MultiObjectiveScriptableProblem.cs" />
     <Compile Include="Operators\MultiEncodingManipulator.cs" />
     <Compile Include="Operators\MultiEncodingCrossover.cs" />
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/internal/IMultiObjectiveEvaluationOperator.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/internal/IMultiObjectiveEvaluationOperator.cs	(revision 11739)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/internal/IMultiObjectiveEvaluationOperator.cs	(revision 11740)
@@ -25,5 +25,5 @@
 
 namespace HeuristicLab.Problems.Programmable {
-  internal interface IMulitObjectiveEvaluationOperator : IMultiObjectiveEvaluator, IEncodingOperator {
+  internal interface IMultiObjectiveEvaluationOperator : IMultiObjectiveEvaluator, IEncodingOperator {
     Func<Individual, IRandom, double[]> EvaluateFunc { get; set; }
   }
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/New/MultiObjectiveProgrammableProblem.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/New/MultiObjectiveProgrammableProblem.cs	(revision 11740)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/New/MultiObjectiveProgrammableProblem.cs	(revision 11740)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Programmable {
+  [StorableClass]
+  public abstract class MultiObjectiveProgrammableProblem<TEncoding> : ProgrammableProblem<TEncoding, MultiObjectiveEvaluator>, IMultiObjectiveProblemDefinition
+  where TEncoding : class, IEncoding {
+    [StorableConstructor]
+    protected MultiObjectiveProgrammableProblem(bool deserializing) : base(deserializing) { }
+
+    protected MultiObjectiveProgrammableProblem(MultiObjectiveProgrammableProblem<TEncoding> original, Cloner cloner)
+      : base(original, cloner) {
+      ParameterizeOperators();
+    }
+
+    protected MultiObjectiveProgrammableProblem()
+      : base() {
+
+      Operators.Add(new BestScopeSolutionAnalyzer());
+      Operators.Add(new SingleObjectiveEvaluator());
+      Operators.Add(new SingleObjectiveAnalyzer());
+
+      ParameterizeOperators();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      ParameterizeOperators();
+    }
+
+    public abstract bool[] Maximization { get; }
+    public abstract double[] Evaluate(Individual individual, IRandom random);
+    public virtual void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results) { }
+
+
+    protected override void OnEvaluatorChanged() {
+      base.OnEvaluatorChanged();
+      ParameterizeOperators();
+    }
+
+    protected override void ParameterizeOperators() {
+      base.ParameterizeOperators();
+      foreach (var op in Operators.OfType<IMultiObjectiveEvaluationOperator>())
+        op.EvaluateFunc = Evaluate;
+      foreach (var op in Operators.OfType<IMultiObjectiveAnalysisOperator>())
+        op.AnalyzeAction = Analyze;
+    }
+
+  }
+}
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/New/MultiObjectiveScriptableProblem.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/New/MultiObjectiveScriptableProblem.cs	(revision 11740)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/New/MultiObjectiveScriptableProblem.cs	(revision 11740)
@@ -0,0 +1,90 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Programmable.Problems {
+  [Item("Scriptable Problem (multi-objective)", "Represents a multi-objective problem that can be scripted.")]
+  [Creatable("1 Test")]
+  [StorableClass]
+  public sealed class MultiObjectiveScriptableProblem : MultiObjectiveProgrammableProblem<IEncoding> {
+
+    private FixedValueParameter<MultiObjectiveProblemDefinitionScript> MultiObjectiveProblemScriptParameter {
+      get { return (FixedValueParameter<MultiObjectiveProblemDefinitionScript>)Parameters["ProblemScript"]; }
+    }
+
+    private MultiObjectiveProblemDefinitionScript ProblemScript {
+      get { return MultiObjectiveProblemScriptParameter.Value; }
+    }
+
+    private IMultiObjectiveProblemDefinition ProblemDefinition {
+      get { return MultiObjectiveProblemScriptParameter.Value; }
+    }
+
+    private MultiObjectiveScriptableProblem(MultiObjectiveScriptableProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) { return new MultiObjectiveScriptableProblem(this, cloner); }
+
+
+    [StorableConstructor]
+    private MultiObjectiveScriptableProblem(bool deserializing) : base(deserializing) { }
+
+    public MultiObjectiveScriptableProblem()
+      : base() {
+      Parameters.Add(new FixedValueParameter<SingleObjectiveProblemDefinitionScript>("ProblemScript", "Defines the problem.", new SingleObjectiveProblemDefinitionScript() { Name = Name }));
+      RegisterEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    private void RegisterEvents() {
+      ProblemScript.ProblemDefinitionChanged += (o, e) => OnProblemDefinitionChanged();
+    }
+
+    private void OnProblemDefinitionChanged() {
+    }
+
+    public override bool[] Maximization {
+      get { return ProblemDefinition.Maximization; }
+    }
+
+    public override double[] Evaluate(Individual individual, IRandom random) {
+      return ProblemDefinition.Evaluate(individual, random);
+    }
+
+    public override void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results) {
+      ProblemDefinition.Analyze(individuals, qualities, results);
+    }
+    public override IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random) {
+      return ProblemDefinition.GetNeighbors(individual, random);
+    }
+  }
+}
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiObjectiveEvaluator.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiObjectiveEvaluator.cs	(revision 11739)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/MultiObjectiveEvaluator.cs	(revision 11740)
@@ -32,5 +32,5 @@
   [Item("Multi-objective Evaluator", "Calls the Evaluate method of the problem definition and writes the return value into the scope.")]
   [StorableClass]
-  public class MultiObjectiveEvaluator : SingleSuccessorOperator, IMulitObjectiveEvaluationOperator, IStochasticOperator {
+  public class MultiObjectiveEvaluator : SingleSuccessorOperator, IMultiObjectiveEvaluationOperator, IStochasticOperator {
 
     public ILookupParameter<IRandom> RandomParameter {
