Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemDefinition.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemDefinition.cs	(revision 11484)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemDefinition.cs	(revision 11485)
@@ -20,5 +20,4 @@
 #endregion
 
-using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -29,29 +28,15 @@
   [Item("Multi-objective Problem Definition", "Base class for custom multi-objective problem definitions.")]
   public abstract class MultiObjectiveProblemDefinition : ProblemDefinition, IMultiObjectiveProblemDefinition {
-    [Storable(Name = "Storable")]
-    private bool[] maximization;
-    public bool[] Maximization {
-      get { return maximization; }
-      set {
-        if (maximization.SequenceEqual(value)) return;
-        maximization = value;
-        OnProblemDefinitionChanged();
-      }
-    }
 
+    public abstract bool[] Maximization { get; }
     public abstract double[] Evaluate(IRandom random, Individual vector);
-
-    public abstract void Analyze(Individual[] vectors, double[][] qualities, ResultCollection results);
+    public virtual void Analyze(Individual[] vectors, double[][] qualities, ResultCollection results) { }
 
     [StorableConstructor]
     protected MultiObjectiveProblemDefinition(bool deserializing) : base(deserializing) { }
-    protected MultiObjectiveProblemDefinition(MultiObjectiveProblemDefinition original, Cloner cloner)
-      : base(original, cloner) {
-      this.maximization = (bool[])original.maximization.Clone();
-    }
+    protected MultiObjectiveProblemDefinition(MultiObjectiveProblemDefinition original, Cloner cloner) : base(original, cloner) { }
     protected MultiObjectiveProblemDefinition(Encoding encoding) : this(encoding, "MultiObjectiveProblemDefinition", null) { }
     protected MultiObjectiveProblemDefinition(Encoding encoding, string name) : this(encoding, name, null) { }
-    protected MultiObjectiveProblemDefinition(Encoding encoding, string name, string description)
-      : base(encoding) { }
+    protected MultiObjectiveProblemDefinition(Encoding encoding, string name, string description) : base(encoding, name, description) { }
   }
 }
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemScript.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemScript.cs	(revision 11484)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemScript.cs	(revision 11485)
@@ -66,17 +66,17 @@
   }
 
-  public double[] Evaluate(IRandom random, ParameterVector vector) {
+  public double[] Evaluate(IRandom random, Individual individual) {
     var qualities = new [] { 0.0, 0.0 };
     // use vars.yourVariable to access variables in the variable store i.e. yourVariable
-    // qualities = new [] { vector.RealVector(""r"").Sum(x => x * x), vector.RealVector(""r"").Sum(x => x * x * x) };
+    // qualities = new [] { individual.RealVector(""r"").Sum(x => x * x), individual.RealVector(""r"").Sum(x => x * x * x) };
     return qualities;
   }
 
-  public void Analyze(ParameterVector[] vectors, double[][] qualities, ResultCollection results) {
+  public void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results) {
     // write or update results given the range of vectors and resulting qualities
     // use e.g. vars.yourVariable to access variables in the variable store i.e. yourVariable
   }
 
-  public IEnumerable<ParameterVector> GetNeighbors(IRandom random, ParameterVector vector) {
+  public override IEnumerable<Individual> GetNeighbors(IRandom random, Individual individual) {
     // Create new vectors, based on the given one that represent small changes
     // This method is only called from move-based algorithms (LocalSearch, SimulatedAnnealing, etc.)
@@ -84,5 +84,5 @@
       // this is not an infinite loop as only a finite amount of samples will be drawn
       // it is possible to return a concrete amount of neighbors also
-      var neighbor = (ParameterVector)vector.Clone();
+      var neighbor = (Individual)individual.Clone();
       //e.g. make a bit flip in a binary parameter
       //var bIndex = random.Next(neighbor.BinaryVector(""b"").Length);
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/ProblemScriptBase.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/ProblemScriptBase.cs	(revision 11484)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/ProblemScriptBase.cs	(revision 11485)
@@ -20,4 +20,7 @@
 #endregion
 
+using System;
+using HeuristicLab.Common;
+
 namespace HeuristicLab.Problems.Programmable {
   public abstract class ProblemScriptBase : ProblemDefinition {
@@ -27,4 +30,8 @@
     public dynamic vars { get; set; }
     public abstract void Initialize();
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      throw new InvalidOperationException("ProblemScript instances cannot be cloned.");
+    }
   }
 }
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProblemDefinition.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProblemDefinition.cs	(revision 11484)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProblemDefinition.cs	(revision 11485)
@@ -27,31 +27,16 @@
 namespace HeuristicLab.Problems.Programmable {
   [Item("Single-objective Problem Definition", "Base class for custom single-objective problem definitions.")]
-  [StorableClass]
   public abstract class SingleObjectiveProblemDefinition : ProblemDefinition, ISingleObjectiveProblemDefinition {
-    [Storable(Name = "Storable")]
-    private bool isMaximizationProblem;
-    public bool IsMaximizationProblem {
-      get { return isMaximizationProblem; }
-      set {
-        if (isMaximizationProblem == value) return;
-        isMaximizationProblem = value;
-        OnProblemDefinitionChanged();
-      }
-    }
 
+    public abstract bool IsMaximizationProblem { get; }
     public abstract double Evaluate(IRandom random, Individual vector);
-
-    public abstract void Analyze(Individual[] vectors, double[] qualities, ResultCollection results);
+    public virtual void Analyze(Individual[] vectors, double[] qualities, ResultCollection results) { }
 
     [StorableConstructor]
     protected SingleObjectiveProblemDefinition(bool deserializing) : base(deserializing) { }
-    protected SingleObjectiveProblemDefinition(SingleObjectiveProblemDefinition original, Cloner cloner)
-      : base(original, cloner) {
-      this.isMaximizationProblem = original.isMaximizationProblem;
-    }
+    protected SingleObjectiveProblemDefinition(SingleObjectiveProblemDefinition original, Cloner cloner) : base(original, cloner) { }
     protected SingleObjectiveProblemDefinition(Encoding encoding) : this(encoding, "SingleObjectiveProblemDefinition", null) { }
     protected SingleObjectiveProblemDefinition(Encoding encoding, string name) : this(encoding, name, null) { }
-    protected SingleObjectiveProblemDefinition(Encoding encoding, string name, string description)
-      : base(encoding) { }
+    protected SingleObjectiveProblemDefinition(Encoding encoding, string name, string description) : base(encoding, name, description) { }
   }
 }
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProblemScript.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProblemScript.cs	(revision 11484)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProblemScript.cs	(revision 11485)
@@ -78,5 +78,5 @@
   }
 
-  public IEnumerable<Individual> GetNeighbors(IRandom random, Individual individual) {
+  public override IEnumerable<Individual> GetNeighbors(IRandom random, Individual individual) {
     // Create new vectors, based on the given one that represent small changes
     // This method is only called from move-based algorithms (LocalSearch, SimulatedAnnealing, etc.)
